Merge branch 'release/1.6.1'

This commit is contained in:
Stuart Mitchell 2015-12-25 15:12:52 +09:00
commit 2e75bf0e50
9 changed files with 43 additions and 188 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

7
setup.cfg Normal file
View File

@ -0,0 +1,7 @@
[build_sphinx]
source-dir = doc/source
build-dir = build/doc
all_files = 1
[upload_sphinx]
upload-dir = doc/build/html

View File

@ -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/

View File

@ -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

View File

@ -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()