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; }