src/work/athos/lp/lp_cplex.cc
changeset 1365 c280de819a73
parent 1339 26a88d12d1a6
equal deleted inserted replaced
4:cc41a166edda -1:000000000000
     1 /* -*- C++ -*-
       
     2  * src/lemon/lp_cplex.cc
       
     3  * - Part of LEMON, a generic C++ optimization library
       
     4  *
       
     5  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     6  * (Egervary Research Group on Combinatorial Optimization, EGRES).
       
     7  *
       
     8  * Permission to use, modify and distribute this software is granted
       
     9  * provided that this copyright notice appears in all copies. For
       
    10  * precise terms see the accompanying LICENSE file.
       
    11  *
       
    12  * This software is provided "AS IS" with no warranty of any kind,
       
    13  * express or implied, and with no claim as to its suitability for any
       
    14  * purpose.
       
    15  *
       
    16  */
       
    17 
       
    18 #include"lp_cplex.h"
       
    19 
       
    20 ///\file
       
    21 ///\brief Implementation of the LEMON-CPLEX lp solver interface.
       
    22 namespace lemon {
       
    23   
       
    24   int LpCplex::_addCol()
       
    25   {
       
    26     int i = CPXgetnumcols (env, lp);
       
    27     Value lb[1],ub[1];
       
    28     lb[0]=-INF;//-CPX_INFBOUND;
       
    29     ub[0]=INF;//CPX_INFBOUND;
       
    30     status = CPXnewcols (env, lp, 1, NULL, lb, ub, NULL, NULL);
       
    31     return i;
       
    32   }
       
    33   
       
    34   int LpCplex::_addRow() 
       
    35   {
       
    36     //We want a ranged row
       
    37     char sense[1];
       
    38     sense[0]='R';
       
    39 
       
    40     int i = CPXgetnumrows (env, lp);
       
    41     status = CPXnewrows (env, lp, 1, NULL, sense, NULL, NULL);
       
    42     return i;
       
    43   }
       
    44   
       
    45   ///\warning Data at index 0 is ignored iin the arrays.
       
    46   void LpCplex::_setRowCoeffs(int i, 
       
    47 			      int length,
       
    48 			      int  const * indices, 
       
    49 			      Value  const * values )
       
    50   {
       
    51     int rowlist[length+1];
       
    52     int* p=rowlist;
       
    53     for (int k=1;k<=length;++k){
       
    54       rowlist[k]=i;
       
    55     }
       
    56     status = CPXchgcoeflist(env, lp, 
       
    57 			    length, 
       
    58 			    p++, 
       
    59 			    const_cast<int * >(indices++), 
       
    60 			    const_cast<Value * >(values++));
       
    61   }
       
    62   
       
    63   void LpCplex::_setColCoeffs(int i, 
       
    64 			      int length,
       
    65 			      int  const * indices, 
       
    66 			      Value  const * values)
       
    67   {
       
    68     int collist[length+1];
       
    69     int* p=collist;
       
    70     for (int k=1;k<=length;++k){
       
    71       collist[k]=i;
       
    72     }
       
    73     status = CPXchgcoeflist(env, lp, 
       
    74 			    length, 
       
    75 			    const_cast<int * >(indices++), 
       
    76 			    p++, 
       
    77 			    const_cast<Value * >(values++));
       
    78   }
       
    79   
       
    80   void LpCplex::_setColLowerBound(int i, Value value)
       
    81   {
       
    82     int indices[1];
       
    83     indices[0]=i;
       
    84     char lu[1];
       
    85     lu[0]='L';
       
    86     Value bd[1];
       
    87     bd[0]=value;
       
    88     status = CPXchgbds (env, lp, 1, indices, lu, bd);
       
    89  
       
    90   }
       
    91   
       
    92   void LpCplex::_setColUpperBound(int i, Value value)
       
    93   {
       
    94     int indices[1];
       
    95     indices[0]=i;
       
    96     char lu[1];
       
    97     lu[0]='U';
       
    98     Value bd[1];
       
    99     bd[0]=value;
       
   100     status = CPXchgbds (env, lp, 1, indices, lu, bd);
       
   101   }
       
   102   
       
   103   void LpCplex::_setRowLowerBound(int i, Value value)
       
   104   {
       
   105     status = CPXchgcoef (env, lp, i, -1, value);
       
   106 
       
   107   }
       
   108   
       
   109   void LpCplex::_setRowUpperBound(int i, Value value)
       
   110   {
       
   111     //TODO Ezt kell meg megirni
       
   112     //type of the problem
       
   113     char sense[1];
       
   114     status = CPXgetsense (env, lp, sense, i, i);
       
   115     Value rhs[1];
       
   116     status = CPXgetrhs (env, lp, rhs, i, i);
       
   117 
       
   118     switch (sense[0]) {
       
   119     case 'L'://<= constraint
       
   120       break;
       
   121     case 'E'://= constraint
       
   122       break;
       
   123     case 'G'://>= constraint
       
   124       break;
       
   125     case 'R'://ranged constraint
       
   126       break;
       
   127     default: ;
       
   128       //FIXME error
       
   129     }
       
   130 
       
   131     status = CPXchgcoef (env, lp, i, -2, value_rng);
       
   132   }
       
   133   
       
   134   void LpCplex::_setObjCoeff(int i, Value obj_coef)
       
   135   {
       
   136     status = CPXchgcoef (env, lp, -1, i, obj_coef);
       
   137    }
       
   138 
       
   139   LpCplex::SolveExitStatus LpCplex::_solve()
       
   140   {
       
   141     return SOLVED;
       
   142 //     int i=  lpx_simplex(lp);
       
   143 //     switch (i) {
       
   144 //     case LPX_E_OK: 
       
   145 //       return SOLVED;
       
   146 //       break;
       
   147 //     default:
       
   148 //       return UNSOLVED;
       
   149 //     }
       
   150   }
       
   151 
       
   152   LpCplex::Value LpCplex::_getPrimal(int i)
       
   153   {
       
   154     return 0;
       
   155   }
       
   156   
       
   157   LpCplex::Value LpCplex::_getPrimalValue()
       
   158   {
       
   159     return 0;
       
   160   }
       
   161   
       
   162  
       
   163   LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
       
   164   {
       
   165     return OPTIMAL;
       
   166 //     int stat=  lpx_get_status(lp);
       
   167 //     switch (stat) {
       
   168 //     case LPX_UNDEF://Undefined (no solve has been run yet)
       
   169 //       return UNDEFINED;
       
   170 //       break;
       
   171 //     case LPX_NOFEAS://There is no feasible solution (primal, I guess)
       
   172 //     case LPX_INFEAS://Infeasible 
       
   173 //       return INFEASIBLE;
       
   174 //       break;
       
   175 //     case LPX_UNBND://Unbounded
       
   176 //       return INFINITE;
       
   177 //       break;
       
   178 //     case LPX_FEAS://Feasible
       
   179 //       return FEASIBLE;
       
   180 //       break;
       
   181 //     case LPX_OPT://Feasible
       
   182 //       return OPTIMAL;
       
   183 //       break;
       
   184 //     default:
       
   185 //       return UNDEFINED; //to avoid gcc warning
       
   186 //       //FIXME error
       
   187 //     }
       
   188   }
       
   189 
       
   190 
       
   191   void LpCplex::_setMax()
       
   192   {
       
   193     CPXchgobjsen (env, lp, CPX_MAX);
       
   194    }
       
   195   void LpCplex::_setMin()
       
   196   {
       
   197     CPXchgobjsen (env, lp, CPX_MIN);
       
   198    }
       
   199   
       
   200 } //namespace lemon
       
   201