基于属性的测试和浮动平等

时间:2019-04-20 14:40:32

标签: python python-hypothesis

因此,我将trying to compare two implementationsHypothesis一起使用,以确定它们是否可以对我可能不会想到的各种不同输入以相同的方式工作。

我尝试使用numpy.testing.assert_allclose来比较输出,但是假设反复地超过了它。我将可接受的公差扩展得越多,即使输出相似到足以被视为相同,假说也会对其施加更大的值,直到失败为止。

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)

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

1 个答案:

答案 0 :(得分:1)

在我看来,rfft在极端情况下确实给出了非常不同的结果-因此,您需要确定这是否是错误。也许假设实际上表明这不是合适的优化方法!

换一种说法,为给定的输入幅度确定合适的容错性实际上是测试中最困难的部分! (在文献中,这是如何区分善与恶行为的“ oracle问题”

一旦有了界限-对rtol=0.1, atol=0.001中所有元素都为[-1000., 1000.]的数组,可以将elements参数传递给arrays策略以约束这些值每次测试,或尝试一系列幅度/公差组合。