1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2009
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #include <lemon/smart_graph.h>
 
    20 #include <lemon/list_graph.h>
 
    21 #include <lemon/lgf_reader.h>
 
    22 #include <lemon/error.h>
 
    24 #include "test_tools.h"
 
    27 using namespace lemon;
 
    29 void digraph_copy_test() {
 
    33   SmartDigraph::NodeMap<int> fnm(from);
 
    34   SmartDigraph::ArcMap<int> fam(from);
 
    35   SmartDigraph::Node fn = INVALID;
 
    36   SmartDigraph::Arc fa = INVALID;
 
    38   std::vector<SmartDigraph::Node> fnv;
 
    39   for (int i = 0; i < nn; ++i) {
 
    40     SmartDigraph::Node node = from.addNode();
 
    43     if (i == 0) fn = node;
 
    46   for (int i = 0; i < nn; ++i) {
 
    47     for (int j = 0; j < nn; ++j) {
 
    48       SmartDigraph::Arc arc = from.addArc(fnv[i], fnv[j]);
 
    50       if (i == 0 && j == 0) fa = arc;
 
    55   ListDigraph::NodeMap<int> tnm(to);
 
    56   ListDigraph::ArcMap<int> tam(to);
 
    60   SmartDigraph::NodeMap<ListDigraph::Node> nr(from);
 
    61   SmartDigraph::ArcMap<ListDigraph::Arc> er(from);
 
    63   ListDigraph::NodeMap<SmartDigraph::Node> ncr(to);
 
    64   ListDigraph::ArcMap<SmartDigraph::Arc> ecr(to);
 
    66   digraphCopy(from, to).
 
    67     nodeMap(fnm, tnm).arcMap(fam, tam).
 
    68     nodeRef(nr).arcRef(er).
 
    69     nodeCrossRef(ncr).arcCrossRef(ecr).
 
    70     node(fn, tn).arc(fa, ta).run();
 
    72   for (SmartDigraph::NodeIt it(from); it != INVALID; ++it) {
 
    73     check(ncr[nr[it]] == it, "Wrong copy.");
 
    74     check(fnm[it] == tnm[nr[it]], "Wrong copy.");
 
    77   for (SmartDigraph::ArcIt it(from); it != INVALID; ++it) {
 
    78     check(ecr[er[it]] == it, "Wrong copy.");
 
    79     check(fam[it] == tam[er[it]], "Wrong copy.");
 
    80     check(nr[from.source(it)] == to.source(er[it]), "Wrong copy.");
 
    81     check(nr[from.target(it)] == to.target(er[it]), "Wrong copy.");
 
    84   for (ListDigraph::NodeIt it(to); it != INVALID; ++it) {
 
    85     check(nr[ncr[it]] == it, "Wrong copy.");
 
    88   for (ListDigraph::ArcIt it(to); it != INVALID; ++it) {
 
    89     check(er[ecr[it]] == it, "Wrong copy.");
 
    91   check(tn == nr[fn], "Wrong copy.");
 
    92   check(ta == er[fa], "Wrong copy.");
 
    95 void graph_copy_test() {
 
    99   SmartGraph::NodeMap<int> fnm(from);
 
   100   SmartGraph::ArcMap<int> fam(from);
 
   101   SmartGraph::EdgeMap<int> fem(from);
 
   102   SmartGraph::Node fn = INVALID;
 
   103   SmartGraph::Arc fa = INVALID;
 
   104   SmartGraph::Edge fe = INVALID;
 
   106   std::vector<SmartGraph::Node> fnv;
 
   107   for (int i = 0; i < nn; ++i) {
 
   108     SmartGraph::Node node = from.addNode();
 
   111     if (i == 0) fn = node;
 
   114   for (int i = 0; i < nn; ++i) {
 
   115     for (int j = 0; j < nn; ++j) {
 
   116       SmartGraph::Edge edge = from.addEdge(fnv[i], fnv[j]);
 
   117       fem[edge] = i * i + j * j;
 
   118       fam[from.direct(edge, true)] = i + j * j;
 
   119       fam[from.direct(edge, false)] = i * i + j;
 
   120       if (i == 0 && j == 0) fa = from.direct(edge, true);
 
   121       if (i == 0 && j == 0) fe = edge;
 
   126   ListGraph::NodeMap<int> tnm(to);
 
   127   ListGraph::ArcMap<int> tam(to);
 
   128   ListGraph::EdgeMap<int> tem(to);
 
   133   SmartGraph::NodeMap<ListGraph::Node> nr(from);
 
   134   SmartGraph::ArcMap<ListGraph::Arc> ar(from);
 
   135   SmartGraph::EdgeMap<ListGraph::Edge> er(from);
 
   137   ListGraph::NodeMap<SmartGraph::Node> ncr(to);
 
   138   ListGraph::ArcMap<SmartGraph::Arc> acr(to);
 
   139   ListGraph::EdgeMap<SmartGraph::Edge> ecr(to);
 
   142     nodeMap(fnm, tnm).arcMap(fam, tam).edgeMap(fem, tem).
 
   143     nodeRef(nr).arcRef(ar).edgeRef(er).
 
   144     nodeCrossRef(ncr).arcCrossRef(acr).edgeCrossRef(ecr).
 
   145     node(fn, tn).arc(fa, ta).edge(fe, te).run();
 
   147   for (SmartGraph::NodeIt it(from); it != INVALID; ++it) {
 
   148     check(ncr[nr[it]] == it, "Wrong copy.");
 
   149     check(fnm[it] == tnm[nr[it]], "Wrong copy.");
 
   152   for (SmartGraph::ArcIt it(from); it != INVALID; ++it) {
 
   153     check(acr[ar[it]] == it, "Wrong copy.");
 
   154     check(fam[it] == tam[ar[it]], "Wrong copy.");
 
   155     check(nr[from.source(it)] == to.source(ar[it]), "Wrong copy.");
 
   156     check(nr[from.target(it)] == to.target(ar[it]), "Wrong copy.");
 
   159   for (SmartGraph::EdgeIt it(from); it != INVALID; ++it) {
 
   160     check(ecr[er[it]] == it, "Wrong copy.");
 
   161     check(fem[it] == tem[er[it]], "Wrong copy.");
 
   162     check(nr[from.u(it)] == to.u(er[it]) || nr[from.u(it)] == to.v(er[it]),
 
   164     check(nr[from.v(it)] == to.u(er[it]) || nr[from.v(it)] == to.v(er[it]),
 
   166     check((from.u(it) != from.v(it)) == (to.u(er[it]) != to.v(er[it])),
 
   170   for (ListGraph::NodeIt it(to); it != INVALID; ++it) {
 
   171     check(nr[ncr[it]] == it, "Wrong copy.");
 
   174   for (ListGraph::ArcIt it(to); it != INVALID; ++it) {
 
   175     check(ar[acr[it]] == it, "Wrong copy.");
 
   177   for (ListGraph::EdgeIt it(to); it != INVALID; ++it) {
 
   178     check(er[ecr[it]] == it, "Wrong copy.");
 
   180   check(tn == nr[fn], "Wrong copy.");
 
   181   check(ta == ar[fa], "Wrong copy.");
 
   182   check(te == er[fe], "Wrong copy.");