test/graph_test.cc
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 1047 ddd3c0d3d9bf
parent 787 819ca5b50de0
child 1159 7fdaa05a69a1
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
alpar@209
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
deba@57
     2
 *
alpar@209
     3
 * This file is a part of LEMON, a generic C++ optimization library.
deba@57
     4
 *
alpar@956
     5
 * Copyright (C) 2003-2010
deba@57
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@57
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@57
     8
 *
deba@57
     9
 * Permission to use, modify and distribute this software is granted
deba@57
    10
 * provided that this copyright notice appears in all copies. For
deba@57
    11
 * precise terms see the accompanying LICENSE file.
deba@57
    12
 *
deba@57
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@57
    14
 * express or implied, and with no claim as to its suitability for any
deba@57
    15
 * purpose.
deba@57
    16
 *
deba@57
    17
 */
deba@57
    18
deba@57
    19
#include <lemon/concepts/graph.h>
deba@57
    20
#include <lemon/list_graph.h>
deba@109
    21
#include <lemon/smart_graph.h>
deba@365
    22
#include <lemon/full_graph.h>
kpeter@346
    23
#include <lemon/grid_graph.h>
kpeter@377
    24
#include <lemon/hypercube_graph.h>
deba@57
    25
deba@57
    26
#include "test_tools.h"
kpeter@171
    27
#include "graph_test.h"
deba@57
    28
deba@57
    29
using namespace lemon;
deba@57
    30
using namespace lemon::concepts;
deba@57
    31
deba@228
    32
template <class Graph>
kpeter@387
    33
void checkGraphBuild() {
deba@228
    34
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
deba@228
    35
deba@228
    36
  Graph G;
deba@228
    37
  checkGraphNodeList(G, 0);
deba@228
    38
  checkGraphEdgeList(G, 0);
kpeter@387
    39
  checkGraphArcList(G, 0);
deba@228
    40
kpeter@783
    41
  G.reserveNode(3);
kpeter@783
    42
  G.reserveEdge(3);
kpeter@783
    43
deba@228
    44
  Node
deba@228
    45
    n1 = G.addNode(),
deba@228
    46
    n2 = G.addNode(),
deba@228
    47
    n3 = G.addNode();
deba@228
    48
  checkGraphNodeList(G, 3);
deba@228
    49
  checkGraphEdgeList(G, 0);
kpeter@387
    50
  checkGraphArcList(G, 0);
deba@228
    51
deba@228
    52
  Edge e1 = G.addEdge(n1, n2);
deba@228
    53
  check((G.u(e1) == n1 && G.v(e1) == n2) || (G.u(e1) == n2 && G.v(e1) == n1),
deba@228
    54
        "Wrong edge");
kpeter@387
    55
deba@228
    56
  checkGraphNodeList(G, 3);
kpeter@387
    57
  checkGraphEdgeList(G, 1);
deba@228
    58
  checkGraphArcList(G, 2);
deba@228
    59
kpeter@387
    60
  checkGraphIncEdgeArcLists(G, n1, 1);
kpeter@387
    61
  checkGraphIncEdgeArcLists(G, n2, 1);
kpeter@387
    62
  checkGraphIncEdgeArcLists(G, n3, 0);
deba@228
    63
kpeter@387
    64
  checkGraphConEdgeList(G, 1);
kpeter@387
    65
  checkGraphConArcList(G, 2);
deba@228
    66
kpeter@387
    67
  Edge e2 = G.addEdge(n2, n1),
kpeter@387
    68
       e3 = G.addEdge(n2, n3);
deba@228
    69
kpeter@387
    70
  checkGraphNodeList(G, 3);
kpeter@387
    71
  checkGraphEdgeList(G, 3);
kpeter@387
    72
  checkGraphArcList(G, 6);
deba@228
    73
kpeter@387
    74
  checkGraphIncEdgeArcLists(G, n1, 2);
kpeter@387
    75
  checkGraphIncEdgeArcLists(G, n2, 3);
kpeter@387
    76
  checkGraphIncEdgeArcLists(G, n3, 1);
deba@228
    77
kpeter@387
    78
  checkGraphConEdgeList(G, 3);
deba@228
    79
  checkGraphConArcList(G, 6);
deba@228
    80
deba@228
    81
  checkArcDirections(G);
deba@228
    82
deba@228
    83
  checkNodeIds(G);
deba@228
    84
  checkArcIds(G);
deba@228
    85
  checkEdgeIds(G);
deba@228
    86
  checkGraphNodeMap(G);
deba@228
    87
  checkGraphArcMap(G);
deba@228
    88
  checkGraphEdgeMap(G);
deba@228
    89
}
deba@228
    90
