《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

本节书摘来自华章出版社《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》一书中的第2章,第2.6节,作者:[美]爱德华·阿什福德·李(Edward Ashford Lee),更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.6 类和继承

Ptolemy II可以定义面向角色的类(actor-oriented class)(Lee et al., 2009a)。这些类被定义后可以用于实例(instance)和子类(subclass)的创建,它们都使用了类继承(inheritance)的概念。类为角色提供通用的定义(或模板)。实例是类的一个单独的、特定的实现,一个子类源于父类——它包含和父类相同的结构,但可能有一些修改。这种方法提高了设计的模块化,详见下面的例子。
例2.1 结合在2.3节中开发的模型,如图2-29所示。假设希望创建信道角色的多个实例,如图2-30所示。在图2-30中,正弦波信号通过5个不同的信道(注意正弦波和信道之间的黑色菱形关系符号,它表示将相同的信号分别广播到5个信道)。信道的输出被叠加在一起并以图形显示。结果是一条明显比单信道输出正弦波清晰的正弦波。(在通信系统中,这种技术称为分集系统。信道的多个副本(每个副本都携带独立噪声)用于实现可靠通信。)

    ![3](https://yqfile.alicdn.com/a7faf99403d7e87a018be9cb48b275103455b3e2.png)

尽管上述方法有效,但依然是个糟糕的设计,原因有两点。首先在模型中,5个信道是通过硬连接实现的(将在下一节解释这个问题)。其次,每个信道都是图2-29中复合角色的副本。因此,如果信道的设计需要改变,所有5个副本都必须改变。因此这种方法使得模型难以维护或修改。
使用类和实例的一个小的优势就是,模型的XML文件表示会更小,因为类的设计只给出一次,而不是多次。
一个更好的方法是定义一个Channel类,然后用这个类的实例来实现分集系统。为了实现这种修改,从图2-29中的设计开始,将连向信道的连接删去,如图2-31所示。然后单击并选择Convert to Class。(注意,如果第一步没有将那些连接删去,那么当进行试图转化时会出现错误提示)角色图标会获得一个蓝色边框,它是一个视觉上的提示,提示这是一个类而不是一个普通的角色(它是实例)。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-31 创建并使用一个信道(Channel)类
类在模型执行中不起任何作用,它只是必须被实例化组件的定义而已。按照惯例,将类置于模型的顶部,挨着指示器,因为它们都是表示声明。
还请注意,除了使用Convert to Class外,还可以从Utilities库里拖拽一个Composite ClassDe?nition的实例,然后选择Open Actor并填入类定义。然后给这个类定义起一个具体的名字,比如Channel。
当已经定义了一个类时,可以通过右击然后选择Create instance或者按Control+N键来创建一个实例。如此重复5次,创建5个实例,如图2-31所示。虽然这和图2-30的设计看起来很相似,但是实际上这是一个更好的设计,原因前文已经讲过。试着对这个类进行一些改变,比如说,为它创建一个自定义图标,如图2-32所示,可见类的变化将传播到类的每个实例。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

如果在图2-32的任一个实例(或类)上调用Open Actor,就会看到相同的信通(Channel)模型。实际是类的定义。在这个层次化模型内所做的任何改变都会自动地传递到所有的实例。比如,用户可以试着修改noisePower参数的值并观察结果。
如果想查看实例而不是类定义,可以在一个实例上选择Open Instance。打开的窗口只显示该实例。从类定义继承的每个子组件都由粉红色虚线框高亮显示。
2.6.1 实例中参数值的重写
默认情况下,图2-32中的所有Channel类的实例都有相同的图标和相同的参数值。然而,每个实例都可以通过重写这些值进行定制。比如说,在图2-33中,对自定义图标进行了修改以获得不同的颜色,且第5个实例有了一个额外的图形元素。这些修改是由右击实例图标并选择Edit Custom Icon来实现的。若实例中类的参数进行了重写,那么更新类不会影响该实例,只会影响没有重写的实例。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

2.6.2 子类和继承
假设需要对一些信道进行修改,用另一种形式的正弦波向其添加干扰。一种不错的方法是创建Channel类的一个子类,如图2-34所示。创建方法是右击类的图标,并选择Create Subclass。产生的子类图标出现在父类图标的上方,用户可自行移动。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-34 图2-33的模型,有一个还未被重写的Channel的子类
子类包含父类的所有元素,但子类的图标被一个粉红色的虚线框环绕。这些元素都是继承而来的,并不能从子类中删除(若试图这样做将出现错误提示)。但是,你可以改变参数值并添加额外的元素。如图2-35所示的设计,它额外增加了一对名为interferenceAmplitude和interferenceFrequency的参数如一对实现干扰(interference)的角色。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-35 图2-34的子类,被重写过,加入了正弦干扰
图2-36中的模型将最后的信道替换为子类的一个实例,并用图显示正弦干扰。
类的实例有两种位置:第一,类的实例位于这个类本身所在的复合角色中;第二,类的实例位于一个复合角色中,且这个复合角色本身以及类本身都包含在一个模型中(就是说,类的实例位于子模型中)。为子模型添加一个实例,只需简单地从包含这个类的复合模型中复制(或剪切),然后将它粘贴到子模型中。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-36 使用图2-35中子类的模型和执行图
2.6.3 模型间类的共享
通过将类的定义保存在独立文件中,一个类可以被多个模型共享。我们将用Channel类来说明这种技术。首先,在Channel类上右击并调用Open Actor,然后在File菜单上选择Save As。出现如图2-37所示的对话框。标记为Save submodel only的方框是默认未选中的。如果复选框未被选中,那么整个模型会被保存。在我们的例子中,我们想只保存信道子模型,所以需要选中复选框。
把类定义保存在一个模型可以访问到的地方是很重要的。一般地,Ptolemy II搜索与类路径(classpath)相关的类定义,类路径由一个名为CLASSPATH的环境变量给出。原则上,你可以设置这个环境变量使它包括你想要搜索的任何目录。然而,在实际中,改变CLASSPATH可能会导致其他程序出问题,所以我们建议将文件存储在PtolemyII安装目录或根目录下名为“.ptolemyII”的目录中。在这两种情况下,Ptolemy会发现存储在这些目录中的类文件。
如果将Channel类保存在名为Channel.xml且位于目录$PTII/myActors下的文件中,这里$PTII表示Ptolemy II的安装位置。该类定义可以用在任何模型里,如下方式:打开模型并在Graph菜单中选择Instantiate Entity,如图2-38所示。在类路径中输入与$PTII相关的类的全名,在本例中是myActors.Channel。
当拥有一个定义在文件中的Channel类的实例时,可将其添加到UserLibrary。UserLibrary在Vergil库浏览窗口的左侧,如图2-39所示。右击实例并选择Save Actor in Library。如图2-39所示,这使得另一个窗口被打开并显示用户库。用户库本身就是一个存储在XML文件中的Ptolemy II模型。当你保存库模型时,对于任何Vergil窗口(对于同一用户),类实例在UserLibrary窗口就变成可用的。注意,在用户库中保存类定义本身(相对于类的一个实例)结果会不同。在这种情况下,用户库将提供一个新的类定义而不是类的实例。
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-37 一个类可以单独保存在一个文件中,然后在多个模型*享。如图所示,在某些平台上,显示有Save submodel only复选框的对话框会独立出现。在其他平台上,复选框被整合到一个整体对话框中。对于其他平台,复选框将集成在一个单独的对话框中
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-38 在文件中定义的类,可以在Graph菜单中使用Instantiate Entity来创建
《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.6 类和继承

图2-39 类的实例在自己的文件中定义,可以在UserLibrary(用户库)中找到

上一篇:华人一作统一「视觉-语言」理解与生成:一键生成图像标注,完成视觉问答,Demo可玩


下一篇:非凸函数上,随机梯度下降能否收敛?网友热议:能,但有条件,且比凸函数收敛更难