COIN-OR::LEMON - Graph Library

Changes in / [1173:57167d92e96c:1164:04f57dad1b07] in lemon-main


Ignore:
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • lemon/dimacs.h

    r1160 r1092  
    2626#include <lemon/maps.h>
    2727#include <lemon/error.h>
    28 
    2928/// \ingroup dimacs_group
    3029/// \file
     
    124123  ///
    125124  /// If the file type was previously evaluated by dimacsType(), then
    126   /// the descriptor struct should be given by the \c desc parameter.
     125  /// the descriptor struct should be given by the \c dest parameter.
    127126  template <typename Digraph, typename LowerMap,
    128127            typename CapacityMap, typename CostMap,
     
    278277  ///
    279278  /// If the file type was previously evaluated by dimacsType(), then
    280   /// the descriptor struct should be given by the \c desc parameter.
     279  /// the descriptor struct should be given by the \c dest parameter.
    281280  template<typename Digraph, typename CapacityMap>
    282281  void readDimacsMax(std::istream& is,
     
    305304  ///
    306305  /// If the file type was previously evaluated by dimacsType(), then
    307   /// the descriptor struct should be given by the \c desc parameter.
     306  /// the descriptor struct should be given by the \c dest parameter.
    308307  template<typename Digraph, typename LengthMap>
    309308  void readDimacsSp(std::istream& is,
     
    336335  ///
    337336  /// If the file type was previously evaluated by dimacsType(), then
    338   /// the descriptor struct should be given by the \c desc parameter.
     337  /// the descriptor struct should be given by the \c dest parameter.
    339338  template<typename Digraph, typename CapacityMap>
    340339  void readDimacsCap(std::istream& is,
     
    345344    typename Digraph::Node u,v;
    346345    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
    347     if(desc.type!=DimacsDescriptor::MAX && desc.type!=DimacsDescriptor::SP)
     346    if(desc.type!=DimacsDescriptor::MAX || desc.type!=DimacsDescriptor::SP)
    348347      throw FormatError("Problem type mismatch");
    349348    _readDimacs(is, g, capacity, u, v, infty, desc);
     
    376375  ///
    377376  /// If the file type was previously evaluated by dimacsType(), then
    378   /// the descriptor struct should be given by the \c desc parameter.
     377  /// the descriptor struct should be given by the \c dest parameter.
    379378  template<typename Graph>
    380379  void readDimacsMat(std::istream& is, Graph &g,
  • lemon/lgf_reader.h

    r1161 r1150  
    452452  ///
    453453  ///\code
    454   /// DigraphReader<DGR>(digraph, std::cin)
    455   ///   .nodeMap("coordinates", coord_map)
    456   ///   .arcMap("capacity", cap_map)
    457   ///   .node("source", src)
    458   ///   .node("target", trg)
    459   ///   .attribute("caption", caption)
    460   ///   .run();
     454  /// DigraphReader<DGR>(digraph, std::cin).
     455  ///   nodeMap("coordinates", coord_map).
     456  ///   arcMap("capacity", cap_map).
     457  ///   node("source", src).
     458  ///   node("target", trg).
     459  ///   attribute("caption", caption).
     460  ///   run();
    461461  ///\endcode
    462462  ///
     
    12471247  ///ListDigraph::ArcMap<int> cap(digraph);
    12481248  ///ListDigraph::Node src, trg;
    1249   ///digraphReader(digraph, std::cin)
    1250   ///  .arcMap("capacity", cap)
    1251   ///  .node("source", src)
    1252   ///  .node("target", trg)
    1253   ///  .run();
     1249  ///digraphReader(digraph, std::cin).
     1250  ///  arcMap("capacity", cap).
     1251  ///  node("source", src).
     1252  ///  node("target", trg).
     1253  ///  run();
    12541254  ///\endcode
    12551255  ///
     
    21242124  ///ListGraph graph;
    21252125  ///ListGraph::EdgeMap<int> weight(graph);
    2126   ///graphReader(graph, std::cin)
    2127   ///  .edgeMap("weight", weight)
    2128   ///  .run();
     2126  ///graphReader(graph, std::cin).
     2127  ///  edgeMap("weight", weight).
     2128  ///  run();
    21292129  ///\endcode
    21302130  ///
     
    31923192  ///ListBpGraph graph;
    31933193  ///ListBpGraph::EdgeMap<int> weight(graph);
    3194   ///bpGraphReader(graph, std::cin)
    3195   ///  .edgeMap("weight", weight)
    3196   ///  .run();
     3194  ///bpGraphReader(graph, std::cin).
     3195  ///  edgeMap("weight", weight).
     3196  ///  run();
    31973197  ///\endcode
    31983198  ///
  • lemon/lgf_writer.h

    r1161 r1092  
    409409  ///
    410410  ///\code
    411   /// DigraphWriter<DGR>(digraph, std::cout)
    412   ///   .nodeMap("coordinates", coord_map)
    413   ///   .nodeMap("size", size)
    414   ///   .nodeMap("title", title)
    415   ///   .arcMap("capacity", cap_map)
    416   ///   .node("source", src)
    417   ///   .node("target", trg)
    418   ///   .attribute("caption", caption)
    419   ///   .run();
     411  /// DigraphWriter<DGR>(digraph, std::cout).
     412  ///   nodeMap("coordinates", coord_map).
     413  ///   nodeMap("size", size).
     414  ///   nodeMap("title", title).
     415  ///   arcMap("capacity", cap_map).
     416  ///   node("source", src).
     417  ///   node("target", trg).
     418  ///   attribute("caption", caption).
     419  ///   run();
    420420  ///\endcode
    421421  ///
     
    962962  ///ListDigraph::Node src, trg;
    963963  ///  // Setting the capacity map and source and target nodes
    964   ///digraphWriter(digraph, std::cout)
    965   ///  .arcMap("capacity", cap)
    966   ///  .node("source", src)
    967   ///  .node("target", trg)
    968   ///  .run();
     964  ///digraphWriter(digraph, std::cout).
     965  ///  arcMap("capacity", cap).
     966  ///  node("source", src).
     967  ///  node("target", trg).
     968  ///  run();
    969969  ///\endcode
    970970  ///
     
    16001600  ///ListGraph::EdgeMap<int> weight(graph);
    16011601  ///  // Setting the weight map
    1602   ///graphWriter(graph, std::cout)
    1603   ///  .edgeMap("weight", weight)
    1604   ///  .run();
     1602  ///graphWriter(graph, std::cout).
     1603  ///  edgeMap("weight", weight).
     1604  ///  run();
    16051605  ///\endcode
    16061606  ///
     
    24202420  ///ListBpGraph::EdgeMap<int> weight(graph);
    24212421  ///  // Setting the weight map
    2422   ///bpGraphWriter(graph, std::cout)
    2423   ///  .edgeMap("weight", weight)
    2424   ///  .run();
     2422  ///bpGraphWriter(graph, std::cout).
     2423  ///  edgeMap("weight", weight).
     2424  ///  run();
    24252425  ///\endcode
    24262426  ///
  • lemon/preflow.h

    r1169 r1092  
    477477    /// flow to the given \c flowMap. The \c flowMap should contain a
    478478    /// flow or at least a preflow, i.e. at each node excluding the
    479     /// source node the incoming flow should be greater or equal to the
     479    /// source node the incoming flow should greater or equal to the
    480480    /// outgoing flow.
    481481    /// \return \c false if the given \c flowMap is not a preflow.
     
    496496          excess -= (*_flow)[e];
    497497        }
    498         if (_tolerance.negative(excess) && n != _source) return false;
     498        if (excess < 0 && n != _source) return false;
    499499        (*_excess)[n] = excess;
    500500      }
     
    640640          (*_excess)[n] = excess;
    641641
    642           if (_tolerance.nonZero(excess)) {
     642          if (excess != 0) {
    643643            if (new_level + 1 < _level->maxLevel()) {
    644644              _level->liftHighestActive(new_level + 1);
     
    721721          (*_excess)[n] = excess;
    722722
    723           if (_tolerance.nonZero(excess)) {
     723          if (excess != 0) {
    724724            if (new_level + 1 < _level->maxLevel()) {
    725725              _level->liftActiveOn(level, new_level + 1);
     
    792792        if (!reached[n]) {
    793793          _level->dirtyTopButOne(n);
    794         } else if (_tolerance.positive((*_excess)[n]) && _target != n) {
     794        } else if ((*_excess)[n] > 0 && _target != n) {
    795795          _level->activate(n);
    796796        }
     
    853853        (*_excess)[n] = excess;
    854854
    855         if (_tolerance.nonZero(excess)) {
     855        if (excess != 0) {
    856856          if (new_level + 1 < _level->maxLevel()) {
    857857            _level->liftHighestActive(new_level + 1);
  • lemon/static_graph.h

    r1157 r1124  
    3030
    3131  class StaticDigraphBase {
    32 
    3332  public:
    3433
     
    298297  /// \sa concepts::Digraph
    299298  class StaticDigraph : public ExtendedStaticDigraphBase {
    300 
    301   private:
    302     /// Graphs are \e not copy constructible. Use DigraphCopy instead.
    303     StaticDigraph(const StaticDigraph &) : ExtendedStaticDigraphBase() {};
    304     /// \brief Assignment of a graph to another one is \e not allowed.
    305     /// Use DigraphCopy instead.
    306     void operator=(const StaticDigraph&) {}
    307 
    308299  public:
    309300
  • lemon/vf2.h

    r1156 r1152  
    2727#include <lemon/dfs.h>
    2828#include <lemon/bfs.h>
     29#include <test/test_tools.h>
    2930
    3031#include <vector>
  • test/bellman_ford_test.cc

    r1162 r1131  
    101101    pp = const_bf_test.negativeCycle();
    102102
    103 #ifdef LEMON_CXX11
    104103    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
    105104    for (auto n: const_bf_test.activeNodes()) { ::lemon::ignore_unused_variable_warning(n); }
     
    107106      ::lemon::ignore_unused_variable_warning(n);
    108107    }
    109 #endif
    110108  }
    111109  {
  • test/max_flow_test.cc

    r1169 r1092  
    2727#include <lemon/lgf_reader.h>
    2828#include <lemon/elevator.h>
    29 #include <lemon/tolerance.h>
    3029
    3130using namespace lemon;
     
    6766  "target 8\n";
    6867
    69 char test_lgf_float[] =
    70   "@nodes\n"
    71   "label\n"
    72   "0\n"
    73   "1\n"
    74   "2\n"
    75   "3\n"
    76   "4\n"
    77   "5\n"
    78   "6\n"
    79   "7\n"
    80   "8\n"
    81   "9\n"
    82   "@arcs\n"
    83   "      capacity\n"
    84   "0 1 0.1\n"
    85   "0 2 0.1\n"
    86   "0 3 0.1\n"
    87   "1 4 0.1\n"
    88   "2 4 0.1\n"
    89   "3 4 0.1\n"
    90   "4 5 0.3\n"
    91   "5 6 0.1\n"
    92   "5 7 0.1\n"
    93   "5 8 0.1\n"
    94   "6 9 0.1\n"
    95   "7 9 0.1\n"
    96   "8 9 0.1\n"
    97   "@attributes\n"
    98   "source 0\n"
    99   "target 9\n";
    10068
    10169// Checks the general interface of a max flow algorithm
     
    198166  typedef concepts::Digraph Digraph;
    199167  typedef concepts::ReadMap<Digraph::Arc, Value> CapMap;
     168  typedef Elevator<Digraph, Digraph::Node> Elev;
     169  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
    200170
    201171  Digraph g;
     
    215185
    216186template <typename T>
    217 T cutValue(const SmartDigraph& g,
    218            const SmartDigraph::NodeMap<bool>& cut,
    219            const SmartDigraph::ArcMap<T>& cap) {
    220 
    221   T c = 0;
    222   for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
    223     if (cut[g.source(e)] && !cut[g.target(e)]) c += cap[e];
     187T cutValue (const SmartDigraph& g,
     188              const SmartDigraph::NodeMap<bool>& cut,
     189              const SmartDigraph::ArcMap<T>& cap) {
     190
     191  T c=0;
     192  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
     193    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
    224194  }
    225195  return c;
     
    230200               const SmartDigraph::ArcMap<T>& flow,
    231201               const SmartDigraph::ArcMap<T>& cap,
    232                SmartDigraph::Node s, SmartDigraph::Node t,
    233                const Tolerance<T>& tol) {
     202               SmartDigraph::Node s, SmartDigraph::Node t) {
    234203
    235204  for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
    236     if (tol.negative(flow[e]) || tol.less(cap[e], flow[e])) return false;
     205    if (flow[e] < 0 || flow[e] > cap[e]) return false;
    237206  }
    238207
     
    246215      sum -= flow[e];
    247216    }
    248     if (tol.nonZero(sum)) return false;
     217    if (sum != 0) return false;
    249218  }
    250219  return true;
    251220}
    252221
    253 void checkInitPreflow()
     222void initFlowTest()
    254223{
    255224  DIGRAPH_TYPEDEFS(SmartDigraph);
    256225
    257226  SmartDigraph g;
    258   SmartDigraph::ArcMap<int> cap(g), iflow(g);
    259   Node s = g.addNode(); Node t = g.addNode();
    260   Node n1 = g.addNode(); Node n2 = g.addNode();
     227  SmartDigraph::ArcMap<int> cap(g),iflow(g);
     228  Node s=g.addNode(); Node t=g.addNode();
     229  Node n1=g.addNode(); Node n2=g.addNode();
    261230  Arc a;
    262   a = g.addArc(s, n1); cap[a] = 20; iflow[a] = 20;
    263   a = g.addArc(n1, n2); cap[a] = 10; iflow[a] = 0;
    264   a = g.addArc(n2, t); cap[a] = 20; iflow[a] = 0;
    265 
    266   Preflow<SmartDigraph> pre(g, cap, s, t);
     231  a=g.addArc(s,n1); cap[a]=20; iflow[a]=20;
     232  a=g.addArc(n1,n2); cap[a]=10; iflow[a]=0;
     233  a=g.addArc(n2,t); cap[a]=20; iflow[a]=0;
     234
     235  Preflow<SmartDigraph> pre(g,cap,s,t);
    267236  pre.init(iflow);
    268237  pre.startFirstPhase();
    269 
    270   check(pre.flowValue() == 10, "Incorrect max flow value.");
     238  check(pre.flowValue() == 10, "The incorrect max flow value.");
    271239  check(pre.minCut(s), "Wrong min cut (Node s).");
    272240  check(pre.minCut(n1), "Wrong min cut (Node n1).");
     
    276244
    277245template <typename MF, typename SF>
    278 void checkMaxFlowAlg(const char *input_lgf,  typename MF::Value expected) {
     246void checkMaxFlowAlg() {
    279247  typedef SmartDigraph Digraph;
    280248  DIGRAPH_TYPEDEFS(Digraph);
     
    285253  typedef BoolNodeMap CutMap;
    286254
    287   Tolerance<Value> tol;
    288 
    289255  Digraph g;
    290256  Node s, t;
    291257  CapMap cap(g);
    292   std::istringstream input(input_lgf);
    293   DigraphReader<Digraph>(g, input)
     258  std::istringstream input(test_lgf);
     259  DigraphReader<Digraph>(g,input)
    294260      .arcMap("capacity", cap)
    295       .node("source", s)
    296       .node("target", t)
     261      .node("source",s)
     262      .node("target",t)
    297263      .run();
    298264
     
    300266  max_flow.run();
    301267
    302   check(!tol.different(expected, max_flow.flowValue()),
    303         "Incorrect max flow value.");
    304   check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol),
     268  check(checkFlow(g, max_flow.flowMap(), cap, s, t),
    305269        "The flow is not feasible.");
    306270
     
    309273  Value min_cut_value = cutValue(g, min_cut, cap);
    310274
    311   check(!tol.different(expected, min_cut_value),
    312         "Incorrect min cut value.");
     275  check(max_flow.flowValue() == min_cut_value,
     276        "The max flow value is not equal to the min cut value.");
    313277
    314278  FlowMap flow(g);
    315   for (ArcIt e(g); e != INVALID; ++e) flow[e] = 13 * max_flow.flowMap()[e];
    316   for (ArcIt e(g); e != INVALID; ++e) cap[e] = 17 * cap[e];
     279  for (ArcIt e(g); e != INVALID; ++e) flow[e] = max_flow.flowMap()[e];
     280
     281  Value flow_value = max_flow.flowValue();
     282
     283  for (ArcIt e(g); e != INVALID; ++e) cap[e] = 2 * cap[e];
    317284  max_flow.init(flow);
    318285
     
    323290  min_cut_value = cutValue(g, min_cut1, cap);
    324291
    325   check(!tol.different(17 * expected, max_flow.flowValue()),
    326         "Incorrect max flow value.");
    327   check(!tol.different(17 * expected, min_cut_value),
    328         "Incorrect min cut value.");
     292  check(max_flow.flowValue() == min_cut_value &&
     293        min_cut_value == 2 * flow_value,
     294        "The max flow value or the min cut value is wrong.");
    329295
    330296  SF::startSecondPhase(max_flow);       // start second phase of the algorithm
    331297
    332   check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol),
     298  check(checkFlow(g, max_flow.flowMap(), cap, s, t),
    333299        "The flow is not feasible.");
    334300
     
    337303  min_cut_value = cutValue(g, min_cut2, cap);
    338304
    339   check(!tol.different(17 * expected, max_flow.flowValue()),
    340         "Incorrect max flow value.");
    341   check(!tol.different(17 * expected, min_cut_value),
    342         "Incorrect min cut value.");
     305  check(max_flow.flowValue() == min_cut_value &&
     306        min_cut_value == 2 * flow_value,
     307        "The max flow value or the min cut value was not doubled");
     308
    343309
    344310  max_flow.flowMap(flow);
     
    359325  CutMap min_cut3(g);
    360326  max_flow.minCutMap(min_cut3);
    361   min_cut_value = cutValue(g, min_cut3, cap);
    362 
    363   check(!tol.different(max_flow.flowValue(), min_cut_value),
     327  min_cut_value=cutValue(g, min_cut3, cap);
     328
     329  check(max_flow.flowValue() == min_cut_value,
    364330        "The max flow value or the min cut value is wrong.");
    365331}
     
    414380  typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<int> > PType1;
    415381  typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<float> > PType2;
    416   typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<double> > PType3;
    417 
    418   checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(test_lgf, 13);
    419   checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf, 13);
    420   checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf, 13);
    421 
    422   checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf_float, 0.3);
    423   checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf_float, 0.3);
    424 
    425   checkInitPreflow();
     382  checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >();
     383  checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >();
     384  initFlowTest();
    426385
    427386  // Check EdmondsKarp
    428387  typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<int> > EKType1;
    429388  typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<float> > EKType2;
    430   typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<double> > EKType3;
    431 
    432   checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(test_lgf, 13);
    433   checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf, 13);
    434   checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf, 13);
    435 
    436   checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf_float, 0.3);
    437   checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf_float, 0.3);
     389  checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >();
     390  checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >();
     391
     392  initFlowTest();
    438393
    439394  return 0;
  • tools/dimacs-solver.cc

    r1170 r1093  
    223223        throw IoError("Cannot open the file for writing", ap.files()[1]);
    224224      }
    225       // fall through
    226225    case 1:
    227226      input.open(ap.files()[0].c_str());
     
    229228        throw IoError("File cannot be found", ap.files()[0]);
    230229      }
    231       // fall through
    232230    case 0:
    233231      break;
     
    254252        case DimacsDescriptor::SP:
    255253          std::cout << "sp";
    256           break;
    257254        case DimacsDescriptor::MAT:
    258255          std::cout << "mat";
Note: See TracChangeset for help on using the changeset viewer.