2
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出现。

4

2 回答 2

3

complex64 类型太小,溢出。不知何故,假设未能抓住这一点。

是的,这个问题的根本原因是您正在生成64 位有限浮点数,然后将它们转换为 32 位(因为complex64是一对 32 位浮点数)。您可以使用以下width=32参数解决此问题floats()

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

而且您没有得到通常的溢出检查,因为它目前仅针对浮点数和整数实现。我已经打开(编辑:并修复)问题 #1591来检查复杂类型和字符串类型。

于 2018-09-21T00:56:19.710 回答
1

complex64类型太小,溢出。不知何故,假设未能抓住这一点。

现在切换到complex128解决问题。

于 2018-09-19T17:30:21.283 回答