kpeter@387
    91
template <class Graph>
kpeter@387
    92
void checkGraphAlter() {
kpeter@387
    93
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
kpeter@387
    94
kpeter@387
    95
  Graph G;
kpeter@387
    96
  Node n1 = G.addNode(), n2 = G.addNode(),
kpeter@387
    97
       n3 = G.addNode(), n4 = G.addNode();
kpeter@387
    98
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
kpeter@387
    99
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
kpeter@387
   100
       e5 = G.addEdge(n4, n3);
kpeter@387
   101
kpeter@387
   102
  checkGraphNodeList(G, 4);
kpeter@387
   103
  checkGraphEdgeList(G, 5);
kpeter@387
   104
  checkGraphArcList(G, 10);
kpeter@387
   105
kpeter@387
   106
  // Check changeU() and changeV()
kpeter@387
   107
  if (G.u(e2) == n2) {
kpeter@387
   108
    G.changeU(e2, n3);
kpeter@387
   109
  } else {
kpeter@387
   110
    G.changeV(e2, n3);
kpeter@387
   111
  }
kpeter@387
   112
kpeter@387
   113
  checkGraphNodeList(G, 4);
kpeter@387
   114
  checkGraphEdgeList(G, 5);
kpeter@387
   115
  checkGraphArcList(G, 10);
kpeter@387
   116
kpeter@387
   117
  checkGraphIncEdgeArcLists(G, n1, 3);
kpeter@387
   118
  checkGraphIncEdgeArcLists(G, n2, 2);
kpeter@387
   119
  checkGraphIncEdgeArcLists(G, n3, 3);
kpeter@387
   120
  checkGraphIncEdgeArcLists(G, n4, 2);
kpeter@387
   121
kpeter@387
   122
  checkGraphConEdgeList(G, 5);
kpeter@387
   123
  checkGraphConArcList(G, 10);
kpeter@387
   124
kpeter@387
   125
  if (G.u(e2) == n1) {
kpeter@387
   126
    G.changeU(e2, n2);
kpeter@387
   127
  } else {
kpeter@387
   128
    G.changeV(e2, n2);
kpeter@387
   129
  }
kpeter@387
   130
kpeter@387
   131
  checkGraphNodeList(G, 4);
kpeter@387
   132
  checkGraphEdgeList(G, 5);
kpeter@387
   133
  checkGraphArcList(G, 10);
kpeter@387
   134
kpeter@387
   135
  checkGraphIncEdgeArcLists(G, n1, 2);
kpeter@387
   136
  checkGraphIncEdgeArcLists(G, n2, 3);
kpeter@387
   137
  checkGraphIncEdgeArcLists(G, n3, 3);
kpeter@387
   138
  checkGraphIncEdgeArcLists(G, n4, 2);
kpeter@387
   139
kpeter@387
   140
  checkGraphConEdgeList(G, 5);
kpeter@387
   141
  checkGraphConArcList(G, 10);
kpeter@387
   142
kpeter@387
   143
  // Check contract()
kpeter@387
   144
  G.contract(n1, n4, false);
kpeter@387
   145
kpeter@387
   146
  checkGraphNodeList(G, 3);
kpeter@387
   147
  checkGraphEdgeList(G, 5);
kpeter@387
   148
  checkGraphArcList(G, 10);
kpeter@387
   149
kpeter@387
   150
  checkGraphIncEdgeArcLists(G, n1, 4);
kpeter@387
   151
  checkGraphIncEdgeArcLists(G, n2, 3);
kpeter@387
   152
  checkGraphIncEdgeArcLists(G, n3, 3);
kpeter@387
   153
kpeter@387
   154
  checkGraphConEdgeList(G, 5);
kpeter@387
   155
  checkGraphConArcList(G, 10);
kpeter@387
   156
kpeter@387
   157
  G.contract(n2, n3);
kpeter@387
   158
kpeter@387
   159
  checkGraphNodeList(G, 2);
kpeter@387
   160
  checkGraphEdgeList(G, 3);
kpeter@387
   161
  checkGraphArcList(G, 6);
kpeter@387
   162
kpeter@387
   163
  checkGraphIncEdgeArcLists(G, n1, 4);
kpeter@387
   164
  checkGraphIncEdgeArcLists(G, n2, 2);
kpeter@387
   165
kpeter@387
   166
  checkGraphConEdgeList(G, 3);
kpeter@387
   167
  checkGraphConArcList(G, 6);
kpeter@387
   168
}
kpeter@387
   169
