没有合适的资源?快使用搜索试试~ 我知道了~
基于规则的参数化对象语言Chromar在生物学建模中的应用
可在www.sciencedirect.com在线获取理论计算机科学电子笔记335(2018)49-66www.elsevier.com/locate/entcs基于规则的参数化对象语言Chromar里卡多·奥诺拉托-齐默a,1 Andrew J. Millarb,2戈登·D Plotkina,3 Argyris Zardilisb,4英国爱丁堡大学信息学院爱丁堡大学生物科学学院英国爱丁堡摘要当系统复杂时,生物学建模变得必要,但系统越复杂,模型就越难阅读。最常见的编写模型的方法是在离散的、类型化的对象(例如不同种类的分子)上编写反应,或者编写反应的速率方程这些物种的种群。这些方法的一个问题(1)是,物种和反应的数量往往是如此之大,以至于模型无法实际枚举。另一个问题是,物种和反应的数量是固定的,而生物学经常会产生新的隔间,这意味着新的反应和物种。在这里,我们扩展了反应的表示,其中对象携带由其类型定义的变量(例如,Leaf类型的对象都具有质量变量)。 动态是由类型规则定义的,这意味着它们适用于所有类型的对象。类型.这个紧凑的表示解决了问题1。如果我们将对象变量视为反应/速率方程物种的模拟,那么创建某种类型的新对象意味着我们也在创建新物种(解决问题2)。 我们还在编程语言Haskell中嵌入了Chromar并通过两个实例说明了其适用性。 拥有更紧凑的表示可以帮助制作模型一种用于知识表示和交换的工具,而不仅仅是模拟输入。 嵌入Chromar在通用编程语言中,它解除了建模语言的一些限制,同时仍然保持了特定领域语言的自然性保留字:规则建模,随机,表示,系统生物学1介绍我们用来描述自然或人工世界的符号可以作为思考它的工具。一个特定域的符号的特征1电子邮件:r. sms.ed.ac.uk2电子邮件:andrew. ed.ac.uk3电子邮件:gdp@inf.ed.ac.uk4电子邮件:A. sms.ed.ac.ukhttps://doi.org/10.1016/j.entcs.2018.03.0081571-0661/© 2018作者。出版社:Elsevier B.V.这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)。50R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49βKenneth Iverson简洁地列出了这些工具:人们为生物模型发明了许多优秀的符号,有些更通用,有些更特定于特定领域。当然,一个单一的符号不能用于所有的东西,一些特定的模型很难用任何现有的符号来编写,以满足上述标准,并使人和计算机易于理解。为了说明这个问题,考虑对一个不断增长的细胞阵列进行建模,每个细胞都有一定浓度的X物质在其中扩散、产生和破坏。 最常见的书写方法是在所涉及的分子类型(物种)上写下反应,或者为物种的种群写下相应的速率方程。在我们的例子中,我们可以写出每个细胞中X分子的以下反应,其中X1是第一个细胞中的X分子,X2是第二个细胞中的X分子,依此类推:X1−→dX2X2−→dX1X2−→dX3.α→αX1.X1−→X上述描述存在两个问题。第一个是它不是很紧凑,它随着细胞的数量而增长,因为我们必须写出每对细胞在两个方向上的散射反应和每个细胞的产生/破坏反应。第二,我们不可能描述新细胞的产生,因为我们需要为新细胞创造一个新的X物种,并为它创造新的反应,但符号没有提供表达这种可能性的方法。理想情况下,应该有一些符号,使我们能够以一种满足我们直觉的方式正式表示上述系统,例如编写一个通用的dif。聚变反应Xi→Xi+1,一般的生成X i →Xi,以及一般的破坏,以及产生新物种的方法。我们的主要贡献是一个符号,使我们能够以自然的方式写像上面这样的系统,从而解决了我们注意到的两个主要问题,即使更大的系统表示的紧凑性具体而言,我们的主要贡献包括:• 我们定义了一个基于规则的符号与随机语义。表示法中的主要实体是具有在类型级别定义的属性的对象,这样该类型的每个对象都具有这些属性。对于上面的扩散模型,我们可以有一个类型X(n:Int),属性n表示X分子在数组中的位置。对象是此类型R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4951这些规则描述了如何在类型级别添加或删除对象(第3节),因此规则适用于该类型的所有对象(X(n= 1),X(n= 2)等)。 这导致模型的更紧凑的表示,因为每个规则对应于多个具体的反应。如果我们使我们的物种属性为某种类型,例如在我们的例子中,我们可以有Cell(pos:Int, x:Int),当我们创建新的Cell对象时,我们也创建了新的物种,这些物种将被Cell规则自动拾取。这解决了我们注意到的第二个问题。我们的语言就像一个基于规则的有色Petri网。这种基于规则的文本表示对于大型模型的可读性变得非常重要,我们在Haskell中的嵌入提供了额外的表达能力,这在实践中也是至关重要的(参见第6节的完整讨论)。• 我们描述了一种算法,用于对用这种符号编写的模型进行随机模拟,该算法直接作用于属性对象和规则(第3节)。• 我们已经实现了语言,包括模型定义和模拟,作为Haskell(一种函数式编程语言)中的嵌入式领域专用语言(DSL)(第4节)。嵌入意味着我们可以在需要表达式的地方使用任何有效的Haskell表达式,例如在速率表达式和规则的右侧根据我们的经验,这在模型构建中非常有用,特别是对于更复杂的模型。 该语言和模拟器的代码以及安装说明可以在www.example.com上在线获得https://github.com/rhz/coloured-petri-nets/releases/tag/v0.1。• 我们使用示例展示了我们的抽象符号的表达能力,以及在通用编程语言中嵌入的优势(第2节和第5节)。2例如:植物生长现在我们将通过一个来自植物描述的例子来概述我们的符号。我们将考虑一个非常抽象的植物发育视图,它有足够的细节来展示我们符号的主要特征。我们的模型受到Chew等人的框架模型(FM)的启发。[4],这是一种模块化的全植物模型,将分子过程的传统植物生物学表示拟南芥植物在开花前的地上部分有一个简单的结构,叶子排列成一个圆圈。每片叶子都进行光合作用,产生主要的货币--碳;一部分用于维持,一部分用于生长;剩下的部分转移到其他叶子上。 在拟南芥的莲座丛中(收集 在转移中没有偏好,并且我们具有全对全的通信。与FM类似,我们将使所有的分子过程发生在一个中心植物“细胞”中52R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49Fig. 1.我们简单的工厂发展模式。所有的相互作用(在本例中是碳的转移)都发生在代表整个植物分子状态的中心Cell对象和充当碳汇的Leaf对象之间。 进入叶子的碳要么用于生长,在这种情况下,它被转化为新的材料(质量的增加),或保持现有的叶子的生命维持过程。新的叶子也被创造出来,创造新的汇,增加了叶子之间对碳的竞争,但也通过提供新的绿色增加了碳的生产。 光合作用区我们将以下面的方式来考虑植物生长的所有过程:我们认为每片叶子的碳同化是根据叶子的光合作用水平(这取决于它的大小)增加中央细胞的碳浓度我们也将创造新的叶子。这里有一些有趣的动态,例如生长和同化之间的相互作用:我们生长得越多,叶子就能进行光合作用,更多的碳可以进入中央细胞。由于对象是我们语言中的主要实体,我们可以开始考虑我们应该使用什么类型的对象来建模上述系统。我们将需要:• 一种叶类型,其质量和外观指数字段作为叶年龄的代理• 一种细胞类型,代表我们的主要植物“细胞”,带有一个字段,碳,以保持当前的碳水平:细胞(碳:真实)。在任何一个点上都只有一个这种类型• 一个Ros类型,用一个字段nl表示整个Rosette,以保持当前的叶子数量:Ros(nl:Int)。在任何点上也只有一个这种类型的对象。为了从一片特定的叶子中吸收碳,我们需要增加中央细胞的碳浓度。叶子越大,叶(年龄=i,质量=m),细胞(碳=c)f(m)−−−→叶(年龄=i,质量=m),细胞(碳=c+1)我们可以把这理解为,对于任何一对叶子,细胞,叶子保持不变,细胞增加其碳含量。请注意,我们将值R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4953任何叶,细胞对的字段的变量(m和c),以便我们可以参考在规则和速率表达式的右边。如果我们用传统的反应符号来写,我们必须为每个叶子写一个反应,这导致了我们前面提到的紧性问题。通过这里的隐式“for-all”,我们还可以在创建新叶子时拾取它们。对于维护,我们让中心Cell对象向Leaf对象提供一些碳,维护所需的碳量取决于Leaf的大小:叶(年龄=i,质量=m),细胞(碳=c)g(m)−−−→叶(年龄=i,质量=m),细胞(碳=c− 1)[c≥1]理解这些规则的另一种方式,也就是它们的含义在后面的定义(见第3节),是认为任何一对Leaf,Cell对象都可以被移除,并被一个Leaf对象和一个Cell对象所取代,Leaf对象的质量与我们移除的对象相同,Cell由于我们是根据被替换的对象(左侧)来定义替换对象(右侧),我们需要将它们的字段值赋给一些变量,这里是m和c,这样我们就可以再次引用它们。一片叶子的生长取决于它的质量,它的年龄(一片叶子可以生长多少是有限制的,所以老叶子在某个时候停止生长),以及可用的碳量叶(质量=m,年龄=i),细胞(碳=c)h(i,m,c)−−−−−→叶(质量=m+1,年龄=i),细胞(碳=c− 1)[c≥1]请注意,我们使用条件c≥1来确保碳水平不会变为负值。最后,为了创造新的叶子,我们有:Ros(nl=n)−→3克罗马尔Ros(nl= n +1)、Leaf(年龄= n +1,质量= 0. 0个)在上一节中,我们了解了这种语言的样子。在这里,我们将更仔细地定义语言的抽象语法及其语义。3.1语法对象或代理是语言中的主要实体。每个对象都是一个类型的实例化,它提供该类型的所有对象的一般结构。代理类型有一个名称和许多用于其属性的命名字段。它们的语法是:agentType:= AgentName(fieldDecl_1,...,fieldDecl_k)fieldDecl:= fieldName:typeK54R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49代理类型的一个例子是我们在上一节中看到的具有mass和age字段的Leaf代理类型:Leaf(mass:Real,age:Int)。任何特定的Leaf对象都是此代理类型的实例化,例如:Leaf(mass = 3. 5,年龄= 3)。字段的类型在这里不是固定的,语言在其中是参数化的。在下一节中,当我们定义Haskell嵌入时,我们将把它们固定为Haskell类型。系统的状态是定义类型的多个对象的集合。我们使用{|......这是什么?|}brackets.例如,对于我们在上一节中的示例中的对象类型,系统的可能有效状态是:{|叶(质量= 2. 3,年龄= 3),叶(质量= 3。1,年龄= 2),叶(质量= 3. 5,年龄= 1),Ros(n = 3),Cell(碳= 5. 六、|}规则具有以下语法:rule:= lhs--> rhs at rate([cond])lhs: = agentPat_1 , agentPat_2 , . ,agentPat_nagentPat:=AgentName( fieldPat_1 , ... , fieldPat_n ) fieldPat :=FieldName = varrhs:= agentR_1,.,代理R_nagentR : = AgentName ( field_1 , ... ,field_n)field:=FieldName =exprrate:= exprcond:= expr规则有一个左手边,它与系统的状态相匹配。任何匹配都可以被右手边替换。左边非常简单:它只能根据对象的类型选择对象,并将其字段的值绑定到一些变量,然后这些变量可以在值的表达式中使用 在右边的物体。 变量也可以用于在速率和条件表达式中。我们对变量的使用施加了一些限制:变量只能在规则的左侧出现一次,某些AgentName的模式数fieldPat应该与AgentName的类型声明中的字段相匹配。出现在rhs、rate和cond表达式中的变量必须出现在相应规则的lhs上。 cond是一个表达式,计算结果为布尔值,并确定规则的适用性。 同样,我们故意不将exprs和vars固定到任何特定的集合,我们可以认为语言是参数化的。在Haskell嵌入中,我们将它们固定为Haskell变量和表达式。对于本文的其余部分,我们将假设我们有一些访问器函数来访问某些规则的各个部分,其名称来自上面的语法。例如,对于某个规则r,lhs(r)是该规则左侧的访问器函数,依此类推。R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4955−−−−→3.2规则应用定义3.1匹配给定一个规则r,其左侧为L,状态为S,r在S中的匹配m是一个从L到S(作为多集)的内射映射,它保留了主体的名称。这个映射将S中的值赋值给出现在L中的变量。给定代理类型A(a:Int),考虑例如左侧A(a = x)、A(a = y)和状态{|A(a = 1)、A(a = 2)|}中。为了区分这四种不同的A类试剂,我们称它们为 A1,..., A4. 然后我们找到两个不同的匹配m1={A1A3,A2<$→A4}和m2={A1A4,A2A3}。 前者诱导[x/1,y/ 2],而后者给出[x/2,y/ 1]。一根火柴可以用来通过在匹配中用相关联的vals替换vars的所有出现来产生规则的具体实现。我们将这个替换写为[var1/val1,.,var n,val n].r对于某个规则r。 如果上面的左手边,例如f(x,y)b延伸到规则A(a=x),A(a=y)−→A(a=x+y),A(a=y−1)[g(x,y)]其中f:Int×Int→Real和g:Int×Int→Bool,则m1产生反应我们的替代规则:[x/1,y/2]。.A(a=x),A(a=y)f(x,y) A(a=x+y),A(a=y−1)[g(x,y)]~f(1, 2)A(a= 1),A(a= 2)−→A(a= 3),A(a= 1)[g(1,2)]对于某个规则r和匹配σ,将该规则应用于多重集M会得到一个新的多重集MJ,由下式给出MJ=Mrhs(σ.r)\lhs(σ.r)其中和\分别是多集加法和差集[25]。 只有当cond(σ.r)对于特定匹配σ的计算结果为True时,才可以应用规则。3.3随机语义学由于任何规则和匹配都会给出具体的反应,因此任何Chromar模型都可以通过考虑所有可能的匹配,也就是所定义类型的所有可能的实例化,可以扩展到一个等价的简单反应系统。Chromar的随机语义与等价的简单反应系统的随机语义相同具体地说,随机过程是一个连续时间马尔可夫链(CTMC),状态空间由我们类型的具体实现上的所有可能的多重集组成。在大多数情况下,展开的系统将给出有限的反应,除非我们在对象类型中约束场的类型。然而,对于一个给定的状态,只有有限的这些反应将适用,所以我们仍然可以使用正常的随机模拟算法(SSA)从CTMC获得样本路径。具体来说,我们的算法是通常的SSA,但有一个额外的步骤,动态地创建基于系统56R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49当前状态的反应R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4957Σ率(i) 查找每条规则和每场比赛的所有反应:R={σ. R|r∈Rules,σ∈Φ(r),cond(σ. r)=T rue}其中Φ(r)由当前状态下规则r的所有匹配组成(ii) 计算总速率T=r∈Rrate(r)。(iii) 从累积分布函数F(t)= 1−e−rateTt的指数分布中选择下一个反应事件的等待时间。(iv) 精确地选择其中一个反应,选择反应i的概率为(ri)。不(v) 如果选取了反应i,则更新状态:MJ=Mrhs(ri)\lhs(ri)和4Haskell嵌入在语言的任何实现中,最终所有实体都必须成为某种编程语言中的数据结构,以便在计算机上设置模型。 这有两个极端。 在一端,我们可以使模型定义与上一节中提出的抽象模型定义完全相同,然后将其转换为编程语言结构。在另一端,模型定义可以直接作为某种编程语言中的构造发生两者都有优点和缺点,但在这里我们选择了中间的东西:模型定义留在编程语言中,但我们稍微调整了语言,以便它理解方便的规则语法。我们选择了函数式编程语言Haskell来实现和嵌入我们的语言。对于实现,我们需要选择如何定义对象以及如何定义规则。 对象及其类型是Haskell中的记录类型,我们的匹配与Haskell的模式匹配具有相同的语义,因此类型的定义很容易。这就是植物生长示例中对象类型的定义:data Object = Leaf {mass:: Double,age::Int}| 单元格{carbon ::Double}| Ros{ nleaves::Int}关键字data定义了一个新的数据类型,这里我们定义了一个union类型,它有三个由y分隔的possible构造函数|.规则的定义有点不那么简单,但我们可以认为规则作为以下类型的函数Multiset a -> [Reaction a],其中a是一个类型变量,可以代表任何用户定义的对象类型。正如我们所看到的,每一条规则都是具体反应的生成器。我们不能期望用户编写函数来进行匹配和创建反应(即使它不是太很难用Haskell写,因为我们可以利用HaskellHaskell中的准引号允许在[|......这是什么? |]报价只要你提供58R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49一个quoter,一个函数,它接受引号符号中的字符串,并产生Haskell抽象语法,在编译时注入引号的位置。由于我们想要的所有规则函数定义都具有类似的结构,所以很容易编写这样一个引用器函数,它接受以抽象语法编写的规则并创建正确类型的函数。这就是植物系统(第2节)的生长规则的写法:增长=[规则|叶{质量=m,年龄=i},细胞{碳=c}-->叶{质量=m+1,年龄=i},细胞{碳=c-1} @f(m,i)[c-1>0]|]这看起来非常接近于我们在抽象语法中编写规则的方式,但是有一些小的语法差异,例如在规则的末尾放置速率表达式,前面是@符号。至关重要的是,在编程语言中意味着我们可以在需要表达式的地方使用任何有效的Haskell表达式,即在规则、速率和条件的右侧字段的值中。我们的simulate函数接受一个规则列表,一个作为多集的初始状态,步骤数rules= [growth,assimilation,leaf Creation]initState= ms [叶{年龄=1,质量=1.0},叶{年龄=2,质量=1.5},Ros{nleaves=2},细胞{碳=4.5}]模拟规则initState 100其中ms是一个函数[a] -> Multiset a,它从List创建一个Multiset。simulate函数实现了上一节定义的模拟算法。4.1可观测仿真算法是一种从状态空间中提取样本路径的方法由于我们的状态是定义类型的对象上的多重集,路径只是多重集的时间索引序列。然而,系统的完整状态很少是我们想要知道的,或者至少很少是我们想要知道的唯一事情。例如,给定一个表示前面示例中虚拟植物状态的多重集,我们可能想要计算整个植物的质量,或者我们可能只想要碳水平。在多集之上考虑合适的查询原语,下面两个操作看起来很自然:select::(a -> Bool)-> Multiset a -> Multiset aaggregate::(a->b->b)-> b-> Multiset a-> b这些只是数据库查询语言中的选择和聚合语句,其中数据库通常被视为多集[3](在[16]中更理论化)。事实上,我们的带有命名字段的对象类型类似于数据库记录。这些查询语句与正常的函数组合很好地组合在一起,这在Haskell中是原始的,所以例如我们可以通过以下方式获得前三个叶子的质量R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4959mass3 =合计总和0.0。选择是FirstThree。选择isLeaf使用函数isFirstThree,isLeaf::Object ->Bool和明显的实现。这些是最通用的查询结构,但从它们开始,我们可以专门使用默认的过滤器和累积函数来处理最常见的用例例如,要从多集中选择元素,我们对具有特定类型的对象或对字段具有某些值的对象进行特殊选择为了聚合,我们有特殊的聚合函数,如sum,min/max,average,count。5另一示例我们在这里给出另一个例子,一个不断增长的细胞区域,它们之间存在某种物质的差异。这是在引言中给出的例子的更复杂的版本,其中不是在一端生长细胞的域,而是在任何位置的任何细胞都可以分裂。假设一维单元阵列,每个单元具有在它们之间扩散的物质x的浓度,我们引入以下类型:• 单元格(位置:位置,x:内部)• T(ncells:Int)Cell对象有一个保存位置信息的pos字段。在这种情况下,为了完全确定单元在数组中的位置,我们需要它的标识符和标识符的邻居。这样,我们就可以使用一个单元格的标识符与另一个单元格的相邻字段中的标识符Cell还跟踪x个分子的数量。我们还有一个T对象,代表一个带有ncells字段的组织,用于跟踪阵列中的细胞数量。这是为分裂产生的细胞提供新的标识符所必需的进入系统的动力学,扩散是一个分子从一个细胞转移到另一个细胞,我们假设它以相同的概率发生在细胞的左右邻居(见图2)。这给出了以下规则:Cell(pos =p,x=x),Cell(pos =pJ,x=xJ)−→Cell(pos =p,x=x− 1),Cell(pos =pJ,x=xJ+1)[nextTo(p)= id(pJ)x−1> 0]其中id:Pos→ Int和nextTo:Pos→ Int分别是Cell及其右邻居的标识符的访问器函数。这里我们使用一个条件来限制我们的匹配,因为区分规则并不适用于左侧拾取的所有Cell对象对。为了生长,我们在分裂细胞的右边创建一个新的细胞,并将x分子尽可能均匀地分裂在两者之间X60R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49图二.狄仁杰规则。细胞内的任何分子都可以以相等的概率向细胞的右边或左边移动。图三. 成长法则 这里细胞b分裂产生细胞n+ 1(假设我们在分裂前有n个细胞),单元B移动到新单元的左侧。细胞b的5X分子在自身和新创建的细胞之间分裂。细胞:T(ncells =n),Cell(pos =p,x =x)G/n−−→T(ncells =n+1),Cell(pos = Pos(id(p),n+1),x =ceil(x/2)),Cell(pos = Pos(n+1, nextTo(p)),x =cumbercoor(x/2))分裂的细胞被推到左边,保持其id,并将其邻居标识符更改为新细胞的标识符。新细胞从T中的计数器获得一个新的标识符,并从其母细胞的旧邻居中获得一个邻居标识符(图3)。我们假设对于整个阵列存在一般增长率G,因此每个单元的速率被缩放为G/n。在这个系统中比较有和没有增长的行为是有趣的。由于我们不是在创造新的分子,我们希望分子在细胞中扩散。随着生长,我们预期每个细胞的分子更少,因为相同数量的分子分布在更大数量的细胞上-参见图4a,细胞1中X分子的数量在有和没有生长的过程的一个实现中。由于二聚体在细胞间传播分子,我们预计细胞内容物的变异性会随着时间的推移而下降。同样有趣的是,观察在仅扩散和扩散+生长过程中变异性降低的速度有多快。在图4 b中,我们绘制了三种不同情况下细胞内容物(分子数)的标准偏差如何随时间减少-仅为二聚体,二聚体+生长速率G= 1,二聚体+生长速率G= 10。 虽然我们不能比较绝对数量,因为我们在每种情况下都有不同数量的细胞,但我们可以看到,生长放大了扩散分子的差异效应,并更快地降低了细胞内容物的变异性6相关工作用字段扩展简单对象来表示它们的一些属性的想法以前已经被使用过,例如在有色Petri网[12]和CSMMR[21]中基于规则的设置中。我们的符号是受这两个的启发,R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4961(一)(b)第(1)款见图4。 左边是第一个细胞中有和没有生长的X的数量。 我们从两个过程开始,10个细胞,在生长情况下,我们激活G = 0的生长规则。1. 一开始,当细胞的数量接近时,轨迹接近,但随着细胞数量在生长过程中的增加,细胞中的分子数量平均低于没有生长的过程。 在右侧,我们绘制了3种不同情况下细胞含量(细胞数量)的标准差,仅不同的过程,以G= 1的速率生长的细胞+生长,以及以G= 10的速率生长的细胞+生长,所有这些都从10个细胞开始。 我们可以看到,增长越快,分子扩散得越快可以把我们的符号看作是随机有色Petri网的基于规则的版本,其中更丰富的类型是第一类,而不仅仅是转换为非有色版本的一种手段。我们也可以把我们的符号看作是CSMMR的一个简单版本,只剩下颜色。我们在编程语言中嵌入以增加表达能力也是新的,并且适合丰富类型的可用性。然而,还有其他语言,虽然没有提供编程语言的全部功能,但仍然允许出现复杂的表达式,例如在速率表达式中。例如,在React(C)[14]中,速率表达式可以从函数式编程语言的子集构建,并带有反射选项以访问系统的完整状态。这允许例如通过将速率设置为0来在速率内编码我们的条件。如果不满足条件,则为0。其他广泛使用的语言,如KaSim(Kappa的模拟器[6])和BioNetGen[1]的模拟器也允许更复杂的速率表达式,超越传统的质量作用动力学速率。使用数据库的启发操作的观测值也是我们的多集查询原语的声明性质使得可观察量的定义非常直观。LINQ[2]中使用了类似的数据库启发的集合查询操作,尽管集合通常被认为是列表而不是多集。Buneman颜色可用于编码物种的结合,如前一节中的示例。然而,当我们使用它们来编码结 合 时 , 我 们 可 能 会 更 好 地 使 用 直 接 表 示 结 合 的 语 言 , 如 Kappa [6] 或BioNetGen[1]。然而,在前一秒的分裂细胞和分化模型62R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49图五. 作为着色Petri网变迁的增长规则。当然,我们用颜色的其他方式,不能很容易地表示为绑定。特别是,细胞内容物的分裂很难用Kappa表达。此外,计算我们在每个位置发现了多少个X分子将不得不通过手动检查状态来完成在接下来的两个部分中,我们将重点放在与有色Petri网的比较上,因为这是最直接的可比系统,并与来自(主要)不同领域(生态学)和不同范式的系统进行比较6.1有色Petri网与我们的符号最接近的形式主义是有色Petri网。Petri网是一种基于图形网络的形式主义,通常用于表示反应。网中有地点承载着大量的标记,而转换是将标记从一个地点移动到另一个地点的一种方式。 系统的状态只是每个地方的令牌数量。有色Petri网(CPN)是Petri网的一个扩展,它允许通过允许它们具有与其位置类型(颜色集)相关联的数据值来区分标记(标记的着色)[12]。例如,如果地点的类型为Leaf(mass:Real,age:Int),则该地点中的令牌的值可能为Leaf(mass = 3.0,年龄= 2)。我们从第2节中的植物生长例子中的生长过渡将给出图5中的网络。我们有两种颜色:叶子,这是一个产品类型超过年龄和质量,和碳。我们的初始状态在叶子位置有两个代币,一个年龄为1,质量为10,另一个年龄为2,质量为5,我们有一个碳代币,价值为10。一个transition从它的前位置(从它们到transition有弧线的位置)中删除tokens,并将tokens移动到它的后位置(从transition到它们有弧线的位置)。在这种情况下,前位置和后位置是相同的,因此转换的效果与我们的系统一样:删除一个Leaf并用具有更新质量的Leaf替换它,并删除碳令牌并用具有更新值的碳令牌与我们的系统的对应是直接的,coloursets是我们的对象类型(带有命名字段的记录),token是我们的对象,transitions是我们的规则。CPN转换也有与我们的条件相同的谓词。一个区别是CPN还允许联合类型而不仅仅是产品类型就像我们的语言。这种CPN公式的随机版本也已经被R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4963之前用于生物建模,例如用于描述果蝇翅膀中的平面细胞极性[8]和其他用例[24,9]。在这些使用随机版本的例子中,其语义只是作为相应的简单Petri网的翻译给出。问题是,在很多情况下,展开的简单Petri网 有无限多的反应。 这意味着,为了能够所有类型的展开都必须被限制到某个有限集合,这进一步意味着不允许实值。这也反映在有色Petri网工具实现中,其中可以定义随机有色Petri网,但定义在运行之前展开[10]。在这里,我们直接定义了彩色随机版本的语义,并有一个模拟算法,其中反应是根据需要动态生成的,而不是在开始时静态创建的这使得我们可以为字段提供无界类型,包括实数。我们可以把我们的语言看作是有色Petri网的一个随机的基于规则的(以及文本的)版本。我们在通用编程语言中的嵌入也是新的,因为大多数Petri网工具都有一个图形界面来定义模型,尽管有一种混合方法可以将图形定义与编程语言结构(ML语言)混合[13]。虽然图形符号对于较小的模型是直观的,但我们发现,对于较大的模型,它们变得难以阅读,而基于文本的方法(如我们的语言)产生了更可读的表示。Haskell中的嵌入还有助于管理更大模型的复杂性,因为我们可以使用Haskell使用任何Haskell表达式的能力也是至关重要的,因为我们可以重用现有的库,可以访问所有的语言原语,并且我们能够为表达式编写任何数量的函数(用于速率,规则右侧等)。这有助于隐藏规则的复杂6.2明喻明喻是另一种与我们的方法有相似之处的图形语言[20]。明喻主要用于生态学和农业科学领域,在系统生物学中也曾使用过(第2节中第一个例子的灵感来源于整株模型[4]),以精确地解决我们在引言中提到的问题。在Simile中,模型有两个层次的定义,在第一个层次上,我们有连续变量和速率方程,在第二个层次上,我们有离散对象和离散动态对象根据它们的类型进行分组,并且它们的行为在人口级别上给出。 根据我们的植物生长示例,Simile中叶子的生长将如图6所示。我们有一群Leaf对象和一个Biochem对象,表示我们在规则中称为Cell的对象。群体中的每个叶具有作为连续变量增长的质量为了从生物化学对象中的碳变量定义碳的使用,叶对象的数量也会增长(请参见创建框)。64R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)49图第六章生长法则是一个Simile模型。连续变量和对象这两种实体的动态性并不像我们的语言那样是一体化的。 在Chromar中创建新对象或更新对象字段中的值以相同的方式通过删除和添加对象来工作。 主要的区别是,Simile模型的执行最终是作为一个ODE系统,而在Chromar中,我们是在随机世界中。同样,根据我们的经验,Simile的图形符号对于大于几个变量的模型来说是有问题的。7讨论和结论我们已经定义了一个反应表示的扩展,我们将简单的类型化对象扩展到使用丰富类型的对象,即具有命名类型化字段的记录。在这些更丰富的类型上编写规则会产生比在传统的反应设置中在更简单的类型上编写反应更紧凑的表示。此外,它有时有助于编写不可能以其他方式编写的系统,例如具有动态物种数量的系统,允许我们将变量存储为对象属性,这意味着创建新对象会创建新物种。从我们的代表性示例中我们已经看到,我们得到的更紧凑的模型表示可以更容易阅读和更直观地编写。最后,我们编写模型来表达我们对世界的理解,但模型越复杂,它们的表示就越远离我们对世界的心理模型。然后,模型变成模拟输入,心理模型变成图表/图片,以捕捉过程的直觉。我们在这里的工作是缩小心智模型和正式可执行模型之间差距的一步,至少对于系统生物学中的一类模型来说是这样在实现方面,我们在Haskell中的嵌入解除了建模语言的一些限制,我们认为这是两全其美的:它自然而简洁地捕获了我们感兴趣的领域中的一些元素,但同时当需要更大的表达能力时,我们可以转向编程语言。 这种表达能力的提高可能会以牺牲对模型进行一般分析的能力为代价,因为我们不能说太多关于Haskellexample中规则内部发生的事情。似乎有一种趋势,虽然在迪-混合特定领域和通用编程语言,R. Honorato-Zimmer et al. /Electronic Notes in Theoretical Computer Science 335(2018)4965例如Pedersen等人。[23]允许在LBS-κ中嵌入F#脚本,而在PySB[17]中, Kappa模型在Python中定义。在某些情况下,像我们这样在编程语言中嵌入特定领域的语言比相反的做法更好-在在模拟方面,我们的实现很简单,基本上遵循我们在第3节中介绍的步骤。关于反应的动态生成的想法也出现在[22]中。改进的一个方面是反应生成步骤,我们目前在每一步都生成所有活性反应但实际上,我们不需要在每一步都完全重新生成它们,因为只有一个子集在步骤之间发生变化。性能增益将取决于在状态改变之后计算反应集的改变的效率。在Kappa[7]中使用了类似的技术,其中匹配仅在模拟开始时生成一次,然后根据状态变化进行更新。我们的符号可以有多种扩展方式。我们的规则左侧非常简单,只能根据类型进行选择,这意味着我们可以直接编码的唯一关系是类型的乘积(我们可以将类型视为包含该类型所有对象的集合)。例如,在我们的单元格数组示例中,写入Cell(. ),Cell(. )表示该规则适用于任何在Cell× Cell的关系中。 很多时候这是可以
下载后可阅读完整内容,剩余1页未读,立即下载
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)