Page 77 - 《软件学报》2021年第6期
P. 77

苏卓  等:基于分支标记的数据流模型的代码生成方法                                                        1651


         分支路径(BranchPath),表示由多层分支组件带来的不同的分支情况,记为{Branch 1 ,Branch 2 ,Branch 3 ,…};分支路
         径表,也称为一个组件的分支标记,表示某个组件所有可能的分支路径及分支路径上的数据源的集合,记为
         {BranchPath 1 :Actor 1 ,BranchPath 2 :Actor 2 ,BranchPath 3 :Actor 3 ,…}.
             对于一个已经确定了各个调度层的模型,首先要对模型中的组件进行分支标记.分支标记方法如算法 1 所
         示.算法 1 的整体逻辑是从前向后逐层遍历整个模型,对每层中的每个组件单独计算分支信息.算法 1 的第 3 行,
         获取当前组件的所有前驱组件.若当前组件没有任何前驱组件,则直接标记当前组件的分支为带有空数据的分
         支路径,如算法 1 的第 4 行~第 7 行所示;若存在前驱组件,则构造一个分支路径表,分支路径表是一个 map 结构,
         key 存储分支路径,value 存储由 key 分支路径所带来的数据源组件.接下来,第 9 行~第 23 行遍历当前组件的所
         有前驱组件,获取它们的分支路径信息.其中:若前驱组件不是分支组件,则直接继承该前驱组件的分支路径信
         息,并把该前驱组件作为当前组件的当前分支路径的数据源,如第 18 行~第 22 行所示;若前驱组件是分支组件,
         则要在该前驱组件的分支路径的基础上连接该前驱组件的分支信息作为新的分支路径,如第 11 行~第 17 行所
         示.在获得了当前组件的所有分支路径之后,对这个组件的所有继承来的分支路径做简化处理,再赋值给当前组
         件的分支信息,如第 24 行、第 25 行所示.
             算法 1.  基于数据流模型的分支标记算法.
             输入:确定调度顺序的数据流模型 ModelLayers;
             输出:模型中所有组件的分支标记 BranchInfos.
             1:   for each layer in ModelLayers
             2:      for each actor in layer
             3:         predecessors=getPredecessors(actor)
             4:         if predecessors==∅ then
             5:            BranchInfos[actor]=getBranchPathWithEmptyDataSrc(⋅)
             6:            continue
             7:         end if
             8:         branchPathsWithDataSrc=∅
             9:         for each pred in predecessors
             10:           branchPathsOfPred=BranchInfos[pred]
             11:           if isBranchActor(pred) then
             12:              for each branchPath in branchPathsOfPred
             13:                 for each branch in getActorBranches(pred)
             14:                   newbranchPath=connectBranchToBranchPath(branchPath,branch)
             15:                   addDataSrcToBranchPaths(branchPathsWithDataSrc[newbranchPath],pred)
             16:                 end for
             17:              end for
             18:           else
             19:              for each branchPath in branchPathsOfPred
             20:                 addDataSrcToBranchPaths(branchPathsWithDataSrc[branchPath],pred)
             21:              end for
             22:           end if
             23:        end for
             24:        branchPathsWithDataSrc=simplifyBranchPath(branchPathsWithDataSrc)
             25:        BranchInfos[actor]=branchPathsWithDataSrc
             26:     end for
   72   73   74   75   76   77   78   79   80   81   82