lemon/mip_cplex.cc~
changeset 2220 4473c872599a
equal deleted inserted replaced
0:c2b59f2e5a9b -1:000000000000
     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_CPLEX_CC
       
    20 #define LEMON_MIP_CPLEX_CC
       
    21 
       
    22 ///\file
       
    23 ///\brief Implementation of the LEMON-CPLEX mip solver interface.
       
    24 
       
    25 #include <lemon/mip_cplex.h>
       
    26 
       
    27 namespace lemon {
       
    28   
       
    29   MipCplex::MipCplex() {
       
    30     //This is unnecessary: setting integrality constraints on
       
    31     //variables will set this, too 
       
    32 
       
    33     ///\todo The constant CPXPROB_MIP is
       
    34     ///called CPXPROB_MILP in later versions
       
    35     CPXchgprobtype( env,  lp, CPXPROB_MIP);
       
    36   }
       
    37 
       
    38   void MipCplex::_colType(int i, MipCplex::ColTypes col_type){
       
    39 
       
    40     // Note If a variable is to be changed to binary, a call to CPXchgbds
       
    41     // should also be made to change the bounds to 0 and 1.
       
    42 
       
    43     int indices[1];
       
    44     indices[0]=i;
       
    45     char ctype[1];
       
    46     switch (col_type){
       
    47       case INTEGER:
       
    48 	ctype[0]=CPX_INTEGER;//'I'
       
    49 	break;
       
    50       case REAL:
       
    51 	ctype[0]=CPX_CONTINUOUS	;//'C'
       
    52 	break;
       
    53     default:;
       
    54         //FIXME problem
       
    55     }
       
    56     CPXchgctype (env, lp, 1, indices, ctype);
       
    57   }
       
    58   
       
    59   MipCplex::ColTypes MipCplex::_colType(int i){
       
    60     
       
    61     char ctype[1];
       
    62     status = CPXgetctype (env, lp, ctype, i, i);
       
    63     std::cout<<"Kukucska: "<<INTEGER<<std::endl;
       
    64     return REAL;
       
    65 //     switch (ctype[0]){
       
    66 
       
    67 //     case CPX_INTEGER:
       
    68 //       return INTEGER;
       
    69 //     case CPX_CONTINUOUS:
       
    70 //       return REAL;
       
    71 //     default:
       
    72 //       return REAL;//Error!
       
    73 //     }
       
    74 
       
    75   }
       
    76   
       
    77   LpCplex::SolveExitStatus MipCplex::_solve(){
       
    78 
       
    79     status = CPXmipopt (env, lp);
       
    80     if (status==0)
       
    81       return SOLVED;
       
    82     else
       
    83       return UNSOLVED;
       
    84 
       
    85   }
       
    86 
       
    87 
       
    88   LpCplex::SolutionStatus MipCplex::_getMipStatus(){
       
    89 
       
    90     int stat = CPXgetstat(env, lp);
       
    91 
       
    92     //Fortunately, MIP statuses did not change for cplex 8.0
       
    93     switch (stat)
       
    94     {
       
    95       case CPXMIP_OPTIMAL:
       
    96         return OPTIMAL;
       
    97 	//This also exists in later issues
       
    98 	//    case CPXMIP_UNBOUNDED:
       
    99         //return INFINITE;
       
   100       case CPXMIP_INFEASIBLE:
       
   101         return INFEASIBLE;
       
   102       default:
       
   103         return UNDEFINED;
       
   104     }
       
   105     //Unboundedness not treated well: the following is from cplex 9.0 doc
       
   106     // About Unboundedness
       
   107 
       
   108     // The treatment of models that are unbounded involves a few
       
   109     // subtleties. Specifically, a declaration of unboundedness means that
       
   110     // ILOG CPLEX has determined that the model has an unbounded
       
   111     // ray. Given any feasible solution x with objective z, a multiple of
       
   112     // the unbounded ray can be added to x to give a feasible solution
       
   113     // with objective z-1 (or z+1 for maximization models). Thus, if a
       
   114     // feasible solution exists, then the optimal objective is
       
   115     // unbounded. Note that ILOG CPLEX has not necessarily concluded that
       
   116     // a feasible solution exists. Users can call the routine CPXsolninfo
       
   117     // to determine whether ILOG CPLEX has also concluded that the model
       
   118     // has a feasible solution.
       
   119       
       
   120   }  
       
   121 
       
   122   MipCplex::Value MipCplex::_getPrimal(int i){
       
   123     Value x;
       
   124     CPXgetmipx(env, lp, &x, i, i);
       
   125     return x;
       
   126   }
       
   127   
       
   128   MipCplex::Value MipCplex::_getPrimalValue(){
       
   129     Value objval;
       
   130     status = CPXgetmipobjval(env, lp, &objval);
       
   131     return objval;
       
   132   }
       
   133 } //END OF NAMESPACE LEMON
       
   134 
       
   135 #endif //END OF MIP_CPLEX_CC