kpeter@387
   170
template <class Graph>
kpeter@387
   171
void checkGraphErase() {
kpeter@387
   172
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
kpeter@387
   173
kpeter@387
   174
  Graph G;
kpeter@387
   175
  Node n1 = G.addNode(), n2 = G.addNode(),
kpeter@387
   176
       n3 = G.addNode(), n4 = G.addNode();
kpeter@387
   177
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
kpeter@387
   178
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
kpeter@387
   179
       e5 = G.addEdge(n4, n3);
kpeter@387
   180
kpeter@387
   181
  // Check edge deletion
kpeter@387
   182
  G.erase(e2);
kpeter@387
   183
kpeter@387
   184
  checkGraphNodeList(G, 4);
kpeter@387
   185
  checkGraphEdgeList(G, 4);
kpeter@387
   186
  checkGraphArcList(G, 8);
kpeter@387
   187
kpeter@387
   188
  checkGraphIncEdgeArcLists(G, n1, 2);
kpeter@387
   189
  checkGraphIncEdgeArcLists(G, n2, 2);
kpeter@387
   190
  checkGraphIncEdgeArcLists(G, n3, 2);
kpeter@387
   191
  checkGraphIncEdgeArcLists(G, n4, 2);
kpeter@387
   192
kpeter@387
   193
  checkGraphConEdgeList(G, 4);
kpeter@387
   194
  checkGraphConArcList(G, 8);
kpeter@387
   195
kpeter@387
   196
  // Check node deletion
kpeter@387
   197
  G.erase(n3);
kpeter@387
   198
kpeter@387
   199
  checkGraphNodeList(G, 3);
kpeter@387
   200
  checkGraphEdgeList(G, 2);
kpeter@387
   201
  checkGraphArcList(G, 4);
kpeter@387
   202
kpeter@387
   203
  checkGraphIncEdgeArcLists(G, n1, 2);
kpeter@387
   204
  checkGraphIncEdgeArcLists(G, n2, 1);
kpeter@387
   205
  checkGraphIncEdgeArcLists(G, n4, 1);
kpeter@387
   206
kpeter@387
   207
  checkGraphConEdgeList(G, 2);
kpeter@387
   208
  checkGraphConArcList(G, 4);
kpeter@387
   209
}
kpeter@387
   210
kpeter@387
   211
kpeter@387
   212
template <class Graph>
kpeter@387
   213
