Xmile转换

PySD允许解析Xmile文件并将结果转换为 AbstractModel 可用于构建模型的对象。

警告

目前没有Xmile用户正在开发PySD。这导致了Xmile和Vensim开发之间的差距。鼓励Stella用户参与PySD的开发,包括新的 test models 并添加对新功能和特性的支持。

转换工作流程

以下转换工作流程允许拆分Xmile文件,同时解析其每个部分以构建 AbstractModel 类型对象。工作流程可总结如下:

  1. Xmile file :使用etree库解析文件并为模型创建一个部分。

  2. Xmile section :可以集成的全套变量和定义。允许拆分模型元素。

  3. 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 --抽象模型对象,可用于以另一种语言构建模型。

返回类型:

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对象,可用于以另一种语言构建模型。

返回类型:

AbstractSection

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。

参数:
  • node (etree._Element) -- 元素节点内容。

  • ns (dict) -- 该部分的命名空间。

  • subscripts (dict) -- 该部分的脚注字典,解析一些带脚注的元素所需。

property verbose

将元素信息打印到标准输出。

parse(behaviors: dict) None[源代码]

解析元素的所有组件

参数:

behaviors (dict) -- 带有键“non_negative_Flow”和“non_negative_stock”以及定义股票和流量全局行为的布尔值的字典。

返回类型:

None

class pysd.translators.xmile.xmile_element.Aux(node, ns, subscripts)[源代码]

Xmile中定义的辅助变量<aux>。

参数:
  • node (etree._Element) -- 元素节点内容。

  • ns (dict) -- 该部分的命名空间。

  • subscripts (dict) -- 该部分的脚注字典,解析一些带脚注的元素所需。

get_abstract_element() AbstractElement[源代码]

获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。

返回:

AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。

返回类型:

AbstractElement

class pysd.translators.xmile.xmile_element.Flow(node, ns, subscripts)[源代码]

Xmile中定义的流程<flow>。

参数:
  • node (etree._Element) -- 元素节点内容。

  • ns (dict) -- 该部分的命名空间。

  • subscripts (dict) -- 该部分的脚注字典,解析一些带脚注的元素所需。

class pysd.translators.xmile.xmile_element.Gf(node, ns, subscripts)[源代码]

Gf变量(查找)由<gf>Xmile中定义。

参数:
  • node (etree._Element) -- 元素节点内容。

  • ns (dict) -- 该部分的命名空间。

  • subscripts (dict) -- 该部分的脚注字典,解析一些带脚注的元素所需。

get_limits() Tuple[None | str, None | str][源代码]

获取Gf元素的极限

get_abstract_element() AbstractElement[源代码]

获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。

返回:

AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。

返回类型:

AbstractElement

class pysd.translators.xmile.xmile_element.Stock(node, ns, subscripts)[源代码]

由Xmile中定义的股票变量<stock>。

参数:
  • node (etree._Element) -- 元素节点内容。

  • ns (dict) -- 该部分的命名空间。

  • subscripts (dict) -- 该部分的脚注字典,解析一些带脚注的元素所需。

get_abstract_element() AbstractElement[源代码]

获取用于构建的抽象元素。此方法由Sections的get_abstract_section自动调用。

返回:

AbstractElement --抽象元素对象,可用于以另一种语言构建模型。它包含一个AbstractComponents列表,以及每个表达式的Abstract DeliverTree。

返回类型:

AbstractElement

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对象,可用于以另一种语言构建模型。

返回类型:

AbstractSubscriptRange

支持的功能和特征

转换器的持续开发将支持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的支持应该很容易。

计划的新功能和功能

还没有。