Skip to content

Commit 4ce3389

Browse files
committed
add cut_param in rng functions
1 parent 59b2007 commit 4ce3389

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

inst/include/bvhar/src/bayes/misc/draw.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,15 @@ inline void set_grp_id(std::set<int>& own_id, std::set<int> cross_id, const Eige
9696
// }
9797
// }
9898

99-
inline void cut_param(double& param) {
100-
if (param < std::numeric_limits<double>::min() || std::isnan(param)) {
101-
param = std::numeric_limits<double>::min();
102-
} else if (param > std::numeric_limits<double>::max() || std::isinf(param)) {
103-
param = std::numeric_limits<double>::max();
104-
}
99+
inline void cut_param(Eigen::Ref<Eigen::VectorXd> param) {
100+
param = param.array().isNaN().select(
101+
std::numeric_limits<double>::min(),
102+
param.array().isInf().select(
103+
std::numeric_limits<double>::max(),
104+
param
105+
)
106+
);
107+
param = param.cwiseMax(std::numeric_limits<double>::min()).cwiseMin(std::numeric_limits<double>::max());
105108
}
106109

107110
// Building Spike-and-slab SD Diagonal Matrix
@@ -784,6 +787,7 @@ inline void dl_local_sparsity(Eigen::VectorXd& local_param, double& dir_concen,
784787
cut_param(local_param[i]);
785788
}
786789
local_param /= local_param.sum();
790+
cut_param(local_param);
787791
}
788792

789793
// Generating Global Parameter of Dirichlet-Laplace Prior

inst/include/bvhar/src/core/common.h

+9
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,14 @@ inline double invgamma_dens(double x, double shp, double scl, bool lg) {
524524
}
525525

526526
// RNG----------------------------------------
527+
inline void cut_param(double& param) {
528+
if (param < std::numeric_limits<double>::min() || std::isnan(param)) {
529+
param = std::numeric_limits<double>::min();
530+
} else if (param > std::numeric_limits<double>::max() || std::isinf(param)) {
531+
param = std::numeric_limits<double>::max();
532+
}
533+
}
534+
527535
#ifdef USE_RCPP
528536
inline double bindom_rand(int n, double prob) {
529537
return Rf_rbinom(n, prob);
@@ -557,6 +565,7 @@ inline double chisq_rand(double df, BHRNG& rng) {
557565
}
558566

559567
inline double gamma_rand(double shp, double scl, BHRNG& rng) {
568+
cut_param(scl);
560569
boost::random::gamma_distribution<> rdist(shp, scl); // 2nd: scale
561570
return rdist(rng);
562571
}

inst/include/bvhar/src/math/random.h

+4
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,17 @@ inline std::vector<Eigen::MatrixXd> sim_mn_iw(const Eigen::MatrixXd& mat_mean, c
218218
// @param psi Second parameter of GIG
219219
// @param chi Third parameter of GIG
220220
inline double sim_gig(double lambda, double psi, double chi, BHRNG& rng) {
221+
cut_param(psi);
222+
cut_param(chi);
221223
boost::random::generalized_inverse_gaussian_distribution<> rdist(lambda, psi, chi);
222224
return rdist(rng);
223225
}
224226

225227
// Generate Inverse Gaussian Distribution
226228
// This function generates one Inverse Gaussian random number with mu (mean) and lambda (shape).
227229
inline double sim_invgauss(double mean, double shape, BHRNG& rng) {
230+
cut_param(mean);
231+
cut_param(shape);
228232
boost::random::inverse_gaussian_distribution<> rdist(mean, shape);
229233
return rdist(rng);
230234
}

0 commit comments

Comments
 (0)