void checkGraphSnapshot() {
kpeter@387
   214
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
kpeter@387
   215
kpeter@387
   216
  Graph G;
kpeter@387
   217
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
kpeter@387
   218
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
kpeter@387
   219
       e3 = G.addEdge(n2, n3);
kpeter@387
   220
kpeter@387
   221
  checkGraphNodeList(G, 3);
kpeter@387
   222
  checkGraphEdgeList(G, 3);
kpeter@387
   223
  checkGraphArcList(G, 6);
kpeter@387
   224
kpeter@387
   225
  typename Graph::Snapshot snapshot(G);
kpeter@387
   226
kpeter@387
   227
  Node n = G.addNode();
kpeter@387
   228
  G.addEdge(n3, n);
kpeter@387
   229
  G.addEdge(n, n3);
kpeter@387
   230
  G.addEdge(n3, n2);
kpeter@387
   231
kpeter@387
   232
  checkGraphNodeList(G, 4);
kpeter@387
   233
  checkGraphEdgeList(G, 6);
kpeter@387
   234
  checkGraphArcList(G, 12);
kpeter@387
   235
kpeter@387
   236
  snapshot.restore();
kpeter@387
   237
kpeter@387
   238
  checkGraphNodeList(G, 3);
kpeter@387
   239
  checkGraphEdgeList(G, 3);
kpeter@387
   240
  checkGraphArcList(G, 6);
kpeter@387
   241
kpeter@387
   242
  checkGraphIncEdgeArcLists(G, n1, 2);
kpeter@387
   243
  checkGraphIncEdgeArcLists(G, n2, 3);
kpeter@387
   244
  checkGraphIncEdgeArcLists(G, n3, 1);
kpeter@387
   245
kpeter@387
   246
  checkGraphConEdgeList(G, 3);
kpeter@387
   247
  checkGraphConArcList(G, 6);
kpeter@387
   248
kpeter@387
   249
  checkNodeIds(G);
kpeter@387
   250
  checkEdgeIds(G);
kpeter@387
   251
  checkArcIds(G);
kpeter@387
   252
  checkGraphNodeMap(G);
kpeter@387
   253
  checkGraphEdgeMap(G);
kpeter@387
   254
  checkGraphArcMap(G);
kpeter@387
   255
kpeter@387
   256
  G.addNode();
kpeter@387
   257
  snapshot.save(G);
kpeter@387
   258
kpeter@387
   259
  G.addEdge(G.addNode(), G.addNode());
kpeter@387
   260
kpeter@387
   261
  snapshot.restore();
kpeter@787
   262
  snapshot.save(G);
kpeter@787
   263
kpeter@787
   264
  checkGraphNodeList(G, 4);
kpeter@787
   265
  checkGraphEdgeList(G, 3);
kpeter@787
   266
  checkGraphArcList(G, 6);
alpar@956
   267
kpeter@787
   268
  G.addEdge(G.addNode(), G.addNode());
kpeter@787
   269
kpeter@787
   270
  snapshot.restore();
kpeter@387
   271
kpeter@387
   272
  checkGraphNodeList(G, 4);
kpeter@387
   273
  checkGraphEdgeList(G, 3);
kpeter@387
   274
  checkGraphArcList(G, 6);
kpeter@387
   275
}
kpeter@387
   276
deba@365
   277
void checkFullGraph(int num) {
deba@365
   278
  typedef FullGraph Graph;
deba@365
   279
  GRAPH_TYPEDEFS(Graph);
deba@365
   280
deba@365
   281
  Graph G(num);
kpeter@784
   282
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
kpeter@784
   283
        "Wrong size");
kpeter@784
   284
kpeter@784
   285
  G.resize(num);
kpeter@784
   286
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
kpeter@784
   287
        "Wrong size");
kpeter@784
   288
deba@365
   289
  checkGraphNodeList(G, num);
deba@365
   290
  checkGraphEdgeList(G, num * (num - 1) / 2);
deba@365
   291
deba@365
   292
  for (NodeIt n(G); n != INVALID; ++n) {
kpeter@377
   293
    checkGraphOutArcList(G, n, num - 1);
kpeter@377
   294
    checkGraphInArcList(G, n, num - 1);
kpeter@377
   295
    checkGraphIncEdgeList(G, n, num - 1);
deba@365
   296
  }
deba@365
   297
deba@365
   298
  checkGraphConArcList(G, num * (num - 1));
deba@365
   299
  checkGraphConEdgeList(G, num * (num - 1) / 2);
deba@365
   300
deba@365
   301
  checkArcDirections(G);
deba@365
   302
deba@365
   303
  checkNodeIds(G);
deba@365
   304
  checkArcIds(G);
