Docs
Loading...
Searching...
No Matches
splitmerge_LSS.hpp
Go to the documentation of this file.
1
14
15#pragma once
16
18#include "../utils/Sampler.hpp"
19
55class SplitMerge_LSS : public Sampler {
56private:
58
59 // ========== Random Number Generation ==========
60
62 mutable std::mt19937 gen;
63
64 // ========== Move Selection Variables ==========
65
67 int idx_i;
68
70 int idx_j;
71
73 int ci;
74
76 int cj;
77
78 // ========== Algorithm Configuration ==========
79
81 bool shuffle_bool = false;
82
83 // ========== State Management ==========
84
86 Eigen::VectorXi launch_state;
87
89 Eigen::VectorXi S;
90
92 Eigen::VectorXi original_allocations;
93
94 // ========== Proposal Probabilities ==========
95
99
103
104 // ========== Debug variables ==========
108
109 // ========== Move Selection Methods ==========
110
118 void choose_indeces(bool similarity = false);
119
127
128 // ========== SAMS-Specific Proposal Generation ==========
129
144 void sequential_allocation(int iterations, bool only_probabilities = false,
145 bool sequential = true);
146
147 // ========== Split Move Implementation ==========
148
156 void split_move();
157
164 double compute_acceptance_ratio_split(double likelihood_old_cluster);
165
166 // ========== Merge Move Implementation ==========
167
174 void merge_move();
175
182 double compute_acceptance_ratio_merge(double likelihood_old_clusters);
183
184 // ========== Shuffle Move Implementation ==========
185
192 void shuffle();
193
202 double compute_acceptance_ratio_shuffle(double likelihood_old_clusters,
203 int old_ci_size, int old_cj_size);
204
205public:
206 // ========== Constructor ==========
207
224 bool shuffle)
225 : Sampler(d, l, pr), params(p), shuffle_bool(shuffle), gen(rd()) {};
226
227 // ========== MCMC Interface ==========
228
243 void step() override;
244
245 // ========== Accessor Methods ==========
250 int get_accepted_split() const { return accepted_split; };
251
256 int get_accepted_merge() const { return accepted_merge; };
257
262 int get_accepted_shuffle() const { return accepted_shuffle; };
263};
Abstract base class for MCMC sampling algorithms.
Manages distance matrices and cluster allocations for points.
Definition Data.hpp:26
Abstract base class for likelihood computation.
Definition Likelihood.hpp:26
Abstract base class for Bayesian nonparametric processes.
Definition Process.hpp:40
std::random_device rd
Random device for generating random numbers across sampling algorithms.
Definition Sampler.hpp:67
Sampler(Data &d, const Likelihood &l, Process &pr)
Constructor initializing sampler with required components.
Definition Sampler.hpp:89
int get_accepted_split() const
Get number of accepted split moves for diagnostics.
Definition splitmerge_LSS.hpp:250
double log_merge_gibbs_prob
Log probability of generating current state via sequential allocation (merge direction).
Definition splitmerge_LSS.hpp:102
SplitMerge_LSS(Data &d, utils_params &p, Likelihood &l, Process &pr, bool shuffle)
Constructor for LSS (Locality Sensitive Sampling) Split-Merge sampler.
Definition splitmerge_LSS.hpp:223
double compute_acceptance_ratio_merge(double likelihood_old_clusters)
Compute acceptance ratio for LSS merge move.
Definition splitmerge_LSS.cpp:195
int accepted_split
Definition splitmerge_LSS.hpp:105
Eigen::VectorXi S
Indices of observations in clusters ci and cj.
Definition splitmerge_LSS.hpp:89
double compute_acceptance_ratio_split(double likelihood_old_cluster)
Compute acceptance ratio for LSS split move.
Definition splitmerge_LSS.cpp:291
void merge_move()
Execute a merge move using LSS.
Definition splitmerge_LSS.cpp:216
Eigen::VectorXi launch_state
Launch state for sequential allocation.
Definition splitmerge_LSS.hpp:86
int accepted_merge
Definition splitmerge_LSS.hpp:106
void split_move()
Execute a split move using LSS.
Definition splitmerge_LSS.cpp:252
int cj
Cluster assignment of second observation.
Definition splitmerge_LSS.hpp:76
void choose_indeces(bool similarity=false)
Randomly select two observations for split-merge proposal.
Definition splitmerge_LSS.cpp:19
void step() override
Perform one iteration of the LSS Split-Merge algorithm.
Definition splitmerge_LSS.cpp:424
Eigen::VectorXi original_allocations
Original cluster assignments before move proposal.
Definition splitmerge_LSS.hpp:92
const utils_params & params
Definition splitmerge_LSS.hpp:57
int accepted_shuffle
Definition splitmerge_LSS.hpp:107
int idx_j
Index of second randomly chosen observation.
Definition splitmerge_LSS.hpp:70
std::mt19937 gen
Mersenne Twister random number generator for sampling operations.
Definition splitmerge_LSS.hpp:62
void choose_clusters_shuffle()
Select clusters for shuffle move.
Definition splitmerge_LSS.cpp:372
int get_accepted_merge() const
Get number of accepted merge moves for diagnostics.
Definition splitmerge_LSS.hpp:256
int get_accepted_shuffle() const
Get number of accepted shuffle moves for diagnostics.
Definition splitmerge_LSS.hpp:262
void sequential_allocation(int iterations, bool only_probabilities=false, bool sequential=true)
Generate proposal state via sequential allocation.
Definition splitmerge_LSS.cpp:122
int idx_i
Index of first randomly chosen observation.
Definition splitmerge_LSS.hpp:67
double log_split_gibbs_prob
Log probability of generating current state via sequential allocation (split direction).
Definition splitmerge_LSS.hpp:98
void shuffle()
Execute a shuffle move using LSS.
Definition splitmerge_LSS.cpp:312
bool shuffle_bool
Flag to enable shuffle moves (Mena and Martinez, 2014).
Definition splitmerge_LSS.hpp:81
int ci
Cluster assignment of first observation.
Definition splitmerge_LSS.hpp:73
double compute_acceptance_ratio_shuffle(double likelihood_old_clusters, int old_ci_size, int old_cj_size)
Compute acceptance ratio for LSS shuffle move.
Definition splitmerge_LSS.cpp:350
Parameter struct for utility parameters and data structures.
Definition utils-params.hpp:17
Parameter management for useful parameters and data structures.