COIN-OR::LEMON - Graph Library

source: lemon/lemon/mip_cplex.cc @ 481:7afc121e0689

Last change on this file since 481:7afc121e0689 was 481:7afc121e0689, checked in by Balazs Dezso <deba@…>, 10 years ago

Port LP and MIP solvers from SVN -r3509 (#44)

File size: 3.8 KB
RevLine 
[481]1/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library.
4 *
5 * Copyright (C) 2003-2008
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
24extern "C" {
25#include <ilcplex/cplex.h>
26}
27
28namespace lemon {
29
30  MipCplex::MipCplex() {
31    //This is unnecessary: setting integrality constraints on
32    //variables will set this, too
33
34    ///\todo The constant CPXPROB_MIP is
35    ///called CPXPROB_MILP in later versions
36#if CPX_VERSION < 800
37    CPXchgprobtype( env,  lp, CPXPROB_MIP);
38#else
39    CPXchgprobtype( env,  lp, CPXPROB_MILP);
40#endif
41
42  }
43
44  void MipCplex::_colType(int i, MipCplex::ColTypes col_type){
45
46    // Note If a variable is to be changed to binary, a call to CPXchgbds
47    // should also be made to change the bounds to 0 and 1.
48
49    int indices[1];
50    indices[0]=i;
51    char ctype[1];
52    switch (col_type){
53      case INT:
54        ctype[0]=CPX_INTEGER;//'I'
55        break;
56      case REAL:
57        ctype[0]=CPX_CONTINUOUS        ;//'C'
58        break;
59    default:;
60        //FIXME problem
61    }
62    CPXchgctype (env, lp, 1, indices, ctype);
63  }
64
65  MipCplex::ColTypes MipCplex::_colType(int i) const {
66
67    char ctype[1];
68    CPXgetctype (env, lp, ctype, i, i);
69    switch (ctype[0]){
70
71    case CPX_INTEGER:
72      return INT;
73    case CPX_CONTINUOUS:
74      return REAL;
75    default:
76      return REAL;//Error!
77    }
78
79  }
80
81  LpCplex::SolveExitStatus MipCplex::_solve(){
82
83    status = CPXmipopt (env, lp);
84    if (status==0)
85      return SOLVED;
86    else
87      return UNSOLVED;
88
89  }
90
91
92  LpCplex::SolutionStatus MipCplex::_getMipStatus() const {
93
94    int stat = CPXgetstat(env, lp);
95
96    //Fortunately, MIP statuses did not change for cplex 8.0
97    switch (stat)
98    {
99      case CPXMIP_OPTIMAL:
100        // Optimal integer solution has been found.
101      case CPXMIP_OPTIMAL_TOL:
102        // Optimal soluton with the tolerance defined by epgap or epagap has
103        // been found.
104        return OPTIMAL;
105        //This also exists in later issues
106        //    case CPXMIP_UNBOUNDED:
107        //return INFINITE;
108      case CPXMIP_INFEASIBLE:
109        return INFEASIBLE;
110      default:
111        return UNDEFINED;
112    }
113    //Unboundedness not treated well: the following is from cplex 9.0 doc
114    // About Unboundedness
115
116    // The treatment of models that are unbounded involves a few
117    // subtleties. Specifically, a declaration of unboundedness means that
118    // ILOG CPLEX has determined that the model has an unbounded
119    // ray. Given any feasible solution x with objective z, a multiple of
120    // the unbounded ray can be added to x to give a feasible solution
121    // with objective z-1 (or z+1 for maximization models). Thus, if a
122    // feasible solution exists, then the optimal objective is
123    // unbounded. Note that ILOG CPLEX has not necessarily concluded that
124    // a feasible solution exists. Users can call the routine CPXsolninfo
125    // to determine whether ILOG CPLEX has also concluded that the model
126    // has a feasible solution.
127
128  }
129
130  MipCplex::Value MipCplex::_getPrimal(int i) const {
131    Value x;
132    CPXgetmipx(env, lp, &x, i, i);
133    return x;
134  }
135
136  MipCplex::Value MipCplex::_getPrimalValue() const {
137    Value objval;
138    CPXgetmipobjval(env, lp, &objval);
139    return objval;
140  }
141} //END OF NAMESPACE LEMON
Note: See TracBrowser for help on using the repository browser.