44 #ifndef ROL_MONTECARLOGENERATORDEF_HPP
45 #define ROL_MONTECARLOGENERATORDEF_HPP
49 template<
typename Real>
51 std::vector<Real> coeff;
54 Real tmp = c * (std::sqrt(pi)/two * input);
58 while (std::abs(tmp) > tol*std::abs(val)) {
60 for (
unsigned i = 0; i < coeff.size(); ++i )
61 c += coeff[i]*coeff[coeff.size()-1-i]/
static_cast<Real
>((i+1)*(2*i+1));
62 Real ind =
static_cast<Real
>(cnt);
63 tmp = c/(two*ind+one) * std::pow(std::sqrt(pi)/two*input, two*ind+one);
71 template<
typename Real>
73 return static_cast<Real
>(rand())/static_cast<Real>(RAND_MAX);
76 template<
typename Real>
78 if (!refine) srand(seed_);
79 const Real
zero(0), one(1), two(2), tol(0.1);
81 const int dim = (!useDist_ ? data_.size() : dist_.size());
82 std::vector<Real> pts(nSamp*dim,
zero);
85 for (
int i = 0; i < nSamp; ++i) {
87 for (
int j = 0; j <
dim; ++j) {
89 pts[j + i*
dim] = std::sqrt(two*(data_[j])[1])*ierf(two*
random()-one) + (data_[j])[0];
91 pts[j + i*
dim] = ((data_[j])[1]-(data_[j])[0])*
random()+(data_[j])[0];
95 for (
int j = 0; j <
dim; ++j) {
96 pts[j + i*
dim] = (dist_[j])->invertCDF(
random());
97 while (std::abs(pts[j + i*dim]) > tol*ROL_INF<Real>())
98 pts[j + i*
dim] = (dist_[j])->invertCDF(
random());
106 int frac = nSamp / nProc;
107 int rem = nSamp % nProc;
108 int N = frac + ((rank < rem) ? 1 : 0);
110 for (
int i = 0; i < rank; ++i) offset += frac + ((i < rem) ? 1 : 0);
111 std::vector<std::vector<Real>> mypts;
112 std::vector<Real> pt(dim);
113 for (
int i = 0; i < N; ++i) {
115 for (
int j = 0; j <
dim; ++j) pt[j] = pts[j + I*dim];
119 std::vector<Real> mywts(N, one/static_cast<Real>(nSamp));
126 template<
typename Real>
130 bool use_SA,
bool adaptive,
int numNewSamps,
int seed)
137 numNewSamps_(numNewSamps),
145 ROL_TEST_FOR_EXCEPTION(
nSamp_ < nProc, std::invalid_argument,
146 ">>> ERROR (ROL::MonteCarloGenerator): Total number of samples is less than the number of batches!");
150 template<
typename Real>
152 std::vector<std::vector<Real>> &bounds,
154 bool use_SA,
bool adaptive,
int numNewSamps,
int seed)
160 numNewSamps_(numNewSamps),
168 ROL_TEST_FOR_EXCEPTION(
nSamp_ < nProc, std::invalid_argument,
169 ">>> ERROR (ROL::MonteCarloGenerator): Total number of samples is less than the number of batches!");
170 unsigned dim = bounds.size();
173 for (
unsigned j = 0; j <
dim; ++j ) {
174 if ( (bounds[j])[0] > (bounds[j])[1] ) {
175 tmp = (bounds[j])[0];
176 (bounds[j])[0] = (bounds[j])[1];
177 (bounds[j])[1] = tmp;
178 data_.push_back(bounds[j]);
180 data_.push_back(bounds[j]);
185 template<
typename Real>
187 const std::vector<Real> &mean,
188 const std::vector<Real> &std,
190 bool use_SA,
bool adaptive,
int numNewSamps,
int seed)
196 numNewSamps_(numNewSamps),
204 ROL_TEST_FOR_EXCEPTION(
nSamp_ < nProc, std::invalid_argument,
205 ">>> ERROR (ROL::MonteCarloGenerator): Total number of samples is less than the number of batches!");
206 unsigned dim = mean.size();
208 for (
unsigned j = 0; j <
dim; ++j )
209 data_.push_back({mean[j],std[j]});
210 sample(nSamp_,
true,
false);
213 template<
typename Real>
216 sum_val_ =
static_cast<Real
>(0);
217 sum_val2_ =
static_cast<Real
>(0);
218 sum_ng_ =
static_cast<Real
>(0);
219 sum_ng_ =
static_cast<Real
>(0);
220 if ( use_SA_ ) sample(nSamp_,
true,
true);
223 template<
typename Real>
226 if ( adaptive_ && !use_SA_ ) {
227 const Real
zero(0), one(1), tol(1e-8);
231 sum_val_ += vals[cnt];
232 sum_val2_ += vals[cnt]*vals[cnt];
235 Real mymean = sum_val_ /
static_cast<Real
>(nSamp_);
239 Real myvar = (sum_val2_ - mean*mean)/(static_cast<Real>(nSamp_)-one);
244 err = std::sqrt(var/static_cast<Real>(nSamp_))*tol;
252 template<
typename Real>
256 if ( adaptive_ && !use_SA_ ) {
257 const Real
zero(0), one(1), tol(1e-4);
262 ng = (vals[cnt])->norm();
267 Real mymean = sum_ng_ /
static_cast<Real
>(nSamp_);
271 Real myvar = (sum_ng2_ - mean*mean)/(static_cast<Real>(nSamp_)-one);
276 err = std::sqrt(var/static_cast<Real>(nSamp_))*tol;
284 template<
typename Real>
286 if ( adaptive_ && !use_SA_ ) {
287 std::vector<std::vector<Real>> pts;
288 for (
int i = 0; i < SampleGenerator<Real>::numMySamples(); ++i )
290 std::vector<std::vector<Real>> pts_new = sample(numNewSamps_,
false,
true);
291 pts.insert(pts.end(),pts_new.begin(),pts_new.end());
292 nSamp_ += numNewSamps_;
293 std::vector<Real> wts(pts.size(),
static_cast<Real
>(1)/static_cast<Real>(nSamp_));
300 template<
typename Real>
Real ierf(Real input) const
MonteCarloGenerator(int nSamp, const std::vector< Ptr< Distribution< Real >>> &dist, const Ptr< BatchManager< Real >> &bman, bool use_SA=false, bool adaptive=false, int numNewSamps=0, int seed=123454321)
virtual void update(const Vector< Real > &u, const Vector< Real > &z, bool flag=true, int iter=-1) override
void broadcast(Real *input, int cnt, int root) const
Defines the linear algebra or vector space interface.
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
static constexpr Real pi() noexcept
Real random(const ROL::Ptr< const Teuchos::Comm< int > > &comm)
int numBatches(void) const
void setPoints(std::vector< std::vector< Real > > &p)
std::vector< std::vector< Real > > sample(int nSamp, bool store=true, bool refine=false)
void setWeights(std::vector< Real > &w)
std::vector< std::vector< Real > > data_