|     19 namespace lemon { |     19 namespace lemon { | 
|     20  |     20  | 
|     21   template<typename Edge, typename EdgeIndexMap>  |     21   template<typename Edge, typename EdgeIndexMap>  | 
|     22   class PrimalMap { |     22   class PrimalMap { | 
|     23   protected: |     23   protected: | 
|     24     LPSolverWrapper* lp; |     24     LPGLPK* lp; | 
|     25     EdgeIndexMap* edge_index_map; |     25     EdgeIndexMap* edge_index_map; | 
|     26   public: |     26   public: | 
|     27     PrimalMap(LPSolverWrapper& _lp, EdgeIndexMap& _edge_index_map) :  |     27     PrimalMap(LPGLPK& _lp, EdgeIndexMap& _edge_index_map) :  | 
|     28       lp(&_lp), edge_index_map(&_edge_index_map) { } |     28       lp(&_lp), edge_index_map(&_edge_index_map) { } | 
|     29     double operator[](Edge e) const {  |     29     double operator[](Edge e) const {  | 
|     30       return lp->getPrimal((*edge_index_map)[e]); |     30       return lp->getPrimal((*edge_index_map)[e]); | 
|     31     } |     31     } | 
|     32   }; |     32   }; | 
|    209 		 min_cost_flow.getFlow()[ewww]); |    209 		 min_cost_flow.getFlow()[ewww]); | 
|    210       } |    210       } | 
|    211       return (min_cost_flow.flowValue()>=expected); |    211       return (min_cost_flow.flowValue()>=expected); | 
|    212     } |    212     } | 
|    213     void runByLP() { |    213     void runByLP() { | 
|    214       typedef LPSolverWrapper LPSolver; |    214       typedef LPGLPK LPSolver; | 
|    215       LPSolver lp; |    215       LPSolver lp; | 
|    216       lp.setMinimize(); |    216       lp.setMinimize(); | 
|    217       typedef LPSolver::ColIt ColIt; |    217       typedef LPSolver::ColIt ColIt; | 
|    218       typedef LPSolver::RowIt RowIt; |    218       typedef LPSolver::RowIt RowIt; | 
|    219       typedef typename Graph::template EdgeMap<ColIt> EdgeIndexMap; |    219       typedef typename Graph::template EdgeMap<ColIt> EdgeIndexMap; | 
|    221       PrimalMap<typename Graph::Edge, EdgeIndexMap> lp_flow(lp, edge_index_map); |    221       PrimalMap<typename Graph::Edge, EdgeIndexMap> lp_flow(lp, edge_index_map); | 
|    222       for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) { |    222       for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) { | 
|    223 	ColIt col_it=lp.addCol(); |    223 	ColIt col_it=lp.addCol(); | 
|    224 	edge_index_map.set(e, col_it); |    224 	edge_index_map.set(e, col_it); | 
|    225 	if (lcapacity[e]==capacity[e]) |    225 	if (lcapacity[e]==capacity[e]) | 
|    226 	  lp.setColBounds(col_it, LPX_FX, lcapacity[e], capacity[e]); |    226 	  lp.setColBounds(col_it, LPSolver::FIXED, lcapacity[e], capacity[e]); | 
|    227 	else  |    227 	else  | 
|    228 	  lp.setColBounds(col_it, LPX_DB, lcapacity[e], capacity[e]); |    228 	  lp.setColBounds(col_it, LPSolver::DOUBLE, lcapacity[e], capacity[e]); | 
|    229 	lp.setObjCoef(col_it, cost[e]); |    229 	lp.setObjCoef(col_it, cost[e]); | 
|    230       } |    230       } | 
|    231       LPSolver::ColIt col_it; |    231       LPSolver::ColIt col_it; | 
|    232       for (lp.col_iter_map.first(col_it, lp.VALID_CLASS);  |    232       for (lp.col_iter_map.first(col_it, lp.VALID_CLASS);  | 
|    233 	   lp.col_iter_map.valid(col_it);  |    233 	   lp.col_iter_map.valid(col_it);  | 
|    234 	   lp.col_iter_map.next(col_it)) { |    234 	   lp.col_iter_map.next(col_it)) { | 
|    235 	std::cout << "ize " << lp.col_iter_map[col_it] << std::endl; |    235 //	std::cout << "ize " << lp.col_iter_map[col_it] << std::endl; | 
|    236       } |    236       } | 
|    237       for (typename Graph::NodeIt n(g); n!=INVALID; ++n) { |    237       for (typename Graph::NodeIt n(g); n!=INVALID; ++n) { | 
|    238 	typename Graph::template EdgeMap<Num> coeffs(g, 0); |    238 	typename Graph::template EdgeMap<Num> coeffs(g, 0); | 
|    239 	for (typename Graph::InEdgeIt e(g, n); e!=INVALID; ++e) |    239 	for (typename Graph::InEdgeIt e(g, n); e!=INVALID; ++e) | 
|    240 	coeffs.set(e, coeffs[e]+1); |    240 	coeffs.set(e, coeffs[e]+1); | 
|    248 	    //std::cout << " edge:" <<g.id(e)<<" "<<coeffs[e]; |    248 	    //std::cout << " edge:" <<g.id(e)<<" "<<coeffs[e]; | 
|    249 	    row.push_back(std::make_pair(edge_index_map[e], coeffs[e])); |    249 	    row.push_back(std::make_pair(edge_index_map[e], coeffs[e])); | 
|    250 	  } |    250 	  } | 
|    251 	} |    251 	} | 
|    252 	//std::cout << std::endl; |    252 	//std::cout << std::endl; | 
|    253 	std::cout << " " << g.id(n) << " " << row.size() << std::endl; |    253 	//std::cout << " " << g.id(n) << " " << row.size() << std::endl; | 
|    254 	lp.setRowCoeffs(row_it, row.begin(), row.end()); |    254 	lp.setRowCoeffs(row_it, row.begin(), row.end()); | 
|    255 	lp.setRowBounds(row_it, LPX_FX, 0.0, 0.0); |    255 	lp.setRowBounds(row_it, LPSolver::FIXED, 0.0, 0.0); | 
|    256       } |    256       } | 
|    257       lp.solveSimplex(); |    257       lp.solveSimplex(); | 
|    258       //std::cout << lp.colNum() << std::endl; |    258       //std::cout << lp.colNum() << std::endl; | 
|    259       //std::cout << lp.rowNum() << std::endl; |    259       //std::cout << lp.rowNum() << std::endl; | 
|    260       //std::cout << "flow value: "<< lp.getObjVal() << std::endl; |    260       //std::cout << "flow value: "<< lp.getObjVal() << std::endl; |