10 #include <boost/make_shared.hpp>
12 #include <stdair/basic/BasConst_General.hpp>
13 #include <stdair/basic/BasConst_Inventory.hpp>
14 #include <stdair/basic/BasConst_Request.hpp>
15 #include <stdair/bom/BookingRequestStruct.hpp>
16 #include <stdair/service/Logger.hpp>
24 DemandStream::DemandStream()
25 : _key (stdair::DEFAULT_ORIGIN, stdair::DEFAULT_DESTINATION,
26 stdair::DEFAULT_DEPARTURE_DATE, stdair::DEFAULT_CABIN_CODE),
38 _firstDateTimeRequest (true) {
43 DemandStream::DemandStream (
const DemandStream&)
44 : _key (stdair::DEFAULT_ORIGIN, stdair::DEFAULT_DESTINATION,
45 stdair::DEFAULT_DEPARTURE_DATE, stdair::DEFAULT_CABIN_CODE),
57 _firstDateTimeRequest (true) {
62 DemandStream::DemandStream (
const Key_T& iKey) :
72 std::ostringstream oStr;
86 const stdair::WTP_T& iMinWTP,
89 stdair::BaseGenerator_T& ioSharedGenerator,
90 const stdair::RandomSeed_T& iRequestDateTimeSeed,
91 const stdair::RandomSeed_T& iDemandCharacteristicsSeed,
95 iChannelProbMass, iTripTypeProbMass,
96 iStayDurationProbMass, iFrequentFlyerProbMass,
97 iPreferredDepartureTimeContinuousDistribution,
98 iMinWTP, iValueOfTimeContinuousDistribution);
107 init (ioSharedGenerator);
112 std::ostringstream oStr;
114 oStr <<
"Demand stream key: " <<
_key.
toString() << std::endl;
129 oStr <<
"Random generator for date-time: "
131 oStr <<
"Random generator for demand characteristics: "
141 void DemandStream::init (stdair::BaseGenerator_T& ioSharedGenerator) {
145 const stdair::RealNumber_T lSigma =
148 stdair::NormalDistribution_T lDistrib (lMu, lSigma);
149 stdair::NormalGenerator_T lNormalGen (ioSharedGenerator, lDistrib);
151 const stdair::RealNumber_T lRealNumberOfRequestsToBeGenerated =lNormalGen();
153 const stdair::NbOfRequests_T lIntegerNumberOfRequestsToBeGenerated =
154 std::floor (lRealNumberOfRequestsToBeGenerated + 0.5);
158 _stillHavingRequestsToBeGenerated =
true;
159 _firstDateTimeRequest =
true;
166 const stdair::DemandGenerationMethod::EN_DemandGenerationMethod& lENDemandGenerationMethod =
167 iDemandGenerationMethod.getMethod();
168 if (lENDemandGenerationMethod == stdair::DemandGenerationMethod::STA_ORD) {
169 bool hasStillHavingRequestsToBeGenerated =
true;
172 const stdair::Count_T lNbOfRequestsGeneratedSoFar =
175 const stdair::Count_T lRemainingNumberOfRequestsToBeGenerated =
178 if (lRemainingNumberOfRequestsToBeGenerated <= 0) {
179 hasStillHavingRequestsToBeGenerated =
false;
182 return hasStillHavingRequestsToBeGenerated;
184 return _stillHavingRequestsToBeGenerated;
195 const stdair::Time_T lHardcodedReferenceDepartureTime =
196 boost::posix_time::hours (8);
199 const stdair::DateTime_T lDepartureDateTime =
201 lHardcodedReferenceDepartureTime);
204 if (_firstDateTimeRequest) {
205 const stdair::Probability_T lProbabilityFirstRequest = 0;
209 _dateTimeLastRequest =
210 lArrivalPattern.
getValue (lProbabilityFirstRequest);
212 _firstDateTimeRequest =
false;
216 assert (_firstDateTimeRequest ==
false);
223 _stillHavingRequestsToBeGenerated =
false;
226 const stdair::Duration_T lDifferenceBetweenDepartureAndThisLowerBound =
231 const stdair::DateTime_T oDateTimeThisRequest =
232 lDepartureDateTime + lDifferenceBetweenDepartureAndThisLowerBound;
234 return oDateTimeThisRequest;
238 stdair::FloatDuration_T lUpperBound =
246 lDailyRate *= lDemandMean;
249 const stdair::FloatDuration_T lExponentialVariable =
253 const stdair::FloatDuration_T lDateTimeThisRequest =
254 _dateTimeLastRequest + lExponentialVariable;
256 stdair::DateTime_T oDateTimeThisRequest;
259 if (lDateTimeThisRequest < lUpperBound) {
262 const stdair::Duration_T lDifferenceBetweenDepartureAndThisRequest =
266 oDateTimeThisRequest = lDepartureDateTime
267 + lDifferenceBetweenDepartureAndThisRequest;
270 _dateTimeLastRequest = lDateTimeThisRequest;
275 const double lRefDateTimeThisRequest = lDateTimeThisRequest + double(28800.001/86400.0);
276 STDAIR_LOG_NOTIFICATION (boost::gregorian::to_iso_string(
_key.
getPreferredDepartureDate()) <<
";" << std::setprecision(10) << lRefDateTimeThisRequest);
281 _dateTimeLastRequest = lUpperBound;
287 return oDateTimeThisRequest;
315 const stdair::Count_T& lNbOfRequestsGeneratedSoFar =
320 const stdair::Count_T lRemainingNumberOfRequestsToBeGenerated =
324 assert (lRemainingNumberOfRequestsToBeGenerated > 0);
328 const double lRemainingRate =
329 1.0 /
static_cast<double> (lRemainingNumberOfRequestsToBeGenerated);
333 const stdair::Probability_T& lCumulativeProbabilitySoFar =
335 const stdair::Probability_T lComplementOfCumulativeProbabilitySoFar =
336 1.0 - lCumulativeProbabilitySoFar;
341 double lFactor = std::pow (1.0 - lVariate, lRemainingRate);
342 if (lFactor >= 1.0 - 1e-6){
343 lFactor = 1.0 - 1e-6;
349 const stdair::Probability_T lCumulativeProbabilityThisRequest =
350 1.0 - lComplementOfCumulativeProbabilitySoFar * lFactor;
355 const stdair::FloatDuration_T lNumberOfDaysBetweenDepartureAndThisRequest =
358 const stdair::Duration_T lDifferenceBetweenDepartureAndThisRequest =
361 const stdair::Time_T lHardcodedReferenceDepartureTime =
362 boost::posix_time::hours (8);
364 const stdair::DateTime_T lDepartureDateTime =
366 lHardcodedReferenceDepartureTime);
369 const stdair::DateTime_T oDateTimeThisRequest =
370 lDepartureDateTime + lDifferenceBetweenDepartureAndThisRequest;
383 double lRefNumberOfDaysBetweenDepartureAndThisRequest =
384 lNumberOfDaysBetweenDepartureAndThisRequest + double(1.0/3.0);
385 STDAIR_LOG_NOTIFICATION (boost::gregorian::to_iso_string(
_key.
getPreferredDepartureDate()) <<
";" << std::setprecision(10) << lRefNumberOfDaysBetweenDepartureAndThisRequest);
387 return oDateTimeThisRequest;
396 const stdair::FloatDuration_T lNumberOfSeconds =
397 iNumberOfDays * stdair::SECONDS_IN_ONE_DAY;
400 const stdair::IntDuration_T lIntNumberOfSeconds =
401 std::floor (lNumberOfSeconds);
404 const stdair::FloatDuration_T lNumberOfMilliseconds =
405 (lNumberOfSeconds - lIntNumberOfSeconds)
406 * stdair::MILLISECONDS_IN_ONE_SECOND;
410 const stdair::IntDuration_T lIntNumberOfMilliseconds =
411 std::floor (lNumberOfMilliseconds) + 1;
414 const stdair::Duration_T lDifferenceBetweenDepartureAndThisRequest =
415 boost::posix_time::seconds (lIntNumberOfSeconds)
416 + boost::posix_time::millisec (lIntNumberOfMilliseconds);
418 return lDifferenceBetweenDepartureAndThisRequest;
434 const stdair::Probability_T lVariate =
443 const stdair::Probability_T lVariate =
452 const stdair::Probability_T lVariate =
461 const stdair::Probability_T lVariate =
470 const stdair::Probability_T lVariate =
473 _preferredDepartureTimeCumulativeDistribution.getValue (lVariate);
475 const stdair::Duration_T oTime = boost::posix_time::seconds (lNbOfSeconds);
483 const stdair::Date_T& iDepartureDate,
484 const stdair::DateTime_T& iDateTimeThisRequest,
485 const stdair::DayDuration_T& iDurationOfStay) {
486 const stdair::Date_T lDateThisRequest = iDateTimeThisRequest.date();
487 const stdair::DateOffset_T lAP = iDepartureDate - lDateThisRequest;
488 const stdair::DayDuration_T lAPInDays = lAP.days();
490 stdair::RealNumber_T lProb = -lAPInDays;
492 if (lProb < 0.0) { lProb = 0.0; }
493 stdair::RealNumber_T lFrat5Coef =
497 * (1.0 + (lFrat5Coef - 1.0) * log(ioGenerator()) / log(0.5));
505 const stdair::Probability_T lVariate =
514 const stdair::DemandGenerationMethod& iDemandGenerationMethod) {
521 const stdair::Date_T& lPreferredDepartureDate =
526 const stdair::NbOfSeats_T lPartySize = stdair::DEFAULT_PARTY_SIZE;
531 stdair::DateTime_T lDateTimeThisRequest;
532 const stdair::DemandGenerationMethod::EN_DemandGenerationMethod& lENDemandGenerationMethod =
533 iDemandGenerationMethod.getMethod();
534 switch(lENDemandGenerationMethod) {
535 case stdair::DemandGenerationMethod::POI_PRO:
537 case stdair::DemandGenerationMethod::STA_ORD:
539 default: assert (
false);
break;
551 const stdair::Duration_T lPreferredDepartureTime =
556 const stdair::WTP_T lWTP =
generateWTP (ioGenerator,lPreferredDepartureDate,
557 lDateTimeThisRequest,lStayDuration);
570 stdair::BookingRequestPtr_T oBookingRequest_ptr =
571 stdair::BookingRequestPtr_T
572 (
new stdair::BookingRequestStruct (
describeKey(), lOrigin,
574 lPreferredDepartureDate,
575 lDateTimeThisRequest,
576 lPreferredCabin, lPartySize,
577 lChannelLabel, lTripType,
578 lStayDuration, lFrequentFlyer,
579 lPreferredDepartureTime,
580 lWTP, lValueOfTime));
585 return oBookingRequest_ptr;
591 init (ioSharedGenerator);