我正在从事一个c++数据分析项目。我的工作流程是这样的
第一步有很多机器学习参数,我用它测试算法的微小变化。在步骤2中,我清理代码中未使用的部分(非最优参数),优化延迟代码(例如,将映射更改为数组),并部署代码。这些修改是直接在步骤1's代码上进行的。在维护中没有单独的分支机构。
当获得新的数据并且需要重复步骤1时,我就失去了测试算法微小变化的能力。解决这一问题的一种方法是维护两个分支。一个是实验分支,它包含所有的参数,用于算法的微小变化。另一个分支是延迟优化代码。但是,这里的问题是实验分支中的任何小变化都需要在延迟优化分支中重复,因为两个分支不能合并。实验分支和延迟优化分支之间存在着巨大的差异(甚至出现新的文件),阻碍了直接合并。
还有别的办法解决这个问题吗?
EDIT1:步骤2的另一个例子
为了举例说明,让我们假设步骤1将我引向一个预测器y= f(x) =5_x(x^3+5_x+x^3+ <= +<=),其中接地板( z) =(整数最近但<=z的值)。X在0,100中。进行预测(部署中)的基本方法是计算f(x)。但是,观察到整个函数在输出和增长上是离散的。因此,另一种预测方法是存储x的范围,其中映射到y= 1,2,.,并对其进行二进制搜索。这将导致用条目{(lbx_1,y_1),(lbx_2,y_2),.}来维护一个向量,其中y_i = i,lbx_i给出x的最小值,使得f(x) >= y_i。在这种情况下,对于任何输入,一个简单的二进制搜索将获得预测的速度要快得多。(在实践中,f(x)比上述函数复杂得多)。
延迟优化分支将有此预测映射。实验分支将对其功能进行评价。但我也需要实验的通用评估器,以防我的预测结果是y= f (x ) =(x-1)^2。
发布于 2021-03-24 16:03:25
我不会为此滥用像git这样的版本控制系统。
对于这里描述的复杂优化(只能手动完成),最好将两个版本的函数并行保存在相同的代码库中。无论是非优化版本还是优化版本,都应该放在彼此靠近的地方。在C++中,可以通过使用预处理器或运行时机制在两个版本之间进行切换。(模板元编程狂热者肯定更喜欢使用部分模板专门化。)
例如
int f_slow(int x) {return floor(x^3 + 3x^2 + 5x);}
int f_fast(int x) {/* 50 lines of optimized code*/}
#ifndef OPTIMIZED
# define f f_slow
#else
# define f f_fast
#endif这样,f_slow就可以作为f_fast的一种更易读的版本,作为文档。您还应该将其用于自动化测试,为一系列测试值断言f_slow(x) == f_fast(x),因此确保您的优化不会引入一些意外的bug。
当然,这并不需要您承担维护相同功能的两个版本的负担。但我认为这或多或少是不可避免的,因为编写优化器似乎不太适合这项任务。
在这种情况下,最有效的行动可能是在明确界定的阶段内应用一些自我评价和工作:
f_slow存在,并且您正在快速地修改它,直到它适合您的需要。f_slow保持不变的阶段,f_fast将被创建,包括测试当谈到要用f(x)的新版本进行实验时,给它取另一个名称(比如f_slow_v2),保持f_slow的原样,这样就可以使用f_fast作为f_fast_v2的蓝图。稍后,当您确定不再需要f_slow或f_fast时,您可以同时将它们从代码中删除。
https://softwareengineering.stackexchange.com/questions/423749
复制相似问题