8 #ifndef IMPISD_MULTIVARIATE_FNORMAL_SUFFICIENT_H
9 #define IMPISD_MULTIVARIATE_FNORMAL_SUFFICIENT_H
11 #include <IMP/isd/isd_config.h>
12 #include "internal/timer.h"
18 #include <Eigen/Dense>
19 #include <Eigen/Cholesky>
20 #include <IMP/isd/internal/cg_eigen.h>
22 IMPISD_BEGIN_NAMESPACE
25 #define IMP_MVN_TIMER_NFUNCS 11
89 Eigen::VectorXd FM_, Fbar_, epsilon_, Peps_;
90 double JF_, lJF_, norm_, lnorm_;
91 Eigen::MatrixXd P_, W_, Sigma_, FX_, PW_;
95 Eigen::LDLT<Eigen::MatrixXd, Eigen::Upper> ldlt_;
97 bool flag_FM_, flag_FX_, flag_Fbar_, flag_W_, flag_Sigma_, flag_epsilon_,
98 flag_PW_, flag_P_, flag_ldlt_, flag_norms_, flag_Peps_;
100 Eigen::MatrixXd precond_;
101 bool use_cg_, first_PW_, first_PWP_;
106 internal::CallTimer<IMP_MVN_TIMER_NFUNCS> timer_;
118 const Eigen::VectorXd& FM,
119 const Eigen::MatrixXd& Sigma,
133 const Eigen::VectorXd& FM,
int Nobs,
134 const Eigen::MatrixXd& W,
135 const Eigen::MatrixXd& Sigma,
139 double density()
const;
142 double evaluate()
const;
145 Eigen::VectorXd evaluate_derivative_FM()
const;
148 Eigen::MatrixXd evaluate_derivative_Sigma()
const;
151 double evaluate_derivative_factor()
const;
154 Eigen::MatrixXd evaluate_second_derivative_FM_FM()
const;
159 Eigen::MatrixXd evaluate_second_derivative_FM_Sigma(
unsigned l)
const;
162 Eigen::MatrixXd evaluate_second_derivative_Sigma_Sigma(
unsigned k,
166 void set_FX(
const Eigen::MatrixXd& f);
167 Eigen::MatrixXd get_FX()
const;
169 void set_Fbar(
const Eigen::VectorXd& f);
170 Eigen::VectorXd get_Fbar()
const;
172 Eigen::VectorXd get_epsilon()
const;
174 void set_jacobian(
double f);
175 double get_jacobian()
const;
176 void set_minus_log_jacobian(
double f);
177 double get_minus_log_jacobian()
const;
179 void set_FM(
const Eigen::VectorXd& f);
180 Eigen::VectorXd get_FM()
const;
182 void set_W(
const Eigen::MatrixXd& f);
183 Eigen::MatrixXd get_W()
const;
185 void set_Sigma(
const Eigen::MatrixXd& f);
186 Eigen::MatrixXd get_Sigma()
const;
188 void set_factor(
double f);
189 double get_factor()
const;
195 void set_use_cg(
bool use,
double tol);
198 Eigen::VectorXd get_Sigma_eigenvalues()
const;
201 double get_Sigma_condition_number()
const;
204 Eigen::MatrixXd solve(Eigen::MatrixXd B)
const;
207 double get_mean_square_residuals()
const;
213 double get_minus_exponent()
const;
219 double get_minus_log_normalization()
const;
222 double get_log_generalized_variance()
const;
232 Eigen::MatrixXd get_P()
const;
233 void set_P(
const Eigen::MatrixXd& P);
236 Eigen::MatrixXd get_PW()
const;
237 Eigen::MatrixXd compute_PW_direct()
const;
238 Eigen::MatrixXd compute_PW_cg()
const;
239 void set_PW(
const Eigen::MatrixXd& PW);
242 Eigen::VectorXd get_Peps()
const;
243 void set_Peps(
const Eigen::VectorXd& Peps);
246 void set_epsilon(
const Eigen::VectorXd& eps);
250 Eigen::LDLT<Eigen::MatrixXd, Eigen::Upper> get_ldlt()
const;
252 const Eigen::LDLT<Eigen::MatrixXd, Eigen::Upper>& ldlt);
255 void set_norms(
double norm,
double lnorm);
256 std::vector<double> get_norms()
const;
259 double trace_WP()
const;
262 Eigen::MatrixXd compute_PTP()
const;
265 Eigen::MatrixXd compute_PWP()
const;
268 void compute_epsilon();
Helper functions to check for NaN or infinity.
MultivariateFNormalSufficient.
Various useful constants.
#define IMP_OBJECT_METHODS(Name)
Define the basic things needed by any Object.
Storage of a model, its restraints, constraints and particles.
Various general useful macros for IMP.
Common base class for heavy weight IMP objects.
A shared base class to help in debugging and things.