pf
rv_samp.h
Go to the documentation of this file.
1 #ifndef RV_SAMP_H
2 #define RV_SAMP_H
3 
4 #include <chrono>
5 
6 #ifdef DROPPINGTHISINRPACKAGE
7  #include <RcppEigen.h>
8  // [[Rcpp::depends(RcppEigen)]]
9 #else
10  #include <Eigen/Dense>
11 #endif
12 
13 #include <random>
14 
15 
16 namespace pf {
17 
18 namespace rvsamp{
19 
20 
22 
30 {
31 public:
32 
36  inline rvsamp_base() :
37  m_rng{static_cast<std::uint32_t>(std::chrono::high_resolution_clock::now().time_since_epoch().count())}
38  {}
39 
40 protected:
41 
43  std::mt19937 m_rng;
44 
45 };
46 
47 
49 
55 template<typename float_t>
57 {
58 
59 public:
60 
61 
66 
67 
73  UnivNormSampler(float_t mu, float_t sigma);
74 
75 
80  void setStdDev(float_t sigma);
81 
82 
87  void setMean(float_t mu);
88 
89 
94  float_t sample();
95 
96 
97 private:
98 
100  std::normal_distribution<float_t> m_z_gen;
101 
103  float_t m_mu;
104 
106  float_t m_sigma;
107 
108 };
109 
110 
111 template<typename float_t>
113  : rvsamp_base()
114  , m_z_gen(0.0, 1.0)
115 {
116  setMean(0.0);
117  setStdDev(1.0);
118 }
119 
120 
121 template<typename float_t>
123  : rvsamp_base()
124  , m_z_gen(0.0, 1.0)
125 {
126  setMean(mu);
127  setStdDev(sigma);
128 }
129 
130 
131 template<typename float_t>
133 {
134  m_mu = mu;
135 }
136 
137 
138 template<typename float_t>
140 {
141  m_sigma = sigma;
142 }
143 
144 
145 template<typename float_t>
147 {
148  return m_mu + m_sigma * m_z_gen(m_rng);
149 }
150 
151 
153 
159 template<typename float_t>
161 {
162 
163 public:
164 
165 
169  UnivStudTSampler() = delete;
170 
171 
176  UnivStudTSampler(float_t dof);
177 
178 
183  float_t sample();
184 
185 
186 private:
187 
189  std::student_t_distribution<float_t> m_t_gen;
190 
191 };
192 
193 
194 template<typename float_t>
196  : rvsamp_base()
197  , m_t_gen(dof)
198 {
199 }
200 
201 
202 template<typename float_t>
204 {
205  return m_t_gen(m_rng);
206 }
207 
208 
210 
216 template<typename float_t>
218 {
219 
220 public:
221 
222 
227 
228 
234  UnivLogNormSampler(float_t mu, float_t sigma);
235 
236 
241  void setSigma(float_t sigma);
242 
243 
248  void setMu(float_t mu);
249 
250 
255  float_t sample();
256 
257 
258 private:
259 
261  std::normal_distribution<float_t> m_z_gen;
262 
264  float_t m_mu;
265 
267  float_t m_sigma;
268 
269 };
270 
271 
272 template<typename float_t>
274  : rvsamp_base()
275  , m_z_gen(0.0, 1.0)
276 {
277  setMu(0.0);
278  setSigma(1.0);
279 }
280 
281 
282 template<typename float_t>
284  : rvsamp_base()
285  , m_z_gen(0.0, 1.0)
286 {
287  setMu(mu);
288  setSigma(sigma);
289 }
290 
291 
292 template<typename float_t>
294 {
295  m_mu = mu;
296 }
297 
298 
299 template<typename float_t>
301 {
302  m_sigma = sigma;
303 }
304 
305 
306 template<typename float_t>
308 {
309  return std::exp(m_mu + m_sigma * m_z_gen(m_rng));
310 }
311 
312 
314 
320 template<typename float_t>
322 {
323 
324 public:
325 
326 
330  UnivGammaSampler() = delete;
331 
332 
337  UnivGammaSampler(float_t alpha, float_t beta);
338 
339 
344  float_t sample();
345 
346 
347 private:
348 
350  std::gamma_distribution<float_t> m_gamma_gen;
351 
353  float_t m_alpha;
354 
356  float_t m_beta;
357 
358 };
359 
360 
361 template<typename float_t>
363  : rvsamp_base()
364  , m_gamma_gen(alpha, beta)
365 {
366 }
367 
368 
369 template<typename float_t>
371 {
372  return m_gamma_gen(m_rng);
373 }
374 
375 
377 
383 template<typename float_t>
385 {
386 
387 public:
388 
389 
394 
395 
400  UnivInvGammaSampler(float_t alpha, float_t beta);
401 
402 
407  float_t sample();
408 
409 
410 private:
411 
413  std::gamma_distribution<float_t> m_gamma_gen;
414 
416  float_t m_alpha;
417 
419  float_t m_beta;
420 
421 };
422 
423 
424 template<typename float_t>
426  : rvsamp_base()
427  , m_gamma_gen(1.0, 1.0)
428 {
429 }
430 
431 
432 template<typename float_t>
434  : rvsamp_base()
435  , m_gamma_gen(alpha, beta)
436 {
437 }
438 
439 
440 template<typename float_t>
442 {
443  return 1.0/m_gamma_gen(m_rng);
444 }
445 
446 
448 
458 template<typename float_t>
460 {
461 
462 public:
463 
464 
472  TruncUnivNormSampler(float_t mu, float_t sigma, float_t lower, float_t upper);
473 
474 
479  float_t sample();
480 
481 
482 private:
483 
485  std::normal_distribution<float_t> m_z_gen;
486 
488  float_t m_mu;
489 
491  float_t m_sigma;
492 
494  float_t m_lower;
495 
497  float_t m_upper;
498 };
499 
500 
501 template<typename float_t>
503  float_t sigma,
504  float_t lower,
505  float_t upper)
506  : rvsamp_base()
507  , m_z_gen(0.0, 1.0)
508  , m_mu(mu)
509  , m_sigma(sigma)
510  , m_lower(lower)
511  , m_upper(upper)
512 {
513 }
514 
515 
516 template<typename float_t>
518 {
519  float_t proposal;
520  bool accepted = false;
521  while(!accepted)
522  {
523  proposal = m_mu + m_sigma*m_z_gen(this->m_rng);
524  if((m_lower <= proposal) & (proposal <= m_upper))
525  accepted = true;
526  }
527  return proposal;
528 }
529 
530 
532 
538 template<typename float_t, typename int_t>
540 {
541 
542 public:
543 
544 
548  PoissonSampler();
549 
550 
555  PoissonSampler(float_t lambda);
556 
557 
562  void setLambda(float_t lambda);
563 
564 
569  int_t sample();
570 
571 
572 private:
573 
575  std::poisson_distribution<int_t> m_p_gen;
576 };
577 
578 
579 template<typename float_t, typename int_t>
581  : rvsamp_base(), m_p_gen(float_t(1.0))
582 {
583 }
584 
585 
586 template<typename float_t, typename int_t>
588  : rvsamp_base(), m_p_gen(lambda)
589 {
590 }
591 
592 
593 template<typename float_t, typename int_t>
595 {
596  m_p_gen.param(typename decltype(m_p_gen)::param_type(lambda));
597 }
598 
599 
600 template<typename float_t, typename int_t>
602 {
603  return m_p_gen(m_rng);
604 }
605 
606 
608 
614 template<typename float_t, typename int_t>
615 class BernSampler : public rvsamp_base
616 {
617 
618 public:
619 
620 
624  BernSampler();
625 
626 
631  BernSampler(float_t p);
632 
633 
638  void setP(float_t p);
639 
640 
645  int_t sample();
646 
647 
648 private:
649 
651  std::bernoulli_distribution m_B_gen;
652 
654  float_t m_p;
655 };
656 
657 
658 template<typename float_t, typename int_t>
660  : rvsamp_base(), m_B_gen(.5)
661 {
662 }
663 
664 
665 template<typename float_t, typename int_t>
667  : rvsamp_base(), m_B_gen(p)
668 {
669 }
670 
671 
672 template<typename float_t, typename int_t>
674 {
675  m_p = p;
676 }
677 
678 
679 template<typename float_t, typename int_t>
681 {
682  return (m_B_gen(m_rng)) ? 1 : 0;
683 }
684 
685 
686 
688 
694 template<size_t dim, typename float_t>
695 class MVNSampler : public rvsamp_base
696 {
697 public:
698 
700  using Vec = Eigen::Matrix<float_t,dim,1>;
702  using Mat = Eigen::Matrix<float_t,dim,dim>;
703 
711  MVNSampler();
712 
713 
719  MVNSampler(const Vec &meanVec, const Mat &covMat);
720 
721 
726  void setCovar(const Mat &covMat);
727 
728 
733  void setMean(const Vec &meanVec);
734 
735 
740  auto sample() -> Vec;
741 
742 private:
743 
745  std::normal_distribution<float_t> m_z_gen;
746 
749 
752 
753 };
754 
755 
756 template<size_t dim, typename float_t>
758  : rvsamp_base()
759  , m_z_gen(0.0, 1.0)
760 {
761  setMean(Vec::Zero());
762  setCovar(Mat::Identity());
763 }
764 
765 
766 template<size_t dim, typename float_t>
767 MVNSampler<dim, float_t>::MVNSampler(const Vec &meanVec, const Mat &covMat)
768  : rvsamp_base()
769  , m_z_gen(0.0, 1.0)
770 {
771  setCovar(covMat);
772  setMean(meanVec);
773 }
774 
775 
776 template<size_t dim, typename float_t>
778 {
779  Eigen::SelfAdjointEigenSolver<Mat> eigenSolver(covMat);
780  m_scale_mat = eigenSolver.eigenvectors() * eigenSolver.eigenvalues().cwiseMax(0).cwiseSqrt().asDiagonal();
781 }
782 
783 
784 template<size_t dim, typename float_t>
786 {
787  m_mean = meanVec;
788 }
789 
790 
791 template<size_t dim, typename float_t>
793 {
794  Vec Z;
795  for (size_t i=0; i< dim; ++i)
796  {
797  Z(i) = m_z_gen(this->m_rng);
798  }
799  return m_mean + m_scale_mat * Z;
800 }
801 
802 
803 
805 
811 template<typename float_t>
813 {
814 public:
815 
819  UniformSampler();
820 
821 
827  UniformSampler(float_t lower, float_t upper);
828 
829 
834  float_t sample();
835 
836 private:
837 
839  std::uniform_real_distribution<float_t> m_unif_gen;
840 
841 };
842 
843 
844 template<typename float_t>
846  : rvsamp_base()
847  , m_unif_gen(0.0, 1.0)
848 {
849 }
850 
851 
852 template<typename float_t>
853 UniformSampler<float_t>::UniformSampler(float_t lower, float_t upper)
854  : rvsamp_base()
855  , m_unif_gen(lower, upper)
856 {
857 }
858 
859 
860 template<typename float_t>
862 {
863  return m_unif_gen(m_rng);
864 }
865 
866 
867 
869 
876 template<size_t N, typename float_t>
877 class k_gen : public rvsamp_base
878 {
879 public:
883  k_gen();
884 
885 
891  std::array<unsigned int, N> sample(const std::array<float_t, N> &logWts);
892 };
893 
894 
895 template<size_t N, typename float_t>
897 
898 
899 template<size_t N, typename float_t>
900 std::array<unsigned int, N> k_gen<N, float_t>::sample(const std::array<float_t, N> &logWts)
901 {
902  // these log weights may be very negative. If that's the case, exponentiating them may cause underflow
903  // so we use the "log-exp-sum" trick
904  // actually not quite...we just shift the log-weights because after they're exponentiated
905  // they have the same normalized probabilities
906 
907  // Create the distribution with exponentiated log-weights
908  // subtract the max first to prevent underflow
909  // normalization is taken care of by std::discrete_distribution
910  std::array<float_t, N> w;
911  float_t m = *std::max_element(logWts.begin(), logWts.end());
912  std::transform(logWts.begin(), logWts.end(), w.begin(),
913  [&m](float_t d) -> float_t { return std::exp(d-m); } );
914  std::discrete_distribution<> kGen(w.begin(), w.end());
915 
916  // sample and return ks
917  std::array<unsigned int, N> ks;
918  for(size_t i = 0; i < N; ++i){
919  ks[i] = kGen(this->m_rng);
920  }
921  return ks;
922 }
923 
924 
925 
926 
927 
928 
929 
930 
931 
932 
933 
934 
935 
936 
937 
938 
939 
940 
941 
942 
943 
944 
945 
946 
947 
948 
949 
950 
951 
952 
953 
954 
955 
956 
957 
958 
960 
966 template<typename float_t>
967 class BetaSampler : public rvsamp_base
968 {
969 
970 public:
971 
972 
976  BetaSampler() = delete;
977 
978 
984  BetaSampler(float_t alpha, float_t beta);
985 
986 
991  float_t sample();
992 
993 
994 private:
995 
997  std::gamma_distribution<float_t> m_first_gamma_gen;
998 
1000  std::gamma_distribution<float_t> m_second_gamma_gen;
1001 
1003  float_t m_alpha;
1004 
1006  float_t m_beta;
1007 
1008 };
1009 
1010 
1011 template<typename float_t>
1012 BetaSampler<float_t>::BetaSampler(float_t alpha, float_t beta)
1013  : rvsamp_base()
1014  , m_first_gamma_gen(alpha, 1.0)
1015  , m_second_gamma_gen(beta, 1.0)
1016 {
1017 }
1018 
1019 
1020 template<typename float_t>
1022 {
1023  float_t first = m_first_gamma_gen(m_rng);
1024  float_t second = m_second_gamma_gen(m_rng);
1025  return first / (first + second);
1026 }
1027 
1028 
1029 } // namespace rv_samp
1030 
1031 } // namespace pf
1032 
1033 
1034 #endif // RV_SAMP_H
pf::rvsamp::MVNSampler::setMean
void setMean(const Vec &meanVec)
sets the mean vector of the sampler.
Definition: rv_samp.h:785
pf::rvsamp::UnivLogNormSampler::m_sigma
float_t m_sigma
sigma
Definition: rv_samp.h:267
pf::rvsamp::MVNSampler::Mat
Eigen::Matrix< float_t, dim, dim > Mat
Definition: rv_samp.h:702
pf::rvsamp::UnivStudTSampler::m_t_gen
std::student_t_distribution< float_t > m_t_gen
makes t random variates
Definition: rv_samp.h:189
pf::rvsamp::TruncUnivNormSampler
A class that performs sampling from a truncated univariate Normal distribution.
Definition: rv_samp.h:459
pf::rvsamp::PoissonSampler::PoissonSampler
PoissonSampler()
Default-constructor sets up for Poisson random variate generation with lambda = 1.
Definition: rv_samp.h:580
pf::rvsamp::UnivNormSampler::m_mu
float_t m_mu
the mean
Definition: rv_samp.h:103
pf::rvsamp::MVNSampler::m_scale_mat
Mat m_scale_mat
covariance matrix
Definition: rv_samp.h:748
pf::rvsamp::UnivInvGammaSampler::m_gamma_gen
std::gamma_distribution< float_t > m_gamma_gen
makes gamma random variates that we take the reciprocal of
Definition: rv_samp.h:413
pf::rvsamp::PoissonSampler::m_p_gen
std::poisson_distribution< int_t > m_p_gen
makes normal random variates
Definition: rv_samp.h:575
pf::rvsamp::UnivLogNormSampler::UnivLogNormSampler
UnivLogNormSampler()
Default-constructor sets up for standard Normal random variate generation.
Definition: rv_samp.h:273
pf::rvsamp::MVNSampler::m_z_gen
std::normal_distribution< float_t > m_z_gen
makes normal random variates
Definition: rv_samp.h:745
pf::rvsamp::UnivNormSampler::setMean
void setMean(float_t mu)
sets the mean of the sampler.
Definition: rv_samp.h:132
pf::rvsamp::UnivInvGammaSampler::sample
float_t sample()
draws a random number.
Definition: rv_samp.h:441
pf::rvsamp::BernSampler::setP
void setP(float_t p)
sets the parameter p.
Definition: rv_samp.h:673
pf::rvsamp::UnivGammaSampler::m_alpha
float_t m_alpha
mu
Definition: rv_samp.h:353
pf::rvsamp::k_gen::k_gen
k_gen()
default constructor. only one available.
Definition: rv_samp.h:896
pf::rvsamp::UniformSampler::sample
float_t sample()
Draws a sample.
Definition: rv_samp.h:861
pf::rvsamp::UnivStudTSampler::UnivStudTSampler
UnivStudTSampler()=delete
Default-construction is deleted.
pf::rvsamp::UnivNormSampler::m_z_gen
std::normal_distribution< float_t > m_z_gen
makes normal random variates
Definition: rv_samp.h:100
pf::rvsamp::TruncUnivNormSampler::TruncUnivNormSampler
TruncUnivNormSampler(float_t mu, float_t sigma, float_t lower, float_t upper)
The user must supply both mean and std. dev.
Definition: rv_samp.h:502
pf::rvsamp::UnivNormSampler::sample
float_t sample()
Draws a random number.
Definition: rv_samp.h:146
pf::rvsamp::MVNSampler::m_mean
Vec m_mean
mean vector
Definition: rv_samp.h:751
pf::rvsamp::UnivLogNormSampler::m_mu
float_t m_mu
mu
Definition: rv_samp.h:264
pf::rvsamp::UnivLogNormSampler::sample
float_t sample()
draws a random number.
Definition: rv_samp.h:307
pf::rvsamp::UnivGammaSampler::m_gamma_gen
std::gamma_distribution< float_t > m_gamma_gen
makes gamma random variates
Definition: rv_samp.h:350
pf::rvsamp::TruncUnivNormSampler::m_z_gen
std::normal_distribution< float_t > m_z_gen
makes normal random variates
Definition: rv_samp.h:485
pf::rvsamp::MVNSampler::setCovar
void setCovar(const Mat &covMat)
sets the covariance matrix of the sampler.
Definition: rv_samp.h:777
pf::rvsamp::UnivLogNormSampler::m_z_gen
std::normal_distribution< float_t > m_z_gen
makes normal random variates
Definition: rv_samp.h:261
pf::rvsamp::UnivInvGammaSampler::m_alpha
float_t m_alpha
mu
Definition: rv_samp.h:416
pf::rvsamp::BernSampler::sample
int_t sample()
Draws a random number.
Definition: rv_samp.h:680
pf::rvsamp::UnivLogNormSampler::setMu
void setMu(float_t mu)
sets the location parameter of the logged random variable.
Definition: rv_samp.h:293
pf::rvsamp::UnivGammaSampler
A class that performs sampling from a univariate Gamma distribution.
Definition: rv_samp.h:321
pf::rvsamp::MVNSampler::MVNSampler
MVNSampler()
Default-constructor sets up for multivariate standard Normal random variate generation.
Definition: rv_samp.h:757
pf::rvsamp::TruncUnivNormSampler::m_mu
float_t m_mu
the mean
Definition: rv_samp.h:488
pf::rvsamp::UnivGammaSampler::UnivGammaSampler
UnivGammaSampler()=delete
Default-constructor ...
pf::rvsamp::TruncUnivNormSampler::sample
float_t sample()
Draws a random number.
Definition: rv_samp.h:517
pf::rvsamp::rvsamp_base::rvsamp_base
rvsamp_base()
The default constructor. This is the only option available. Sets the seed with the clock.
Definition: rv_samp.h:36
pf::rvsamp::UnivInvGammaSampler
A class that performs sampling from a univariate Inverse Gamma distribution.
Definition: rv_samp.h:384
pf::rvsamp::BernSampler::m_p
float_t m_p
the mean
Definition: rv_samp.h:654
pf::rvsamp::k_gen
A class that performs sampling with replacement (useful for the index sampler in an APF)
Definition: rv_samp.h:877
pf::rvsamp::PoissonSampler
A class that performs sampling from a Poisson distribution.
Definition: rv_samp.h:539
pf::rvsamp::UnivStudTSampler
A class that performs sampling from Student's T distribution.
Definition: rv_samp.h:160
pf::rvsamp::BetaSampler::m_first_gamma_gen
std::gamma_distribution< float_t > m_first_gamma_gen
makes gamma random variates
Definition: rv_samp.h:997
pf::rvsamp::MVNSampler
A class that performs sampling from a multivariate normal distribution.
Definition: rv_samp.h:695
pf::rvsamp::BernSampler
A class that performs sampling from a univariate Bernoulli distribution.
Definition: rv_samp.h:615
pf::rvsamp::UnivStudTSampler::sample
float_t sample()
Draws a random number.
Definition: rv_samp.h:203
pf::rvsamp::UnivLogNormSampler::setSigma
void setSigma(float_t sigma)
sets the scale parameter of the logged random variable.
Definition: rv_samp.h:300
pf::rvsamp::UnivGammaSampler::m_beta
float_t m_beta
sigma
Definition: rv_samp.h:356
pf::rvsamp::UniformSampler
A class that performs sampling from a continuous uniform distribution.
Definition: rv_samp.h:812
pf::rvsamp::UnivNormSampler::setStdDev
void setStdDev(float_t sigma)
sets the standard deviation of the sampler.
Definition: rv_samp.h:139
pf::rvsamp::MVNSampler::Vec
Eigen::Matrix< float_t, dim, 1 > Vec
Definition: rv_samp.h:700
pf::rvsamp::rvsamp_base
Base class for all random variable sampler types. Primary benefit is that it sets the seed for you.
Definition: rv_samp.h:29
pf::rvsamp::UnivInvGammaSampler::m_beta
float_t m_beta
sigma
Definition: rv_samp.h:419
pf::rvsamp::TruncUnivNormSampler::m_upper
float_t m_upper
the upper bound
Definition: rv_samp.h:497
pf::rvsamp::UniformSampler::m_unif_gen
std::uniform_real_distribution< float_t > m_unif_gen
makes uniform random variates
Definition: rv_samp.h:839
pf::rvsamp::UnivInvGammaSampler::UnivInvGammaSampler
UnivInvGammaSampler()
Default-constructor ...
Definition: rv_samp.h:425
pf::rvsamp::k_gen::sample
std::array< unsigned int, N > sample(const std::array< float_t, N > &logWts)
sample N times from (0,1,...N-1)
Definition: rv_samp.h:900
pf::rvsamp::BetaSampler::m_beta
float_t m_beta
the second shape parameter
Definition: rv_samp.h:1006
pf::rvsamp::UnivNormSampler::UnivNormSampler
UnivNormSampler()
Default-constructor sets up for standard Normal random variate generation.
Definition: rv_samp.h:112
pf::rvsamp::UnivLogNormSampler
A class that performs sampling from a univariate Log-Normal distribution.
Definition: rv_samp.h:217
pf::rvsamp::TruncUnivNormSampler::m_lower
float_t m_lower
the lower bound
Definition: rv_samp.h:494
pf::rvsamp::UnivNormSampler
A class that performs sampling from a univariate Normal distribution.
Definition: rv_samp.h:56
pf::rvsamp::TruncUnivNormSampler::m_sigma
float_t m_sigma
the standard deviation
Definition: rv_samp.h:491
pf::rvsamp::BetaSampler
A class that performs sampling from a Beta distribution.
Definition: rv_samp.h:967
pf::rvsamp::UnivNormSampler::m_sigma
float_t m_sigma
the standard deviation
Definition: rv_samp.h:106
pf::rvsamp::PoissonSampler::sample
int_t sample()
Draws a random number.
Definition: rv_samp.h:601
pf::rvsamp::UnivGammaSampler::sample
float_t sample()
draws a random number.
Definition: rv_samp.h:370
pf::rvsamp::UniformSampler::UniformSampler
UniformSampler()
The default constructor. Gives a lower bound of 0 and upper bound of 1.
Definition: rv_samp.h:845
pf::rvsamp::rvsamp_base::m_rng
std::mt19937 m_rng
prng
Definition: rv_samp.h:43
pf::rvsamp::BernSampler::m_B_gen
std::bernoulli_distribution m_B_gen
makes normal random variates
Definition: rv_samp.h:651
pf::rvsamp::BetaSampler::sample
float_t sample()
Draws a random number.
Definition: rv_samp.h:1021
pf::rvsamp::BetaSampler::m_alpha
float_t m_alpha
the first shape parameter
Definition: rv_samp.h:1003
pf::rvsamp::MVNSampler::sample
auto sample() -> Vec
Draws a random vector.
Definition: rv_samp.h:792
pf::rvsamp::BetaSampler::m_second_gamma_gen
std::gamma_distribution< float_t > m_second_gamma_gen
makes other gamma random variates
Definition: rv_samp.h:1000
pf::rvsamp::BernSampler::BernSampler
BernSampler()
Default-constructor sets up for Bernoulli random variate generation with p = .5.
Definition: rv_samp.h:659
pf::rvsamp::PoissonSampler::setLambda
void setLambda(float_t lambda)
sets the parameter lambda.
Definition: rv_samp.h:594