Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
index_graph_intensive_test.cc
Go to the documentation of this file.
1#include <gtest/gtest.h>
2#include <tpl_indexGraph.H>
3#include <tpl_graph.H>
4
5using namespace Aleph;
6
7class IndexGraphIntensiveTest : public ::testing::Test
8{
9protected:
12
13 void SetUp() override {}
14 void TearDown() override {}
15};
16
17// =============================================================================
18// Large Scale Tests
19// =============================================================================
20
22{
23 Index_Graph<GT> idx(g);
24
25 const int N = 1000;
26 for (int i = 0; i < N; ++i)
27 idx.insert_node(i);
28
29 EXPECT_EQ(idx.get_num_nodes(), static_cast<size_t>(N));
30
31 // Verify all are searchable
32 for (int i = 0; i < N; i += 10)
33 {
34 auto n = idx.search_node(i);
35 ASSERT_NE(n, nullptr);
36 EXPECT_EQ(n->get_info(), i);
37 }
38}
39
41{
42 Index_Graph<GT> idx(g);
43
44 std::vector<GT::Node*> nodes;
45 for (int i = 0; i < 50; ++i)
46 nodes.push_back(idx.insert_node(i));
47
48 // Create many arcs
49 int arc_count = 0;
50 for (size_t i = 0; i < nodes.size(); ++i)
51 {
52 for (size_t j = i + 1; j < nodes.size(); ++j)
53 {
54 idx.insert_arc(nodes[i], nodes[j], arc_count++);
55 }
56 }
57
58 EXPECT_GT(idx.get_num_arcs(), 1000u);
59}
60
62{
63 Index_Graph<GT> idx(g);
64
65 const int N = 30;
66 std::vector<GT::Node*> nodes;
67 for (int i = 0; i < N; ++i)
68 nodes.push_back(idx.insert_node(i));
69
70 // Create many arcs (but not complete to avoid duplicates in undirected graph)
71 int arc_count = 0;
72 for (int i = 0; i < N; ++i)
73 for (int j = i + 1; j < N; ++j)
74 {
75 idx.insert_arc(nodes[i], nodes[j], i * 1000 + j);
76 arc_count++;
77 }
78
79 EXPECT_EQ(idx.get_num_nodes(), static_cast<size_t>(N));
80 EXPECT_EQ(idx.get_num_arcs(), static_cast<size_t>(arc_count));
81}
82
84{
85 Index_Graph<GT> idx(g);
86
87 for (int i = 0; i < 100; ++i)
88 idx.insert_node(i * 10);
89
90 // Perform many searches
91 for (int iter = 0; iter < 1000; ++iter)
92 {
93 int search_val = (iter % 100) * 10;
94 auto n = idx.search_node(search_val);
95 ASSERT_NE(n, nullptr);
96 EXPECT_EQ(n->get_info(), search_val);
97 }
98}
99
100// =============================================================================
101// Insertion/Removal Patterns
102// =============================================================================
103
105{
106 Index_Graph<GT> idx(g);
107
108 for (int i = 0; i < 100; ++i)
109 {
110 idx.insert_node(i);
111 if (i % 5 == 4)
112 {
113 auto n = idx.search_node(i - 2);
114 if (n)
115 idx.remove_node(n);
116 }
117 }
118
119 EXPECT_GT(idx.get_num_nodes(), 0u);
120 EXPECT_LT(idx.get_num_nodes(), 100u);
121}
122
124{
125 Index_Graph<GT> idx(g);
126
127 std::vector<GT::Node*> nodes;
128 for (int i = 0; i < 200; ++i)
129 nodes.push_back(idx.insert_node(i));
130
131 EXPECT_EQ(idx.get_num_nodes(), 200u);
132
133 // Remove half
134 for (size_t i = 0; i < nodes.size(); i += 2)
135 idx.remove_node(nodes[i]);
136
137 EXPECT_EQ(idx.get_num_nodes(), 100u);
138}
139
141{
142 Index_Graph<GT> idx(g);
143
144 std::vector<int> values = {50, 25, 75, 10, 30, 60, 80, 5, 15, 20, 35, 40, 55, 65, 70, 85, 90, 95};
145
146 for (int v : values)
147 idx.insert_node(v);
148
149 EXPECT_EQ(idx.get_num_nodes(), values.size());
150
151 // All should be searchable
152 for (int v : values)
153 {
154 auto n = idx.search_node(v);
155 ASSERT_NE(n, nullptr);
156 EXPECT_EQ(n->get_info(), v);
157 }
158}
159
160// =============================================================================
161// Arc Indexing Tests
162// =============================================================================
163
165{
166 Index_Graph<GT> idx(g);
167
168 auto n1 = idx.insert_node(1);
169 auto n2 = idx.insert_node(2);
170 auto n3 = idx.insert_node(3);
171
172 idx.insert_arc(n1, n2, 12);
173 idx.insert_arc(n2, n3, 23);
174 idx.insert_arc(n1, n3, 13);
175
176 for (int i = 0; i < 1000; ++i)
177 {
178 auto a = idx.search_arc(n1, n2);
179 ASSERT_NE(a, nullptr);
180 EXPECT_EQ(a->get_info(), 12);
181 }
182}
183
185{
186 Index_Graph<GT> idx(g);
187
188 auto n1 = idx.insert_node(10);
189 auto n2 = idx.insert_node(20);
190
191 for (int i = 0; i < 50; ++i)
192 {
193 auto a = idx.insert_arc(n1, n2, i);
194 EXPECT_NE(a, nullptr);
195
196 idx.remove_arc(a);
197 EXPECT_EQ(idx.search_arc(n1, n2), nullptr);
198 }
199}
200
201// =============================================================================
202// Complex Graph Patterns
203// =============================================================================
204
206{
207 Index_Graph<GT> idx(g);
208
209 auto center = idx.insert_node(0);
210 std::vector<GT::Node*> leaves;
211
212 for (int i = 1; i <= 100; ++i)
213 {
214 auto leaf = idx.insert_node(i);
215 leaves.push_back(leaf);
216 idx.insert_arc(center, leaf, i);
217 }
218
219 EXPECT_EQ(idx.get_num_nodes(), 101u);
220 EXPECT_EQ(idx.get_num_arcs(), 100u);
221
222 // Verify center connectivity
223 for (auto leaf : leaves)
224 {
225 auto a = idx.search_arc(center, leaf);
226 EXPECT_NE(a, nullptr);
227 }
228}
229
231{
232 Index_Graph<GT> idx(g);
233
234 const int N = 200;
235 std::vector<GT::Node*> nodes;
236
237 for (int i = 0; i < N; ++i)
238 nodes.push_back(idx.insert_node(i));
239
240 for (int i = 0; i < N - 1; ++i)
241 idx.insert_arc(nodes[i], nodes[i + 1], i);
242
243 EXPECT_EQ(idx.get_num_nodes(), static_cast<size_t>(N));
244 EXPECT_EQ(idx.get_num_arcs(), static_cast<size_t>(N - 1));
245}
246
248{
249 Index_Graph<GT> idx(g);
250
251 const int ROWS = 20;
252 const int COLS = 20;
253 std::vector<std::vector<GT::Node*>> grid(ROWS);
254
255 // Create grid nodes
256 for (int i = 0; i < ROWS; ++i)
257 {
258 for (int j = 0; j < COLS; ++j)
259 {
260 grid[i].push_back(idx.insert_node(i * COLS + j));
261 }
262 }
263
264 // Connect horizontally and vertically
265 for (int i = 0; i < ROWS; ++i)
266 {
267 for (int j = 0; j < COLS; ++j)
268 {
269 if (j < COLS - 1)
270 idx.insert_arc(grid[i][j], grid[i][j + 1], 1);
271 if (i < ROWS - 1)
272 idx.insert_arc(grid[i][j], grid[i + 1][j], 1);
273 }
274 }
275
276 EXPECT_EQ(idx.get_num_nodes(), static_cast<size_t>(ROWS * COLS));
277}
278
279// =============================================================================
280// Iterator Performance Tests
281// =============================================================================
282
284{
285 Index_Graph<GT> idx(g);
286
287 const int N = 500;
288 for (int i = 0; i < N; ++i)
289 idx.insert_node(i);
290
291 int count = 0;
292 for (Node_Iterator<GT> it(g); it.has_curr(); it.next())
293 {
294 count++;
295 auto n = it.get_curr();
296 EXPECT_GE(n->get_info(), 0);
297 EXPECT_LT(n->get_info(), N);
298 }
299
300 EXPECT_EQ(count, N);
301}
302
304{
305 Index_Graph<GT> idx(g);
306
307 std::vector<GT::Node*> nodes;
308 for (int i = 0; i < 20; ++i)
309 nodes.push_back(idx.insert_node(i));
310
311 int arc_count = 0;
312 for (size_t i = 0; i < nodes.size(); ++i)
313 {
314 for (size_t j = i + 1; j < nodes.size(); ++j)
315 {
316 idx.insert_arc(nodes[i], nodes[j], arc_count);
317 arc_count++;
318 }
319 }
320
321 int iterated = 0;
322 for (Arc_Iterator<GT> it(g); it.has_curr(); it.next())
323 {
324 iterated++;
325 }
326
328}
329
330// =============================================================================
331// Duplicate Handling Tests
332// =============================================================================
333
335{
336 Index_Graph<GT> idx(g);
337
338 idx.insert_node(42);
339 idx.insert_node(42); // Duplicate value
340
341 // Only one node should exist
342 EXPECT_EQ(idx.get_num_nodes(), 1u);
343}
344
346{
347 Index_Graph<GT> idx(g);
348
349 for (int i = 0; i < 100; ++i)
350 idx.insert_node(5);
351
352 EXPECT_EQ(idx.get_num_nodes(), 1u);
353
354 auto n = idx.search_node(5);
355 ASSERT_NE(n, nullptr);
356 EXPECT_EQ(n->get_info(), 5);
357}
358
359// =============================================================================
360// Memory and Cleanup Tests
361// =============================================================================
362
364{
365 // Test creating multiple graph instances
366 for (int iter = 0; iter < 5; ++iter)
367 {
368 GT temp_g;
370
371 for (int i = 0; i < 100; ++i)
372 idx.insert_node(i);
373
374 EXPECT_EQ(idx.get_num_nodes(), 100u);
375 }
376}
377
379{
380 Index_Graph<GT> idx(g);
381
382 std::vector<GT::Node*> nodes;
383 for (int i = 0; i < 200; ++i)
384 nodes.push_back(idx.insert_node(i));
385
386 for (size_t i = 0; i < nodes.size() - 1; ++i)
387 idx.insert_arc(nodes[i], nodes[i + 1], i);
388
389 EXPECT_GT(idx.get_num_nodes(), 0u);
390 EXPECT_GT(idx.get_num_arcs(), 0u);
391
392 // Let destructor clean up
393}
394
395// =============================================================================
396// Search Efficiency Tests
397// =============================================================================
398
400{
401 Index_Graph<GT> idx(g);
402
403 // Build complex graph
404 for (int i = 0; i < 100; ++i)
405 idx.insert_node(i);
406
407 // Remove some
408 for (int i = 20; i < 40; ++i)
409 {
410 auto n = idx.search_node(i);
411 if (n)
412 idx.remove_node(n);
413 }
414
415 // Add more
416 for (int i = 100; i < 150; ++i)
417 idx.insert_node(i);
418
419 // Search should still be efficient
420 for (int i = 0; i < 20; ++i)
421 {
422 auto n = idx.search_node(i);
423 ASSERT_NE(n, nullptr);
424 EXPECT_EQ(n->get_info(), i);
425 }
426
427 for (int i = 100; i < 150; ++i)
428 {
429 auto n = idx.search_node(i);
430 ASSERT_NE(n, nullptr);
431 EXPECT_EQ(n->get_info(), i);
432 }
433}
434
436{
437 Index_Graph<GT> idx(g);
438
439 for (int i = -50; i <= 50; ++i)
440 idx.insert_node(i);
441
442 EXPECT_EQ(idx.get_num_nodes(), 101u);
443
444 for (int i = -50; i <= 50; i += 5)
445 {
446 auto n = idx.search_node(i);
447 ASSERT_NE(n, nullptr);
448 EXPECT_EQ(n->get_info(), i);
449 }
450}
451
452// =============================================================================
453// Extreme Cases
454// =============================================================================
455
457{
458 Index_Graph<GT> idx(g);
459
460 idx.insert_node(1000000);
461 idx.insert_node(2000000);
462 idx.insert_node(3000000);
463
464 auto n = idx.search_node(2000000);
465 ASSERT_NE(n, nullptr);
466 EXPECT_EQ(n->get_info(), 2000000);
467}
468
470{
471 Index_Graph<GT> idx(g);
472
473 for (int i = 0; i < 100; ++i)
474 {
475 idx.insert_node(i);
476
477 if (i % 10 == 0 && i > 0)
478 {
479 auto n = idx.search_node(i - 5);
480 if (n)
481 idx.remove_node(n);
482 }
483
484 if (i % 7 == 0)
485 {
486 auto n = idx.search_node(i);
487 EXPECT_NE(n, nullptr);
488 }
489 }
490
491 EXPECT_GT(idx.get_num_nodes(), 0u);
492}
void next()
Advances the iterator to the next filtered element.
Construye índices de nodos y arcos para su rápida búsqueda y recuperación.
size_t get_num_arcs() const
Retorna el número de arcos que contiene el índice.
GT_Node * search_node(GT_Node *p)
Busca en el índice un nodo.
GT_Arc * search_arc(GT_Node *src, GT_Node *tgt)
Busca en el índice un arco dados dos nodos.
void remove_node(GT_Node *p)
Elimina el nodo p del grafo y del índice.
size_t get_num_nodes() const
Retorna el número de nodos que contiene el índice.
GT_Node * insert_node(const GT_Node_Type &info)
Crea un nuevo nodo y lo inserta en grafo y en el índice.
void remove_arc(GT_Arc *a)
Elimina del grafo y del índice el arco a.
GT_Arc * insert_arc(GT_Node *src, GT_Node *tgt, const GT_Arc_Type &info=GT_Arc_Type())
Crea un nuevo arco entre dos nodos y lo inserta en el grafo y en el índice.
Filtered iterator on the nodes of a graph.
Definition tpl_graph.H:1206
#define N
Definition fib.C:294
DynArray< Graph::Node * > nodes
Definition graphpic.C:406
TEST_F(IndexGraphIntensiveTest, LargeNumberOfNodes)
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
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.
Definition ahAlgo.H:127
Filtered iterator on all the arcs of a graph.
Definition tpl_graph.H:1164
Arc of graph implemented with double-linked adjacency lists.
Definition tpl_graph.H:222
Generic graph and digraph implementations.
Graph indexing utilities for O(log n) node/arc lookup.