diff options
author | Robin H. Johnson <robbat2@gentoo.org> | 2015-08-08 13:49:04 -0700 |
---|---|---|
committer | Robin H. Johnson <robbat2@gentoo.org> | 2015-08-08 17:38:18 -0700 |
commit | 56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch) | |
tree | 3f91093cdb475e565ae857f1c5a7fd339e2d781e /dev-python/cvxopt | |
download | gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2 gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip |
proj/gentoo: Initial commit
This commit represents a new era for Gentoo:
Storing the gentoo-x86 tree in Git, as converted from CVS.
This commit is the start of the NEW history.
Any historical data is intended to be grafted onto this point.
Creation process:
1. Take final CVS checkout snapshot
2. Remove ALL ChangeLog* files
3. Transform all Manifests to thin
4. Remove empty Manifests
5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$
5.1. Do not touch files with -kb/-ko keyword flags.
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests
X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project
X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration
X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn
X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts
X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration
X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging
X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'dev-python/cvxopt')
-rw-r--r-- | dev-python/cvxopt/Manifest | 1 | ||||
-rw-r--r-- | dev-python/cvxopt/cvxopt-1.1.6-r2.ebuild | 96 | ||||
-rw-r--r-- | dev-python/cvxopt/files/cvxopt-1.1.6-glpk.patch | 889 | ||||
-rw-r--r-- | dev-python/cvxopt/files/cvxopt-1.1.6-glpk449.patch | 1082 | ||||
-rw-r--r-- | dev-python/cvxopt/files/cvxopt-1.1.6-setup.patch | 176 | ||||
-rw-r--r-- | dev-python/cvxopt/metadata.xml | 20 |
6 files changed, 2264 insertions, 0 deletions
diff --git a/dev-python/cvxopt/Manifest b/dev-python/cvxopt/Manifest new file mode 100644 index 000000000000..4f7f06c52ac5 --- /dev/null +++ b/dev-python/cvxopt/Manifest @@ -0,0 +1 @@ +DIST cvxopt-1.1.6.tar.gz 3352996 SHA256 7b4ccf3ed896dde6624623431c0b1f5e32d874384329ed716f51babcbf416227 SHA512 b9f5fd7870412423b60068d205efb99d3630012509cb659fb67a10d6175906768846d7c906cf2fcac4be29afd558619b71e2dca730041329195a2365dd1d722c WHIRLPOOL d43cf090ee0396a77851fb71e6e34c980152bccdd5fdb3ecc53d0a464a505ac87a1e7198d313ec669443970bcf8a2d616f03c2f861b7df2f620bd583a97ea140 diff --git a/dev-python/cvxopt/cvxopt-1.1.6-r2.ebuild b/dev-python/cvxopt/cvxopt-1.1.6-r2.ebuild new file mode 100644 index 000000000000..256fcd3eb840 --- /dev/null +++ b/dev-python/cvxopt/cvxopt-1.1.6-r2.ebuild @@ -0,0 +1,96 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +PYTHON_COMPAT=( python{2_7,3_3,3_4} ) + +inherit distutils-r1 toolchain-funcs eutils + +DESCRIPTION="Python package for convex optimization" +HOMEPAGE="http://cvxopt.org/" +SRC_URI="https://github.com/${PN}/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux" +IUSE="doc +dsdp examples fftw +glpk gsl" + +RDEPEND=" + virtual/blas + virtual/cblas + virtual/lapack + sci-libs/cholmod:0= + sci-libs/umfpack:0= + dsdp? ( sci-libs/dsdp:0= ) + fftw? ( sci-libs/fftw:3.0= ) + glpk? ( sci-mathematics/glpk:0= ) + gsl? ( sci-libs/gsl:0= )" +DEPEND="${RDEPEND} + virtual/pkgconfig + doc? ( dev-python/sphinx )" + +python_prepare_all(){ + epatch "${FILESDIR}"/${PN}-1.1.6-setup.patch + + has_version ">=sci-mathematics/glpk-4.49" && \ + epatch "${FILESDIR}"/${PN}-1.1.6-glpk449.patch + + rm -r src/C/SuiteSparse*/ || die + + pkg_lib() { + local pkg=$(echo $1 | tr '[:lower:]' '[:upper:]') + local libs="$($(tc-getPKG_CONFIG) --libs-only-l $1 | \ + sed -e 's:[ ]-l*\(pthread\|m\)\([ ]\|$\)::g' -e 's:[ ]*$::' | \ + tr ' ' '\n' | sort -u | sed -e "s:^-l\(.*\):'\1':g" | \ + tr '\n' ',' | sed -e 's:,$::')" + local libdir="$($(tc-getPKG_CONFIG) --libs-only-L $1 | \ + sed -e 's:[ ]*$::' | \ + tr ' ' '\n' | sort -u | sed -e "s:^-L\(.*\):'\1':g" | \ + tr '\n' ',' | sed -e 's:,$::')" + local incdir="$($(tc-getPKG_CONFIG) --cflags-only-I $1 | \ + sed -e 's:[ ]*$::' | \ + tr ' ' '\n' | sort -u | sed -e "s:^-L\(.*\):'\1':g" | \ + tr '\n' ',' | sed -e 's:,$::')" + sed -i \ + -e "/${pkg}_LIB[ ]*=/s:\(.*[ ]*=[ ]*\[\).*${1}.*:\1${libs}\]:" \ + -e "s:\(${pkg}_INC_DIR[ ]*=\).*$:\1 ${incdir}:" \ + -e "s:\[ BLAS_LIB_DIR \]:\[ ${libdir} \]:g" \ + setup.py || die + } + + use_cvx() { + if use $1 ; then + sed -i \ + -e "s/\(BUILD_${1^^} =\) 0/\1 1/" \ + setup.py || die + fi + } + + pkg_lib blas + pkg_lib lapack + + use_cvx gsl + use_cvx fftw + use_cvx glpk + use_cvx dsdp + + distutils-r1_python_prepare_all +} + +python_compile_all() { + use doc && export VARTEXFONTS="${T}/fonts" && emake -C doc -B html +} + +python_test() { + cd examples/doc/chap8 + "${EPYTHON}" lp.py || die +} + +python_install_all() { + use doc && HTML_DOCS=( doc/build/html/. ) + insinto /usr/share/doc/${PF} + use examples && doins -r examples + distutils-r1_python_install_all +} diff --git a/dev-python/cvxopt/files/cvxopt-1.1.6-glpk.patch b/dev-python/cvxopt/files/cvxopt-1.1.6-glpk.patch new file mode 100644 index 000000000000..2887ccd02206 --- /dev/null +++ b/dev-python/cvxopt/files/cvxopt-1.1.6-glpk.patch @@ -0,0 +1,889 @@ +--- src/C/glpk.c.orig 2013-07-31 12:05:27.089955661 -0600 ++++ src/C/glpk.c 2013-07-31 12:13:40.702115730 -0600 +@@ -22,6 +22,8 @@ + #include "cvxopt.h" + #include "misc.h" + #include "glpk.h" ++#include <float.h> ++#include <limits.h> + + PyDoc_STRVAR(glpk__doc__, + "Interface to the simplex and mixed integer LP algorithms in GLPK.\n\n" +@@ -36,62 +38,15 @@ PyDoc_STRVAR(glpk__doc__, + + static PyObject *glpk_module; + +-typedef struct { +- char name[20]; +- int idx; +- char type; +-} param_tuple; +- +-static const param_tuple GLPK_PARAM_LIST[] = { +- {"LPX_K_MSGLEV", LPX_K_MSGLEV, 'i'}, +- {"LPX_K_SCALE", LPX_K_SCALE, 'i'}, +- {"LPX_K_DUAL", LPX_K_DUAL, 'i'}, +- {"LPX_K_PRICE", LPX_K_PRICE, 'i'}, +- {"LPX_K_RELAX", LPX_K_RELAX, 'f'}, +- {"LPX_K_TOLBND", LPX_K_TOLBND, 'f'}, +- {"LPX_K_TOLDJ", LPX_K_TOLDJ, 'f'}, +- {"LPX_K_TOLPIV", LPX_K_TOLPIV, 'f'}, +- {"LPX_K_ROUND", LPX_K_ROUND, 'i'}, +- {"LPX_K_OBJLL", LPX_K_OBJLL, 'f'}, +- {"LPX_K_OBJUL", LPX_K_OBJUL, 'f'}, +- {"LPX_K_ITLIM", LPX_K_ITLIM, 'i'}, +- {"LPX_K_ITCNT", LPX_K_ITCNT, 'i'}, +- {"LPX_K_TMLIM", LPX_K_TMLIM, 'f'}, +- {"LPX_K_OUTFRQ", LPX_K_OUTFRQ, 'i'}, +- {"LPX_K_OUTDLY", LPX_K_OUTDLY, 'f'}, +- {"LPX_K_BRANCH", LPX_K_BRANCH, 'i'}, +- {"LPX_K_BTRACK", LPX_K_BTRACK, 'i'}, +- {"LPX_K_TOLINT", LPX_K_TOLINT, 'f'}, +- {"LPX_K_TOLOBJ", LPX_K_TOLOBJ, 'f'}, +- {"LPX_K_MPSINFO", LPX_K_MPSINFO, 'i'}, +- {"LPX_K_MPSOBJ", LPX_K_MPSOBJ, 'i'}, +- {"LPX_K_MPSORIG", LPX_K_MPSORIG, 'i'}, +- {"LPX_K_MPSWIDE", LPX_K_MPSWIDE, 'i'}, +- {"LPX_K_MPSFREE", LPX_K_MPSFREE, 'i'}, +- {"LPX_K_MPSSKIP", LPX_K_MPSSKIP, 'i'}, +- {"LPX_K_LPTORIG", LPX_K_LPTORIG, 'i'}, +- {"LPX_K_PRESOL", LPX_K_PRESOL, 'i'}, +-}; /* 28 paramaters */ +- +- + #if PY_MAJOR_VERSION >= 3 +-static int get_param_idx(const char *str, int *idx, char *type) ++#define PYINT_CHECK(value) PyLong_Check(value) ++#define PYINT_AS_LONG(value) PyLong_AS_LONG(value) ++#define PYSTRING_FROMSTRING(str) PyUnicode_FromString(str) + #else +-static int get_param_idx(char *str, int *idx, char *type) ++#define PYINT_CHECK(value) PyInt_Check(value) ++#define PYINT_AS_LONG(value) PyInt_AS_LONG(value) ++#define PYSTRING_FROMSTRING(str) PyString_FromString(str) + #endif +-{ +- int i; +- +- for (i=0; i<28; i++) { +- if (!strcmp(GLPK_PARAM_LIST[i].name, str)) { +- *idx = GLPK_PARAM_LIST[i].idx; +- *type = GLPK_PARAM_LIST[i].type; +- return 1; +- } +- } +- return 0; +-} +- + + static char doc_simplex[] = + "Solves a linear program using GLPK.\n\n" +@@ -127,11 +82,12 @@ static PyObject *simplex(PyObject *self, + { + matrix *c, *h, *b=NULL, *x=NULL, *z=NULL, *y=NULL; + PyObject *G, *A=NULL, *t=NULL, *param, *key, *value; +- LPX *lp; +- int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL, param_id; ++ glp_prob *lp; ++ glp_smcp smcp; ++ int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL; + int_t pos=0; + double *a=NULL, val; +- char param_type, err_str[100]; ++ char err_str[100]; + #if PY_MAJOR_VERSION >= 3 + const char *keystr; + #else +@@ -183,18 +139,18 @@ static PyObject *simplex(PyObject *self, + return NULL; + } + +- lp = lpx_create_prob(); +- lpx_add_rows(lp, m+p); +- lpx_add_cols(lp, n); ++ lp = glp_create_prob(); ++ glp_add_rows(lp, m+p); ++ glp_add_cols(lp, n); + + for (i=0; i<n; i++){ +- lpx_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); +- lpx_set_col_bnds(lp, i+1, LPX_FR, 0.0, 0.0); ++ glp_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); ++ glp_set_col_bnds(lp, i+1, GLP_FR, 0.0, 0.0); + } + for (i=0; i<m; i++) +- lpx_set_row_bnds(lp, i+1, LPX_UP, 0.0, MAT_BUFD(h)[i]); ++ glp_set_row_bnds(lp, i+1, GLP_UP, 0.0, MAT_BUFD(h)[i]); + for (i=0; i<p; i++) +- lpx_set_row_bnds(lp, i+m+1, LPX_FX, MAT_BUFD(b)[i], ++ glp_set_row_bnds(lp, i+m+1, GLP_FX, MAT_BUFD(b)[i], + MAT_BUFD(b)[i]); + + nnzmax = (SpMatrix_Check(G) ? SP_NNZ(G) : m*n ) + +@@ -203,7 +159,7 @@ static PyObject *simplex(PyObject *self, + rn = (int *) calloc(nnzmax+1, sizeof(int)); + cn = (int *) calloc(nnzmax+1, sizeof(int)); + if (!a || !rn || !cn){ +- free(a); free(rn); free(cn); lpx_delete_prob(lp); ++ free(a); free(rn); free(cn); glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +@@ -242,84 +198,155 @@ static PyObject *simplex(PyObject *self, + nnz++; + } + +- lpx_load_matrix(lp, nnz, rn, cn, a); ++ glp_load_matrix(lp, nnz, rn, cn, a); + free(rn); free(cn); free(a); + + if (!(t = PyTuple_New(A ? 4 : 3))){ +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + + if (!(param = PyObject_GetAttrString(glpk_module, "options")) + || !PyDict_Check(param)){ +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + PyErr_SetString(PyExc_AttributeError, + "missing glpk.options dictionary"); + return NULL; + } + +- while (PyDict_Next(param, &pos, &key, &value)) ++ glp_init_smcp(&smcp); ++ while (PyDict_Next(param, &pos, &key, &value)){ + #if PY_MAJOR_VERSION >= 3 +- if ((PyUnicode_Check(key)) && +- get_param_idx(_PyUnicode_AsString(key), ¶m_id, +- ¶m_type)){ ++ if (PyUnicode_Check(key)){ + keystr = _PyUnicode_AsString(key); + #else +- if ((keystr = PyString_AsString(key)) && get_param_idx(keystr, +- ¶m_id, ¶m_type)){ +-#endif +- if (param_type == 'i'){ +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value)){ +-#else +- if (!PyInt_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for integer " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- if (!strcmp("LPX_K_PRESOL", keystr) && +-#if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value) != 1){ +-#else +- PyInt_AS_LONG(value) != 1){ ++ if ((keystr = PyString_AsString(key))){ + #endif ++ if (!strcmp("LPX_K_MSGLEV", keystr)){ ++ switch (PYINT_AS_LONG(value)){ ++ case 0: smcp.msg_lev = GLP_MSG_OFF; break; ++ case 1: smcp.msg_lev = GLP_MSG_ERR; break; ++ case 2: smcp.msg_lev = GLP_MSG_ON; break; ++ case 3: smcp.msg_lev = GLP_MSG_ALL; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_SCALE", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: glp_unscale_prob(lp); break; ++ case 1: glp_scale_prob(lp, GLP_SF_EQ); break; ++ case 2: glp_scale_prob(lp, GLP_SF_GM); break; ++ case 3: glp_scale_prob(lp, GLP_SF_GM | GLP_SF_EQ); break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_DUAL", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: smcp.meth = GLP_PRIMAL; break; ++ case 1: smcp.meth = GLP_DUAL; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_PRICE", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: smcp.pricing = GLP_PT_STD; break; ++ case 1: smcp.pricing = GLP_PT_PSE; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_RELAX", keystr)){ ++ double relax = PyFloat_AsDouble(value); ++ if (relax < 0.0 || relax > 1.0) ++ goto error; ++ smcp.r_test = (relax == 0.0) ? GLP_RT_STD : GLP_RT_HAR; ++ } else if (!strcmp("LPX_K_TOLBND", keystr)){ ++ smcp.tol_bnd = PyFloat_AsDouble(value); ++ if (smcp.tol_bnd < DBL_EPSILON || smcp.tol_bnd > 0.001) ++ goto error; ++ } else if (!strcmp("LPX_K_TOLDJ", keystr)){ ++ smcp.tol_dj = PyFloat_AsDouble(value); ++ if (smcp.tol_dj < DBL_EPSILON || smcp.tol_dj > 0.001) ++ goto error; ++ } else if (!strcmp("LPX_K_TOLPIV", keystr)){ ++ smcp.tol_piv = PyFloat_AsDouble(value); ++ if (smcp.tol_piv < DBL_EPSILON || smcp.tol_piv > 0.001) ++ goto error; ++ } else if (!strcmp("LPX_K_ROUND", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_OBJLL", keystr)){ ++ smcp.obj_ll = PyFloat_AsDouble(value); ++ } else if (!strcmp("LPX_K_OBJUL", keystr)){ ++ smcp.obj_ul = PyFloat_AsDouble(value); ++ } else if (!strcmp("LPX_K_ITLIM", keystr)){ ++ smcp.it_lim = PYINT_AS_LONG(value); ++ if (smcp.it_lim < 0) ++ smcp.it_lim = INT_MAX; ++ } else if (!strcmp("LPX_K_ITCNT", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TMLIM", keystr)){ ++ smcp.tm_lim = (int)(PyFloat_AsDouble(value) * 1000.0); ++ if (smcp.tm_lim < 0) ++ smcp.tm_lim = INT_MAX; ++ } else if (!strcmp("LPX_K_OUTFRQ", keystr)){ ++ smcp.out_frq = PYINT_AS_LONG(value); ++ if (smcp.out_frq <= 0) ++ goto error; ++ } else if (!strcmp("LPX_K_OUTDLY", keystr)){ ++ smcp.out_dly = (int)(PyFloat_AsDouble(value) * 1000.0); ++ } else if (!strcmp("LPX_K_BRANCH", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_BTRACK", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TOLINT", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TOLOBJ", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSINFO", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSOBJ", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSORIG", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSWIDE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSFREE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSSKIP", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_LPTORIG", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_PRESOL", keystr)){ ++ if (PYINT_AS_LONG(value) != 1) + PyErr_Warn(PyExc_UserWarning, "ignoring value of " + "GLPK parameter 'LPX_K_PRESOL'"); ++ } else if (!strcmp("LPX_K_BINARIZE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_USECUTS", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_BFTYPE", keystr)){ ++ glp_bfcp bfcp; ++ ++ glp_get_bfcp(lp, &bfcp); ++ switch(PYINT_AS_LONG(value)){ ++ case 1: bfcp.type = GLP_BF_FT; break; ++ case 2: bfcp.type = GLP_BF_BG; break; ++ case 3: bfcp.type = GLP_BF_GR; break; ++ default: goto error; + } +- else lpx_set_int_parm(lp, param_id, +-#if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value)); +-#else +- PyInt_AS_LONG(value)); +-#endif +- } +- else { +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value) && !PyFloat_Check(value)){ +-#else +- if (!PyInt_Check(value) && !PyFloat_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for floating point " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- lpx_set_real_parm(lp, param_id, +- PyFloat_AsDouble(value)); ++ glp_set_bfcp(lp, &bfcp); ++ } else if (!strcmp("LPX_K_MIPGAP", keystr)){ ++ /* Ignored */ ++ } else { ++ sprintf(err_str, "unknown GLPK parameter: %-.20s", keystr); ++ PyErr_SetString(PyExc_ValueError, err_str); ++ glp_delete_prob(lp); ++ Py_DECREF(param); ++ return NULL; + } ++ } + } +- lpx_set_int_parm(lp, LPX_K_PRESOL, 1); ++ smcp.presolve = GLP_ON; + Py_DECREF(param); + +- switch (lpx_simplex(lp)){ ++ switch (glp_simplex(lp, &smcp)){ + +- case LPX_E_OK: ++ case 0: + + x = (matrix *) Matrix_New(n,1,DOUBLE); + z = (matrix *) Matrix_New(m,1,DOUBLE); +@@ -329,71 +356,61 @@ static PyObject *simplex(PyObject *self, + Py_XDECREF(z); + Py_XDECREF(y); + Py_XDECREF(t); +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("optimal")); +-#else +- PyString_FromString("optimal")); +-#endif ++ PyTuple_SET_ITEM(t, 0, (PyObject *)PYSTRING_FROMSTRING("optimal")); + + for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_get_col_prim(lp, i+1); ++ MAT_BUFD(x)[i] = glp_get_col_prim(lp, i+1); + PyTuple_SET_ITEM(t, 1, (PyObject *) x); + + for (i=0; i<m; i++) +- MAT_BUFD(z)[i] = -lpx_get_row_dual(lp, i+1); ++ MAT_BUFD(z)[i] = -glp_get_row_dual(lp, i+1); + PyTuple_SET_ITEM(t, 2, (PyObject *) z); + + if (A){ + for (i=0; i<p; i++) +- MAT_BUFD(y)[i] = -lpx_get_row_dual(lp, m+i+1); ++ MAT_BUFD(y)[i] = -glp_get_row_dual(lp, m+i+1); + PyTuple_SET_ITEM(t, 3, (PyObject *) y); + } + +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return (PyObject *) t; + +- case LPX_E_NOPFS: ++ case GLP_ENOPFS: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("primal infeasible")); +-#else +- PyString_FromString("primal infeasible")); +-#endif ++ PYSTRING_FROMSTRING("primal infeasible")); + break; + +- case LPX_E_NODFS: ++ case GLP_ENODFS: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("dual infeasible")); +-#else +- PyString_FromString("dual infeasible")); +-#endif ++ PYSTRING_FROMSTRING("dual infeasible")); + break; + + default: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("unknown")); +-#else +- PyString_FromString("unknown")); +-#endif ++ PYSTRING_FROMSTRING("unknown")); + } + +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + + PyTuple_SET_ITEM(t, 1, Py_BuildValue("")); + PyTuple_SET_ITEM(t, 2, Py_BuildValue("")); + if (A) PyTuple_SET_ITEM(t, 3, Py_BuildValue("")); + + return (PyObject *) t; ++ ++error: ++ sprintf(err_str, "invalid value for GLPK parameter: %-.20s", keystr); ++ PyErr_SetString(PyExc_ValueError, err_str); ++ glp_delete_prob(lp); ++ Py_DECREF(param); ++ return NULL; + } + + +@@ -428,11 +445,12 @@ static PyObject *integer(PyObject *self, + matrix *c, *h, *b=NULL, *x=NULL; + PyObject *G, *A=NULL, *IntSet=NULL, *BinSet = NULL; + PyObject *t=NULL, *param, *key, *value; +- LPX *lp; +- int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL, param_id; ++ glp_prob *lp; ++ glp_iocp iocp; ++ int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL; + int_t pos=0; + double *a=NULL, val; +- char param_type, err_str[100]; ++ char err_str[100]; + #if PY_MAJOR_VERSION >= 3 + const char *keystr; + #else +@@ -490,18 +508,18 @@ static PyObject *integer(PyObject *self, + if ((BinSet) && (!PyAnySet_Check(BinSet))) + PY_ERR_TYPE("invalid binary index set"); + +- lp = lpx_create_prob(); +- lpx_add_rows(lp, m+p); +- lpx_add_cols(lp, n); ++ lp = glp_create_prob(); ++ glp_add_rows(lp, m+p); ++ glp_add_cols(lp, n); + + for (i=0; i<n; i++){ +- lpx_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); +- lpx_set_col_bnds(lp, i+1, LPX_FR, 0.0, 0.0); ++ glp_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); ++ glp_set_col_bnds(lp, i+1, GLP_FR, 0.0, 0.0); + } + for (i=0; i<m; i++) +- lpx_set_row_bnds(lp, i+1, LPX_UP, 0.0, MAT_BUFD(h)[i]); ++ glp_set_row_bnds(lp, i+1, GLP_UP, 0.0, MAT_BUFD(h)[i]); + for (i=0; i<p; i++) +- lpx_set_row_bnds(lp, i+m+1, LPX_FX, MAT_BUFD(b)[i], ++ glp_set_row_bnds(lp, i+m+1, GLP_FX, MAT_BUFD(b)[i], + MAT_BUFD(b)[i]); + + nnzmax = (SpMatrix_Check(G) ? SP_NNZ(G) : m*n ) + +@@ -510,7 +528,7 @@ static PyObject *integer(PyObject *self, + rn = (int *) calloc(nnzmax+1, sizeof(int)); + cn = (int *) calloc(nnzmax+1, sizeof(int)); + if (!a || !rn || !cn){ +- free(a); free(rn); free(cn); lpx_delete_prob(lp); ++ free(a); free(rn); free(cn); glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +@@ -549,77 +567,152 @@ static PyObject *integer(PyObject *self, + nnz++; + } + +- lpx_load_matrix(lp, nnz, rn, cn, a); ++ glp_load_matrix(lp, nnz, rn, cn, a); + free(rn); free(cn); free(a); + + if (!(t = PyTuple_New(2))) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + + if (!(param = PyObject_GetAttrString(glpk_module, "options")) + || !PyDict_Check(param)){ +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + PyErr_SetString(PyExc_AttributeError, + "missing glpk.options dictionary"); + return NULL; + } + +- while (PyDict_Next(param, &pos, &key, &value)) +-#if PY_MAJOR_VERSION >= 3 +- if ((PyUnicode_Check(key)) && (keystr = PyUnicode_AS_DATA(key)) +- && get_param_idx(keystr, ¶m_id, ¶m_type)){ +-#else +- if ((keystr = PyString_AsString(key)) && get_param_idx(keystr, +- ¶m_id, ¶m_type)){ +-#endif +- if (param_type == 'i'){ +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value)){ +-#else +- if (!PyInt_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for integer " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- if (!strcmp("LPX_K_PRESOL", keystr) && ++ glp_init_iocp(&iocp); ++ while (PyDict_Next(param, &pos, &key, &value)) { + #if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value) != 1){ ++ if ((PyUnicode_Check(key)) && (keystr = PyUnicode_AS_DATA(key))){ + #else +- PyInt_AS_LONG(value) != 1){ ++ if ((keystr = PyString_AsString(key))){ + #endif ++ if (!strcmp("LPX_K_MSGLEV", keystr)){ ++ switch (PYINT_AS_LONG(value)){ ++ case 0: iocp.msg_lev = GLP_MSG_OFF; break; ++ case 1: iocp.msg_lev = GLP_MSG_ERR; break; ++ case 2: iocp.msg_lev = GLP_MSG_ON; break; ++ case 3: iocp.msg_lev = GLP_MSG_ALL; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_SCALE", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: glp_unscale_prob(lp); break; ++ case 1: glp_scale_prob(lp, GLP_SF_EQ); break; ++ case 2: glp_scale_prob(lp, GLP_SF_GM); break; ++ case 3: glp_scale_prob(lp, GLP_SF_GM | GLP_SF_EQ); break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_DUAL", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_PRICE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_RELAX", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TOLBND", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TOLDJ", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TOLPIV", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_ROUND", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_OBJLL", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_OBJUL", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_ITLIM", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_ITCNT", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_TMLIM", keystr)){ ++ iocp.tm_lim = (int)(PyFloat_AsDouble(value) * 1000.0); ++ if (iocp.tm_lim < 0) ++ iocp.tm_lim = INT_MAX; ++ } else if (!strcmp("LPX_K_OUTFRQ", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_OUTDLY", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_BRANCH", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: iocp.br_tech = GLP_BR_FFV; break; ++ case 1: iocp.br_tech = GLP_BR_LFV; break; ++ case 2: iocp.br_tech = GLP_BR_DTH; break; ++ case 3: iocp.br_tech = GLP_BR_MFV; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_BTRACK", keystr)){ ++ switch(PYINT_AS_LONG(value)){ ++ case 0: iocp.bt_tech = GLP_BT_DFS; break; ++ case 1: iocp.bt_tech = GLP_BT_BFS; break; ++ case 2: iocp.bt_tech = GLP_BT_BPH; break; ++ case 3: iocp.bt_tech = GLP_BT_BLB; break; ++ default: goto error; ++ } ++ } else if (!strcmp("LPX_K_TOLINT", keystr)){ ++ iocp.tol_int = PyFloat_AsDouble(value); ++ if (iocp.tol_int < DBL_EPSILON || iocp.tol_int > 0.001) ++ goto error; ++ } else if (!strcmp("LPX_K_TOLOBJ", keystr)){ ++ iocp.tol_obj = PyFloat_AsDouble(value); ++ if (iocp.tol_obj < DBL_EPSILON || iocp.tol_obj > 0.001) ++ goto error; ++ } else if (!strcmp("LPX_K_MPSINFO", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSOBJ", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSORIG", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSWIDE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSFREE", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_MPSSKIP", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_LPTORIG", keystr)){ ++ /* Ignored */ ++ } else if (!strcmp("LPX_K_PRESOL", keystr)){ ++ if (PYINT_AS_LONG(value) != 1) + PyErr_Warn(PyExc_UserWarning, "ignoring value of " + "GLPK parameter 'LPX_K_PRESOL'"); ++ } else if (!strcmp("LPX_K_BINARIZE", keystr)){ ++ iocp.binarize = (PYINT_AS_LONG(value) == 0) ? GLP_OFF : GLP_ON; ++ } else if (!strcmp("LPX_K_USECUTS", keystr)){ ++ int cuts = PYINT_AS_LONG(value); ++ if (cuts & ~0xFF) ++ goto error; ++ iocp.cov_cuts = (cuts & 1) ? GLP_ON : GLP_OFF; ++ iocp.clq_cuts = (cuts & 2) ? GLP_ON : GLP_OFF; ++ iocp.gmi_cuts = (cuts & 4) ? GLP_ON : GLP_OFF; ++ iocp.mir_cuts = (cuts & 8) ? GLP_ON : GLP_OFF; ++ } else if (!strcmp("LPX_K_BFTYPE", keystr)){ ++ glp_bfcp bfcp; ++ ++ glp_get_bfcp(lp, &bfcp); ++ switch(PYINT_AS_LONG(value)){ ++ case 1: bfcp.type = GLP_BF_FT; break; ++ case 2: bfcp.type = GLP_BF_BG; break; ++ case 3: bfcp.type = GLP_BF_GR; break; ++ default: goto error; + } +- else +-#if PY_MAJOR_VERSION >= 3 +- lpx_set_int_parm(lp, param_id, PyLong_AS_LONG(value)); +-#else +- lpx_set_int_parm(lp, param_id, PyInt_AS_LONG(value)); +-#endif +- } +- else { +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value) && !PyFloat_Check(value)){ +-#else +- if (!PyInt_Check(value) && !PyFloat_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for floating point " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- lpx_set_real_parm(lp, param_id, +- PyFloat_AsDouble(value)); ++ glp_set_bfcp(lp, &bfcp); ++ } else if (!strcmp("LPX_K_MIPGAP", keystr)){ ++ iocp.mip_gap = PyFloat_AsDouble(value); ++ if (iocp.mip_gap < 0.0) ++ goto error; ++ } else { ++ sprintf(err_str, "unknown GLPK parameter: %-.20s", keystr); ++ PyErr_SetString(PyExc_ValueError, err_str); ++ glp_delete_prob(lp); ++ Py_DECREF(param); ++ return NULL; + } ++ } + } +- lpx_set_int_parm(lp, LPX_K_PRESOL, 1); ++ iocp.presolve = GLP_ON; + Py_DECREF(param); + + if (IntSet) { +@@ -628,22 +721,14 @@ static PyObject *integer(PyObject *self, + for (i=0; i<PySet_GET_SIZE(IntSet); i++) { + + PyObject *tmp = PySequence_Fast_GET_ITEM(iter, i); +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(tmp)) { +-#else +- if (!PyInt_Check(tmp)) { +-#endif +- lpx_delete_prob(lp); ++ if (!PYINT_CHECK(tmp)) { ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR_TYPE("non-integer element in I"); + } +-#if PY_MAJOR_VERSION >= 3 +- int k = PyLong_AS_LONG(tmp); +-#else +- int k = PyInt_AS_LONG(tmp); +-#endif ++ int k = PYINT_AS_LONG(tmp); + if ((k < 0) || (k >= n)) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR(PyExc_IndexError, "index element out of range in I"); + } +@@ -659,22 +744,14 @@ static PyObject *integer(PyObject *self, + for (i=0; i<PySet_GET_SIZE(BinSet); i++) { + + PyObject *tmp = PySequence_Fast_GET_ITEM(iter, i); +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(tmp)) { +-#else +- if (!PyInt_Check(tmp)) { +-#endif +- lpx_delete_prob(lp); ++ if (!PYINT_CHECK(tmp)) { ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR_TYPE("non-binary element in I"); + } +-#if PY_MAJOR_VERSION >= 3 +- int k = PyLong_AS_LONG(tmp); +-#else +- int k = PyInt_AS_LONG(tmp); +-#endif ++ int k = PYINT_AS_LONG(tmp); + if ((k < 0) || (k >= n)) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR(PyExc_IndexError, "index element out of range in B"); + } +@@ -686,117 +763,92 @@ static PyObject *integer(PyObject *self, + } + + ++ switch (glp_intopt(lp, &iocp)){ + +- switch (lpx_intopt(lp)){ +- +- case LPX_E_OK: ++ case 0: + + x = (matrix *) Matrix_New(n,1,DOUBLE); + if (!x) { + Py_XDECREF(t); +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("optimal")); +-#else +- PyString_FromString("optimal")); +-#endif ++ PyTuple_SET_ITEM(t, 0, (PyObject *)PYSTRING_FROMSTRING("optimal")); + + for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_mip_col_val(lp, i+1); ++ MAT_BUFD(x)[i] = glp_mip_col_val(lp, i+1); + PyTuple_SET_ITEM(t, 1, (PyObject *) x); + +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return (PyObject *) t; + +- case LPX_E_TMLIM: ++ case GLP_ETMLIM: + + x = (matrix *) Matrix_New(n,1,DOUBLE); + if (!x) { + Py_XDECREF(t); +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("time limit exceeded")); +-#else +- PyString_FromString("time limit exceeded")); +-#endif ++ PYSTRING_FROMSTRING("time limit exceeded")); + + for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_mip_col_val(lp, i+1); ++ MAT_BUFD(x)[i] = glp_mip_col_val(lp, i+1); + PyTuple_SET_ITEM(t, 1, (PyObject *) x); + +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return (PyObject *) t; + + +- case LPX_E_FAULT: ++ case GLP_EBADB: ++ case GLP_ECOND: ++ case GLP_EBOUND: + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("invalid MIP formulation")); +-#else +- PyString_FromString("invalid MIP formulation")); +-#endif ++ PYSTRING_FROMSTRING("invalid MIP formulation")); + break; + +- case LPX_E_NOPFS: ++ case GLP_ENOPFS: + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("primal infeasible")); +-#else +- PyString_FromString("primal infeasible")); +-#endif ++ PYSTRING_FROMSTRING("primal infeasible")); + break; + +- case LPX_E_NODFS: ++ case GLP_ENODFS: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("dual infeasible")); +-#else +- PyString_FromString("dual infeasible")); +-#endif ++ PYSTRING_FROMSTRING("dual infeasible")); + break; + +- case LPX_E_ITLIM: ++ case GLP_EITLIM: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("maxiters exceeded")); +-#else +- PyString_FromString("maxiters exceeded")); +-#endif ++ PYSTRING_FROMSTRING("maxiters exceeded")); + break; + +- case LPX_E_SING: ++ case GLP_ESING: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("singular or ill-conditioned basis")); +-#else +- PyString_FromString("singular or ill-conditioned basis")); +-#endif ++ PYSTRING_FROMSTRING("singular or ill-conditioned basis")); + break; + + + default: + + PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("unknown")); +-#else +- PyString_FromString("unknown")); +-#endif ++ PYSTRING_FROMSTRING("unknown")); + } + +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + + PyTuple_SET_ITEM(t, 1, Py_BuildValue("")); + return (PyObject *) t; ++ ++error: ++ sprintf(err_str, "invalid value for GLPK parameter: %-.20s", keystr); ++ PyErr_SetString(PyExc_ValueError, err_str); ++ glp_delete_prob(lp); ++ Py_DECREF(param); ++ return NULL; + } + + diff --git a/dev-python/cvxopt/files/cvxopt-1.1.6-glpk449.patch b/dev-python/cvxopt/files/cvxopt-1.1.6-glpk449.patch new file mode 100644 index 000000000000..2a1cc6737be4 --- /dev/null +++ b/dev-python/cvxopt/files/cvxopt-1.1.6-glpk449.patch @@ -0,0 +1,1082 @@ +--- src/C/glpk.c.orig 2014-03-24 09:39:39.510214726 -0700 ++++ src/C/glpk.c 2014-03-24 09:38:41.251897138 -0700 +@@ -23,75 +23,271 @@ + #include "misc.h" + #include "glpk.h" + ++ + PyDoc_STRVAR(glpk__doc__, + "Interface to the simplex and mixed integer LP algorithms in GLPK.\n\n" + "The GLPK control parameters have the default values listed in \n" +- "the GLPK documentation, except for 'LPX_K_PRESOL', which is set\n" ++ "the GLPK documentation, except for 'presolve', which is set\n" + "to 1 and cannot be modified. The other parameters can be\n" +- "modified by making an entry in the dictionary glpk.options.\n" +- "For example, the command glpk.options['LPX_K_MSGLEV'] = 0 turns\n" +- "off the printed output during execution of glpk.simplex().\n" ++ "modified by passing a smcp or iocp object to the appropriate function\n" ++ "For example, the commands param = glpk.smcp(msg_lev = 0), or \n" ++ "param=glpk.smcp(); param.msg_lev=1 turn off the printed output during" ++ " execution of glpk.simplex().\n" + "See the documentation at www.gnu.org/software/glpk/glpk.html for\n" + "the list of GLPK control parameters and their default values."); + + static PyObject *glpk_module; + +-typedef struct { +- char name[20]; +- int idx; +- char type; +-} param_tuple; +- +-static const param_tuple GLPK_PARAM_LIST[] = { +- {"LPX_K_MSGLEV", LPX_K_MSGLEV, 'i'}, +- {"LPX_K_SCALE", LPX_K_SCALE, 'i'}, +- {"LPX_K_DUAL", LPX_K_DUAL, 'i'}, +- {"LPX_K_PRICE", LPX_K_PRICE, 'i'}, +- {"LPX_K_RELAX", LPX_K_RELAX, 'f'}, +- {"LPX_K_TOLBND", LPX_K_TOLBND, 'f'}, +- {"LPX_K_TOLDJ", LPX_K_TOLDJ, 'f'}, +- {"LPX_K_TOLPIV", LPX_K_TOLPIV, 'f'}, +- {"LPX_K_ROUND", LPX_K_ROUND, 'i'}, +- {"LPX_K_OBJLL", LPX_K_OBJLL, 'f'}, +- {"LPX_K_OBJUL", LPX_K_OBJUL, 'f'}, +- {"LPX_K_ITLIM", LPX_K_ITLIM, 'i'}, +- {"LPX_K_ITCNT", LPX_K_ITCNT, 'i'}, +- {"LPX_K_TMLIM", LPX_K_TMLIM, 'f'}, +- {"LPX_K_OUTFRQ", LPX_K_OUTFRQ, 'i'}, +- {"LPX_K_OUTDLY", LPX_K_OUTDLY, 'f'}, +- {"LPX_K_BRANCH", LPX_K_BRANCH, 'i'}, +- {"LPX_K_BTRACK", LPX_K_BTRACK, 'i'}, +- {"LPX_K_TOLINT", LPX_K_TOLINT, 'f'}, +- {"LPX_K_TOLOBJ", LPX_K_TOLOBJ, 'f'}, +- {"LPX_K_MPSINFO", LPX_K_MPSINFO, 'i'}, +- {"LPX_K_MPSOBJ", LPX_K_MPSOBJ, 'i'}, +- {"LPX_K_MPSORIG", LPX_K_MPSORIG, 'i'}, +- {"LPX_K_MPSWIDE", LPX_K_MPSWIDE, 'i'}, +- {"LPX_K_MPSFREE", LPX_K_MPSFREE, 'i'}, +- {"LPX_K_MPSSKIP", LPX_K_MPSSKIP, 'i'}, +- {"LPX_K_LPTORIG", LPX_K_LPTORIG, 'i'}, +- {"LPX_K_PRESOL", LPX_K_PRESOL, 'i'}, +-}; /* 28 paramaters */ ++/* Wrappers around the option glpk structs */ ++typedef struct{ ++ PyObject_HEAD ++ glp_smcp obj; ++} pysmcp; + ++/* Deallocation of smcp object */ ++static void smcp_dealloc(pysmcp* self) ++{ ++ Py_TYPE(self)->tp_free((PyObject*)self); ++} + +-#if PY_MAJOR_VERSION >= 3 +-static int get_param_idx(const char *str, int *idx, char *type) +-#else +-static int get_param_idx(char *str, int *idx, char *type) +-#endif ++/* New smcp method */ ++static PyObject * ++smcp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) + { +- int i; ++ pysmcp *self; ++ self = (pysmcp *)type->tp_alloc(type, 0); ++ return (PyObject *)self; ++} ++ ++/* Initialisation of smcp object */ ++static int ++smcp_init(pysmcp *self, PyObject *args, PyObject *kwds) ++{ ++ /*static char *kwlist[] = {"number", NULL};*/ ++ static char *kwlist[] = { "msg_lev", "meth", "pricing", "r_test", "tol_bnd", "tol_dj", "tol_piv", "obj_ll", "obj_ul", "it_lim", "tm_lim", "out_frq", "out_dly", "presolve" }; ++ glp_init_smcp(&self->obj); ++ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiidddddiiiii", kwlist, ++ &self->obj.msg_lev, ++ &self->obj.meth, ++ &self->obj.pricing, ++ &self->obj.r_test, ++ &self->obj.tol_bnd, ++ &self->obj.tol_dj, ++ &self->obj.tol_piv, ++ &self->obj.obj_ll, ++ &self->obj.obj_ul, ++ &self->obj.it_lim, ++ &self->obj.tm_lim, ++ &self->obj.out_frq, ++ &self->obj.out_dly, ++ &self->obj.presolve)) ++ return -1; + +- for (i=0; i<28; i++) { +- if (!strcmp(GLPK_PARAM_LIST[i].name, str)) { +- *idx = GLPK_PARAM_LIST[i].idx; +- *type = GLPK_PARAM_LIST[i].type; +- return 1; +- } +- } + return 0; + } + ++/* smcp members declaration */ ++static PyMemberDef smcpMembers[] = { ++ {"msg_lev", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,msg_lev), 0, "message level: "}, ++ {"meth", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,meth), 0, "simplex method option: "}, ++ {"pricing", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,pricing), 0, "pricing technique: "}, ++ {"r_test", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,r_test), 0, "ratio test technique: "}, ++ {"tol_bnd", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_smcp,tol_bnd), 0, "spx.tol_bnd "}, ++ {"tol_dj", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_smcp,tol_dj), 0, "spx.tol_dj "}, ++ {"tol_piv", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_smcp,tol_piv), 0, "spx.tol_piv "}, ++ {"obj_ll", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_smcp,obj_ll), 0, "spx.obj_ll "}, ++ {"obj_ul", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_smcp,obj_ul), 0, "spx.obj_ul "}, ++ {"it_lim", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,it_lim), 0, "spx.it_lim "}, ++ {"tm_lim", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,tm_lim), 0, "spx.tm_lim (milliseconds) "}, ++ {"out_frq", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,out_frq), 0, "spx.out_frq "}, ++ {"out_dly", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,out_dly), 0, "spx.out_dly (milliseconds) "}, ++ {"presolve", T_INT, offsetof(pysmcp,obj)+offsetof(glp_smcp,presolve), 0, "enable/disable using LP presolver "}, ++}; ++ ++static PyTypeObject smcp_t = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "glpk.smcp", /* tp_name */ ++ sizeof(pysmcp), /* tp_basicsize */ ++ 0, /* tp_itemsize */ ++ (destructor)smcp_dealloc, /* tp_dealloc */ ++ 0, /* tp_print */ ++ 0, /* tp_getattr */ ++ 0, /* tp_setattr */ ++ 0, /* tp_reserved */ ++ 0, /* tp_repr */ ++ 0, /* tp_as_number */ ++ 0, /* tp_as_sequence */ ++ 0, /* tp_as_mapping */ ++ 0, /* tp_hash */ ++ 0, /* tp_call */ ++ 0, /* tp_str */ ++ 0, /* tp_getattro */ ++ 0, /* tp_setattro */ ++ 0, /* tp_as_buffer */ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE, /* tp_flags */ ++ "simplex method control parameters", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ 0, /* tp_methods */ ++ smcpMembers, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)smcp_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ smcp_new, /* tp_new */ ++}; ++ ++ ++/* Wrappers around the option glpk structs */ ++typedef struct{ ++ PyObject_HEAD ++ glp_iocp obj; ++} pyiocp; ++ ++/* Deallocation of iocp object */ ++static void iocp_dealloc(pysmcp* self) ++{ ++ Py_TYPE(self)->tp_free((PyObject*)self); ++} ++ ++/* New iocp method */ ++static PyObject * ++iocp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ++{ ++ pyiocp *self; ++ self = (pyiocp *)type->tp_alloc(type, 0); ++ return (PyObject *)self; ++} ++ ++/* Initialisation of iocp object */ ++static int ++iocp_init(pyiocp *self, PyObject *args, PyObject *kwds) ++{ ++ /*static char *kwlist[] = {"number", NULL};*/ ++ static char *kwlist[] = { "msg_lev", "br_tech", "bt_tech", "tol_int", "tol_obj", "tm_lim", "out_frq", "out_dly", "cb_size", "pp_tech", "mip_gap", "mir_cuts", "gmi_cuts", "cov_cuts", "clq_cuts", "presolve", "binarize", "fp_heur", "ps_heur", "ps_tm_lim", "use_sol", "save_sol", "alien",NULL}; ++ glp_init_iocp(&self->obj); ++ ++ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiddiiiiidiiiiiiiiiisi", kwlist, ++ &self->obj.msg_lev, ++ &self->obj.br_tech, ++ &self->obj.bt_tech, ++ &self->obj.tol_int, ++ &self->obj.tol_obj, ++ &self->obj.tm_lim, ++ &self->obj.out_frq, ++ &self->obj.out_dly, ++ &self->obj.cb_size, ++ &self->obj.pp_tech, ++ &self->obj.mip_gap, ++ &self->obj.mir_cuts, ++ &self->obj.gmi_cuts, ++ &self->obj.cov_cuts, ++ &self->obj.clq_cuts, ++ &self->obj.presolve, ++ &self->obj.binarize, ++ &self->obj.fp_heur, ++ &self->obj.ps_heur, ++ &self->obj.ps_tm_lim, ++ &self->obj.use_sol, ++ &self->obj.save_sol, ++ &self->obj.alien)) ++ return -1; ++ ++ return 0; ++} ++ ++/* iocp members declaration */ ++static PyMemberDef iocpMembers[] = { ++ {"msg_lev", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,msg_lev), 0, "message level (see glp_smcp) "}, ++ {"br_tech", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,br_tech), 0, "branching technique: "}, ++ {"bt_tech", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,bt_tech), 0, "backtracking technique: "}, ++ {"tol_int", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_iocp,tol_int), 0, "mip.tol_int "}, ++ {"tol_obj", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_iocp,tol_obj), 0, "mip.tol_obj "}, ++ {"tm_lim", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,tm_lim), 0, "mip.tm_lim (milliseconds) "}, ++ {"out_frq", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,out_frq), 0, "mip.out_frq (milliseconds) "}, ++ {"out_dly", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,out_dly), 0, "mip.out_dly (milliseconds) "}, ++ /*void (*cb_func)(glp_tree *T, void *info); [> mip.cb_func <]*/ ++ /*void *cb_info; [> mip.cb_info <]*/ ++ {"cb_size", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,cb_size), 0, "mip.cb_size "}, ++ {"pp_tech", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,pp_tech), 0, "preprocessing technique: "}, ++ {"mip_gap", T_DOUBLE, offsetof(pysmcp,obj)+offsetof(glp_iocp,mip_gap), 0, "relative MIP gap tolerance "}, ++ {"mir_cuts", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,mir_cuts), 0, "MIR cuts (GLP_ON/GLP_OFF) "}, ++ {"gmi_cuts", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,gmi_cuts), 0, "Gomory's cuts (GLP_ON/GLP_OFF) "}, ++ {"cov_cuts", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,cov_cuts), 0, "cover cuts (GLP_ON/GLP_OFF) "}, ++ {"clq_cuts", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,clq_cuts), 0, "clique cuts (GLP_ON/GLP_OFF) "}, ++ {"presolve", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,presolve), 0, "enable/disable using MIP presolver "}, ++ {"binarize", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,binarize), 0, "try to binarize integer variables "}, ++ {"fp_heur", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,fp_heur), 0, "feasibility pump heuristic "}, ++ {"ps_heur", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,ps_heur), 0, "proximity search heuristic "}, ++ {"ps_tm_lim", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,ps_tm_lim), 0, "proxy time limit, milliseconds "}, ++ {"use_sol", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,use_sol), 0, "use existing solution "}, ++ {"save_sol",T_STRING,offsetof(pysmcp,obj)+offsetof(glp_iocp,save_sol),0, "filename to save every new solution"}, ++ {"alien", T_INT, offsetof(pysmcp,obj)+offsetof(glp_iocp,alien), 0, "use alien solver "}, ++}; ++ ++static PyTypeObject iocp_t = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "glpk.iocp", /* tp_name */ ++ sizeof(pyiocp), /* tp_basicsize */ ++ 0, /* tp_itemsize */ ++ (destructor)iocp_dealloc, /* tp_dealloc */ ++ 0, /* tp_print */ ++ 0, /* tp_getattr */ ++ 0, /* tp_setattr */ ++ 0, /* tp_reserved */ ++ 0, /* tp_repr */ ++ 0, /* tp_as_number */ ++ 0, /* tp_as_sequence */ ++ 0, /* tp_as_mapping */ ++ 0, /* tp_hash */ ++ 0, /* tp_call */ ++ 0, /* tp_str */ ++ 0, /* tp_getattro */ ++ 0, /* tp_setattro */ ++ 0, /* tp_as_buffer */ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE, /* tp_flags */ ++ "integer optimizer control parameters", /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ 0, /* tp_methods */ ++ iocpMembers, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)iocp_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ iocp_new, /* tp_new */ ++}; ++ ++ ++ ++/* Small helper function to generate the output string of the simplex function */ ++inline static void set_output_string(PyObject* t,const char s[]) { ++ PyTuple_SET_ITEM(t, 0, (PyObject *) ++#if PY_MAJOR_VERSION >= 3 ++ PyUnicode_FromString(s)); ++#else ++ PyString_FromString(s)); ++#endif ++ } ++ + + static char doc_simplex[] = + "Solves a linear program using GLPK.\n\n" +@@ -126,21 +322,16 @@ + PyObject *kwrds) + { + matrix *c, *h, *b=NULL, *x=NULL, *z=NULL, *y=NULL; +- PyObject *G, *A=NULL, *t=NULL, *param, *key, *value; +- LPX *lp; +- int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL, param_id; +- int_t pos=0; ++ PyObject *G, *A=NULL, *t=NULL; ++ glp_prob *lp; ++ glp_smcp *options = NULL; ++ pysmcp *smcpParm = NULL; ++ int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL; + double *a=NULL, val; +- char param_type, err_str[100]; +-#if PY_MAJOR_VERSION >= 3 +- const char *keystr; +-#else +- char *keystr; +-#endif +- char *kwlist[] = {"c", "G", "h", "A", "b", NULL}; ++ char *kwlist[] = {"c", "G", "h", "A", "b","options", NULL}; + +- if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OOO|OO", kwlist, &c, +- &G, &h, &A, &b)) return NULL; ++ if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OOO|OOO!", kwlist, &c, ++ &G, &h, &A, &b,&smcp_t,&smcpParm)) return NULL; + + if ((Matrix_Check(G) && MAT_ID(G) != DOUBLE) || + (SpMatrix_Check(G) && SP_ID(G) != DOUBLE) || +@@ -182,19 +373,30 @@ + PyErr_SetString(PyExc_ValueError, "incompatible dimensions"); + return NULL; + } ++ if(!smcpParm) ++ { ++ smcpParm = (pysmcp*)malloc(sizeof(*smcpParm)); ++ glp_init_smcp(&(smcpParm->obj)); ++ } ++ if(smcpParm) ++ { ++ Py_INCREF(smcpParm); ++ options = &smcpParm->obj; ++ options->presolve = 1; ++ } + +- lp = lpx_create_prob(); +- lpx_add_rows(lp, m+p); +- lpx_add_cols(lp, n); ++ lp = glp_create_prob(); ++ glp_add_rows(lp, m+p); ++ glp_add_cols(lp, n); + + for (i=0; i<n; i++){ +- lpx_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); +- lpx_set_col_bnds(lp, i+1, LPX_FR, 0.0, 0.0); ++ glp_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); ++ glp_set_col_bnds(lp, i+1, GLP_FR, 0.0, 0.0); + } + for (i=0; i<m; i++) +- lpx_set_row_bnds(lp, i+1, LPX_UP, 0.0, MAT_BUFD(h)[i]); ++ glp_set_row_bnds(lp, i+1, GLP_UP, 0.0, MAT_BUFD(h)[i]); + for (i=0; i<p; i++) +- lpx_set_row_bnds(lp, i+m+1, LPX_FX, MAT_BUFD(b)[i], ++ glp_set_row_bnds(lp, i+m+1, GLP_FX, MAT_BUFD(b)[i], + MAT_BUFD(b)[i]); + + nnzmax = (SpMatrix_Check(G) ? SP_NNZ(G) : m*n ) + +@@ -203,7 +405,7 @@ + rn = (int *) calloc(nnzmax+1, sizeof(int)); + cn = (int *) calloc(nnzmax+1, sizeof(int)); + if (!a || !rn || !cn){ +- free(a); free(rn); free(cn); lpx_delete_prob(lp); ++ free(a); free(rn); free(cn); glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +@@ -242,84 +444,18 @@ + nnz++; + } + +- lpx_load_matrix(lp, nnz, rn, cn, a); ++ glp_load_matrix(lp, nnz, rn, cn, a); + free(rn); free(cn); free(a); + + if (!(t = PyTuple_New(A ? 4 : 3))){ +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +- if (!(param = PyObject_GetAttrString(glpk_module, "options")) +- || !PyDict_Check(param)){ +- lpx_delete_prob(lp); +- PyErr_SetString(PyExc_AttributeError, +- "missing glpk.options dictionary"); +- return NULL; +- } +- +- while (PyDict_Next(param, &pos, &key, &value)) +-#if PY_MAJOR_VERSION >= 3 +- if ((PyUnicode_Check(key)) && +- get_param_idx(_PyUnicode_AsString(key), ¶m_id, +- ¶m_type)){ +- keystr = _PyUnicode_AsString(key); +-#else +- if ((keystr = PyString_AsString(key)) && get_param_idx(keystr, +- ¶m_id, ¶m_type)){ +-#endif +- if (param_type == 'i'){ +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value)){ +-#else +- if (!PyInt_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for integer " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- if (!strcmp("LPX_K_PRESOL", keystr) && +-#if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value) != 1){ +-#else +- PyInt_AS_LONG(value) != 1){ +-#endif +- PyErr_Warn(PyExc_UserWarning, "ignoring value of " +- "GLPK parameter 'LPX_K_PRESOL'"); +- } +- else lpx_set_int_parm(lp, param_id, +-#if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value)); +-#else +- PyInt_AS_LONG(value)); +-#endif +- } +- else { +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value) && !PyFloat_Check(value)){ +-#else +- if (!PyInt_Check(value) && !PyFloat_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for floating point " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- lpx_set_real_parm(lp, param_id, +- PyFloat_AsDouble(value)); +- } +- } +- lpx_set_int_parm(lp, LPX_K_PRESOL, 1); +- Py_DECREF(param); + +- switch (lpx_simplex(lp)){ ++ switch (glp_simplex(lp,options)){ + +- case LPX_E_OK: ++ case 0: + + x = (matrix *) Matrix_New(n,1,DOUBLE); + z = (matrix *) Matrix_New(m,1,DOUBLE); +@@ -329,65 +465,70 @@ + Py_XDECREF(z); + Py_XDECREF(y); + Py_XDECREF(t); +- lpx_delete_prob(lp); ++ Py_XDECREF(smcpParm); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("optimal")); +-#else +- PyString_FromString("optimal")); +-#endif ++ set_output_string(t,"optimal"); + + for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_get_col_prim(lp, i+1); ++ MAT_BUFD(x)[i] = glp_get_col_prim(lp, i+1); + PyTuple_SET_ITEM(t, 1, (PyObject *) x); + + for (i=0; i<m; i++) +- MAT_BUFD(z)[i] = -lpx_get_row_dual(lp, i+1); ++ MAT_BUFD(z)[i] = -glp_get_row_dual(lp, i+1); + PyTuple_SET_ITEM(t, 2, (PyObject *) z); + + if (A){ + for (i=0; i<p; i++) +- MAT_BUFD(y)[i] = -lpx_get_row_dual(lp, m+i+1); ++ MAT_BUFD(y)[i] = -glp_get_row_dual(lp, m+i+1); + PyTuple_SET_ITEM(t, 3, (PyObject *) y); + } + +- lpx_delete_prob(lp); ++ Py_XDECREF(smcpParm); ++ glp_delete_prob(lp); + return (PyObject *) t; +- +- case LPX_E_NOPFS: +- +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("primal infeasible")); +-#else +- PyString_FromString("primal infeasible")); +-#endif ++ case GLP_EBADB: ++ set_output_string(t,"incorrect initial basis"); + break; +- +- case LPX_E_NODFS: +- +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("dual infeasible")); +-#else +- PyString_FromString("dual infeasible")); +-#endif ++ case GLP_ESING: ++ set_output_string(t,"singular initial basis matrix"); ++ break; ++ case GLP_ECOND: ++ set_output_string(t,"ill-conditioned initial basis matrix"); ++ break; ++ case GLP_EBOUND: ++ set_output_string(t,"incorrect bounds"); ++ break; ++ case GLP_EFAIL: ++ set_output_string(t,"solver failure"); ++ break; ++ case GLP_EOBJLL: ++ set_output_string(t,"objective function reached lower limit"); ++ break; ++ case GLP_EOBJUL: ++ set_output_string(t,"objective function reached upper limit"); ++ break; ++ case GLP_EITLIM: ++ set_output_string(t,"iteration limit exceeded"); ++ break; ++ case GLP_ETMLIM: ++ set_output_string(t,"time limit exceeded"); ++ break; ++ case GLP_ENOPFS: ++ set_output_string(t,"primal infeasible"); ++ break; ++ case GLP_ENODFS: ++ set_output_string(t,"dual infeasible"); + break; +- + default: +- +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("unknown")); +-#else +- PyString_FromString("unknown")); +-#endif ++ set_output_string(t,"unknown"); ++ break; + } + +- lpx_delete_prob(lp); ++ Py_XDECREF(smcpParm); ++ glp_delete_prob(lp); + + PyTuple_SET_ITEM(t, 1, Py_BuildValue("")); + PyTuple_SET_ITEM(t, 2, Py_BuildValue("")); +@@ -427,21 +568,28 @@ + { + matrix *c, *h, *b=NULL, *x=NULL; + PyObject *G, *A=NULL, *IntSet=NULL, *BinSet = NULL; +- PyObject *t=NULL, *param, *key, *value; +- LPX *lp; +- int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL, param_id; +- int_t pos=0; ++ PyObject *t=NULL; ++ pyiocp *iocpParm = NULL;; ++ glp_iocp *options = NULL; ++ glp_prob *lp; ++ int m, n, p, i, j, k, nnz, nnzmax, *rn=NULL, *cn=NULL; + double *a=NULL, val; +- char param_type, err_str[100]; +-#if PY_MAJOR_VERSION >= 3 +- const char *keystr; +-#else +- char *keystr; +-#endif +- char *kwlist[] = {"c", "G", "h", "A", "b", "I", "B", NULL}; ++ char *kwlist[] = {"c", "G", "h", "A", "b", "I", "B","iocp", NULL}; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OOO|OOOOO!", kwlist, &c, ++ &G, &h, &A, &b, &IntSet, &BinSet,iocp_t,&iocpParm)) return NULL; + +- if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OOO|OOOO", kwlist, &c, +- &G, &h, &A, &b, &IntSet, &BinSet)) return NULL; ++ if(!iocpParm) ++ { ++ iocpParm = (pyiocp*)malloc(sizeof(*iocpParm)); ++ glp_init_iocp(&(iocpParm->obj)); ++ } ++ if(iocpParm) ++ { ++ Py_INCREF(iocpParm); ++ options = &iocpParm->obj; ++ options->presolve = 1; ++ } + + if ((Matrix_Check(G) && MAT_ID(G) != DOUBLE) || + (SpMatrix_Check(G) && SP_ID(G) != DOUBLE) || +@@ -490,18 +638,18 @@ + if ((BinSet) && (!PyAnySet_Check(BinSet))) + PY_ERR_TYPE("invalid binary index set"); + +- lp = lpx_create_prob(); +- lpx_add_rows(lp, m+p); +- lpx_add_cols(lp, n); ++ lp = glp_create_prob(); ++ glp_add_rows(lp, m+p); ++ glp_add_cols(lp, n); + + for (i=0; i<n; i++){ +- lpx_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); +- lpx_set_col_bnds(lp, i+1, LPX_FR, 0.0, 0.0); ++ glp_set_obj_coef(lp, i+1, MAT_BUFD(c)[i]); ++ glp_set_col_bnds(lp, i+1, GLP_FR, 0.0, 0.0); + } + for (i=0; i<m; i++) +- lpx_set_row_bnds(lp, i+1, LPX_UP, 0.0, MAT_BUFD(h)[i]); ++ glp_set_row_bnds(lp, i+1, GLP_UP, 0.0, MAT_BUFD(h)[i]); + for (i=0; i<p; i++) +- lpx_set_row_bnds(lp, i+m+1, LPX_FX, MAT_BUFD(b)[i], ++ glp_set_row_bnds(lp, i+m+1, GLP_FX, MAT_BUFD(b)[i], + MAT_BUFD(b)[i]); + + nnzmax = (SpMatrix_Check(G) ? SP_NNZ(G) : m*n ) + +@@ -510,7 +658,7 @@ + rn = (int *) calloc(nnzmax+1, sizeof(int)); + cn = (int *) calloc(nnzmax+1, sizeof(int)); + if (!a || !rn || !cn){ +- free(a); free(rn); free(cn); lpx_delete_prob(lp); ++ free(a); free(rn); free(cn); glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +@@ -549,79 +697,14 @@ + nnz++; + } + +- lpx_load_matrix(lp, nnz, rn, cn, a); ++ glp_load_matrix(lp, nnz, rn, cn, a); + free(rn); free(cn); free(a); + + if (!(t = PyTuple_New(2))) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + return PyErr_NoMemory(); + } + +- if (!(param = PyObject_GetAttrString(glpk_module, "options")) +- || !PyDict_Check(param)){ +- lpx_delete_prob(lp); +- PyErr_SetString(PyExc_AttributeError, +- "missing glpk.options dictionary"); +- return NULL; +- } +- +- while (PyDict_Next(param, &pos, &key, &value)) +-#if PY_MAJOR_VERSION >= 3 +- if ((PyUnicode_Check(key)) && (keystr = PyUnicode_AS_DATA(key)) +- && get_param_idx(keystr, ¶m_id, ¶m_type)){ +-#else +- if ((keystr = PyString_AsString(key)) && get_param_idx(keystr, +- ¶m_id, ¶m_type)){ +-#endif +- if (param_type == 'i'){ +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value)){ +-#else +- if (!PyInt_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for integer " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- if (!strcmp("LPX_K_PRESOL", keystr) && +-#if PY_MAJOR_VERSION >= 3 +- PyLong_AS_LONG(value) != 1){ +-#else +- PyInt_AS_LONG(value) != 1){ +-#endif +- PyErr_Warn(PyExc_UserWarning, "ignoring value of " +- "GLPK parameter 'LPX_K_PRESOL'"); +- } +- else +-#if PY_MAJOR_VERSION >= 3 +- lpx_set_int_parm(lp, param_id, PyLong_AS_LONG(value)); +-#else +- lpx_set_int_parm(lp, param_id, PyInt_AS_LONG(value)); +-#endif +- } +- else { +-#if PY_MAJOR_VERSION >= 3 +- if (!PyLong_Check(value) && !PyFloat_Check(value)){ +-#else +- if (!PyInt_Check(value) && !PyFloat_Check(value)){ +-#endif +- sprintf(err_str, "invalid value for floating point " +- "GLPK parameter: %-.20s", keystr); +- PyErr_SetString(PyExc_ValueError, err_str); +- lpx_delete_prob(lp); +- Py_DECREF(param); +- return NULL; +- } +- lpx_set_real_parm(lp, param_id, +- PyFloat_AsDouble(value)); +- } +- } +- lpx_set_int_parm(lp, LPX_K_PRESOL, 1); +- Py_DECREF(param); +- + if (IntSet) { + PyObject *iter = PySequence_Fast(IntSet, "Critical error: not sequence"); + +@@ -633,7 +716,7 @@ + #else + if (!PyInt_Check(tmp)) { + #endif +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR_TYPE("non-integer element in I"); + } +@@ -643,7 +726,7 @@ + int k = PyInt_AS_LONG(tmp); + #endif + if ((k < 0) || (k >= n)) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR(PyExc_IndexError, "index element out of range in I"); + } +@@ -664,7 +747,7 @@ + #else + if (!PyInt_Check(tmp)) { + #endif +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR_TYPE("non-binary element in I"); + } +@@ -674,7 +757,7 @@ + int k = PyInt_AS_LONG(tmp); + #endif + if ((k < 0) || (k >= n)) { +- lpx_delete_prob(lp); ++ glp_delete_prob(lp); + Py_DECREF(iter); + PY_ERR(PyExc_IndexError, "index element out of range in B"); + } +@@ -686,114 +769,85 @@ + } + + ++ switch (glp_intopt(lp,options)){ + +- switch (lpx_intopt(lp)){ ++ case 0: + +- case LPX_E_OK: ++ x = (matrix *) Matrix_New(n,1,DOUBLE); ++ if (!x) { ++ Py_XDECREF(iocpParm); ++ Py_XDECREF(t); ++ glp_delete_prob(lp); ++ return PyErr_NoMemory(); ++ } ++ set_output_string(t,"optimal"); ++ set_output_string(t,"optimal"); + +- x = (matrix *) Matrix_New(n,1,DOUBLE); +- if (!x) { +- Py_XDECREF(t); +- lpx_delete_prob(lp); +- return PyErr_NoMemory(); +- } +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("optimal")); +-#else +- PyString_FromString("optimal")); +-#endif ++ for (i=0; i<n; i++) ++ MAT_BUFD(x)[i] = glp_mip_col_val(lp, i+1); ++ PyTuple_SET_ITEM(t, 1, (PyObject *) x); + +- for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_mip_col_val(lp, i+1); +- PyTuple_SET_ITEM(t, 1, (PyObject *) x); ++ Py_XDECREF(iocpParm); ++ glp_delete_prob(lp); ++ return (PyObject *) t; + +- lpx_delete_prob(lp); +- return (PyObject *) t; ++ case GLP_ETMLIM: + +- case LPX_E_TMLIM: ++ x = (matrix *) Matrix_New(n,1,DOUBLE); ++ if (!x) { ++ Py_XDECREF(t); ++ Py_XDECREF(iocpParm); ++ glp_delete_prob(lp); ++ return PyErr_NoMemory(); ++ } ++ set_output_string(t,"time limit exceeded"); + +- x = (matrix *) Matrix_New(n,1,DOUBLE); +- if (!x) { +- Py_XDECREF(t); +- lpx_delete_prob(lp); +- return PyErr_NoMemory(); +- } +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("time limit exceeded")); +-#else +- PyString_FromString("time limit exceeded")); +-#endif ++ for (i=0; i<n; i++) ++ MAT_BUFD(x)[i] = glp_mip_col_val(lp, i+1); ++ PyTuple_SET_ITEM(t, 1, (PyObject *) x); + +- for (i=0; i<n; i++) +- MAT_BUFD(x)[i] = lpx_mip_col_val(lp, i+1); +- PyTuple_SET_ITEM(t, 1, (PyObject *) x); +- +- lpx_delete_prob(lp); +- return (PyObject *) t; ++ Py_XDECREF(iocpParm); ++ glp_delete_prob(lp); ++ return (PyObject *) t; + + +- case LPX_E_FAULT: +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("invalid MIP formulation")); +-#else +- PyString_FromString("invalid MIP formulation")); +-#endif +- break; ++ case GLP_EBOUND: ++ set_output_string(t,"incorrect bounds"); ++ break; ++ case GLP_EFAIL: ++ set_output_string(t,"invalid MIP formulation"); ++ break; + +- case LPX_E_NOPFS: +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("primal infeasible")); +-#else +- PyString_FromString("primal infeasible")); +-#endif +- break; ++ case GLP_ENOPFS: ++ set_output_string(t,"primal infeasible"); ++ break; + +- case LPX_E_NODFS: ++ case GLP_ENODFS: ++ set_output_string(t,"dual infeasible"); ++ break; + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("dual infeasible")); +-#else +- PyString_FromString("dual infeasible")); +-#endif +- break; ++ case GLP_EMIPGAP: ++ set_output_string(t,"Relative mip gap tolerance reached"); ++ break; + +- case LPX_E_ITLIM: ++ /*case LPX_E_ITLIM: + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("maxiters exceeded")); +-#else +- PyString_FromString("maxiters exceeded")); +-#endif +- break; ++ set_output_string(t,"maxiters exceeded"); ++ break;*/ + +- case LPX_E_SING: ++ /*case LPX_E_SING: + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("singular or ill-conditioned basis")); +-#else +- PyString_FromString("singular or ill-conditioned basis")); +-#endif +- break; ++ set_output_string(t,"singular or ill-conditioned basis"); ++ break;*/ + + +- default: ++ default: + +- PyTuple_SET_ITEM(t, 0, (PyObject *) +-#if PY_MAJOR_VERSION >= 3 +- PyUnicode_FromString("unknown")); +-#else +- PyString_FromString("unknown")); +-#endif +- } ++ set_output_string(t,"unknown"); ++ } + +- lpx_delete_prob(lp); ++ Py_XDECREF(iocpParm); ++ glp_delete_prob(lp); + + PyTuple_SET_ITEM(t, 1, Py_BuildValue("")); + return (PyObject *) t; +@@ -819,10 +873,94 @@ + NULL, NULL, NULL, NULL + }; + ++void addglpkConstants (void) ++{ ++ PyModule_AddIntMacro(glpk_module, GLP_ON); ++ PyModule_AddIntMacro(glpk_module,GLP_OFF); ++ ++ /* reason codes: */ ++ PyModule_AddIntMacro(glpk_module,GLP_IROWGEN); ++ PyModule_AddIntMacro(glpk_module,GLP_IBINGO); ++ PyModule_AddIntMacro(glpk_module,GLP_IHEUR); ++ PyModule_AddIntMacro(glpk_module,GLP_ICUTGEN); ++ PyModule_AddIntMacro(glpk_module,GLP_IBRANCH); ++ PyModule_AddIntMacro(glpk_module,GLP_ISELECT); ++ PyModule_AddIntMacro(glpk_module,GLP_IPREPRO); ++ ++ /* branch selection indicator: */ ++ PyModule_AddIntMacro(glpk_module,GLP_NO_BRNCH); ++ PyModule_AddIntMacro(glpk_module,GLP_DN_BRNCH); ++ PyModule_AddIntMacro(glpk_module,GLP_UP_BRNCH); ++ ++ /* return codes: */ ++ PyModule_AddIntMacro(glpk_module,GLP_EBADB); ++ PyModule_AddIntMacro(glpk_module,GLP_ESING); ++ PyModule_AddIntMacro(glpk_module,GLP_ECOND); ++ PyModule_AddIntMacro(glpk_module,GLP_EBOUND); ++ PyModule_AddIntMacro(glpk_module,GLP_EFAIL); ++ PyModule_AddIntMacro(glpk_module,GLP_EOBJLL); ++ PyModule_AddIntMacro(glpk_module,GLP_EOBJUL); ++ PyModule_AddIntMacro(glpk_module,GLP_EITLIM); ++ PyModule_AddIntMacro(glpk_module,GLP_ETMLIM); ++ PyModule_AddIntMacro(glpk_module,GLP_ENOPFS); ++ PyModule_AddIntMacro(glpk_module,GLP_ENODFS); ++ PyModule_AddIntMacro(glpk_module,GLP_EROOT); ++ PyModule_AddIntMacro(glpk_module,GLP_ESTOP); ++ PyModule_AddIntMacro(glpk_module,GLP_EMIPGAP); ++ PyModule_AddIntMacro(glpk_module,GLP_ENOFEAS); ++ PyModule_AddIntMacro(glpk_module,GLP_ENOCVG); ++ PyModule_AddIntMacro(glpk_module,GLP_EINSTAB); ++ PyModule_AddIntMacro(glpk_module,GLP_EDATA); ++ PyModule_AddIntMacro(glpk_module,GLP_ERANGE); ++ ++ /* condition indicator: */ ++ PyModule_AddIntMacro(glpk_module,GLP_KKT_PE); ++ PyModule_AddIntMacro(glpk_module,GLP_KKT_PB); ++ PyModule_AddIntMacro(glpk_module,GLP_KKT_DE); ++ PyModule_AddIntMacro(glpk_module,GLP_KKT_DB); ++ PyModule_AddIntMacro(glpk_module,GLP_KKT_CS); ++ ++ /* MPS file format: */ ++ PyModule_AddIntMacro(glpk_module,GLP_MPS_DECK); ++ PyModule_AddIntMacro(glpk_module,GLP_MPS_FILE); ++ ++ /* simplex method control parameters */ ++ /* message level: */ ++ PyModule_AddIntMacro(glpk_module,GLP_MSG_OFF); ++ PyModule_AddIntMacro(glpk_module,GLP_MSG_ERR); ++ PyModule_AddIntMacro(glpk_module,GLP_MSG_ON); ++ PyModule_AddIntMacro(glpk_module,GLP_MSG_ALL); ++ PyModule_AddIntMacro(glpk_module,GLP_MSG_DBG); ++ /* simplex method option: */ ++ PyModule_AddIntMacro(glpk_module,GLP_PRIMAL); ++ PyModule_AddIntMacro(glpk_module,GLP_DUALP); ++ PyModule_AddIntMacro(glpk_module,GLP_DUAL); ++ /* pricing technique: */ ++ PyModule_AddIntMacro(glpk_module,GLP_PT_STD); ++ PyModule_AddIntMacro(glpk_module,GLP_PT_PSE); ++ /* ratio test technique: */ ++ PyModule_AddIntMacro(glpk_module,GLP_RT_STD); ++ PyModule_AddIntMacro(glpk_module,GLP_RT_HAR); ++ ++ /* interior-point solver control parameters */ ++ /* ordering algorithm: */ ++ PyModule_AddIntMacro(glpk_module,GLP_ORD_NONE); ++ PyModule_AddIntMacro(glpk_module,GLP_ORD_QMD); ++ PyModule_AddIntMacro(glpk_module,GLP_ORD_AMD); ++ PyModule_AddIntMacro(glpk_module,GLP_ORD_SYMAMD); ++} ++ + PyMODINIT_FUNC PyInit_glpk(void) + { + if (!(glpk_module = PyModule_Create(&glpk_module_def))) return NULL; +- PyModule_AddObject(glpk_module, "options", PyDict_New()); ++ if (PyType_Ready(&iocp_t) < 0 || (PyType_Ready(&smcp_t) < 0)) return NULL; ++ /* Adding macros */ ++ addglpkConstants(); ++ /* Adding option lists as objects */ ++ Py_INCREF(&smcp_t); ++ PyModule_AddObject(glpk_module,"smcp",(PyObject*)&smcp_t); ++ Py_INCREF(&iocp_t); ++ PyModule_AddObject(glpk_module,"iocp",(PyObject*)&iocp_t); + if (import_cvxopt() < 0) return NULL; + return glpk_module; + } +@@ -832,8 +970,13 @@ + PyMODINIT_FUNC initglpk(void) + { + glpk_module = Py_InitModule3("cvxopt.glpk", glpk_functions, +- glpk__doc__); +- PyModule_AddObject(glpk_module, "options", PyDict_New()); ++ glpk__doc__); ++ if (PyType_Ready(&iocp_t) < 0 || (PyType_Ready(&smcp_t) < 0)) return NULL; ++ addglpkConstants(); ++ Py_INCREF(&smcp_t); ++ PyModule_AddObject(glpk_module,"smcp",(PyObject*)&smcp_t); ++ Py_INCREF(&iocp_t); ++ PyModule_AddObject(glpk_module,"iocp",(PyObject*)&iocp_t); + if (import_cvxopt() < 0) return; + } + diff --git a/dev-python/cvxopt/files/cvxopt-1.1.6-setup.patch b/dev-python/cvxopt/files/cvxopt-1.1.6-setup.patch new file mode 100644 index 000000000000..c95f31bf6048 --- /dev/null +++ b/dev-python/cvxopt/files/cvxopt-1.1.6-setup.patch @@ -0,0 +1,176 @@ +--- setup.py.orig 2013-05-16 21:36:29.616510963 +1200 ++++ setup.py 2013-05-16 21:51:08.456347311 +1200 +@@ -2,7 +2,7 @@ + from glob import glob + + # Modifiy this if BLAS and LAPACK libraries are not in /usr/lib. +-BLAS_LIB_DIR = '/usr/lib' ++BLAS_LIB_DIR = '' + + # Default names of BLAS and LAPACK libraries + BLAS_LIB = ['blas'] +@@ -18,37 +18,37 @@ + BUILD_GSL = 0 + + # Directory containing libgsl (used only when BUILD_GSL = 1). +-GSL_LIB_DIR = '/usr/lib' ++GSL_LIB_DIR = '' + + # Directory containing the GSL header files (used only when BUILD_GSL = 1). +-GSL_INC_DIR = '/usr/include/gsl' ++GSL_INC_DIR = '' + + # Set to 1 if you are installing the fftw module. + BUILD_FFTW = 0 + + # Directory containing libfftw3 (used only when BUILD_FFTW = 1). +-FFTW_LIB_DIR = '/usr/lib' ++FFTW_LIB_DIR = '' + + # Directory containing fftw.h (used only when BUILD_FFTW = 1). +-FFTW_INC_DIR = '/usr/include' ++FFTW_INC_DIR = '' + + # Set to 1 if you are installing the glpk module. + BUILD_GLPK = 0 + + # Directory containing libglpk (used only when BUILD_GLPK = 1). +-GLPK_LIB_DIR = '/usr/lib' ++GLPK_LIB_DIR = '' + + # Directory containing glpk.h (used only when BUILD_GLPK = 1). +-GLPK_INC_DIR = '/usr/include' ++GLPK_INC_DIR = '' + + # Set to 1 if you are installing the DSDP module. + BUILD_DSDP = 0 + + # Directory containing libdsdp (used only when BUILD_DSDP = 1). +-DSDP_LIB_DIR = '/usr/lib' ++DSDP_LIB_DIR = '' + + # Directory containing dsdp5.h (used only when BUILD_DSDP = 1). +-DSDP_INC_DIR = '/usr/include/dsdp' ++DSDP_INC_DIR = '' + + # No modifications should be needed below this line. + +@@ -61,39 +61,32 @@ + # optional modules + + if BUILD_GSL: +- gsl = Extension('gsl', libraries = ['m', 'gsl'] + BLAS_LIB, +- include_dirs = [ GSL_INC_DIR ], +- library_dirs = [ GSL_LIB_DIR, BLAS_LIB_DIR ], +- extra_link_args = BLAS_EXTRA_LINK_ARGS, ++ gsl = Extension('gsl', libraries = ['gsl'], ++ library_dirs = [ GSL_LIB_DIR ], + sources = ['src/C/gsl.c'] ) + extmods += [gsl]; + + if BUILD_FFTW: +- fftw = Extension('fftw', libraries = ['fftw3'] + BLAS_LIB, +- include_dirs = [ FFTW_INC_DIR ], +- library_dirs = [ FFTW_LIB_DIR, BLAS_LIB_DIR ], +- extra_link_args = BLAS_EXTRA_LINK_ARGS, ++ fftw = Extension('fftw', libraries = ['fftw3'], ++ library_dirs = [ FFTW_LIB_DIR ], + sources = ['src/C/fftw.c'] ) + extmods += [fftw]; + + if BUILD_GLPK: + glpk = Extension('glpk', libraries = ['glpk'], +- include_dirs = [ GLPK_INC_DIR ], + library_dirs = [ GLPK_LIB_DIR ], + sources = ['src/C/glpk.c'] ) + extmods += [glpk]; + + if BUILD_DSDP: +- dsdp = Extension('dsdp', libraries = ['dsdp'] + LAPACK_LIB + BLAS_LIB, +- include_dirs = [ DSDP_INC_DIR ], +- library_dirs = [ DSDP_LIB_DIR, BLAS_LIB_DIR ], +- extra_link_args = BLAS_EXTRA_LINK_ARGS, ++ dsdp = Extension('dsdp', libraries = ['dsdp'], ++ library_dirs = [ DSDP_LIB_DIR ], + sources = ['src/C/dsdp.c'] ) + extmods += [dsdp]; + + # Required modules + +-base = Extension('base', libraries = ['m'] + LAPACK_LIB + BLAS_LIB, ++base = Extension('base', libraries = ['m'] + LAPACK_LIB, + library_dirs = [ BLAS_LIB_DIR ], + define_macros = MACROS, + extra_link_args = BLAS_EXTRA_LINK_ARGS, +@@ -105,61 +98,36 @@ + extra_link_args = BLAS_EXTRA_LINK_ARGS, + sources = ['src/C/blas.c'] ) + +-lapack = Extension('lapack', libraries = LAPACK_LIB + BLAS_LIB, ++lapack = Extension('lapack', libraries = LAPACK_LIB, + library_dirs = [ BLAS_LIB_DIR ], + define_macros = MACROS, + extra_link_args = BLAS_EXTRA_LINK_ARGS, + sources = ['src/C/lapack.c'] ) + + umfpack = Extension('umfpack', +- include_dirs = [ 'src/C/SuiteSparse/UMFPACK/Include', +- 'src/C/SuiteSparse/AMD/Include', +- 'src/C/SuiteSparse/AMD/Source', +- 'src/C/SuiteSparse/SuiteSparse_config' ], + library_dirs = [ BLAS_LIB_DIR ], + define_macros = MACROS + [('NTIMER', '1'), ('NCHOLMOD', '1')], +- libraries = LAPACK_LIB + BLAS_LIB, ++ libraries = [ 'umfpack' ], + extra_compile_args = ['-Wno-unknown-pragmas'], +- extra_link_args = BLAS_EXTRA_LINK_ARGS, +- sources = [ 'src/C/umfpack.c', +- 'src/C/SuiteSparse/UMFPACK/Source/umfpack_global.c', +- 'src/C/SuiteSparse/UMFPACK/Source/umfpack_tictoc.c' ] + +- ['src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.c'] + +- glob('src/C/SuiteSparse_cvxopt_extra/umfpack/*')) ++ sources = [ 'src/C/umfpack.c' ]) + + # Build for int or long? + import sys + if sys.maxsize > 2**31: MACROS += [('DLONG',None)] + + cholmod = Extension('cholmod', +- library_dirs = [ BLAS_LIB_DIR ], +- libraries = LAPACK_LIB + BLAS_LIB, +- include_dirs = [ 'src/C/SuiteSparse/CHOLMOD/Include', +- 'src/C/SuiteSparse/COLAMD', +- 'src/C/SuiteSparse/AMD/Include', +- 'src/C/SuiteSparse/COLAMD/Include', +- 'src/C/SuiteSparse/SuiteSparse_config' ], +- define_macros = MACROS + [('NPARTITION', '1'), ('NTIMER', '1')], +- extra_link_args = BLAS_EXTRA_LINK_ARGS, +- sources = [ 'src/C/cholmod.c' ] + +- ['src/C/SuiteSparse/AMD/Source/' + s for s in ['amd_global.c', +- 'amd_postorder.c', 'amd_post_tree.c', 'amd_2.c']] + +- ['src/C/SuiteSparse/COLAMD/Source/' + s for s in ['colamd.c', +- 'colamd_global.c']] + +- ['src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.c'] + +- glob('src/C/SuiteSparse/CHOLMOD/Core/c*.c') + +- glob('src/C/SuiteSparse/CHOLMOD/Cholesky/c*.c') + +- ['src/C/SuiteSparse/CHOLMOD/Check/cholmod_check.c'] + +- glob('src/C/SuiteSparse/CHOLMOD/Supernodal/c*.c') ) ++ library_dirs = [ BLAS_LIB_DIR ], ++ libraries = ['cholmod'] + BLAS_LIB, ++ define_macros = MACROS + [('NPARTITION', '1'), ('NTIMER', '1')], ++ sources = [ 'src/C/cholmod.c' ]) + + amd = Extension('amd', +- include_dirs = [ 'src/C/SuiteSparse/AMD/Include', +- 'src/C/SuiteSparse/SuiteSparse_config' ], + define_macros = MACROS, +- sources = [ 'src/C/amd.c' ] + glob('src/C/SuiteSparse/AMD/Source/*.c') ) ++ libraries = ['amd'], ++ sources = [ 'src/C/amd.c' ]) + + misc_solvers = Extension('misc_solvers', +- libraries = LAPACK_LIB + BLAS_LIB, ++ libraries = LAPACK_LIB, + library_dirs = [ BLAS_LIB_DIR ], + define_macros = MACROS, + extra_link_args = BLAS_EXTRA_LINK_ARGS, diff --git a/dev-python/cvxopt/metadata.xml b/dev-python/cvxopt/metadata.xml new file mode 100644 index 000000000000..9202e558f39b --- /dev/null +++ b/dev-python/cvxopt/metadata.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>sci-mathematics</herd> + <longdescription lang="en"> + CVXOPT is a software for convex optimization based on + the Python programming language. Its main purpose is to make the + development of software for convex optimization applications + straightforward. +</longdescription> + <use> + <flag name="dsdp">Use interior point library + <pkg>sci-libs/dsdp</pkg></flag> + <flag name="glpk">Use GNU Linear Programming Kit + <pkg>sci-mathematics/glpk</pkg></flag> + </use> + <upstream> + <remote-id type="github">cvxopt/cvxopt</remote-id> + </upstream> +</pkgmetadata> |