code: def d2logpdf_dlink2(self, link_f, y, Y_metadata=None):
          
          # c = Y_metadata['censored']
          # c = np.zeros((y.shape[0],))
          c = np.zeros_like(link_f)
  
          if Y_metadata is not None and 'censored' in Y_metadata.keys():
              c = Y_metadata['censored']
  
          y_link_f = y/link_f
          y_link_f_r = y_link_f**self.r
  
          #In terms of link_f
          censored = c*(-self.r*y_link_f_r*(y_link_f_r + self.r + 1)/((link_f**2)*(y_link_f_r + 1)**2))
          uncensored = (1-c)*(-self.r*(2*self.r*y_link_f_r + y_link_f**(2*self.r) - 1) / ((link_f**2)*(1+ y_link_f_r)**2))
          hess = censored + uncensored
          return hess
docs: Hessian at y, given link(f), w.r.t link(f)
          i.e. second derivative logpdf at y given link(f_i) and link(f_j)  w.r.t link(f_i) and link(f_j)
          The hessian will be 0 unless i == j
  
          .. math::
  
  
          :param link_f: latent variables link(f)
          :type link_f: Nx1 array
          :param y: data
          :type y: Nx1 array
          :param Y_metadata: includes censoring information in dictionary key 'censored'
          :returns: Diagonal of hessian matrix (second derivative of likelihood evaluated at points f)
          :rtype: Nx1 array
  
          .. Note::
              Will return diagonal of hessian, since every where else it is 0, as the likelihood factorizes over cases
              (the distribution for y_i depends only on link(f_i) not on link(f_(j!=i))