code: def fgrad_X(self, X):
          
          grad = np.zeros(X.shape)
          for i_seq, i_fea in enumerate(self.warping_indices):
              a, b = self.params[i_seq][0], self.params[i_seq][1]
              grad[:, i_fea] = a * b * np.power(self.X_normalized[:, i_fea], a-1) *  \
                               np.power(1 - np.power(self.X_normalized[:, i_fea], a), b-1) * self.scaling[i_fea]
          return grad
docs: Compute the gradient of warping function with respect to X
  
          Parameters
          ----------
          X : array_like, shape = (n_samples, n_features)
              The location to compute gradient
  
          Returns
          -------
          grad : array_like, shape = (n_samples, n_features)
              The gradient for every location at X
  
          Math
          ----
          grad = a * b * x ^(a-1) * (1 - x^a)^(b-1)