]> git.pld-linux.org Git - packages/CoinOsi.git/commitdiff
- new
authorJakub Bogusz <qboosh@pld-linux.org>
Fri, 5 Dec 2014 18:14:47 +0000 (19:14 +0100)
committerJakub Bogusz <qboosh@pld-linux.org>
Fri, 5 Dec 2014 18:14:47 +0000 (19:14 +0100)
- glpk patch to update to current GLPK API

CoinOsi.spec [new file with mode: 0644]
Osi-destdir.patch [new file with mode: 0644]
Osi-glpk.patch [new file with mode: 0644]
Osi-link.patch [new file with mode: 0644]

diff --git a/CoinOsi.spec b/CoinOsi.spec
new file mode 100644 (file)
index 0000000..165312c
--- /dev/null
@@ -0,0 +1,280 @@
+# TODO: Cplex, Mosek, Xpress, Gurobi solvers (commercial)
+#
+# Conditional build:
+%bcond_without apidocs         # do not build and package API docs
+%bcond_without static_libs     # don't build static libraries
+%bcond_with    soplex          # Soplex solver support (academic use or commercial)
+#
+Summary:       COIN-OR Osi - Open Solver Interface library
+Summary(pl.UTF-8):     COIN-OR Osi (Open Solver Interface) - interfejs do rozwiązywania problemów matematycznych
+Name:          CoinOsi
+Version:       0.106.10
+Release:       1
+License:       Eclipse Public License v1.0
+Group:         Libraries
+Source0:       http://www.coin-or.org/download/source/Osi/Osi-%{version}.tgz
+# Source0-md5: 1a3d67fe4c9948286269e92a85c63b79
+Patch0:                Osi-glpk.patch
+Patch1:                Osi-destdir.patch
+Patch2:                Osi-link.patch
+URL:           https://projects.coin-or.org/Osi
+BuildRequires: CoinUtils-devel
+BuildRequires: autoconf >= 2.59
+BuildRequires: automake
+%{?with_apidocs:BuildRequires: doxygen}
+BuildRequires: glpk-devel
+BuildRequires: libstdc++-devel
+BuildRequires: libtool >= 2:1.5
+%{?with_soplex:BuildRequires:  soplex-devel}
+BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%description
+The COIN-OR Open Solver Interface library is a collection of solver
+interfaces (SIs) that provide a common interface - the OSI API - for
+all the supported solvers.
+
+%description -l pl.UTF-8
+Biblioteka COIN-OR Open Solver Interface to zbiór interfejsów do
+bibliotek rozwiązujących problemy matematyczne (Solver Interface)
+udostępniających wspólny interfejs (API OSI) dla wszystkich
+obsługiwanych bibliotek.
+
+%package devel
+Summary:       Header files for COIN-OR Osi library
+Summary(pl.UTF-8):     Pliki nagłówkowe biblioteki COIN-OR Osi
+Group:         Development/Libraries
+Requires:      %{name} = %{version}-%{release}
+Requires:      CoinUtils-devel
+
+%description devel
+Header files for COIN-OR Osi library.
+
+%description devel -l pl.UTF-8
+Pliki nagłówkowe biblioteki COIN-OR Osi.
+
+%package static
+Summary:       Static COIN-OR Osi library
+Summary(pl.UTF-8):     Statyczna biblioteka COIN-OR Osi
+Group:         Development/Libraries
+Requires:      %{name}-devel = %{version}-%{release}
+
+%description static
+Static COIN-OR Osi library.
+
+%description static -l pl.UTF-8
+Statyczna biblioteka COIN-OR Osi.
+
+%package apidocs
+Summary:       COIN-OR Osi API documentation
+Summary(pl.UTF-8):     Dokumentacja API biblioteki COIN-OR Osi
+Group:         Documentation
+
+%description apidocs
+API documentation for COIN-OR Osi library.
+
+%description apidocs -l pl.UTF-8
+Dokumentacja API biblioteki COIN-OR Osi.
+
+%package glpk
+Summary:       COIN-OR Open Solver Interface for GLPK
+Summary(pl.UTF-8):     Biblioteka COIN-OR Open Solver Interface dla GLPK
+Group:         Libraries
+Requires:      %{name} = %{version}-%{release}
+
+%description glpk
+COIN-OR Open Solver Interface for GLPK solver.
+
+%description glpk -l pl.UTF-8
+Biblioteka COIN-OR Open Solver Interface dla biblioteki rozwiązującej
+GLPK.
+
+%package glpk-devel
+Summary:       Development files for COIN-OR OsiGlpk library
+Summary(pl.UTF-8):     Pliki programistyczne biblioteki COIN-OR OsiGlpk
+Group:         Development/Libraries
+Requires:      %{name}-devel = %{version}-%{release}
+Requires:      %{name}-glpk = %{version}-%{release}
+Requires:      glpk-devel
+
+%description glpk-devel
+Development files for COIN-OR OsiGlpk library.
+
+%description glpk-devel -l pl.UTF-8
+Pliki programistyczne biblioteki COIN-OR OsiGlpk.
+
+%package glpk-static
+Summary:       Static COIN-OR OsiGlpk library
+Summary(pl.UTF-8):     Statyczna biblioteka COIN-OR OsiGlpk
+Group:         Development/Libraries
+Requires:      %{name}-glpk-devel = %{version}-%{release}
+
+%description glpk-static
+Static COIN-OR OsiGlpk library.
+
+%description glpk-static -l pl.UTF-8
+Statyczna biblioteka COIN-OR OsiGlpk.
+
+%package soplex
+Summary:       COIN-OR Open Solver Interface for Soplex
+Summary(pl.UTF-8):     Biblioteka COIN-OR Open Solver Interface dla biblioteki Soplex
+Group:         Libraries
+Requires:      %{name} = %{version}-%{release}
+
+%description soplex
+COIN-OR Open Solver Interface for Soplex solver.
+
+%description soplex -l pl.UTF-8
+Biblioteka COIN-OR Open Solver Interface dla biblioteki rozwiązującej
+Soplex.
+
+%package soplex-devel
+Summary:       Development files for COIN-OR OsiSpx library
+Summary(pl.UTF-8):     Pliki programistyczne biblioteki COIN-OR OsiSpx
+Group:         Development/Libraries
+Requires:      %{name}-devel = %{version}-%{release}
+Requires:      %{name}-soplex = %{version}-%{release}
+Requires:      soplex-devel
+
+%description soplex-devel
+Development files for COIN-OR OsiSpx library.
+
+%description soplex-devel -l pl.UTF-8
+Pliki programistyczne biblioteki COIN-OR OsiSpx.
+
+%package soplex-static
+Summary:       Static COIN-OR OsiSpx library
+Summary(pl.UTF-8):     Statyczna biblioteka COIN-OR OsiSpx
+Group:         Development/Libraries
+Requires:      %{name}-soplex-devel = %{version}-%{release}
+
+%description soplex-static
+Static COIN-OR OsiGlpk library.
+
+%description soplex-static -l pl.UTF-8
+Statyczna biblioteka COIN-OR OsiGlpk.
+
+%prep
+%setup -q -n Osi-%{version}
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+
+ln -s ../BuildTools Osi/BuildTools
+
+%build
+cd Osi
+%{__libtoolize}
+%{__aclocal} -I BuildTools
+%{__autoconf}
+%{__autoheader}
+%{__automake}
+cd ..
+%configure \
+       --enable-dependency-linking \
+       %{?with_static_libs:--enable-static} \
+       --with-coinutils-lib="-lCoinUtils" \
+       --with-coinutils-incdir="/usr/include/coin" \
+       --with-glpk-lib="-lglpk" \
+       --with-netlib-datadir="/usr/share/coin/Data/Netlib" \
+       --with-sample-datadir="/usr/share/coin/Data/Sample" \
+       %{?with_soplex:--with-soplex-lib="-lsoplex" --with-soplex-incdir="/usr/include/soplex"}
+
+%{__make}
+
+%if %{with apidocs}
+%{__make} doxydoc
+%endif
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%{__make} install \
+       DESTDIR=$RPM_BUILD_ROOT
+
+# obsoleted by pkg-config
+%{__rm} $RPM_BUILD_ROOT%{_libdir}/libOsi*.la
+# packages as %doc
+%{__rm} $RPM_BUILD_ROOT%{_datadir}/coin/doc/Osi/{AUTHORS,LICENSE,README}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post  -p /sbin/ldconfig
+%postun        -p /sbin/ldconfig
+
+%files
+%defattr(644,root,root,755)
+%doc Osi/{AUTHORS,CHANGELOG,LICENSE,README}
+%attr(755,root,root) %{_libdir}/libOsi.so.*.*.*
+%attr(755,root,root) %ghost %{_libdir}/libOsi.so.1
+%attr(755,root,root) %{_libdir}/libOsiCommonTests.so.*.*.*
+%attr(755,root,root) %ghost %{_libdir}/libOsiCommonTests.so.1
+
+%files devel
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libOsi.so
+%attr(755,root,root) %{_libdir}/libOsiCommonTests.so
+%{_includedir}/coin/OsiConfig.h
+%{_includedir}/coin/OsiAuxInfo.hpp
+%{_includedir}/coin/OsiBranchingObject.hpp
+%{_includedir}/coin/OsiChooseVariable.hpp
+%{_includedir}/coin/OsiColCut.hpp
+%{_includedir}/coin/OsiCollections.hpp
+%{_includedir}/coin/OsiCut.hpp
+%{_includedir}/coin/OsiCuts.hpp
+%{_includedir}/coin/OsiPresolve.hpp
+%{_includedir}/coin/OsiRowCut.hpp
+%{_includedir}/coin/OsiRowCutDebugger.hpp
+%{_includedir}/coin/OsiSolverBranch.hpp
+%{_includedir}/coin/OsiSolverInterface.hpp
+%{_includedir}/coin/OsiSolverParameters.hpp
+%{_includedir}/coin/OsiUnitTests.hpp
+%{_pkgconfigdir}/osi.pc
+%{_pkgconfigdir}/osi-unittests.pc
+%dir %{_datadir}/coin/doc/Osi
+%{_datadir}/coin/doc/Osi/osi_addlibs.txt
+
+%if %{with static_libs}
+%files static
+%defattr(644,root,root,755)
+%{_libdir}/libOsi.a
+%{_libdir}/libOsiCommonTests.a
+%endif
+
+%if %{with apidocs}
+%files apidocs
+%defattr(644,root,root,755)
+%doc doxydoc/html/*
+%endif
+
+%files glpk
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libOsiGlpk.so.*.*.*
+%attr(755,root,root) %ghost %{_libdir}/libOsiGlpk.so.1
+
+%files glpk-devel
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libOsiGlpk.so
+%{_includedir}/coin/OsiGlpkSolverInterface.hpp
+%{_pkgconfigdir}/osi-glpk.pc
+
+%files glpk-static
+%defattr(644,root,root,755)
+%{_libdir}/libOsiGlpk.a
+
+%if %{with soplex}
+%files soplex
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libOsiSpx.so.*.*.*
+%attr(755,root,root) %ghost %{_libdir}/libOsiSpx.so.1
+
+%files soplex-devel
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_libdir}/libOsiSpx.so
+%{_includedir}/coin/OsiSpxSolverInterface.hpp
+%{_pkgconfigdir}/osi-soplex.pc
+
+%files soplex-static
+%defattr(644,root,root,755)
+%{_libdir}/libOsiSpx.a
+%endif
diff --git a/Osi-destdir.patch b/Osi-destdir.patch
new file mode 100644 (file)
index 0000000..766113e
--- /dev/null
@@ -0,0 +1,11 @@
+--- Osi-0.106.10/Osi/Makefile.am.orig  2011-10-13 22:35:48.000000000 +0200
++++ Osi-0.106.10/Osi/Makefile.am       2014-12-04 18:37:38.506811310 +0100
+@@ -104,7 +104,7 @@
+ install-data-hook:
+       @$(mkdir_p) "$(addlibsdir)"
+ if COIN_HAS_PKGCONFIG
+-      PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ \
++      PKG_CONFIG_PATH="$$(echo @COIN_PKG_CONFIG_PATH@ | sed -e "s@^@$(DESTDIR)@;s@:@:$(DESTDIR)@g")" \
+       $(PKG_CONFIG) --libs osi > $(addlibsdir)/osi_addlibs.txt
+ else
+ if COIN_CXX_IS_CL
diff --git a/Osi-glpk.patch b/Osi-glpk.patch
new file mode 100644 (file)
index 0000000..746857b
--- /dev/null
@@ -0,0 +1,1525 @@
+--- Osi-0.106.10/Osi/src/OsiGlpk/OsiGlpkSolverInterface.cpp.orig       2013-04-06 14:50:19.000000000 +0200
++++ Osi-0.106.10/Osi/src/OsiGlpk/OsiGlpkSolverInterface.cpp    2014-12-04 17:58:31.036909826 +0100
+@@ -21,7 +21,7 @@
+ //    In (much) earlier versions of GLPK, if an LPX_MIP problem was
+ // changed back into a LPX_LP problem, then the MIP data was lost,
+ // including which columns are integer.  However, LPX_MIP problems
+-// still had access to LP information (like lpx_get_status).
++// still had access to LP information (like glp_get_status).
+ //
+ //    It appears that this behavior is no longer true in version 4.7.
+ // Therefore it may be worthwhile to adjust the interface to change
+@@ -166,26 +166,26 @@ void OGSI::initialSolve()
+ /*
+   Solve the lp.
+ */
+-  int err = lpx_simplex(model) ;
++  int err = glp_simplex(model, &simplexParams_) ;
+   // for Glpk, a solve fails if the initial basis is invalid or singular
+   // thus, we construct a (advanced) basis first and try again
+-#ifdef LPX_E_BADB
+-  if (err == LPX_E_BADB) {
+-    lpx_adv_basis(model);
+-    err = lpx_simplex(model) ;
++#ifdef GLP_EBADB
++  if (err == GLP_EBADB) {
++    glp_adv_basis(model, 0);
++    err = glp_simplex(model, &simplexParams_) ;
+   } else
+ #endif
+-  if (err == LPX_E_SING || err == LPX_E_FAULT) {
+-    lpx_adv_basis(model);
+-    err = lpx_simplex(model) ;
++  if (err == GLP_ESING || err == GLP_EFAIL) {
++    glp_adv_basis(model, 0);
++    err = glp_simplex(model, &simplexParams_) ;
+   }
+-  iter_used_ = lpx_get_int_parm(model, LPX_K_ITCNT) ;
++  iter_used_ = glp_get_it_cnt(model) ;
+ /*
+   Sort out the various state indications.
+-  When the presolver is turned on, lpx_simplex() will not be able to tell
++  When the presolver is turned on, glp_simplex() will not be able to tell
+   whether the objective function has hit it's upper or lower limit, and does
+   not return OBJLL or OBJUL. The code for these cases should be beefed up to
+   check the objective against the limit.
+@@ -204,39 +204,39 @@ void OGSI::initialSolve()
+   isObjUpperLimitReached_ = false ;
+   switch (err)
+-  { case LPX_E_OK:
++  { case 0:
+     { break ; }
+-    case LPX_E_ITLIM:
++    case GLP_EITLIM:
+     { isIterationLimitReached_ = true ;
+       break ; }
+-    case LPX_E_OBJLL:
++    case GLP_EOBJLL:
+     { isObjLowerLimitReached_ = true ;
+       break ; }
+-    case LPX_E_OBJUL:
++    case GLP_EOBJUL:
+     { isObjUpperLimitReached_ = true ;
+       break ; }
+-    case LPX_E_TMLIM:
++    case GLP_ETMLIM:
+     { isTimeLimitReached_ = true ;
+     } // no break here, so we still report abandoned
+-    case LPX_E_FAULT:
+-    case LPX_E_SING:
+-#ifdef LPX_E_BADB
+-    case LPX_E_BADB:
++    case GLP_EFAIL:
++    case GLP_ESING:
++#ifdef GLP_EBADB
++    case GLP_EBADB:
+ #endif
+     { isAbandoned_ = true ;
+       break ; }
+-    case LPX_E_NOPFS:
++    case GLP_ENOPFS:
+     { isPrimInfeasible_ = true ;
+       break ; }
+-    case LPX_E_NODFS:
++    case GLP_ENODFS:
+     { isDualInfeasible_ = true ;
+       break ; }
+     default:
+     { assert(false) ; } }
+     
+-  switch (lpx_get_status(model))
+-  { case LPX_OPT:
+-      case LPX_FEAS:
++  switch (glp_get_status(model))
++  { case GLP_OPT:
++      case GLP_FEAS:
+       { isFeasible_ = true ;
+               break ; }
+       default:
+@@ -261,23 +261,23 @@ void OGSI::resolve()
+   LPX *model = getMutableModelPtr() ;
+   freeCachedData(OGSI::FREECACHED_RESULTS) ;
+-  // lpx_simplex will use the current basis if possible
+-  int err = lpx_simplex(model) ;
++  // glp_simplex will use the current basis if possible
++  int err = glp_simplex(model, &simplexParams_) ;
+   // for Glpk, a solve fails if the initial basis is invalid or singular
+   // thus, we construct a (advanced) basis first and try again
+-#ifdef LPX_E_BADB
+-  if (err == LPX_E_BADB) {
+-    lpx_adv_basis(model);
+-    err = lpx_simplex(model) ;
++#ifdef GLP_EBADB
++  if (err == GLP_EBADB) {
++    glp_adv_basis(model, 0);
++    err = glp_simplex(model, &simplexParams_) ;
+   } else
+ #endif
+-  if (err == LPX_E_SING || err == LPX_E_FAULT) {
+-    lpx_adv_basis(model);
+-    err = lpx_simplex(model) ;
++  if (err == GLP_ESING || err == GLP_EFAIL) {
++    glp_adv_basis(model, 0);
++    err = glp_simplex(model, &simplexParams_) ;
+   }
+   
+-  iter_used_ = lpx_get_int_parm(model,LPX_K_ITCNT) ;
++  iter_used_ = glp_get_it_cnt(model) ;
+   isIterationLimitReached_ = false ;
+   isTimeLimitReached_ = false ;
+@@ -289,39 +289,39 @@ void OGSI::resolve()
+   isFeasible_ = false ;
+   switch (err)
+-  { case LPX_E_OK:
++  { case 0:
+     { break ; }
+-    case LPX_E_ITLIM:
++    case GLP_EITLIM:
+     { isIterationLimitReached_ = true ;
+       break ; }
+-    case LPX_E_OBJLL:
++    case GLP_EOBJLL:
+     { isObjLowerLimitReached_ = true ;
+       break ; }
+-    case LPX_E_OBJUL:
++    case GLP_EOBJUL:
+     { isObjUpperLimitReached_ = true ;
+       break ; }
+-    case LPX_E_TMLIM:
++    case GLP_ETMLIM:
+     { isTimeLimitReached_ = true ;
+     } // no break here, so we still report abandoned
+-    case LPX_E_FAULT:
+-    case LPX_E_SING:
+-#ifdef LPX_E_BADB
+-    case LPX_E_BADB:
++    case GLP_EFAIL:
++    case GLP_ESING:
++#ifdef GLP_EBADB
++    case GLP_EBADB:
+ #endif
+     { isAbandoned_ = true ;
+       break ; }
+-    case LPX_E_NOPFS:
++    case GLP_ENOPFS:
+     { isPrimInfeasible_ = true ;
+       break ; }
+-    case LPX_E_NODFS:
++    case GLP_ENODFS:
+     { isDualInfeasible_ = true ;
+       break ; }
+     default:
+     { assert(false) ; } }
+-  switch (lpx_get_status(model))
+-  { case LPX_OPT:
+-      case LPX_FEAS:
++  switch (glp_get_status(model))
++  { case GLP_OPT:
++      case GLP_FEAS:
+       { isFeasible_ = true ;
+               break ; }
+       default:
+@@ -337,7 +337,7 @@ void OGSI::resolve()
+ /*
+   Call glpk's built-in MIP solver. Any halfway recent version (from glpk 4.4,
+-  at least) will have lpx_intopt, a branch-and-cut solver. The presence of cut
++  at least) will have glp_intopt, a branch-and-cut solver. The presence of cut
+   generators is more recent.
+ */
+ void OGSI::branchAndBound ()
+@@ -351,52 +351,46 @@ void OGSI::branchAndBound ()
+   Assuming we have integer variables in the model, call the best MIP solver
+   we can manage.
+-  lpx_intopt does not require an optimal LP solution as a starting point, so
++  glp_intopt does not require an optimal LP solution as a starting point, so
+   we can call it directly.
+   lpx_integer needs an initial optimal solution to the relaxation.
+ */
+-  if (lpx_get_num_int(model))
+-  { int err = LPX_E_FAULT ;
++  if (glp_get_num_int(model))
++  { int err = GLP_EFAIL ;
+-#   ifdef GLPK_HAS_INTOPT
+-    err = lpx_intopt(model) ;
+-#   else
+-    if (lpx_get_status(model) != LPX_OPT)
+-    { initialSolve() ; }
+-    err = lpx_integer(model) ;
+-#   endif
++    err = glp_intopt(model, &intoptParams_) ;
+ /*
+   We have a result. What is it? Start with a positive attitude and revise as
+-  needed. The various LPX_E_* and LPX_I_* defines are stable back as far as
+-  glpk-4.4.
++  needed. The various GLP_E* and GLP_* defines are stable back as far as
++  glpk-4.5x.
+-  When we get LPX_E_OK (MIP terminated normally), we need to look more
+-  closely.  LPX_I_OPT indicates a proven optimal integer solution.
+-  LPX_I_NOFEAS indicates that there is no integer feasible solution.
+-  LPX_I_UNDEF says the MIP solution is undefined. LPX_I_FEAS says that in
++  When we get 0 (MIP terminated normally), we need to look more
++  closely.  GLP_OPT indicates a proven optimal integer solution.
++  GLP_NOFEAS indicates that there is no integer feasible solution.
++  GLP_UNDEF says the MIP solution is undefined. GLP_FEAS says that in
+   integer feasible solution was found but not proven optimal (termination of
+   search due to some limit is the common cause). It's not clear what to do
+-  with LPX_I_UNDEF; currently, it is not really reflected in
+-  termination status. LPX_I_FEAS is reflected by the OsiGlpk specific method
++  with GLP_UNDEF; currently, it is not really reflected in
++  termination status. GLP_FEAS is reflected by the OsiGlpk specific method
+   isFeasible().
+-  Various other codes are returned by lpx_intopt (lpx_integer returns a
+-  subset of these).  LPX_E_NOPFS (LPX_E_NODFS) indicate no primal (dual)
++  Various other codes are returned by glp_intopt (lpx_integer returns a
++  subset of these).  GLP_ENOPFS (GLP_ENODFS) indicate no primal (dual)
+   feasible solution; detected at the root, either by presolve or when
+-  attempting the root relaxation. LPX_E_ITLIM (LPX_E_TMLIM) indicate
++  attempting the root relaxation. GLP_EITLIM (GLP_ETMLIM) indicate
+   iteration (time) limit reached. Osi doesn't provide for time limit, so lump
+   it in with iteration limit (an arguable choice, but seems better than the
+   alternatives) and have extra method isTimeLimitReached().
+-  LPX_E_SING (lp solver failed due to singular basis) is
+-  legimately characterised as abandoned.  LPX_E_FAULT indicates a structural
++  GLP_ESING (lp solver failed due to singular basis) is
++  legimately characterised as abandoned.  GLP_EFAIL indicates a structural
+   problem (problem not of class MIP, or an integer variable has a non-integer
+   bound), which really translates into internal confusion in OsiGlpk.
+   Previous comments expressed uncertainty about the iteration count. This
+   should be checked at some point. -- lh, 070709 --
+ */
+-    iter_used_ = lpx_get_int_parm(model,LPX_K_ITCNT) ;
++    iter_used_ = glp_get_it_cnt(model) ;
+     isIterationLimitReached_ = false ;
+               isTimeLimitReached_ = false ;
+     isAbandoned_ = false ;
+@@ -407,45 +401,45 @@ void OGSI::branchAndBound ()
+     isObjUpperLimitReached_ = false ;
+     switch (err)
+-    { case LPX_E_OK:
+-#ifdef LPX_E_MIPGAP
+-    case LPX_E_MIPGAP:
++    { case 0:
++#ifdef GLP_EMIPGAP
++    case GLP_EMIPGAP:
+ #endif
+       { 
+       break ; }
+-      case LPX_E_NOPFS:
++      case GLP_ENOPFS:
+       { isPrimInfeasible_ = true ;
+       break ; }
+-      case LPX_E_NODFS:
++      case GLP_ENODFS:
+       { isDualInfeasible_ = true ;
+       break ; }
+-      case LPX_E_TMLIM:
++      case GLP_ETMLIM:
+       { isTimeLimitReached_ = true ; } // no break
+-      case LPX_E_ITLIM:
++      case GLP_EITLIM:
+       { isIterationLimitReached_ = true ;
+       break ; }
+-      case LPX_E_SING:
++      case GLP_ESING:
+       { isAbandoned_ = true ;
+       break ; }
+-      case LPX_E_FAULT:
++      case GLP_EFAIL:
+       { assert(false) ;
+       break ; }
+       default:
+       { assert(false) ;
+       break ; } }
+       
+-      //check this also if err!=LPX_E_OPT, so we know about feasibility in case time/resource limit is reached  
+-      int mip_status = lpx_mip_status(model) ;
++      //check this also if err!=GLP_OPT, so we know about feasibility in case time/resource limit is reached  
++      int mip_status = glp_mip_status(model) ;
+       switch (mip_status)
+-      { case LPX_I_OPT:
++      { case GLP_OPT:
+         { isFeasible_ = true ;
+               break ; }
+-        case LPX_I_NOFEAS:
++        case GLP_NOFEAS:
+         { isPrimInfeasible_ = true ;
+           break ; }
+-        case LPX_I_UNDEF:
++        case GLP_UNDEF:
+         { break ; }
+-        case LPX_I_FEAS:
++        case GLP_FEAS:
+         { isFeasible_ = true ;
+               break ; }
+         default:
+@@ -458,7 +452,7 @@ void OGSI::branchAndBound ()
+ /*
+   Not a MIP (no integer variables). Call the LP solver. Since we can call
+   branchAndBound with no initial LP solution, initialSolve is appropriate here.
+-  (But for glpk, it actually makes no difference --- lpx_simplex makes the
++  (But for glpk, it actually makes no difference --- glp_simplex makes the
+   decision on how to proceed.)
+ */
+   else
+@@ -490,7 +484,7 @@ bool OGSI::setIntParam (OsiIntParam key,
+   { case OsiMaxNumIteration:
+     { if (value >= 0)
+       { maxIteration_ = value ;
+-      lpx_set_int_parm(lp_,LPX_K_ITLIM,value) ;
++      simplexParams_.it_lim = value ;
+       retval = true ; }
+       else
+       { retval = false ; }
+@@ -531,24 +525,24 @@ bool OGSI::setDblParam (OsiDblParam key,
+     // as of 4.7, GLPK only uses this if it does dual simplex
+     { dualObjectiveLimit_ = value ;
+       if (getObjSense() == 1)                         // minimization
+-      { lpx_set_real_parm(lp_,LPX_K_OBJUL,value) ; }
++      { simplexParams_.obj_ul = value ; }
+       else                                            // maximization
+-      { lpx_set_real_parm(lp_,LPX_K_OBJLL,value) ; }
++      { simplexParams_.obj_ll = value ; }
+       retval = true ; 
+       break ; }
+     case OsiPrimalObjectiveLimit:
+     // as of 4.7, GLPK only uses this if it does dual simplex
+     { primalObjectiveLimit_ = value ;
+       if (getObjSense() == 1)
+-      { lpx_set_real_parm(lp_,LPX_K_OBJLL,value) ; }
++      { simplexParams_.obj_ll = value ; }
+       else
+-      { lpx_set_real_parm(lp_,LPX_K_OBJUL,value) ; }
++      { simplexParams_.obj_ul = value ; }
+       retval = true ; 
+       break ; }
+     case OsiDualTolerance:
+     { if (value >= 0 && value <= .001)
+       { dualTolerance_ = value;
+-      lpx_set_real_parm(lp_,LPX_K_TOLDJ,value) ;
++      simplexParams_.tol_dj = value ;
+       retval = true ; }
+       else
+       { retval = false ; }
+@@ -556,14 +550,14 @@ bool OGSI::setDblParam (OsiDblParam key,
+     case OsiPrimalTolerance:
+     { if (value >= 0 && value <= .001)
+       { primalTolerance_ = value ;
+-      lpx_set_real_parm(lp_,LPX_K_TOLBND,value) ;
++      simplexParams_.tol_bnd = value ;
+       retval = true ; }
+       else
+       { retval = false ; }
+       break ; }
+     case OsiObjOffset:
+     { objOffset_ = value ;
+-      lpx_set_obj_coef(lp_,0,value) ;
++      glp_set_obj_coef(lp_,0,value) ;
+       retval = true ;
+       break ; }
+     case OsiLastDblParam:
+@@ -583,7 +577,7 @@ bool OGSI::setStrParam (OsiStrParam key,
+     { probName_ = value ;
+       if (probName_.length() == 0)
+         probName_ = "Pb";
+-      lpx_set_prob_name(lp_,const_cast<char *>(value.c_str())) ;
++      glp_set_prob_name(lp_,const_cast<char *>(value.c_str())) ;
+       retval = true ;
+       break ; }
+     case OsiSolverName:
+@@ -665,18 +659,18 @@ bool OGSI::setHintParam (OsiHintParam ke
+     case OsiDoPresolveInInitial:
+     case OsiDoPresolveInResolve:
+     { if (sense == false)
+-      { if (strength >= OsiHintTry) lpx_set_int_parm(lp_,LPX_K_PRESOL,0) ; }
++      { if (strength >= OsiHintTry) simplexParams_.presolve = intoptParams_.presolve = 0 ; }
+       else
+-      { lpx_set_int_parm(lp_,LPX_K_PRESOL,1) ; }
++      { simplexParams_.presolve = intoptParams_.presolve = 1 ; }
+       retval = true ;
+       break ; }
+     case OsiDoDualInInitial:
+     case OsiDoDualInResolve:
+     { unimp_hint(msgHdl,false,sense,strength,"exclusive use of dual simplex") ;
+       if (sense == false)
+-      { if (strength >= OsiHintDo) lpx_set_int_parm(lp_,LPX_K_DUAL,0) ; }
++      { if (strength >= OsiHintDo) simplexParams_.meth = GLP_PRIMAL ; }
+       else
+-      { lpx_set_int_parm(lp_,LPX_K_DUAL,1) ; }
++      { simplexParams_.meth = GLP_DUALP ; }
+       retval = true ;
+       break ; }
+     case OsiDoCrash:
+@@ -692,9 +686,10 @@ bool OGSI::setHintParam (OsiHintParam ke
+ */
+     case OsiDoScale:
+     { if (sense == false)
+-      { if (strength >= OsiHintTry) lpx_set_int_parm(lp_,LPX_K_SCALE,0) ; }
++      { if (strength >= OsiHintTry) scaleFlags_ = 0 ; }
+       else
+-      { lpx_set_int_parm(lp_,LPX_K_SCALE,3) ; }
++      { scaleFlags_ = GLP_SF_GM | GLP_SF_EQ ; }
++      glp_scale_prob(lp_, scaleFlags_);
+       retval = true ;
+       break ; }
+ /*
+@@ -704,15 +699,15 @@ bool OGSI::setHintParam (OsiHintParam ke
+     case OsiDoReducePrint:
+     { if (sense == true)
+       { if (strength <= OsiHintTry)
+-      { lpx_set_int_parm(lp_,LPX_K_MSGLEV,1) ; }
++      { simplexParams_.msg_lev = intoptParams_.msg_lev = GLP_MSG_ERR ; }
+       else
+-      { lpx_set_int_parm(lp_,LPX_K_MSGLEV,0) ; } }
++      { simplexParams_.msg_lev = intoptParams_.msg_lev = GLP_MSG_OFF ; } }
+       else
+       { if (strength <= OsiHintTry)
+-      { lpx_set_int_parm(lp_,LPX_K_MSGLEV,2) ; }
++      { simplexParams_.msg_lev = intoptParams_.msg_lev = GLP_MSG_ON ; }
+       else
+-      { lpx_set_int_parm(lp_,LPX_K_MSGLEV,3) ; } }
+-      int logLevel = lpx_get_int_parm(lp_,LPX_K_MSGLEV) ;
++      { simplexParams_.msg_lev = intoptParams_.msg_lev = GLP_MSG_ALL ; } }
++      int logLevel = simplexParams_.msg_lev ;
+       messageHandler()->setLogLevel(logLevel) ;
+       retval = true ;
+       break ; }
+@@ -787,7 +782,7 @@ OGSI::getDblParam( OsiDblParam key, doub
+               break;
+     case OsiObjOffset:
+-                value = lpx_get_obj_coef(getMutableModelPtr(),0);
++                value = glp_get_obj_coef(getMutableModelPtr(),0);
+               retval = true;
+               break;
+@@ -805,7 +800,7 @@ OGSI::getStrParam(OsiStrParam key, std::
+   //  bool retval = false;
+   switch (key) {
+   case OsiProbName:
+-    value = lpx_get_prob_name( getMutableModelPtr() );
++    value = glp_get_prob_name( getMutableModelPtr() );
+     break;
+   case OsiSolverName:
+     value = "glpk";
+@@ -830,13 +825,13 @@ bool OGSI::isProvenOptimal() const
+       if( bbWasLast_ == 0 )
+         {
+-          int stat = lpx_get_status( model );
+-          return stat == LPX_OPT;
++          int stat = glp_get_status( model );
++          return stat == GLP_OPT;
+         }
+       else
+         {
+-          int stat = lpx_mip_status( model );
+-          return stat == LPX_I_OPT;
++          int stat = glp_mip_status( model );
++          return stat == GLP_OPT;
+         }
+ }
+@@ -848,9 +843,9 @@ bool OGSI::isProvenPrimalInfeasible() co
+               return true;
+       if( bbWasLast_ == 0 )
+-              return lpx_get_prim_stat( model ) == LPX_P_NOFEAS;
++              return glp_get_prim_stat( model ) == GLP_NOFEAS;
+       else
+-              return lpx_mip_status( model ) == LPX_I_NOFEAS;
++              return glp_mip_status( model ) == GLP_NOFEAS;
+ }
+ bool OGSI::isProvenDualInfeasible() const
+@@ -861,7 +856,7 @@ bool OGSI::isProvenDualInfeasible() cons
+               return true;
+       if( bbWasLast_ == 0 )
+-              return lpx_get_dual_stat( model ) == LPX_D_NOFEAS;
++              return glp_get_dual_stat( model ) == GLP_NOFEAS;
+       else
+         // Not sure what to do for MIPs;  does it just mean unbounded?
+         // ??? for now, return false
+@@ -933,7 +928,7 @@ bool OGSI::isFeasible() const
+ /*
+   Return a warm start object matching the current state of the solver.
+-  Nonbasic fixed variables (LPX_NS) are translated to CWSB::atLowerBound.
++  Nonbasic fixed variables (GLP_NS) are translated to CWSB::atLowerBound.
+ */
+ CoinWarmStart *OGSI::getWarmStart() const
+@@ -953,19 +948,19 @@ CoinWarmStart *OGSI::getWarmStart() cons
+    and  Glpk's at-upper-bound will be mapped to Osi's at-lower-bound. 
+ */
+   for (int i = 0 ; i < numrows ; i++)
+-  { int stati = lpx_get_row_stat(lp_,i+1) ;
++  { int stati = glp_get_row_stat(lp_,i+1) ;
+     switch (stati)
+-    { case LPX_BS:
++    { case GLP_BS:
+       { ws->setArtifStatus(i,CoinWarmStartBasis::basic) ;
+       break ; }
+-      case LPX_NS:
+-      case LPX_NL:
++      case GLP_NS:
++      case GLP_NL:
+       { ws->setArtifStatus(i,CoinWarmStartBasis::atUpperBound) ;
+       break ; }
+-      case LPX_NU:
++      case GLP_NU:
+       { ws->setArtifStatus(i,CoinWarmStartBasis::atLowerBound) ;
+       break ; }
+-      case LPX_NF:
++      case GLP_NF:
+       { ws->setArtifStatus(i,CoinWarmStartBasis::isFree) ;
+       break ; }
+       default:
+@@ -975,19 +970,19 @@ CoinWarmStart *OGSI::getWarmStart() cons
+   And repeat for the columns.
+ */
+   for (int j = 0 ; j < numcols ; j++)
+-  { int statj = lpx_get_col_stat(lp_,j+1) ;
++  { int statj = glp_get_col_stat(lp_,j+1) ;
+     switch (statj)
+-    { case LPX_BS:
++    { case GLP_BS:
+       { ws->setStructStatus(j,CoinWarmStartBasis::basic) ;
+       break ; }
+-      case LPX_NS:
+-      case LPX_NL:
++      case GLP_NS:
++      case GLP_NL:
+       { ws->setStructStatus(j,CoinWarmStartBasis::atLowerBound) ;
+       break ; }
+-      case LPX_NU:
++      case GLP_NU:
+       { ws->setStructStatus(j,CoinWarmStartBasis::atUpperBound) ;
+       break ; }
+-      case LPX_NF:
++      case GLP_NF:
+       { ws->setStructStatus(j,CoinWarmStartBasis::isFree) ;
+       break ; }
+       default:
+@@ -1040,44 +1035,44 @@ bool OGSI::setWarmStart (const CoinWarmS
+     switch (ws->getArtifStatus(i))
+     { case CoinWarmStartBasis::basic:
+-      { stati = LPX_BS ;
++      { stati = GLP_BS ;
+       break ; }
+       case CoinWarmStartBasis::atLowerBound:
+-      { stati = LPX_NU ;
++      { stati = GLP_NU ;
+       break ; }
+       case CoinWarmStartBasis::atUpperBound:
+-      { stati = LPX_NL ;
++      { stati = GLP_NL ;
+       break ; }
+       case CoinWarmStartBasis::isFree:
+-      { stati = LPX_NF ;
++      { stati = GLP_NF ;
+       break ; }
+       default:
+       { assert(false) ;
+       return (false) ; } }            
+-    lpx_set_row_stat(lp_,i+1,stati) ; }
++    glp_set_row_stat(lp_,i+1,stati) ; }
+   
+   for (int j = 0 ; j < numcols ; j++)
+   { int statj ;
+     switch (ws->getStructStatus(j))
+     { case CoinWarmStartBasis::basic:
+-      { statj = LPX_BS ;
++      { statj = GLP_BS ;
+       break ; }
+       case CoinWarmStartBasis::atLowerBound:
+-      { statj = LPX_NL ;
++      { statj = GLP_NL ;
+       break ; }
+       case CoinWarmStartBasis::atUpperBound:
+-      { statj = LPX_NU ;
++      { statj = GLP_NU ;
+       break ; }
+       case CoinWarmStartBasis::isFree:
+-      { statj = LPX_NF ;
++      { statj = GLP_NF ;
+       break ; }
+       default:
+       { assert(false) ;
+       return (false) ; } }
+-    lpx_set_col_stat(lp_,j+1,statj) ; }
++    glp_set_col_stat(lp_,j+1,statj) ; }
+   return (true) ; }
+@@ -1108,9 +1103,9 @@ void OGSI::markHotStart()
+               int stat;
+               double val;
+               double dualVal;
+-              stat=lpx_get_col_stat(model,j);
+-              val=lpx_get_col_prim(model,j);
+-              dualVal=lpx_get_col_dual(model,j);
++              stat=glp_get_col_stat(model,j);
++              val=glp_get_col_prim(model,j);
++              dualVal=glp_get_col_dual(model,j);
+               hotStartCStat_[j] = stat;
+               hotStartCVal_[j] = val;
+               hotStartCDualVal_[j] = dualVal;
+@@ -1131,9 +1126,9 @@ void OGSI::markHotStart()
+               int stat;
+               double val;
+               double dualVal;
+-              stat=lpx_get_row_stat(model,i+1);
+-              val=lpx_get_row_prim(model,i+1);
+-              dualVal=lpx_get_row_dual(model,i+1);
++              stat=glp_get_row_stat(model,i+1);
++              val=glp_get_row_prim(model,i+1);
++              dualVal=glp_get_row_dual(model,i+1);
+               hotStartRStat_[i] = stat;
+               hotStartRVal_[i] = val;
+               hotStartRDualVal_[i] = dualVal;
+@@ -1160,11 +1155,11 @@ void OGSI::solveFromHotStart()
+       int j;
+       for( j = 0; j < numcols; j++ ) {
+-        lpx_set_col_stat( model, j+1, hotStartCStat_[j]);
++        glp_set_col_stat( model, j+1, hotStartCStat_[j]);
+       }
+       int i;
+       for( i = 0; i < numrows; i++ ) {
+-        lpx_set_row_stat( model, i+1, hotStartRStat_[i]);
++        glp_set_row_stat( model, i+1, hotStartRStat_[i]);
+       }
+       freeCachedData( OGSI::FREECACHED_RESULTS );
+@@ -1191,17 +1186,17 @@ void OGSI::unmarkHotStart()
+ //-----------------------------------------------------------------------------
+ int OGSI::getNumCols() const
+ {
+-      return lpx_get_num_cols( getMutableModelPtr() );
++      return glp_get_num_cols( getMutableModelPtr() );
+ }
+ int OGSI::getNumRows() const
+ {
+-      return lpx_get_num_rows( getMutableModelPtr() );
++      return glp_get_num_rows( getMutableModelPtr() );
+ }
+ int OGSI::getNumElements() const
+ {
+-      return lpx_get_num_nz( getMutableModelPtr() );
++      return glp_get_num_nz( getMutableModelPtr() );
+ }
+ //-----------------------------------------------------------------------------
+@@ -1230,26 +1225,26 @@ const double * OGSI::getColLower() const
+                       int type;
+                       double lb;
+                       double ub;
+-                      type=lpx_get_col_type(model,i+1);
+-                      lb=lpx_get_col_lb(model,i+1);
+-                      ub=lpx_get_col_ub(model,i+1);
++                      type=glp_get_col_type(model,i+1);
++                      lb=glp_get_col_lb(model,i+1);
++                      ub=glp_get_col_ub(model,i+1);
+                       switch ( type )
+                       {
+-                      case LPX_FR:
++                      case GLP_FR:
+                               lb = -inf;
+                               ub = inf;
+                               break;
+-                      case LPX_LO:
++                      case GLP_LO:
+                               ub = inf;
+                               break;
+-                      case LPX_UP:
++                      case GLP_UP:
+                               lb = -inf;
+                               break;
+-                      case LPX_FX:
+-                      case LPX_DB:
++                      case GLP_FX:
++                      case GLP_DB:
+                               break;
+                       default:
+@@ -1355,26 +1350,26 @@ const double * OGSI::getRowLower() const
+                       int type;
+                       double lb;
+                       double ub;
+-                      type=lpx_get_row_type(model,i+1);
+-                      lb=lpx_get_row_lb(model,i+1);
+-                      ub=lpx_get_row_ub(model,i+1);
++                      type=glp_get_row_type(model,i+1);
++                      lb=glp_get_row_lb(model,i+1);
++                      ub=glp_get_row_ub(model,i+1);
+                       switch( type )
+                       {
+-                      case LPX_FR:
++                      case GLP_FR:
+                               lb = -inf;
+                               ub = inf;
+                               break;
+-                      case LPX_LO:
++                      case GLP_LO:
+                               ub = inf;
+                               break;
+-                      case LPX_UP:
++                      case GLP_UP:
+                               lb = -inf;
+                               break;
+-                      case LPX_DB:
+-                      case LPX_FX:
++                      case GLP_DB:
++                      case GLP_FX:
+                               break;
+                       default:
+@@ -1416,7 +1411,7 @@ const double * OGSI::getObjCoefficients(
+               int i;
+               for( i = 0; i < numcols; i++ )
+               {
+-                      obj_[i] = lpx_get_obj_coef( model, i + 1);
++                      obj_[i] = glp_get_obj_coef( model, i + 1);
+               }
+       }
+       return obj_;
+@@ -1426,10 +1421,10 @@ const double * OGSI::getObjCoefficients(
+ double OGSI::getObjSense() const
+-{ if (lpx_get_obj_dir(lp_) == LPX_MIN)
++{ if (glp_get_obj_dir(lp_) == GLP_MIN)
+   { return (+1.0) ; }
+   else
+-  if (lpx_get_obj_dir(lp_) == LPX_MAX)
++  if (glp_get_obj_dir(lp_) == GLP_MAX)
+   { return (-1.0) ; }
+   else        // internal confusion
+   { assert(false) ;
+@@ -1441,7 +1436,7 @@ double OGSI::getObjSense() const
+ bool OGSI::isContinuous( int colNumber ) const
+ {
+-  return lpx_get_col_kind( getMutableModelPtr(), colNumber+1 ) == LPX_CV;
++  return glp_get_col_kind( getMutableModelPtr(), colNumber+1 ) == GLP_CV;
+ }
+ //-----------------------------------------------------------------------------
+@@ -1464,14 +1459,14 @@ const CoinPackedMatrix * OGSI::getMatrix
+               int i;
+               for( i = 0; i < getNumRows(); i++ )
+               {
+-                      int colsize = lpx_get_mat_row( model, i+1, colind, colelem);
++                      int colsize = glp_get_mat_row( model, i+1, colind, colelem);
+                       int j;
+                       for( j = 1; j <= colsize; j++ )
+                       {
+                               --colind[j];
+                       }
+-                      // Note:  lpx_get_mat_row apparently may return the
++                      // Note:  glp_get_mat_row apparently may return the
+                       // elements in decreasing order.  This differs from
+                       // people's standard expectations but is not an error.
+@@ -1502,7 +1497,7 @@ const CoinPackedMatrix * OGSI::getMatrix
+               int j;
+               for( j = 0; j < getNumCols(); j++ )
+               {
+-                      int rowsize = lpx_get_mat_col( model, j+1, rowind, rowelem);
++                      int rowsize = glp_get_mat_col( model, j+1, rowind, rowelem);
+                       int i;
+                       for( i = 1; i <= rowsize; i++ )
+                       {
+@@ -1563,9 +1558,9 @@ const double *OGSI::getColSolution() con
+ */
+   int probStatus ;
+   if (bbWasLast_)
+-  { probStatus = lpx_mip_status(lp_) ; }
++  { probStatus = glp_mip_status(lp_) ; }
+   else
+-  { probStatus = lpx_get_status(lp_) ; }
++  { probStatus = glp_get_status(lp_) ; }
+ /*
+   If the problem hasn't been solved, glpk returns zeros, but OSI requires that
+   the solution be within bound. getColLower() will ensure both upper and lower
+@@ -1573,7 +1568,7 @@ const double *OGSI::getColSolution() con
+   collower[j] < colupper[j]). Solution values will be 0.0 unless that's outside
+   the bounds.
+ */
+-  if (probStatus == LPX_UNDEF || probStatus == LPX_I_UNDEF)
++  if (probStatus == GLP_UNDEF)
+   { getColLower() ;
+     int j ;
+     for (j = 0 ; j < numcols ; j++)
+@@ -1591,10 +1586,10 @@ const double *OGSI::getColSolution() con
+   if (bbWasLast_ == 0)
+   { int j ;
+     for (j = 0 ; j < numcols ; j++)
+-    { colsol_[j] = lpx_get_col_prim(lp_,j+1) ;
++    { colsol_[j] = glp_get_col_prim(lp_,j+1) ;
+       if (fabs(colsol_[j]) < GlpkZeroTol)
+       { colsol_[j] = 0.0 ; }
+-      redcost_[j] = lpx_get_col_dual(lp_,j+1) ;
++      redcost_[j] = glp_get_col_dual(lp_,j+1) ;
+       if (fabs(redcost_[j]) < GlpkZeroTol)
+       { redcost_[j] = 0.0 ; } } }
+ /*
+@@ -1604,7 +1599,7 @@ const double *OGSI::getColSolution() con
+   else
+   { int j ;
+     for (j = 0 ; j < numcols ; j++)
+-    { colsol_[j] = lpx_mip_col_val(lp_,j+1) ;
++    { colsol_[j] = glp_mip_col_val(lp_,j+1) ;
+       if (fabs(colsol_[j]) < GlpkZeroTol)
+       { colsol_[j] = 0.0 ; }
+       redcost_[j] = 0.0 ; } }
+@@ -1641,7 +1636,7 @@ const double *OGSI::getRowPrice() const
+   if (bbWasLast_ == 0)
+   { int i ;
+     for (i = 0 ; i < numrows; i++)
+-    { rowsol_[i] = lpx_get_row_dual(lp_,i+1) ;
++    { rowsol_[i] = glp_get_row_dual(lp_,i+1) ;
+       if (fabs(rowsol_[i]) < GlpkZeroTol)
+       { rowsol_[i] = 0.0 ; } } }
+   else
+@@ -1658,7 +1653,7 @@ const double *OGSI::getRowPrice() const
+   setRowPrice(), and it'd be nice to return reduced costs that agree with the
+   duals.
+-  To use glpk's routine (lpx_get_col_dual), the interface needs to track the
++  To use glpk's routine (glp_get_col_dual), the interface needs to track the
+   origin of the dual (row price) values.
+ */
+ const double * OGSI::getReducedCost() const
+@@ -1813,7 +1808,7 @@ void OGSI::setObjCoeff (int j, double cj
+ /*
+   Push the changed objective down to glpk.
+ */
+-  lpx_set_obj_coef(lp_,j+1,cj) ;
++  glp_set_obj_coef(lp_,j+1,cj) ;
+   if (obj_)
+   { obj_[j] = cj ; }
+@@ -1830,15 +1825,15 @@ void OGSI::setColLower (int j, double lb
+   infinite bound, so we need to check the status and possibly correct.
+ */
+   double inf = getInfinity() ;
+-  int type = lpx_get_col_type(lp_,j+1) ;
+-  double ubj = lpx_get_col_ub(lp_,j+1) ;
++  int type = glp_get_col_type(lp_,j+1) ;
++  double ubj = glp_get_col_ub(lp_,j+1) ;
+   switch (type)
+-  { case LPX_UP:
+-    case LPX_DB:
+-    case LPX_FX:
++  { case GLP_UP:
++    case GLP_DB:
++    case GLP_FX:
+     { break ; }
+-    case LPX_FR:
+-    case LPX_LO:
++    case GLP_FR:
++    case GLP_LO:
+     { ubj = inf ;
+       break ; }
+     default:
+@@ -1875,15 +1870,15 @@ void OGSI::setColUpper (int j, double ub
+   infinite bound, so we need to check the status and possibly correct.
+ */
+   double inf = getInfinity() ;
+-  int type = lpx_get_col_type(lp_,j+1) ;
+-  double lbj = lpx_get_col_lb(lp_,j+1) ;
++  int type = glp_get_col_type(lp_,j+1) ;
++  double lbj = glp_get_col_lb(lp_,j+1) ;
+   switch (type)
+-  { case LPX_LO:
+-    case LPX_DB:
+-    case LPX_FX:
++  { case GLP_LO:
++    case GLP_DB:
++    case GLP_FX:
+     { break ; }
+-    case LPX_FR:
+-    case LPX_UP:
++    case GLP_FR:
++    case GLP_UP:
+     { lbj = inf ;
+       break ; }
+     default:
+@@ -1932,25 +1927,25 @@ void OGSI::setColBounds (int j, double l
+   int type ;
+   if (lower == upper)
+-  { type = LPX_FX ; }
++  { type = GLP_FX ; }
+   else
+   if (lower > -inf && upper < inf)
+-  { type = LPX_DB ; }
++  { type = GLP_DB ; }
+   else
+   if (lower > -inf)
+-  { type = LPX_LO ; }
++  { type = GLP_LO ; }
+   else
+   if (upper < inf)
+-  { type = LPX_UP ; }
++  { type = GLP_UP ; }
+   else
+-  { type = LPX_FR ; }
++  { type = GLP_FR ; }
+ /*
+   Push the bound change down into the solver. 1-based addressing.
+ */
+-  int statj = lpx_get_col_stat(lp_,j+1) ;
+-  lpx_set_col_bnds(lp_,j+1,type,lower,upper) ;
+-  lpx_set_col_stat(lp_,j+1,statj) ;
+-  statj = lpx_get_col_stat(lp_,j+1) ;
++  int statj = glp_get_col_stat(lp_,j+1) ;
++  glp_set_col_bnds(lp_,j+1,type,lower,upper) ;
++  glp_set_col_stat(lp_,j+1,statj) ;
++  statj = glp_get_col_stat(lp_,j+1) ;
+ /*
+   Correct the cached upper and lower bound vectors, if present.
+ */
+@@ -1982,18 +1977,18 @@ OGSI::setRowLower( int elementIndex, dou
+       double lb;
+       double ub;
+-      type=lpx_get_row_type(getMutableModelPtr(),elementIndex+1);
+-      ub=lpx_get_row_ub(getMutableModelPtr(),elementIndex+1);
++      type=glp_get_row_type(getMutableModelPtr(),elementIndex+1);
++      ub=glp_get_row_ub(getMutableModelPtr(),elementIndex+1);
+       lb = elementValue;
+       switch( type )
+       {
+-      case LPX_UP:
+-      case LPX_DB:
+-      case LPX_FX:
++      case GLP_UP:
++      case GLP_DB:
++      case GLP_FX:
+               break;
+-      case LPX_FR:
+-      case LPX_LO:
++      case GLP_FR:
++      case GLP_LO:
+               ub = inf;
+               break;
+@@ -2014,18 +2009,18 @@ OGSI::setRowUpper( int elementIndex, dou
+       double lb;
+       double ub;
+-      type=lpx_get_row_type(getMutableModelPtr(),elementIndex+1);
+-      lb=lpx_get_row_lb(getMutableModelPtr(),elementIndex+1);
++      type=glp_get_row_type(getMutableModelPtr(),elementIndex+1);
++      lb=glp_get_row_lb(getMutableModelPtr(),elementIndex+1);
+       ub = elementValue;
+       switch( type )
+       {
+-      case LPX_LO:
+-      case LPX_DB:
+-      case LPX_FX:
++      case GLP_LO:
++      case GLP_DB:
++      case GLP_FX:
+               break;
+-      case LPX_FR:
+-      case LPX_UP:
++      case GLP_FR:
++      case GLP_UP:
+               lb = -inf;
+               break;
+@@ -2056,20 +2051,20 @@ void OGSI::setRowBounds (int i, double l
+   int type ;
+   if( lower == upper)
+-  { type = LPX_FX ; }
++  { type = GLP_FX ; }
+   else
+   if (lower > -inf && upper < inf)
+-  { type = LPX_DB ; }
++  { type = GLP_DB ; }
+   else
+   if (lower > -inf)
+-  { type = LPX_LO ; }
++  { type = GLP_LO ; }
+   else
+   if (upper < inf)
+-  { type = LPX_UP ; }
++  { type = GLP_UP ; }
+   else
+-  { type = LPX_FR ; }
++  { type = GLP_FR ; }
+-  lpx_set_row_bnds(lp_,i+1,type,lower,upper) ;
++  glp_set_row_bnds(lp_,i+1,type,lower,upper) ;
+ /*
+   Update cached vectors, if they exist.
+ */
+@@ -2123,7 +2118,7 @@ OGSI::setContinuous(int index)
+ {
+         LPX *model = getMutableModelPtr();
+       freeCachedData( OGSI::FREECACHED_COLUMN );
+-      lpx_set_col_kind( model, index+1, LPX_CV );
++      glp_set_col_kind( model, index+1, GLP_CV );
+ }
+ //-----------------------------------------------------------------------------
+@@ -2132,7 +2127,7 @@ void OGSI::setInteger (int index)
+ { LPX *model = getMutableModelPtr() ;
+   freeCachedData(OGSI::FREECACHED_COLUMN) ;
+-  lpx_set_col_kind(model,index+1,LPX_IV) ;
++  glp_set_col_kind(model,index+1,GLP_IV) ;
+ /*
+   Temporary hack to correct upper bounds on general integer variables.
+   CoinMpsIO insists on forcing a bound of 1e30 for general integer variables
+@@ -2184,9 +2179,9 @@ void OGSI::setObjSense(double s)
+ { freeCachedData(OGSI::FREECACHED_RESULTS) ;
+   if (s <= -1.0)
+-  { lpx_set_obj_dir(lp_,LPX_MAX) ; }
++  { glp_set_obj_dir(lp_,GLP_MAX) ; }
+   else
+-  { lpx_set_obj_dir(lp_,LPX_MIN) ; }
++  { glp_set_obj_dir(lp_,GLP_MIN) ; }
+   return ; }
+@@ -2252,12 +2247,12 @@ void OGSI::addCol (const CoinPackedVecto
+                  const double collb, const double colub, const double obj)
+ {
+   // Note: GLPK expects only non-zero coefficients will be given in 
+-  //   lpx_set_mat_col and will abort if there are any zeros.  So any
+-  //   zeros must be removed prior to calling lpx_set_mat_col.
++  //   glp_set_mat_col and will abort if there are any zeros.  So any
++  //   zeros must be removed prior to calling glp_set_mat_col.
+         LPX *model = getMutableModelPtr();
+       freeCachedData(OGSI::KEEPCACHED_ROW);
+-      lpx_add_cols( model, 1 );
++      glp_add_cols( model, 1 );
+       int numcols = getNumCols();
+       setColBounds( numcols-1, collb, colub );
+       setObjCoeff( numcols-1, obj );
+@@ -2276,7 +2271,7 @@ void OGSI::addCol (const CoinPackedVecto
+         if (elements[i] != 0.0)
+           {
+               if ( indices[i]+1 > numrows ) {
+-                      lpx_add_rows( model, indices[i]+1 - numrows );
++                      glp_add_rows( model, indices[i]+1 - numrows );
+                       numrows = indices[i]+1;
+                       // ??? could do this more efficiently with a single call based on the max
+               }
+@@ -2286,7 +2281,7 @@ void OGSI::addCol (const CoinPackedVecto
+               elements_adj[count] = elements[i];
+           }
+       }
+-      lpx_set_mat_col( model, numcols, count, indices_adj, elements_adj );
++      glp_set_mat_col( model, numcols, count, indices_adj, elements_adj );
+       delete [] indices_adj;
+       delete [] elements_adj;
+@@ -2326,7 +2321,7 @@ OGSI::deleteCols(const int num, const in
+               columnIndicesPlus1[i+1]=columnIndices[i]+1;
+               deleteColNames(columnIndices[i],1);
+       }
+-      lpx_del_cols(model,num,columnIndicesPlus1);
++      glp_del_cols(model,num,columnIndicesPlus1);
+       delete [] columnIndicesPlus1;
+ # if OGSI_TRACK_FRESH > 0
+@@ -2344,13 +2339,13 @@ OGSI::addRow (const CoinPackedVectorBase
+             const double rowlb, const double rowub)
+ {
+   // Note: GLPK expects only non-zero coefficients will be given in 
+-  //   lpx_set_mat_row and will abort if there are any zeros.  So any
+-  //   zeros must be removed prior to calling lpx_set_mat_row.
++  //   glp_set_mat_row and will abort if there are any zeros.  So any
++  //   zeros must be removed prior to calling glp_set_mat_row.
+         LPX *model = getMutableModelPtr();
+       freeCachedData( OGSI::KEEPCACHED_COLUMN );
+-      lpx_add_rows( model, 1 );
++      glp_add_rows( model, 1 );
+       int numrows = getNumRows();
+       setRowBounds( numrows-1, rowlb, rowub );
+       int i;
+@@ -2369,7 +2364,7 @@ OGSI::addRow (const CoinPackedVectorBase
+           {
+               if ( indices[i]+1 > numcols ) {
+                 // ??? Could do this more efficiently with a single call
+-                      lpx_add_cols( model, indices[i]+1 - numcols );
++                      glp_add_cols( model, indices[i]+1 - numcols );
+                       numcols = indices[i]+1;
+               }
+               count++;
+@@ -2377,7 +2372,7 @@ OGSI::addRow (const CoinPackedVectorBase
+               indices_adj[count] = indices[i] + 1;
+           }
+       }
+-      lpx_set_mat_row( model, numrows, count, indices_adj, elements_adj );
++      glp_set_mat_row( model, numrows, count, indices_adj, elements_adj );
+       delete [] indices_adj;
+       delete [] elements_adj;
+@@ -2461,8 +2456,8 @@ void OGSI::deleteRows (const int num, co
+   int notBasic = 0 ;
+   for (ndx = 1 ; ndx <= num ; ndx++)
+   { i = glpkIndices[ndx] ;
+-    int stati = lpx_get_row_stat(lp_,i) ;
+-    if (stati != LPX_BS)
++    int stati = glp_get_row_stat(lp_,i) ;
++    if (stati != GLP_BS)
+     { notBasic++ ; } }
+   if (notBasic)
+   {
+@@ -2476,7 +2471,7 @@ void OGSI::deleteRows (const int num, co
+ /*
+   Tell glpk to delete the rows.
+ */
+-  lpx_del_rows(lp_,num,glpkIndices) ;
++  glp_del_rows(lp_,num,glpkIndices) ;
+   delete [] glpkIndices ;
+@@ -2511,41 +2506,32 @@ void OGSI::loadProblem (const CoinPacked
+   
+   In any event, get rid of cached data in the OsiGlpk object.
+ */
+-  if (lpx_get_num_cols(lp_) != 0 || lpx_get_num_rows(lp_) != 0)
++  if (glp_get_num_cols(lp_) != 0 || glp_get_num_rows(lp_) != 0)
+   { 
+-    int presolVal = lpx_get_int_parm(lp_,LPX_K_PRESOL) ;
+-    int usedualVal = lpx_get_int_parm(lp_,LPX_K_DUAL) ;
+-    int scaleVal = lpx_get_int_parm(lp_,LPX_K_SCALE) ;
+-    int logVal = lpx_get_int_parm(lp_,LPX_K_MSGLEV) ;
+ #   if OGSI_TRACK_FRESH > 0
+     std::cout
+       << "    emptying LPX(" << std::hex << lp_ << std::dec << "), "
+ #   endif
+-    lpx_delete_prob(lp_) ;
+-    lp_ = lpx_create_prob() ;
++    glp_delete_prob(lp_) ;
++    lp_ = glp_create_prob() ;
+     assert(lp_) ;
+ #   if OGSI_TRACK_FRESH > 0
+     std::cout
+       << "loading LPX(" << std::hex << lp_ << std::dec << ")."
+       << std::endl ;
+ #   endif
+-    lpx_set_class(lp_,LPX_MIP) ;
+-    lpx_set_int_parm(lp_,LPX_K_ITLIM,maxIteration_) ; 
++    
++    simplexParams_.it_lim = maxIteration_ ; 
+     if (getObjSense() == 1)                           // minimization
+-    { lpx_set_real_parm(lp_,LPX_K_OBJUL,dualObjectiveLimit_) ;
+-      lpx_set_real_parm(lp_,LPX_K_OBJLL,primalObjectiveLimit_) ; }
++    { simplexParams_.obj_ul = dualObjectiveLimit_ ;
++      simplexParams_.obj_ll = primalObjectiveLimit_ ; }
+     else                                              // maximization
+-    { lpx_set_real_parm(lp_,LPX_K_OBJLL,dualObjectiveLimit_) ;
+-      lpx_set_real_parm(lp_,LPX_K_OBJUL,primalObjectiveLimit_) ; }
+-    lpx_set_real_parm(lp_,LPX_K_TOLDJ,dualTolerance_) ;
+-    lpx_set_real_parm(lp_,LPX_K_TOLBND,primalTolerance_) ;
+-    lpx_set_obj_coef(lp_,0,objOffset_) ;
+-    lpx_set_prob_name(lp_,const_cast<char *>(probName_.c_str())) ;
+-    lpx_set_int_parm(lp_,LPX_K_PRESOL,presolVal) ;
+-    lpx_set_int_parm(lp_,LPX_K_DUAL,usedualVal) ;
+-    lpx_set_int_parm(lp_,LPX_K_SCALE,scaleVal) ;
+-    lpx_set_int_parm(lp_,LPX_K_MSGLEV,logVal) ;
+-    messageHandler()->setLogLevel(logVal) ; }
++    { simplexParams_.obj_ll = dualObjectiveLimit_ ;
++      simplexParams_.obj_ul = primalObjectiveLimit_ ; }
++    simplexParams_.tol_dj = dualTolerance_ ;
++    simplexParams_.tol_bnd = primalTolerance_ ;
++    glp_set_obj_coef(lp_,0,objOffset_) ;
++    glp_set_prob_name(lp_,const_cast<char *>(probName_.c_str())) ; }
+   freeCachedData(OGSI::KEEPCACHED_NONE) ;
+@@ -2617,7 +2603,7 @@ void OGSI::loadProblem (const CoinPacked
+       addCol(reqdBySunCC,collb[j],colub[j],obj[j]) ; }
+     // Make sure there are enough rows 
+     if (m > getNumRows())
+-    { lpx_add_rows(lp_,m-getNumRows()) ; }
++    { glp_add_rows(lp_,m-getNumRows()) ; }
+     for (i = 0 ; i < m ; i++)
+     { setRowBounds(i,rowlb[i],rowub[i]) ; } }
+   else
+@@ -2626,7 +2612,7 @@ void OGSI::loadProblem (const CoinPacked
+       addRow(reqdBySunCC,rowlb[i],rowub[i]) ; }
+     // Make sure there are enough columns
+     if (n > getNumCols())
+-    { lpx_add_cols(lp_,n-getNumCols()) ; }
++    { glp_add_cols(lp_,n-getNumCols()) ; }
+     for (j = 0 ; j < n ; j++)
+     { setColBounds(j,collb[j],colub[j]) ;
+       setObjCoeff(j,obj[j]) ; } }
+@@ -2731,11 +2717,11 @@ OGSI::loadProblem(const int numcols, con
+   LPX *model = getMutableModelPtr();
+   double inf = getInfinity();
+-  // Can't send 0 to lpx_add_xxx
++  // Can't send 0 to glp_add_xxx
+   if (numcols > 0)
+-    lpx_add_cols( model, numcols );
++    glp_add_cols( model, numcols );
+   if (numrows > 0)
+-    lpx_add_rows( model, numrows );
++    glp_add_rows( model, numrows );
+   // How many elements?  Column-major, so indices of start are columns
+   int numelem = start[ numcols ];
+@@ -2756,7 +2742,7 @@ OGSI::loadProblem(const int numcols, con
+   {
+       setColBounds( i, collb ? collb[i]:0.0, 
+                   colub ? colub[i]:inf );
+-      lpx_set_mat_col( model, i+1, start[i+1]-start[i], &(index_adj[start[i]]), &(value_adj[start[i]]) );
++      glp_set_mat_col( model, i+1, start[i+1]-start[i], &(index_adj[start[i]]), &(value_adj[start[i]]) );
+     setObjCoeff( i, obj ? obj[i]:0.0 );
+   }
+   int j;
+@@ -2823,7 +2809,7 @@ void OGSI::writeMps( const char * filena
+       std::string f( filename );
+       std::string e( extension );
+       std::string fullname = f + "." + e;
+-      lpx_write_mps( getMutableModelPtr(), const_cast<char*>( fullname.c_str() ));
++      glp_write_mps( getMutableModelPtr(), GLP_MPS_FILE, NULL, const_cast<char*>( fullname.c_str() ));
+ #else
+       // Fall back on native MPS writer.  
+       // These few lines of code haven't been tested. 2004/10/15
+@@ -2996,17 +2982,17 @@ void OGSI::applyColCut( const OsiColCut
+             // update cached version as well
+             collower_[column] = lower;
+             if( lower == upper )
+-              type = LPX_FX;
++              type = GLP_FX;
+             else if( lower > -inf && upper < inf )
+-              type = LPX_DB;
++              type = GLP_DB;
+             else if( lower > -inf )
+-              type = LPX_LO;
++              type = GLP_LO;
+             else if( upper < inf)
+-              type = LPX_UP;
++              type = GLP_UP;
+             else
+-              type = LPX_FR;
++              type = GLP_FR;
+             
+-            lpx_set_col_bnds( getMutableModelPtr(), column+1, type, lower, upper );
++            glp_set_col_bnds( getMutableModelPtr(), column+1, type, lower, upper );
+           }
+         }
+         // lower bounds
+@@ -3018,17 +3004,17 @@ void OGSI::applyColCut( const OsiColCut
+             // update cached version as well
+             colupper_[column] = upper;
+             if( lower == upper )
+-              type = LPX_FX;
++              type = GLP_FX;
+             else if( lower > -inf && upper < inf )
+-              type = LPX_DB;
++              type = GLP_DB;
+             else if( lower > -inf )
+-              type = LPX_LO;
++              type = GLP_LO;
+             else if( upper < inf)
+-              type = LPX_UP;
++              type = GLP_UP;
+             else
+-              type = LPX_FR;
++              type = GLP_FR;
+             
+-            lpx_set_col_bnds( getMutableModelPtr(), column+1, type, lower, upper );
++            glp_set_col_bnds( getMutableModelPtr(), column+1, type, lower, upper );
+           }
+         }
+ #endif
+@@ -3095,25 +3081,24 @@ void OGSI::gutsOfCopy (const OsiGlpkSolv
+   held up on the parent OSI object, so we don't need to worry about copying
+   them.
+ */
+-  intParam = lpx_get_int_parm(srclpx,LPX_K_PRESOL) ;
+-  lpx_set_int_parm(lpx,LPX_K_PRESOL,intParam) ;
+-  intParam = lpx_get_int_parm(srclpx,LPX_K_DUAL) ;
+-  lpx_set_int_parm(lpx,LPX_K_DUAL,intParam) ;
+-  intParam = lpx_get_int_parm(srclpx,LPX_K_SCALE) ;
+-  lpx_set_int_parm(lpx,LPX_K_SCALE,intParam) ;
++  intoptParams_.presolve = source.intoptParams_.presolve;
++  simplexParams_.presolve = source.simplexParams_.presolve;
++  simplexParams_.meth = source.simplexParams_.meth;
++  scaleFlags_ = source.scaleFlags_;
+ /*
+   Printing is a bit more complicated. Pull the parameter and set the log
+   level in the message handler and set the print parameter in glpk.
+ */
+-  intParam = lpx_get_int_parm(srclpx,LPX_K_MSGLEV) ;
+-  lpx_set_int_parm(lpx,LPX_K_MSGLEV,intParam) ;
+-  messageHandler()->setLogLevel(intParam) ;
+-
+-# ifdef LPX_K_USECUTS
+-  intParam=lpx_get_int_parm(lp_,LPX_K_USECUTS);
+-  lpx_set_int_parm(lp_,LPX_K_USECUTS,intParam);
+-# endif
++  simplexParams_.msg_lev = source.simplexParams_.msg_lev;
++  intoptParams_.msg_lev = source.intoptParams_.msg_lev;
++  messageHandler()->setLogLevel(simplexParams_.msg_lev) ;
++
++  intoptParams_.mir_cuts = source.intoptParams_.mir_cuts;
++  intoptParams_.gmi_cuts = source.intoptParams_.gmi_cuts;
++  intoptParams_.cov_cuts = source.intoptParams_.cov_cuts;
++  intoptParams_.clq_cuts = source.intoptParams_.clq_cuts;
+   
++  glp_scale_prob(lp_, scaleFlags_);
+ /*
+   Now --- do we have a problem loaded? If not, we're done.
+ */
+@@ -3164,22 +3149,22 @@ void OGSI::gutsOfCopy (const OsiGlpkSolv
+   nonsense, then don't bother. Once we've copied the status into the new lpx
+   object, do the warm-up.
+ */
+-  if (lpx_get_status(srclpx) != LPX_UNDEF)
++  if (glp_get_status(srclpx) != GLP_UNDEF)
+   { for (j = 1 ; j <= n ; j++)
+-    { int statj = lpx_get_col_stat(srclpx,j) ;
+-      lpx_set_col_stat(lpx,j,statj) ; }
++    { int statj = glp_get_col_stat(srclpx,j) ;
++      glp_set_col_stat(lpx,j,statj) ; }
+     for (i = 1 ; i <= m ; i++)
+-    { int stati = lpx_get_row_stat(srclpx,i) ;
+-      lpx_set_row_stat(lpx,i,stati) ; }
++    { int stati = glp_get_row_stat(srclpx,i) ;
++      glp_set_row_stat(lpx,i,stati) ; }
+ #ifndef NDEBUG
+-    int retval = lpx_warm_up(lpx) ;
++    int retval = glp_warm_up(lpx) ;
+ #endif
+ #   if OGSI_TRACK_SOLVERS > 1
+     std::cout
+-      << "    lpx_warm_up returns " << retval << "." << std::endl ;
++      << "    glp_warm_up returns " << retval << "." << std::endl ;
+ #   endif
+-    assert(retval == LPX_E_OK) ; }
++    assert(retval == 0) ; }
+   return ; }
+@@ -3232,26 +3217,28 @@ void OGSI::gutsOfConstructor()
+   isObjUpperLimitReached_ = false ;
+   isFeasible_ = false;
+-  lp_ = lpx_create_prob();
++  lp_ = glp_create_prob();
+   assert( lp_ != NULL );
+-  // Make all problems MIPs.  See note at top of file.
+-  lpx_set_class( lp_, LPX_MIP );
++  glp_init_smcp(&simplexParams_);
++  glp_init_iocp(&intoptParams_);
++  scaleFlags_ = GLP_SF_EQ;
++  glp_scale_prob(lp_, scaleFlags_);
+   // Push OSI parameters down into LPX object.
+-  lpx_set_int_parm(lp_,LPX_K_ITLIM,maxIteration_) ; 
++  simplexParams_.it_lim = maxIteration_;
+   if (getObjSense() == 1.0)                           // minimization
+-  { lpx_set_real_parm(lp_,LPX_K_OBJUL,dualObjectiveLimit_) ;
+-    lpx_set_real_parm(lp_,LPX_K_OBJLL,primalObjectiveLimit_) ; }
++  { simplexParams_.obj_ul = dualObjectiveLimit_ ;
++    simplexParams_.obj_ll = primalObjectiveLimit_ ; }
+   else                                                // maximization
+-  { lpx_set_real_parm(lp_,LPX_K_OBJLL,dualObjectiveLimit_) ;
+-    lpx_set_real_parm(lp_,LPX_K_OBJUL,-primalObjectiveLimit_) ; }
+-  lpx_set_real_parm(lp_,LPX_K_TOLDJ,dualTolerance_) ;
+-  lpx_set_real_parm(lp_,LPX_K_TOLBND,primalTolerance_) ;
++  { simplexParams_.obj_ll = dualObjectiveLimit_ ;
++    simplexParams_.obj_ul = -primalObjectiveLimit_ ; }
++  simplexParams_.tol_dj = dualTolerance_;
++  simplexParams_.tol_bnd = primalTolerance_;
+-  lpx_set_obj_coef(lp_,0,objOffset_) ;
++  glp_set_obj_coef(lp_,0,objOffset_) ;
+-  lpx_set_prob_name(lp_,const_cast<char *>(probName_.c_str())) ;
++  glp_set_prob_name(lp_,const_cast<char *>(probName_.c_str())) ;
+ /* Stefan: with the new simplex algorithm in Glpk 4.31, some netlib instances (e.g., dfl001)
+    take very long or get into a cycle.
+@@ -3264,22 +3251,16 @@ void OGSI::gutsOfConstructor()
+   Printing is a bit more complicated. Set the log level in the handler and set
+   the print parameter in glpk.
+ */
+-  lpx_set_int_parm(lp_,LPX_K_MSGLEV,1) ;
+-  messageHandler()->setLogLevel(1) ;
++  simplexParams_.msg_lev = intoptParams_.msg_lev = GLP_MSG_ERR ;
++  messageHandler()->setLogLevel(GLP_MSG_ERR) ;
+   
+ /*
+-  Enable cuts if they're available. This is a bit of a pain,
+-  as the interface has changed since it was first introduced in 4.9.
+-  LPX_K_USECUTS appears in 4.9; the parameter value
+-  appears to be unused in this version. LPX_C_ALL appears in 4.10.
+-*/
+-# ifdef LPX_K_USECUTS
+-# ifdef LPX_C_ALL
+-  lpx_set_int_parm(lp_,LPX_K_USECUTS,LPX_C_ALL) ;
+-# else
+-  lpx_set_int_parm(lp_,LPX_K_USECUTS,0) ;
+-# endif
+-# endif
++  Enable cuts if they're available.
++*/
++  intoptParams_.mir_cuts = GLP_ON;
++  intoptParams_.gmi_cuts = GLP_ON;
++  intoptParams_.cov_cuts = GLP_ON;
++  intoptParams_.clq_cuts = GLP_ON;
+ }
+ //-----------------------------------------------------------------------------
+@@ -3288,7 +3269,7 @@ void OGSI::gutsOfDestructor()
+ {
+       if( lp_ != NULL )
+       {
+-              lpx_delete_prob( lp_ );
++              glp_delete_prob( lp_ );
+               lp_=NULL;
+               freeAllMemory();
+       }
+@@ -3408,7 +3389,7 @@ void OGSI::freeAllMemory()
+ void OGSI::setObjName (std::string name)
+ { OsiSolverInterface::setObjName(name) ;
+-  lpx_set_obj_name(lp_,const_cast<char *>(name.c_str())) ; }
++  glp_set_obj_name(lp_,const_cast<char *>(name.c_str())) ; }
+ /*!
+   Set a row name. Make sure both glpk and OSI see the same name.
+@@ -3431,7 +3412,7 @@ void OGSI::setRowName (int ndx, std::str
+   Set the name in the OSI base, then in the consys structure.
+ */
+   OsiSolverInterface::setRowName(ndx,name) ;
+-  lpx_set_row_name(lp_,ndx+1,const_cast<char *>(name.c_str())) ;
++  glp_set_row_name(lp_,ndx+1,const_cast<char *>(name.c_str())) ;
+   return ; }
+@@ -3456,7 +3437,7 @@ void OGSI::setColName (int ndx, std::str
+   Set the name in the OSI base, then in the consys structure.
+ */
+   OsiSolverInterface::setColName(ndx,name) ;
+-  lpx_set_col_name(lp_,ndx+1,const_cast<char *>(name.c_str())) ;
++  glp_set_col_name(lp_,ndx+1,const_cast<char *>(name.c_str())) ;
+   return ; }
+--- Osi-0.106.10/Osi/src/OsiGlpk/OsiGlpkSolverInterface.hpp.orig       2013-04-06 14:50:19.000000000 +0200
++++ Osi-0.106.10/Osi/src/OsiGlpk/OsiGlpkSolverInterface.hpp    2014-12-03 20:33:20.066812529 +0100
+@@ -768,6 +768,9 @@ private:
+   //@{
+   /// GPLK model represented by this class instance
+   mutable LPX* lp_;
++  glp_iocp intoptParams_;
++  glp_smcp simplexParams_;
++  int scaleFlags_;
+   
+   /// number of GLPK instances currently in use (counts only those created by OsiGlpk) 
+   static unsigned int numInstances_;
diff --git a/Osi-link.patch b/Osi-link.patch
new file mode 100644 (file)
index 0000000..c196cba
--- /dev/null
@@ -0,0 +1,24 @@
+--- Osi-0.106.10/Osi/src/OsiGlpk/Makefile.am.orig      2013-12-15 00:53:52.000000000 +0100
++++ Osi-0.106.10/Osi/src/OsiGlpk/Makefile.am   2014-12-04 22:07:42.332949046 +0100
+@@ -21,7 +21,7 @@
+ # List all additionally required libraries
+ if DEPENDENCY_LINKING
+-libOsiGlpk_la_LIBADD = $(OSILIB_LIBS) ../Osi/libOsi.la
++libOsiGlpk_la_LIBADD = $(OSILIB_LIBS) ../Osi/libOsi.la $(GLPK_LIBS)
+ endif
+ # This is for libtool
+--- Osi-0.106.10/Osi/src/OsiSpx/Makefile.am.orig       2011-08-14 12:37:34.000000000 +0200
++++ Osi-0.106.10/Osi/src/OsiSpx/Makefile.am    2014-12-04 22:08:00.876281600 +0100
+@@ -16,6 +16,10 @@
+ # List all source files for this library, including headers
+ libOsiSpx_la_SOURCES = OsiSpxSolverInterface.cpp OsiSpxSolverInterface.hpp
++if DEPENDENCY_LINKING
++libOsiSpx_la_LIBADD = $(OSILIB_LIBS) ../Osi/libOsi.la $(SOPLEX_LIBS)
++endif
++
+ # This is for libtool
+ libOsiSpx_la_LDFLAGS = $(LT_LDFLAGS)
This page took 0.109259 seconds and 4 git commands to generate.