torch.fx.experimental.symbolic_shapes.constrain_range¶
- torch.fx.experimental.symbolic_shapes.constrain_range(a, *, min, max=None)[源码][源码]¶
应用一个约束,即传入的 SymInt 必须介于 min-max 之间(包含 min 和 max),而 不会 在 SymInt 上引入 guard (这意味着它可以用于 unbacked SymInt)。如果 min/max 为 None,我们假定该维度在该方向上是无界的。重复应用 constrain_range 会对范围进行交集运算。这是一个相当低级的 API,没有很多安全保障 (TODO: 提供更高级的 API)。
目前,我们在以下情况中使用此 API:当我们分配一个 unbacked SymInt 时,它表示一个依赖于数据的整数量,我们通常不知道它可以取什么值。这意味着对其进行的任何 guard 都将立即失败。然而,在许多情况下,我们知道一些关于 unbacked SymInt 的信息:例如,我们知道 nonzero(x).size(0) 必须 >= 0。我们使用 constrain_range 来缩小可能的范围,声明负数符号是不可能的。这使得我们可以确定地回答 'nnz >= 0' 等查询为 True,即使我们不知道 'nnz' 的实际(提示的)值是什么。实际上,我们甚至使用 constrain_range 不健全地解除常见的 guard:对于由 nonzero 产生的 unbacked SymInt,我们还会假定它不等于 0/1 (尽管这些在运行时是完全可能的值),因为我们通常期望对于 N=2 有效的图对于 N=1 也有效。