26 std::vector<std::vector<double>> u = this->copula_->sample_u(n);
27 std::vector<std::vector<double>> x (n, std::vector<double>(u[0].size(), 0.0));
29 for (
size_t i = 0; i < marginals_.size(); i++) {
30 for (
size_t j = 0; j < n; j++) {
31 x[j][i] = marginals_.at(i)->ppf(u[j][i]);
50 if (x.size() != marginals_.size())
51 throw std::invalid_argument(
"Wrong size of random vector.");
53 std::vector<double> u = std::vector<double>(x.size(), 0.0);
54 double log_marg {0.0};
56 for (
size_t i = 0; i < marginals_.size(); i++) {
57 u[i] = std::clamp(marginals_[i]->cdf(x[i]), kUClip, 1.0 - kUClip);
58 log_marg += marginals_[i]->logpdf(x[i]);
61 return log_marg + copula_->log_density(u);
65 if (x.size() != marginals_.size()) {
66 throw std::invalid_argument(
"Wrong size of random vector.");
69 const std::size_t d = x.size();
71 std::vector<double> u(d, 0.0);
78 for (std::size_t i = 0; i < d; ++i) {
79 const double raw_u = marginals_[i]->cdf(x[i]);
80 u[i] = std::clamp(raw_u, kUClip, 1.0 - kUClip);
90 const double x_eff = marginals_[i]->ppf(u[i]);
91 PDFDiff fdf = marginals_[i]->f_df_ddf(x_eff);
93 if (!std::isfinite(fdf.
f) || !(fdf.
f > 0.0)) {
94 std::ostringstream oss;
95 oss <<
"JointDistribution::curvature invalid marginal density"
101 throw std::runtime_error(oss.str());
104 finite_or_throw(fdf.
df,
"marginal df", i);
105 finite_or_throw(fdf.
ddf,
"marginal ddf", i);
110 const double dlogf = fdf.
df / fdf.
f;
111 d2logf_i[i] = fdf.
ddf / fdf.
f - dlogf * dlogf;
113 finite_or_throw(f_i[i],
"marginal f", i);
114 finite_or_throw(df_i[i],
"marginal df", i);
115 finite_or_throw(d2logf_i[i],
"marginal d2logf", i);
120 for (std::size_t i = 0; i < d; ++i) {
121 finite_or_throw(cdc.
dlog_c.
at(i, 0),
"copula dlog_c", i);
123 for (std::size_t j = 0; j < d; ++j) {
124 const double ddlogc = cdc.
ddlog_c.
at(i, j);
125 if (!std::isfinite(ddlogc)) {
126 std::ostringstream oss;
127 oss <<
"JointDistribution::curvature non-finite copula ddlog_c"
128 <<
" at (" << i <<
"," << j <<
")";
129 throw std::runtime_error(oss.str());
132 double wij = -ddlogc * f_i[i] * f_i[j];
135 wij += -cdc.
dlog_c.
at(i, 0) * df_i[i] - d2logf_i[i];
138 if (!std::isfinite(wij)) {
139 std::ostringstream oss;
140 oss <<
"JointDistribution::curvature produced non-finite W"
141 <<
" at (" << i <<
"," << j <<
")"
146 <<
" df_i=" << df_i[i]
147 <<
" d2logf_i=" << d2logf_i[i]
148 <<
" dlogc_i=" << cdc.
dlog_c.
at(i, 0)
149 <<
" ddlogc_ij=" << ddlogc;
150 throw std::runtime_error(oss.str());
158 for (std::size_t i = 0; i < d; ++i) {
159 for (std::size_t j = i + 1; j < d; ++j) {
160 const double v = 0.5 * (W.
at(i, j) + W.
at(j, i));