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)。
向后不兼容的变更#
Cells.clear()的行为已发生变化。请参阅增强功能部分。
defcells()和new_space()API函数的行为已发生变化。详情请参阅增强功能部分。引入了
write_model()的新格式。详情请参阅增强功能部分。
Bug修复#
cur_space()在当前模型被删除时会被设为None。modelx的当前空间属性现在可以通过
save()方法和open_model()进行保存和恢复。修复了在Windows命令提示符控制台中使用时,支持IPython自动完成功能的包引发的错误。
修复了尝试通过del语句删除引用时引发的错误。
修复从恢复的单元格中缺失的源文件信息。
修复了在Windows上使用Python 3.8时因堆栈溢出导致的崩溃问题。