20#include <ql/models/marketmodels/browniangenerators/sobolbrowniangenerator.hpp>
21#include <boost/iterator/permutation_iterator.hpp>
27 void fillByFactor(std::vector<std::vector<Size> >& M,
30 for (
Size i=0; i<factors; ++i)
31 for (
Size j=0; j<steps; ++j)
35 void fillByStep(std::vector<std::vector<Size> >& M,
38 for (
Size j=0; j<steps; ++j)
39 for (
Size i=0; i<factors; ++i)
44 void fillByDiagonal(std::vector<std::vector<Size> >& M,
51 while (counter < factors*steps) {
53 if (i == 0 || j == steps-1) {
115 : factors_(factors), steps_(steps), ordering_(ordering),
117 bridge_(steps), orderedIndices_(factors,
std::vector<
Size>(steps)),
118 bridgedVariates_(factors,
std::vector<
Real>(steps)) {
131 QL_FAIL(
"unknown ordering");
141 const sample_type& sample =
generator_.nextSequence();
145 sample.value.begin(),
147 boost::make_permutation_iterator(
148 sample.value.begin(),
153 return sample.weight;
157 const std::vector<std::vector<Size> >&
163 const std::vector<std::vector<Real> >& variates) {
166 "inconsistent variate vector");
169 const Size nPaths = variates.front().size();
171 std::vector<std::vector<Real> >
174 for (
Size j=0; j < nPaths; ++j) {
176 for (
Size k=0; k < dim; ++k) {
177 sample[k] = variates[k][j];
183 boost::make_permutation_iterator(
186 retVal[i].begin()+j*
steps_);
194 #if defined(QL_EXTRA_SAFETY_CHECKS)
195 QL_REQUIRE(output.size() ==
factors_,
"size mismatch");
214 : ordering_(ordering), seed_(seed), integers_(integers) {}
216 ext::shared_ptr<BrownianGenerator>
218 return ext::shared_ptr<BrownianGenerator>(
void transform(RandomAccessIterator1 begin, RandomAccessIterator1 end, RandomAccessIterator2 output) const
Brownian-bridge generator function.
Inverse cumulative normal distribution function.
Inverse cumulative random sequence generator.
SobolBrownianGenerator::Ordering ordering_
ext::shared_ptr< BrownianGenerator > create(Size factors, Size steps) const override
SobolBrownianGeneratorFactory(SobolBrownianGenerator::Ordering ordering, unsigned long seed=0, SobolRsg::DirectionIntegers directionIntegers=SobolRsg::Jaeckel)
SobolRsg::DirectionIntegers integers_
Sobol Brownian generator for market-model simulations.
std::vector< std::vector< Size > > orderedIndices_
std::vector< std::vector< Real > > transform(const std::vector< std::vector< Real > > &variates)
Real nextStep(std::vector< Real > &) override
std::vector< std::vector< Real > > bridgedVariates_
Size numberOfFactors() const override
SobolBrownianGenerator(Size factors, Size steps, Ordering ordering, unsigned long seed=0, SobolRsg::DirectionIntegers directionIntegers=SobolRsg::Jaeckel)
Size numberOfSteps() const override
const std::vector< std::vector< Size > > & orderedIndices() const
InverseCumulativeRsg< SobolRsg, InverseCumulativeNormal > generator_
Sobol low-discrepancy sequence generator.
std::size_t Size
size of a container