1

我在 Python 3.6 下使用 pyomo Pyomo 5.1.1(Linux 3.16.0-4-amd64 上的 CPython 3.6.0),当我想使用求和在模型中构建表达式时收到错误消息。这是一个最小的例子:

from pyomo.environ import *
from pyomo.opt import SolverFactory
model=ConcreteModel()
model.H=RangeSet(0,23)
model.x=Var(model.H)
E=summation(model.x)

我收到以下错误:

"

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/b67777/anaconda3/lib/python3.6/site-packages/pyomo/core/base/util.py", line 86, in summation
    ans += item
  File "/home/b67777/anaconda3/lib/python3.6/site-packages/pyomo/core/base/numvalue.py", line 537, in __iadd__
    return generate_expression(_iadd,self,other)
  File "/home/b67777/anaconda3/lib/python3.6/site-packages/pyomo/core/base/expr_coopr3.py", line 977, in generate_expression
    _self = _generate_expression__clone_if_needed(_self, 1)
  File "/home/b67777/anaconda3/lib/python3.6/site-packages/pyomo/core/base/expr_coopr3.py", line 918, in _generate_expression__clone_if_needed
    % ( getrefcount(obj) - UNREFERENCED_EXPR_COUNT, ))
RuntimeError: Expression entered generate_expression() with too few references (0<0); this is indicative of a SERIOUS ERROR in the expression reuse detection scheme.

"

如果我用 model.H 中的 h 上的循环替换“求和”,我会得到同样的错误。

该错误也在这里被注意到:https ://github.com/Pyomo/pyomo/issues/103

除了退回到旧版本的 Python 之外,有没有一种简单的方法来解决这个问题?

非常感谢您的帮助,

保林

4

1 回答 1

4

Pyomo 仅支持 Python 2.6、2.7、3.3、3.4 和 3.5。

Python 3.6 更改了内部调用堆栈,这使 Pyomo 用于检测表达式何时被额外变量指向的内部“幻数”无效(即,它可能在多个表达式中被重用 - 这是不允许的Pyomo 表达式树)。开发人员正在修复(在pyomo4-expressions分支中)。在该修复合并回主版本并发布之前,唯一的选择是安装一个受支持的 Python 版本。


更新[2017 年 4 月 3 日]:该修复于 2017 年 3 月 7 日重新合并master。Pyomo 应该在下一个补丁版本中支持 Python 3.6。


更新[17 年 5 月 14 日]:Pyomo 5.2 已经发布,它提供了对 Python 3.6 的全面支持

于 2017-02-08T15:56:21.817 回答