Proposal parameters
        Calculate parameters needed for the proposal. 
    Inputs  :
        state : 
            x  :   
                the present sample, the place to linearize around
            f  : f(x), 
                function value at x
            J  : f'(x), 
                the jacobian of the function evaluated at x
    Outputs :
        state :
            mu   : 
                the mean vector
            L    :
                the lower triangular cholesky factor of P 
            log_p : log(p(x))
                log of the posterior density

def _proposal_params(self, state):
        """
    Proposal parameters
        Calculate parameters needed for the proposal. 
    Inputs  :
        state : 
            x  :   
                the present sample, the place to linearize around
            f  : f(x), 
                function value at x
            J  : f'(x), 
                the jacobian of the function evaluated at x
    Outputs :
        state :
            mu   : 
                the mean vector
            L    :
                the lower triangular cholesky factor of P 
            log_p : log(p(x))
                log of the posterior density
        """
        x  = state['x']
        f  = state['f']
        J  = state['J']
        JJ = np.dot(J.T,J)     

        if self._prior: 
            m  = self._m
            H  = self._H
            Hm = self._Hm
            # LL' = P = H+J'J 
            L  = la.cholesky(H+JJ)   
            # mu = (P^-1)(Hm-J'f+J'Jx)
            mu = la.solve(L.T,la.solve(L,Hm-np.dot(J.T,f)+np.dot(JJ,x))) 
        else: 
            # P = J'J
            L = la.cholesky(JJ)
            # mu = x-(P^-1)J'f
            mu = x-la.solve(L.T,la.solve(L,np.dot(J.T,f)))

        state['L'] = L        
        state['mu'] = mu
        state['log_p'] = self._log_post(x,f)
        return state