19namespace sequoia::testing
21 template<maths::graph_flavour Flavour,
class EdgeStorage>
25 using edge_index_type =
typename type::edge_index_type;
28 using connectivity_equivalent_type = std::initializer_list<std::initializer_list<E>>;
30 template<
class CheckType, test_mode Mode>
33 check(equality,
"Connectivity size incorrect", logger,
connectivity.size(), prediction.size());
35 if(
check(equality,
"Connectivity order incorrect", logger,
connectivity.order(), prediction.order()))
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));
45 template<
class CheckType, test_mode Mode,
class E>
48 check_connectivity(flavour, logger,
connectivity, prediction);
51 template<
class CheckType, test_mode Mode,
class E>
54 if(
check(equality,
"Connectivity order incorrect", logger,
connectivity.order(), prediction.size()))
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)));
63 if constexpr((type::flavour == maths::graph_flavour::directed) && !std::is_empty_v<typename E::weight_type>)
65 using init_iterator =
typename std::initializer_list<E>::iterator;
67 using rinit_iterator = std::reverse_iterator<init_iterator>;
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))});
88 template<maths::network Graph>
94 using connectivity_equivalent_type = std::initializer_list<std::initializer_list<E>>;
96 using connectivity_type =
typename type::connectivity_type;
97 using nodes_type =
typename type::nodes_type;
99 template<
class CheckType, test_mode Mode, maths::network G>
100 requires std::is_same_v<Graph, G>
101 static void test(CheckType flavour,
test_logger<Mode>& logger,
const Graph& graph,
const G& prediction)
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));
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)
111 check(flavour,
"", logger,
static_cast<const connectivity_type&
>(graph), prediction.first);
112 check(flavour,
"", logger,
static_cast<const nodes_type&
>(graph), prediction.second);
115 template<
class CheckType, test_mode Mode,
class E>
117 static void test(CheckType flavour,
test_logger<Mode>& logger,
const type& graph, connectivity_equivalent_type<E> connPrediction)
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());
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)
128 check(flavour,
"", logger,
static_cast<const connectivity_type&
>(graph), connPrediction);
132 template<maths::network Graph>
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