Page 430 - 《软件学报》2025年第12期
P. 430

黄小龙 等: ReproLink: 面向可复现性的科研数据管理系统                                               5811


                 在复现执行完成后将其加入          Done 集合, 并更新    Ready  集合, 从而以拓扑序依次执行每个复现单元. 伪代码中的
                 GetCode、GetDatasets 和  GetInputReproductionUnits 函数均使用对象检索引擎基于单跳路径匹配的搜索实现. 在
                 每个复现单元执行完成后, 复现执行引擎都会调用数据管理模块创建结果数据集对象和复现单元之间的关系对
                 象. 在复现完成后, 其他用户就可以使用对象检索引擎从新数据集检索到输入数据集, 或根据输入数据集查询衍生
                 的新数据集, 从而实现了基于关系的数据溯源和数据发现.
                 算法  1. 代码执行.

                                             D
                                     C
                 1.   function ExecuteCode( I , I ,..., I )
                                        D
                                        1    n
                     C
                                           C
                                          I
                 2.    O ← DoManager.RetrieveDo( )
                 3.   for i=1 to n do
                 4.     O ← DoManager.RetrieveDo( I )
                       D
                                             D
                       i
                                            i
                 5.   end for
                                                                   D
                           ← CreateContainer( π EE (O ), π EC (O ), π E (O ),..., π D (O ))
                                              C
                                                           D
                                                    C
                 6.   container                            1       n
                 7.   StartContainer(container)
                 8.   WaitAndMonitor(container)
                 9.    D ← GetResults(container)
                     ′
                 10.  O ← DoManager.CreateDo( D )
                     D ′
                                          ′
                 11. return  O  D ′
                 12. end function
                 算法  2. 复现执行.
                 1.  function GetDependentObjects(r)
                 2.    R ← {r}
                 3.   for r  ∈ GetInputReproductionUnits(r) do
                 4.     R ← R ∪ GetDependentObjects(r)
                 5.   end for
                 6.   return R
                 7.  end function
                 8.  function ExecuteOneReproductionUnit(r, Results)
                 9.     C ← GetCode(r)
                 10.   D ← GetDatasets(r)
                         ′
                 11.  for  r ∈ GetInputReproductionUnits(r) do
                 12.    D ← D∪{Results[r ]}
                                     ′
                 13.  end for
                 14.    output ← ExecuteCode(C,D)
                 15.  return output
                 16. end function
                 17. function ExecuteReproductionUnits(reproductionUnit)
                 18.   R ← GetDependentObjects(reproductionUnit)
                 19.    Results,Ready,Done ← ∅,∅,∅
                 20.  for  r ∈ R do
   425   426   427   428   429   430   431   432   433   434   435