test/digraph_test.cc
author Peter Kovacs <kpeter@inf.elte.hu>
Wed, 05 Nov 2008 21:36:28 +0100
changeset 364 b4a01426c0d9
parent 354 80a4d0742e98
child 365 a12eef1f82b2
permissions -rw-r--r--
Port hypercube digraph structure from SVN 3503 (#57)
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@107
     5
 * Copyright (C) 2003-2008
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/digraph.h>
deba@57
    20
#include <lemon/list_graph.h>
kpeter@171
    21
#include <lemon/smart_graph.h>
deba@353
    22
#include <lemon/full_graph.h>
kpeter@364
    23
#include <lemon/hypercube_graph.h>
deba@57
    24
deba@57
    25
#include "test_tools.h"
kpeter@171
    26
#include "graph_test.h"
deba@57
    27
deba@57
    28
using namespace lemon;
deba@57
    29
using namespace lemon::concepts;
deba@57
    30
deba@228
    31
template <class Digraph>
deba@228
    32
void checkDigraph() {
deba@228
    33
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
deba@228
    34
  Digraph G;
deba@228
    35
deba@228
    36
  checkGraphNodeList(G, 0);
deba@228
    37
  checkGraphArcList(G, 0);
deba@228
    38
deba@228
    39
  Node
deba@228
    40
    n1 = G.addNode(),
deba@228
    41
    n2 = G.addNode(),
deba@228
    42
    n3 = G.addNode();
deba@228
    43
  checkGraphNodeList(G, 3);
deba@228
    44
  checkGraphArcList(G, 0);
deba@228
    45
deba@228
    46
  Arc a1 = G.addArc(n1, n2);
deba@228
    47
  check(G.source(a1) == n1 && G.target(a1) == n2, "Wrong arc");
deba@228
    48
  checkGraphNodeList(G, 3);
deba@228
    49
  checkGraphArcList(G, 1);
deba@228
    50
deba@228
    51
  checkGraphOutArcList(G, n1, 1);
deba@228
    52
  checkGraphOutArcList(G, n2, 0);
deba@228
    53
  checkGraphOutArcList(G, n3, 0);
deba@228
    54
deba@228
    55
  checkGraphInArcList(G, n1, 0);
deba@228
    56
  checkGraphInArcList(G, n2, 1);
deba@228
    57
  checkGraphInArcList(G, n3, 0);
deba@228
    58
deba@228
    59
  checkGraphConArcList(G, 1);
deba@228
    60
deba@228
    61
  Arc a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
deba@228
    62
  checkGraphNodeList(G, 3);
deba@228
    63
  checkGraphArcList(G, 4);
deba@228
    64
deba@228
    65
  checkGraphOutArcList(G, n1, 1);
deba@228
    66
  checkGraphOutArcList(G, n2, 3);
deba@228
    67
  checkGraphOutArcList(G, n3, 0);
deba@228
    68
deba@228
    69
  checkGraphInArcList(G, n1, 1);
deba@228
    70
  checkGraphInArcList(G, n2, 1);
deba@228
    71
  checkGraphInArcList(G, n3, 2);
deba@228
    72
deba@228
    73
  checkGraphConArcList(G, 4);
deba@228
    74
deba@228
    75
  checkNodeIds(G);
deba@228
    76
  checkArcIds(G);
deba@228
    77
  checkGraphNodeMap(G);
deba@228
    78
  checkGraphArcMap(G);
deba@228
    79
deba@228
    80
}
deba@228
    81
deba@353
    82
void checkFullDigraph(int num) {
deba@353
    83
  typedef FullDigraph Digraph;
deba@353
    84
  DIGRAPH_TYPEDEFS(Digraph);
deba@353
    85
  Digraph G(num);
deba@353
    86
deba@353
    87
  checkGraphNodeList(G, num);
deba@353
    88
  checkGraphArcList(G, num * num);
deba@353
    89
deba@353
    90
  for (NodeIt n(G); n != INVALID; ++n) {
deba@353
    91
    checkGraphOutArcList(G, n, num);
deba@353
    92
    checkGraphInArcList(G, n, num);
deba@353
    93
  }
deba@353
    94
deba@353
    95
  checkGraphConArcList(G, num * num);
deba@353
    96
deba@353
    97
  checkNodeIds(G);
deba@353
    98
  checkArcIds(G);
deba@353
    99
  checkGraphNodeMap(G);
deba@353
   100
  checkGraphArcMap(G);
deba@353
   101
deba@353
   102
  for (int i = 0; i < G.nodeNum(); ++i) {
deba@353
   103
    check(G.index(G(i)) == i, "Wrong index");
deba@353
   104
  }
deba@353
   105
deba@353
   106
  for (NodeIt s(G); s != INVALID; ++s) {
deba@353
   107
    for (NodeIt t(G); t != INVALID; ++t) {
deba@353
   108
      Arc a = G.arc(s, t);
deba@353
   109
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
deba@353
   110
    }
deba@353
   111
  }
deba@353
   112
deba@353
   113
}
deba@353
   114
kpeter@364
   115
void checkHypercubeDigraph(int dim) {
kpeter@364
   116
  DIGRAPH_TYPEDEFS(HypercubeDigraph);
kpeter@364
   117
kpeter@364
   118
  HypercubeDigraph G(dim);
kpeter@364
   119
  checkGraphNodeList(G, 1 << dim);
kpeter@364
   120
  checkGraphArcList(G, (1 << dim) * dim);
kpeter@364
   121
kpeter@364
   122
  Node n = G.nodeFromId(dim);
kpeter@364
   123
kpeter@364
   124
  checkGraphOutArcList(G, n, dim);
kpeter@364
   125
  for (OutArcIt a(G, n); a != INVALID; ++a)
kpeter@364
   126
    check(G.source(a) == n &&
kpeter@364
   127
          G.id(G.target(a)) == G.id(n) ^ (1 << G.dimension(a)),
kpeter@364
   128
          "Wrong arc");
kpeter@364
   129
kpeter@364
   130
  checkGraphInArcList(G, n, dim);
kpeter@364
   131
  for (InArcIt a(G, n); a != INVALID; ++a)
kpeter@364
   132
    check(G.target(a) == n &&
kpeter@364
   133
          G.id(G.source(a)) == G.id(n) ^ (1 << G.dimension(a)),
kpeter@364
   134
          "Wrong arc");
kpeter@364
   135
kpeter@364
   136
  checkGraphConArcList(G, (1 << dim) * dim);
kpeter@364
   137
kpeter@364
   138
  checkNodeIds(G);
kpeter@364
   139
  checkArcIds(G);
kpeter@364
   140
  checkGraphNodeMap(G);
kpeter@364
   141
  checkGraphArcMap(G);
kpeter@364
   142
}
kpeter@364
   143
deba@228
   144
deba@228
   145
void checkConcepts() {
kpeter@171
   146
  { // Checking digraph components
deba@57
   147
    checkConcept<BaseDigraphComponent, BaseDigraphComponent >();
deba@57
   148
alpar@209
   149
    checkConcept<IDableDigraphComponent<>,
deba@57
   150
      IDableDigraphComponent<> >();
deba@57
   151
alpar@209
   152
    checkConcept<IterableDigraphComponent<>,
deba@57
   153
      IterableDigraphComponent<> >();
deba@57
   154
alpar@209
   155
    checkConcept<MappableDigraphComponent<>,
deba@57
   156
      MappableDigraphComponent<> >();
deba@57
   157
  }
kpeter@171
   158
  { // Checking skeleton digraph
deba@57
   159
    checkConcept<Digraph, Digraph>();
deba@57
   160
  }
kpeter@171
   161
  { // Checking ListDigraph
kpeter@171
   162
    checkConcept<Digraph, ListDigraph>();
deba@57
   163
    checkConcept<AlterableDigraphComponent<>, ListDigraph>();
deba@57
   164
    checkConcept<ExtendableDigraphComponent<>, ListDigraph>();
deba@57
   165
    checkConcept<ClearableDigraphComponent<>, ListDigraph>();
deba@57
   166
    checkConcept<ErasableDigraphComponent<>, ListDigraph>();
kpeter@171
   167
  }
kpeter@171
   168
  { // Checking SmartDigraph
kpeter@171
   169
    checkConcept<Digraph, SmartDigraph>();
kpeter@171
   170
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
kpeter@171
   171
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
kpeter@171
   172
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
kpeter@171
   173
  }
kpeter@354
   174
  { // Checking FullDigraph
kpeter@354
   175
    checkConcept<Digraph, FullDigraph>();
kpeter@354
   176
  }
kpeter@364
   177
  { // Checking HypercubeDigraph
kpeter@364
   178
    checkConcept<Digraph, HypercubeDigraph>();
kpeter@364
   179
  }
kpeter@171
   180
}
deba@57
   181
kpeter@171
   182
template <typename Digraph>
deba@228
   183
void checkDigraphValidity() {
kpeter@171
   184
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
kpeter@171
   185
  Digraph g;
kpeter@171
   186
kpeter@171
   187
  Node
kpeter@171
   188
    n1 = g.addNode(),
kpeter@171
   189
    n2 = g.addNode(),
kpeter@171
   190
    n3 = g.addNode();
kpeter@171
   191
kpeter@171
   192
  Arc
kpeter@171
   193
    e1 = g.addArc(n1, n2),
kpeter@171
   194
    e2 = g.addArc(n2, n3);
kpeter@171
   195
kpeter@171
   196
  check(g.valid(n1), "Wrong validity check");
kpeter@171
   197
  check(g.valid(e1), "Wrong validity check");
kpeter@171
   198
kpeter@171
   199
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
kpeter@171
   200
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
kpeter@171
   201
}
kpeter@171
   202
kpeter@171
   203
template <typename Digraph>
deba@228
   204
void checkDigraphValidityErase() {
kpeter@171
   205
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
kpeter@171
   206
  Digraph g;
kpeter@171
   207
kpeter@171
   208
  Node
kpeter@171
   209
    n1 = g.addNode(),
kpeter@171
   210
    n2 = g.addNode(),
kpeter@171
   211
    n3 = g.addNode();
kpeter@171
   212
kpeter@171
   213
  Arc
kpeter@171
   214
    e1 = g.addArc(n1, n2),
kpeter@171
   215
    e2 = g.addArc(n2, n3);
kpeter@171
   216
kpeter@171
   217
  check(g.valid(n1), "Wrong validity check");
kpeter@171
   218
  check(g.valid(e1), "Wrong validity check");
kpeter@171
   219
kpeter@171
   220
  g.erase(n1);
kpeter@171
   221
kpeter@171
   222
  check(!g.valid(n1), "Wrong validity check");
kpeter@171
   223
  check(g.valid(n2), "Wrong validity check");
kpeter@171
   224
  check(g.valid(n3), "Wrong validity check");
kpeter@171
   225
  check(!g.valid(e1), "Wrong validity check");
kpeter@171
   226
  check(g.valid(e2), "Wrong validity check");
kpeter@171
   227
kpeter@171
   228
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
kpeter@171
   229
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
kpeter@171
   230
}
kpeter@171
   231
deba@228
   232
void checkDigraphs() {
kpeter@171
   233
  { // Checking ListDigraph
deba@57
   234
    checkDigraph<ListDigraph>();
deba@228
   235
    checkDigraphValidityErase<ListDigraph>();
deba@57
   236
  }
kpeter@171
   237
  { // Checking SmartDigraph
kpeter@171
   238
    checkDigraph<SmartDigraph>();
deba@228
   239
    checkDigraphValidity<SmartDigraph>();
kpeter@171
   240
  }
deba@353
   241
  { // Checking FullDigraph
deba@353
   242
    checkFullDigraph(8);
deba@353
   243
  }
kpeter@364
   244
  { // Checking HypercubeDigraph
kpeter@364
   245
    checkHypercubeDigraph(1);
kpeter@364
   246
    checkHypercubeDigraph(2);
kpeter@364
   247
    checkHypercubeDigraph(3);
kpeter@364
   248
    checkHypercubeDigraph(4);
kpeter@364
   249
  }
kpeter@171
   250
}
deba@57
   251
kpeter@171
   252
int main() {
deba@228
   253
  checkDigraphs();
deba@228
   254
  checkConcepts();
deba@57
   255
  return 0;
deba@57
   256
}