code: def grad_local_log_likelihood(self, x):
          
          # Observation likelihoods
          lmbda = np.exp(np.dot(x, self.C.T) + np.dot(self.inputs, self.D.T))
          return (self.data - lmbda).dot(self.C)
docs: d/dx  y^T Cx + y^T d - exp(Cx+d)
              = y^T C - exp(Cx+d)^T C
              = (y - lmbda)^T C