/* -*- mode: C++; indent-tabs-mode: nil; -*- * * This file is a part of LEMON, a generic C++ optimization library. * * Copyright (C) 2003-2009 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport * (Egervary Research Group on Combinatorial Optimization, EGRES). * * Permission to use, modify and distribute this software is granted * provided that this copyright notice appears in all copies. For * precise terms see the accompanying LICENSE file. * * This software is provided "AS IS" with no warranty of any kind, * express or implied, and with no claim as to its suitability for any * purpose. * */ #include #include #include #include #include #include "test_tools.h" using namespace std; using namespace lemon; template void digraph_copy_test() { const int nn = 10; // Build a digraph SmartDigraph from; SmartDigraph::NodeMap fnm(from); SmartDigraph::ArcMap fam(from); SmartDigraph::Node fn = INVALID; SmartDigraph::Arc fa = INVALID; std::vector fnv; for (int i = 0; i < nn; ++i) { SmartDigraph::Node node = from.addNode(); fnv.push_back(node); fnm[node] = i * i; if (i == 0) fn = node; } for (int i = 0; i < nn; ++i) { for (int j = 0; j < nn; ++j) { SmartDigraph::Arc arc = from.addArc(fnv[i], fnv[j]); fam[arc] = i + j * j; if (i == 0 && j == 0) fa = arc; } } // Test digraph copy GR to; typename GR::template NodeMap tnm(to); typename GR::template ArcMap tam(to); typename GR::Node tn; typename GR::Arc ta; SmartDigraph::NodeMap nr(from); SmartDigraph::ArcMap er(from); typename GR::template NodeMap ncr(to); typename GR::template ArcMap ecr(to); digraphCopy(from, to). nodeMap(fnm, tnm).arcMap(fam, tam). nodeRef(nr).arcRef(er). nodeCrossRef(ncr).arcCrossRef(ecr). node(fn, tn).arc(fa, ta).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); for (SmartDigraph::NodeIt it(from); it != INVALID; ++it) { check(ncr[nr[it]] == it, "Wrong copy."); check(fnm[it] == tnm[nr[it]], "Wrong copy."); } for (SmartDigraph::ArcIt it(from); it != INVALID; ++it) { check(ecr[er[it]] == it, "Wrong copy."); check(fam[it] == tam[er[it]], "Wrong copy."); check(nr[from.source(it)] == to.source(er[it]), "Wrong copy."); check(nr[from.target(it)] == to.target(er[it]), "Wrong copy."); } for (typename GR::NodeIt it(to); it != INVALID; ++it) { check(nr[ncr[it]] == it, "Wrong copy."); } for (typename GR::ArcIt it(to); it != INVALID; ++it) { check(er[ecr[it]] == it, "Wrong copy."); } check(tn == nr[fn], "Wrong copy."); check(ta == er[fa], "Wrong copy."); // Test repeated copy digraphCopy(from, to).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); } template void graph_copy_test() { const int nn = 10; // Build a graph SmartGraph from; SmartGraph::NodeMap fnm(from); SmartGraph::ArcMap fam(from); SmartGraph::EdgeMap fem(from); SmartGraph::Node fn = INVALID; SmartGraph::Arc fa = INVALID; SmartGraph::Edge fe = INVALID; std::vector fnv; for (int i = 0; i < nn; ++i) { SmartGraph::Node node = from.addNode(); fnv.push_back(node); fnm[node] = i * i; if (i == 0) fn = node; } for (int i = 0; i < nn; ++i) { for (int j = 0; j < nn; ++j) { SmartGraph::Edge edge = from.addEdge(fnv[i], fnv[j]); fem[edge] = i * i + j * j; fam[from.direct(edge, true)] = i + j * j; fam[from.direct(edge, false)] = i * i + j; if (i == 0 && j == 0) fa = from.direct(edge, true); if (i == 0 && j == 0) fe = edge; } } // Test graph copy GR to; typename GR::template NodeMap tnm(to); typename GR::template ArcMap tam(to); typename GR::template EdgeMap tem(to); typename GR::Node tn; typename GR::Arc ta; typename GR::Edge te; SmartGraph::NodeMap nr(from); SmartGraph::ArcMap ar(from); SmartGraph::EdgeMap er(from); typename GR::template NodeMap ncr(to); typename GR::template ArcMap acr(to); typename GR::template EdgeMap ecr(to); graphCopy(from, to). nodeMap(fnm, tnm).arcMap(fam, tam).edgeMap(fem, tem). nodeRef(nr).arcRef(ar).edgeRef(er). nodeCrossRef(ncr).arcCrossRef(acr).edgeCrossRef(ecr). node(fn, tn).arc(fa, ta).edge(fe, te).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countEdges(from) == countEdges(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); for (SmartGraph::NodeIt it(from); it != INVALID; ++it) { check(ncr[nr[it]] == it, "Wrong copy."); check(fnm[it] == tnm[nr[it]], "Wrong copy."); } for (SmartGraph::ArcIt it(from); it != INVALID; ++it) { check(acr[ar[it]] == it, "Wrong copy."); check(fam[it] == tam[ar[it]], "Wrong copy."); check(nr[from.source(it)] == to.source(ar[it]), "Wrong copy."); check(nr[from.target(it)] == to.target(ar[it]), "Wrong copy."); } for (SmartGraph::EdgeIt it(from); it != INVALID; ++it) { check(ecr[er[it]] == it, "Wrong copy."); check(fem[it] == tem[er[it]], "Wrong copy."); check(nr[from.u(it)] == to.u(er[it]) || nr[from.u(it)] == to.v(er[it]), "Wrong copy."); check(nr[from.v(it)] == to.u(er[it]) || nr[from.v(it)] == to.v(er[it]), "Wrong copy."); check((from.u(it) != from.v(it)) == (to.u(er[it]) != to.v(er[it])), "Wrong copy."); } for (typename GR::NodeIt it(to); it != INVALID; ++it) { check(nr[ncr[it]] == it, "Wrong copy."); } for (typename GR::ArcIt it(to); it != INVALID; ++it) { check(ar[acr[it]] == it, "Wrong copy."); } for (typename GR::EdgeIt it(to); it != INVALID; ++it) { check(er[ecr[it]] == it, "Wrong copy."); } check(tn == nr[fn], "Wrong copy."); check(ta == ar[fa], "Wrong copy."); check(te == er[fe], "Wrong copy."); // Test repeated copy graphCopy(from, to).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countEdges(from) == countEdges(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); } template void bpgraph_copy_test() { const int nn = 10; // Build a graph SmartBpGraph from; SmartBpGraph::NodeMap fnm(from); SmartBpGraph::RedNodeMap frnm(from); SmartBpGraph::BlueNodeMap fbnm(from); SmartBpGraph::ArcMap fam(from); SmartBpGraph::EdgeMap fem(from); SmartBpGraph::Node fn = INVALID; SmartBpGraph::RedNode frn = INVALID; SmartBpGraph::BlueNode fbn = INVALID; SmartBpGraph::Arc fa = INVALID; SmartBpGraph::Edge fe = INVALID; std::vector frnv; for (int i = 0; i < nn; ++i) { SmartBpGraph::RedNode node = from.addRedNode(); frnv.push_back(node); fnm[node] = i * i; frnm[node] = i + i; if (i == 0) { fn = node; frn = node; } } std::vector fbnv; for (int i = 0; i < nn; ++i) { SmartBpGraph::BlueNode node = from.addBlueNode(); fbnv.push_back(node); fnm[node] = i * i; fbnm[node] = i + i; if (i == 0) fbn = node; } for (int i = 0; i < nn; ++i) { for (int j = 0; j < nn; ++j) { SmartBpGraph::Edge edge = from.addEdge(frnv[i], fbnv[j]); fem[edge] = i * i + j * j; fam[from.direct(edge, true)] = i + j * j; fam[from.direct(edge, false)] = i * i + j; if (i == 0 && j == 0) fa = from.direct(edge, true); if (i == 0 && j == 0) fe = edge; } } // Test graph copy GR to; typename GR::template NodeMap tnm(to); typename GR::template RedNodeMap trnm(to); typename GR::template BlueNodeMap tbnm(to); typename GR::template ArcMap tam(to); typename GR::template EdgeMap tem(to); typename GR::Node tn; typename GR::RedNode trn; typename GR::BlueNode tbn; typename GR::Arc ta; typename GR::Edge te; SmartBpGraph::NodeMap nr(from); SmartBpGraph::RedNodeMap rnr(from); SmartBpGraph::BlueNodeMap bnr(from); SmartBpGraph::ArcMap ar(from); SmartBpGraph::EdgeMap er(from); typename GR::template NodeMap ncr(to); typename GR::template RedNodeMap rncr(to); typename GR::template BlueNodeMap bncr(to); typename GR::template ArcMap acr(to); typename GR::template EdgeMap ecr(to); bpGraphCopy(from, to). nodeMap(fnm, tnm). redNodeMap(frnm, trnm).blueNodeMap(fbnm, tbnm). arcMap(fam, tam).edgeMap(fem, tem). nodeRef(nr).redRef(rnr).blueRef(bnr). arcRef(ar).edgeRef(er). nodeCrossRef(ncr).redCrossRef(rncr).blueCrossRef(bncr). arcCrossRef(acr).edgeCrossRef(ecr). node(fn, tn).redNode(frn, trn).blueNode(fbn, tbn). arc(fa, ta).edge(fe, te).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countRedNodes(from) == countRedNodes(to), "Wrong copy."); check(countBlueNodes(from) == countBlueNodes(to), "Wrong copy."); check(countEdges(from) == countEdges(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); for (SmartBpGraph::NodeIt it(from); it != INVALID; ++it) { check(ncr[nr[it]] == it, "Wrong copy."); check(fnm[it] == tnm[nr[it]], "Wrong copy."); } for (SmartBpGraph::RedNodeIt it(from); it != INVALID; ++it) { check(ncr[nr[it]] == it, "Wrong copy."); check(fnm[it] == tnm[nr[it]], "Wrong copy."); check(rnr[it] == nr[it], "Wrong copy."); check(rncr[rnr[it]] == it, "Wrong copy."); check(frnm[it] == trnm[rnr[it]], "Wrong copy."); check(to.red(rnr[it]), "Wrong copy."); } for (SmartBpGraph::BlueNodeIt it(from); it != INVALID; ++it) { check(ncr[nr[it]] == it, "Wrong copy."); check(fnm[it] == tnm[nr[it]], "Wrong copy."); check(bnr[it] == nr[it], "Wrong copy."); check(bncr[bnr[it]] == it, "Wrong copy."); check(fbnm[it] == tbnm[bnr[it]], "Wrong copy."); check(to.blue(bnr[it]), "Wrong copy."); } for (SmartBpGraph::ArcIt it(from); it != INVALID; ++it) { check(acr[ar[it]] == it, "Wrong copy."); check(fam[it] == tam[ar[it]], "Wrong copy."); check(nr[from.source(it)] == to.source(ar[it]), "Wrong copy."); check(nr[from.target(it)] == to.target(ar[it]), "Wrong copy."); } for (SmartBpGraph::EdgeIt it(from); it != INVALID; ++it) { check(ecr[er[it]] == it, "Wrong copy."); check(fem[it] == tem[er[it]], "Wrong copy."); check(nr[from.u(it)] == to.u(er[it]) || nr[from.u(it)] == to.v(er[it]), "Wrong copy."); check(nr[from.v(it)] == to.u(er[it]) || nr[from.v(it)] == to.v(er[it]), "Wrong copy."); check((from.u(it) != from.v(it)) == (to.u(er[it]) != to.v(er[it])), "Wrong copy."); } for (typename GR::NodeIt it(to); it != INVALID; ++it) { check(nr[ncr[it]] == it, "Wrong copy."); } for (typename GR::RedNodeIt it(to); it != INVALID; ++it) { check(rncr[it] == ncr[it], "Wrong copy."); check(rnr[rncr[it]] == it, "Wrong copy."); } for (typename GR::BlueNodeIt it(to); it != INVALID; ++it) { check(bncr[it] == ncr[it], "Wrong copy."); check(bnr[bncr[it]] == it, "Wrong copy."); } for (typename GR::ArcIt it(to); it != INVALID; ++it) { check(ar[acr[it]] == it, "Wrong copy."); } for (typename GR::EdgeIt it(to); it != INVALID; ++it) { check(er[ecr[it]] == it, "Wrong copy."); } check(tn == nr[fn], "Wrong copy."); check(trn == rnr[frn], "Wrong copy."); check(tbn == bnr[fbn], "Wrong copy."); check(ta == ar[fa], "Wrong copy."); check(te == er[fe], "Wrong copy."); // Test repeated copy bpGraphCopy(from, to).run(); check(countNodes(from) == countNodes(to), "Wrong copy."); check(countRedNodes(from) == countRedNodes(to), "Wrong copy."); check(countBlueNodes(from) == countBlueNodes(to), "Wrong copy."); check(countEdges(from) == countEdges(to), "Wrong copy."); check(countArcs(from) == countArcs(to), "Wrong copy."); } int main() { digraph_copy_test(); digraph_copy_test(); digraph_copy_test(); graph_copy_test(); graph_copy_test(); bpgraph_copy_test(); bpgraph_copy_test(); return 0; }