Docs
Loading...
Searching...
No Matches
splitmerge.hpp
Go to the documentation of this file.
1
14
15#pragma once
16
17#include "../utils/Sampler.hpp"
18
44class SplitMerge : public Sampler {
45private:
46 // ========== Random Number Generation ==========
47
49 mutable std::mt19937 gen;
50
51 // ========== Move Selection Variables ==========
52
54 int idx_i;
55
57 int idx_j;
58
60 int ci;
61
63 int cj;
64
65 // ========== Algorithm Configuration ==========
66
68 bool shuffle_bool = false;
69
70 // ========== State Management ==========
71
73 Eigen::VectorXi launch_state;
74
76 Eigen::VectorXi S;
77
79 Eigen::VectorXi original_allocations;
80
81 // ========== Proposal Probabilities ==========
82
86
90
91 // ========== Debug variables ==========
95
96 // ========== Move Selection Methods ==========
97
104 void choose_indeces();
105
113
114 // ========== Proposal Generation ==========
115
127 void restricted_gibbs(int iterations, bool only_probabilities = false);
128
129 // ========== Split Move Implementation ==========
130
138 void split_move();
139
149 double compute_acceptance_ratio_split(double likelihood_old_cluster);
150
151 // ========== Merge Move Implementation ==========
152
159 void merge_move();
160
168 double compute_acceptance_ratio_merge(double likelihood_old_ci,
169 double likelihood_old_cj);
170
171 // ========== Shuffle Move Implementation ==========
172
179 void shuffle();
180
190 double compute_acceptance_ratio_shuffle(double likelihood_old_ci,
191 double likelihood_old_cj,
192 int old_ci_size, int old_cj_size);
193
194public:
195 // ========== Constructor ==========
196
211 : Sampler(d, p, l, pr), shuffle_bool(shuffle), gen(rd()) {};
212
213 // ========== MCMC Interface ==========
214
227 void step() override;
228
229 // ========== Accessor Methods ==========
234 int get_accepted_split() const { return accepted_split; };
235
240 int get_accepted_merge() const { return accepted_merge; };
241
246 int get_accepted_shuffle() const { return accepted_shuffle; };
247};
Abstract base class for MCMC sampling algorithms.
Manages distance matrices and cluster allocations for points.
Definition Data.hpp:27
Abstract base class for likelihood computation.
Definition Likelihood.hpp:27
Abstract base class for Bayesian nonparametric processes.
Definition Process.hpp:41
Sampler(Data &d, const Params &p, const Likelihood &l, Process &pr)
Constructor initializing sampler with required components.
Definition Sampler.hpp:97
std::random_device rd
Random device for generating random numbers across sampling algorithms.
Definition Sampler.hpp:73
void shuffle()
Execute a shuffle move proposal.
Definition splitmerge.cpp:271
int ci
Cluster assignment of first observation.
Definition splitmerge.hpp:60
bool shuffle_bool
Flag to enable shuffle moves (Mena and Martinez, 2014).
Definition splitmerge.hpp:68
Eigen::VectorXi launch_state
Launch state for restricted Gibbs sampling.
Definition splitmerge.hpp:73
int accepted_split
Definition splitmerge.hpp:92
void choose_clusters_shuffle()
Select clusters for shuffle move.
Definition splitmerge.cpp:333
int accepted_merge
Definition splitmerge.hpp:93
int accepted_shuffle
Definition splitmerge.hpp:94
double log_merge_gibbs_prob
Log probability of generating current state via restricted Gibbs (merge direction).
Definition splitmerge.hpp:89
Eigen::VectorXi S
Indices of observations in clusters ci and cj.
Definition splitmerge.hpp:76
int cj
Cluster assignment of second observation.
Definition splitmerge.hpp:63
SplitMerge(Data &d, Params &p, Likelihood &l, Process &pr, bool shuffle)
Constructor for Split-Merge sampler.
Definition splitmerge.hpp:210
void merge_move()
Execute a merge move proposal.
Definition splitmerge.cpp:163
int idx_j
Index of second randomly chosen observation.
Definition splitmerge.hpp:57
void step() override
Perform one iteration of the split-merge algorithm.
Definition splitmerge.cpp:384
int get_accepted_split() const
Get number of accepted split moves for diagnostics.
Definition splitmerge.hpp:234
double compute_acceptance_ratio_split(double likelihood_old_cluster)
Compute acceptance ratio for split move.
Definition splitmerge.cpp:246
void split_move()
Execute a split move proposal.
Definition splitmerge.cpp:204
double compute_acceptance_ratio_merge(double likelihood_old_ci, double likelihood_old_cj)
Compute acceptance ratio for merge move.
Definition splitmerge.cpp:132
int idx_i
Index of first randomly chosen observation.
Definition splitmerge.hpp:54
void choose_indeces()
Randomly select two observations for split-merge proposal.
Definition splitmerge.cpp:16
std::mt19937 gen
Mersenne Twister random number generator for sampling operations.
Definition splitmerge.hpp:49
int get_accepted_merge() const
Get number of accepted merge moves for diagnostics.
Definition splitmerge.hpp:240
void restricted_gibbs(int iterations, bool only_probabilities=false)
Generate proposal state via restricted Gibbs sampling.
Definition splitmerge.cpp:76
Eigen::VectorXi original_allocations
Original cluster assignments before move proposal.
Definition splitmerge.hpp:79
double compute_acceptance_ratio_shuffle(double likelihood_old_ci, double likelihood_old_cj, int old_ci_size, int old_cj_size)
Compute acceptance ratio for shuffle move.
Definition splitmerge.cpp:306
int get_accepted_shuffle() const
Get number of accepted shuffle moves for diagnostics.
Definition splitmerge.hpp:246
double log_split_gibbs_prob
Log probability of generating current state via restricted Gibbs (split direction).
Definition splitmerge.hpp:85
Structure containing all parameters needed for the NGGP (Normalized Generalized Gamma Process) and DP...
Definition Params.hpp:35