我作为一名博士生从事计算工作,我试图找到一种正确的方法,将代码(求解器)与基于该求解器的计算实验分开。
基本上,我所做的每个项目都围绕一个特定的求解器(MATLAB 或 Python 代码),并且对于每个项目,都应该进行一组实验。之前,我想通过以下方式进行操作:
project
01-2016-01-01-task-1
02-2016-01-01-task-2
03-2016-01-03-task-3
这样每个子文件夹对应于我所做的一个特定任务(或实验)。每个子文件夹都包含求解器的所有输出和求解器代码本身,因为我经常需要为特定实验修改求解器。
我已经推断出修改求解器代码的最佳方法是向后兼容的方式,这样如果实验需要我更改代码以使用例如不同的时间积分器(我求解 PDE),那么应该向求解器添加一个新的配置参数,该参数定义在运行时使用的时间积分器。
但是,我对这种方法有一个问题(为每个实验保留本地版本的求解器):我必须将所有这些不同的版本合并在一起,现在我手动完成。最近,我想到一个更好的组织是
project
code
tasks
01-2016-01-01-task-01
...
27-2016-03-06-task-27
也就是说,代码应该是集中的和版本控制的。
现在想象以下情况。实验要求我修改代码,然后使用不同的参数运行求解器 3 次,每次运行需要 20 分钟。我使用 bash 脚本执行此操作,该脚本按顺序运行求解器三次。与此同时,我开始实验这也需要修改代码。我开始修改代码,它可以打破实验(例如,在运行 1 和运行 2 之间)。
你如何处理这种情况?为每个实验分叉求解器代码并将其保存在实验子文件夹下会更好吗?
2016-09-28 更新:根据我得到的答案和评论,似乎问题写得不够清楚,尤其是标题。
我的问题是关于如何基于模拟代码进行实验,其中代码必须与项目的进展同时发展。实际上,通常,代码从一开始就承认一些通用性(例如,所有问题参数都可以指定为命令行参数,以及一些求解器参数)。然而,在一系列实验之后,代码很可能需要进一步的泛化,例如,一个有限差分近似应该被另一个替换。在这种情况下,正如下面许多人指出的那样,最好的解决方案是向求解器添加一个选项,该选项在运行时选择所需的近似值。
因此,最好对其进行版本控制,并为每个实验隔离一份代码副本。这就是我的问题所在:如何处理每个实验的多个代码副本?
如果您不使用任何版本控制系统,您可以将代码复制到每个实验的子目录中,然后手动将任何修改合并到代码的“黄金”副本(这是我以前的方法)。
如果您使用版本控制系统 Git,您可以制作存储库的多个克隆以具有独立的副本。然而,由于 Git 2.5+ 提供了一个拥有多个存储库工作副本的功能,我在下面写的答案提出了更优雅的方法。