Questions tagged «reproducibility»

8
如何确保模拟结果和论文中的结果始终保持同步?
在我的一篇论文中,我列出了一些数字结果以及一些数字。我想做的是确保论文中的数值结果始终与代码一致。现在,我只是将模拟结果的数值结果直接复制到纸张中,这非常简单且技术含量低,但容易出错,因为我可能会错误地复制结果,或者忘记将纸张结果与代码输出。 有没有一种很好的方法可以使我在论文中引用的数值结果与我的代码生成的结果保持同步?(在这里,我认为执行代码很容易且实用,只要我想更新论文即可。)这些数值结果不一定适合表格形式。有时,手稿中有表格,但更常见的是,我在方程式中将仿真参数列为数字。例如: y∗=(y∗1,…,y∗n)y∗=(y1∗,…,yn∗)\begin{align} \mathbf{y}^{*} = (y_{1}^{*}, \ldots, y_{n}^{*}) \end{align} 我想替换初始条件y ∗的元素y∗y∗\mathbf{y}^{*}用实际参数我在模拟中使用了实际参数,该模拟对常微分方程组进行了数值积分。使用一个表来处理一次性数据(例如本例)似乎是多余的,而且墨水过多。 我认为数字是一种更简单的情况:只要“构建”文档(从LaTeX源,Markdown,RST等),就可以通过执行代码来开始构建过程。但是,如果人们有更好的建议可以使模拟生成的图形与我的论文保持同步,那么我很乐意听到它们。

5
为了使我的计算研究具有可重复性,我应该在期刊文章中(或在线发布)包括哪些材料?
可重复性在计算科学研究中变得越来越重要。(例如,请参见《科学》杂志的Roger Peng的这篇文章;我也知道其他此类文章和网站。)但是,我不清楚我应该在期刊文章(或在线文章)中包含多少信息来制作我的计算研究具有可重复性(假设没有其他障碍,例如知识产权协议)。是否有任何指南,如果没有,人们是否可以建议研究人员应采取哪些步骤来使他们的计算科学研究可重复? 答案中特别有用的是实现这些建议的可能方法-从根本上说,工作流。最好是与系统无关或基于Linux的工作流。此外,讨论您所经历的任何相关个人经历也将有所帮助。 在我的特殊情况下,我正在写一篇理论论文,其中包含一些示例计算,这些计算很简单,可以在MATLAB中完成。我认为,在这种情况下,包括MATLAB脚本,并注意计算机上特定版本的MATLAB,足以确保可重复性。但是,我敢肯定还有更复杂的场景,有关如何进行可重复研究的建议对于将来的项目很有帮助。

6
如果需要专有库,进行可重复研究的最佳方法是什么?
可重复进行的计算研究旨在使计算论文中生成结果所需的代码可供其他研究人员使用,以便他们可以运行此代码以在该论文中复制结果。我想提出我的研究可重复的,但我快到有点障碍的:一对夫妇的论文,我就利用工作的内部自动分化包(称为DAEPACK一种专有库)(CHEMKIN- II;许可条款不清楚)。 用开源版本替换这些软件组件将非常耗时。已经存在CHEMKIN-II的开源替代品,名为Cantera,但Cantera使用C ++,而CHEMKIN-II使用Fortran77。这将需要大量的精力来修改足够的Cantera代码,以便可以自动处理它。 C ++的差异化工具。 鉴于我需要这些专有软件包,假设研究人员可能无法使用CHEMKIN-II,那么使我的研究尽可能可重复的最佳方法是什么?由于DAEPACK是一个源到源的翻译器,因此我不必分发DAEPACK。我也许可以包含其输出,该输出将是计算派生的Fortran源文件。 更一般而言,如果您在工作中需要专有软件,并且专有软件不广泛使用(例如,MATLAB,Mathematica等不是),那么如何使您的工作可再现?

5
如何解决数值非关联性以进行并行约简?
并行归约假设相应的操作是关联的。添加浮点数违反了该假设。您可能会问为什么我对此很在意。好吧,它使结果的再现性较差。当使用模拟退火来优化(或拟合参数)子程序时,情况变得更糟,从而产生不可再现的结果。 解决此问题的常用方法是什么?关于以下策略可以说些什么? 不在乎不可复制性。 不要对浮点数和加法运算使用并行约简。 以可复制的方式创建适当大小的工作包,并手动进行最终缩减。 使用更高的精度进行添加(但并非所有编译器都提供更高精度的浮点类型)。

1
如何使用自己的代码轻松地在自己的文章中复制已发布的结果
我写了一个程序/库,用来在一篇文章中获得结果。(这里是,但是我的问题很笼统。)我有定期使用的测试ctest(运行需要几分钟)。为了重现文章中的某些表格或图表,我必须构建一个脚本或一个简单的驱动程序,该程序可能运行10分钟,有时甚至更长,因此我不想将其包含在常规测试套件中。同时,我想确保本文的结果可以是: 后来转载 在我继续开发库之后,请确保它们仍然给出相同/正确的结果 目前,我尝试拥有一个作为常规测试套件一部分运行的小型驱动程序,如果要重现本文的结果,请取消注释其中的几行。当然,我永远不知道确切的行以及是否必须调整一些其他参数才能获得与文章中完全相同的结果。 我还尝试过使用Python脚本来计算文章中的确切数字/表格。此类脚本通常在库更新后停止工作,因为它不是定期运行(占用太多时间)。 我想到的最好的方法是有一个Fortran(或C / C ++)示例,该示例将定期编译(作为库的一部分),但不能在常规测试套件中运行。这样,至少我知道它可以很好地编译(因此希望也可以运行)。作为常规测试套件的一部分,我将测试一些简单(较小)的示例。 解决此问题的最佳方法是什么?

