45#include <gtest/gtest.h>
117 dn1 =
dg.insert_node(10);
118 dn2 =
dg.insert_node(20);
119 dn3 =
dg.insert_node(30);
120 dn4 =
dg.insert_node(40);
135 EXPECT_TRUE(g.none_node([](
auto p) { return p->get_info() > 100; }));
136 EXPECT_TRUE(dg.none_node([](
auto p) { return p->get_info() > 100; }));
142 EXPECT_FALSE(g.none_node([](
auto p) { return p->get_info() > 2; }));
143 EXPECT_FALSE(dg.none_node([](
auto p) { return p->get_info() > 20; }));
157 EXPECT_TRUE(g.none_arc([](
auto a) { return a->get_info() > 100.0; }));
158 EXPECT_TRUE(dg.none_arc([](
auto a) { return a->get_info() > 100.0; }));
164 EXPECT_FALSE(g.none_arc([](
auto a) { return a->get_info() > 2.0; }));
165 EXPECT_FALSE(dg.none_arc([](
auto a) { return a->get_info() > 2.0; }));
171 EXPECT_TRUE(g.none_arc(n1, [](
auto a) { return a->get_info() > 10.0; }));
174 EXPECT_FALSE(g.none_arc(n1, [](
auto a) { return a->get_info() > 2.5; }));
188 EXPECT_EQ(g.count_nodes([](
auto p) { return p->get_info() > 2; }), 3u);
191 EXPECT_EQ(g.count_nodes([](
auto p) { return p->get_info() % 2 == 0; }), 2u);
194 EXPECT_EQ(dg.count_nodes([](
auto p) { return p->get_info() > 25; }), 2u);
199 EXPECT_EQ(g.count_nodes([](
auto p) { return p->get_info() > 100; }), 0u);
219 EXPECT_EQ(g.count_arcs([](
auto a) { return a->get_info() > 2.0; }), 2u);
222 EXPECT_EQ(g.count_arcs([](
auto a) { return a->get_info() <= 2.0; }), 2u);
225 EXPECT_EQ(dg.count_arcs([](
auto a) { return a->get_info() > 2.0; }), 3u);
237 EXPECT_EQ(g.count_arcs(n2, [](
auto a) { return a->get_info() > 1.5; }), 2u);
251 double sum = g.sum_arcs<
double>(n1);
255 sum = g.sum_arcs<
double>(n2);
269 double sum = g.sum_arcs<
double>(n2, [](
auto a) {
return a->get_info() * 2; });
278 auto min_a = g.min_arc(n2);
286 auto min_a = g.min_arc();
291 auto min_da = dg.min_arc();
313 auto max_via_min = g.min_arc(n2, [](
auto a,
auto b) {
314 return a->get_info() > b->get_info();
325 auto max_a = g.max_arc(n2);
333 auto max_a = g.max_arc();
338 auto max_da = dg.max_arc();
354 auto [
high,
low] = g.partition_nodes([](
auto p) {
return p->get_info() > 2; });
364 EXPECT_TRUE(
low.exists([](
auto p) { return p->get_info() == 1; }));
365 EXPECT_TRUE(
low.exists([](
auto p) { return p->get_info() == 2; }));
370 auto [
match,
nomatch] = g.partition_nodes([](
auto p) {
return p->get_info() > 0; });
378 auto [
match,
nomatch] = g.partition_nodes([](
auto p) {
return p->get_info() > 100; });
397 auto [
heavy,
light] = g.partition_arcs([](
auto a) {
return a->get_info() > 2.0; });
405 auto [
high,
low] = dg.partition_arcs([](
auto a) {
return a->get_info() > 2.0; });
452 auto pred = [](
auto p) {
return p->get_info() > 2; };
455 auto [
yes,
no] = g.partition_nodes(
pred);
463 auto pred = [](
auto p) {
return p->get_info() > 100; };
466 EXPECT_EQ(g.none_arc([](
auto a) { return a->get_info() > 100; }),
467 not g.exists_arc([](
auto a) { return a->get_info() > 100; }));
472 auto min_a = g.min_arc();
473 auto max_a = g.max_arc();
483 return a->get_info() < min_a->get_info();
488 return a->get_info() > max_a->get_info();
497 auto n =
single.insert_node(42);
509 auto n = g.insert_node(99);
510 auto self = g.insert_arc(n, n, 10.0);
529 return std::to_string(p->get_info());
541 return static_cast<int>(a->get_info());
553 return a->get_info();
564 auto filtered = g.filter_nodes([](
auto p) {
return p->get_info() > 2; });
575 auto filtered = g.filter_arcs([](
auto a) {
return a->get_info() > 2.0; });
583 auto filtered = g.filter_arcs(n2, [](
auto a) {
return a->get_info() > 1.5; });
593 EXPECT_TRUE(g.all_nodes([](
auto p) { return p->get_info() > 0; }));
596 EXPECT_FALSE(g.all_nodes([](
auto p) { return p->get_info() > 3; }));
602 EXPECT_TRUE(g.all_arcs([](
auto a) { return a->get_info() > 0.0; }));
605 EXPECT_FALSE(g.all_arcs([](
auto a) { return a->get_info() > 2.0; }));
611 EXPECT_TRUE(g.all_arcs(n1, [](
auto a) { return a->get_info() > 0.0; }));
614 EXPECT_FALSE(g.all_arcs(n1, [](
auto a) { return a->get_info() > 2.0; }));
622 EXPECT_TRUE(g.exists_node([](
auto p) { return p->get_info() == 3; }));
625 EXPECT_FALSE(g.exists_node([](
auto p) { return p->get_info() == 100; }));
631 EXPECT_TRUE(g.exists_arc([](
auto a) { return a->get_info() == 3.0; }));
634 EXPECT_FALSE(g.exists_arc([](
auto a) { return a->get_info() == 100.0; }));
640 EXPECT_TRUE(g.exists_arc(n1, [](
auto a) { return a->get_info() == 3.0; }));
643 EXPECT_FALSE(g.exists_arc(n1, [](
auto a) { return a->get_info() == 100.0; }));
652 dg.for_each_out_arc(dn1, [&
sum](
auto a) {
sum += a->get_info(); });
656 auto outs = dg.out_arcs(dn1);
667 auto outs = dg.out_arcs(dn1);
677 dg.for_each_out_arc(dn1, [&
sum](
auto a) {
sum += a->get_info(); });
686 dg.for_each_out_arc(dn1, [&
sum](
auto a) {
sum += a->get_info(); });
696 auto filtered = dg.filter_out_arcs(dn1, [](
auto a) {
697 return a->get_info() > 1.0;
706 auto filtered = dg.filter_in_arcs(dn2, [](
auto a) {
707 return a->get_info() > 2.0;
718 auto found = g.search_node([](
auto p) {
return p->get_info() == 3; });
723 auto not_found = g.search_node([](
auto p) {
return p->get_info() == 100; });
730 auto found = g.find_node(3);
744 auto found = g.search_arc([](
auto a) {
return a->get_info() == 3.0; });
749 auto not_found = g.search_arc([](
auto a) {
return a->get_info() == 100.0; });
756 auto found = g.find_arc(3.0);
768 auto found = g.search_arc(n1, [](
auto a) {
return a->get_info() == 3.0; });
773 auto not_found = g.search_arc(n1, [](
auto a) {
return a->get_info() == 100.0; });
784 return p->get_info() < 3;
808 return a->get_info() < 3.0;
832 g.for_each_node([&
sum](
auto p) {
sum += p->get_info(); });
839 g.for_each_arc([&
sum](
auto a) {
sum += a->get_info(); });
846 g.for_each_arc(n2, [&
sum](
auto a) {
sum += a->get_info(); });
857 [](
const int&
acc,
auto p) {
return acc + p->get_info(); }
867 [](
const double&
acc,
auto a) {
return acc + a->get_info(); }
876 g.for_each_arc(n2, [&
sum](
auto a) {
sum += a->get_info(); });
884 auto all = g.nodes();
896 auto adj = g.arcs(n2);
904 auto outs = dg.out_nodes(dn1);
912 auto ins = dg.in_nodes(dn2);
918 auto outs = dg.out_arcs(dn1);
925 auto ins = dg.in_arcs(dn2);
958template <
typename GraphType>
964 typename GraphType::Arc *
a1, *
a2;
969 n1 =
g.insert_node(1);
970 n2 =
g.insert_node(2);
971 n3 =
g.insert_node(3);
973 a1 =
g.insert_arc(
n1,
n2, 1.0);
974 a2 =
g.insert_arc(
n2,
n3, 2.0);
978template <
typename GraphType>
984 typename GraphType::Arc *
a1, *
a2;
989 n1 =
g.insert_node(10);
990 n2 =
g.insert_node(20);
991 n3 =
g.insert_node(30);
993 a1 =
g.insert_arc(
n1,
n2, 1.5);
994 a2 =
g.insert_arc(
n2,
n3, 2.5);
1011 size_t count = this->g.count_nodes([](
auto) {
return true; });
1018 size_t count = this->g.count_arcs([](
auto) {
return true; });
1024 EXPECT_TRUE(this->g.exists_node([](
auto p) { return p->get_info() == 2; }));
1025 EXPECT_FALSE(this->g.exists_node([](
auto p) { return p->get_info() == 99; }));
1030 EXPECT_TRUE(this->g.exists_arc([](
auto a) { return a->get_info() == 1.0; }));
1031 EXPECT_FALSE(this->g.exists_arc([](
auto a) { return a->get_info() == 99.0; }));
1036 EXPECT_TRUE(this->g.none_node([](
auto p) { return p->get_info() > 100; }));
1037 EXPECT_FALSE(this->g.none_node([](
auto p) { return p->get_info() == 1; }));
1042 EXPECT_TRUE(this->g.none_arc([](
auto a) { return a->get_info() > 100.0; }));
1043 EXPECT_FALSE(this->g.none_arc([](
auto a) { return a->get_info() == 1.0; }));
1048 EXPECT_TRUE(this->g.all_nodes([](
auto p) { return p->get_info() > 0; }));
1049 EXPECT_FALSE(this->g.all_nodes([](
auto p) { return p->get_info() > 2; }));
1054 EXPECT_TRUE(this->g.all_arcs([](
auto a) { return a->get_info() > 0.0; }));
1055 EXPECT_FALSE(this->g.all_arcs([](
auto a) { return a->get_info() > 1.5; }));
1060 auto filtered = this->g.filter_nodes([](
auto p) {
return p->get_info() > 1; });
1066 auto filtered = this->g.filter_arcs([](
auto a) {
return a->get_info() > 1.0; });
1072 auto found = this->g.search_node([](
auto p) {
return p->get_info() == 2; });
1076 auto not_found = this->g.search_node([](
auto p) {
return p->get_info() == 99; });
1082 auto found = this->g.search_arc([](
auto a) {
return a->get_info() == 2.0; });
1090 [](
auto p) {
return p->get_info() > 1; });
1098 [](
auto a) {
return a->get_info() > 1.0; });
1106 this->g.for_each_node([&
sum](
auto p) {
sum += p->get_info(); });
1113 this->g.for_each_arc([&
sum](
auto a) {
sum += a->get_info(); });
1126 auto adj = this->g.adjacent_nodes(this->n2);
1132 auto min = this->g.min_arc();
1139 auto max = this->g.max_arc();
1149 size_t count = this->g.count_nodes([](
auto) {
return true; });
1156 size_t count = this->g.count_arcs([](
auto) {
return true; });
1162 EXPECT_TRUE(this->g.exists_node([](
auto p) { return p->get_info() == 20; }));
1163 EXPECT_FALSE(this->g.exists_node([](
auto p) { return p->get_info() == 99; }));
1168 EXPECT_TRUE(this->g.exists_arc([](
auto a) { return a->get_info() == 1.5; }));
1169 EXPECT_FALSE(this->g.exists_arc([](
auto a) { return a->get_info() == 99.0; }));
1174 EXPECT_TRUE(this->g.none_node([](
auto p) { return p->get_info() > 100; }));
1175 EXPECT_FALSE(this->g.none_node([](
auto p) { return p->get_info() == 10; }));
1180 EXPECT_TRUE(this->g.none_arc([](
auto a) { return a->get_info() > 100.0; }));
1181 EXPECT_FALSE(this->g.none_arc([](
auto a) { return a->get_info() == 1.5; }));
1186 EXPECT_TRUE(this->g.all_nodes([](
auto p) { return p->get_info() > 0; }));
1187 EXPECT_FALSE(this->g.all_nodes([](
auto p) { return p->get_info() > 20; }));
1192 EXPECT_TRUE(this->g.all_arcs([](
auto a) { return a->get_info() > 0.0; }));
1193 EXPECT_FALSE(this->g.all_arcs([](
auto a) { return a->get_info() > 2.0; }));
1198 auto filtered = this->g.filter_nodes([](
auto p) {
return p->get_info() > 10; });
1204 auto filtered = this->g.filter_arcs([](
auto a) {
return a->get_info() > 1.5; });
1210 auto found = this->g.search_node([](
auto p) {
return p->get_info() == 20; });
1217 auto found = this->g.search_arc([](
auto a) {
return a->get_info() == 2.5; });
1225 [](
auto p) {
return p->get_info() > 10; });
1233 [](
auto a) {
return a->get_info() > 1.5; });
1241 this->g.for_each_node([&
sum](
auto p) {
sum += p->get_info(); });
1248 this->g.for_each_arc([&
sum](
auto a) {
sum += a->get_info(); });
1261 auto outs = this->g.out_nodes(this->n1);
1267 auto outs = this->g.out_arcs(this->n1);
1273 auto min = this->g.min_arc();
1280 auto max = this->g.max_arc();
1287 ::testing::InitGoogleTest(&
argc,
argv);
Generic directed graph (digraph) wrapper template.
typename BaseGraph::Arc Arc
typename BaseGraph::Node Node
Arc for graphs implemented with simple adjacency lists.
size_t size() const noexcept
Count the number of elements of the list.
virtual Node * insert_node(Node *node) noexcept
Insertion of a node already allocated.
Arc * insert_arc(Node *src_node, Node *tgt_node, void *a)
Graph class implemented with singly-linked adjacency lists.
bool exists(Operation &op) const
Test for existence in the container of an element satisfying a criteria.
size_t count_nodes(Operation op=[](Node *) { return true;}) const
Count the nodes satisfying a condition.
bool none_node(Operation &op) const
Determine if no node satisfies a condition.
size_t count_arcs(Operation op=[](Arc *) { return true;}) const
Count the arcs satisfying a condition.
Arc * min_arc(Node *p, Compare cmp=[](Arc *a, Arc *b) { return a->get_info()< b->get_info();}) const
Find the minimum arc adjacent to a node.
std::pair< DynList< Node * >, DynList< Node * > > partition_nodes(Operation op) const
Partition nodes into two groups based on a predicate.
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_max_function > > max(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_min_function > > min(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
TEST_F(GraphFunctionalTest, NoneNodeReturnsTrueWhenNoMatch)
List_Digraph< IntNode, DoubleArc > ListDigraph
List_Graph< IntNode, DoubleArc > ListGraph
::testing::Types< ListGraph, SparseGraph, ArrayGraph > UndirectedGraphTypes
::testing::Types< ListDigraph, SparseDigraph, ArrayDigraph > DirectedGraphTypes
TYPED_TEST(UndirectedGraphTest, CountNodes)
TYPED_TEST_SUITE(UndirectedGraphTest, UndirectedGraphTypes)
Freq_Node * pred
Predecessor node in level-order traversal.
Main namespace for Aleph-w library functions.
bool all(Container &container, Operation &operation)
Return true if all elements satisfy a predicate.
bool completed() const noexcept
Return true if all underlying iterators are finished.
static long & low(typename GT::Node *p)
Internal helper: low-link value stored directly in NODE_COOKIE(p).
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
Arc of graph implemented with double-linked adjacency lists.
Node belonging to a graph implemented with a double linked adjacency list.
Node for graphs implemented with simple adjacency lists.
Array-based graph implementation.
Generic graph and digraph implementations.
Simple graph implementation with adjacency lists.