Тестирование на основе свойств и равенство чисел - PullRequest
0 голосов
/ 20 апреля 2019

Так что я пытаюсь сравнить две реализации функции с Гипотезой , чтобы определить, работают ли они одинаково с огромным количеством различных входных данных, о которых я мог бы и не подумать себя.

Я пытался использовать 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 Ответ

1 голос
/ 24 апреля 2019

Мне кажется, что rfft дает очень разные результаты в крайних случаях - так что вам нужно решить, является ли это ошибкой или нет.Возможно, Гипотеза действительно показала, что это не подходящая оптимизация!

Иными словами, проблема определения подходящей толерантности к ошибкам для данной величины ввода на самом деле является самой сложной частью тестирования!(в литературе это «проблема оракула», заключающаяся в том, как отличить хорошее от плохого поведения)

Если у вас есть ограничение - скажем rtol=0.1, atol=0.001 для всех массивов с элементами в [-1000., 1000.], вы можете передатьelements аргумент стратегии arrays, чтобы ограничить эти значения для каждого теста или попробовать диапазон комбинаций величины / допуска.

...