Skip to content

Commit

Permalink
Merge pull request #272 from Pyomo/expr_dev
Browse files Browse the repository at this point in the history
Merge Expression Branch
  • Loading branch information
whart222 authored Apr 27, 2018
2 parents bc89b21 + e92309d commit 996e0a8
Show file tree
Hide file tree
Showing 574 changed files with 196,806 additions and 10,753 deletions.
2 changes: 1 addition & 1 deletion .appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ install:
#
# Clone but don't install pyomo-model-libraries
#
- "git clone https://github.com/Pyomo/pyomo-model-libraries.git"
- "git clone -b expr_dev https://github.com/Pyomo/pyomo-model-libraries.git"
- "python -m pip install git+https://github.com/PyUtilib/pyutilib"
- "python setup.py develop"
#
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
.ropeproject

# Python generates numerous files when byte compiling / installing packages
*.pyx
*.pyc
*.pyo
*.egg-info
Expand Down
5 changes: 3 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ install:
#
# Clone but don't install pyomo-model-libraries
#
- git clone --quiet https://github.com/Pyomo/pyomo-model-libraries.git
- git clone -b expr_dev --quiet https://github.com/Pyomo/pyomo-model-libraries.git
#
# Install PyUtilib (master branch)
#
Expand Down Expand Up @@ -163,7 +163,8 @@ script:
- test.pyomo -v --cat=$CATEGORY pyomo `pwd`/pyomo-model-libraries

# Run documentation tests
- nosetests -v --with-doctest --doctest-extension=.rst doc/OnlineDocs
- cd doc/OnlineDocs; make doctests -d; cd ../..
# nosetests -v --with-doctest --doctest-extension=.rst doc/OnlineDocs


after_success:
Expand Down
5 changes: 5 additions & 0 deletions pyomo/repn/ampl_repn.py → ATTIC/repn/ampl_repn.py
Original file line number Diff line number Diff line change
Expand Up @@ -796,9 +796,14 @@ def generate_ampl_repn(exp, idMap=None):
# We need to do this not at the global scope in case someone changed
# the mode after importing the environment.
_using_pyomo4_trees = expr_common.mode == expr_common.Mode.pyomo4_trees
_using_pyomo5_trees = expr_common.mode == expr_common.Mode.pyomo5_trees

if idMap is None:
idMap = {}
if _using_pyomo5_trees:
from pyomo.repn.standard_repn import generate_standard_repn
return generate_standard_repn(exp, quadratic=False)

if exp is None:
return AmplRepn()
degree = exp.polynomial_degree()
Expand Down
70 changes: 70 additions & 0 deletions pyomo/repn/canonical_repn.py → ATTIC/repn/canonical_repn.py
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,72 @@ def pyomo4_generate_canonical_repn(exp, idMap=None, compute_values=True):
{ None: exp, -1 : collect_variables(exp, idMap) } )


def pyomo5_generate_canonical_repn(exp, idMap=None, compute_values=True):
from pyomo.repn.standard_repn import generate_standard_repn

if idMap is None:
idMap = {}
srepn = generate_standard_repn(exp, idMap=idMap, compute_values=compute_values)

if srepn.nonlinear_expr is None and len(srepn.quadratic_coefs) == 0:
#
# Construct linear canonical repn
#
rep = pyomo4_CompiledLinearCanonicalRepn()
if not (type(srepn.constant) in native_numeric_types and srepn.constant == 0):
rep.constant = srepn.constant
else:
rep.constant = None
if len(srepn.linear_vars) > 0:
rep.linear = srepn.linear_coefs
rep.variables = srepn.linear_vars
else:
rep.linear = None
rep.variables = None
else:
#
# Construct nonlinear canonical repn
#
ans = {}
if not srepn.nonlinear_expr is None:
ans[None] = srepn.nonlinear_expr

#print(srepn)
#print(idMap)
ans[-1] = {}
for v_ in srepn.nonlinear_vars:
ans[-1][idMap[None][id(v_)]] = v_
for v_ in srepn.linear_vars:
ans[-1][idMap[None][id(v_)]] = v_
for v1_,v2_ in srepn.quadratic_vars:
ans[-1][idMap[None][id(v1_)]] = v1_
ans[-1][idMap[None][id(v2_)]] = v2_

if not (type(srepn.constant) in native_numeric_types and srepn.constant == 0):
ans[0] = GeneralCanonicalRepn({None:srepn.constant})

if len(srepn.linear_vars) > 0:
tmp = {}
for i in range(len(srepn.linear_vars)):
v_ = srepn.linear_vars[i]
tmp[ idMap[None][id(v_)] ] = srepn.linear_coefs[i]
ans[1] = tmp

if len(srepn.quadratic_vars) > 0:
tmp = {}
for i in range(len(srepn.quadratic_vars)):
v1_,v2_ = srepn.quadratic_vars[i]
if id(v1_) == id(v2_):
terms = GeneralCanonicalRepn({idMap[None][id(v1_)]:2})
else:
terms = GeneralCanonicalRepn({idMap[None][id(v1_)]:1, idMap[None][id(v2_)]:1})
tmp[terms] = srepn.quadratic_coefs[i]
ans[2] = tmp

rep = GeneralCanonicalRepn(ans)
return rep


def canonical_is_constant(repn):
"""Return True if the canonical representation is a constant expression"""
if isinstance(repn, dict):
Expand Down Expand Up @@ -1079,12 +1145,16 @@ def generate_canonical_repn(exp, idMap=None, compute_values=True):
elif common.mode is common.Mode.pyomo4_trees:
globals()['CompiledLinearCanonicalRepn'] = pyomo4_CompiledLinearCanonicalRepn
return pyomo4_generate_canonical_repn(exp, idMap, compute_values)
elif common.mode is common.Mode.pyomo5_trees:
return pyomo5_generate_canonical_repn(exp, idMap, compute_values)
else:
raise RuntimeError("Unrecognized expression tree mode")

if common.mode is common.Mode.coopr3_trees:
CompiledLinearCanonicalRepn = coopr3_CompiledLinearCanonicalRepn
elif common.mode is common.Mode.pyomo4_trees:
CompiledLinearCanonicalRepn = pyomo4_CompiledLinearCanonicalRepn
elif common.mode is common.Mode.pyomo5_trees:
CompiledLinearCanonicalRepn = pyomo4_CompiledLinearCanonicalRepn
else:
raise RuntimeError("Unrecognized expression tree mode")
Loading

0 comments on commit 996e0a8

Please sign in to comment.