modelx v0.1.0 (2019年12月1日)#

本次发布引入了重大的规格变更和功能增强,同时也修复了一些小错误。

功能增强#

输入值和计算值

单元格可以保存用户输入的值,或由其公式计算得出的值。前者现在称为输入值,并与后者区分开来:

@mx.defcells
def foo(x): return x * foo(x-1)

foo[0] = 5
foo[5]   # Calculated buy the formula

foo[0] 在这个例子中保存了输入值5, 而 foo[5] 保存了计算值120。 要检查Cells的某个节点是否有输入值, 现在可以使用 is_input()

>>> foo.node(0).is_input()
True
>>> foo.node(5).is_input()
False

Cells.clear的变更及Cells.clear_all和Cells.clear_at的引入

随着输入值概念的引入, Cells.clear() 方法现在仅清除计算值,而不清除输入值。 新增的Cells.clear_all() 方法用于同时清除输入值和计算值。 另一个新方法Cells.clear_at() 用于清除特定Cells节点的值,无论是输入值还是计算值。

输入变更时重新计算

在0.1.0版本之前,当为Cells的节点分配新的输入值时,依赖于输入单元格的节点值会被清除。 从0.1.0版本开始,这些值会被重新计算。 继续前面的示例:

>>> foo.series
x
0      1
1      1
2      2
3      6
4     24
5    120
Name: foo, dtype: int64

>>> foo[0] = 2
>>> foo.series
x
0      2
1      2
2      4
3     12
4     48
5    240
Name: foo, dtype: int64

可作为modelx属性的可用模型

仅适用于 Python 3.7 或更新版本

除了get_models()之外,还可以通过modelx属性访问获取模型:

>>> m1 = mx.get_models["Model1"]
>>> m2 = mx.Model1
>>> m1 is m2
True

如果没有当前可用的模型/空间,defcells 和 new_space 会创建新的模型/空间

在之前版本中,如果当前模型和/或当前空间不存在, 用户需要手动创建模型和/或空间。 从0.1.0版本开始,当调用defcells()new_space() API装饰器/函数时, 若当前模型和/或当前空间缺失, 系统会自动创建新模型和/或新空间, 并将其分配给当前模型和/或当前空间, 因此用户无需事先显式创建它们。

用于读写模型的新序列化器

Serializer是modelx的内部组件,用于实现以人类可读格式从文件读取模型和将模型写入文件的功能。modelx序列化器的初始版本(版本1)是在modelx v0.0.22中引入的。版本1序列化器的功能较为有限。

modelx v0.1.0版本配备了几乎完全重写的序列化器(版本2)。 版本2序列化器体现了以下改进。

  • 扩展名为“.py”的输出文件在语法上是正确的Python脚本,并且可以导入。

  • 输出文件的新格式更易于阅读。

  • 当将模型写入现有目录时,现有目录会被重命名,前缀为“_BAK1”。

  • 任何可pickle化的对象作为引用都可以存储在二进制数据文件中。

  • 单元格的输入值也会被存储。输入值可以是任何可序列化对象。

  • 在存储的可pickle化对象之间保持对象标识。

read_model() 的 modelx v0.1.0 版本仍然支持读取版本1格式编写的文件。

其他改进

  • defcells() 现在除了可以创建新单元格外,还可用于更新现有单元格的公式。

  • maxlen 参数被添加到 start_stacktrace() 中,用于指定要保留的跟踪的最大长度 (GH13)。

向后不兼容的变更#

Bug修复#

  • cur_space() 在当前模型被删除时会被设为None。

  • modelx的当前空间属性现在可以通过save()方法和open_model()进行保存和恢复。

  • 修复了在Windows命令提示符控制台中使用时,支持IPython自动完成功能的包引发的错误。

  • 修复了尝试通过del语句删除引用时引发的错误。

  • 修复从恢复的单元格中缺失的源文件信息。

  • 修复了在Windows上使用Python 3.8时因堆栈溢出导致的崩溃问题。