24 template<
size_t nparts,
size_t dimx,
typename float_t >
30 using ssv = Eigen::Matrix<float_t,dimx,1>;
47 rbase(
unsigned long seed);
65 template<
size_t nparts,
size_t dimx,
typename float_t>
67 :
m_gen{
static_cast<std::uint32_t
>(
68 std::chrono::high_resolution_clock::now().time_since_epoch().count()
74 template<
size_t nparts,
size_t dimx,
typename float_t>
76 :
m_gen{
static_cast<std::uint32_t
>(seed)}
91 template<
size_t nparts,
size_t dimx,
typename float_t>
97 using ssv = Eigen::Matrix<float_t,dimx,1>;
128 template<
size_t nparts,
size_t dimx,
typename float_t>
130 :
rbase<nparts, dimx, float_t>(seed)
135 template<
size_t nparts,
size_t dimx,
typename float_t>
145 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
146 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), w.begin(),
147 [&m](float_t& d) -> float_t {
return std::exp( d - m ); } );
148 std::discrete_distribution<> idxSampler(w.begin(), w.end());
154 unsigned int whichPart;
155 for(
size_t part = 0; part < nparts; ++part)
157 whichPart = idxSampler(this->
m_gen);
158 tmpPartics[part] = oldParts[whichPart];
162 oldParts = std::move(tmpPartics);
163 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
178 template<
size_t nparts,
size_t dimsampledx,
typename cfModT,
typename float_t>
184 using ssv = Eigen::Matrix<float_t,dimsampledx,1>;
220 template<
size_t nparts,
size_t dimsampledx,
typename cfModT,
typename float_t>
222 :
m_gen{
static_cast<std::uint32_t
>(
223 std::chrono::high_resolution_clock::now().time_since_epoch().count()
229 template<
size_t nparts,
size_t dimsampledx,
typename cfModT,
typename float_t>
231 :
m_gen{
static_cast<std::uint32_t
>(seed) }
236 template<
size_t nparts,
size_t dimsampledx,
typename cfModT,
typename float_t>
241 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
242 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), w.begin(),
243 [&m](float_t& d) -> float_t {
return std::exp( d - m ); } );
244 std::discrete_distribution<> idxSampler(w.begin(), w.end());
251 unsigned int whichPart;
252 for(
size_t part = 0; part < nparts; ++part)
254 whichPart = idxSampler(
m_gen);
255 tmpSamps[part] = oldSamps[whichPart];
256 tmpMods[part] = oldMods[whichPart];
260 oldMods = std::move(tmpMods);
261 oldSamps = std::move(tmpSamps);
262 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
277 template<
size_t nparts,
size_t dimx,
typename float_t>
283 using ssv = Eigen::Matrix<float_t,dimx,1>;
315 template<
size_t nparts,
size_t dimx,
typename float_t>
317 :
rbase<nparts, dimx, float_t>(seed)
322 template<
size_t nparts,
size_t dimx,
typename float_t>
328 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
329 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), w.begin(),
330 [&m](
const float_t& d) -> float_t {
return std::exp( d - m ); } );
331 float_t norm_const (0.0);
332 norm_const = std::accumulate(w.begin(), w.end(), norm_const);
333 for(
auto& weight : w)
334 weight = weight/norm_const;
339 float_t numRandomSamples(0.0);
340 for(i = 0; i < nparts; ++i) {
341 unNormWBar[i] = w[i]*nparts - std::floor(w[i]*nparts);
342 numRandomSamples += unNormWBar[i];
346 std::discrete_distribution<> idxSampler(unNormWBar.begin(), unNormWBar.end());
350 for(i = 0; i < nparts; ++i) {
351 sampleCounts[i] =
static_cast<unsigned int>(std::floor(nparts*w[i]));
353 for(i = 0; i < static_cast<unsigned int>(numRandomSamples); ++i) {
354 sampleCounts[idxSampler(this->
m_gen)]++;
360 for(i = 0; i < nparts; ++i) {
361 unsigned int num_replicants = sampleCounts[i];
362 if( num_replicants > 0) {
363 for(
size_t j = 0; j < num_replicants; ++j) {
364 tmpPartics[c] = oldParts[i];
371 oldParts = std::move(tmpPartics);
372 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
386 template<
size_t nparts,
size_t dimx,
typename float_t>
392 using ssv = Eigen::Matrix<float_t,dimx,1>;
424 template<
size_t nparts,
size_t dimx,
typename float_t>
426 :
rbase<nparts, dimx, float_t>(seed)
431 template<
size_t nparts,
size_t dimx,
typename float_t>
437 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
438 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), w.begin(),
439 [&m](
const float_t& d) -> float_t {
return std::exp( d - m ); } );
440 float_t norm_const (0.0);
441 norm_const = std::accumulate(w.begin(), w.end(), norm_const);
442 for(
auto& weight : w)
443 weight = weight/norm_const;
448 std::partial_sum(w.begin(), w.end(), cumsums.begin());
451 std::uniform_real_distribution<float_t> u_sampler(0.0, 1.0/nparts);
453 for(
size_t i = 0; i < nparts; ++i) {
454 u_samples[i] = i/nparts + u_sampler(this->
m_gen);
459 for(
size_t i = 0; i < nparts; ++i){
463 for(
unsigned int j = 0; j < nparts; ++j){
466 if(cumsums[j] >= u_samples[i]){
473 tmpPartics[i] = oldParts[idx];
477 oldParts = std::move(tmpPartics);
478 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
492 template<
size_t nparts,
size_t dimx,
typename float_t>
498 using ssv = Eigen::Matrix<float_t,dimx,1>;
530 template<
size_t nparts,
size_t dimx,
typename float_t>
532 :
rbase<nparts, dimx, float_t>(seed)
537 template<
size_t nparts,
size_t dimx,
typename float_t>
543 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
544 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), w.begin(),
545 [&m](
const float_t& d) -> float_t {
return std::exp( d - m ); } );
546 float_t norm_const (0.0);
547 norm_const = std::accumulate(w.begin(), w.end(), norm_const);
548 for(
auto& weight : w)
549 weight = weight/norm_const;
553 std::partial_sum(w.begin(), w.end(), cumsums.begin());
556 std::uniform_real_distribution<float_t> u_sampler(0.0, 1.0/nparts);
558 u_samples[0] = u_sampler(this->
m_gen);
559 for(
size_t i = 1; i < nparts; ++i) {
560 u_samples[i] = u_samples[i-1] + 1.0/nparts;
565 for(
size_t i = 0; i < nparts; ++i){
569 for(
unsigned int j = 0; j < nparts; ++j){
572 if(cumsums[j] >= u_samples[i]){
579 tmpPartics[i] = oldParts[idx];
583 oldParts = std::move(tmpPartics);
584 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
597 template<
size_t nparts,
size_t dimx,
typename float_t>
603 using ssv = Eigen::Matrix<float_t,dimx,1>;
633 template<
size_t nparts,
size_t dimx,
typename float_t>
635 :
rbase<nparts, dimx, float_t>(seed)
640 template<
size_t nparts,
size_t dimx,
typename float_t>
652 float_t m = *std::max_element(oldLogUnNormWts.begin(), oldLogUnNormWts.end());
653 std::transform(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), unnorm_weights.begin(),
654 [&m](float_t& d) -> float_t {
return std::exp( d - m ); } );
657 std::uniform_real_distribution<float_t> u_sampler(0.0, 1.0);
663 float_t weight_norm_const(0.0);
666 for(
size_t i = 0; i < nparts; ++i) {
667 weight_norm_const += unnorm_weights[i];
668 exponentials[i] = -std::log(u_sampler(this->
m_gen));
669 G += exponentials[i];
671 G+= std::log(u_sampler(this->
m_gen));
675 float_t uniform_order_stat(0.0);
676 float_t running_sum_normalized_weights(unnorm_weights[0]/weight_norm_const);
677 float_t one_less_summand(0.0);
678 unsigned int idx = 0;
679 for(
size_t i = 0; i < nparts; ++i){
680 uniform_order_stat += exponentials[i]/G;
682 if( one_less_summand < uniform_order_stat <= running_sum_normalized_weights ) {
684 tmpPartics[i] = oldParts[idx];
689 running_sum_normalized_weights += unnorm_weights[idx]/weight_norm_const;
690 one_less_summand += unnorm_weights[idx-1]/weight_norm_const;
696 oldParts = std::move(tmpPartics);
697 std::fill(oldLogUnNormWts.begin(), oldLogUnNormWts.end(), 0.0);
700 #endif // RESAMPLERS_H resid_resampler()=default
Default constructor.
void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:136
Definition: resamplers.h:179
mn_resampler_rbpf()
Default constructor.
Definition: resamplers.h:221
rbase()
The default constructor gets called by default, and it sets the seed with the clock.
Definition: resamplers.h:66
Eigen::Matrix< float_t, dimx, 1 > ssv
Definition: resamplers.h:30
void resampLogWts(arrayMod &oldMods, arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:237
Definition: resamplers.h:598
std::array< unsigned int, nparts > arrayInt
Definition: resamplers.h:609
Definition: resamplers.h:493
Base class for all resampler types.
Definition: resamplers.h:25
mn_resamp_fast1()=default
Default constructor.
Definition: resamplers.h:278
std::array< float_t, nparts > arrayFloat
Definition: resamplers.h:34
void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:323
std::array< cfModT, nparts > arrayMod
Definition: resamplers.h:190
void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:641
std::array< ssv, nparts > arrayVec
Definition: resamplers.h:32
std::mt19937 m_gen
prng
Definition: resamplers.h:60
std::mt19937 m_gen
prng
Definition: resamplers.h:216
stratif_resampler()=default
Default constructor.
void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:432
std::array< unsigned int, nparts > arrayInt
Definition: resamplers.h:289
mn_resampler()=default
Default constructor.
std::array< unsigned int, nparts > arrayInt
Definition: resamplers.h:103
std::array< unsigned int, nparts > arrayInt
Definition: resamplers.h:398
Eigen::Matrix< float_t, dimsampledx, 1 > ssv
Definition: resamplers.h:184
Definition: resamplers.h:92
std::array< float_t, nparts > arrayFloat
Definition: resamplers.h:188
Definition: resamplers.h:387
std::array< unsigned int, nparts > arrayInt
Definition: resamplers.h:504
systematic_resampler()=default
Default constructor.
void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)
resamples particles.
Definition: resamplers.h:538
std::array< ssv, nparts > arrayVec
Definition: resamplers.h:186
virtual void resampLogWts(arrayVec &oldParts, arrayFloat &oldLogUnNormWts)=0
Function to resample from log unnormalized weights.