from functools import partial
import hypothesis as h
import hypothesis.strategies as hs
import hypothesis.extra.numpy as hnp
import numpy as np
floats_notnull = partial(hs.floats, allow_nan=False, allow_infinity=False)
complex_notnull = partial(hs.complex_numbers, allow_nan=False, allow_infinity=False)
data_strategy_real = hnp.arrays(
np.float64,
hs.tuples(hs.integers(min_value=2, max_value=50),
hs.integers(min_value=2, max_value=5)),
floats_notnull()
)
data_strategy_complex = hnp.arrays(
np.complex64,
hs.tuples(hs.integers(min_value=2, max_value=50), hs.just(1)),
complex_notnull()
)
data_strategy = hs.one_of(data_strategy_real, data_strategy_complex)
Если вы запустите data_strategy.example()
пару раз, вы заметите, что некоторые из значений в результате имеют бесконечные реальные или мнимые части. Мое намерение здесь состояло в том, чтобы специально запретить бесконечные части или части NaN.
Что я делаю неправильно?
Обновление: если я использую
data_strategy = hs.lists(complex_notnull, min_size=2, max_size=50)
и преобразовать это в массив внутри моего теста, проблема, похоже, исчезнет. Переполнены ли комплексные числа? Я не получаю обычного предупреждения об отказе от переполнения из Гипотезы.
И если я использую
data_strategy = data_strategy_real
нет inf
.
Тип complex64 слишком мал и переполнен. Как-то Гипотеза не понимает этого.
Да, основной причиной этой проблемы является то, что вы генерируете 64-битные конечные поплавки, а затем отбрасываете их до 32-битных (поскольку complex64
представляет собой пару 32-битных поплавков). Вы можете исправить это с помощью аргумента width=32
для floats()
:
floats_notnull_32 = partial(hs.floats, allow_nan=False, allow_infinity=False, width=32)
И вы не получаете обычную проверку переполнения, потому что она только реализована для float и целых чисел на данный момент. Я открыл номер # 1591 для проверки сложных и строковых типов.
Тип complex64
слишком мал и переполнен. Как-то Гипотеза не понимает этого.
Переключение на complex128
зафиксировало проблему на данный момент.