lemon/lp_glpk.cc
changeset 2363 2aabce558574
parent 2349 c945f577a66d
child 2364 3a5e67bd42d2
equal deleted inserted replaced
21:c116e63ec880 22:a977216453ff
    22 #include <lemon/lp_glpk.h>
    22 #include <lemon/lp_glpk.h>
    23 //#include <iostream>
    23 //#include <iostream>
    24 namespace lemon {
    24 namespace lemon {
    25 
    25 
    26 
    26 
    27   LpGlpk::LpGlpk() : Parent(), 
    27   LpGlpk::LpGlpk() : Parent() {
    28 		     lp(lpx_create_prob()) {
    28     rows = _lp_bits::LpId(1);
    29     ///\todo constrol function for this:
    29     cols = _lp_bits::LpId(1);
       
    30     lp = lpx_create_prob();
       
    31     ///\todo control function for this:
    30     lpx_set_int_parm(lp, LPX_K_DUAL, 1);
    32     lpx_set_int_parm(lp, LPX_K_DUAL, 1);
    31     messageLevel(0);
    33     messageLevel(0);
    32   }
    34   }
    33   
    35   
    34   LpGlpk::LpGlpk(const LpGlpk &glp) : Parent(glp), 
    36   LpGlpk::LpGlpk(const LpGlpk &glp) : Parent() {
    35 				      lp(lpx_create_prob()) {
    37     rows = _lp_bits::LpId(1);
    36     ///\todo constrol function for this:
    38     cols = _lp_bits::LpId(1);
       
    39     lp = lpx_create_prob();
       
    40     ///\todo control function for this:
    37     lpx_set_int_parm(lp, LPX_K_DUAL, 1);
    41     lpx_set_int_parm(lp, LPX_K_DUAL, 1);
    38     messageLevel(0);
    42     messageLevel(0);
    39     //Coefficient matrix, row bounds
    43     //Coefficient matrix, row bounds
    40     lpx_add_rows(lp, lpx_get_num_rows(glp.lp));
    44     lpx_add_rows(lp, lpx_get_num_rows(glp.lp));
    41     lpx_add_cols(lp, lpx_get_num_cols(glp.lp));
    45     lpx_add_cols(lp, lpx_get_num_cols(glp.lp));
   347       default: ;
   351       default: ;
   348 	return INF;
   352 	return INF;
   349       }
   353       }
   350   }
   354   }
   351   
   355   
   352 //   void LpGlpk::_setRowLowerBound(int i, Value lo)
       
   353 //   {
       
   354 //     if (lo==INF) {
       
   355 //       //FIXME error
       
   356 //     }
       
   357 //     int b=lpx_get_row_type(lp, i);
       
   358 //     double up=lpx_get_row_ub(lp, i);	
       
   359 //     if (lo==-INF) {
       
   360 //       switch (b) {
       
   361 //       case LPX_FR:
       
   362 //       case LPX_LO:
       
   363 // 	lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
       
   364 // 	break;
       
   365 //       case LPX_UP:
       
   366 // 	break;
       
   367 //       case LPX_DB:
       
   368 //       case LPX_FX:
       
   369 // 	lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
       
   370 // 	break;
       
   371 //       default: ;
       
   372 // 	//FIXME error
       
   373 //       }
       
   374 //     } else {
       
   375 //       switch (b) {
       
   376 //       case LPX_FR:
       
   377 //       case LPX_LO:
       
   378 // 	lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
       
   379 // 	break;
       
   380 //       case LPX_UP:	  
       
   381 //       case LPX_DB:
       
   382 //       case LPX_FX:
       
   383 // 	if (lo==up) 
       
   384 // 	  lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
       
   385 // 	else 
       
   386 // 	  lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
       
   387 // 	break;
       
   388 //       default: ;
       
   389 // 	//FIXME error
       
   390 //       }
       
   391 //     }
       
   392 //   }
       
   393   
       
   394 //   void LpGlpk::_setRowUpperBound(int i, Value up)
       
   395 //   {
       
   396 //     if (up==-INF) {
       
   397 //       //FIXME error
       
   398 //     }
       
   399 //     int b=lpx_get_row_type(lp, i);
       
   400 //     double lo=lpx_get_row_lb(lp, i);
       
   401 //     if (up==INF) {
       
   402 //       switch (b) {
       
   403 //       case LPX_FR:
       
   404 //       case LPX_LO:
       
   405 // 	break;
       
   406 //       case LPX_UP:
       
   407 // 	lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
       
   408 // 	break;
       
   409 //       case LPX_DB:
       
   410 //       case LPX_FX:
       
   411 // 	lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
       
   412 // 	break;
       
   413 //       default: ;
       
   414 // 	//FIXME error
       
   415 //       }
       
   416 //     } else {
       
   417 //       switch (b) {
       
   418 //       case LPX_FR:
       
   419 // 	lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
       
   420 // 	break;
       
   421 //       case LPX_UP:
       
   422 // 	lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
       
   423 // 	break;
       
   424 //       case LPX_LO:
       
   425 //       case LPX_DB:
       
   426 //       case LPX_FX:
       
   427 // 	if (lo==up) 
       
   428 // 	  lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
       
   429 // 	else 
       
   430 // 	  lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
       
   431 // 	break;
       
   432 //       default: ;
       
   433 // 	//FIXME error
       
   434 //       }
       
   435 //     }
       
   436 //   }
       
   437 
       
   438   void LpGlpk::_setRowBounds(int i, Value lb, Value ub)
   356   void LpGlpk::_setRowBounds(int i, Value lb, Value ub)
   439   {
   357   {
   440     //Bad parameter
   358     //Bad parameter
   441     if (lb==INF || ub==-INF) {
   359     if (lb==INF || ub==-INF) {
   442       //FIXME error
   360       //FIXME error
   506   {
   424   {
   507     for (int i=0;i<=lpx_get_num_cols(lp);++i){
   425     for (int i=0;i<=lpx_get_num_cols(lp);++i){
   508       lpx_set_obj_coef(lp, i, 0);
   426       lpx_set_obj_coef(lp, i, 0);
   509     }
   427     }
   510   }
   428   }
   511 //   void LpGlpk::_setObj(int length,
       
   512 // 		       int  const * indices, 
       
   513 // 		       Value  const * values )
       
   514 //   {
       
   515 //     Value new_values[1+lpx_num_cols()];
       
   516 //     for (i=0;i<=lpx_num_cols();++i){
       
   517 //       new_values[i]=0;
       
   518 //     }
       
   519 //     for (i=1;i<=length;++i){
       
   520 //       new_values[indices[i]]=values[i];
       
   521 //     }
       
   522     
       
   523 //     for (i=0;i<=lpx_num_cols();++i){
       
   524 //       lpx_set_obj_coef(lp, i, new_values[i]);
       
   525 //     }
       
   526 //   }
       
   527 
   429 
   528   LpGlpk::SolveExitStatus LpGlpk::_solve()
   430   LpGlpk::SolveExitStatus LpGlpk::_solve()
   529   {
   431   {
   530     // A way to check the problem to be solved
   432     // A way to check the problem to be solved
   531     //lpx_write_cpxlp(lp,"naittvan.cpx");    
   433     //lpx_write_cpxlp(lp,"naittvan.cpx");    
   532 
   434 
       
   435     lpx_std_basis(lp);
   533     int i =  lpx_simplex(lp);
   436     int i =  lpx_simplex(lp);
       
   437     
   534     switch (i) {
   438     switch (i) {
   535     case LPX_E_OK: 
   439     case LPX_E_OK: 
   536       return SOLVED;
   440       return SOLVED;
   537     default:
   441     default:
   538       return UNSOLVED;
   442       return UNSOLVED;