gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 4 0
merge default
3 files changed with 462 insertions and 68 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -692,98 +692,98 @@
692 692
    ///
693 693
    /// This function gives back true if the given arc is valid,
694 694
    /// ie. it is a real arc of the graph.
695 695
    ///
696 696
    /// \warning A removed arc (using Snapshot) could become valid again
697 697
    /// when new edges are added to the graph.
698 698
    bool valid(Arc a) const { return Parent::valid(a); }
699 699

	
700 700
    /// \brief Edge validity check
701 701
    ///
702 702
    /// This function gives back true if the given edge is valid,
703 703
    /// ie. it is a real edge of the graph.
704 704
    ///
705 705
    /// \warning A removed edge (using Snapshot) could become valid again
706 706
    /// when new edges are added to the graph.
707 707
    bool valid(Edge e) const { return Parent::valid(e); }
708 708

	
709 709
    ///Clear the graph.
710 710

	
711 711
    ///Erase all the nodes and edges from the graph.
712 712
    ///
713 713
    void clear() {
714 714
      Parent::clear();
715 715
    }
716 716

	
717 717
  public:
718 718

	
719 719
    class Snapshot;
720 720

	
721 721
  protected:
722 722

	
723 723
    void saveSnapshot(Snapshot &s)
724 724
    {
725 725
      s._graph = this;
726 726
      s.node_num = nodes.size();
727 727
      s.arc_num = arcs.size();
728 728
    }
729 729

	
730 730
    void restoreSnapshot(const Snapshot &s)
731 731
    {
732 732
      while(s.arc_num<arcs.size()) {
733 733
        int n=arcs.size()-1;
734 734
        Edge arc=edgeFromId(n/2);
735 735
        Parent::notifier(Edge()).erase(arc);
736 736
        std::vector<Arc> dir;
737 737
        dir.push_back(arcFromId(n));
738 738
        dir.push_back(arcFromId(n-1));
739 739
        Parent::notifier(Arc()).erase(dir);
740
        nodes[arcs[n].target].first_out=arcs[n].next_out;
741
        nodes[arcs[n-1].target].first_out=arcs[n-1].next_out;
740
        nodes[arcs[n-1].target].first_out=arcs[n].next_out;
741
        nodes[arcs[n].target].first_out=arcs[n-1].next_out;
742 742
        arcs.pop_back();
743 743
        arcs.pop_back();
744 744
      }
745 745
      while(s.node_num<nodes.size()) {
746 746
        int n=nodes.size()-1;
747 747
        Node node = nodeFromId(n);
748 748
        Parent::notifier(Node()).erase(node);
749 749
        nodes.pop_back();
750 750
      }
751 751
    }
752 752

	
753 753
  public:
754 754

	
755 755
    ///Class to make a snapshot of the digraph and to restrore to it later.
756 756

	
757 757
    ///Class to make a snapshot of the digraph and to restrore to it later.
758 758
    ///
759 759
    ///The newly added nodes and arcs can be removed using the
760 760
    ///restore() function.
761 761
    ///
762 762
    ///\note After you restore a state, you cannot restore
763 763
    ///a later state, in other word you cannot add again the arcs deleted
764 764
    ///by restore() using another one Snapshot instance.
765 765
    ///
766 766
    ///\warning If you do not use correctly the snapshot that can cause
767 767
    ///either broken program, invalid state of the digraph, valid but
768 768
    ///not the restored digraph or no change. Because the runtime performance
769 769
    ///the validity of the snapshot is not stored.
770 770
    class Snapshot