deba@365
   305
  checkEdgeIds(G);
deba@365
   306
  checkGraphNodeMap(G);
deba@365
   307
  checkGraphArcMap(G);
deba@365
   308
  checkGraphEdgeMap(G);
deba@365
   309
kpeter@377
   310
deba@365
   311
  for (int i = 0; i < G.nodeNum(); ++i) {
deba@365
   312
    check(G.index(G(i)) == i, "Wrong index");
deba@365
   313
  }
deba@365
   314
deba@365
   315
  for (NodeIt u(G); u != INVALID; ++u) {
deba@365
   316
    for (NodeIt v(G); v != INVALID; ++v) {
deba@365
   317
      Edge e = G.edge(u, v);
deba@365
   318
      Arc a = G.arc(u, v);
deba@365
   319
      if (u == v) {
deba@365
   320
        check(e == INVALID, "Wrong edge lookup");
deba@365
   321
        check(a == INVALID, "Wrong arc lookup");
deba@365
   322
      } else {
deba@365
   323
        check((G.u(e) == u && G.v(e) == v) ||
deba@365
   324
              (G.u(e) == v && G.v(e) == u), "Wrong edge lookup");
deba@365
   325
        check(G.source(a) == u && G.target(a) == v, "Wrong arc lookup");
deba@365
   326
      }
deba@365
   327
    }
deba@365
   328
  }
deba@365
   329
}
deba@365
   330
deba@228
   331
void checkConcepts() {
kpeter@171
   332
  { // Checking graph components
deba@57
   333
    checkConcept<BaseGraphComponent, BaseGraphComponent >();
deba@57
   334
alpar@209
   335
    checkConcept<IDableGraphComponent<>,
deba@57
   336
      IDableGraphComponent<> >();
deba@57
   337
alpar@209
   338
    checkConcept<IterableGraphComponent<>,
deba@57
   339
      IterableGraphComponent<> >();
deba@57
   340
alpar@209
   341
    checkConcept<MappableGraphComponent<>,
deba@57
   342
      MappableGraphComponent<> >();
deba@57
   343
  }
kpeter@171
   344
  { // Checking skeleton graph
kpeter@171
   345
    checkConcept<Graph, Graph>();
deba@57
   346
  }
kpeter@171
   347
  { // Checking ListGraph
kpeter@171
   348
    checkConcept<Graph, ListGraph>();
kpeter@171
   349
    checkConcept<AlterableGraphComponent<>, ListGraph>();
kpeter@171
   350
    checkConcept<ExtendableGraphComponent<>, ListGraph>();
kpeter@171
   351
    checkConcept<ClearableGraphComponent<>, ListGraph>();
kpeter@171
   352
    checkConcept<ErasableGraphComponent<>, ListGraph>();
kpeter@171
   353
  }
kpeter@171
   354
  { // Checking SmartGraph
kpeter@171
   355
    checkConcept<Graph, SmartGraph>();
kpeter@171
   356
    checkConcept<AlterableGraphComponent<>, SmartGraph>();
kpeter@171
   357
    checkConcept<ExtendableGraphComponent<>, SmartGraph>();
kpeter@171
   358
    checkConcept<ClearableGraphComponent<>, SmartGraph>();
kpeter@171
   359
  }
deba@365
   360
  { // Checking FullGraph
deba@365
   361
    checkConcept<Graph, FullGraph>();
deba@365
   362
  }
kpeter@346
   363
  { // Checking GridGraph
kpeter@346
   364
    checkConcept<Graph, GridGraph>();
kpeter@346
   365
  }
kpeter@377
   366
  { // Checking HypercubeGraph
kpeter@377
   367
    checkConcept<Graph, HypercubeGraph>();
kpeter@377
   368
  }
deba@57
   369
}
deba@57
   370
deba@57
   371
template <typename Graph>
deba@228
   372