4
为了使读者可以清楚地将结果与生成结果的代码相匹配,最有用的方法是为论文编写代码?
我正在写一篇可复制的论文,该论文具有由Python脚本生成的计算结果(类似的MATLAB脚本生成几乎相同的结果)。我认为,如果读者可以将论文中的计算结果与代码中的计算结果相匹配,则读者会更容易理解本文。该工作提出了一种抽象的形式主义,并且本文中的示例应使这种形式主义对读者(其中很多是工程师)更加具体。该代码可能是有关如何执行计算的最详细记录,并且将其弄清楚可以在审核过程中为我们提供帮助。 是否有人对如何使代码与计算结果(数字,方程式)之间的对应关系更清晰有任何建议? 例如,我当时在想实现本文中各个步骤的代码行,我可以引用方程式编号(如果我可以在代码和LaTeX之间进行交叉引用,那真是太神奇了,但是手动标记它们就可以了) ,我可以编写与各种示例和图相对应的函数,例如 def example_1(): # Insert code corresponding to first example pass def figure_1(): # Insert code that generates Figure 1 pass 如果代码很大,而我并不想解释工程中使用的一堆不同的数学方法实际上是如何相同的,那么我可能不会很费心地使代码清晰明了,但是鉴于代码的抽象性质本文和少量的代码基础,似乎在此练习中可能有价值。


4
对与使用MPI的代码/库兼容的单元测试框架有何建议?
通常,我编写串行代码,然后编写,并使用一些xUnit风格的测试框架(MATLAB xUnit,PyUnit / nose或Google的C ++测试框架)编写单元测试。 基于对Google的粗略搜索,关于从业人员如何对使用MPI的测试代码进行单元化的知识很少。有什么最佳实践吗? 与单元测试和测试驱动的开发策略相比,我正在寻找与应该用于测试框架的软件有关的答案(如果存在的话,答案很可能是“编写自己的代码”),其中自定义测试代码的案例示例会很有帮助)。 我要测试的大部分内容都是用于右侧步进功能的评估以及用于时间步进器的Jacobian矩阵汇编例程,这些例程将集成半离散的PDE。我将使用PETSc,因此,如果有PETSc特定的内容,那么除了更通用的测试框架之外,这也将有所帮助。 澄清度编辑: 一个示例将在中${PETSC_DIR}/src/ts/examples/tutorials/ex2.c,在该示例中,我想测试类似的内容RHSFunction(右侧函数评估),然后RHSJacobian(雅可比矩阵评估)。我将针对组装好的右侧和组装好的Jacobian矩阵的已知值进行测试;对于一些简单的问题实例,我可以通过分析获得这些值。这些函数是特定于应用程序的函数,不会执行任何其他应用程序级函数,但是如果在函数内完成矢量或矩阵汇编,则可以调用MPI(如上面的链接PETSc示例中所示)。如果我编写的函数仅计算处理器局部的矢量或矩阵的部分,则我将尽可能对全局汇编版本进行测试,因为对于并行编程来说,这是我的第一次直观思考全局矢量和全局矩阵。这些测试将在较小的问题规模和少量的处理器上运行。 我可以想到一些实现此目的的策略: 根据我在该主题上所做的Google搜索,一种可能效果不佳的策略是构造一个已知的输出,并行找到相对/绝对误差,然后进行幼稚的比较。输出可能会出现乱码 -任何使用MPI编写“ Hello,world”程序的人都知道原因-这限制了进行单元测试的效用。(这是提出问题的动力。)在调用单元测试框架时,似乎还存在一些潜在的棘手问题。 写输出到文件(PETSc中,例如,使用VecView和MatView),和比较反对的东西,如已知的输出ndiff或numdiff。我从以前通过文件比较进行单元测试的经验中得到的这种方法的直觉是,它会很挑剔,并且需要进行一些过滤。但是,此方法似乎非常适合进行回归测试,因为我可以将上述实用程序替换为plain diff,而不必担心匹配文本格式。我已经收集到该策略或多或少是WolfgangBangerth和Andybauer所建议的。PETSc似乎也使用类似的方法进行某些测试。 使用单元测试框架,将所有信息收集到MPI等级为0的处理器上,并仅在处理器等级为0时要求它执行单元测试。我可以对规范做类似的事情(这种方式可能更容易),尽管需要权衡取舍就是返回的任何错误都会告诉我我的计算有问题,但是哪些元素没有错误。然后,我不必担心任何单元测试输出都会出现乱码。我只需要担心正确调用单元测试框架。当确切的解决方案可用时,PETSc似乎在其示例程序中使用基于规范的比较,但进行比较时,它不使用单元测试框架(也不必这样做)。

5
增加代码的归档寿命
是否有已发布的最佳实践清单,以确保代码的使用寿命,并着眼于可重复的科学结果?(例如,开源,文档做法,选择依赖项,选择语言,虚拟机等)。 了解任何试图估计典型科学代码或其他软件的半衰期的研究(或缺乏示例/注释)(如果这是一个合理的问题?)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.