test/max_cardinality_search_test.cc
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
child 955 7f6eeffe3cd1
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.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2010
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     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.
    12  *
    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
    15  * purpose.
    16  *
    17  */
    18 
    19 #include <iostream>
    20 
    21 #include "test_tools.h"
    22 #include <lemon/smart_graph.h>
    23 #include <lemon/max_cardinality_search.h>
    24 #include <lemon/concepts/digraph.h>
    25 #include <lemon/concepts/maps.h>
    26 #include <lemon/concepts/heap.h>
    27 #include <lemon/lgf_reader.h>
    28 
    29 using namespace lemon;
    30 using namespace std;
    31 
    32 char test_lgf[] =
    33   "@nodes\n"
    34   "label\n"
    35   "0\n"
    36   "1\n"
    37   "2\n"
    38   "3\n"
    39   "@arcs\n"
    40   "    label capacity\n"
    41   "0 1 0     2\n"
    42   "1 0 1     2\n"
    43   "2 1 2     1\n"
    44   "2 3 3     3\n"
    45   "3 2 4     3\n"
    46   "3 1 5     5\n"
    47   "@attributes\n"
    48   "s 0\n"
    49   "x 1\n"
    50   "y 2\n"
    51   "z 3\n";
    52 
    53 void checkMaxCardSearchCompile() {
    54 
    55   typedef concepts::Digraph Digraph;
    56   typedef int Value;
    57   typedef Digraph::Node Node;
    58   typedef Digraph::Arc Arc;
    59   typedef concepts::ReadMap<Arc,Value> CapMap;
    60   typedef concepts::ReadWriteMap<Node,Value> CardMap;
    61   typedef concepts::ReadWriteMap<Node,bool> ProcMap;
    62   typedef Digraph::NodeMap<int> HeapCrossRef;
    63 
    64   Digraph g;
    65   Node n,s;
    66   CapMap cap;
    67   CardMap card;
    68   ProcMap proc;
    69   HeapCrossRef crossref(g);
    70   
    71   typedef MaxCardinalitySearch<Digraph,CapMap>
    72     ::SetCapacityMap<CapMap>
    73     ::SetCardinalityMap<CardMap>
    74     ::SetProcessedMap<ProcMap>
    75     ::SetStandardHeap<BinHeap<Value,HeapCrossRef> >
    76     ::Create MaxCardType;
    77 
    78   MaxCardType maxcard(g,cap);
    79   const MaxCardType& const_maxcard = maxcard;
    80 
    81   const MaxCardType::Heap& heap_const = const_maxcard.heap();
    82   MaxCardType::Heap& heap = const_cast<MaxCardType::Heap&>(heap_const);
    83   maxcard.heap(heap,crossref);
    84   
    85   maxcard.capacityMap(cap).cardinalityMap(card).processedMap(proc);
    86 
    87   maxcard.init();
    88   maxcard.addSource(s);
    89   n = maxcard.nextNode();
    90    maxcard.processNextNode();
    91    maxcard.start();
    92    maxcard.run(s);
    93    maxcard.run();
    94  }
    95 
    96  void checkWithIntMap( std::istringstream& input)
    97  {
    98    typedef SmartDigraph Digraph;
    99    typedef Digraph::Node Node;
   100    typedef Digraph::ArcMap<int> CapMap;
   101 
   102    Digraph g;
   103    Node s,x,y,z,a;
   104    CapMap cap(g);
   105 
   106    DigraphReader<Digraph>(g,input).
   107      arcMap("capacity", cap).
   108      node("s",s).
   109      node("x",x).
   110      node("y",y).
   111      node("z",z).
   112      run();
   113 
   114    MaxCardinalitySearch<Digraph,CapMap> maxcard(g,cap);
   115 
   116    maxcard.init();
   117    maxcard.addSource(s);
   118    maxcard.start(x);
   119 
   120    check(maxcard.processed(s) and !maxcard.processed(x) and
   121          !maxcard.processed(y), "Wrong processed()!");
   122 
   123    a=maxcard.nextNode();
   124    check(maxcard.processNextNode()==a,
   125          "Wrong nextNode() or processNextNode() return value!");
   126 
   127    check(maxcard.processed(a), "Wrong processNextNode()!");
   128 
   129    maxcard.start();
   130    check(maxcard.cardinality(x)==2 and maxcard.cardinality(y)>=4,
   131          "Wrong cardinalities!");
   132  }
   133 
   134  void checkWithConst1Map(std::istringstream &input) {
   135    typedef SmartDigraph Digraph;
   136    typedef Digraph::Node Node;
   137 
   138    Digraph g;
   139    Node s,x,y,z;
   140 
   141   DigraphReader<Digraph>(g,input).
   142     node("s",s).
   143     node("x",x).
   144     node("y",y).
   145     node("z",z).
   146     run();
   147 
   148   MaxCardinalitySearch<Digraph> maxcard(g);
   149   maxcard.run(s);
   150   check(maxcard.cardinality(x)==1 &&
   151         maxcard.cardinality(y)+maxcard.cardinality(z)==3,
   152         "Wrong cardinalities!");
   153 }
   154 
   155 int main() {
   156 
   157   std::istringstream input1(test_lgf);
   158   checkWithIntMap(input1);
   159 
   160   std::istringstream input2(test_lgf);
   161   checkWithConst1Map(input2);
   162 }