Xmile转换
PySD允许解析Xmile文件并将结果转换为 AbstractModel
可用于构建模型的对象。
警告
目前没有Xmile用户正在开发PySD。这导致了Xmile和Vensim开发之间的差距。鼓励Stella用户参与PySD的开发,包括新的 test models 并添加对新功能和特性的支持。
转换工作流程
以下转换工作流程允许拆分Xmile文件,同时解析其每个部分以构建 AbstractModel
类型对象。工作流程可总结如下:
Xmile file :使用etree库解析文件并为模型创建一个部分。
Xmile section :可以集成的全套变量和定义。允许拆分模型元素。
Xmile element :变量定义。它包括单位和评论。允许解析它包含的表达式并将它们保存在AbstractComponents(AbstractElement的一部分)中。
一旦按照前面的步骤解析和拆分模型。的 AbstractModel
可以退货。
Xmile文件
XmileFile类允许读取原始的Xmile模型文件并将其解析为Section元素。最终结果可以被输出到AbstractModel类,以便用另一种编程语言构建模型。
- class pysd.translators.xmile.xmile_file.XmileFile(xmile_path: str | Path)[源代码]
XmileFile类允许解析Xmile文件。创建对象时,模型文件会自动打开并使用lxml.etree进行解析。
- 参数:
xmile_path (str or pathlib.Path) -- Xmile模型的路径。
- property verbose
将模型信息打印到标准输出。
- parse(parse_all: bool = True) None [源代码]
从模型内容创建XmileSection对象并对其进行解析。由于目前不支持宏,因此所有模型都将有一个部分。该函数将来应该将宏拆分为独立的部分。
- 参数:
parse_all (bool (optional)) -- 如果为True,将自动解析创建的XmileSection对象。否则,这些对象将仅添加到self.sections中,而不会解析。默认为True。
- get_abstract_model() AbstractModel [源代码]
获取用于构建的抽象模型。解析模型后应该调用这个方法(self.parse)。这会自动从模型部分调用get_abstract_section方法。
- 返回:
AbstractModel --抽象模型对象,可用于以另一种语言构建模型。
- 返回类型:
Xmile部分
Section类允许将模型部分解析为Elements。最终结果可以被输出到AbstractSection类,以便用其他语言构建模型。一个部分可以是主模型(没有宏),也可以是宏定义(Xmile尚不支持)。
- class pysd.translators.xmile.xmile_section.Section(name: str, path: Path, section_type: str, params: List[str], returns: List[str], content_root: _Element, namespace: str, split: bool, views_dict: dict | None)[源代码]
部分对象允许解析该部分的元素。
- 参数:
name (str) -- Section name. '__main__' for the main section or the macro name.
path (pathlib.Path) -- 部分路径。它应该是主要部分的模型名称和宏的干净宏名称。
section_type (str ('main' or 'macro')) -- 节类型。
params (list) -- 接受该部分的参数列表。对于主要部分,它将是一个空列表。
returns (list) -- 返回该部分的变量列表。对于主要部分,它将是一个空列表。
content_root (etree._Element) -- 部分解析了树内容。
namespace (str) -- 使用etree解析部分内容后给出的部分命名空间。
split (bool) -- 如果split为True,则创建的部分将根据views_dict拆分变量。
views_dict (dict) -- 观点词典。给出任何级别分类的变量,以便按文件将它们拆分。
- property verbose
将部分信息打印到标准输出。
- parse(parse_all: bool = True) None [源代码]
分析部分对象。该部分的脚注将添加到自脚注中。定义为Flows、Auxiliary、Gf和Stock的变量将在XmileElements中转换。控制变量(如果该部分是 __main__, 将转换为Control Element。
- 参数:
parse_all (bool (optional)) -- 如果为True,则创建的VensimElement对象将被自动解析。否则,该对象将仅添加到self.elements中,而不会添加到解析器中。默认为True。
- get_abstract_section() AbstractSection [源代码]
将抽象部分用于构建。该方法应在解析部分(self.parse)后调用。该方法由Model的get_abstract_models自动调用,并自动生成AbstractSubScript范围并合并元素中的组件,同时从每个模型组件调用get_abstract_components方法。
- 返回:
AbstractSection -- Abstract Section对象,可用于以另一种语言构建模型。
- 返回类型:
Xmile元素
Element类的子类允许解析给定模型元素的表达。有四种元素:
辅助元素(辅助类):辅助元素,用<aux>。
流(流类):流元素,使用定义<flow>。
Gfs(Gf类):Inbox元素,用<gf>。
股票(股票类):数据组件,定义为<stock>
此外,还定义了第五种类型的元素Control Element,它允许解析模型控制变量的值(时间步、初始时间、最终时间)。
解析元素的最终结果可以被输出到AbstractElement对象,以便用其他语言构建模型。
- class pysd.translators.xmile.xmile_element.Element(node: _Element, ns: dict, subscripts)[源代码]
元素类。这个类为其子类提供了共享方法:Aux、Flow、Gf、Stock和Control Element。
- 参数:
- property verbose
将元素信息打印到标准输出。
- class pysd.translators.xmile.xmile_element.Aux(node, ns, subscripts)[源代码]
Xmile中定义的辅助变量<aux>。
- 参数:
- get_abstract_element() AbstractElement [源代码]
获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。
- 返回:
AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。
- 返回类型:
- class pysd.translators.xmile.xmile_element.Gf(node, ns, subscripts)[源代码]
Gf变量(查找)由<gf>Xmile中定义。
- 参数:
- get_abstract_element() AbstractElement [源代码]
获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。
- 返回:
AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。
- 返回类型:
- class pysd.translators.xmile.xmile_element.Stock(node, ns, subscripts)[源代码]
由Xmile中定义的股票变量<stock>。
- 参数:
- get_abstract_element() AbstractElement [源代码]
获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。
- 返回:
AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。
- 返回类型:
- class pysd.translators.xmile.xmile_element.SubscriptRange(name: str, definition: List[str], mapping: List[str] = [])[源代码]
后缀范围定义。
- property verbose
将订阅范围信息打印到标准输出。
- get_abstract_subscript_range() AbstractSubscriptRange [源代码]
获取用于构建的抽象字幕范围。此方法由Sections的get_abstract_section自动调用。
- 返回:
AbstractSubscriptRange -- Abstract SUBScript Range对象,可用于以另一种语言构建模型。
- 返回类型:
支持的功能和特征
转换器的持续开发将支持Xmile的全套功能。当前版本支持以下运算符、函数和功能:
警告
并非所有支持的功能和特性都经过正确测试。任何新的测试模型,以涵盖缺失的功能测试将受到欢迎。
运营商
支持所有基本操作符,包括下表中显示的操作符。:
X米尔 |
Xmile示例 |
抽象语法 |
---|---|---|
- |
-A |
逻辑结构( ['negative'] ,(A,)) |
+ |
+A |
A |
不 |
不是 |
逻辑结构( [':NOT:'] ,(A,)) |
X米尔 |
Xmile示例 |
抽象语法 |
---|---|---|
^ |
A ^ B |
算术结构( ['^'] ,(A,B)) |
* |
A * B |
算术结构( ['*'] ,(A,B)) |
/ |
A / B |
算术结构( ['/'] ,(A,B)) |
mod |
A模B |
呼叫结构(“模”,(A,B)) |
+ |
A + B |
算术结构( ['+'] ,(A,B)) |
- |
A - B |
算术结构( ['-'] ,(A,B)) |
= |
A = B |
逻辑结构( ['='] ,(A,B)) |
<> |
A <> B |
逻辑结构( ['<>'] ,(A,B)) |
< |
A < B |
逻辑结构( ['<'] ,(A,B)) |
> |
A > B |
逻辑结构( ['>'] ,(A,B)) |
>= |
A >= B |
逻辑结构( ['>='] ,(A,B)) |
<= |
A <= B |
逻辑结构( ['<='] ,(A,B)) |
和 |
A和B |
逻辑结构( [':AND:'] ,(A,B)) |
或 |
A或B |
逻辑结构( [':OR:'] ,(A,B)) |
功能
尚未包含所有Xmile功能。支持的功能列表如下所示:
X米尔 |
Xmile示例 |
抽象语法 |
Xmile评论 |
---|---|---|---|
ABS |
腹肌(A) |
CallStructure('abs', (A,)) |
|
min |
分钟(A,B) |
呼叫结构(' min ',(A,B)) |
|
Max |
最大值(A,B) |
呼叫结构(' max ',(A,B)) |
|
min |
分钟(A) |
呼叫结构(' vmin_xmile ',(A,)) |
|
Max |
最大值(A) |
呼叫结构(' vmax_xmile ',(A,)) |
|
sqrt |
平方米(A) |
呼叫结构(' SQRT ',(A,)) |
|
exp |
经验(A) |
CallStructure('exp',(A,)) |
|
ln |
In(A) |
呼叫结构(' In ',(A,)) |
|
Pi |
pi() |
呼叫结构(' pi ',(,)) |
|
罪 |
罪(A) |
呼叫结构(' sin ',(A,)) |
|
cos |
cos(A) |
呼叫结构(' cos ',(A,)) |
|
谭 |
晒黑(A) |
CallStructure('tan',(A,)) |
|
arcsin |
arcsin(A) |
呼叫结构(' arcsin ',(A,)) |
|
Arccos |
arccos(A) |
CallStructure('arccos',(A,)) |
|
arctan |
反正切(A) |
呼叫结构(“arctan”,(A,)) |
|
int |
int(A) |
CallArchitecture(' int ',(A,)) |
|
if_then_else |
if_then_else(A,B,C) |
呼叫结构(' if_then_else ',(A,B)) |
|
IF条件THEN值_true ELSE值_false |
如果A,那么B否则C |
呼叫结构(' if_then_else ',(A,B)) |
|
萨夫迪夫 |
safediv(A,B,X) |
呼叫结构(' xidz ',(A,B,X)) |
|
萨夫迪夫 |
safediv(A,B) |
呼叫结构(' zidz ',(A,B)) |
|
脉冲 |
脉冲(幅度,开始) |
呼叫结构(' Xpulse ',(开始,幅度)) |
未测试Xmile! |
脉冲 |
脉冲(幅度、开始、间隔) |
CallStructure('Xpulse_train',(start,interval,magnitude)) |
未测试Xmile! |
斜坡 |
坡道(slope、start_time、end_time) |
呼叫结构(' ramp ',(slope,start_time,end_time)) |
未测试Xmile! |
斜坡 |
坡道(slope,start_time) |
呼叫结构(' ramp ',(slope,start_time)) |
未测试Xmile! |
步骤 |
步(高度,步_时间) |
CallStructure('step',(height,step_time)) |
未测试Xmile! |
init |
初始化(值) |
初始结构(值) |
X米尔 |
Xmile示例 |
抽象语法 |
Xmile评论 |
---|---|---|---|
delay1 |
delay 1(输入,delay_time,初始值) |
延迟结构(输入,延迟_时间,初始值,1) |
未测试Xmile! |
delay1 |
delay 1(输入,delay_time) |
延迟结构(输入,delay_time,输入,1) |
未测试Xmile! |
延迟3 |
delay 3(输入,delay_time,初始值) |
延迟结构(输入,延迟_时间,初始值,3) |
未测试Xmile! |
延迟3 |
delay3(input,delay_time) |
延迟结构(输入,delay_time,输入,3) |
未测试Xmile! |
延迟 |
delayn(输入,delay_time,n,初始值) |
DelayNStructure(输入,delay_time,initial_Value,n) |
未测试Xmile! |
延迟 |
delayn(输入,delay_time,n) |
DelayNArchitecture(输入,delay_time,输入,n) |
未测试Xmile! |
延迟 |
延迟(输入,延迟时间,初始值) |
DelayFixed(输入、delay_time、initial_Value) |
|
延迟 |
delay(输入,delay_time) |
DelayFixed(输入,delay_time,输入) |
|
smth1 |
smth 1(输入,smth_time,初始值) |
SmoothFrame(输入,smth_time,initial_value,1) |
未测试Xmile! |
smth1 |
smth 1(输入,smth_time) |
SmothArchitecture(输入,smth_time,输入,1) |
未测试Xmile! |
smth 3 |
smth3(input, smth_time, initial_value) |
SmoothFrame(输入,smth_time,initial_value,3) |
未测试Xmile! |
smth 3 |
smth 3(输入,smth_time) |
SmoothStructure(input,smth_time,input,3) |
未测试Xmile! |
史密斯恩 |
smthn(输入,smth_time,n,initional_Value) |
SmothNStructure(输入,smth_time,initional_Value,n) |
未测试Xmile! |
史密斯恩 |
smthn(输入,smth_time,n) |
SmothNStructure(输入,smth_time,输入,n) |
未测试Xmile! |
部队 |
forcst(输入、平均时间、地平线、初始趋势) |
预测结构(输入、平均时间、地平线、初始趋势) |
未测试Xmile! |
部队 |
forcst(输入、平均时间、地平线) |
预测结构(输入,平均_时间,地平线,0) |
未测试Xmile! |
趋势 |
趋势(输入、平均时间、初始趋势) |
TrendStructure(input, average_time, initial_trend) |
未测试Xmile! |
趋势 |
趋势(输入,平均时间) |
趋势结构(输入,平均_时间,0) |
未测试Xmile! |
股票
股市受到任意数量的流入和流出的支持。股票转换为AST为 IntegStructure(flows, initial_value, non_negative). Non-negative flag is parsed for both stocks and flows, this can be set element by element or using the behavior section .具有非负标志的流被读取为具有最大条件的流,而对于股票,此信息保存在 pysd.translators.structures.abstract_expressions.IntegStructure
object.
下标
支持多个与脚注相关的功能。其中包括:
不同范围的基本脚注操作。
下标范围和子范围定义。
图形功能
支持Xmile图形函数(gf),也称为查找。它们可以被硬编码或内联。
警告
内插方法“外推”和“离散”已实现,但未进行测试。需要与这些方法的完全集成模型。
支持Vensim,但不支持Xmile
宏观
目前不支持Xmile宏。在Vensim中,宏被归类为模型的独立部分。如果它们在 XmileFile
,添加对Xmile的支持应该很容易。
计划的新功能和功能
还没有。