COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/mip_cplex.cc @ 2464:d4bdbc35c927

Last change on this file since 2464:d4bdbc35c927 was 2415:ef13597d249a, checked in by athos, 17 years ago

I only corrected bugs to make things compile: some featured not implemented here yet.

File size: 3.5 KB
Line 
1/* -*- C++ -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2007
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///\file
20///\brief Implementation of the LEMON-CPLEX mip solver interface.
21
22#include <lemon/mip_cplex.h>
23
24namespace lemon {
25 
26  MipCplex::MipCplex() {
27    //This is unnecessary: setting integrality constraints on
28    //variables will set this, too
29
30    ///\todo The constant CPXPROB_MIP is
31    ///called CPXPROB_MILP in later versions
32#if CPX_VERSION < 800
33    CPXchgprobtype( env,  lp, CPXPROB_MIP);
34#else
35    CPXchgprobtype( env,  lp, CPXPROB_MILP);
36#endif
37
38  }
39
40  void MipCplex::_colType(int i, MipCplex::ColTypes col_type){
41
42    // Note If a variable is to be changed to binary, a call to CPXchgbds
43    // should also be made to change the bounds to 0 and 1.
44
45    int indices[1];
46    indices[0]=i;
47    char ctype[1];
48    switch (col_type){
49      case INT:
50        ctype[0]=CPX_INTEGER;//'I'
51        break;
52      case REAL:
53        ctype[0]=CPX_CONTINUOUS ;//'C'
54        break;
55    default:;
56        //FIXME problem
57    }
58    CPXchgctype (env, lp, 1, indices, ctype);
59  }
60 
61  MipCplex::ColTypes MipCplex::_colType(int i) const {
62   
63    char ctype[1];
64    CPXgetctype (env, lp, ctype, i, i);
65    switch (ctype[0]){
66
67    case CPX_INTEGER:
68      return INT;
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() const {
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) const {
123    Value x;
124    CPXgetmipx(env, lp, &x, i, i);
125    return x;
126  }
127 
128  MipCplex::Value MipCplex::_getPrimalValue() const {
129    Value objval;
130    CPXgetmipobjval(env, lp, &objval);
131    return objval;
132  }
133} //END OF NAMESPACE LEMON
Note: See TracBrowser for help on using the repository browser.