0

因此,我试图将一个函数的两个实现与假设进行比较,以确定它们是否以相同的方式工作于我自己可能不会想到的大量不同输入。

我尝试使用numpy.testing.assert_allclose来比较输出,但假设只是反复超越它。我越是扩大可接受的容差,Hypothesis 对它抛出的值就越大,直到它失败,即使输出相似到足以被认为是相同的。

E   Not equal to tolerance rtol=0.1, atol=0.001
...
Falsifying example: test_resample_1d_consistency(a=array([7.696582e+12, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00], dtype=float32), num=11)

 

E   Not equal to tolerance rtol=0.1, atol=0.01
...
Falsifying example: test_resample_1d_consistency(a=array([7.366831e+13, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00], dtype=float32), num=11)

 

E   Not equal to tolerance rtol=1000, atol=1000
...
Falsifying example: test_resample_1d_consistency(a=array([8.360933e+18, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00], dtype=float32), num=186)

等等

所以我想我需要一个不同的“足够好”的相似性测试,或者我需要以某种方式限制输入值范围?但我不确定如何以一种不会错过真正错误答案的方式来做到这一点。有什么建议吗?

4

1 回答 1

1

在我看来,rfft在极端情况下确实给出了非常不同的结果 - 所以你需要确定这是否是一个错误。也许假设实际上已经表明它不是一个合适的优化!

换句话说,为给定的输入量确定适当的误差容限实际上是测试中最难的部分!(在文献中,这是如何区分好坏行为的“神谕问题”)

一旦你有一个界限 - 比如说rtol=0.1, atol=0.001对于所有包含元素的数组,[-1000., 1000.]你可以将elements参数传递给arrays策略以限制每个测试的这些值,或者尝试一系列幅度/容差组合。

于 2019-04-24T02:43:58.413 回答