Merge branch 'release/1.6.1'
This commit is contained in:
commit
2e75bf0e50
39
.travis.yml
39
.travis.yml
|
@ -1,20 +1,25 @@
|
||||||
language: python
|
language: python
|
||||||
python:
|
python:
|
||||||
- "2.6"
|
- '2.6'
|
||||||
- "2.7"
|
- '2.7'
|
||||||
- "3.2"
|
- '3.2'
|
||||||
- "3.3"
|
- '3.3'
|
||||||
- "3.4"
|
- '3.4'
|
||||||
# does not have headers provided, please ask https://launchpad.net/~pypy/+archive/ppa
|
- pypy
|
||||||
# maintainers to fix their pypy-dev package.
|
before_install:
|
||||||
- "pypy"
|
- sudo apt-get update -qq
|
||||||
before_install:
|
- sudo apt-get install -qq glpk
|
||||||
- sudo apt-get update -qq
|
|
||||||
- sudo apt-get install -qq glpk
|
|
||||||
#- pip install glpk
|
|
||||||
#- sudo apt-get install coinor-cbc
|
|
||||||
# command to install dependencies
|
|
||||||
install:
|
install:
|
||||||
- pip install .
|
- pip install .
|
||||||
# command to run tests
|
script: pulptest
|
||||||
script: pulptest
|
before_deploy:
|
||||||
|
- sudo apt-get install texlive-latex-extra
|
||||||
|
- sudo apt-get install dvipng
|
||||||
|
deploy:
|
||||||
|
provider: pypi
|
||||||
|
user: StuartMitchell
|
||||||
|
password:
|
||||||
|
secure: SVUU0MC4tLFS0EWqybpjWHKHumZ0qB6quhkvvx0pyfn4h6CIgZqhuWdSD/PJomlZp+dfqdQUVq3Tzl50UwQFG4OcBORJ+fVjxGJPkO5dpFsvtoNfBRNV9ZkYzMUx0djXxFKK2sVNqgI2O2sDvZk4eHDD09+mKtoSZ5XeT68Vqno=
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
repo: coin-or/pulp
|
||||||
|
|
2
HISTORY
2
HISTORY
|
@ -1,6 +1,8 @@
|
||||||
# PuLP, Copyright J.S. Roy (js@jeannot.org), 2002-2005
|
# PuLP, Copyright J.S. Roy (js@jeannot.org), 2002-2005
|
||||||
# Copyright S.A.Mitchell (s.mitchell@auckland.ac.nz), 2007-
|
# Copyright S.A.Mitchell (s.mitchell@auckland.ac.nz), 2007-
|
||||||
# See the LICENSE file for copyright information.
|
# See the LICENSE file for copyright information.
|
||||||
|
1.6.1, 2015-12-25
|
||||||
|
Fix for dummy variables
|
||||||
1.5.4, 2013-03-18
|
1.5.4, 2013-03-18
|
||||||
Added cbc support for osx (hopefully)
|
Added cbc support for osx (hopefully)
|
||||||
1.4.9, 2011-03-30
|
1.4.9, 2011-03-30
|
||||||
|
|
16
README.md
16
README.md
|
@ -11,7 +11,7 @@ The easiest way to install pulp is via [PyPi](https://pypi.python.org/pypi/PuLP)
|
||||||
If pip is available on your system
|
If pip is available on your system
|
||||||
|
|
||||||
$pip install pulp
|
$pip install pulp
|
||||||
|
|
||||||
Otherwise follow the download instructions on the PyPi page
|
Otherwise follow the download instructions on the PyPi page
|
||||||
On Linux and OSX systems the tests must be run to make the default
|
On Linux and OSX systems the tests must be run to make the default
|
||||||
solver executable.
|
solver executable.
|
||||||
|
@ -22,7 +22,7 @@ solver executable.
|
||||||
|
|
||||||
See the examples directory for examples.
|
See the examples directory for examples.
|
||||||
|
|
||||||
PuLP requires Python >= 2.5.
|
PuLP requires Python >= 2.6.
|
||||||
|
|
||||||
The examples use the default solver (cbc), to use other solvers they must be available.
|
The examples use the default solver (cbc), to use other solvers they must be available.
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ Use LpProblem() to create new problems. Create "myProblem"
|
||||||
>>> prob = LpProblem("myProblem", LpMinimize)
|
>>> prob = LpProblem("myProblem", LpMinimize)
|
||||||
|
|
||||||
Combine variables to create expressions and constraints and add them to the
|
Combine variables to create expressions and constraints and add them to the
|
||||||
problem.
|
problem.
|
||||||
|
|
||||||
>>> prob += x + y <= 2
|
>>> prob += x + y <= 2
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ become the objective.
|
||||||
To solve with the default included solver
|
To solve with the default included solver
|
||||||
|
|
||||||
>>> status = prob.solve()
|
>>> status = prob.solve()
|
||||||
|
|
||||||
To use another sovler to solve the problem.
|
To use another sovler to solve the problem.
|
||||||
|
|
||||||
>>> status = prob.solve(GLPK(msg = 0))
|
>>> status = prob.solve(GLPK(msg = 0))
|
||||||
|
@ -74,18 +74,18 @@ Exported Classes:
|
||||||
|
|
||||||
* LpProblem -- Container class for a Linear programming problem
|
* LpProblem -- Container class for a Linear programming problem
|
||||||
* LpVariable -- Variables that are added to constraints in the LP
|
* LpVariable -- Variables that are added to constraints in the LP
|
||||||
* LpConstraint -- A constraint of the general form
|
* LpConstraint -- A constraint of the general form
|
||||||
|
|
||||||
a1x1+a2x2 ...anxn (<=, =, >=) b
|
a1x1+a2x2 ...anxn (<=, =, >=) b
|
||||||
|
|
||||||
* LpConstraintVar -- Used to construct a column of the model in column-wise modelling
|
* LpConstraintVar -- Used to construct a column of the model in column-wise modelling
|
||||||
|
|
||||||
Exported Functions:
|
Exported Functions:
|
||||||
|
|
||||||
* value() -- Finds the value of a variable or expression
|
* value() -- Finds the value of a variable or expression
|
||||||
* lpSum() -- given a list of the form [a1*x1, a2x2, ..., anxn] will construct
|
* lpSum() -- given a list of the form [a1*x1, a2x2, ..., anxn] will construct
|
||||||
a linear expression to be used as a constraint or variable
|
a linear expression to be used as a constraint or variable
|
||||||
* lpDot() --given two lists of the form [a1, a2, ..., an] and
|
* lpDot() --given two lists of the form [a1, a2, ..., an] and
|
||||||
[ x1, x2, ..., xn] will construct a linear epression to be used
|
[ x1, x2, ..., xn] will construct a linear epression to be used
|
||||||
as a constraint or variable
|
as a constraint or variable
|
||||||
|
|
||||||
|
|
124
bootstrap.py
124
bootstrap.py
|
@ -1,124 +0,0 @@
|
||||||
##############################################################################
|
|
||||||
#
|
|
||||||
# Copyright (c) 2006 Zope Corporation and Contributors.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# This software is subject to the provisions of the Zope Public License,
|
|
||||||
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
|
|
||||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
|
|
||||||
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
|
|
||||||
# FOR A PARTICULAR PURPOSE.
|
|
||||||
#
|
|
||||||
##############################################################################
|
|
||||||
"""Bootstrap a buildout-based project
|
|
||||||
|
|
||||||
Simply run this script in a directory containing a buildout.cfg.
|
|
||||||
The script accepts buildout command-line options, so you can
|
|
||||||
use the -c option to specify an alternate configuration file.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os, shutil, sys, tempfile
|
|
||||||
try:
|
|
||||||
from urllib.request import urlopen
|
|
||||||
except ImportError:
|
|
||||||
from urllib2 import urlopen
|
|
||||||
from optparse import OptionParser
|
|
||||||
|
|
||||||
tmpeggs = tempfile.mkdtemp()
|
|
||||||
|
|
||||||
is_jython = sys.platform.startswith('java')
|
|
||||||
|
|
||||||
# parsing arguments
|
|
||||||
parser = OptionParser()
|
|
||||||
parser.add_option("-v", "--version", dest="version",
|
|
||||||
help="use a specific zc.buildout version")
|
|
||||||
parser.add_option("-d", "--distribute",
|
|
||||||
action="store_true", dest="distribute", default=False,
|
|
||||||
help="Use Disribute rather than Setuptools.")
|
|
||||||
|
|
||||||
options, args = parser.parse_args()
|
|
||||||
|
|
||||||
if options.version is not None:
|
|
||||||
VERSION = '==%s' % options.version
|
|
||||||
else:
|
|
||||||
VERSION = ''
|
|
||||||
|
|
||||||
USE_DISTRIBUTE = options.distribute
|
|
||||||
args = args + ['bootstrap']
|
|
||||||
|
|
||||||
to_reload = False
|
|
||||||
try:
|
|
||||||
import pkg_resources
|
|
||||||
if not hasattr(pkg_resources, '_distribute'):
|
|
||||||
to_reload = True
|
|
||||||
raise ImportError
|
|
||||||
except ImportError:
|
|
||||||
ez = {}
|
|
||||||
if USE_DISTRIBUTE:
|
|
||||||
exec(urlopen('http://python-distribute.org/distribute_setup.py'
|
|
||||||
).read(), ez)
|
|
||||||
ez['use_setuptools'](to_dir=tmpeggs, download_delay=0, no_fake=True)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
exec(urlopen('http://peak.telecommunity.com/dist/ez_setup.py')
|
|
||||||
.read(), ez)
|
|
||||||
except SyntaxError:
|
|
||||||
exec(urlopen('http://python-distribute.org/distribute_setup.py')
|
|
||||||
.read(), ez)
|
|
||||||
ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
|
|
||||||
|
|
||||||
if to_reload:
|
|
||||||
try:
|
|
||||||
reload(pkg_resources)
|
|
||||||
except NameError: # distribute is deprecated by now
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
import pkg_resources
|
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
def quote(c):
|
|
||||||
if ' ' in c:
|
|
||||||
return '"%s"' % c # work around spawn lamosity on windows
|
|
||||||
else:
|
|
||||||
return c
|
|
||||||
else:
|
|
||||||
def quote (c):
|
|
||||||
return c
|
|
||||||
|
|
||||||
cmd = 'from setuptools.command.easy_install import main; main()'
|
|
||||||
ws = pkg_resources.working_set
|
|
||||||
|
|
||||||
if USE_DISTRIBUTE:
|
|
||||||
requirement = 'distribute'
|
|
||||||
else:
|
|
||||||
requirement = 'setuptools'
|
|
||||||
|
|
||||||
if is_jython:
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
assert subprocess.Popen([sys.executable] + ['-c', quote(cmd), '-mqNxd',
|
|
||||||
quote(tmpeggs), 'zc.buildout' + VERSION],
|
|
||||||
env=dict(os.environ,
|
|
||||||
PYTHONPATH=
|
|
||||||
ws.find(pkg_resources.Requirement.parse(requirement)).location
|
|
||||||
),
|
|
||||||
).wait() == 0
|
|
||||||
|
|
||||||
else:
|
|
||||||
assert os.spawnle(
|
|
||||||
os.P_WAIT, sys.executable, quote (sys.executable),
|
|
||||||
'-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout' + VERSION,
|
|
||||||
dict(os.environ,
|
|
||||||
PYTHONPATH=
|
|
||||||
ws.find(pkg_resources.Requirement.parse(requirement)).location
|
|
||||||
),
|
|
||||||
) == 0
|
|
||||||
|
|
||||||
ws.add_entry(tmpeggs)
|
|
||||||
ws.require('zc.buildout' + VERSION)
|
|
||||||
import zc.buildout.buildout
|
|
||||||
zc.buildout.buildout.main(args)
|
|
||||||
shutil.rmtree(tmpeggs)
|
|
14
buildout.cfg
14
buildout.cfg
|
@ -1,14 +0,0 @@
|
||||||
[buildout]
|
|
||||||
develop = .
|
|
||||||
parts = pythonpulp scripts
|
|
||||||
|
|
||||||
[pythonpulp]
|
|
||||||
recipe = zc.recipe.egg
|
|
||||||
interpreter = pythonpulp
|
|
||||||
eggs = pulp
|
|
||||||
|
|
||||||
[scripts]
|
|
||||||
recipe = zc.recipe.egg:scripts
|
|
||||||
eggs = pulp
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[build_sphinx]
|
||||||
|
source-dir = doc/source
|
||||||
|
build-dir = build/doc
|
||||||
|
all_files = 1
|
||||||
|
|
||||||
|
[upload_sphinx]
|
||||||
|
upload-dir = doc/build/html
|
21
solvers.cfg
21
solvers.cfg
|
@ -1,21 +0,0 @@
|
||||||
[buildout]
|
|
||||||
extends = buildout.cfg
|
|
||||||
|
|
||||||
[glpk]
|
|
||||||
recipe = zc.recipe.cmmi
|
|
||||||
url = http://ftp.gnu.org/gnu/glpk/glpk-4.42.tar.gz
|
|
||||||
|
|
||||||
[cbc]
|
|
||||||
recipe = zc.recipe.cmmi
|
|
||||||
url = http://www.coin-or.org/download/source/Cbc/Cbc-2.4.0.tgz
|
|
||||||
|
|
||||||
[coinMP]
|
|
||||||
recipe = zc.recipe.cmmi
|
|
||||||
#url = http://pulp-or.googlecode.com/files/CoinMP-1.4.0patched.tar.gz
|
|
||||||
url = http://www.coin-or.org/download/source/CoinMP/CoinMP-1.4.0.tgz
|
|
||||||
#patch = ${buildout:directory}/patches/CoinMP-1.4.0.patch
|
|
||||||
|
|
||||||
[install-coinMP]
|
|
||||||
recipe = plone.recipe.command
|
|
||||||
command = cp ${buildout:directory}/parts/coinMP/lib/* ${buildout:directory}/src/pulp/solverdir/
|
|
||||||
update-command = cp ${buildout:directory}/parts/coinMP/lib/* ${buildout:directory}/src/pulp/solverdir/
|
|
|
@ -27,7 +27,7 @@
|
||||||
This file contains the constant definitions for PuLP
|
This file contains the constant definitions for PuLP
|
||||||
Note that hopefully these will be changed into something more pythonic
|
Note that hopefully these will be changed into something more pythonic
|
||||||
"""
|
"""
|
||||||
VERSION = '1.6.0'
|
VERSION = '1.6.1'
|
||||||
EPS = 1e-7
|
EPS = 1e-7
|
||||||
|
|
||||||
# variable categories
|
# variable categories
|
||||||
|
|
|
@ -243,7 +243,7 @@ class LpVariable(LpElement):
|
||||||
This class models an LP Variable with the specified associated parameters
|
This class models an LP Variable with the specified associated parameters
|
||||||
|
|
||||||
:param name: The name of the variable used in the output .lp file
|
:param name: The name of the variable used in the output .lp file
|
||||||
:param lowbound: The lower bound on this variable's range.
|
:param lowBound: The lower bound on this variable's range.
|
||||||
Default is negative infinity
|
Default is negative infinity
|
||||||
:param upBound: The upper bound on this variable's range.
|
:param upBound: The upper bound on this variable's range.
|
||||||
Default is positive infinity
|
Default is positive infinity
|
||||||
|
@ -1498,7 +1498,7 @@ class LpProblem(object):
|
||||||
f.write("Minimize\n")
|
f.write("Minimize\n")
|
||||||
else:
|
else:
|
||||||
f.write("Maximize\n")
|
f.write("Maximize\n")
|
||||||
wasNone, dummyVar = self.fixObjective()
|
wasNone, objectiveDummyVar = self.fixObjective()
|
||||||
objName = self.objective.name
|
objName = self.objective.name
|
||||||
if not objName: objName = "OBJ"
|
if not objName: objName = "OBJ"
|
||||||
f.write(self.objective.asCplexLpAffineExpression(objName, constant = 0))
|
f.write(self.objective.asCplexLpAffineExpression(objName, constant = 0))
|
||||||
|
@ -1567,7 +1567,7 @@ class LpProblem(object):
|
||||||
f.write(" %s: %.12g\n" % (v.name, val))
|
f.write(" %s: %.12g\n" % (v.name, val))
|
||||||
f.write("End\n")
|
f.write("End\n")
|
||||||
f.close()
|
f.close()
|
||||||
self.restoreObjective(wasNone, dummyVar)
|
self.restoreObjective(wasNone, objectiveDummyVar)
|
||||||
|
|
||||||
def assignVarsVals(self, values):
|
def assignVarsVals(self, values):
|
||||||
variables = self.variablesDict()
|
variables = self.variablesDict()
|
||||||
|
|
Loading…
Reference in New Issue