adapteur pour Boost random generator
Bonjour,
J'essaye d'utiliser le generateur de variables aleatoires de Boost dans mon code en utilisant le pattern adapteur, cependant j'obtiens le message d'erreur suivant:
Citation:
1>------ Build started: Project: ex12.2, Configuration: Debug Win32 ------
1>Compiling...
1>PathDependentExoticOption.cpp
1>c:\designcpp\include\boostrandom.h(33) : error C2664: 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>::random_number_generator(boost::uniform_int<int> &)' : cannot convert parameter 1 from 'unsigned long' to 'boost::uniform_int<IntType> &'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> and
1> [
1> IntType=int
1> ]
1> c:\designcpp\include\boostrandom.h(32) : while compiling class template member function 'BoostRandom<UniformRandomNumberGenerator,IntType>::BoostRandom(unsigned long,unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\moondragon\distancelearning\cpp\code\ex12.2\pathdependentexoticoption.cpp(82) : see reference to class template instantiation 'BoostRandom<UniformRandomNumberGenerator,IntType>' being compiled
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(36) : error C2039: 'Max' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(49) : error C2039: 'GetOneRandomInteger' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(45) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::GetUniforms(MJArray &)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(67) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(63) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::SetSeed(unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(74) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(71) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::Reset(void)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(82) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(78) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::ResetDimensionality(unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>Build log was saved at "file://c:\MoonDragon\DistanceLearning\cpp\code\ex12.2\Debug\BuildLog.htm"
1>ex12.2 - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Le contenu de deux fichiers d'ou le probleme semble venir sont ci-dessous.
D'avance merci pour votre aide,
MoonDragon.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| // BoostRandom.h
#ifndef BOOST_RANDOM_H
#define BOOST_RANDOM_H
#include <Random2.h>
#include <boost/random/random_number_generator.hpp>
template<class UniformRandomNumberGenerator, class IntType = long> class BoostRandom : public RandomBase //The adaptor class
{
public:
BoostRandom(unsigned long Dimensionality, unsigned long Seed=1);
virtual RandomBase* clone() const;
virtual void GetUniforms(MJArray& variates);
virtual void Skip(unsigned long numberOfPaths);
virtual void SetSeed(unsigned long Seed);
virtual void Reset();
virtual void ResetDimensionality(unsigned long NewDimensionality);
private:
boost::random_number_generator <UniformRandomNumberGenerator, IntType> InnerGenerator; //One 'plug' Boost here!
unsigned long InitialSeed;
double Reciprocal;
};
template<class UniformRandomNumberGenerator, class IntType> BoostRandom <UniformRandomNumberGenerator , IntType>::BoostRandom(unsigned long Dimensionality, unsigned long Seed)
: RandomBase(Dimensionality), InnerGenerator(Seed), InitialSeed(Seed)
{
debugFlowTracer flow("BoostRandom::BoostRandom");
Reciprocal = 1/(1.0+InnerGenerator.Max());
}
template<class UniformRandomNumberGenerator, class IntType> RandomBase* BoostRandom <UniformRandomNumberGenerator , IntType>::clone() const
{
return new BoostRandom(*this);
}
template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::GetUniforms(MJArray& variates)
{
debugFlowTracer flow("BoostRandom::GetUniforms");
for (unsigned long j=0; j < GetDimensionality(); j++)
variates[j] = InnerGenerator.GetOneRandomInteger()*Reciprocal;
}
template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::Skip(unsigned long numberOfPaths)
{
debugFlowTracer flow("BoostRandom::Skip");
MJArray tmp(GetDimensionality());
for (unsigned long j=0; j < numberOfPaths; j++)
GetUniforms(tmp);
}
template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::SetSeed(unsigned long Seed)
{
debugFlowTracer flow("BoostRandom::SetSeed");
InitialSeed = Seed;
InnerGenerator.SetSeed(Seed);
}
template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::Reset()
{
debugFlowTracer flow("BoostRandom::Reset");
InnerGenerator.SetSeed(InitialSeed);
}
template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::ResetDimensionality(unsigned long NewDimensionality)
{
debugFlowTracer flow("BoostRandom::ResetDimensionality");
RandomBase::ResetDimensionality(NewDimensionality);
InnerGenerator.SetSeed(InitialSeed);
}
#endif |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| // PathDependentExoticOption.cpp
/*
uses source files
AntiThetic.cpp
Arrays.cpp,
ConvergenceTable.cpp,
ExoticBSEngine.cpp
ExoticEngine
MCStatistics.cpp
Normals.cpp
Parameters.cpp,
PathDependent.cpp
PathDependentAsian.cpp
PayOff3.cpp,
PayOffBridge.cpp,
Random2.cpp,
*/
#include<BoostRandom.h>
#include<MCStatistics.h>
#include<ConvergenceTable.h>
#include<AntiThetic.h>
#include<PathDependentAsian.h>
#include<ExoticBSEngine.h>
#include <FlowTracerManager.h>
#include<iostream>
using namespace std;
int main()
{
double Expiry;
double Strike;
double Spot;
double Vol;
double r;
double d;
unsigned long NumberOfPaths;
unsigned NumberOfDates;
cout << "\nEnter expiry\n";
cin >> Expiry;
cout << "\nStrike\n";
cin >> Strike;
cout << "\nEnter spot\n";
cin >> Spot;
cout << "\nEnter vol\n";
cin >> Vol;
cout << "\nr\n";
cin >> r;
cout << "\nd\n";
cin >> d;
cout << "Number of dates\n";
cin >> NumberOfDates;
cout << "\nNumber of paths\n";
cin >> NumberOfPaths;
PayOffCall thePayOff(Strike);
MJArray times(NumberOfDates);
for (unsigned long i=0; i < NumberOfDates; i++)
times[i] = (i+1.0)*Expiry/NumberOfDates;
ParametersConstant VolParam(Vol);
ParametersConstant rParam(r);
ParametersConstant dParam(d);
PathDependentAsian theOption(times, Expiry, thePayOff);
StatisticsMean gatherer;
ConvergenceTable gathererTwo(gatherer);
class BoostRandom <boost::uniform_int<int>, long> generator(NumberOfDates);
AntiThetic GenTwo(generator);
ExoticBSEngine theEngine(theOption, rParam, dParam, VolParam, GenTwo, Spot);
theEngine.DoSimulation(gathererTwo, NumberOfPaths);
vector<vector<double> > results =gathererTwo.GetResultsSoFar();
cout <<"\nFor the Asian call price the results are \n";
{
for (unsigned long i=0; i < results.size(); i++)
{
for (unsigned long j=0; j < results[i].size(); j++)
cout << results[i][j] << " ";
cout << "\n";
}
}
double tmp;
cin >> tmp;
return 0;
} |