@@ -284,14 +284,16 @@ void metropolis_thresholds_blumecapel(NumericMatrix thresholds,
284284 log_prob = std::exp (log_prob);
285285 }
286286
287- proposal_sd_blumecapel (variable, 0 ) = proposal_sd_blumecapel (variable, 0 ) +
287+ double update_proposal_sd = proposal_sd_blumecapel (variable, 0 ) +
288288 (log_prob - target_ar) * std::exp (-log (t) * phi);
289- if (proposal_sd_blumecapel (variable, 0 ) < epsilon_lo) {
290- proposal_sd_blumecapel (variable, 0 ) = epsilon_lo;
291- } else if (proposal_sd_blumecapel (variable, 0 ) > epsilon_hi) {
292- proposal_sd_blumecapel (variable, 0 ) = epsilon_hi;
289+
290+ if (std::isnan (update_proposal_sd) == true ) {
291+ update_proposal_sd = 1.0 ;
293292 }
294293
294+ update_proposal_sd = std::clamp (update_proposal_sd, epsilon_lo, epsilon_hi);
295+ proposal_sd_blumecapel (variable, 0 ) = update_proposal_sd;
296+
295297 // ----------------------------------------------------------------------------
296298 // Adaptive Metropolis for the quadratic Blume-Capel parameter
297299 // ----------------------------------------------------------------------------
@@ -363,13 +365,16 @@ void metropolis_thresholds_blumecapel(NumericMatrix thresholds,
363365 log_prob = std::exp (log_prob);
364366 }
365367
366- proposal_sd_blumecapel (variable, 1 ) = proposal_sd_blumecapel (variable, 1 ) +
368+ double update_proposal_sd = proposal_sd_blumecapel (variable, 1 ) +
367369 (log_prob - target_ar) * std::exp (-log (t) * phi);
368- if (proposal_sd_blumecapel (variable, 1 ) < epsilon_lo) {
369- proposal_sd_blumecapel (variable, 1 ) = epsilon_lo;
370- } else if (proposal_sd_blumecapel (variable, 1 ) > epsilon_hi) {
371- proposal_sd_blumecapel (variable, 1 ) = epsilon_hi;
370+
371+ if (std::isnan (update_proposal_sd) == true ) {
372+ update_proposal_sd = 1.0 ;
372373 }
374+
375+ update_proposal_sd = std::clamp (update_proposal_sd, epsilon_lo, epsilon_hi);
376+ proposal_sd_blumecapel (variable, 1 ) = update_proposal_sd;
377+
373378}
374379
375380// ----------------------------------------------------------------------------|
@@ -556,13 +561,17 @@ void metropolis_interactions(NumericMatrix interactions,
556561 } else {
557562 log_prob = std::exp (log_prob);
558563 }
559- proposal_sd (variable1, variable2) = proposal_sd (variable1, variable2) +
564+
565+ double update_proposal_sd = proposal_sd (variable1, variable2) +
560566 (log_prob - target_ar) * std::exp (-log (t) * phi);
561- if (proposal_sd (variable1, variable2) < epsilon_lo) {
562- proposal_sd (variable1, variable2) = epsilon_lo;
563- } else if (proposal_sd (variable1, variable2) > epsilon_hi) {
564- proposal_sd (variable1, variable2) = epsilon_hi;
567+
568+ if (std::isnan (update_proposal_sd) == true ) {
569+ update_proposal_sd = 1.0 ;
565570 }
571+
572+ update_proposal_sd = std::clamp (update_proposal_sd, epsilon_lo, epsilon_hi);
573+ proposal_sd (variable1, variable2) = update_proposal_sd;
574+
566575 }
567576 }
568577 }
@@ -809,10 +818,10 @@ List gibbs_sampler(IntegerMatrix observations,
809818 IntegerMatrix index (no_interactions, 3 );
810819
811820 // Parameters of adaptive proposals -------------------------------------------
812- double phi = 0.750 ;
821+ double phi = 0.75 ;
813822 double target_ar = 0.234 ;
814- double epsilon_lo = 1.0 / no_persons;
815- double epsilon_hi = 2.000 ;
823+ double epsilon_lo = 1.0 / static_cast < double >( no_persons) ;
824+ double epsilon_hi = 2.0 ;
816825
817826 // The resizing based on ``save'' could probably be prettier ------------------
818827 int nrow = no_variables;
0 commit comments