Гипотеза стратегии генерирования инф, когда конкретно просят не

1
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.

Теги:
numpy
python-hypothesis

2 ответа

1
Лучший ответ

Тип complex64 слишком мал и переполнен. Как-то Гипотеза не понимает этого.

Да, основной причиной этой проблемы является то, что вы генерируете 64-битные конечные поплавки, а затем отбрасываете их до 32-битных (поскольку complex64 представляет собой пару 32-битных поплавков). Вы можете исправить это с помощью аргумента width=32 для floats():

floats_notnull_32 = partial(hs.floats, allow_nan=False, allow_infinity=False, width=32)

И вы не получаете обычную проверку переполнения, потому что она только реализована для float и целых чисел на данный момент. Я открыл номер # 1591 для проверки сложных и строковых типов.

0

Тип complex64 слишком мал и переполнен. Как-то Гипотеза не понимает этого.

Переключение на complex128 зафиксировало проблему на данный момент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню