lemon/mip_glpk.cc
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2213 2c094dfa176d
child 2253 1645f6cc9667
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

The tests have been modified to the current implementation
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_MIP_GLPK_CC
    20 #define LEMON_MIP_GLPK_CC
    21 
    22 ///\file
    23 ///\brief Implementation of the LEMON-GLPK mip solver interface.
    24 
    25 #include <lemon/mip_glpk.h>
    26 
    27 namespace lemon {
    28   
    29   MipGlpk::MipGlpk() {
    30     lpx_set_class(lp,LPX_MIP);
    31   }
    32 
    33   void MipGlpk::_colType(int i, MipGlpk::ColTypes col_type){
    34     switch (col_type){
    35       case LEMON_INTEGER:
    36 	lpx_set_col_kind(lp,i,LPX_IV);
    37 	break;
    38       case REAL:
    39 	lpx_set_col_kind(lp,i,LPX_CV);
    40 	break;
    41     default:;
    42         //FIXME problem
    43     }
    44   }
    45   
    46   MipGlpk::ColTypes MipGlpk::_colType(int i){
    47     switch (lpx_get_col_kind(lp,i)){
    48     case LPX_IV:
    49       return LEMON_INTEGER;//Or binary
    50     case LPX_CV:
    51       return REAL;
    52     default:
    53       return REAL;//Error!
    54     }
    55     
    56   }
    57   
    58   LpGlpk::SolveExitStatus MipGlpk::_solve(){
    59     int result = lpx_simplex(lp);
    60     //
    61     if (lpx_get_status(lp)==LPX_OPT){
    62       //Maybe we could try the routine lpx_intopt(lp), a revised
    63       //version of lpx_integer
    64       result = lpx_integer(lp);
    65       switch (result){
    66       case LPX_E_OK:
    67 	return SOLVED;
    68       default:
    69 	return UNSOLVED;
    70       }
    71       
    72     }
    73     return UNSOLVED;
    74   }
    75 
    76 
    77   LpGlpk::SolutionStatus MipGlpk::_getMipStatus(){
    78 
    79     if (lpx_get_status(lp)==LPX_OPT){
    80       //Meg kell nezni: ha az LP is infinite, akkor ez is, ha az is
    81       //infeasible, akkor ez is, de ez lehet maskepp is infeasible.
    82       int stat=  lpx_mip_status(lp);
    83       
    84       switch (stat) {
    85       case LPX_I_UNDEF://Undefined (no solve has been run yet)
    86 	return UNDEFINED;
    87       case LPX_I_NOFEAS://There is no feasible integral solution
    88 	return INFEASIBLE;
    89 	//     case LPX_UNBND://Unbounded
    90 	//       return INFINITE;
    91       case LPX_I_FEAS://Feasible
    92 	return FEASIBLE;
    93       case LPX_I_OPT://Feasible
    94 	return OPTIMAL;
    95       default:
    96       return UNDEFINED; //to avoid gcc warning
    97       //FIXME error
    98       }
    99     }
   100     else 
   101       return UNDEFINED; //Maybe we could refine this: what does the LP
   102 			//relaxation look like
   103       
   104   }  
   105 
   106   MipGlpk::Value MipGlpk::_getPrimal(int i){
   107     return lpx_mip_col_val(lp,i);
   108   }
   109   
   110   MipGlpk::Value MipGlpk::_getPrimalValue(){
   111     return lpx_mip_obj_val(lp);
   112   }
   113 } //END OF NAMESPACE LEMON
   114 
   115 #endif //END OF MIP_GLPK_CC