void checkGraphValidity() {
deba@149
   373
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
deba@57
   374
  Graph g;
deba@57
   375
deba@57
   376
  Node
deba@57
   377
    n1 = g.addNode(),
deba@57
   378
    n2 = g.addNode(),
deba@57
   379
    n3 = g.addNode();
deba@57
   380
deba@57
   381
  Edge
deba@57
   382
    e1 = g.addEdge(n1, n2),
deba@57
   383
    e2 = g.addEdge(n2, n3);
deba@57
   384
kpeter@171
   385
  check(g.valid(n1), "Wrong validity check");
kpeter@171
   386
  check(g.valid(e1), "Wrong validity check");
kpeter@171
   387
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
kpeter@171
   388
kpeter@171
   389
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
kpeter@171
   390
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
kpeter@171
   391
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
deba@57
   392
}
deba@57
   393
deba@149
   394
template <typename Graph>
deba@228
   395
void checkGraphValidityErase() {
deba@149
   396
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
deba@149
   397
  Graph g;
deba@149
   398
deba@149
   399
  Node
deba@149
   400
    n1 = g.addNode(),
deba@149
   401
    n2 = g.addNode(),
deba@149
   402
    n3 = g.addNode();
deba@149
   403
deba@149
   404
  Edge
deba@149
   405
    e1 = g.addEdge(n1, n2),
deba@149
   406
    e2 = g.addEdge(n2, n3);
deba@149
   407
kpeter@171
   408
  check(g.valid(n1), "Wrong validity check");
kpeter@171
   409
  check(g.valid(e1), "Wrong validity check");
kpeter@171
   410
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
deba@149
   411
deba@149
   412
  g.erase(n1);
deba@149
   413
kpeter@171
   414
  check(!g.valid(n1), "Wrong validity check");
kpeter@171
   415
  check(g.valid(n2), "Wrong validity check");
kpeter@171
   416
  check(g.valid(n3), "Wrong validity check");
kpeter@171
   417
  check(!g.valid(e1), "Wrong validity check");
kpeter@171
   418
  check(g.valid(e2), "Wrong validity check");
deba@149
   419
kpeter@171
   420
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
kpeter@171
   421
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
kpeter@171
   422
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
deba@149
   423
}
deba@149
   424
deba@347
   425
