/* -*- 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 "test_tools.h" #include "graph_test.h" using namespace lemon; using namespace lemon::concepts; template void checkDigraphBuild() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph G; checkGraphNodeList(G, 0); checkGraphArcList(G, 0); Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(); checkGraphNodeList(G, 3); checkGraphArcList(G, 0); Arc a1 = G.addArc(n1, n2); check(G.source(a1) == n1 && G.target(a1) == n2, "Wrong arc"); checkGraphNodeList(G, 3); checkGraphArcList(G, 1); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 0); checkGraphOutArcList(G, n3, 0); checkGraphInArcList(G, n1, 0); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 0); checkGraphConArcList(G, 1); Arc a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3); checkGraphNodeList(G, 3); checkGraphArcList(G, 4); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 3); checkGraphOutArcList(G, n3, 0); checkGraphInArcList(G, n1, 1); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 2); checkGraphConArcList(G, 4); checkNodeIds(G); checkArcIds(G); checkGraphNodeMap(G); checkGraphArcMap(G); } template void checkDigraphSplit() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph G; Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(); Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3); Node n4 = G.split(n2); check(G.target(OutArcIt(G, n2)) == n4 && G.source(InArcIt(G, n4)) == n2, "Wrong split."); checkGraphNodeList(G, 4); checkGraphArcList(G, 5); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 1); checkGraphOutArcList(G, n3, 0); checkGraphOutArcList(G, n4, 3); checkGraphInArcList(G, n1, 1); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 2); checkGraphInArcList(G, n4, 1); checkGraphConArcList(G, 5); } template void checkDigraphAlter() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph G; Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(), n4 = G.addNode(); Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1), a3 = G.addArc(n4, n3), a4 = G.addArc(n4, n3), a5 = G.addArc(n2, n4); checkGraphNodeList(G, 4); checkGraphArcList(G, 5); // Check changeSource() and changeTarget() G.changeTarget(a4, n1); checkGraphNodeList(G, 4); checkGraphArcList(G, 5); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 1); checkGraphOutArcList(G, n3, 0); checkGraphOutArcList(G, n4, 3); checkGraphInArcList(G, n1, 2); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 1); checkGraphInArcList(G, n4, 1); checkGraphConArcList(G, 5); G.changeSource(a4, n3); checkGraphNodeList(G, 4); checkGraphArcList(G, 5); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 1); checkGraphOutArcList(G, n3, 1); checkGraphOutArcList(G, n4, 2); checkGraphInArcList(G, n1, 2); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 1); checkGraphInArcList(G, n4, 1); checkGraphConArcList(G, 5); // Check contract() G.contract(n2, n4, false); checkGraphNodeList(G, 3); checkGraphArcList(G, 5); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 3); checkGraphOutArcList(G, n3, 1); checkGraphInArcList(G, n1, 2); checkGraphInArcList(G, n2, 2); checkGraphInArcList(G, n3, 1); checkGraphConArcList(G, 5); G.contract(n2, n1); checkGraphNodeList(G, 2); checkGraphArcList(G, 3); checkGraphOutArcList(G, n2, 2); checkGraphOutArcList(G, n3, 1); checkGraphInArcList(G, n2, 2); checkGraphInArcList(G, n3, 1); checkGraphConArcList(G, 3); } template void checkDigraphErase() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph G; Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(), n4 = G.addNode(); Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1), a3 = G.addArc(n4, n3), a4 = G.addArc(n3, n1), a5 = G.addArc(n2, n4); // Check arc deletion G.erase(a1); checkGraphNodeList(G, 4); checkGraphArcList(G, 4); checkGraphOutArcList(G, n1, 0); checkGraphOutArcList(G, n2, 1); checkGraphOutArcList(G, n3, 1); checkGraphOutArcList(G, n4, 2); checkGraphInArcList(G, n1, 2); checkGraphInArcList(G, n2, 0); checkGraphInArcList(G, n3, 1); checkGraphInArcList(G, n4, 1); checkGraphConArcList(G, 4); // Check node deletion G.erase(n4); checkGraphNodeList(G, 3); checkGraphArcList(G, 1); checkGraphOutArcList(G, n1, 0); checkGraphOutArcList(G, n2, 0); checkGraphOutArcList(G, n3, 1); checkGraphOutArcList(G, n4, 0); checkGraphInArcList(G, n1, 1); checkGraphInArcList(G, n2, 0); checkGraphInArcList(G, n3, 0); checkGraphInArcList(G, n4, 0); checkGraphConArcList(G, 1); } template void checkDigraphSnapshot() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph G; Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(); Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1), a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3); typename Digraph::Snapshot snapshot(G); Node n = G.addNode(); G.addArc(n3, n); G.addArc(n, n3); checkGraphNodeList(G, 4); checkGraphArcList(G, 6); snapshot.restore(); checkGraphNodeList(G, 3); checkGraphArcList(G, 4); checkGraphOutArcList(G, n1, 1); checkGraphOutArcList(G, n2, 3); checkGraphOutArcList(G, n3, 0); checkGraphInArcList(G, n1, 1); checkGraphInArcList(G, n2, 1); checkGraphInArcList(G, n3, 2); checkGraphConArcList(G, 4); checkNodeIds(G); checkArcIds(G); checkGraphNodeMap(G); checkGraphArcMap(G); G.addNode(); snapshot.save(G); G.addArc(G.addNode(), G.addNode()); snapshot.restore(); checkGraphNodeList(G, 4); checkGraphArcList(G, 4); } void checkConcepts() { { // Checking digraph components checkConcept(); checkConcept, IDableDigraphComponent<> >(); checkConcept, IterableDigraphComponent<> >(); checkConcept, MappableDigraphComponent<> >(); } { // Checking skeleton digraph checkConcept(); } { // Checking ListDigraph checkConcept(); checkConcept, ListDigraph>(); checkConcept, ListDigraph>(); checkConcept, ListDigraph>(); checkConcept, ListDigraph>(); } { // Checking SmartDigraph checkConcept(); checkConcept, SmartDigraph>(); checkConcept, SmartDigraph>(); checkConcept, SmartDigraph>(); } { // Checking FullDigraph checkConcept(); } } template void checkDigraphValidity() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph g; Node n1 = g.addNode(), n2 = g.addNode(), n3 = g.addNode(); Arc e1 = g.addArc(n1, n2), e2 = g.addArc(n2, n3); check(g.valid(n1), "Wrong validity check"); check(g.valid(e1), "Wrong validity check"); check(!g.valid(g.nodeFromId(-1)), "Wrong validity check"); check(!g.valid(g.arcFromId(-1)), "Wrong validity check"); } template void checkDigraphValidityErase() { TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); Digraph g; Node n1 = g.addNode(), n2 = g.addNode(), n3 = g.addNode(); Arc e1 = g.addArc(n1, n2), e2 = g.addArc(n2, n3); check(g.valid(n1), "Wrong validity check"); check(g.valid(e1), "Wrong validity check"); g.erase(n1); check(!g.valid(n1), "Wrong validity check"); check(g.valid(n2), "Wrong validity check"); check(g.valid(n3), "Wrong validity check"); check(!g.valid(e1), "Wrong validity check"); check(g.valid(e2), "Wrong validity check"); check(!g.valid(g.nodeFromId(-1)), "Wrong validity check"); check(!g.valid(g.arcFromId(-1)), "Wrong validity check"); } void checkFullDigraph(int num) { typedef FullDigraph Digraph; DIGRAPH_TYPEDEFS(Digraph); Digraph G(num); checkGraphNodeList(G, num); checkGraphArcList(G, num * num); for (NodeIt n(G); n != INVALID; ++n) { checkGraphOutArcList(G, n, num); checkGraphInArcList(G, n, num); } checkGraphConArcList(G, num * num); checkNodeIds(G); checkArcIds(G); checkGraphNodeMap(G); checkGraphArcMap(G); for (int i = 0; i < G.nodeNum(); ++i) { check(G.index(G(i)) == i, "Wrong index"); } for (NodeIt s(G); s != INVALID; ++s) { for (NodeIt t(G); t != INVALID; ++t) { Arc a = G.arc(s, t); check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup"); } } } void checkDigraphs() { { // Checking ListDigraph checkDigraphBuild(); checkDigraphSplit(); checkDigraphAlter(); checkDigraphErase(); checkDigraphSnapshot(); checkDigraphValidityErase(); } { // Checking SmartDigraph checkDigraphBuild(); checkDigraphSplit(); checkDigraphSnapshot(); checkDigraphValidity(); } { // Checking FullDigraph checkFullDigraph(8); } } int main() { checkDigraphs(); checkConcepts(); return 0; }