def clamp(x, xmin, xmax): """Constrain a value to lie between two further values, element-wise. The returned value is computed as `min(max(x, xmin), xmax)`. The arguments can be scalars or :class:`~taichi.Matrix`, as long as they can be broadcasted to a common shape. Args: x (:mod:`~taichi.types.primitive_types`, :class:`~taichi.Matrix`): Specify the value to constrain. y (:mod:`~taichi.types.primitive_types`, :class:`~taichi.Matrix`): Specify the lower end of the range into which to constrain `x`. a (:mod:`~taichi.types.primitive_types`, :class:`~taichi.Matrix`): Specify the upper end of the range into which to constrain `x`. Returns: The value of `x` constrained to the range `xmin` to `xmax`. Example:: >>> v = ti.Vector([0, 0.5, 1.0, 1.5]) >>> ti.clamp(v, 0.5, 1.0) [0.5, 0.5, 1.0, 1.0] >>> x = ti.Matrix([[0, 1], [-2, 2]], ti.f32) >>> y = ti.Matrix([[1, 2], [1, 2]], ti.f32) >>> ti.clamp(x, 0.5, y) [[0.5, 1.0], [0.5, 2.0]] """ return min(xmax, max(xmin, x))
def sort_stage(keys: template(), use_values: int, values: template(), N: int, p: int, k: int, invocations: int): for inv in range(invocations): j = k % p + inv * 2 * k for i in range(0, ops.min(k, N - j - k)): a = i + j b = i + j + k if int(a / (p * 2)) == int(b / (p * 2)): key_a = keys[a] key_b = keys[b] if key_a > key_b: keys[a] = key_b keys[b] = key_a if use_values != 0: temp = values[a] values[a] = values[b] values[b] = temp