code: def truncated_normal_ll_gradient(params, low, high, data):
          
          if params[1] == 0:
              return np.array([np.inf, np.inf])
  
          return np.array([_TruncatedNormalFitter.partial_derivative_mu(params[0], params[1], low, high, data),
                           _TruncatedNormalFitter.partial_derivative_sigma(params[0], params[1], low, high, data)])
docs: Return the gradient of the log likelihood of the truncated normal at the given position.
  
          Args:
              params: tuple with (mean, std), the parameters under which we evaluate the model
              low (float): the lower truncation bound
              high (float): the upper truncation bound
              data (ndarray): the one dimension list of data points for which we want to calculate the likelihood
  
          Returns:
              tuple: the gradient of the log likelihood given as a tuple with (mean, std)