lemon/mip_glpk.cc
author deba
Thu, 14 Sep 2006 19:58:29 +0000
changeset 2217 4a10a45d55f6
parent 2185 e2bf51eab7f7
child 2218 50f1a780a5ff
permissions -rw-r--r--
Doc fix
     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_ILP_GLPK_CC
    20 #define LEMON_ILP_GLPK_CC
    21 
    22 ///\file
    23 ///\brief Implementation of the LEMON-GLPK lp 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 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 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 OG NAMESPACE LEMON
   114 
   115 #endif