docs: def is_satisfied(self, x_cat):
          """
          :param x_cat: a 2D array of pure categorical data of shape [n_data, n_features]
          :return: a bool array of shape [n_data,] representing whether the rule is fired by each input data.
          """
          satisfied = []
          if self.is_default():
              return np.ones(x_cat.shape[0], dtype=bool)
          for idx, cat in self.clauses:
              satisfied.append(x_cat[:, idx] == cat)
          return reduce(np.logical_and, satisfied)