void checkGridGraph(int width, int height) {
deba@347
   426
  typedef GridGraph Graph;
deba@347
   427
  GRAPH_TYPEDEFS(Graph);
deba@347
   428
  Graph G(width, height);
deba@57
   429
kpeter@348
   430
  check(G.width() == width, "Wrong column number");
kpeter@348
   431
  check(G.height() == height, "Wrong row number");
alpar@209
   432
kpeter@784
   433
  G.resize(width, height);
kpeter@784
   434
  check(G.width() == width, "Wrong column number");
kpeter@784
   435
  check(G.height() == height, "Wrong row number");
kpeter@784
   436
deba@347
   437
  for (int i = 0; i < width; ++i) {
deba@347
   438
    for (int j = 0; j < height; ++j) {
deba@347
   439
      check(G.col(G(i, j)) == i, "Wrong column");
deba@347
   440
      check(G.row(G(i, j)) == j, "Wrong row");
deba@347
   441
      check(G.pos(G(i, j)).x == i, "Wrong column");
deba@347
   442
      check(G.pos(G(i, j)).y == j, "Wrong row");
kpeter@346
   443
    }
kpeter@346
   444
  }
deba@57
   445
deba@347
   446
  for (int j = 0; j < height; ++j) {
deba@347
   447
    for (int i = 0; i < width - 1; ++i) {
deba@347
   448
      check(G.source(G.right(G(i, j))) == G(i, j), "Wrong right");
deba@347
   449
      check(G.target(G.right(G(i, j))) == G(i + 1, j), "Wrong right");
kpeter@346
   450
    }
deba@347
   451
    check(G.right(G(width - 1, j)) == INVALID, "Wrong right");
kpeter@346
   452
  }
deba@57
   453
deba@347
   454
  for (int j = 0; j < height; ++j) {
deba@347
   455
    for (int i = 1; i < width; ++i) {
deba@347
   456
      check(G.source(G.left(G(i, j))) == G(i, j), "Wrong left");
deba@347
   457
      check(G.target(G.left(G(i, j))) == G(i - 1, j), "Wrong left");
kpeter@346
   458
    }
deba@347
   459
    check(G.left(G(0, j)) == INVALID, "Wrong left");
kpeter@346
   460
  }
deba@57
   461
deba@347
   462
  for (int i = 0; i < width; ++i) {
deba@347
   463
    for (int j = 0; j < height - 1; ++j) {
deba@347
   464
      check(G.source(G.up(G(i, j))) == G(i, j), "Wrong up");
deba@347
   465
      check(G.target(G.up(G(i, j))) == G(i, j + 1), "Wrong up");
kpeter@346
   466
    }
deba@347
   467
    check(G.up(G(i, height - 1)) == INVALID, "Wrong up");
kpeter@346
   468
  }
deba@228
   469
deba@347
   470
  for (int i = 0; i < width; ++i) {
deba@347
   471
    for (int j = 1; j < height; ++j) {
deba@347
   472
      check(G.source(G.down(G(i, j))) == G(i, j), "Wrong down");
deba@347
   473
      check(G.target(G.down(G(i, j))) == G(i, j - 1), "Wrong down");
kpeter@346
   474
    }
deba@347
   475
    check(G.down(G(i, 0)) == INVALID, "Wrong down");
kpeter@346
   476
  }
kpeter@346
   477
deba@347
   478
  checkGraphNodeList(G, width * height);
deba@347
   479
  checkGraphEdgeList(G, width * (height - 1) + (width - 1) * height);
deba@347
   480
  checkGraphArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
kpeter@346
   481
deba@347
   482
  for (NodeIt n(G); n != INVALID; ++n) {
deba@347
   483
    int nb = 4;
deba@347
   484
    if (G.col(n) == 0) --nb;
deba@347
   485
    if (G.col(n) == width - 1) --nb;
deba@347
   486
    if (G.row(n) == 0) --nb;
deba@347
   487
    if (G.row(n) == height - 1) --nb;
kpeter@346
   488
deba@347
   489
    checkGraphOutArcList(G, n, nb);
deba@347
   490
    checkGraphInArcList(G, n, nb);
deba@347
   491
    checkGraphIncEdgeList(G, n, nb);
deba@347
   492
  }
kpeter@346
   493
deba@347
   494
  checkArcDirections(G);
kpeter@346
   495
deba@347
   496
  checkGraphConArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
deba@347
   497
  checkGraphConEdgeList(G, width * (height - 1) + (width - 1) * height);
kpeter@346
   498
deba@347
   499
  checkNodeIds(G);
deba@347
   500
  checkArcIds(G);
deba@347
   501
  checkEdgeIds(G);
deba@347
   502
  checkGraphNodeMap(G);
deba@347
   503
  checkGraphArcMap(G);
deba@347
   504
  checkGraphEdgeMap(G);
kpeter@346
   505
kpeter@346
   506
}
deba@228
   507
kpeter@377
   508
