Sequoia
Loading...
Searching...
No Matches
GraphTestingUtilities.hpp
Go to the documentation of this file.
1
2// Copyright Oliver J. Rosten 2019. //
3// Distributed under the GNU GENERAL PUBLIC LICENSE, Version 3.0. //
4// (See accompanying file LICENSE.md or copy at //
5// https://www.gnu.org/licenses/gpl-3.0.en.html) //
7
8#pragma once
9
14
18
19namespace sequoia::testing
20{
21 template<maths::graph_flavour Flavour, class EdgeStorage>
22 struct value_tester<maths::connectivity<Flavour, EdgeStorage>>
23 {
25 using edge_index_type = typename type::edge_index_type;
26
27 template<class E>
28 using connectivity_equivalent_type = std::initializer_list<std::initializer_list<E>>;
29
30 template<class CheckType, test_mode Mode>
31 static void test(CheckType flavour, test_logger<Mode>& logger, const type& connectivity, const type& prediction)
32 {
33 check(equality, "Connectivity size incorrect", logger, connectivity.size(), prediction.size());
34
35 if(check(equality, "Connectivity order incorrect", logger, connectivity.order(), prediction.order()))
36 {
37 for(edge_index_type i{}; i<connectivity.order(); ++i)
38 {
39 const auto message{std::string{"Partition "}.append(std::to_string(i))};
40 check(flavour, append_lines(message, "cedge_iterator"), logger, connectivity.cbegin_edges(i), connectivity.cend_edges(i), prediction.cbegin_edges(i), prediction.cend_edges(i));
41 }
42 }
43 }
44
45 template<class CheckType, test_mode Mode, class E>
46 static void test(CheckType flavour, test_logger<Mode>& logger, const type& connectivity, connectivity_equivalent_type<E> prediction)
47 {
48 check_connectivity(flavour, logger, connectivity, prediction);
49 }
50 private:
51 template<class CheckType, test_mode Mode, class E>
52 static void check_connectivity(CheckType flavour, test_logger<Mode>& logger, const type& connectivity, connectivity_equivalent_type<E> prediction)
53 {
54 if(check(equality, "Connectivity order incorrect", logger, connectivity.order(), prediction.size()))
55 {
56 for(edge_index_type i{}; i < connectivity.order(); ++i)
57 {
58 const auto message{"Partition " + std::to_string(i)};
59 check(flavour, append_lines(message, "cedge_iterator"), logger, connectivity.cbegin_edges(i), connectivity.cend_edges(i), std::begin(*(prediction.begin() + i)), std::end(*(prediction.begin() + i)));
60 check(flavour, append_lines(message, "credge_iterator"), logger, connectivity.crbegin_edges(i), connectivity.crend_edges(i), std::rbegin(*(prediction.begin() + i)), std::rend(*(prediction.begin() + i)));
61 check(flavour, append_lines(message, "cedges"), logger, connectivity.cedges(i).begin(), connectivity.cedges(i).end(), std::begin(*(prediction.begin() + i)), std::end(*(prediction.begin() + i)));
62
63 if constexpr((type::flavour == maths::graph_flavour::directed) && !std::is_empty_v<typename E::weight_type>)
64 {
65 using init_iterator = typename std::initializer_list<E>::iterator;
67 using rinit_iterator = std::reverse_iterator<init_iterator>;
69
70 auto& mutConn{const_cast<type&>(connectivity)};
71
72 check(flavour, append_lines(message, "edge_weight_iterator (const)"), logger, connectivity.begin_edge_weights(i), connectivity.end_edge_weights(i), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
73 check(flavour, append_lines(message, "edge_weight_iterator"), logger, mutConn.begin_edge_weights(i), mutConn.end_edge_weights(i), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
74 check(flavour, append_lines(message, "cedge_weight_iterator"), logger, connectivity.cbegin_edge_weights(i), connectivity.cend_edge_weights(i), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
75 check(flavour, append_lines(message, "redge_weight_iterator (const)"), logger, connectivity.rbegin_edge_weights(i), connectivity.rend_edge_weights(i), rweight_iterator{std::rbegin(*(prediction.begin() + i))}, rweight_iterator{std::rend(*(prediction.begin() + i))});
76 check(flavour, append_lines(message, "redge_weight_iterator"), logger, mutConn.rbegin_edge_weights(i), mutConn.rend_edge_weights(i), rweight_iterator{std::rbegin(*(prediction.begin() + i))}, rweight_iterator{std::rend(*(prediction.begin() + i))});
77 check(flavour, append_lines(message, "credge_weight_iterator"), logger, connectivity.crbegin_edge_weights(i), connectivity.crend_edge_weights(i), rweight_iterator{std::rbegin(*(prediction.begin() + i))}, rweight_iterator{std::rend(*(prediction.begin() + i))});
78 check(flavour, append_lines(message, "edge_weights (const)"), logger, connectivity.edge_weights(i).begin(), connectivity.edge_weights(i).end(), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
79 check(flavour, append_lines(message, "edge_weights"), logger, mutConn.edge_weights(i).begin(), mutConn.edge_weights(i).end(), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
80 check(flavour, append_lines(message, "cedge_weights"), logger, connectivity.cedge_weights(i).begin(), connectivity.cedge_weights(i).end(), weight_iterator{std::begin(*(prediction.begin() + i))}, weight_iterator{std::end(*(prediction.begin() + i))});
81
82 }
83 }
84 }
85 }
86 };
87
88 template<maths::network Graph>
90 {
91 using type = Graph;
92
93 template<class E>
94 using connectivity_equivalent_type = std::initializer_list<std::initializer_list<E>>;
95
96 using connectivity_type = typename type::connectivity_type;
97 using nodes_type = typename type::nodes_type;
98
99 template<class CheckType, test_mode Mode, maths::network G>
100 requires std::is_same_v<Graph, G> // inhibit implicit conversions
101 static void test(CheckType flavour, test_logger<Mode>& logger, const Graph& graph, const G& prediction)
102 {
103 check(flavour, "", logger, static_cast<const connectivity_type&>(graph), static_cast<const connectivity_type&>(prediction));
104 check(flavour, "", logger, static_cast<const nodes_type &>(graph), static_cast<const nodes_type&>(prediction));
105 }
106
107 template<class CheckType, test_mode Mode, class E, class NodesEquivalentType>
108 requires (!std::is_empty_v<nodes_type>)
109 static void test(CheckType flavour, test_logger<Mode>& logger, const type& graph, std::pair<connectivity_equivalent_type<E>, NodesEquivalentType> prediction)
110 {
111 check(flavour, "", logger, static_cast<const connectivity_type&>(graph), prediction.first);
112 check(flavour, "", logger, static_cast<const nodes_type&>(graph), prediction.second);
113 }
114
115 template<class CheckType, test_mode Mode, class E>
116 requires (!std::is_empty_v<nodes_type>) && (!maths::heterogeneous_network<Graph>)
117 static void test(CheckType flavour, test_logger<Mode>& logger, const type& graph, connectivity_equivalent_type<E> connPrediction)
118 {
119 check(flavour, "", logger, static_cast<const connectivity_type&>(graph), connPrediction);
120 const std::vector<typename Graph::node_weight_type> defaultNodes(connPrediction.size());
121 check(flavour, "", logger, graph.cbegin_node_weights(), graph.cend_node_weights(), defaultNodes.begin(), defaultNodes.end());
122 }
123
124 template<class CheckType, test_mode Mode, class E>
125 requires std::is_empty_v<nodes_type>
126 static void test(CheckType flavour, test_logger<Mode>& logger, const type& graph, connectivity_equivalent_type<E> connPrediction)
127 {
128 check(flavour, "", logger, static_cast<const connectivity_type&>(graph), connPrediction);
129 }
130 };
131
132 template<maths::network Graph>
134 {};
135}
bool check(CheckType flavour, std::string description, test_logger< Mode > &logger, Iter first, Sentinel last, PredictionIter predictionFirst, PredictionSentinel predictionLast, tutor< Advisor > advisor={})
The workhorse for comparing the contents of ranges.
Definition: FreeCheckers.hpp:377
Underlying class for the various different graph flavour.
Traits and Concepts for graphs.
Classes implementing the concept of a sequence of data which is divided into partitions.
Definition: Connectivity.hpp:1641
Definition: TestLogger.hpp:183
An iterator with policies controlling dereferencing and auxiliary data.
Definition: Iterator.hpp:234
Definition: GraphTraits.hpp:54
Definition: GraphTestingUtilities.hpp:90
class template, specializations of which implement various comparisons for the specified type.
Definition: FreeCheckers.hpp:78