Docs
Loading...
Searching...
No Matches
continuos_covariate_module.hpp
Go to the documentation of this file.
1
5
6#pragma once
7
10#include "Eigen/Dense"
11#include <cmath>
12#include <vector>
13
27protected:
32
34 const Data &data;
35
37
42 const Eigen::VectorXd continuos_covariate_data;
43 const bool fixed_v;
44 const double m;
45 const double B;
46 const double v;
47 const double nu;
48 const double S0;
49
51
56
60 struct ClusterStats {
61 int n = 0;
62 double sum = 0.0;
63 double sumsq = 0.0;
64 };
65
70 ClusterStats compute_cluster_statistics(const Eigen::Ref<const Eigen::VectorXi> obs) const;
71
104 double compute_log_marginal_likelihood_NN(const ClusterStats &stats) const __attribute__((hot));
105
122 double compute_log_marginal_likelihood_NNIG(const ClusterStats &stats) const __attribute__((hot));
123
141 double compute_predictive_NN(const ClusterStats &stats, double covariate_val) const;
142
162 double compute_predictive_NNIG(const ClusterStats &stats, double covariate_val) const;
163
172 inline double compute_log_marginal_likelihood(const ClusterStats &stats) const __attribute__((hot)) {
173 if (fixed_v) {
175 } else {
177 }
178 }
179
189 inline double compute_log_predictive_likelihood(const ClusterStats &stats, double covariate_val) const
190 __attribute__((hot, always_inline)) {
191 if (fixed_v) {
192 return compute_predictive_NN(stats, covariate_val);
193 } else {
194 return compute_predictive_NNIG(stats, covariate_val);
195 }
196 }
197
199
204
205 const double Bv;
206
207 const double log_B;
208 const double log_v;
209
210 const double const_term;
211
212 const double lgamma_nu;
213 const double nu_logS0;
214
215 std::vector<double> log_v_plus_nB;
216 std::vector<double> lgamma_nu_n;
217
219
220public:
235 ContinuosCovariatesModule(const Data &data_, const Eigen::VectorXd covariates_data_, bool fixed_v_, double m_ = 0,
236 double B_ = 1.0, double v_ = 1.0, double nu_ = 1.0, double S0_ = 1.0,
237 const Eigen::VectorXi *old_alloc_provider = nullptr,
238 const std::unordered_map<int, std::vector<int>> *old_cluster_members_provider_ = nullptr)
239 : continuos_covariate_data(covariates_data_), fixed_v(fixed_v_), m(m_), B(B_), v(v_), nu(nu_), S0(S0_),
240 data(data_), Module(old_alloc_provider, old_cluster_members_provider_), Bv(B * v), log_B(std::log(B)),
241 log_v(std::log(v)), const_term(-0.5 * std::log(2.0 * M_PI)), lgamma_nu(std::lgamma(nu)),
242 nu_logS0(nu * std::log(S0)) {
243 // Precompute caches for efficiency if needed
244 if (fixed_v) {
245 log_v_plus_nB.reserve(data_.get_n() + 1);
246 for (int n = 0; n <= data_.get_n(); ++n) {
247 log_v_plus_nB.push_back(std::log(v + n * B));
248 }
249 } else {
250 lgamma_nu_n.reserve(data_.get_n() + 1);
251 for (int n = 0; n <= data_.get_n(); ++n) {
252 lgamma_nu_n.push_back(std::lgamma(nu + 0.5 * static_cast<double>(n)));
253 }
254 }
255 }
256
261
282 double compute_similarity_cls(int cls_idx, bool old_allo = false) const override __attribute__((hot));
283
297 double compute_similarity_obs(int obs_idx, int cls_idx) const override __attribute__((hot));
298
308 Eigen::VectorXd compute_similarity_obs(int obs_idx) const override __attribute__((hot));
309
311};
Data structure for managing point distances and cluster allocations.
Base class for modules used in processes.
const double m
Prior mean for covariate.
Definition continuos_covariate_module.hpp:44
const double const_term
Constant term in log likelihood.
Definition continuos_covariate_module.hpp:210
const double nu
Prior shape parameter for variance (NNIG).
Definition continuos_covariate_module.hpp:47
const double lgamma_nu
log Gamma(ν) for NNIG model (v ~ IG(ν, S₀))
Definition continuos_covariate_module.hpp:212
std::vector< double > log_v_plus_nB
Cache for log(v_plus_nB) for NN.
Definition continuos_covariate_module.hpp:215
const Data & data
Reference to data object with cluster assignments.
Definition continuos_covariate_module.hpp:34
double always_inline
Product of prior variance and observation variance.
Definition continuos_covariate_module.hpp:190
double compute_log_marginal_likelihood(const ClusterStats &stats) const __attribute__((hot))
Compute log marginal likelihood based on model type.
Definition continuos_covariate_module.hpp:172
double compute_predictive_NNIG(const ClusterStats &stats, double covariate_val) const
Compute log predictive density for a new observation (NNIG model).
Definition continuos_covariate_module.cpp:169
const double nu_logS0
ν log(S₀) for NNIG model (v ~ IG(ν, S₀))
Definition continuos_covariate_module.hpp:213
const Eigen::VectorXd continuos_covariate_data
Covariate values.
Definition continuos_covariate_module.hpp:42
const double log_B
Log of prior variance.
Definition continuos_covariate_module.hpp:207
double compute_similarity_cls(int cls_idx, bool old_allo=false) const override __attribute__((hot))
Compute covariate similarity contribution for a cluster.
Definition continuos_covariate_module.cpp:23
const double S0
Prior scale parameter for variance (NNIG).
Definition continuos_covariate_module.hpp:48
double compute_similarity_obs(int obs_idx, int cls_idx) const override __attribute__((hot))
Compute covariate similarity for a single observation in a cluster.
Definition continuos_covariate_module.cpp:38
double compute_log_marginal_likelihood_NNIG(const ClusterStats &stats) const __attribute__((hot))
Compute log marginal likelihood for cluster given covariates.
Definition continuos_covariate_module.cpp:79
const bool fixed_v
Whether observation variance is fixed (NN) or random (NNIG).
Definition continuos_covariate_module.hpp:43
const double v
Observation variance for covariate.
Definition continuos_covariate_module.hpp:46
ClusterStats compute_cluster_statistics(const Eigen::Ref< const Eigen::VectorXi > obs) const
Compute cluster statistics for covariate similarity.
Definition continuos_covariate_module.cpp:9
const double B
Prior variance for covariate.
Definition continuos_covariate_module.hpp:45
double compute_predictive_NN(const ClusterStats &stats, double covariate_val) const
Compute log predictive density for a new observation (Normal-Normal model).
Definition continuos_covariate_module.cpp:152
const double log_v
Log of observation variance.
Definition continuos_covariate_module.hpp:208
std::vector< double > lgamma_nu_n
Cache for lgamma(nu_n) for NNIG.
Definition continuos_covariate_module.hpp:216
double compute_log_marginal_likelihood_NN(const ClusterStats &stats) const __attribute__((hot))
Compute log marginal likelihood for cluster given covariates.
Definition continuos_covariate_module.cpp:116
double compute_log_predictive_likelihood(const ClusterStats &stats, double covariate_val) const __attribute__((hot
Compute log marginal likelihood based on model type.
ContinuosCovariatesModule(const Data &data_, const Eigen::VectorXd covariates_data_, bool fixed_v_, double m_=0, double B_=1.0, double v_=1.0, double nu_=1.0, double S0_=1.0, const Eigen::VectorXi *old_alloc_provider=nullptr, const std::unordered_map< int, std::vector< int > > *old_cluster_members_provider_=nullptr)
Constructor for ContinuosCovariatesModule.
Definition continuos_covariate_module.hpp:235
Manages distance matrices and cluster allocations for points.
Definition Data.hpp:27
int get_n() const
Gets the total number of points.
Definition Data.hpp:78
Module(const Eigen::VectorXi *old_allocations_provider_=nullptr, const std::unordered_map< int, std::vector< int > > *old_cluster_members_provider_=nullptr)
Definition Module.hpp:31
Sufficient statistics for covariate likelihood computations.
Definition continuos_covariate_module.hpp:60
double sumsq
Definition continuos_covariate_module.hpp:63
int n
Definition continuos_covariate_module.hpp:61
double sum
Definition continuos_covariate_module.hpp:62