src/work/marci/experiment/edmonds_karp_demo.cc
changeset 553 8e5102790d4d
child 921 818510fa3d99
equal deleted inserted replaced
-1:000000000000 0:f39a18b1fb8d
       
     1 // -*- c++ -*-
       
     2 #include <iostream>
       
     3 #include <fstream>
       
     4 
       
     5 #include <list_graph.h>
       
     6 #include <smart_graph.h>
       
     7 #include <dimacs.h>
       
     8 #include <edmonds_karp.h>
       
     9 #include <time_measure.h>
       
    10 #include <graph_wrapper.h>
       
    11 
       
    12 class CM {
       
    13 public:
       
    14   template<typename T> int get(T) const {return 1;}
       
    15 };
       
    16 
       
    17 using namespace hugo;
       
    18 
       
    19 // Use a DIMACS max flow file as stdin.
       
    20 // read_dimacs_demo < dimacs_max_flow_file
       
    21 
       
    22 
       
    23 //   struct Ize {
       
    24 //   };
       
    25   
       
    26 //   struct Mize {
       
    27 //     Ize bumm;
       
    28 //   };
       
    29 
       
    30 //   template <typename B>
       
    31 //     class Huha {
       
    32 //     public:
       
    33 //       int u;
       
    34 //       B brr;
       
    35 //     };
       
    36 
       
    37 
       
    38 int main(int, char **) {
       
    39 
       
    40   typedef ListGraph MutableGraph;
       
    41 
       
    42   //typedef SmartGraph Graph;
       
    43   typedef ListGraph Graph;
       
    44   typedef Graph::Node Node;
       
    45   typedef Graph::EdgeIt EdgeIt;
       
    46 
       
    47 
       
    48 //   Mize mize[10];
       
    49 //   Mize bize[0];
       
    50 //   Mize zize;
       
    51 //   typedef Mize Tize[0];
       
    52 
       
    53 //   std::cout << &zize << " " << sizeof(mize) << sizeof(Tize) << std::endl;
       
    54 //   std::cout << sizeof(bize) << std::endl;
       
    55 
       
    56 
       
    57 //   Huha<Tize> k;
       
    58 //   std::cout << sizeof(k) << std::endl;
       
    59 
       
    60 
       
    61 //   struct Bumm {
       
    62 //     //int a;
       
    63 //     bool b;
       
    64 //   };
       
    65 
       
    66 //   std::cout << sizeof(Bumm) << std::endl;
       
    67 
       
    68 
       
    69   Graph G;
       
    70   Node s, t;
       
    71   Graph::EdgeMap<int> cap(G);
       
    72   readDimacsMaxFlow(std::cin, G, s, t, cap);
       
    73 
       
    74 //   typedef TrivGraphWrapper<Graph> TGW;
       
    75 //   TGW gw(G);
       
    76 //   TGW::NodeIt sw;
       
    77 //   gw./*getF*/first(sw);
       
    78 //   std::cout << "p1:" << gw.nodeNum() << std::endl;
       
    79 //   gw.erase(sw);
       
    80 //   std::cout << "p2:" << gw.nodeNum() << std::endl;
       
    81 
       
    82 //   typedef const Graph cLG;
       
    83 //   typedef TrivGraphWrapper<const cLG> CTGW;
       
    84 //   CTGW cgw(G);
       
    85 //   CTGW::NodeIt csw;
       
    86 //   cgw./*getF*/first(csw);
       
    87 //   std::cout << "p1:" << cgw.nodeNum() << std::endl;
       
    88 //   //cgw.erase(csw);
       
    89 //   std::cout << "p2:" << cgw.nodeNum() << std::endl;
       
    90 
       
    91 
       
    92   {
       
    93     typedef TrivGraphWrapper<const Graph> GW;
       
    94     GW gw(G);
       
    95     std::cout << "edmonds karp demo (physical blocking flow augmentation)..." << std::endl;
       
    96     GW::EdgeMap<int> flow(gw); //0 flow
       
    97 
       
    98     Timer ts;
       
    99     ts.reset();
       
   100 
       
   101     typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW;
       
   102     EMW cw(cap);
       
   103     MaxFlow<GW, int, GW::EdgeMap<int>, EMW > max_flow_test(gw, s, t, flow, cw);
       
   104     int i=0;
       
   105     while (max_flow_test.augmentOnBlockingFlow<MutableGraph>()) { 
       
   106 //     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
       
   107 //       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   108 //     }
       
   109 //     std::cout<<std::endl;
       
   110       ++i; 
       
   111     }
       
   112 
       
   113 //   std::cout << "maximum flow: "<< std::endl;
       
   114 //   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
       
   115 //     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   116 //   }
       
   117 //   std::cout<<std::endl;
       
   118     std::cout << "elapsed time: " << ts << std::endl;
       
   119     std::cout << "number of augmentation phases: " << i << std::endl; 
       
   120     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
       
   121   }
       
   122 
       
   123   {
       
   124     typedef TrivGraphWrapper<const Graph> GW;
       
   125     GW gw(G);
       
   126     std::cout << "edmonds karp demo (physical blocking flow 1 augmentation)..." << std::endl;
       
   127     GW::EdgeMap<int> flow(gw); //0 flow
       
   128 
       
   129     Timer ts;
       
   130     ts.reset();
       
   131 
       
   132     typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW;
       
   133     EMW cw(cap);
       
   134     MaxFlow<GW, int, GW::EdgeMap<int>, EMW > max_flow_test(gw, s, t, flow, cw);
       
   135     int i=0;
       
   136     while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) { 
       
   137 //     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
       
   138 //       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   139 //     }
       
   140 //     std::cout<<std::endl;
       
   141       ++i; 
       
   142     }
       
   143 
       
   144 //   std::cout << "maximum flow: "<< std::endl;
       
   145 //   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
       
   146 //     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   147 //   }
       
   148 //   std::cout<<std::endl;
       
   149     std::cout << "elapsed time: " << ts << std::endl;
       
   150     std::cout << "number of augmentation phases: " << i << std::endl; 
       
   151     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
       
   152   }
       
   153 
       
   154   {
       
   155     typedef TrivGraphWrapper<const Graph> GW;
       
   156     GW gw(G);
       
   157     std::cout << "edmonds karp demo (on-the-fly blocking flow augmentation)..." << std::endl;
       
   158     GW::EdgeMap<int> flow(gw); //0 flow
       
   159 
       
   160     Timer ts;
       
   161     ts.reset();
       
   162 
       
   163     typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW;
       
   164     EMW cw(cap);
       
   165     MaxFlow<GW, int, GW::EdgeMap<int>, EMW > max_flow_test(gw, s, t, flow, cw);
       
   166     int i=0;
       
   167     while (max_flow_test.augmentOnBlockingFlow2()) { 
       
   168 //     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
       
   169 //       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   170 //     }
       
   171 //     std::cout<<std::endl;
       
   172       ++i; 
       
   173     }
       
   174 
       
   175 //   std::cout << "maximum flow: "<< std::endl;
       
   176 //   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
       
   177 //     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   178 //   }
       
   179 //   std::cout<<std::endl;
       
   180     std::cout << "elapsed time: " << ts << std::endl;
       
   181     std::cout << "number of augmentation phases: " << i << std::endl; 
       
   182     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
       
   183   }
       
   184 
       
   185   {
       
   186     typedef TrivGraphWrapper<const Graph> GW;
       
   187     GW gw(G);
       
   188     std::cout << "edmonds karp demo (on-the-fly shortest path augmentation)..." << std::endl;
       
   189     GW::EdgeMap<int> flow(gw); //0 flow
       
   190 
       
   191     Timer ts;
       
   192     ts.reset();
       
   193 
       
   194     typedef GW::EdgeMapWrapper< Graph::EdgeMap<int>, int > EMW;
       
   195     EMW cw(cap);
       
   196     MaxFlow<GW, int, GW::EdgeMap<int>, EMW> max_flow_test(gw, s, t, flow, cw);
       
   197     int i=0;
       
   198     while (max_flow_test.augmentOnShortestPath()) { 
       
   199 //     for(EdgeIt e=G.template first<EdgeIt>(); e.valid(); ++e) { 
       
   200 //       std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   201 //     }
       
   202 //     std::cout<<std::endl;
       
   203       ++i; 
       
   204     }
       
   205 
       
   206 //   std::cout << "maximum flow: "<< std::endl;
       
   207 //   for(EdgeIt e=G.first<EdgeIt>(); e.valid(); ++e) { 
       
   208 //     std::cout<<"("<<G.tail(e)<< "-"<<flow.get(e)<<"->"<<G.head(e)<<") ";
       
   209 //   }
       
   210 //   std::cout<<std::endl;
       
   211     std::cout << "elapsed time: " << ts << std::endl;
       
   212     std::cout << "number of augmentation phases: " << i << std::endl; 
       
   213     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl;
       
   214   }
       
   215 
       
   216 
       
   217   return 0;
       
   218 }