python-假设如何缩小延迟策略

How does python-hypothesis shrink a deferred strategy

我目前正在为 Matlab 实现 PBB,并且在某种程度上受到假设的影响。

我不明白假设如何处理延期策略的收缩。 在文档中有代码片段

import hypothesis.strategies as st
x = st.deferred(lambda: st.booleans() | st.tuples(x, x))
x.example()
>>> (((False, (True, True)), (False, True)), (True, True))

现在,这个例子很可能会通过减少递归的深度来缩小。但是,hypothesis 是如何知道如何操纵 lambda 来缩小样本的?


DRMacIver 回答后的问题:

缩减延迟策略与缩减任何其他策略的工作原理相同,因为假设中的缩减对基础表示统一起作用,而不需要了解所使用策略的任何信息。

假设不是操纵生成的值,而是修改用于构造它们的选择。您可以将其视为进行一系列抛硬币。例如(True, False) 可能由序列 10100 生成,即 1(选择 | 的第二个分支),然后是 01,然后选择第一个分支生成一个 True00,它选择第一个分支然后生成一个 False。我们可以通过将 10100 替换为 01 来将 (True, False) 减少到 True,或者通过将其替换为 00 来减少到 False,我们可以找到两者原始选择序列的子序列。

如果您想了解更多相关信息,可以阅读有关它的论文(或观看演讲):https://2020.ecoop.org/details/ecoop-2020-papers/13/Test-Case-Reduction-via-Test-Case-Generation-Insights-From-the-Hypothesis-Reducer

Is hypothesis storing which choices belong to which strategy? E.g.: (False,(False,False)) can be constructed as 10010000 (depth first). If we take the subsequence 01 (where the first 0 belongs to the strategy booleans instead to tuples now) we would get the example True, which probably does not count as a shrinked version of the former.

不,Hypothesis 没有任何关于选择“所有权”的特定概念,并且认为 True(False, (False, False)) 的完全有效缩减!毕竟它更小更简单。