def METHOD_NAME(self, X: tf.Tensor) -> tf.Tensor:
    cs(X, "[batch..., N, 1]  # The `ChangePoints` kernel requires a 1D input space.")
    batch = tf.shape(X)[:-2]
    N = tf.shape(X)[-2]
    Ncp = tf.shape(self.locations)[0]
    sig_X = cs(
        tf.reshape(self._sigmoids(X), tf.concat([batch, [N, Ncp]], 0)), "[batch..., N, Ncp]"
    )
    ones = tf.ones(tf.concat([batch, [N, 1]], 0), dtype=X.dtype)
    starters = cs(tf.concat([ones, sig_X * sig_X], axis=-1), "[batch..., N, Nkern]")
    stoppers = cs(tf.concat([(1 - sig_X) * (1 - sig_X), ones], axis=-1), "[batch..., N, Nkern]")
    kernel_stack = cs(
        tf.stack([k(X, full_cov=False) for k in self.kernels], axis=-1), "[batch..., N, Nkern]"
    )
    return tf.reduce_sum(kernel_stack * starters * stoppers, axis=-1)