771 771
    {
772 772
      SmartGraph *_graph;
773 773
    protected:
774 774
      friend class SmartGraph;
775 775
      unsigned int node_num;
776 776
      unsigned int arc_num;
777 777
    public:
778 778
      ///Default constructor.
779 779

	
780 780
      ///Default constructor.
781 781
      ///To actually make a snapshot you must call save().
782 782
      ///
783 783
      Snapshot() : _graph(0) {}
784 784
      ///Constructor that immediately makes a snapshot
785 785

	
786 786
      ///This constructor immediately makes a snapshot of the digraph.
787 787
      ///\param graph The digraph we make a snapshot of.
788 788
      Snapshot(SmartGraph &graph) {
789 789
        graph.saveSnapshot(*this);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/full_graph.h>
23 23

	
24 24
#include "test_tools.h"
25 25
#include "graph_test.h"
26 26

	
27 27
using namespace lemon;
28 28
using namespace lemon::concepts;
29 29

	
30 30
template <class Digraph>
31
void checkDigraph() {
31
void checkDigraphBuild() {
32 32
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
33 33
  Digraph G;
34 34

	
35 35
  checkGraphNodeList(G, 0);
36 36
  checkGraphArcList(G, 0);
37 37

	
38 38
  Node
39 39
    n1 = G.addNode(),
40 40
    n2 = G.addNode(),
41 41
    n3 = G.addNode();
42 42
  checkGraphNodeList(G, 3);
43 43
  checkGraphArcList(G, 0);
44 44

	
45 45
  Arc a1 = G.addArc(n1, n2);
46 46
  check(G.source(a1) == n1 && G.target(a1) == n2, "Wrong arc");
47 47
  checkGraphNodeList(G, 3);
48 48
  checkGraphArcList(G, 1);
49 49

	
50 50
  checkGraphOutArcList(G, n1, 1);
51 51
  checkGraphOutArcList(G, n2, 0);
52 52
  checkGraphOutArcList(G, n3, 0);
53 53

	
54 54
  checkGraphInArcList(G, n1, 0);
55 55
  checkGraphInArcList(G, n2, 1);
56 56
  checkGraphInArcList(G, n3, 0);
57 57

	
58 58
  checkGraphConArcList(G, 1);
59 59

	
60
  Arc a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
60
  Arc a2 = G.addArc(n2, n1),
61
      a3 = G.addArc(n2, n3),
62
      a4 = G.addArc(n2, n3);
63

	
64
  checkGraphNodeList(G, 3);
65
  checkGraphArcList(G, 4);
66

	
67
  checkGraphOutArcList(G, n1, 1);
68
  checkGraphOutArcList(G, n2, 3);
69
  checkGraphOutArcList(G, n3, 0);
70

	
71
  checkGraphInArcList(G, n1, 1);
72
  checkGraphInArcList(G, n2, 1);
73
  checkGraphInArcList(G, n3, 2);
74

	
75
  checkGraphConArcList(G, 4);
76

	
77
  checkNodeIds(G);
78
  checkArcIds(G);
79
  checkGraphNodeMap(G);
80
  checkGraphArcMap(G);
81
}
82

	
83
template <class Digraph>
84
void checkDigraphSplit() {
85
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
86

	
87
  Digraph G;
88
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
89
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
90
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
91

	
92
  Node n4 = G.split(n2);
93

	
94
  check(G.target(OutArcIt(G, n2)) == n4 &&
95
        G.source(InArcIt(G, n4)) == n2,
96
        "Wrong split.");
97

	
98
  checkGraphNodeList(G, 4);
99
  checkGraphArcList(G, 5);
100

	
101
  checkGraphOutArcList(G, n1, 1);
102
  checkGraphOutArcList(G, n2, 1);
103
  checkGraphOutArcList(G, n3, 0);
104
  checkGraphOutArcList(G, n4, 3);
105

	
106
  checkGraphInArcList(G, n1, 1);
107
  checkGraphInArcList(G, n2, 1);
108
  checkGraphInArcList(G, n3, 2);
109
  checkGraphInArcList(G, n4, 1);
110

	
111
  checkGraphConArcList(G, 5);
112
}
113

	
114
template <class Digraph>
115
void checkDigraphAlter() {
116
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
117

	
118
  Digraph G;
119
  Node n1 = G.addNode(), n2 = G.addNode(),
120
       n3 = G.addNode(), n4 = G.addNode();
121
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
122
      a3 = G.addArc(n4, n3), a4 = G.addArc(n4, n3),
123
      a5 = G.addArc(n2, n4);
124

	
125
  checkGraphNodeList(G, 4);
126
  checkGraphArcList(G, 5);
127

	
128
  // Check changeSource() and changeTarget()
129
  G.changeTarget(a4, n1);
130

	
131
  checkGraphNodeList(G, 4);
132
  checkGraphArcList(G, 5);
133

	
134
  checkGraphOutArcList(G, n1, 1);
135
  checkGraphOutArcList(G, n2, 1);
136
  checkGraphOutArcList(G, n3, 0);
137
  checkGraphOutArcList(G, n4, 3);
138

	
139
  checkGraphInArcList(G, n1, 2);
140
  checkGraphInArcList(G, n2, 1);
141
  checkGraphInArcList(G, n3, 1);
142
  checkGraphInArcList(G, n4, 1);
143

	
144
  checkGraphConArcList(G, 5);
145

	
146
  G.changeSource(a4, n3);
147

	
148
  checkGraphNodeList(G, 4);
149
  checkGraphArcList(G, 5);
150

	
151
  checkGraphOutArcList(G, n1, 1);
152
  checkGraphOutArcList(G, n2, 1);
153
  checkGraphOutArcList(G, n3, 1);
154
  checkGraphOutArcList(G, n4, 2);
155

	
156
  checkGraphInArcList(G, n1, 2);
157
  checkGraphInArcList(G, n2, 1);
158
  checkGraphInArcList(G, n3, 1);
159
  checkGraphInArcList(G, n4, 1);
160

	
161
  checkGraphConArcList(G, 5);
162

	
163
  // Check contract()
164
  G.contract(n2, n4, false);
165

	
166
  checkGraphNodeList(G, 3);
167
  checkGraphArcList(G, 5);
168

	
169
  checkGraphOutArcList(G, n1, 1);
170
  checkGraphOutArcList(G, n2, 3);
171
  checkGraphOutArcList(G, n3, 1);
172

	
173
  checkGraphInArcList(G, n1, 2);
174
  checkGraphInArcList(G, n2, 2);
175
  checkGraphInArcList(G, n3, 1);
176

	
177
  checkGraphConArcList(G, 5);
178

	
179
  G.contract(n2, n1);
180

	
181
  checkGraphNodeList(G, 2);
182
  checkGraphArcList(G, 3);
183

	
184
  checkGraphOutArcList(G, n2, 2);
185
  checkGraphOutArcList(G, n3, 1);
186

	
187
  checkGraphInArcList(G, n2, 2);
188
  checkGraphInArcList(G, n3, 1);
189

	
190
  checkGraphConArcList(G, 3);
191
}
192

	
193
template <class Digraph>
194
void checkDigraphErase() {
195
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
196

	
197
  Digraph G;
198
  Node n1 = G.addNode(), n2 = G.addNode(),
199
       n3 = G.addNode(), n4 = G.addNode();
200
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
201
      a3 = G.addArc(n4, n3), a4 = G.addArc(n3, n1),
202
      a5 = G.addArc(n2, n4);
203

	
204
  // Check arc deletion
205
  G.erase(a1);
206

	
207
  checkGraphNodeList(G, 4);
208
  checkGraphArcList(G, 4);
209

	
210
  checkGraphOutArcList(G, n1, 0);
211
  checkGraphOutArcList(G, n2, 1);
212
  checkGraphOutArcList(G, n3, 1);
213
  checkGraphOutArcList(G, n4, 2);
214

	
215
  checkGraphInArcList(G, n1, 2);
216
  checkGraphInArcList(G, n2, 0);
217
  checkGraphInArcList(G, n3, 1);
218
  checkGraphInArcList(G, n4, 1);
219

	
220
  checkGraphConArcList(G, 4);
221

	
222
  // Check node deletion
223
  G.erase(n4);
224

	
225
  checkGraphNodeList(G, 3);
226
  checkGraphArcList(G, 1);
227

	
228
  checkGraphOutArcList(G, n1, 0);
229
  checkGraphOutArcList(G, n2, 0);
230
  checkGraphOutArcList(G, n3, 1);
231
  checkGraphOutArcList(G, n4, 0);
232

	
233
  checkGraphInArcList(G, n1, 1);
234
  checkGraphInArcList(G, n2, 0);
235
  checkGraphInArcList(G, n3, 0);
236
  checkGraphInArcList(G, n4, 0);
237

	
238
  checkGraphConArcList(G, 1);
239
}
240

	
241

	
242
template <class Digraph>
243
void checkDigraphSnapshot() {
244
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
245

	
246
  Digraph G;
247
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
248
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
249
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
250

	
251
  typename Digraph::Snapshot snapshot(G);
252

	
253
  Node n = G.addNode();
254
  G.addArc(n3, n);
255
  G.addArc(n, n3);
256

	
257
  checkGraphNodeList(G, 4);
258
  checkGraphArcList(G, 6);
259

	
260
  snapshot.restore();
261

	
61 262
  checkGraphNodeList(G, 3);
62 263
  checkGraphArcList(G, 4);
63 264

	
64 265
  checkGraphOutArcList(G, n1, 1);
65 266
  checkGraphOutArcList(G, n2, 3);
66 267
  checkGraphOutArcList(G, n3, 0);
67 268

	
68 269
  checkGraphInArcList(G, n1, 1);
69 270
  checkGraphInArcList(G, n2, 1);
70 271
  checkGraphInArcList(G, n3, 2);
71 272

	
72 273
  checkGraphConArcList(G, 4);
73 274

	
74 275
  checkNodeIds(G);
75 276
  checkArcIds(G);
76 277
  checkGraphNodeMap(G);
77 278
  checkGraphArcMap(G);
78 279

	
79
}
280
  G.addNode();
281
  snapshot.save(G);
80 282

	
81
void checkFullDigraph(int num) {
82
  typedef FullDigraph Digraph;
83
  DIGRAPH_TYPEDEFS(Digraph);
84
  Digraph G(num);
283
  G.addArc(G.addNode(), G.addNode());
85 284

	
86
  checkGraphNodeList(G, num);
87
  checkGraphArcList(G, num * num);
285
  snapshot.restore();
88 286

	
89
  for (NodeIt n(G); n != INVALID; ++n) {
90
    checkGraphOutArcList(G, n, num);
91
    checkGraphInArcList(G, n, num);
92
  }
93

	
94
  checkGraphConArcList(G, num * num);
95

	
96
  checkNodeIds(G);
97
  checkArcIds(G);
98
  checkGraphNodeMap(G);
99
  checkGraphArcMap(G);
100

	
101
  for (int i = 0; i < G.nodeNum(); ++i) {
102
    check(G.index(G(i)) == i, "Wrong index");
103
  }
104

	
105
  for (NodeIt s(G); s != INVALID; ++s) {
106
    for (NodeIt t(G); t != INVALID; ++t) {
107
      Arc a = G.arc(s, t);
108
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
109
    }
110
  }
111

	
287
  checkGraphNodeList(G, 4);
288
  checkGraphArcList(G, 4);
112 289
}
113 290

	
114 291
void checkConcepts() {
115 292
  { // Checking digraph components
116 293
    checkConcept<BaseDigraphComponent, BaseDigraphComponent >();
117 294

	
118 295
    checkConcept<IDableDigraphComponent<>,
119 296
      IDableDigraphComponent<> >();
120 297

	
121 298
    checkConcept<IterableDigraphComponent<>,
122 299
      IterableDigraphComponent<> >();
123 300

	
124 301
    checkConcept<MappableDigraphComponent<>,
125 302
      MappableDigraphComponent<> >();
126 303
  }
127 304
  { // Checking skeleton digraph
128 305
    checkConcept<Digraph, Digraph>();
129 306
  }
130 307
  { // Checking ListDigraph
131 308
    checkConcept<Digraph, ListDigraph>();
132 309
    checkConcept<AlterableDigraphComponent<>, ListDigraph>();
133 310
    checkConcept<ExtendableDigraphComponent<>, ListDigraph>();
134 311
    checkConcept<ClearableDigraphComponent<>, ListDigraph>();
135 312
    checkConcept<ErasableDigraphComponent<>, ListDigraph>();
136 313
  }
137 314
  { // Checking SmartDigraph
138 315
    checkConcept<Digraph, SmartDigraph>();
139 316
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
140 317
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
141 318
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
142 319
  }
143 320
  { // Checking FullDigraph
144 321
    checkConcept<Digraph, FullDigraph>();
145 322
  }
146 323
}
147 324

	
148 325
template <typename Digraph>
149 326
void checkDigraphValidity() {
150 327
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
151 328
  Digraph g;
152 329

	
153 330
  Node
154 331
    n1 = g.addNode(),
155 332
    n2 = g.addNode(),
156 333
    n3 = g.addNode();
157 334

	
158 335
  Arc
159 336
    e1 = g.addArc(n1, n2),
160 337
    e2 = g.addArc(n2, n3);
161 338

	
162 339
  check(g.valid(n1), "Wrong validity check");
163 340
  check(g.valid(e1), "Wrong validity check");
164 341

	
165 342
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
166 343
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
167 344
}
168 345

	
169 346
template <typename Digraph>
170 347
void checkDigraphValidityErase() {
171 348
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
172 349
  Digraph g;
173 350

	
174 351
  Node
175 352
    n1 = g.addNode(),
176 353
    n2 = g.addNode(),
177 354
    n3 = g.addNode();
178 355

	
179 356
  Arc
180 357
    e1 = g.addArc(n1, n2),
181 358
    e2 = g.addArc(n2, n3);
182 359

	
183 360
  check(g.valid(n1), "Wrong validity check");
184 361
  check(g.valid(e1), "Wrong validity check");
185 362

	
186 363
  g.erase(n1);
187 364

	
188 365
  check(!g.valid(n1), "Wrong validity check");
189 366
  check(g.valid(n2), "Wrong validity check");
190 367
  check(g.valid(n3), "Wrong validity check");
191 368
  check(!g.valid(e1), "Wrong validity check");
192 369
  check(g.valid(e2), "Wrong validity check");
193 370

	
194 371
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
195 372
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
196 373
}
197 374

	
375
void checkFullDigraph(int num) {
376
  typedef FullDigraph Digraph;
377
  DIGRAPH_TYPEDEFS(Digraph);
378
  Digraph G(num);
379

	
380
  checkGraphNodeList(G, num);
381
  checkGraphArcList(G, num * num);
382

	
383
  for (NodeIt n(G); n != INVALID; ++n) {
384
    checkGraphOutArcList(G, n, num);
385
    checkGraphInArcList(G, n, num);
386
  }
387

	
388
  checkGraphConArcList(G, num * num);
389

	
390
  checkNodeIds(G);
391
  checkArcIds(G);
392
  checkGraphNodeMap(G);
393
  checkGraphArcMap(G);
394

	
395
  for (int i = 0; i < G.nodeNum(); ++i) {
396
    check(G.index(G(i)) == i, "Wrong index");
397
  }
398

	
399
  for (NodeIt s(G); s != INVALID; ++s) {
400
    for (NodeIt t(G); t != INVALID; ++t) {
401
      Arc a = G.arc(s, t);
402
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
403
    }
404
  }
405
}
406

	
198 407
void checkDigraphs() {
199 408
  { // Checking ListDigraph
200
    checkDigraph<ListDigraph>();
409
    checkDigraphBuild<ListDigraph>();
410
    checkDigraphSplit<ListDigraph>();
411
    checkDigraphAlter<ListDigraph>();
412
    checkDigraphErase<ListDigraph>();
413
    checkDigraphSnapshot<ListDigraph>();
201 414
    checkDigraphValidityErase<ListDigraph>();
202 415
  }
203 416
  { // Checking SmartDigraph
204
    checkDigraph<SmartDigraph>();
417
    checkDigraphBuild<SmartDigraph>();
418
    checkDigraphSplit<SmartDigraph>();
419
    checkDigraphSnapshot<SmartDigraph>();
205 420
    checkDigraphValidity<SmartDigraph>();
206 421
  }
207 422
  { // Checking FullDigraph
208 423
    checkFullDigraph(8);
209 424
  }
210 425
}
211 426

	
212 427
int main() {
213 428
  checkDigraphs();
214 429
  checkConcepts();
215 430
  return 0;
216 431
}
Ignore white space 96 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/graph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/full_graph.h>
23 23
#include <lemon/grid_graph.h>
24 24
#include <lemon/hypercube_graph.h>
25 25

	
26 26
#include "test_tools.h"
27 27
#include "graph_test.h"
28 28

	
29 29
using namespace lemon;
30 30
using namespace lemon::concepts;
31 31

	
32 32
template <class Graph>
33
void checkGraph() {
33
void checkGraphBuild() {
34 34
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
35 35

	
36 36
  Graph G;
37 37
  checkGraphNodeList(G, 0);
38 38
  checkGraphEdgeList(G, 0);
39
  checkGraphArcList(G, 0);
39 40

	
40 41
  Node
41 42
    n1 = G.addNode(),
42 43
    n2 = G.addNode(),
43 44
    n3 = G.addNode();
44 45
  checkGraphNodeList(G, 3);
45 46
  checkGraphEdgeList(G, 0);
47
  checkGraphArcList(G, 0);
46 48

	
47 49
  Edge e1 = G.addEdge(n1, n2);
48 50
  check((G.u(e1) == n1 && G.v(e1) == n2) || (G.u(e1) == n2 && G.v(e1) == n1),
49 51
        "Wrong edge");
52

	
50 53
  checkGraphNodeList(G, 3);
54
  checkGraphEdgeList(G, 1);
51 55
  checkGraphArcList(G, 2);
52
  checkGraphEdgeList(G, 1);
53 56

	
54
  checkGraphOutArcList(G, n1, 1);
55
  checkGraphOutArcList(G, n2, 1);
56
  checkGraphOutArcList(G, n3, 0);
57
  checkGraphIncEdgeArcLists(G, n1, 1);
58
  checkGraphIncEdgeArcLists(G, n2, 1);
59
  checkGraphIncEdgeArcLists(G, n3, 0);
57 60

	
58
  checkGraphInArcList(G, n1, 1);
59
  checkGraphInArcList(G, n2, 1);
60
  checkGraphInArcList(G, n3, 0);
61
  checkGraphConEdgeList(G, 1);
62
  checkGraphConArcList(G, 2);
61 63

	
62
  checkGraphIncEdgeList(G, n1, 1);
63
  checkGraphIncEdgeList(G, n2, 1);
64
  checkGraphIncEdgeList(G, n3, 0);
64
  Edge e2 = G.addEdge(n2, n1),
65
       e3 = G.addEdge(n2, n3);
65 66

	
66
  checkGraphConArcList(G, 2);
67
  checkGraphConEdgeList(G, 1);
67
  checkGraphNodeList(G, 3);
68
  checkGraphEdgeList(G, 3);
69
  checkGraphArcList(G, 6);
68 70

	
69
  Edge e2 = G.addEdge(n2, n1), e3 = G.addEdge(n2, n3);
70
  checkGraphNodeList(G, 3);
71
  checkGraphArcList(G, 6);
72
  checkGraphEdgeList(G, 3);
71
  checkGraphIncEdgeArcLists(G, n1, 2);
72
  checkGraphIncEdgeArcLists(G, n2, 3);
73
  checkGraphIncEdgeArcLists(G, n3, 1);
73 74

	
74
  checkGraphOutArcList(G, n1, 2);
75
  checkGraphOutArcList(G, n2, 3);
76
  checkGraphOutArcList(G, n3, 1);
77

	
78
  checkGraphInArcList(G, n1, 2);
79
  checkGraphInArcList(G, n2, 3);
80
  checkGraphInArcList(G, n3, 1);
81

	
82
  checkGraphIncEdgeList(G, n1, 2);
83
  checkGraphIncEdgeList(G, n2, 3);
84
  checkGraphIncEdgeList(G, n3, 1);
85

	
75
  checkGraphConEdgeList(G, 3);
86 76
  checkGraphConArcList(G, 6);
87
  checkGraphConEdgeList(G, 3);
88 77

	
89 78
  checkArcDirections(G);
90 79

	
91 80
  checkNodeIds(G);
92 81
  checkArcIds(G);
93 82
  checkEdgeIds(G);
94 83
  checkGraphNodeMap(G);
95 84
  checkGraphArcMap(G);
96 85
  checkGraphEdgeMap(G);
97 86
}
98 87

	
88
template <class Graph>
89
void checkGraphAlter() {
90
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
91

	
92
  Graph G;
93
  Node n1 = G.addNode(), n2 = G.addNode(),
94
       n3 = G.addNode(), n4 = G.addNode();
95
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
96
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
97
       e5 = G.addEdge(n4, n3);
98

	
99
  checkGraphNodeList(G, 4);
100
  checkGraphEdgeList(G, 5);
101
  checkGraphArcList(G, 10);
102

	
103
  // Check changeU() and changeV()
104
  if (G.u(e2) == n2) {
105
    G.changeU(e2, n3);
106
  } else {
107
    G.changeV(e2, n3);
108
  }
109

	
110
  checkGraphNodeList(G, 4);
111
  checkGraphEdgeList(G, 5);
112
  checkGraphArcList(G, 10);
113

	
114
  checkGraphIncEdgeArcLists(G, n1, 3);
115
  checkGraphIncEdgeArcLists(G, n2, 2);
116
  checkGraphIncEdgeArcLists(G, n3, 3);
117
  checkGraphIncEdgeArcLists(G, n4, 2);
118

	
119
  checkGraphConEdgeList(G, 5);
120
  checkGraphConArcList(G, 10);
121

	
122
  if (G.u(e2) == n1) {
123
    G.changeU(e2, n2);
124
  } else {
125
    G.changeV(e2, n2);
126
  }
127

	
128
  checkGraphNodeList(G, 4);
129
  checkGraphEdgeList(G, 5);
130
  checkGraphArcList(G, 10);
131

	
132
  checkGraphIncEdgeArcLists(G, n1, 2);
133
  checkGraphIncEdgeArcLists(G, n2, 3);
134
  checkGraphIncEdgeArcLists(G, n3, 3);
135
  checkGraphIncEdgeArcLists(G, n4, 2);
136

	
137
  checkGraphConEdgeList(G, 5);
138
  checkGraphConArcList(G, 10);
139

	
140
  // Check contract()
141
  G.contract(n1, n4, false);
142

	
143
  checkGraphNodeList(G, 3);
144
  checkGraphEdgeList(G, 5);
145
  checkGraphArcList(G, 10);
146

	
147
  checkGraphIncEdgeArcLists(G, n1, 4);
148
  checkGraphIncEdgeArcLists(G, n2, 3);
149
  checkGraphIncEdgeArcLists(G, n3, 3);
150

	
151
  checkGraphConEdgeList(G, 5);
152
  checkGraphConArcList(G, 10);
153

	
154
  G.contract(n2, n3);
155

	
156
  checkGraphNodeList(G, 2);
157
  checkGraphEdgeList(G, 3);
158
  checkGraphArcList(G, 6);
159

	
160
  checkGraphIncEdgeArcLists(G, n1, 4);
161
  checkGraphIncEdgeArcLists(G, n2, 2);
162

	
163
  checkGraphConEdgeList(G, 3);
164
  checkGraphConArcList(G, 6);
165
}
166

	
167
template <class Graph>
168
void checkGraphErase() {
169
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
170

	
171
  Graph G;
172
  Node n1 = G.addNode(), n2 = G.addNode(),
173
       n3 = G.addNode(), n4 = G.addNode();
174
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
175
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
176
       e5 = G.addEdge(n4, n3);
177

	
178
  // Check edge deletion
179
  G.erase(e2);
180

	
181
  checkGraphNodeList(G, 4);
182
  checkGraphEdgeList(G, 4);
183
  checkGraphArcList(G, 8);
184

	
185
  checkGraphIncEdgeArcLists(G, n1, 2);
186
  checkGraphIncEdgeArcLists(G, n2, 2);
187
  checkGraphIncEdgeArcLists(G, n3, 2);
188
  checkGraphIncEdgeArcLists(G, n4, 2);
189

	
190
  checkGraphConEdgeList(G, 4);
191
  checkGraphConArcList(G, 8);
192

	
193
  // Check node deletion
194
  G.erase(n3);
195

	
196
  checkGraphNodeList(G, 3);
197
  checkGraphEdgeList(G, 2);
198
  checkGraphArcList(G, 4);
199

	
200
  checkGraphIncEdgeArcLists(G, n1, 2);
201
  checkGraphIncEdgeArcLists(G, n2, 1);
202
  checkGraphIncEdgeArcLists(G, n4, 1);
203

	
204
  checkGraphConEdgeList(G, 2);
205
  checkGraphConArcList(G, 4);
206
}
207

	
208

	
209
template <class Graph>
210
void checkGraphSnapshot() {
211
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
212

	
213
  Graph G;
214
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
215
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
216
       e3 = G.addEdge(n2, n3);
217

	
218
  checkGraphNodeList(G, 3);
219
  checkGraphEdgeList(G, 3);
220
  checkGraphArcList(G, 6);
221

	
222
  typename Graph::Snapshot snapshot(G);
223

	
224
  Node n = G.addNode();
225
  G.addEdge(n3, n);
226
  G.addEdge(n, n3);
227
  G.addEdge(n3, n2);
228

	
229
  checkGraphNodeList(G, 4);
230
  checkGraphEdgeList(G, 6);
231
  checkGraphArcList(G, 12);
232

	
233
  snapshot.restore();
234

	
235
  checkGraphNodeList(G, 3);
236
  checkGraphEdgeList(G, 3);
237
  checkGraphArcList(G, 6);
238

	
239
  checkGraphIncEdgeArcLists(G, n1, 2);
240
  checkGraphIncEdgeArcLists(G, n2, 3);
241
  checkGraphIncEdgeArcLists(G, n3, 1);
242

	
243
  checkGraphConEdgeList(G, 3);
244
  checkGraphConArcList(G, 6);
245

	
246
  checkNodeIds(G);
247
  checkEdgeIds(G);
248
  checkArcIds(G);
249
  checkGraphNodeMap(G);
250
  checkGraphEdgeMap(G);
251
  checkGraphArcMap(G);
252

	
253
  G.addNode();
254
  snapshot.save(G);
255

	
256
  G.addEdge(G.addNode(), G.addNode());
257

	
258
  snapshot.restore();
259

	
260
  checkGraphNodeList(G, 4);
261
  checkGraphEdgeList(G, 3);
262
  checkGraphArcList(G, 6);
263
}
264

	
99 265
void checkFullGraph(int num) {
100 266
  typedef FullGraph Graph;
101 267
  GRAPH_TYPEDEFS(Graph);
102 268

	
103 269
  Graph G(num);
104 270
  checkGraphNodeList(G, num);
105 271
  checkGraphEdgeList(G, num * (num - 1) / 2);
106 272

	
107 273
  for (NodeIt n(G); n != INVALID; ++n) {
108 274
    checkGraphOutArcList(G, n, num - 1);
109 275
    checkGraphInArcList(G, n, num - 1);
110 276
    checkGraphIncEdgeList(G, n, num - 1);
111 277
  }
112 278

	
113 279
  checkGraphConArcList(G, num * (num - 1));
114 280
  checkGraphConEdgeList(G, num * (num - 1) / 2);
115 281

	
116 282
  checkArcDirections(G);
117 283

	
118 284
  checkNodeIds(G);
119 285
  checkArcIds(G);
120 286
  checkEdgeIds(G);
121 287
  checkGraphNodeMap(G);
122 288
  checkGraphArcMap(G);
123 289
  checkGraphEdgeMap(G);
124 290

	
125 291

	
126 292
  for (int i = 0; i < G.nodeNum(); ++i) {
127 293
    check(G.index(G(i)) == i, "Wrong index");
128 294
  }
129 295

	
130 296
  for (NodeIt u(G); u != INVALID; ++u) {
131 297
    for (NodeIt v(G); v != INVALID; ++v) {
132 298
      Edge e = G.edge(u, v);
133 299
      Arc a = G.arc(u, v);
134 300
      if (u == v) {
135 301
        check(e == INVALID, "Wrong edge lookup");
136 302
        check(a == INVALID, "Wrong arc lookup");
137 303
      } else {
138 304
        check((G.u(e) == u && G.v(e) == v) ||
139 305
              (G.u(e) == v && G.v(e) == u), "Wrong edge lookup");
140 306
        check(G.source(a) == u && G.target(a) == v, "Wrong arc lookup");
141 307
      }
142 308
    }
143 309
  }
144 310
}
145 311

	
146 312
void checkConcepts() {
... ...
@@ -321,79 +487,83 @@
321 487

	
322 488
  HypercubeGraph G(dim);
323 489
  checkGraphNodeList(G, 1 << dim);
324 490
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
325 491
  checkGraphArcList(G, dim * (1 << dim));
326 492

	
327 493
  Node n = G.nodeFromId(dim);
328 494

	
329 495
  for (NodeIt n(G); n != INVALID; ++n) {
330 496
    checkGraphIncEdgeList(G, n, dim);
331 497
    for (IncEdgeIt e(G, n); e != INVALID; ++e) {
332 498
      check( (G.u(e) == n &&
333 499
              G.id(G.v(e)) == (G.id(n) ^ (1 << G.dimension(e)))) ||
334 500
             (G.v(e) == n &&
335 501
              G.id(G.u(e)) == (G.id(n) ^ (1 << G.dimension(e)))),
336 502
             "Wrong edge or wrong dimension");
337 503
    }
338 504

	
339 505
    checkGraphOutArcList(G, n, dim);
340 506
    for (OutArcIt a(G, n); a != INVALID; ++a) {
341 507
      check(G.source(a) == n &&
342 508
            G.id(G.target(a)) == (G.id(n) ^ (1 << G.dimension(a))),
343 509
            "Wrong arc or wrong dimension");
344 510
    }
345 511

	
346 512
    checkGraphInArcList(G, n, dim);
347 513
    for (InArcIt a(G, n); a != INVALID; ++a) {
348 514
      check(G.target(a) == n &&
349 515
            G.id(G.source(a)) == (G.id(n) ^ (1 << G.dimension(a))),
350 516
            "Wrong arc or wrong dimension");
351 517
    }
352 518
  }
353 519

	
354 520
  checkGraphConArcList(G, (1 << dim) * dim);
355 521
  checkGraphConEdgeList(G, dim * (1 << (dim-1)));
356 522

	
357 523
  checkArcDirections(G);
358 524

	
359 525
  checkNodeIds(G);
360 526
  checkArcIds(G);
361 527
  checkEdgeIds(G);
362 528
  checkGraphNodeMap(G);
363 529
  checkGraphArcMap(G);
364 530
  checkGraphEdgeMap(G);
365 531
}
366 532

	
367 533
void checkGraphs() {
368 534
  { // Checking ListGraph
369
    checkGraph<ListGraph>();
535
    checkGraphBuild<ListGraph>();
536
    checkGraphAlter<ListGraph>();
537
    checkGraphErase<ListGraph>();
538
    checkGraphSnapshot<ListGraph>();
370 539
    checkGraphValidityErase<ListGraph>();
371 540
  }
372 541
  { // Checking SmartGraph
373
    checkGraph<SmartGraph>();
542
    checkGraphBuild<SmartGraph>();
543
    checkGraphSnapshot<SmartGraph>();
374 544
    checkGraphValidity<SmartGraph>();
375 545
  }
376 546
  { // Checking FullGraph
377 547
    checkFullGraph(7);
378 548
    checkFullGraph(8);
379 549
  }
380 550
  { // Checking GridGraph
381 551
    checkGridGraph(5, 8);
382 552
    checkGridGraph(8, 5);
383 553
    checkGridGraph(5, 5);
384 554
    checkGridGraph(0, 0);
385 555
    checkGridGraph(1, 1);
386 556
  }
387 557
  { // Checking HypercubeGraph
388 558
    checkHypercubeGraph(1);
389 559
    checkHypercubeGraph(2);
390 560
    checkHypercubeGraph(3);
391 561
    checkHypercubeGraph(4);
392 562
  }
393 563
}
394 564

	
395 565
int main() {
396 566
  checkConcepts();
397 567
  checkGraphs();
398 568
  return 0;
399 569
}
Ignore white space 6 line context
... ...
@@ -72,96 +72,105 @@
72 72
  }
73 73

	
74 74
  template<class Graph>
75 75
  void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt)
76 76
  {
77 77
    typename Graph::InArcIt e(G,n);
78 78
    for(int i=0;i<cnt;i++) {
79 79
      check(e!=INVALID,"Wrong InArc list linking.");
80 80
      check(n==G.target(e),"Wrong InArc list linking.");
81 81
      check(n==G.baseNode(e),"Wrong OutArc list linking.");
82 82
      check(G.source(e)==G.runningNode(e),"Wrong OutArc list linking.");
83 83
      ++e;
84 84
    }
85 85
    check(e==INVALID,"Wrong InArc list linking.");
86 86
    check(countInArcs(G,n)==cnt,"Wrong InArc number.");
87 87
  }
88 88

	
89 89
  template<class Graph>
90 90
  void checkGraphEdgeList(const Graph &G, int cnt)
91 91
  {
92 92
    typename Graph::EdgeIt e(G);
93 93
    for(int i=0;i<cnt;i++) {
94 94
      check(e!=INVALID,"Wrong Edge list linking.");
95 95
      check(G.oppositeNode(G.u(e), e) == G.v(e), "Wrong opposite node");
96 96
      check(G.oppositeNode(G.v(e), e) == G.u(e), "Wrong opposite node");
97 97
      ++e;
98 98
    }
99 99
    check(e==INVALID,"Wrong Edge list linking.");
100 100
    check(countEdges(G)==cnt,"Wrong Edge number.");
101 101
  }
102 102

	
103 103
  template<class Graph>
104 104
  void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt)
105 105
  {
106 106
    typename Graph::IncEdgeIt e(G,n);
107 107
    for(int i=0;i<cnt;i++) {
108 108
      check(e!=INVALID,"Wrong IncEdge list linking.");
109 109
      check(n==G.u(e) || n==G.v(e),"Wrong IncEdge list linking.");
110 110
      check(n==G.baseNode(e),"Wrong OutArc list linking.");
111 111
      check(G.u(e)==G.runningNode(e) || G.v(e)==G.runningNode(e),
112 112
            "Wrong OutArc list linking.");
113 113
      ++e;
114 114
    }
115 115
    check(e==INVALID,"Wrong IncEdge list linking.");
116 116
    check(countIncEdges(G,n)==cnt,"Wrong IncEdge number.");
117 117
  }
118 118

	
119 119
  template <class Graph>
120
  void checkGraphIncEdgeArcLists(const Graph &G, typename Graph::Node n,
121
                                 int cnt)
122
  {
123
    checkGraphIncEdgeList(G, n, cnt);
124
    checkGraphOutArcList(G, n, cnt);
125
    checkGraphInArcList(G, n, cnt);
126
  }
127

	
128
  template <class Graph>
120 129
  void checkGraphConArcList(const Graph &G, int cnt) {
121 130
    int i = 0;
122 131
    for (typename Graph::NodeIt u(G); u != INVALID; ++u) {
123 132
      for (typename Graph::NodeIt v(G); v != INVALID; ++v) {
124 133
        for (ConArcIt<Graph> a(G, u, v); a != INVALID; ++a) {
125 134
          check(G.source(a) == u, "Wrong iterator.");
126 135
          check(G.target(a) == v, "Wrong iterator.");
127 136
          ++i;
128 137
        }
129 138
      }
130 139
    }
131 140
    check(cnt == i, "Wrong iterator.");
132 141
  }
133 142

	
134 143
  template <class Graph>
135 144
  void checkGraphConEdgeList(const Graph &G, int cnt) {
136 145
    int i = 0;
137 146
    for (typename Graph::NodeIt u(G); u != INVALID; ++u) {
138 147
      for (typename Graph::NodeIt v(G); v != INVALID; ++v) {
139 148
        for (ConEdgeIt<Graph> e(G, u, v); e != INVALID; ++e) {
140 149
          check((G.u(e) == u && G.v(e) == v) ||
141 150
                (G.u(e) == v && G.v(e) == u), "Wrong iterator.");
142 151
          i += u == v ? 2 : 1;
143 152
        }
144 153
      }
145 154
    }
146 155
    check(2 * cnt == i, "Wrong iterator.");
147 156
  }
148 157

	
149 158
  template <typename Graph>
150 159
  void checkArcDirections(const Graph& G) {
151 160
    for (typename Graph::ArcIt a(G); a != INVALID; ++a) {
152 161
      check(G.source(a) == G.target(G.oppositeArc(a)), "Wrong direction");
153 162
      check(G.target(a) == G.source(G.oppositeArc(a)), "Wrong direction");
154 163
      check(G.direct(a, G.direction(a)) == a, "Wrong direction");
155 164
    }
156 165
  }
157 166

	
158 167
  template <typename Graph>
159 168
  void checkNodeIds(const Graph& G) {
160 169
    std::set<int> values;
161 170
    for (typename Graph::NodeIt n(G); n != INVALID; ++n) {
162 171
      check(G.nodeFromId(G.id(n)) == n, "Wrong id");
163 172
      check(values.find(G.id(n)) == values.end(), "Wrong id");
164 173
      check(G.id(n) <= G.maxNodeId(), "Wrong maximum id");
165 174
      values.insert(G.id(n));
166 175
    }
167 176
  }
0 comments (0 inline)