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
|
||||
python:
|
||||
- "2.6"
|
||||
- "2.7"
|
||||
- "3.2"
|
||||
- "3.3"
|
||||
- "3.4"
|
||||
# does not have headers provided, please ask https://launchpad.net/~pypy/+archive/ppa
|
||||
# maintainers to fix their pypy-dev package.
|
||||
- "pypy"
|
||||
before_install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -qq glpk
|
||||
#- pip install glpk
|
||||
#- sudo apt-get install coinor-cbc
|
||||
# command to install dependencies
|
||||
- '2.6'
|
||||
- '2.7'
|
||||
- '3.2'
|
||||
- '3.3'
|
||||
- '3.4'
|
||||
- pypy
|
||||
before_install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -qq glpk
|
||||
install:
|
||||
- pip install .
|
||||
# command to run tests
|
||||
script: pulptest
|
||||
- pip install .
|
||||
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
|
||||
# Copyright S.A.Mitchell (s.mitchell@auckland.ac.nz), 2007-
|
||||
# See the LICENSE file for copyright information.
|
||||
1.6.1, 2015-12-25
|
||||
Fix for dummy variables
|
||||
1.5.4, 2013-03-18
|
||||
Added cbc support for osx (hopefully)
|
||||
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
|
||||
|
||||
$pip install pulp
|
||||
|
||||
|
||||
Otherwise follow the download instructions on the PyPi page
|
||||
On Linux and OSX systems the tests must be run to make the default
|
||||
solver executable.
|
||||
|
@ -22,7 +22,7 @@ solver executable.
|
|||
|
||||
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.
|
||||
|
||||
|
@ -43,7 +43,7 @@ Use LpProblem() to create new problems. Create "myProblem"
|
|||
>>> prob = LpProblem("myProblem", LpMinimize)
|
||||
|
||||
Combine variables to create expressions and constraints and add them to the
|
||||
problem.
|
||||
problem.
|
||||
|
||||
>>> prob += x + y <= 2
|
||||
|
||||
|
@ -55,7 +55,7 @@ become the objective.
|
|||
To solve with the default included solver
|
||||
|
||||
>>> status = prob.solve()
|
||||
|
||||
|
||||
To use another sovler to solve the problem.
|
||||
|
||||
>>> status = prob.solve(GLPK(msg = 0))
|
||||
|
@ -74,18 +74,18 @@ Exported Classes:
|
|||
|
||||
* LpProblem -- Container class for a Linear programming problem
|
||||
* 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
|
||||
|
||||
Exported Functions:
|
||||
|
||||
* 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
|
||||
* 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
|
||||
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
|
||||
Note that hopefully these will be changed into something more pythonic
|
||||
"""
|
||||
VERSION = '1.6.0'
|
||||
VERSION = '1.6.1'
|
||||
EPS = 1e-7
|
||||
|
||||
# variable categories
|
||||
|
|
|
@ -243,7 +243,7 @@ class LpVariable(LpElement):
|
|||
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 lowbound: The lower bound on this variable's range.
|
||||
:param lowBound: The lower bound on this variable's range.
|
||||
Default is negative infinity
|
||||
:param upBound: The upper bound on this variable's range.
|
||||
Default is positive infinity
|
||||
|
@ -1498,7 +1498,7 @@ class LpProblem(object):
|
|||
f.write("Minimize\n")
|
||||
else:
|
||||
f.write("Maximize\n")
|
||||
wasNone, dummyVar = self.fixObjective()
|
||||
wasNone, objectiveDummyVar = self.fixObjective()
|
||||
objName = self.objective.name
|
||||
if not objName: objName = "OBJ"
|
||||
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("End\n")
|
||||
f.close()
|
||||
self.restoreObjective(wasNone, dummyVar)
|
||||
self.restoreObjective(wasNone, objectiveDummyVar)
|
||||
|
||||
def assignVarsVals(self, values):
|
||||
variables = self.variablesDict()
|
||||
|
|
Loading…
Reference in New Issue