4 this->ctx = std::move(
ctx);
9void BaseLikelihood::maybe_log_debug_eval(
const std::vector<double>& theta,
10 const std::vector<double>& p,
11 const std::vector<double>& eta,
12 const std::vector<double>& res,
15 double nll_value)
const
37 <<
" nll=" << nll_value
38 <<
" ell_obs=" << ell_obs
39 <<
" ell_nuis=" << ell_nuis
40 <<
" max|theta-theta0|=" << theta_shift
41 <<
" max|res-res0|=" << res_shift;
45 for (std::size_t i = 0; i < std::min<std::size_t>(p.size(), 4); ++i) {
46 if (i) std::cout <<
", ";
49 if (p.size() > 4) std::cout <<
", ...";
54 std::cout <<
" eta=[";
55 for (std::size_t i = 0; i < std::min<std::size_t>(eta.size(), 4); ++i) {
56 if (i) std::cout <<
", ";
59 if (eta.size() > 4) std::cout <<
", ...";
63 std::cout << std::endl;
69 std::vector<double> p(theta.begin(), theta.begin() +
p_dim);
70 std::vector<double> eta(theta.begin() +
p_dim, theta.end());
73 std::vector<double> res =
model(p, eta);
75 for (
size_t i = 0; i < res.size(); i++) {
76 if (!std::isfinite(res[i])) {
79 res[i] -= this->
ctx->exp_obs_values[i];
80 if (!std::isfinite(res[i])) {
85 double ell_obs = this->
ctx->exp_obs_dist->logpdf(res);
86 double ell_nuis = this->
ctx->nuisance_dist->logpdf(eta);
88 if (!std::isfinite(ell_obs) || !std::isfinite(ell_nuis)) {
92 double out = -(ell_obs + ell_nuis);
93 if (!std::isfinite(out)) {
97 maybe_log_debug_eval(theta, p, eta, res, ell_obs, ell_nuis, out);
100 catch (
const std::exception& e) {
102 std::cerr <<
"[FIT DEBUG] model/nll exception: " << e.what() <<
"\n";
108 std::cerr <<
"[FIT DEBUG] model/nll unknown exception\n";
115 return this->
ctx->nuisance_dist->dim() + this->
p_dim;
123 return ctx->nuis_defs.size();
127 std::vector<double> out;
128 out.reserve(
ctx->fp_defs.size());
130 for (
const auto& def :
ctx->fp_defs) {
131 out.push_back(def.value);
138 std::vector<double> out;
139 out.reserve(
ctx->nuis_defs.size());
141 for (
const auto& def :
ctx->nuis_defs) {
142 out.push_back(def.value);
149 const std::vector<double>& p,
150 const std::vector<double>& eta
152 return model(p, eta);
156 const std::vector<double>& p,
157 const std::vector<double>& eta
159 std::vector<double> pred =
model(p, eta);
161 if (pred.size() !=
ctx->exp_obs_values.size()) {
162 throw std::runtime_error(
"BaseLikelihood::residuals: prediction/observation size mismatch");
165 for (std::size_t i = 0; i < pred.size(); ++i) {
166 pred[i] -=
ctx->exp_obs_values[i];
173 const std::vector<double>& p,
174 const std::vector<double>& eta
176 std::vector<double> theta;
177 theta.reserve(p.size() + eta.size());
178 theta.insert(theta.end(), p.begin(), p.end());
179 theta.insert(theta.end(), eta.begin(), eta.end());
185 const std::vector<double>& r
189 for (std::size_t i = 0; i < W.
rows(); ++i) {
190 for (std::size_t j = 0; j < W.
cols(); ++j) {
191 if (!std::isfinite(W.
at(i, j))) {
192 std::cout <<
"[WOBSDBG] non-finite W_obs("
193 << i <<
"," << j <<
")"
196 <<
" exp_i=" <<
ctx->exp_obs_values[i]
197 <<
" exp_j=" <<
ctx->exp_obs_values[j]
207 const std::vector<double>& eta
209 return ctx->nuisance_dist->curvature(eta);
Concrete profileable likelihood built from a model and joint distributions.
std::function< std::vector< double >(const std::vector< double > &p, const std::vector< double > &eta)> ModelFn
Model function signature used by BaseLikelihood.
std::shared_ptr< LikelihoodContext > ctx
Shared statistical context used by the likelihood.
std::vector< double > central_eta() const override
Returns the central values of the nuisance parameters.
std::vector< double > central_p() const override
Returns the central values of the fitted parameters.
std::vector< double > predict(const std::vector< double > &p, const std::vector< double > &eta) const override
bool debug_have_ref_theta_
Whether the debug reference parameter vector is set.
std::size_t p_dimension() const override
Returns the dimension of the fitted-parameter block.
RealMatrix nuisance_curvature(const std::vector< double > &eta) const override
RealMatrix observable_curvature(const std::vector< double > &r) const override
std::vector< double > debug_ref_res_
First traced residual vector used as debug reference.
std::size_t debug_trace_max_evals_
Maximum number of traced evaluations.
std::vector< double > residuals(const std::vector< double > &p, const std::vector< double > &eta) const override
bool debug_trace_enabled_
Whether evaluation debug tracing is enabled.
double nll(const std::vector< double > &theta) const override
Evaluates the negative log-likelihood for a full parameter vector.
std::vector< double > debug_ref_theta_
First traced parameter vector used as debug reference.
std::size_t eta_dimension() const override
Returns the dimension of the nuisance-parameter block.
double nll_from_split(const std::vector< double > &p, const std::vector< double > &eta) const override
std::size_t dim() const override
Returns the total likelihood dimension.
ModelFn model
Model function evaluated by the likelihood.
bool debug_have_ref_res_
Whether the debug reference residual vector is set.
std::size_t debug_eval_count_
Number of evaluations already traced.
std::size_t p_dim
Dimension of the fitted-parameter block.
BaseLikelihood(const ModelFn &model, std::shared_ptr< LikelihoodContext > ctx, size_t p_dim)
Constructs a likelihood from a model and statistical context.
std::size_t rows() const
Returns the number of rows.
double & at(size_t i, size_t j)
Returns a mutable reference to element (i,j) with bounds checking.
std::size_t cols() const
Returns the number of columns.