Гипотеза стратегии генерирования инф, когда конкретно просят не - PullRequest
0 голосов
/ 19 сентября 2018
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 s.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Тип complex64 слишком мал и переполнен.Каким-то образом гипотеза не может это уловить.

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

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

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

0 голосов
/ 19 сентября 2018

Тип complex64 слишком мал и переполнен.Каким-то образом Гипотеза не может уловить это.

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

...