Questions tagged «testing»

有关计算方法测试和验证的问题。

14
为科学研究代码编写单元测试是否值得?
我坚信使用验证完整程序的测试(例如收敛测试)的价值,包括一套自动化的回归测试。在阅读了一些编程书籍之后,我也感到I,我“应该”编写单元测试(即,用于验证单个函数正确性并且不等于运行整个代码来解决问题的测试)。 。但是,单元测试似乎并不总是与科学规范相适应,并且最终会感到虚假或浪费时间。 我们应该为研究代码编写单元测试吗?

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。


5
数值结果数据库
在数值方法文献中,许多研究论文包括对新算法变异的描述,然后是将新方法与一种或两种现有方法进行比较的一些测试问题。这使得很难确定 新方法将如何处理其他感兴趣的问题 新方法与其他现有方法的比较 当然,这两个问题对于决定是否采用新方法的人通常都是至关重要的。为了改善这种情况,似乎希望尽可能使人们用他们的方法运行大量测试问题(请参阅此问题),并将结果分类在数据库中,以便与其他方法进行比较。然后,科学家或工程师可以查询数据库,也许表明哪些解决方案/问题特征对其最重要(准确性,效率,定性性质等),并可以对数据库中所有方法的性能进行定量比较。 我意识到实现此想法有很多困难(主要是:让人们实际解决所有这些问题,并衡量计算成本)。但是我的问题是:是否存在这样的结果数据库?(例如在某些特定的子字段中)还是在任何地方都采用了这种方法? 到目前为止发布的两个答案都与问题数据库有关。我在问结果数据库。
17 pde  testing 


3
单元测试和测试驱动开发的策略
我是科学计算中测试驱动开发的坚定拥护者。实际上,它的实用性令人just舌,并且确实减轻了代码开发人员所知道的经典麻烦。但是,测试普通编程中未遇到的科学代码存在固有的困难,因此TDD文本作为教程并不是很有用。例如: 通常,对于先验的给定复杂问题,您不知道确切的答案,那么如何编写测试? 并行度改变;我最近遇到了一个错误,该错误将MPI任务作为3的倍数使用会失败,但是2的倍数有效。此外,由于MPI的本质,常见的测试框架似乎对MPI不太友好-您必须重新执行测试二进制文件以更改任务数。 科学法规通常包含许多紧密耦合,相互依存和可互换的部分。我们都已经看过遗留代码,并且我们知道放弃良好的设计并使用全局变量是多么诱人。 通常,数值方法可能是一种“实验”,或者编码人员无法完全理解它的工作原理并试图理解它,因此无法预期结果。 我为科学代码编写的一些测试示例: 对于时间积分器,请使用具有精确解决方案的简单ODE,并测试您的积分器是否在给定的精度范围内将其求解,并且通过使用不同步长进行测试来确定精度顺序是否正确。 零稳定性测试:检查边界/初始条件为0的方法是否保持为0。 插值测试:给定线性函数,请确保插值正确。 旧版验证:在已知正确的旧版应用程序中隔离大量代码,并提取一些离散值用于测试。 除了人工试验和错误之外,我常常想出如何无法正确测试给定的代码块。您能否提供一些为数字代码编写的测试示例和/或测试科学软件的一般策略?
16 testing 

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似乎在其示例程序中使用基于规范的比较,但进行比较时,它不使用单元测试框架(也不必这样做)。

4
用于C ++数值应用程序的测试套件?
最近,我一直在推动我的小组在编写他们的代码时包括更多的测试。有几个主要的错误所花的时间比可能需要花费的时间长得多,因为我们没有适当的测试机制。 但是,我怀疑拥有适当的工具来自动化(或帮助简化)流程肯定会有用。另一方面,我不知道C ++测试套件的各种选项,以及如何在它们之间进行选择? 是否有寻找内容的指南?是否有专门针对数值应用的指南?
13 testing 

1
是否有用于数字软件开发的测试框架
我发现我的许多计算科学编程都具有标准测试框架未涵盖的测试要求: 计算时间测试 为了确保算法不会变慢。我可以做一些类似的事情, assureSmallerEqual(RuntimeWrapper(algorithm),53)但是我希望在我从事算法工作时可以不断降低53秒的阈值,例如assureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance') 性能测试 为了确保以前找到与解析解近似良好的算法,仍然可以找到至少与之相当或更好的解。同样,这可以通过标准集成测试来模拟,但是我希望随着算法变得越来越好,公差会不断缩小。考虑替换assureAlmostEqual(foo(),1,places=3)为assureAlmostEqual(foo(),1,places='previousbest') 物理需求测试 为了确保算法不会突然需要更多的内存/硬盘空间。与1.非常相似。 抽象需求测试 要确保对二次逼近很好的算法不会突然需要三次逼近,或者对时间步长为0.1很好的算法不会突然需要0.01的稳定性。同样,这些可以通过标准集成测试来模拟,但是目标是记住达到某个目标的最小需求参数,因此这将需要大量的手动更新。例如,如果foo(10)以前没有例外,我希望该框架确保foo(10)仍然有效,并尝试foo(9)现在是否有效(在这种情况下,所有将来的测试都将确保foo(9)仍然有效)。 有人可能会争辩说,我所要求的并不是从单元/集成测试的角度描述测试,因为例如可以增加运行时间来换取其他改进,这是可以接受的。 但是实际上,我知道如果我具有上述测试功能,那将节省很多调试时间,因为在95%的情况下,由于引入的错误导致要求和性能出现了问题。确实,我知道这样一个事实,即如果严格地应用了上述测试,可以避免使用外部数值软件库发现的许多错误(经过大量时间检查自己的代码)。 聚苯乙烯 命名类似的问题/programming/34982863/framework-for-regression-testing-of-numerical-code并非重复,因为它描述了使用标准回归测试框架更容易实现的功能。 问题“ 用于单元测试和测试驱动的开发的策略”要求使用策略,而不是帮助实现这些策略的框架(答案中所要求/提供的策略与我在此描述的内容不同)。
10 testing 

3
混沌数值模型的回归检验
当我们有一个代表真实物理系统并表现出混乱的数值模型(例如,流体动力学模型,气候模型)时,我们如何知道该模型的运行状况如何?我们不能直接比较两组模型的输出,因为即使是初始条件的微小变化也会极大地改变单个模拟的输出。我们不能将模型输出直接与观测值进行比较,因为我们永远无法足够详细地了解观测值的初始条件,而数值逼近总会引起微小差异,并会在系统中传播。 这个问题在某种程度上受到David Ketcheson 关于单元测试科学代码的问题的启发:我对如何实现此类模型的回归测试特别感兴趣。如果较小的初始条件变化会导致主要的输出变化(这仍然可能是现实的充分表示),那么我们如何才能将这些变化与因修改参数或实施新的数值例程而引起的变化区分开来?
10 testing  numerics 
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.