0
2
0
1 | 1 |
/* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 | 2 |
* |
3 | 3 |
* This file is a part of LEMON, a generic C++ optimization library. |
4 | 4 |
* |
5 | 5 |
* Copyright (C) 2003-2008 |
6 | 6 |
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 | 7 |
* (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 | 8 |
* |
9 | 9 |
* Permission to use, modify and distribute this software is granted |
10 | 10 |
* provided that this copyright notice appears in all copies. For |
11 | 11 |
* precise terms see the accompanying LICENSE file. |
12 | 12 |
* |
13 | 13 |
* This software is provided "AS IS" with no warranty of any kind, |
14 | 14 |
* express or implied, and with no claim as to its suitability for any |
15 | 15 |
* purpose. |
16 | 16 |
* |
17 | 17 |
*/ |
18 | 18 |
|
19 | 19 |
#include <iostream> |
20 | 20 |
#include <lemon/soplex.h> |
21 | 21 |
|
22 |
#include <soplex |
|
22 |
#include <soplex.h> |
|
23 | 23 |
|
24 | 24 |
|
25 | 25 |
///\file |
26 | 26 |
///\brief Implementation of the LEMON-SOPLEX lp solver interface. |
27 | 27 |
namespace lemon { |
28 | 28 |
|
29 | 29 |
SoplexLp::SoplexLp() { |
30 | 30 |
soplex = new soplex::SoPlex; |
31 | 31 |
} |
32 | 32 |
|
33 | 33 |
SoplexLp::~SoplexLp() { |
34 | 34 |
delete soplex; |
35 | 35 |
} |
36 | 36 |
|
37 | 37 |
SoplexLp::SoplexLp(const SoplexLp& lp) { |
38 | 38 |
rows = lp.rows; |
39 | 39 |
cols = lp.cols; |
40 | 40 |
|
41 | 41 |
soplex = new soplex::SoPlex; |
42 | 42 |
(*static_cast<soplex::SPxLP*>(soplex)) = *(lp.soplex); |
43 | 43 |
|
44 | 44 |
_col_names = lp._col_names; |
45 | 45 |
_col_names_ref = lp._col_names_ref; |
46 | 46 |
|
47 | 47 |
_row_names = lp._row_names; |
48 | 48 |
_row_names_ref = lp._row_names_ref; |
49 | 49 |
|
50 | 50 |
} |
51 | 51 |
|
52 | 52 |
void SoplexLp::_clear_temporals() { |
53 | 53 |
_primal_values.clear(); |
54 | 54 |
_dual_values.clear(); |
55 | 55 |
} |
56 | 56 |
|
57 | 57 |
SoplexLp* SoplexLp::_newSolver() const { |
58 | 58 |
SoplexLp* newlp = new SoplexLp(); |
59 | 59 |
return newlp; |
60 | 60 |
} |
61 | 61 |
|
62 | 62 |
SoplexLp* SoplexLp::_cloneSolver() const { |
63 | 63 |
SoplexLp* newlp = new SoplexLp(*this); |
64 | 64 |
return newlp; |
65 | 65 |
} |
66 | 66 |
|
67 | 67 |
const char* SoplexLp::_solverName() const { return "SoplexLp"; } |
68 | 68 |
|
69 | 69 |
int SoplexLp::_addCol() { |
70 | 70 |
soplex::LPCol c; |
71 | 71 |
c.setLower(-soplex::infinity); |
72 | 72 |
c.setUpper(soplex::infinity); |
73 | 73 |
soplex->addCol(c); |
74 | 74 |
|
75 | 75 |
_col_names.push_back(std::string()); |
76 | 76 |
|
77 | 77 |
return soplex->nCols() - 1; |
78 | 78 |
} |
79 | 79 |
|
80 | 80 |
int SoplexLp::_addRow() { |
81 | 81 |
soplex::LPRow r; |
82 | 82 |
r.setLhs(-soplex::infinity); |
83 | 83 |
r.setRhs(soplex::infinity); |
84 | 84 |
soplex->addRow(r); |
85 | 85 |
|
86 | 86 |
_row_names.push_back(std::string()); |
87 | 87 |
|
88 | 88 |
return soplex->nRows() - 1; |
89 | 89 |
} |
90 | 90 |
|
91 | 91 |
|
92 | 92 |
void SoplexLp::_eraseCol(int i) { |
93 | 93 |
soplex->removeCol(i); |
94 | 94 |
_col_names_ref.erase(_col_names[i]); |
95 | 95 |
_col_names[i] = _col_names.back(); |
96 | 96 |
_col_names_ref[_col_names.back()] = i; |
97 | 97 |
_col_names.pop_back(); |
98 | 98 |
} |
99 | 99 |
|
100 | 100 |
void SoplexLp::_eraseRow(int i) { |
101 | 101 |
soplex->removeRow(i); |
102 | 102 |
_row_names_ref.erase(_row_names[i]); |
103 | 103 |
_row_names[i] = _row_names.back(); |
104 | 104 |
_row_names_ref[_row_names.back()] = i; |
105 | 105 |
_row_names.pop_back(); |
106 | 106 |
} |
107 | 107 |
|
108 | 108 |
void SoplexLp::_eraseColId(int i) { |
109 | 109 |
cols.eraseIndex(i); |
110 | 110 |
cols.relocateIndex(i, cols.maxIndex()); |
111 | 111 |
} |
112 | 112 |
void SoplexLp::_eraseRowId(int i) { |
113 | 113 |
rows.eraseIndex(i); |
114 | 114 |
rows.relocateIndex(i, rows.maxIndex()); |
115 | 115 |
} |
116 | 116 |
|
117 | 117 |
void SoplexLp::_getColName(int c, std::string &name) const { |
118 | 118 |
name = _col_names[c]; |
1 | 1 |
AC_DEFUN([LX_CHECK_SOPLEX], |
2 | 2 |
[ |
3 | 3 |
AC_ARG_WITH([soplex], |
4 | 4 |
AS_HELP_STRING([--with-soplex@<:@=PREFIX@:>@], [search for SOPLEX under PREFIX or under the default search paths if PREFIX is not given @<:@default@:>@]) |
5 | 5 |
AS_HELP_STRING([--without-soplex], [disable checking for SOPLEX]), |
6 | 6 |
[], [with_soplex=yes]) |
7 | 7 |
|
8 | 8 |
AC_ARG_WITH([soplex-includedir], |
9 | 9 |
AS_HELP_STRING([--with-soplex-includedir=DIR], [search for SOPLEX headers in DIR]), |
10 | 10 |
[], [with_soplex_includedir=no]) |
11 | 11 |
|
12 | 12 |
AC_ARG_WITH([soplex-libdir], |
13 | 13 |
AS_HELP_STRING([--with-soplex-libdir=DIR], [search for SOPLEX libraries in DIR]), |
14 | 14 |
[], [with_soplex_libdir=no]) |
15 | 15 |
|
16 | 16 |
lx_soplex_found=no |
17 | 17 |
if test x"$with_soplex" != x"no"; then |
18 | 18 |
AC_MSG_CHECKING([for SOPLEX]) |
19 | 19 |
|
20 | 20 |
if test x"$with_soplex_includedir" != x"no"; then |
21 | 21 |
SOPLEX_CXXFLAGS="-I$with_soplex_includedir" |
22 | 22 |
elif test x"$with_soplex" != x"yes"; then |
23 |
SOPLEX_CXXFLAGS="-I$with_soplex/ |
|
23 |
SOPLEX_CXXFLAGS="-I$with_soplex/src" |
|
24 | 24 |
fi |
25 | 25 |
|
26 | 26 |
if test x"$with_soplex_libdir" != x"no"; then |
27 | 27 |
SOPLEX_LDFLAGS="-L$with_soplex_libdir" |
28 | 28 |
elif test x"$with_soplex" != x"yes"; then |
29 | 29 |
SOPLEX_LDFLAGS="-L$with_soplex/lib" |
30 | 30 |
fi |
31 | 31 |
SOPLEX_LIBS="-lsoplex -lz" |
32 | 32 |
|
33 | 33 |
lx_save_cxxflags="$CXXFLAGS" |
34 | 34 |
lx_save_ldflags="$LDFLAGS" |
35 | 35 |
lx_save_libs="$LIBS" |
36 | 36 |
CXXFLAGS="$SOPLEX_CXXFLAGS" |
37 | 37 |
LDFLAGS="$SOPLEX_LDFLAGS" |
38 | 38 |
LIBS="$SOPLEX_LIBS" |
39 | 39 |
|
40 | 40 |
lx_soplex_test_prog=' |
41 |
#include <soplex |
|
41 |
#include <soplex.h> |
|
42 | 42 |
|
43 | 43 |
int main(int argc, char** argv) |
44 | 44 |
{ |
45 | 45 |
soplex::SoPlex soplex; |
46 | 46 |
return 0; |
47 | 47 |
}' |
48 | 48 |
|
49 | 49 |
AC_LANG_PUSH(C++) |
50 | 50 |
AC_LINK_IFELSE([$lx_soplex_test_prog], [lx_soplex_found=yes], [lx_soplex_found=no]) |
51 | 51 |
AC_LANG_POP(C++) |
52 | 52 |
|
53 | 53 |
CXXFLAGS="$lx_save_cxxflags" |
54 | 54 |
LDFLAGS="$lx_save_ldflags" |
55 | 55 |
LIBS="$lx_save_libs" |
56 | 56 |
|
57 | 57 |
if test x"$lx_soplex_found" = x"yes"; then |
58 | 58 |
AC_DEFINE([HAVE_SOPLEX], [1], [Define to 1 if you have SOPLEX.]) |
59 | 59 |
lx_lp_found=yes |
60 | 60 |
AC_DEFINE([HAVE_LP], [1], [Define to 1 if you have any LP solver.]) |
61 | 61 |
AC_MSG_RESULT([yes]) |
62 | 62 |
else |
63 | 63 |
SOPLEX_CXXFLAGS="" |
64 | 64 |
SOPLEX_LDFLAGS="" |
65 | 65 |
SOPLEX_LIBS="" |
66 | 66 |
AC_MSG_RESULT([no]) |
67 | 67 |
fi |
68 | 68 |
fi |
69 | 69 |
SOPLEX_LIBS="$SOPLEX_LDFLAGS $SOPLEX_LIBS" |
70 | 70 |
AC_SUBST(SOPLEX_CXXFLAGS) |
71 | 71 |
AC_SUBST(SOPLEX_LIBS) |
72 | 72 |
AM_CONDITIONAL([HAVE_SOPLEX], [test x"$lx_soplex_found" = x"yes"]) |
73 | 73 |
]) |
0 comments (0 inline)