void checkHypercubeGraph(int dim) {
kpeter@377
   509
  GRAPH_TYPEDEFS(HypercubeGraph);
kpeter@377
   510
kpeter@377
   511
  HypercubeGraph G(dim);
kpeter@784
   512
  check(G.dimension() == dim, "Wrong dimension");
kpeter@784
   513
kpeter@784
   514
  G.resize(dim);
kpeter@784
   515
  check(G.dimension() == dim, "Wrong dimension");
alpar@956
   516
kpeter@377
   517
  checkGraphNodeList(G, 1 << dim);
alpar@385
   518
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
kpeter@377
   519
  checkGraphArcList(G, dim * (1 << dim));
kpeter@377
   520
kpeter@377
   521
  Node n = G.nodeFromId(dim);
kpeter@377
   522
kpeter@377
   523
  for (NodeIt n(G); n != INVALID; ++n) {
kpeter@377
   524
    checkGraphIncEdgeList(G, n, dim);
kpeter@377
   525
    for (IncEdgeIt e(G, n); e != INVALID; ++e) {
kpeter@377
   526
      check( (G.u(e) == n &&
alpar@385
   527
              G.id(G.v(e)) == (G.id(n) ^ (1 << G.dimension(e)))) ||
kpeter@377
   528
             (G.v(e) == n &&
alpar@385
   529
              G.id(G.u(e)) == (G.id(n) ^ (1 << G.dimension(e)))),
kpeter@377
   530
             "Wrong edge or wrong dimension");
kpeter@377
   531
    }
kpeter@377
   532
kpeter@377
   533
    checkGraphOutArcList(G, n, dim);
kpeter@377
   534
    for (OutArcIt a(G, n); a != INVALID; ++a) {
kpeter@377
   535
      check(G.source(a) == n &&
alpar@385
   536
            G.id(G.target(a)) == (G.id(n) ^ (1 << G.dimension(a))),
kpeter@377
   537
            "Wrong arc or wrong dimension");
kpeter@377
   538
    }
kpeter@377
   539
kpeter@377
   540
    checkGraphInArcList(G, n, dim);
kpeter@377
   541
    for (InArcIt a(G, n); a != INVALID; ++a) {
kpeter@377
   542
      check(G.target(a) == n &&
alpar@385
   543
            G.id(G.source(a)) == (G.id(n) ^ (1 << G.dimension(a))),
kpeter@377
   544
            "Wrong arc or wrong dimension");
kpeter@377
   545
    }
kpeter@377
   546
  }
kpeter@377
   547
kpeter@377
   548
  checkGraphConArcList(G, (1 << dim) * dim);
alpar@385
   549
  checkGraphConEdgeList(G, dim * (1 << (dim-1)));
kpeter@377
   550
kpeter@377
   551
  checkArcDirections(G);
kpeter@377
   552
kpeter@377
   553
  checkNodeIds(G);
kpeter@377
   554
  checkArcIds(G);
kpeter@377
   555
  checkEdgeIds(G);
kpeter@377
   556
  checkGraphNodeMap(G);
kpeter@377
   557
  checkGraphArcMap(G);
kpeter@377
   558
  checkGraphEdgeMap(G);
kpeter@377
   559
}
deba@57
   560
deba@228
   561
void checkGraphs() {
kpeter@171
   562
  { // Checking ListGraph
kpeter@387
   563
    checkGraphBuild<ListGraph>();
kpeter@387
   564
    checkGraphAlter<ListGraph>();
kpeter@387
   565
    checkGraphErase<ListGraph>();
kpeter@387
   566
    checkGraphSnapshot<ListGraph>();
deba@228
   567
    checkGraphValidityErase<ListGraph>();
kpeter@171
   568
  }
kpeter@171
   569
  { // Checking SmartGraph
kpeter@387
   570
    checkGraphBuild<SmartGraph>();
kpeter@387
   571
    checkGraphSnapshot<SmartGraph>();
deba@228
   572
    checkGraphValidity<SmartGraph>();
kpeter@171
   573
  }
kpeter@377
   574
  { // Checking FullGraph
deba@365
   575
    checkFullGraph(7);
deba@365
   576
    checkFullGraph(8);
deba@365
   577
  }
kpeter@346
   578
  { // Checking GridGraph
deba@347
   579
    checkGridGraph(5, 8);
deba@347
   580
    checkGridGraph(8, 5);
deba@347
   581
    checkGridGraph(5, 5);
deba@347
   582
    checkGridGraph(0, 0);
deba@347
   583
    checkGridGraph(1, 1);
kpeter@346
   584
  }
kpeter@377
   585
  { // Checking HypercubeGraph
kpeter@377
   586
    checkHypercubeGraph(1);
kpeter@377
   587
    checkHypercubeGraph(2);
kpeter@377
   588
    checkHypercubeGraph(3);
kpeter@377
   589
    checkHypercubeGraph(4);
kpeter@377
   590
  }
kpeter@171
   591
}
kpeter@171
   592
deba@57
   593
int main() {
deba@228
   594
  checkConcepts();
deba@228
   595
  checkGraphs();
deba@57
   596
  return 0;
deba@57
   597
}