默认情况下切换到pyomo 4表达式

时间:2017-12-06 13:50:38

标签: python pyomo

为什么Pyomo默认使用来自expr_coopr3.py的表达式类型?我找到了如何改变它的方式,但我怀疑它是否正确。

在档案expr_common.py

try:
  from sys import getrefcount
  _getrefcount_available = False # changed!
except ImportError:
    logger = logging.getLogger('pyomo.core')
    logger.warning(
    "This python interpreter does not support sys.getrefcount()\n"
    "Pyomo cannot automatically guarantee that expressions do not become\n"
    "entangled (multiple expressions that share common subexpressions).\n")
     getrefcount = None
     _getrefcount_available = False

class Mode(object):
    coopr3_trees = (1,)
    pyomo4_trees = (2,)
if _getrefcount_available:
    mode = _default_mode = Mode.coopr3_trees
else:
    mode = _default_mode = Mode.pyomo4_trees

变量_getrefcount_available可以分配给False,并且在所有内容都适用于pyomo表达式之后4.有没有其他方法可以做到这一点?

我正在使用Pyomo 5.2

1 个答案:

答案 0 :(得分:1)

您可以使用以下命令切换表达式树系统:

import pyomo.core.base.expr as EXPR
EXPR.set_expression_tree_format(EXPR.common.Mode.pyomo4_trees)

Pyomo4表达式是一个(长期运行的)开发活动,用于简化表达式树系统,提高性能,最重要的是为pypy提供支持。它没有成为默认值,因为虽然我认为它可以正常工作,但它会产生与coopr3系统生成的略有不同的表达式树。这会影响大量的Pyomo测试,我没有时间解决所有(2000+)测试差异,以确保新结果是正确的。

另外,我应该指出[截至2017年12月]有一个Pyomo分支,其中包含pyomo4表达系统的修订版本(目前称为pyomo5)。在没有getrefcount()(pypy需要)的情况下,该系统有一种改进的方法来确保表达正确性。不幸的是,pyomo5表达式的发展与coopr3 / pyomo4系统有很大的不同,因此它们并不能完全共存。当该分支合并时(可能是2018年1月),coopr3和pyomo4表达系统都应该从master中删除。