PySD库的结构

PySD提供的转换器允许将原始模型转换为抽象模型表示(MRC),或者 Abstract Model 简而言之。这种表示允许将所有模型方程和行为收集到许多Python数据类中。因此,AMR是Python代码,因此独立于用于编写原始模型的编程语言。然后,将MRC传递给构建器,构建器将其转换为我们选择的编程语言的源代码。请参阅下图中完整流程的示例。

../_images/abstract_model.png

目前,PySD可以将Vensim模型(mdl格式)或Xmile格式的模型(从Vensim、Stella或其他软件输出)转换为AMR。目前唯一可用的构建器用Python构建模型。

对于转换为Python的模型,运行它们所需的所有函数和类都包含在PySD中。的 Model 类是允许加载和运行模型以及修改其参数值等多种可能性的主类。

转换

PySD目前支持转换 from Vensimfrom Xmile .

PySD can import models in Vensim's *.mdl file format and in XMILE format (*.xml, *.xmile, or *.stmx file). Parsimonious is the Parsing Expression Grammar (PEG) parser library used in PySD to parse the original models and construct an abstract syntax tree. The translators then crawl the tree, using a set of classes to define the Abstract Model.

当解析任何语言的表达时,都必须考虑操作的顺序。该顺序如下表所示,用于创建 ArithmeticStructureLogicalStructure 对象正确。以下表达式 1+2*3-5 将转换成::

ArithmeticStructure(operators=['+', '-'], arguments=(1, ArithmeticStructure(operators=['*'], arguments=(2, 3)), 5))

而类似的事情 1<5 and 5>3

LogicStructure(operators=[':AND:'], arguments=(LogicStructure(operators=['<'], arguments=(1, 5)), LogicStructure(operators=['>'], arguments=(5, 3))))

括号还影响相同的顺序操作符,例如 1+2-3 转换成::

ArithmeticStructure(operators=['+', '-'], arguments=(1, 2, 3))

1+(2-3) 转换成::

ArithmeticStructure(operators=['+'], arguments=(1, ArithmeticStructure(operators=['-'], arguments=(2, 3))))

保持这个顺序很重要,因为尽管这些操作根据定义是由于精确性导致的数字误差而是交换的,但它们在积分中可能不是交换的。

算术顺序

算术顺序

运营商

操作

0

()、无

括号,函数调用,引用,无操作

1

-

负值

2

^

幂运算

3

*, /

乘、除

4

%

5

+, -

加减乘除

6

=, <>, <, <=, >, >=

比较

7

一元逻辑运算

8

和,或

二进制逻辑运算

构建模型

构建器允许用任何编程语言构建最终模型(只要有该特定语言的构建器)。为此,他们使用一系列类来从 Abstract Model 并将其转换为所需的代码。目前PySD只包含一个 builder to build the models in Python .欢迎任何为其他编程语言添加新的构建器(和求解器)的贡献。

Python模型

要使用Python加载转换的模型,请参阅 Getting startedModel loading . Python构建器构建一个Python类,代表系统动态模型。该类维护一个字典,代表每个系统股票的当前值以及当前模拟时间,使其成为 stateful 模型的方式与系统本身在任何时间点都具有特定状态大致相同。

Model class 还包含每个模型组件的函数,代表基本模型方程。每个函数都包含其单位、脚注类型信息和从原始模型文件转换而来的文档。对任何模型函数的查询都将根据系统的存储状态计算并返回其值。

Model class 在内存中仅维护系统的单一状态,这意味着所有功能都必须遵守马尔科夫性质--系统的未来状态可以完全根据其当前状态计算。除了简化集成之外,此要求还可以实现与模型逐步交互的分析。

最后 Model class 提供了一组用于促进模拟的方法。的 run() 方法向用户返回一个Pandas rame,代表其模拟运行的输出。多种选项允许用户指定他们希望返回模型的哪些组件,以及他们希望返回这些测量的时间戳。其他参数会对模型进行参数更改、修改其开始条件或指定如何记录模拟结果。