MatrixXd MultivariateFNormalSufficient::evaluate_derivative_Sigma() const
 {
     //d(-log(p))/dSigma = 1/2 (N P - N P epsilon transpose(epsilon) P - PWP)
     LOG( "MVN: evaluate_derivative_Sigma() = " << std::endl);
     MatrixXd R;
     if (N_==1) // O(M) if up to date, O(M^3) if Sigma new
     {
         R = 0.5*(get_P()-compute_PTP()/SQUARE(factor_));
     } else { // O(M^2) if up to date, O(M^3) if Sigma new
         double f2=SQUARE(factor_);
         R = 0.5*(N_*(get_P()-compute_PTP()/f2)-compute_PWP()/f2);
     }
     return R;
 }
 MatrixXd MultivariateFNormalSufficient::evaluate_derivative_Sigma() const
 {
     timer_.start(DSIGMA);
     //d(-log(p))/dSigma = 1/2 (N P - N P epsilon transpose(epsilon) P - PWP)
     IMP_LOG(TERSE, "MVN: evaluate_derivative_Sigma() = " << std::endl);
     MatrixXd R;
     if (N_==1) // O(M) if up to date, O(M^3) if Sigma new
     {
         R = 0.5*(get_P()-compute_PTP()/IMP::square(factor_));
     } else { // O(M^2) if up to date, O(M^3) if Sigma new
         double f2=IMP::square(factor_);
         R = 0.5*(N_*(get_P()-compute_PTP()/f2)-compute_PWP()/f2);
     }
     timer_.stop(DSIGMA);
     return R;
 }
 cholmod_sparse *
 MultivariateFNormalSufficientSparse::evaluate_derivative_Sigma() const
 {
     //d(-log(p))/dSigma = 1/2 (N P - N P epsilon transpose(epsilon) P - P W P)
     IMP_LOG(TERSE, "MVNsparse: evaluate_derivative_Sigma() = " << std::endl);
     cholmod_sparse *ptp(compute_PTP());
     cholmod_sparse *pwp(compute_PWP());
     //std::cout << " ptp " << std::endl << ptp << std::endl << std::endl;
     //std::cout << " pwp " << std::endl << pwp << std::endl << std::endl;
     static double one[2]={1,0};
     static double minusone[2]={-1,0};
     cholmod_sparse *tmp =
         cholmod_add(P_, ptp, one, minusone, true, false, c_);
     double enn[2]={0.5*N_,0};
     static double ptfive[2]={-0.5,0};
     cholmod_sparse *R = cholmod_add(tmp, pwp, enn, ptfive, true, false, c_);
     cholmod_free_sparse(&ptp, c_);
     cholmod_free_sparse(&pwp, c_);
     cholmod_free_sparse(&tmp, c_);
     return R;
 }