modelx v0.15.0 (2021年5月19日)#

本次发布修复了以下错误并引入了以下增强功能。

功能增强#

追踪引用值的先例方法介绍#

新增了一个方法precedents()。 现有的preds()方法会返回指定节点计算其值时所依赖的节点列表。 preds()仅列出Cells和Spaces的节点。 新引入的precedents()方法对preds()进行了增强。 除了preds()返回的Cells和Spaces节点外, precedents()还包含指定节点计算所使用的Reference值的节点。 下面是一个示例。

import modelx as mx

space = mx.new_space()
space.new_space('Child')
space.Child.new_space('GrandChild')

space.x = 1
space.Child.y = 2
space.Child.GrandChild.z = 3

@mx.defcells(space=space)
def foo(t):
    return t

@mx.defcells(space=space)
def bar(t):
    return foo(t) + x + Child.y + Child.GrandChild.z

bar 单元格依赖于一个单元格 foo,以及3个引用:xChild.yChild.GrandChild.z。下方代码中,bar.preds(3) 返回一个包含 foo(3) 的列表,这是 bar(3) 唯一依赖的单元格元素:

>>> bar(3)
9

>>> bar.preds(3)
[Model1.Space1.foo(t=3)=3]

precedents() 方法返回的列表不仅包含 Cells 元素,还包括该 Cells 在计算其值时依赖的 References:

>>> bar.precedents(3)
[Model1.Space1.foo(t=3)=3,
 Model1.Space1.x=1,
 Model1.Space1.Child.GrandChild.z=3,
 Model1.Space1.Child.y=2]

类似于Cells.precedentsSpace.precedents 也被引入,它以同样的方式扩展了 Space.preds的功能。

改进节点的多行显示#

precedents()succs()preds()返回的列表元素是Node对象,它们的值可以是numpy数组和pandas DataFrame。这些值具有多行表示字符串(repr)。为了美观地打印这些repr,在=和值的repr之间会插入换行符:

Model1.Space1.Cells1()=
array([[1, 2],
       [3, 4]])

向后不兼容的变更#

Bug修复#

MacOS 不兼容#

最新版本的MacOS似乎不允许在运行时更改堆栈大小。 为了避免在调用modelx时更改堆栈大小出现错误, modelx进行了重构,在Linux和MacOS的主线程中使用执行器。 由于这一变更,MacOS上的最大递归次数 显著低于Linux和Windows系统。