COIN-OR::LEMON - Graph Library

Ticket #454: 454-daa8c50a0371.patch

File 454-daa8c50a0371.patch, 5.0 KB (added by Peter Kovacs, 12 years ago)
  • lemon/capacity_scaling.h

    # HG changeset patch
    # User Peter Kovacs <kpeter@inf.elte.hu>
    # Date 1354744707 -3600
    # Node ID daa8c50a03710af7e489417681d265fb6b7b6f7f
    # Parent  a26b90a17c81e068cb8777e356b4552a80c611d1
    Extend flow bound checking in min cost flow classes (#454)
    
    diff --git a/lemon/capacity_scaling.h b/lemon/capacity_scaling.h
    a b  
    762762        }
    763763      }
    764764
     765      // Check the residual capacity values
     766      for (int j = 0; j != _res_arc_num; ++j) {
     767        if (_res_cap[j] < 0) return INFEASIBLE;
     768      }
     769
    765770      // Handle negative costs
    766771      for (int i = 0; i != _root; ++i) {
    767772        last_out = _first_out[i+1] - 1;
  • lemon/cost_scaling.h

    diff --git a/lemon/cost_scaling.h b/lemon/cost_scaling.h
    a b  
    840840        }
    841841      }
    842842
     843      // Check the capacity values
     844      for (ArcIt a(_graph); a != INVALID; ++a) {
     845        if (cap[a] < 0) return INFEASIBLE;
     846      }
     847
    843848      _sup_node_num = 0;
    844849      for (NodeIt n(_graph); n != INVALID; ++n) {
    845850        if (sup[n] > 0) ++_sup_node_num;
  • lemon/cycle_canceling.h

    diff --git a/lemon/cycle_canceling.h b/lemon/cycle_canceling.h
    a b  
    731731        }
    732732      }
    733733
     734      // Check the capacity values
     735      for (ArcIt a(_graph); a != INVALID; ++a) {
     736        if (cap[a] < 0) return INFEASIBLE;
     737      }
     738
    734739      // Find a feasible flow using Circulation
    735740      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
    736741        circ(_graph, low, cap, sup);
  • lemon/network_simplex.h

    diff --git a/lemon/network_simplex.h b/lemon/network_simplex.h
    a b  
    10721072        }
    10731073      }
    10741074
     1075      // Check the capacity values
     1076      for (int i = 0; i != _arc_num; ++i) {
     1077        if (_cap[i] < 0) return false;
     1078      }
     1079
    10751080      // Initialize artifical cost
    10761081      Cost ART_COST;
    10771082      if (std::numeric_limits<Cost>::is_exact) {
  • test/min_cost_flow_test.cc

    diff --git a/test/min_cost_flow_test.cc b/test/min_cost_flow_test.cc
    a b  
    112112  "      cost\n"
    113113  "1 2     -1\n";
    114114
     115char test_lb_lgf[] =
     116  "@nodes\n"
     117  "label   sup\n"
     118  "    1    10\n"
     119  "    2     0\n"
     120  "    3     0\n"
     121  "    4   -10\n"
     122  "@arcs\n"
     123  "    cost  cap low1 low2 low3\n"
     124  "1 2    1   10    0    0    0\n"
     125  "1 3    2   10    0    0    0\n"
     126  "2 3    0    4    4    4    5\n"
     127  "2 4    2   10    3    8    2\n"
     128  "3 4    1   10    3    0    2\n";
     129
    115130
    116131// Test data
    117132typedef ListDigraph Digraph;
     
    133148ConstMap<Arc, int> neg2_l(0), neg2_u(1000);
    134149Digraph::NodeMap<int> neg2_s(neg2_gr);
    135150
     151Digraph lb_gr;
     152Digraph::ArcMap<int> lb_c(lb_gr), lb_u(lb_gr), lb_l1(lb_gr), lb_l2(lb_gr), lb_l3(lb_gr);
     153Digraph::NodeMap<int> lb_s(lb_gr);
     154
    136155
    137156enum SupplyType {
    138157  EQ,
     
    331350                     const std::string &test_str = "",
    332351                     bool full_neg_cost_support = false )
    333352{
    334   MCF mcf1(gr), mcf2(neg1_gr), mcf3(neg2_gr);
     353  MCF mcf1(gr), mcf2(neg1_gr), mcf3(neg2_gr), mcf_lb(lb_gr);
    335354
    336355  // Basic tests
    337356  mcf1.upperMap(u).costMap(c).supplyMap(s1);
     
    395414  mcf3.upperMap(neg2_u);
    396415  checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
    397416           mcf3.OPTIMAL, true,     -300, test_str + "-18", GEQ);
     417           
     418  // Tests with various lower bounds
     419  mcf_lb.upperMap(lb_u).costMap(lb_c).supplyMap(lb_s);
     420  mcf_lb.lowerMap(lb_l1);
     421  checkMcf(mcf_lb, mcf_lb.run(param), lb_gr, lb_l1, lb_u, lb_c, lb_s,
     422           mcf_lb.OPTIMAL, true,     26, test_str + "-19");
     423  mcf_lb.lowerMap(lb_l2);
     424  checkMcf(mcf_lb, mcf_lb.run(param), lb_gr, lb_l2, lb_u, lb_c, lb_s,
     425           mcf_lb.INFEASIBLE, false,  0, test_str + "-20");
     426  mcf_lb.lowerMap(lb_l3);
     427  checkMcf(mcf_lb, mcf_lb.run(param), lb_gr, lb_l3, lb_u, lb_c, lb_s,
     428           mcf_lb.INFEASIBLE, false,  0, test_str + "-21");
    398429}
    399430
    400431template < typename MCF, typename Param >
     
    406437  mcf1.supplyType(mcf1.LEQ);
    407438  mcf1.upperMap(u).costMap(c).supplyMap(s6);
    408439  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s6,
    409            mcf1.OPTIMAL, true,   5080, test_str + "-19", LEQ);
     440           mcf1.OPTIMAL, true,   5080, test_str + "-22", LEQ);
    410441  mcf1.lowerMap(l2);
    411442  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
    412            mcf1.OPTIMAL, true,   5930, test_str + "-20", LEQ);
     443           mcf1.OPTIMAL, true,   5930, test_str + "-23", LEQ);
    413444  mcf1.supplyMap(s5);
    414445  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
    415            mcf1.INFEASIBLE, false,  0, test_str + "-21", LEQ);
     446           mcf1.INFEASIBLE, false,  0, test_str + "-24", LEQ);
    416447}
    417448
    418449
     
    450481    .nodeMap("sup", neg2_s)
    451482    .run();
    452483
     484  std::istringstream lb_inp(test_lb_lgf);
     485  DigraphReader<Digraph>(lb_gr, lb_inp)
     486    .arcMap("cost", lb_c)
     487    .arcMap("cap", lb_u)
     488    .arcMap("low1", lb_l1)
     489    .arcMap("low2", lb_l2)
     490    .arcMap("low3", lb_l3)
     491    .nodeMap("sup", lb_s)
     492    .run();
     493
    453494  // Check the interface of NetworkSimplex
    454495  {
    455496    typedef concepts::Digraph GR;