- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
降低实现科学计算算法的风险
录入:edatop.com 点击:
为了优化钻井流程并降低作业成本,Baker Hughes的动力学与遥测(Dynamics & Telemetry)小组开发了一个序列预测算法,用于在钻井作业期间快速可靠的解码井下数据。这个已集成到公司地面系统的高级解码算法为随钻测量(measurement while drilling,MWD)方法提供了支持。使用MWD时,可以收集宝贵的方位数据和地层数据,以用来优化钻井流程。该系统支持更准确地定位井眼,这可以使钻井作业更具成本效益,并使操作员可以较少的非生产时间(NPT)钻更复杂的井。
工程团队使用一种桌面科学计算软件设计序列预测算法,将其自动转换为C代码,然后部署到属于地面系统一部分的一台实时PC上。在科学计算软件中开发和调试该算法后,工程师通过自动生成所需的C代码来加速实现过程。
此工作流程不再需要用两种语言维护和测试同一个算法,因此缩短了开发流程。更重要的是,此工作流程降低了用手工编写C代码的一种主要风险,即原始科学计算算法和最终设计中实现的C代码之间的差异。使用此工作流程的一大优势是小组在修复缺陷上所花的时间减少了。质量和开发速度的提升使小组坚定了在未来的项目中重用算法和开发流程的打算。
使用马尔可夫链(Markov Chains)进行序列预测
序列预测的一个常见应用是使用以前的数据来预估未来的数据点。序列预测算法在许多行业和许多情形中都会用到,例如基于测量数据的温度曲线外推,或者在与最大似然序列估算器进行数字通信时,从噪声信号中提取有用的信息。序列预测需要一个模型来预测未来数据,如马尔可夫链。使用马尔可夫链建模的系统占用有限的状态数,从而使未来的数据点仅取决于目前的状态而不是以前的状态。
图1.使用马尔可夫链建模的序列预报器
在图1中,使用马尔可夫链建模的序列预报器具有4个状态。从一个状态转换到另一个状态的可能性用小数表示。例如,从状态1转换为状态2的概率为0.95,而保持在状态1的概率为0.05。在转换时,可能会有一个或多个路径。图1中显示的序列预报器可作为有限的状态机来实现,它的最形象的表达就是格状图。
图2.格状图示例
图2显示的是一个可能的(预测的)状态序列。虚线箭头表示可能的转换,实线箭头表示实际预测的转换。此图显示可能的序列为[1 2 3 4 4 3 3 1]。请注意,仅显示部分可能的转换来进行说明。与著名的Viterbi算法类似,序列预报器通过基于外部质量标准计算路径度量来拒绝不大可能的序列路径。如果两个或多个路径在一个状态中相交,则累积并比较它们的路径度量值,将最佳路径选为幸存路径。
工程团队在技术计算软件中为序列预测实现马尔可夫链,以提高其地面解码软件的可靠性。 [p]
算法开发工作流程
在传统的手工编码工作流程中,会用C代码重写原始科学计算算法和测试框架,并且必须对C代码进行测试和调试。在新的工作流程中,C代码会从技术计算软件中自动生成,从而节约了时间并可防止编码错误(图3)。
图3.传统的手工编码工作流程(左)和新的自动代码生成工作流程(右)
在一个典型的情景中,自动代码生成工作流程可将开发和测试最终产品中实现的算法的总时间缩短近40%(图4)。
图4.各个流程阶段花费时间百分比
对于这个特定的项目,新的工作流程的开始是工程团队在科学计算软件中快速探索新创意。在确定最佳方法后,他们使用同一款软件来建立一个通用序列估算算法的原型。然后进一步扩展该算法,以用于MWD系统的地面PC上。在进行到下一个阶段之前,工程部门使用已纳入同一软件中的测试框架内的多种测试案例来测试算法,以验证它是否符合要求和规范。
通过自动代码生成来实现
传统手工编码流程的许多缺点迫使工程团队去寻找一种替代流程来开发序列预测算法。首先,手工编码非常耗时,并且在紧张的截止日期临近时,为了留出时间给重要而又耗时的集成测试,团队需要将开发时间缩短大约30%。其次,程序员可能会在原始科学计算算法细节上出现解读错误,从而将缺陷引入手写的C代码,造成需要额外的时间来进行调试和修复。
在新的工作流程中,通过自动代码生成可以消除这些缺点。在科学计算软件中,工程师们的工作侧重于在较高层次上开发和微调算法,不用过多地困在较低层次的实现细节上。然后,该团队只需一键点击就可以从原始设计自动生成C代码。由于该流程是自动执行的,因此在将算法转换为C代码时不会出现解析错误的情况。为了生成代码,需要花些时间来微调原始科学计算算法,但这属于一次性任务,如果在开发设计的开始阶段就考虑到代码生成,则可以进一步简化这项任务。
维护和测试算法
在传统的工作流程中,在开发后期对需求进行更改会影响原始设计及其实现。对算法的更新必须反映在C代码中,使用两种语言和环境维护并测试同一个算法及测试框架的成本会迅速成为阻碍因素。在开发周期的后期发现缺陷时,开发人员需要更新该算法的原始科学计算代码和C代码版本两者,还需要创建两套测试方案来验证缺陷是否已经解决。当然,还存在两个代码库产生差异的风险。时间限制经常会促使团队仅更新C代码。出现这种情况时,团队会再次受困于用C代码手工编码的所有缺陷,直到两个代码库一致。
使用自动代码生成,工程团队则可避免这些潜在的错误。当需求发生变化时,工程师只需要更新原始科学计算代码,然后重新生成C代码,将新变化反映到实现中。具体来说,团队无需对生成的C代码进行任何更改,因为在重新生成代码时这些更改会被覆盖。此外,工程团队也不再需要开发第二个测试框架,因此节约了额外的时间。用于测试科学计算代码的原始测试框架可以重用来测试C代码。
将算法集成到地面系统
C代码单元测试一结束,团队便将C代码编译到一个动态链接库(DLL)。然后,将DLL集成到地面解码软件。最后,小组在公司的基于C代码的测试基础架构中执行整个地面解码算法的系统测试。
在测试期间如果发现缺陷,小组发现很容易查明错误的源头。由于工程师将序列预测算法隔离到一个DLL中,因此很容易确定缺陷是集成问题的结果还是算法本身所导致。此外,C代码会映射回原始科学计算代码,并为您提供了在C代码中嵌入技术计算代码作为备注的选项,进一步加强了原始科学计算算法与最终实现之间的可追溯性。
结果
● 缺陷数量减少:该项目计划分配了三周时间来修复十个缺陷,而在生成的C代码中仅找到四个缺陷。因此,团队能够将多出的时间分配给项目的其他环节,例如整个地面系统的系统测试。
● 修复缺陷所需的时间缩短:由于整个功能测试框架在科学计算软件中可用,因此与传统的手工编码相比,团队能够更快地找到缺陷并予以解决。科学计算软件中提供的分析和调试工具加速了此流程。这些工具中有许多也用于测试和调试C代码。
● 代码和流程可以在未来的项目中重用:序列预测算法可以在未来的项目中重用。该算法可以以现有的形式随时现用,也可以在通过代码生成采用C代码重新实现之前,在科学计算软件中进行快速更新以用于其他应用情形。
结论
通过使用自动代码生成,工程师成功采用了一种新的工作流程。这种流程可以避免耗时且容易出问题的手工编码。地面解码软件(包括序列预测算法)接近最终版。在项目上实现的时间和成本节约使公司可以探索更多的机会,将自动代码生成工作流程应用到广泛的未来项目中。
工程团队使用一种桌面科学计算软件设计序列预测算法,将其自动转换为C代码,然后部署到属于地面系统一部分的一台实时PC上。在科学计算软件中开发和调试该算法后,工程师通过自动生成所需的C代码来加速实现过程。
此工作流程不再需要用两种语言维护和测试同一个算法,因此缩短了开发流程。更重要的是,此工作流程降低了用手工编写C代码的一种主要风险,即原始科学计算算法和最终设计中实现的C代码之间的差异。使用此工作流程的一大优势是小组在修复缺陷上所花的时间减少了。质量和开发速度的提升使小组坚定了在未来的项目中重用算法和开发流程的打算。
使用马尔可夫链(Markov Chains)进行序列预测
序列预测的一个常见应用是使用以前的数据来预估未来的数据点。序列预测算法在许多行业和许多情形中都会用到,例如基于测量数据的温度曲线外推,或者在与最大似然序列估算器进行数字通信时,从噪声信号中提取有用的信息。序列预测需要一个模型来预测未来数据,如马尔可夫链。使用马尔可夫链建模的系统占用有限的状态数,从而使未来的数据点仅取决于目前的状态而不是以前的状态。
图1.使用马尔可夫链建模的序列预报器
在图1中,使用马尔可夫链建模的序列预报器具有4个状态。从一个状态转换到另一个状态的可能性用小数表示。例如,从状态1转换为状态2的概率为0.95,而保持在状态1的概率为0.05。在转换时,可能会有一个或多个路径。图1中显示的序列预报器可作为有限的状态机来实现,它的最形象的表达就是格状图。
图2.格状图示例
图2显示的是一个可能的(预测的)状态序列。虚线箭头表示可能的转换,实线箭头表示实际预测的转换。此图显示可能的序列为[1 2 3 4 4 3 3 1]。请注意,仅显示部分可能的转换来进行说明。与著名的Viterbi算法类似,序列预报器通过基于外部质量标准计算路径度量来拒绝不大可能的序列路径。如果两个或多个路径在一个状态中相交,则累积并比较它们的路径度量值,将最佳路径选为幸存路径。
工程团队在技术计算软件中为序列预测实现马尔可夫链,以提高其地面解码软件的可靠性。 [p]
算法开发工作流程
在传统的手工编码工作流程中,会用C代码重写原始科学计算算法和测试框架,并且必须对C代码进行测试和调试。在新的工作流程中,C代码会从技术计算软件中自动生成,从而节约了时间并可防止编码错误(图3)。
图3.传统的手工编码工作流程(左)和新的自动代码生成工作流程(右)
在一个典型的情景中,自动代码生成工作流程可将开发和测试最终产品中实现的算法的总时间缩短近40%(图4)。
图4.各个流程阶段花费时间百分比
对于这个特定的项目,新的工作流程的开始是工程团队在科学计算软件中快速探索新创意。在确定最佳方法后,他们使用同一款软件来建立一个通用序列估算算法的原型。然后进一步扩展该算法,以用于MWD系统的地面PC上。在进行到下一个阶段之前,工程部门使用已纳入同一软件中的测试框架内的多种测试案例来测试算法,以验证它是否符合要求和规范。
通过自动代码生成来实现
传统手工编码流程的许多缺点迫使工程团队去寻找一种替代流程来开发序列预测算法。首先,手工编码非常耗时,并且在紧张的截止日期临近时,为了留出时间给重要而又耗时的集成测试,团队需要将开发时间缩短大约30%。其次,程序员可能会在原始科学计算算法细节上出现解读错误,从而将缺陷引入手写的C代码,造成需要额外的时间来进行调试和修复。
在新的工作流程中,通过自动代码生成可以消除这些缺点。在科学计算软件中,工程师们的工作侧重于在较高层次上开发和微调算法,不用过多地困在较低层次的实现细节上。然后,该团队只需一键点击就可以从原始设计自动生成C代码。由于该流程是自动执行的,因此在将算法转换为C代码时不会出现解析错误的情况。为了生成代码,需要花些时间来微调原始科学计算算法,但这属于一次性任务,如果在开发设计的开始阶段就考虑到代码生成,则可以进一步简化这项任务。
维护和测试算法
在传统的工作流程中,在开发后期对需求进行更改会影响原始设计及其实现。对算法的更新必须反映在C代码中,使用两种语言和环境维护并测试同一个算法及测试框架的成本会迅速成为阻碍因素。在开发周期的后期发现缺陷时,开发人员需要更新该算法的原始科学计算代码和C代码版本两者,还需要创建两套测试方案来验证缺陷是否已经解决。当然,还存在两个代码库产生差异的风险。时间限制经常会促使团队仅更新C代码。出现这种情况时,团队会再次受困于用C代码手工编码的所有缺陷,直到两个代码库一致。
使用自动代码生成,工程团队则可避免这些潜在的错误。当需求发生变化时,工程师只需要更新原始科学计算代码,然后重新生成C代码,将新变化反映到实现中。具体来说,团队无需对生成的C代码进行任何更改,因为在重新生成代码时这些更改会被覆盖。此外,工程团队也不再需要开发第二个测试框架,因此节约了额外的时间。用于测试科学计算代码的原始测试框架可以重用来测试C代码。
将算法集成到地面系统
C代码单元测试一结束,团队便将C代码编译到一个动态链接库(DLL)。然后,将DLL集成到地面解码软件。最后,小组在公司的基于C代码的测试基础架构中执行整个地面解码算法的系统测试。
在测试期间如果发现缺陷,小组发现很容易查明错误的源头。由于工程师将序列预测算法隔离到一个DLL中,因此很容易确定缺陷是集成问题的结果还是算法本身所导致。此外,C代码会映射回原始科学计算代码,并为您提供了在C代码中嵌入技术计算代码作为备注的选项,进一步加强了原始科学计算算法与最终实现之间的可追溯性。
结果
● 缺陷数量减少:该项目计划分配了三周时间来修复十个缺陷,而在生成的C代码中仅找到四个缺陷。因此,团队能够将多出的时间分配给项目的其他环节,例如整个地面系统的系统测试。
● 修复缺陷所需的时间缩短:由于整个功能测试框架在科学计算软件中可用,因此与传统的手工编码相比,团队能够更快地找到缺陷并予以解决。科学计算软件中提供的分析和调试工具加速了此流程。这些工具中有许多也用于测试和调试C代码。
● 代码和流程可以在未来的项目中重用:序列预测算法可以在未来的项目中重用。该算法可以以现有的形式随时现用,也可以在通过代码生成采用C代码重新实现之前,在科学计算软件中进行快速更新以用于其他应用情形。
结论
通过使用自动代码生成,工程师成功采用了一种新的工作流程。这种流程可以避免耗时且容易出问题的手工编码。地面解码软件(包括序列预测算法)接近最终版。在项目上实现的时间和成本节约使公司可以探索更多的机会,将自动代码生成工作流程应用到广泛的未来项目中。
上一篇:电流互感器测量极性常用方法
下一篇:分析仪器的日常维护和测试