默认切换到 pyomo 4 表达式

Switch to pyomo 4 expressions by default

为什么 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

您可以通过以下方式切换表达式树系统:

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

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

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