@@ -107,13 +107,10 @@ namespace QuantLib {
107107 }
108108
109109
110- SobolBrownianGenerator::SobolBrownianGenerator (Size factors,
110+ SobolBrownianGeneratorBase::SobolBrownianGeneratorBase (Size factors,
111111 Size steps,
112- Ordering ordering,
113- unsigned long seed,
114- SobolRsg::DirectionIntegers integers)
112+ Ordering ordering)
115113 : factors_(factors), steps_(steps), ordering_(ordering),
116- generator_ (SobolRsg(factors * steps, seed, integers), InverseCumulativeNormal()),
117114 bridge_ (steps), orderedIndices_(factors, std::vector<Size>(steps)),
118115 bridgedVariates_(factors, std::vector<Real>(steps)) {
119116
@@ -133,12 +130,8 @@ namespace QuantLib {
133130 }
134131
135132
136- Real SobolBrownianGenerator::nextPath () {
137- typedef InverseCumulativeRsg<SobolRsg,
138- InverseCumulativeNormal>::sample_type
139- sample_type;
140-
141- const sample_type& sample = generator_.nextSequence ();
133+ Real SobolBrownianGeneratorBase::nextPath () {
134+ const auto & sample = nextSequence ();
142135 // Brownian-bridge the variates according to the ordered indices
143136 for (Size i=0 ; i<factors_; ++i) {
144137 bridge_.transform (boost::make_permutation_iterator (
@@ -155,11 +148,11 @@ namespace QuantLib {
155148
156149
157150 const std::vector<std::vector<Size> >&
158- SobolBrownianGenerator ::orderedIndices () const {
151+ SobolBrownianGeneratorBase ::orderedIndices () const {
159152 return orderedIndices_;
160153 }
161154
162- std::vector<std::vector<Real> > SobolBrownianGenerator ::transform (
155+ std::vector<std::vector<Real> > SobolBrownianGeneratorBase ::transform (
163156 const std::vector<std::vector<Real> >& variates) {
164157
165158 QL_REQUIRE ( (variates.size () == factors_*steps_),
@@ -190,7 +183,7 @@ namespace QuantLib {
190183 return retVal;
191184 }
192185
193- Real SobolBrownianGenerator ::nextStep (std::vector<Real>& output) {
186+ Real SobolBrownianGeneratorBase ::nextStep (std::vector<Real>& output) {
194187 #if defined(QL_EXTRA_SAFETY_CHECKS)
195188 QL_REQUIRE (output.size () == factors_, " size mismatch" );
196189 QL_REQUIRE (lastStep_<steps_, " sequence exhausted" );
@@ -201,11 +194,21 @@ namespace QuantLib {
201194 return 1.0 ;
202195 }
203196
204- Size SobolBrownianGenerator ::numberOfFactors () const { return factors_; }
197+ Size SobolBrownianGeneratorBase ::numberOfFactors () const { return factors_; }
205198
206- Size SobolBrownianGenerator ::numberOfSteps () const { return steps_; }
199+ Size SobolBrownianGeneratorBase ::numberOfSteps () const { return steps_; }
207200
201+ SobolBrownianGenerator::SobolBrownianGenerator (Size factors,
202+ Size steps,
203+ Ordering ordering,
204+ unsigned long seed,
205+ SobolRsg::DirectionIntegers integers)
206+ : SobolBrownianGeneratorBase(factors, steps, ordering, seed, integers),
207+ generator_(SobolRsg(factors * steps, seed, integers), InverseCumulativeNormal()) {}
208208
209+ const std::vector<Real>& SobolBrownianGenerator::nextSequence () {
210+ return generator_.nextSequence ();
211+ }
209212
210213 SobolBrownianGeneratorFactory::SobolBrownianGeneratorFactory (
211214 SobolBrownianGenerator::Ordering ordering,
@@ -220,5 +223,32 @@ namespace QuantLib {
220223 seed_, integers_));
221224 }
222225
226+ Burley2020SobolBrownianGenerator::Burley2020SobolBrownianGenerator (
227+ Size factors,
228+ Size steps,
229+ Ordering ordering,
230+ unsigned long seed,
231+ SobolRsg::DirectionIntegers integers,
232+ unsigned long scrambleSeed)
233+ : SobolBrownianGeneratorBase(factors, steps, ordering, seed, integers),
234+ generator_(Burley2020SobolRsg(factors * steps, seed, integers, scrambleSeed),
235+ InverseCumulativeNormal()) {}
236+
237+ const std::vector<Real>& Burley2020xSobolBrownianGenerator::nextSequence () {
238+ return generator_.nextSequence ();
239+ }
240+
241+ Burley2020SobolBrownianGeneratorFactory::Burley2020SobolBrownianGeneratorFactory (
242+ SobolBrownianGenerator::Ordering ordering,
243+ unsigned long seed,
244+ SobolRsg::DirectionIntegers integers,
245+ unsigned long scrambleSeed)
246+ : ordering_(ordering), seed_(seed), integers_(integers), scrambleSeed_(scrambleSeed) {}
247+
248+ ext::shared_ptr<BrownianGenerator>
249+ Burley2020SobolBrownianGeneratorFactory::create (Size factors, Size steps) const {
250+ return ext::shared_ptr<BrownianGenerator>(new Burley2020SobolBrownianGenerator (
251+ factors, steps, ordering_, seed_, integers_, scrambleSeed_));
252+ }
223253}
224254
0 commit comments