7 #include <boost/make_shared.hpp> 9 #include <stdair/stdair_inventory_types.hpp> 10 #include <stdair/basic/BasChronometer.hpp> 11 #include <stdair/basic/ContinuousAttributeLite.hpp> 12 #include <stdair/bom/BomManager.hpp> 13 #include <stdair/bom/BomRetriever.hpp> 14 #include <stdair/bom/BomRoot.hpp> 15 #include <stdair/bom/Inventory.hpp> 16 #include <stdair/bom/FlightDate.hpp> 17 #include <stdair/bom/LegCabin.hpp> 18 #include <stdair/bom/LegDate.hpp> 19 #include <stdair/bom/YieldFeatures.hpp> 20 #include <stdair/bom/AirportPair.hpp> 21 #include <stdair/bom/PosChannel.hpp> 22 #include <stdair/bom/DatePeriod.hpp> 23 #include <stdair/bom/TimePeriod.hpp> 24 #include <stdair/bom/AirlineClassList.hpp> 25 #include <stdair/basic/BasConst_Request.hpp> 26 #include <stdair/basic/BasConst_Inventory.hpp> 27 #include <stdair/bom/Inventory.hpp> 28 #include <stdair/bom/FlightDate.hpp> 29 #include <stdair/bom/SegmentDate.hpp> 30 #include <stdair/bom/SegmentCabin.hpp> 31 #include <stdair/bom/BookingClass.hpp> 32 #include <stdair/bom/OnDDate.hpp> 33 #include <stdair/bom/OnDDateTypes.hpp> 34 #include <stdair/command/CmdBomManager.hpp> 35 #include <stdair/service/Logger.hpp> 36 #include <stdair/STDAIR_Service.hpp> 50 RMOL_Service::RMOL_Service()
51 : _rmolServiceContext (NULL),
52 _previousForecastDate (
stdair::Date_T (2000, 1, 1)) {
57 RMOL_Service::RMOL_Service (
const RMOL_Service& iService) :
58 _rmolServiceContext (NULL),
59 _previousForecastDate (
stdair::Date_T (2000, 1, 1)) {
64 RMOL_Service::RMOL_Service (
const stdair::BasLogParams& iLogParams) :
65 _rmolServiceContext (NULL),
66 _previousForecastDate (
stdair::Date_T (2000, 1, 1)) {
69 stdair::STDAIR_ServicePtr_T lSTDAIR_Service_ptr =
70 initStdAirService (iLogParams);
77 const bool ownStdairService =
true;
78 addStdAirService (lSTDAIR_Service_ptr, ownStdairService);
85 RMOL_Service::RMOL_Service (
const stdair::BasLogParams& iLogParams,
86 const stdair::BasDBParams& iDBParams) :
87 _rmolServiceContext (NULL),
88 _previousForecastDate (
stdair::Date_T (2000, 1, 1)) {
91 stdair::STDAIR_ServicePtr_T lSTDAIR_Service_ptr =
92 initStdAirService (iLogParams, iDBParams);
99 const bool ownStdairService =
true;
100 addStdAirService (lSTDAIR_Service_ptr, ownStdairService);
107 RMOL_Service::RMOL_Service (stdair::STDAIR_ServicePtr_T ioSTDAIRServicePtr)
108 : _rmolServiceContext (NULL),
109 _previousForecastDate (
stdair::Date_T (2000, 1, 1)) {
112 initServiceContext();
116 const bool doesNotOwnStdairService =
false;
117 addStdAirService (ioSTDAIRServicePtr, doesNotOwnStdairService);
130 void RMOL_Service::finalise() {
131 assert (_rmolServiceContext != NULL);
133 _rmolServiceContext->reset();
137 void RMOL_Service::initServiceContext() {
139 RMOL_ServiceContext& lRMOL_ServiceContext =
141 _rmolServiceContext = &lRMOL_ServiceContext;
146 addStdAirService (stdair::STDAIR_ServicePtr_T ioSTDAIR_Service_ptr,
147 const bool iOwnStdairService) {
150 assert (_rmolServiceContext != NULL);
151 RMOL_ServiceContext& lRMOL_ServiceContext = *_rmolServiceContext;
154 lRMOL_ServiceContext.setSTDAIR_Service (ioSTDAIR_Service_ptr,
159 stdair::STDAIR_ServicePtr_T RMOL_Service::
160 initStdAirService (
const stdair::BasLogParams& iLogParams) {
169 stdair::STDAIR_ServicePtr_T lSTDAIR_Service_ptr =
170 boost::make_shared<stdair::STDAIR_Service> (iLogParams);
172 return lSTDAIR_Service_ptr;
176 stdair::STDAIR_ServicePtr_T RMOL_Service::
177 initStdAirService (
const stdair::BasLogParams& iLogParams,
178 const stdair::BasDBParams& iDBParams) {
187 stdair::STDAIR_ServicePtr_T lSTDAIR_Service_ptr =
188 boost::make_shared<stdair::STDAIR_Service> (iLogParams, iDBParams);
190 return lSTDAIR_Service_ptr;
194 void RMOL_Service::initRmolService() {
202 const stdair::Filename_T& iInputFileName) {
205 if (_rmolServiceContext == NULL) {
206 throw stdair::NonInitialisedServiceException (
"The RMOL service has not" 207 " been initialised");
209 assert (_rmolServiceContext != NULL);
211 const bool doesOwnStdairService =
212 lRMOL_ServiceContext.getOwnStdairServiceFlag();
215 stdair::STDAIR_Service& lSTDAIR_Service =
216 lRMOL_ServiceContext.getSTDAIR_Service();
217 stdair::BomRoot& lPersistentBomRoot =
218 lSTDAIR_Service.getPersistentBomRoot();
223 lSTDAIR_Service.buildDummyInventory (iCabinCapacity);
252 if (doesOwnStdairService ==
true) {
263 if (_rmolServiceContext == NULL) {
264 throw stdair::NonInitialisedServiceException (
"The RMOL service has not" 265 " been initialised");
267 assert (_rmolServiceContext != NULL);
272 const bool doesOwnStdairService =
273 lRMOL_ServiceContext.getOwnStdairServiceFlag();
276 stdair::STDAIR_Service& lSTDAIR_Service =
277 lRMOL_ServiceContext.getSTDAIR_Service();
278 stdair::BomRoot& lPersistentBomRoot =
279 lSTDAIR_Service.getPersistentBomRoot();
285 if (doesOwnStdairService ==
true) {
287 lSTDAIR_Service.buildSampleBom();
311 if (doesOwnStdairService ==
true) {
322 if (_rmolServiceContext == NULL) {
323 throw stdair::NonInitialisedServiceException(
"The RMOL service has not " 326 assert (_rmolServiceContext != NULL);
331 const bool doesOwnStdairService =
332 lRMOL_ServiceContext.getOwnStdairServiceFlag();
335 stdair::STDAIR_Service& lSTDAIR_Service =
336 lRMOL_ServiceContext.getSTDAIR_Service();
342 if (doesOwnStdairService ==
true) {
345 lSTDAIR_Service.clonePersistentBom ();
351 stdair::BomRoot& lBomRoot =
352 lSTDAIR_Service.getBomRoot();
360 if (_rmolServiceContext == NULL) {
361 throw stdair::NonInitialisedServiceException(
"The RMOL service has not " 364 assert (_rmolServiceContext != NULL);
371 stdair::STDAIR_Service& lSTDAIR_Service =
372 lRMOL_ServiceContext.getSTDAIR_Service();
378 lSTDAIR_Service.buildDummyLegSegmentAccesses (ioBomRoot);
384 optimize<OptimizationType::OPT_MC> (
const stdair::NbOfSamples_T iDraws) {
388 optimalOptimisationByMCIntegration (iDraws);
394 optimize<OptimizationType::OPT_DP> (
const stdair::NbOfSamples_T iDraws) {
398 optimalOptimisationByDP();
404 optimize<OptimizationType::HEUR_EMSR> (
const stdair::NbOfSamples_T iDraws) {
408 heuristicOptimisationByEmsr();
414 optimize<OptimizationType::HEUR_EMSRA> (
const stdair::NbOfSamples_T iDraws) {
418 heuristicOptimisationByEmsrA();
424 optimize<OptimizationType::HEUR_EMSRB> (
const stdair::NbOfSamples_T iDraws) {
428 heuristicOptimisationByEmsrB();
434 optimize<OptimizationType::HEUR_MC_4_QFF>(
const stdair::NbOfSamples_T iDraws) {
445 optimize<OptimizationType::HEUR_EMSRB_4_QFF>(
const stdair::NbOfSamples_T iDraws) {
455 optimize<OptimizationType::HEUR_MRT_QFF> (
const stdair::NbOfSamples_T iDraws) {
465 optimalOptimisationByMCIntegration (
const stdair::NbOfSamples_T& iDraws) {
466 assert (_rmolServiceContext != NULL);
467 RMOL_ServiceContext& lRMOL_ServiceContext = *_rmolServiceContext;
470 stdair::STDAIR_Service& lSTDAIR_Service =
471 lRMOL_ServiceContext.getSTDAIR_Service();
476 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getPersistentBomRoot();
479 stdair::LegCabin& lLegCabin =
480 stdair::BomRetriever::retrieveDummyLegCabin (lBomRoot);
482 stdair::BasChronometer lOptimisationChronometer;
483 lOptimisationChronometer.start();
487 const double lOptimisationMeasure = lOptimisationChronometer.elapsed();
490 STDAIR_LOG_DEBUG (
"Optimisation by Monte-Carlo performed in " 491 << lOptimisationMeasure);
492 STDAIR_LOG_DEBUG (
"Result: " << lLegCabin.displayVirtualClassList());
494 std::ostringstream logStream;
495 stdair::BidPriceVector_T lBidPriceVector = lLegCabin.getBidPriceVector();
496 logStream <<
"Bid-Price Vector (BPV): ";
497 const unsigned int size = lBidPriceVector.size();
499 for (
unsigned int i = 0; i < size - 1; ++i) {
500 const double bidPrice = lBidPriceVector.at(i);
501 logStream << std::fixed << std::setprecision (2) << bidPrice <<
", ";
503 const double bidPrice = lBidPriceVector.at(size -1);
504 logStream << std::fixed << std::setprecision (2) << bidPrice;
505 STDAIR_LOG_DEBUG (logStream.str());
509 void RMOL_Service::optimalOptimisationByDP() {
513 void RMOL_Service::heuristicOptimisationByEmsr() {
514 assert (_rmolServiceContext != NULL);
515 RMOL_ServiceContext& lRMOL_ServiceContext = *_rmolServiceContext;
518 stdair::STDAIR_Service& lSTDAIR_Service =
519 lRMOL_ServiceContext.getSTDAIR_Service();
524 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getPersistentBomRoot();
527 stdair::LegCabin& lLegCabin =
528 stdair::BomRetriever::retrieveDummyLegCabin (lBomRoot);
530 stdair::BasChronometer lOptimisationChronometer;
531 lOptimisationChronometer.start();
535 const double lOptimisationMeasure = lOptimisationChronometer.elapsed();
537 STDAIR_LOG_DEBUG (
"Optimisation EMSR performed in " 538 << lOptimisationMeasure);
539 STDAIR_LOG_DEBUG (
"Result: " << lLegCabin.displayVirtualClassList());
541 stdair::BidPriceVector_T lBidPriceVector = lLegCabin.getBidPriceVector();
542 std::ostringstream logStream;
543 logStream <<
"Bid-Price Vector (BPV): ";
544 stdair::UnsignedIndex_T idx = 0;
545 for (stdair::BidPriceVector_T::const_iterator itBP = lBidPriceVector.begin();
546 itBP != lBidPriceVector.end(); ++itBP) {
550 const stdair::BidPrice_T& lBidPrice = *itBP;
551 logStream << std::fixed << std::setprecision (2) << lBidPrice;
554 STDAIR_LOG_DEBUG (logStream.str());
558 void RMOL_Service::heuristicOptimisationByEmsrA() {
559 assert (_rmolServiceContext != NULL);
560 RMOL_ServiceContext& lRMOL_ServiceContext = *_rmolServiceContext;
563 stdair::STDAIR_Service& lSTDAIR_Service =
564 lRMOL_ServiceContext.getSTDAIR_Service();
569 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getPersistentBomRoot();
572 stdair::LegCabin& lLegCabin =
573 stdair::BomRetriever::retrieveDummyLegCabin (lBomRoot);
578 STDAIR_LOG_DEBUG (
"Result: " << lLegCabin.displayVirtualClassList());
583 void RMOL_Service::heuristicOptimisationByEmsrB() {
584 assert (_rmolServiceContext != NULL);
585 RMOL_ServiceContext& lRMOL_ServiceContext = *_rmolServiceContext;
588 stdair::STDAIR_Service& lSTDAIR_Service =
589 lRMOL_ServiceContext.getSTDAIR_Service();
594 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getPersistentBomRoot();
597 stdair::LegCabin& lLegCabin =
598 stdair::BomRetriever::retrieveDummyLegCabin (lBomRoot);
603 STDAIR_LOG_DEBUG (
"Result: " << lLegCabin.displayVirtualClassList());
609 assert (_rmolServiceContext != NULL);
613 stdair::STDAIR_Service& lSTDAIR_Service =
614 lRMOL_ServiceContext.getSTDAIR_Service();
619 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getPersistentBomRoot();
621 const stdair::SegmentCabin& lSegmentCabin =
622 stdair::BomRetriever::retrieveDummySegmentCabin(lBomRoot,
624 return lSegmentCabin;
631 const stdair::DateTime_T& iRMEventTime,
632 const stdair::UnconstrainingMethod& iUnconstrainingMethod,
633 const stdair::ForecastingMethod& iForecastingMethod,
634 const stdair::PreOptimisationMethod& iPreOptimisationMethod,
635 const stdair::OptimisationMethod& iOptimisationMethod,
636 const stdair::PartnershipTechnique& iPartnershipTechnique) {
639 STDAIR_LOG_DEBUG (
"Forecast & Optimisation");
641 const stdair::PartnershipTechnique::EN_PartnershipTechnique& lPartnershipTechnique =
642 iPartnershipTechnique.getTechnique();
644 switch (lPartnershipTechnique) {
645 case stdair::PartnershipTechnique::NONE:{
647 STDAIR_LOG_DEBUG (
"Forecast");
652 iUnconstrainingMethod,
655 STDAIR_LOG_DEBUG (
"Forecast successful: " << isForecasted);
657 if (isForecasted ==
true) {
660 STDAIR_LOG_DEBUG (
"Pre-optimise");
662 const bool isPreOptimised =
666 STDAIR_LOG_DEBUG (
"Pre-Optimise successful: " << isPreOptimised);
668 if (isPreOptimised ==
true) {
671 STDAIR_LOG_DEBUG (
"Optimise");
672 const bool optimiseSucceeded =
675 STDAIR_LOG_DEBUG (
"Optimise successful: " << optimiseSucceeded);
676 return optimiseSucceeded ;
681 case stdair::PartnershipTechnique::RAE_DA:
682 case stdair::PartnershipTechnique::IBP_DA:{
683 if (_previousForecastDate < iRMEventTime.date()) {
691 case stdair::PartnershipTechnique::RAE_YP:
692 case stdair::PartnershipTechnique::IBP_YP:
693 case stdair::PartnershipTechnique::IBP_YP_U:{
694 if (_previousForecastDate < iRMEventTime.date()) {
702 case stdair::PartnershipTechnique::RMC:{
703 if (_previousForecastDate < iRMEventTime.date()) {
712 case stdair::PartnershipTechnique::A_RMC:{
713 if (_previousForecastDate < iRMEventTime.date()) {
733 if (_rmolServiceContext == NULL) {
734 throw stdair::NonInitialisedServiceException (
"The Rmol service " 735 "has not been initialised");
737 assert (_rmolServiceContext != NULL);
741 stdair::STDAIR_Service& lSTDAIR_Service =
742 lRMOL_ServiceContext.getSTDAIR_Service();
743 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
746 const stdair::Date_T lDate = iRMEventTime.date();
748 _previousForecastDate = lDate;
750 const stdair::InventoryList_T& lInventoryList =
751 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
752 assert (!lInventoryList.empty());
753 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
754 itInv != lInventoryList.end(); ++itInv) {
755 const stdair::Inventory* lInventory_ptr = *itInv;
756 assert (lInventory_ptr != NULL);
757 const bool hasOnDDateList =
758 stdair::BomManager::hasList<stdair::OnDDate> (*lInventory_ptr);
759 if (hasOnDDateList ==
true) {
760 const stdair::OnDDateList_T lOnDDateList =
761 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
763 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
764 itOD != lOnDDateList.end(); ++itOD) {
765 stdair::OnDDate* lOnDDate_ptr = *itOD;
766 assert (lOnDDate_ptr != NULL);
768 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
769 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
770 stdair::DTD_T lDTD = short (lDateOffset.days());
772 stdair::DCPList_T::const_iterator itDCP =
773 std::find (stdair::DEFAULT_DCP_LIST.begin(),
774 stdair::DEFAULT_DCP_LIST.end(), lDTD);
776 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
778 const stdair::CabinForecastMap_T& lTotalForecastMap =
779 lOnDDate_ptr->getTotalForecastMap();
782 for (stdair::CabinForecastMap_T::const_iterator itCF =
783 lTotalForecastMap.begin();
784 itCF != lTotalForecastMap.end(); ++itCF) {
785 const stdair::CabinCode_T lCabinCode = itCF->first;
786 stdair::YieldFeatures* lYieldFeatures_ptr =
788 if (lYieldFeatures_ptr == NULL) {
789 STDAIR_LOG_ERROR (
"Cannot find yield corresponding to " 791 << lOnDDate_ptr->toString()
792 <<
" Cabin " << lCabinCode);
795 forecastOnD (*lYieldFeatures_ptr, *lOnDDate_ptr, lCabinCode, lDTD,
807 const stdair::CabinCode_T& iCabinCode,
808 stdair::BomRoot& iBomRoot) {
810 const stdair::AirportCode_T& lOrigin = iOnDDate.getOrigin();
811 const stdair::AirportCode_T& lDestination = iOnDDate.getDestination();
813 const stdair::Date_T& lDepartureDate = iOnDDate.getDate();
816 const stdair::AirportPairKey lAirportPairKey(lOrigin, lDestination);
817 stdair::AirportPair* lAirportPair_ptr = stdair::BomManager::
818 getObjectPtr<stdair::AirportPair> (iBomRoot,
819 lAirportPairKey.toString());
820 if (lAirportPair_ptr == NULL) {
821 STDAIR_LOG_ERROR (
"Cannot find yield corresponding to the airport " 822 <<
"pair: " << lAirportPairKey.toString());
827 const stdair::DatePeriodList_T lDatePeriodList =
828 stdair::BomManager::getList<stdair::DatePeriod> (*lAirportPair_ptr);
829 for (stdair::DatePeriodList_T::const_iterator itDatePeriod =
830 lDatePeriodList.begin();
831 itDatePeriod != lDatePeriodList.end(); ++itDatePeriod) {
832 const stdair::DatePeriod* lDatePeriod_ptr = *itDatePeriod;
833 assert (lDatePeriod_ptr != NULL);
835 const bool isDepartureDateValid =
836 lDatePeriod_ptr->isDepartureDateValid (lDepartureDate);
838 if (isDepartureDateValid ==
true) {
841 const stdair::PosChannelKey lPosChannelKey (stdair::DEFAULT_POS,
842 stdair::DEFAULT_CHANNEL);
843 stdair::PosChannel* lPosChannel_ptr = stdair::BomManager::
844 getObjectPtr<stdair::PosChannel> (*lDatePeriod_ptr,
845 lPosChannelKey.toString());
846 if (lPosChannel_ptr == NULL) {
847 STDAIR_LOG_ERROR (
"Cannot find yield corresponding to the PoS-" 848 <<
"Channel: " << lPosChannelKey.toString());
852 const stdair::TimePeriodList_T lTimePeriodList = stdair::
853 BomManager::getList<stdair::TimePeriod> (*lPosChannel_ptr);
854 for (stdair::TimePeriodList_T::const_iterator itTimePeriod =
855 lTimePeriodList.begin();
856 itTimePeriod != lTimePeriodList.end(); ++itTimePeriod) {
857 const stdair::TimePeriod* lTimePeriod_ptr = *itTimePeriod;
858 assert (lTimePeriod_ptr != NULL);
861 const stdair::YieldFeaturesKey lYieldFeaturesKey (stdair::TRIP_TYPE_ONE_WAY,
863 stdair::YieldFeatures* oYieldFeatures_ptr = stdair::BomManager::
864 getObjectPtr<stdair::YieldFeatures>(*lTimePeriod_ptr,
865 lYieldFeaturesKey.toString());
866 if (oYieldFeatures_ptr != NULL) {
867 return oYieldFeatures_ptr;
880 stdair::OnDDate& iOnDDate,
881 const stdair::CabinCode_T& iCabinCode,
882 const stdair::DTD_T& iDTD,
883 stdair::BomRoot& iBomRoot) {
885 const stdair::AirlineClassListList_T lAirlineClassListList =
886 stdair::BomManager::getList<stdair::AirlineClassList> (iYieldFeatures);
887 assert (lAirlineClassListList.begin() != lAirlineClassListList.end());
890 stdair::AirlineClassListList_T::const_iterator itACL =
891 lAirlineClassListList.begin();
892 stdair::Yield_T lPreviousYield((*itACL)->getYield());
894 for (; itACL != lAirlineClassListList.end(); ++itACL) {
895 const stdair::AirlineClassList* lAirlineClassList = *itACL;
896 const stdair::Yield_T& lYield = lAirlineClassList->getYield();
897 if (lYield <= lPreviousYield) {
898 lPreviousYield = lYield;
901 STDAIR_LOG_ERROR (
"Yields should be given in a descendant order" 902 <<
" in the yield input file") ;
908 stdair::ProportionFactorList_T lProportionFactorList;
909 stdair::ProportionFactor_T lPreviousProportionFactor = 0;
912 const stdair::WTPDemandPair_T& lTotalForecast =
913 iOnDDate.getTotalForecast (iCabinCode);
914 const stdair::WTP_T& lMinWTP = lTotalForecast.first;
917 const stdair::ContinuousAttributeLite<stdair::FloatDuration_T>
918 lArrivalPattern (stdair::DEFAULT_DTD_PROB_MAP);
920 STDAIR_LOG_DEBUG (lArrivalPattern.displayCumulativeDistribution());
921 const stdair::Probability_T lRemainingProportion =
922 lArrivalPattern.getRemainingProportion(-
float(iDTD));
926 const stdair::MeanStdDevPair_T lForecatsMeanStdDevPair =
927 lTotalForecast.second;
928 const stdair::MeanValue_T& lMeanValue =
929 lForecatsMeanStdDevPair.first;
930 const stdair::MeanValue_T& lRemainingMeanValue =
931 lRemainingProportion*lMeanValue;
932 const stdair::StdDevValue_T& lStdDevValue =
933 lForecatsMeanStdDevPair.second;
934 const stdair::StdDevValue_T& lRemainingStdDevValue =
935 lRemainingProportion*lStdDevValue;
938 stdair::DTDFratMap_T::const_iterator itDFC =
939 stdair::DEFAULT_DTD_FRAT5COEF_MAP.find(iDTD);
940 if (itDFC == stdair::DEFAULT_DTD_FRAT5COEF_MAP.end()) {
941 STDAIR_LOG_ERROR (
"Cannot find frat5 coef for DTD = " << iDTD );
944 stdair::RealNumber_T lFrat5Coef =
945 stdair::DEFAULT_DTD_FRAT5COEF_MAP.at(iDTD);
947 STDAIR_LOG_DEBUG (
"Remaining proportion " << lRemainingProportion
948 <<
" Total " << lMeanValue
949 <<
" StdDev " << lStdDevValue
950 <<
"Frat5 Coef " << lFrat5Coef);
952 std::ostringstream oStr;
954 itACL = lAirlineClassListList.begin();
955 for (; itACL != lAirlineClassListList.end(); ++itACL) {
956 const stdair::AirlineClassList* lAirlineClassList_ptr = *itACL;
957 const stdair::Yield_T& lYield = lAirlineClassList_ptr->getYield();
958 stdair::ProportionFactor_T lProportionFactor =
959 exp ((lYield - lMinWTP)*log(0.5)/(lMinWTP*(lFrat5Coef-1.0)));
962 lProportionFactor = std::min (lProportionFactor, 1.0);
963 lProportionFactorList.push_back(lProportionFactor - lPreviousProportionFactor);
964 lPreviousProportionFactor = lProportionFactor;
965 oStr << lAirlineClassList_ptr->toString() << lProportionFactor <<
" ";
968 STDAIR_LOG_DEBUG (oStr.str());
971 assert (lAirlineClassListList.size() == lProportionFactorList.size());
973 STDAIR_LOG_DEBUG (
"Forecast for " << iOnDDate.describeKey()
974 <<
" " << iDTD <<
" days to departure");
977 stdair::ProportionFactorList_T::const_iterator itPF =
978 lProportionFactorList.begin();
979 itACL = lAirlineClassListList.begin();
980 for (; itACL != lAirlineClassListList.end(); ++itACL, ++itPF) {
981 const stdair::AirlineClassList* lAirlineClassList_ptr = *itACL;
982 const stdair::ProportionFactor_T& lProportionFactor = *itPF;
983 stdair::MeanValue_T lMeanValue = lProportionFactor*lRemainingMeanValue;
984 stdair::StdDevValue_T lStdDevValue =
985 lProportionFactor*lRemainingStdDevValue;
987 iOnDDate, iCabinCode, iBomRoot);
995 const stdair::MeanValue_T& iMeanValue,
996 const stdair::StdDevValue_T& iStdDevValue,
997 stdair::OnDDate& iOnDDate,
998 const stdair::CabinCode_T& iCabinCode,
999 stdair::BomRoot& iBomRoot) {
1001 const stdair::AirportCode_T& lOrigin = iOnDDate.getOrigin();
1002 const stdair::AirportCode_T& lDestination = iOnDDate.getDestination();
1004 const stdair::Date_T& lDepartureDate = iOnDDate.getDate();
1006 const stdair::AirlineCodeList_T& lAirlineCodeList =
1007 iAirlineClassList.getAirlineCodeList();
1010 const stdair::ClassList_StringList_T& lClassList_StringList =
1011 iAirlineClassList.getClassCodeList();
1012 assert (!lClassList_StringList.empty());
1013 stdair::ClassCodeList_T lClassCodeList;
1014 for (stdair::ClassList_StringList_T::const_iterator itCL =
1015 lClassList_StringList.begin();
1016 itCL != lClassList_StringList.end(); ++itCL){
1017 const stdair::ClassList_String_T& lClassList_String = *itCL;
1018 assert (lClassList_String.size() > 0);
1019 stdair::ClassCode_T lFirstClass;
1020 lFirstClass.append (lClassList_String, 0, 1);
1021 lClassCodeList.push_back(lFirstClass);
1025 assert (lAirlineCodeList.size() == lClassCodeList.size());
1026 assert (!lAirlineCodeList.empty());
1028 if (lAirlineCodeList.size() == 1) {
1030 stdair::AirlineCode_T lAirlineCode = lAirlineCodeList.front();
1031 stdair::ClassCode_T lClassCode = lClassCodeList.front();
1032 stdair::Yield_T lYield = iAirlineClassList.getYield();
1034 lDestination, iCabinCode, lClassCode,
1035 iMeanValue, iStdDevValue, lYield, iBomRoot);
1039 stdair::Yield_T lYield = iAirlineClassList.getYield();
1040 for (stdair::AirlineCodeList_T::const_iterator itAC =
1041 lAirlineCodeList.begin();
1042 itAC != lAirlineCodeList.end(); ++itAC) {
1043 const stdair::AirlineCode_T& lAirlineCode = *itAC;
1044 setOnDForecast(lAirlineCodeList, lAirlineCode, lDepartureDate, lOrigin,
1045 lDestination, iCabinCode, lClassCodeList,
1046 iMeanValue, iStdDevValue, lYield, iBomRoot);
1054 const stdair::Date_T& iDepartureDate,
1055 const stdair::AirportCode_T& iOrigin,
1056 const stdair::AirportCode_T& iDestination,
1057 const stdair::CabinCode_T& iCabinCode,
1058 const stdair::ClassCode_T& iClassCode,
1059 const stdair::MeanValue_T& iMeanValue,
1060 const stdair::StdDevValue_T& iStdDevValue,
1061 const stdair::Yield_T& iYield,
1062 stdair::BomRoot& iBomRoot) {
1063 stdair::Inventory* lInventory_ptr = iBomRoot.getInventory(iAirlineCode);
1064 if (lInventory_ptr == NULL) {
1065 STDAIR_LOG_ERROR (
"Cannot find the inventory corresponding" 1066 <<
" to the airline" << iAirlineCode) ;
1069 const stdair::OnDDateList_T lOnDDateList =
1070 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
1071 assert (!lOnDDateList.empty());
1072 bool lFoundOnDDate =
false;
1073 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1074 itOD != lOnDDateList.end(); ++itOD) {
1075 stdair::OnDDate* lOnDDate_ptr = *itOD;
1076 assert (lOnDDate_ptr != NULL);
1077 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1078 const stdair::AirportCode_T& lOrigin = lOnDDate_ptr->getOrigin();
1079 const stdair::AirportCode_T& lDestination = lOnDDate_ptr->getDestination();
1080 const bool hasSegmentDateList =
1081 stdair::BomManager::hasList<stdair::SegmentDate> (*lOnDDate_ptr);
1082 if (hasSegmentDateList ==
false) {
1083 STDAIR_LOG_ERROR (
"The O&D date " << lOnDDate_ptr->describeKey()
1084 <<
"has not been correctly initialized : SegmentDate list is missing");
1087 const stdair::SegmentDateList_T& lSegmentDateList =
1088 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1090 if (lDepartureDate == iDepartureDate && lOrigin == iOrigin &&
1091 lDestination == iDestination && lSegmentDateList.size() == 1) {
1092 stdair::CabinClassPair_T lCabinClassPair (iCabinCode, iClassCode);
1093 stdair::CabinClassPairList_T lCabinClassPairList;
1094 lCabinClassPairList.push_back(lCabinClassPair);
1095 const stdair::MeanStdDevPair_T lMeanStdDevPair (iMeanValue, iStdDevValue);
1096 const stdair::WTPDemandPair_T lWTPDemandPair (iYield, lMeanStdDevPair);
1097 lOnDDate_ptr->setDemandInformation(lCabinClassPairList, lWTPDemandPair);
1098 lFoundOnDDate =
true;
1099 STDAIR_LOG_DEBUG (iAirlineCode <<
" Class " << iClassCode
1100 <<
" Mean " << iMeanValue
1101 <<
" Std Dev " << iStdDevValue);
1106 if (!lFoundOnDDate) {
1107 STDAIR_LOG_ERROR (
"Cannot find class " << iClassCode <<
" in cabin " 1108 << iCabinCode <<
" for the segment " 1109 << iOrigin <<
"-" << iDestination <<
" with" 1110 <<
" the airline " << iAirlineCode);
1118 const stdair::AirlineCode_T& iAirlineCode,
1119 const stdair::Date_T& iDepartureDate,
1120 const stdair::AirportCode_T& iOrigin,
1121 const stdair::AirportCode_T& iDestination,
1122 const stdair::CabinCode_T& iCabinCode,
1123 const stdair::ClassCodeList_T& iClassCodeList,
1124 const stdair::MeanValue_T& iMeanValue,
1125 const stdair::StdDevValue_T& iStdDevValue,
1126 const stdair::Yield_T& iYield,
1127 stdair::BomRoot& iBomRoot) {
1128 stdair::Inventory* lInventory_ptr = iBomRoot.getInventory(iAirlineCode);
1129 if (lInventory_ptr == NULL) {
1130 STDAIR_LOG_ERROR (
"Cannot find the inventory corresponding" 1131 <<
" to the airline" << iAirlineCode) ;
1134 const stdair::OnDDateList_T lOnDDateList =
1135 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
1136 assert (!lOnDDateList.empty());
1137 bool lFoundOnDDate =
false;
1138 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1139 itOD != lOnDDateList.end(); ++itOD) {
1140 stdair::OnDDate* lOnDDate_ptr = *itOD;
1141 assert (lOnDDate_ptr != NULL);
1142 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1143 const stdair::AirportCode_T& lOrigin = lOnDDate_ptr->getOrigin();
1144 const stdair::AirportCode_T& lDestination = lOnDDate_ptr->getDestination();
1145 const bool hasSegmentDateList =
1146 stdair::BomManager::hasList<stdair::SegmentDate> (*lOnDDate_ptr);
1147 if (hasSegmentDateList ==
false) {
1148 STDAIR_LOG_ERROR (
"The O&D date " << lOnDDate_ptr->describeKey()
1149 <<
"has not been correctly initialized : SegmentDate list is missing");
1152 const stdair::SegmentDateList_T& lSegmentDateList =
1153 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1156 if (lDepartureDate == iDepartureDate && lOrigin == iOrigin &&
1157 lDestination == iDestination && lSegmentDateList.size() == iAirlineCodeList.size()) {
1158 const stdair::SegmentDateList_T& lSegmentDateList =
1159 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1160 stdair::AirlineCodeList_T::const_iterator itAC = iAirlineCodeList.begin();
1161 stdair::SegmentDateList_T::const_iterator itSD = lSegmentDateList.begin();
1162 for (;itAC != iAirlineCodeList.end(); ++itAC, ++itSD) {
1163 const stdair::AirlineCode_T lForecastAirlineCode = *itAC;
1164 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1167 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1168 lSegmentDate_ptr->getOperatingSegmentDate ();
1169 if (lOperatingSegmentDate_ptr != NULL) {
1170 const stdair::FlightDate* lOperatingFD_ptr =
1171 stdair::BomManager::getParentPtr<stdair::FlightDate>(*lOperatingSegmentDate_ptr);
1172 const stdair::AirlineCode_T lOperatingAirlineCode =
1173 lOperatingFD_ptr->getAirlineCode();
1174 if (lOperatingAirlineCode != lForecastAirlineCode) {
1178 const stdair::AirlineCode_T lOperatingAirlineCode =
1179 lOnDDate_ptr->getAirlineCode();
1180 if (lOperatingAirlineCode != lForecastAirlineCode) {
1185 if (itAC == iAirlineCodeList.end()) {lFoundOnDDate =
true;}
1187 if (lFoundOnDDate) {
1188 stdair::CabinClassPairList_T lCabinClassPairList;
1189 for (stdair::ClassCodeList_T::const_iterator itCC = iClassCodeList.begin();
1190 itCC != iClassCodeList.end(); ++itCC) {
1191 const stdair::ClassCode_T lClassCode = *itCC;
1192 stdair::CabinClassPair_T lCabinClassPair (iCabinCode, lClassCode);
1193 lCabinClassPairList.push_back(lCabinClassPair);
1195 const stdair::MeanStdDevPair_T lMeanStdDevPair (iMeanValue, iStdDevValue);
1196 const stdair::YieldDemandPair_T lYieldDemandPair (iYield, lMeanStdDevPair);
1197 lOnDDate_ptr->setDemandInformation(lCabinClassPairList, lYieldDemandPair);
1198 lFoundOnDDate =
true;
1199 std::ostringstream oACStr;
1200 for (stdair::AirlineCodeList_T::const_iterator itAC = iAirlineCodeList.begin();
1201 itAC != iAirlineCodeList.end(); ++itAC) {
1202 if (itAC == iAirlineCodeList.begin()) {
1206 oACStr <<
"-" << *itAC;
1209 std::ostringstream oCCStr;
1210 for (stdair::ClassCodeList_T::const_iterator itCC = iClassCodeList.begin();
1211 itCC != iClassCodeList.end(); ++itCC) {
1212 if (itCC == iClassCodeList.begin()) {
1216 oCCStr <<
"-" << *itCC;
1220 STDAIR_LOG_DEBUG (oACStr.str() <<
" Classes " << oCCStr.str()
1221 <<
" Mean " << iMeanValue <<
" Std Dev " << iStdDevValue);
1225 if (!lFoundOnDDate) {
1226 STDAIR_LOG_ERROR (
"Cannot find the required multi-segment O&D date: " 1227 << iOrigin <<
"-" << iDestination <<
" " << iDepartureDate);
1235 if (_rmolServiceContext == NULL) {
1236 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1237 "has not been initialised");
1239 assert (_rmolServiceContext != NULL);
1243 stdair::STDAIR_Service& lSTDAIR_Service =
1244 lRMOL_ServiceContext.getSTDAIR_Service();
1245 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1247 const stdair::InventoryList_T lInventoryList =
1248 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1249 assert (!lInventoryList.empty());
1250 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
1251 itInv != lInventoryList.end(); ++itInv) {
1252 const stdair::Inventory* lInventory_ptr = *itInv;
1253 assert (lInventory_ptr != NULL);
1261 const stdair::Inventory& iInventory) {
1263 const stdair::FlightDateList_T lFlightDateList =
1264 stdair::BomManager::getList<stdair::FlightDate> (iInventory);
1265 assert (!lFlightDateList.empty());
1266 for (stdair::FlightDateList_T::const_iterator itFD = lFlightDateList.begin();
1267 itFD != lFlightDateList.end(); ++itFD) {
1268 const stdair::FlightDate* lFlightDate_ptr = *itFD;
1269 assert (lFlightDate_ptr != NULL);
1272 const stdair::Date_T lDate = iRMEventTime.date();
1274 const stdair::Date_T& lDepartureDate = lFlightDate_ptr->getDepartureDate();
1275 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
1276 stdair::DTD_T lDTD = short (lDateOffset.days());
1278 stdair::DCPList_T::const_iterator itDCP =
1279 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1281 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1284 const bool hasLegDateList =
1285 stdair::BomManager::hasList<stdair::LegDate> (*lFlightDate_ptr);
1286 if (hasLegDateList ==
true) {
1287 const stdair::LegDateList_T lLegDateList =
1288 stdair::BomManager::getList<stdair::LegDate> (*lFlightDate_ptr);
1289 assert (!lLegDateList.empty());
1290 for (stdair::LegDateList_T::const_iterator itLD = lLegDateList.begin();
1291 itLD != lLegDateList.end(); ++itLD) {
1292 const stdair::LegDate* lLegDate_ptr = *itLD;
1293 assert (lLegDate_ptr != NULL);
1294 const stdair::LegCabinList_T lLegCabinList =
1295 stdair::BomManager::getList<stdair::LegCabin> (*lLegDate_ptr);
1296 assert (!lLegCabinList.empty());
1297 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1298 itLC != lLegCabinList.end(); ++itLC) {
1299 stdair::LegCabin* lLegCabin_ptr = *itLC;
1300 assert (lLegCabin_ptr != NULL);
1301 lLegCabin_ptr->emptyYieldLevelDemandMap();
1312 if (_rmolServiceContext == NULL) {
1313 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1314 "has not been initialised");
1316 assert (_rmolServiceContext != NULL);
1320 stdair::STDAIR_Service& lSTDAIR_Service =
1321 lRMOL_ServiceContext.getSTDAIR_Service();
1322 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1325 const stdair::Date_T lDate = iRMEventTime.date();
1327 const stdair::InventoryList_T lInventoryList =
1328 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1329 assert (!lInventoryList.empty());
1330 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
1331 itInv != lInventoryList.end(); ++itInv) {
1332 const stdair::Inventory* lInventory_ptr = *itInv;
1333 assert (lInventory_ptr != NULL);
1334 const stdair::OnDDateList_T lOnDDateList =
1335 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
1336 assert (!lOnDDateList.empty());
1337 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1338 itOD != lOnDDateList.end(); ++itOD) {
1339 stdair::OnDDate* lOnDDate_ptr = *itOD;
1340 assert (lOnDDate_ptr != NULL);
1342 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1343 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
1344 stdair::DTD_T lDTD = short (lDateOffset.days());
1346 stdair::DCPList_T::const_iterator itDCP =
1347 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1349 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1352 const stdair::StringDemandStructMap_T& lStringDemandStructMap =
1353 lOnDDate_ptr->getDemandInfoMap ();
1354 for (stdair::StringDemandStructMap_T::const_iterator itStrDS = lStringDemandStructMap.begin();
1355 itStrDS != lStringDemandStructMap.end(); ++itStrDS) {
1356 std::string lCabinClassPath = itStrDS->first;
1357 const stdair::YieldDemandPair_T& lYieldDemandPair =
1359 const stdair::CabinClassPairList_T& lCabinClassPairList =
1360 lOnDDate_ptr->getCabinClassPairList(lCabinClassPath);
1361 const stdair::NbOfSegments_T& lNbOfSegments = lOnDDate_ptr->getNbOfSegments();
1363 assert (lCabinClassPairList.size() == lNbOfSegments);
1365 const stdair::SegmentDateList_T lOnDSegmentDateList =
1366 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1368 assert (lOnDSegmentDateList.size() == lNbOfSegments);
1369 stdair::CabinClassPairList_T::const_iterator itCCP = lCabinClassPairList.begin();
1370 stdair::SegmentDateList_T::const_iterator itSD = lOnDSegmentDateList.begin();
1371 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD) {
1372 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1373 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1374 lSegmentDate_ptr->getOperatingSegmentDate ();
1375 assert (lSegmentDate_ptr != NULL);
1377 if (lOperatingSegmentDate_ptr == NULL) {
1378 const stdair::CabinCode_T lCabinCode = itCCP->first;
1379 const stdair::ClassCode_T lClassCode = itCCP->second;
1380 const stdair::SegmentCabin* lSegmentCabin_ptr =
1381 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1383 assert (lSegmentCabin_ptr != NULL);
1386 const stdair::BookingClass* lBookingClass_ptr =
1387 stdair::BomManager::getObjectPtr<stdair::BookingClass> (*lSegmentCabin_ptr,
1389 assert (lBookingClass_ptr != NULL);
1390 const stdair::LegCabinList_T lLegCabinList =
1391 stdair::BomManager::getList<stdair::LegCabin> (*lSegmentCabin_ptr);
1392 assert (!lLegCabinList.empty());
1393 const int lNbOfLegs = lLegCabinList.size();
1395 const stdair::Yield_T& lYield = lBookingClass_ptr->getYield()/lNbOfLegs;
1396 const stdair::MeanStdDevPair_T& lMeanStdDevPair =
1397 lYieldDemandPair.second;
1398 const stdair::MeanValue_T& lMeanValue = lMeanStdDevPair.first;
1399 const stdair::StdDevValue_T& lStdDevValue = lMeanStdDevPair.second;
1400 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1401 itLC != lLegCabinList.end(); ++itLC) {
1402 stdair::LegCabin* lLegCabin_ptr = *itLC;
1403 assert (lLegCabin_ptr != NULL);
1404 lLegCabin_ptr->addDemandInformation (lYield, lMeanValue, lStdDevValue);
1417 if (_rmolServiceContext == NULL) {
1418 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1419 "has not been initialised");
1421 assert (_rmolServiceContext != NULL);
1425 stdair::STDAIR_Service& lSTDAIR_Service =
1426 lRMOL_ServiceContext.getSTDAIR_Service();
1427 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1430 const stdair::Date_T lDate = iRMEventTime.date();
1432 const stdair::InventoryList_T lInventoryList =
1433 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1434 assert (!lInventoryList.empty());
1435 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
1436 itInv != lInventoryList.end(); ++itInv) {
1437 const stdair::Inventory* lInventory_ptr = *itInv;
1438 assert (lInventory_ptr != NULL);
1439 const stdair::OnDDateList_T lOnDDateList =
1440 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
1441 assert (!lOnDDateList.empty());
1442 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1443 itOD != lOnDDateList.end(); ++itOD) {
1444 stdair::OnDDate* lOnDDate_ptr = *itOD;
1445 assert (lOnDDate_ptr != NULL);
1447 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1448 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
1449 stdair::DTD_T lDTD = short (lDateOffset.days());
1451 stdair::DCPList_T::const_iterator itDCP =
1452 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1454 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1457 const stdair::StringDemandStructMap_T& lStringDemandStructMap =
1458 lOnDDate_ptr->getDemandInfoMap ();
1459 for (stdair::StringDemandStructMap_T::const_iterator itStrDS = lStringDemandStructMap.begin();
1460 itStrDS != lStringDemandStructMap.end(); ++itStrDS) {
1461 std::string lCabinClassPath = itStrDS->first;
1462 const stdair::YieldDemandPair_T& lYieldDemandPair =
1464 const stdair::CabinClassPairList_T& lCabinClassPairList =
1465 lOnDDate_ptr->getCabinClassPairList(lCabinClassPath);
1466 const stdair::NbOfSegments_T& lNbOfSegments = lOnDDate_ptr->getNbOfSegments();
1468 assert (lCabinClassPairList.size() == lNbOfSegments);
1470 const stdair::SegmentDateList_T lOnDSegmentDateList =
1471 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1473 assert (lOnDSegmentDateList.size() == lNbOfSegments);
1474 stdair::CabinClassPairList_T::const_iterator itCCP = lCabinClassPairList.begin();
1475 stdair::SegmentDateList_T::const_iterator itSD = lOnDSegmentDateList.begin();
1476 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD) {
1477 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1478 assert (lSegmentDate_ptr != NULL);
1479 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1480 lSegmentDate_ptr->getOperatingSegmentDate ();
1482 if (lOperatingSegmentDate_ptr == NULL) {
1483 const stdair::CabinCode_T lCabinCode = itCCP->first;
1484 const stdair::ClassCode_T lClassCode = itCCP->second;
1485 const stdair::SegmentCabin* lSegmentCabin_ptr =
1486 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1488 assert (lSegmentCabin_ptr != NULL);
1489 const stdair::LegCabinList_T lLegCabinList =
1490 stdair::BomManager::getList<stdair::LegCabin> (*lSegmentCabin_ptr);
1491 assert (!lLegCabinList.empty());
1492 const int lNbOfLegs = lLegCabinList.size();
1494 const stdair::MeanStdDevPair_T& lMeanStdDevPair =
1495 lYieldDemandPair.second;
1496 const stdair::Yield_T& lYield = lYieldDemandPair.first/(lNbOfLegs*lNbOfSegments);
1497 const stdair::MeanValue_T& lMeanValue = lMeanStdDevPair.first;
1498 const stdair::StdDevValue_T& lStdDevValue = lMeanStdDevPair.second;
1499 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1500 itLC != lLegCabinList.end(); ++itLC) {
1501 stdair::LegCabin* lLegCabin_ptr = *itLC;
1502 assert (lLegCabin_ptr != NULL);
1503 lLegCabin_ptr->addDemandInformation (lYield, lMeanValue, lStdDevValue);
1516 if (_rmolServiceContext == NULL) {
1517 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1518 "has not been initialised");
1520 assert (_rmolServiceContext != NULL);
1524 stdair::STDAIR_Service& lSTDAIR_Service =
1525 lRMOL_ServiceContext.getSTDAIR_Service();
1526 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1529 const stdair::Date_T lDate = iRMEventTime.date();
1531 const stdair::InventoryList_T& lInvList =
1532 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1533 for (stdair::InventoryList_T::const_iterator itInv = lInvList.begin();
1534 itInv != lInvList.end(); ++itInv) {
1535 stdair::Inventory* lCurrentInv_ptr = *itInv;
1536 assert (lCurrentInv_ptr != NULL);
1538 const stdair::FlightDateList_T& lFlightDateList =
1539 stdair::BomManager::getList<stdair::FlightDate> (*lCurrentInv_ptr);
1540 for (stdair::FlightDateList_T::const_iterator itFlightDate =
1541 lFlightDateList.begin();
1542 itFlightDate != lFlightDateList.end(); ++itFlightDate) {
1543 stdair::FlightDate* lCurrentFlightDate_ptr = *itFlightDate;
1544 assert (lCurrentFlightDate_ptr != NULL);
1546 const stdair::Date_T& lCurrentDepartureDate = lCurrentFlightDate_ptr->getDepartureDate();
1547 stdair::DateOffset_T lDateOffset = lCurrentDepartureDate - lDate;
1548 stdair::DTD_T lDTD = short (lDateOffset.days());
1550 stdair::DCPList_T::const_iterator itDCP =
1551 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1553 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1554 STDAIR_LOG_DEBUG (
"Optimisation using O&D forecast: " << lCurrentInv_ptr->getAirlineCode()
1555 <<
" Departure " << lCurrentDepartureDate <<
" DTD " << lDTD);
1565 if (_rmolServiceContext == NULL) {
1566 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1567 "has not been initialised");
1569 assert (_rmolServiceContext != NULL);
1573 stdair::STDAIR_Service& lSTDAIR_Service =
1574 lRMOL_ServiceContext.getSTDAIR_Service();
1575 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1578 const stdair::Date_T lDate = iRMEventTime.date();
1580 const stdair::InventoryList_T& lInvList =
1581 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1583 for (stdair::InventoryList_T::const_iterator itInv = lInvList.begin();
1584 itInv != lInvList.end(); ++itInv) {
1585 stdair::Inventory* lCurrentInv_ptr = *itInv;
1586 assert (lCurrentInv_ptr != NULL);
1588 const stdair::FlightDateList_T& lFlightDateList =
1589 stdair::BomManager::getList<stdair::FlightDate> (*lCurrentInv_ptr);
1590 for (stdair::FlightDateList_T::const_iterator itFlightDate =
1591 lFlightDateList.begin();
1592 itFlightDate != lFlightDateList.end(); ++itFlightDate) {
1593 stdair::FlightDate* lCurrentFlightDate_ptr = *itFlightDate;
1594 assert (lCurrentFlightDate_ptr != NULL);
1596 const stdair::Date_T& lCurrentDepartureDate = lCurrentFlightDate_ptr->getDepartureDate();
1597 stdair::DateOffset_T lDateOffset = lCurrentDepartureDate - lDate;
1598 stdair::DTD_T lDTD = short (lDateOffset.days());
1600 stdair::DCPList_T::const_iterator itDCP =
1601 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1603 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1612 stdair::BomRoot& iBomRoot) {
1613 const stdair::SegmentDateList_T& lSegmentDateList =
1614 stdair::BomManager::getList<stdair::SegmentDate> (iFlightDate);
1615 const stdair::AirlineCode_T& lOptAC = iFlightDate.getAirlineCode();
1616 const std::string lFDKeyStr = iFlightDate.describeKey();
1618 for (stdair::SegmentDateList_T::const_iterator itSegmentDate = lSegmentDateList.begin();
1619 itSegmentDate != lSegmentDateList.end(); ++itSegmentDate) {
1620 stdair::SegmentDate* lSegmentDate_ptr = *itSegmentDate;
1621 assert (lSegmentDate_ptr != NULL);
1622 const bool hasSegmentDateList =
1623 stdair::BomManager::hasList<stdair::SegmentDate>(*lSegmentDate_ptr);
1624 if (hasSegmentDateList ==
true) {
1625 const stdair::LegDateList_T& lLegDateList =
1626 stdair::BomManager::getList<stdair::LegDate>(*lSegmentDate_ptr);
1629 const stdair::SegmentDateList_T& lMktSegmentDateList =
1630 stdair::BomManager::getList<stdair::SegmentDate>(*lSegmentDate_ptr);
1631 for (stdair::SegmentDateList_T::const_iterator itMktSD = lMktSegmentDateList.begin();
1632 itMktSD != lMktSegmentDateList.end(); ++itMktSD) {
1634 stdair::SegmentDate* lMktSD_ptr = *itMktSD;
1635 assert (lMktSD_ptr != NULL);
1636 stdair::FlightDate* lMktFD_ptr =
1637 stdair::BomManager::getParentPtr<stdair::FlightDate>(*lMktSD_ptr);
1638 assert (lMktFD_ptr != NULL);
1639 const stdair::AirlineCode_T& lMktAC = lMktFD_ptr->getAirlineCode();
1641 const stdair::Inventory* lMktInv_ptr =
1642 stdair::BomManager::getObjectPtr<stdair::Inventory>(iBomRoot,lMktAC);
1643 assert (lMktInv_ptr != NULL);
1645 const stdair::Inventory* lOptInv_ptr =
1646 stdair::BomManager::getObjectPtr<stdair::Inventory>(*lMktInv_ptr,lOptAC);
1647 assert (lOptInv_ptr != NULL);
1649 const stdair::FlightDate* lOptFD_ptr =
1650 stdair::BomManager::getObjectPtr<stdair::FlightDate>(*lOptInv_ptr,lFDKeyStr);
1651 assert (lOptFD_ptr != NULL);
1654 for (stdair::LegDateList_T::const_iterator itLD = lLegDateList.begin();
1655 itLD != lLegDateList.end(); ++itLD) {
1656 const stdair::LegDate* lLD_ptr = *itLD;
1657 assert (lLD_ptr != NULL);
1658 const std::string lLDKeyStr = lLD_ptr->describeKey();
1659 stdair::LegDate* lOptLD_ptr =
1660 stdair::BomManager::getObjectPtr<stdair::LegDate>(*lOptFD_ptr,lLDKeyStr);
1661 assert (lOptLD_ptr != NULL);
1662 const stdair::LegCabinList_T& lLegCabinList_T =
1663 stdair::BomManager::getList<stdair::LegCabin>(*lLD_ptr);
1666 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList_T.begin();
1667 itLC != lLegCabinList_T.end(); ++itLC) {
1668 stdair::LegCabin* lLC_ptr = *itLC;
1669 assert (lLC_ptr != NULL);
1670 const std::string lLCKeyStr = lLC_ptr->describeKey();
1671 stdair::LegCabin* lOptLC_ptr =
1672 stdair::BomManager::getObjectPtr<stdair::LegCabin>(*lOptLD_ptr, lLCKeyStr);
1673 assert (lOptLC_ptr != NULL);
1675 lLC_ptr->updateCurrentBidPrice();
1677 lOptLC_ptr->updatePreviousBidPrice();
1679 lOptLC_ptr->setCurrentBidPrice (lLC_ptr->getCurrentBidPrice());
1681 STDAIR_LOG_DEBUG (
"Update bid price of " << lLC_ptr->getFullerKey()
1682 <<
" : " << lOptLC_ptr->getCurrentBidPrice()
1683 <<
" Availability pool " << lLC_ptr->getAvailabilityPool());
1694 if (_rmolServiceContext == NULL) {
1695 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1696 "has not been initialised");
1698 assert (_rmolServiceContext != NULL);
1702 stdair::STDAIR_Service& lSTDAIR_Service =
1703 lRMOL_ServiceContext.getSTDAIR_Service();
1704 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1707 const stdair::Date_T lDate = iRMEventTime.date();
1709 const stdair::InventoryList_T lInventoryList =
1710 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1711 assert (!lInventoryList.empty());
1712 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
1713 itInv != lInventoryList.end(); ++itInv) {
1714 const stdair::Inventory* lInventory_ptr = *itInv;
1715 assert (lInventory_ptr != NULL);
1716 const stdair::OnDDateList_T lOnDDateList =
1717 stdair::BomManager::getList<stdair::OnDDate> (*lInventory_ptr);
1718 assert (!lOnDDateList.empty());
1719 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1720 itOD != lOnDDateList.end(); ++itOD) {
1721 stdair::OnDDate* lOnDDate_ptr = *itOD;
1722 assert (lOnDDate_ptr != NULL);
1724 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1725 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
1726 stdair::DTD_T lDTD = short (lDateOffset.days());
1728 stdair::DCPList_T::const_iterator itDCP =
1729 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1731 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1734 const stdair::StringDemandStructMap_T& lStringDemandStructMap =
1735 lOnDDate_ptr->getDemandInfoMap ();
1736 for (stdair::StringDemandStructMap_T::const_iterator itStrDS = lStringDemandStructMap.begin();
1737 itStrDS != lStringDemandStructMap.end(); ++itStrDS) {
1738 std::string lCabinClassPath = itStrDS->first;
1739 const stdair::YieldDemandPair_T& lYieldDemandPair = itStrDS->second;
1740 const stdair::CabinClassPairList_T& lCabinClassPairList =
1741 lOnDDate_ptr->getCabinClassPairList(lCabinClassPath);
1742 const stdair::NbOfSegments_T& lNbOfSegments = lOnDDate_ptr->getNbOfSegments();
1744 assert (lCabinClassPairList.size() == lNbOfSegments);
1747 const stdair::SegmentDateList_T lOnDSegmentDateList =
1748 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1750 assert (lOnDSegmentDateList.size() == lNbOfSegments);
1751 stdair::CabinClassPairList_T::const_iterator itCCP = lCabinClassPairList.begin();
1752 stdair::SegmentDateList_T::const_iterator itSD = lOnDSegmentDateList.begin();
1754 std::list<stdair::BidPrice_T> lBidPriceList;
1756 stdair::BidPrice_T lTotalBidPrice = 0;
1758 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD) {
1760 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1761 assert (lSegmentDate_ptr != NULL);
1763 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1764 lSegmentDate_ptr->getOperatingSegmentDate ();
1765 if (lOperatingSegmentDate_ptr != NULL) {
1766 lSegmentDate_ptr = lOperatingSegmentDate_ptr;
1768 const stdair::CabinCode_T lCabinCode = itCCP->first;
1769 const stdair::SegmentCabin* lSegmentCabin_ptr =
1770 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1772 assert (lSegmentCabin_ptr != NULL);
1773 stdair::BidPrice_T lBidPrice = 0;
1774 const stdair::LegCabinList_T lLegCabinList =
1775 stdair::BomManager::getList<stdair::LegCabin>(*lSegmentCabin_ptr);
1776 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1777 itLC != lLegCabinList.end(); ++itLC) {
1778 const stdair::LegCabin* lLegCabin_ptr = *itLC;
1779 assert (lLegCabin_ptr != NULL);
1780 lBidPrice += lLegCabin_ptr->getCurrentBidPrice();
1782 lBidPriceList.push_back (lBidPrice);
1783 lTotalBidPrice += lBidPrice;
1787 itCCP = lCabinClassPairList.begin();
1788 itSD = lOnDSegmentDateList.begin();
1789 std::list<stdair::BidPrice_T>::const_iterator itBP = lBidPriceList.begin();
1790 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD, ++itBP) {
1791 stdair::BidPrice_T lBidPrice = *itBP;
1792 stdair::BidPrice_T lComplementaryBidPrice = lTotalBidPrice - lBidPrice;
1793 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1794 assert (lSegmentDate_ptr != NULL);
1795 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1796 lSegmentDate_ptr->getOperatingSegmentDate ();
1798 if (lOperatingSegmentDate_ptr == NULL) {
1799 const stdair::CabinCode_T lCabinCode = itCCP->first;
1800 const stdair::ClassCode_T lClassCode = itCCP->second;
1801 const stdair::SegmentCabin* lSegmentCabin_ptr =
1802 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1804 assert (lSegmentCabin_ptr != NULL);
1805 const stdair::LegCabinList_T lLegCabinList =
1806 stdair::BomManager::getList<stdair::LegCabin> (*lSegmentCabin_ptr);
1807 assert (!lLegCabinList.empty());
1810 const stdair::Yield_T& lDAYield =
1811 std::max(100., lYieldDemandPair.first - lComplementaryBidPrice);
1814 stdair::Yield_T lYield = lDAYield;
1829 const stdair::MeanStdDevPair_T& lMeanStdDevPair =
1830 lYieldDemandPair.second;
1831 const stdair::MeanValue_T& lMeanValue = lMeanStdDevPair.first;
1832 const stdair::StdDevValue_T& lStdDevValue = lMeanStdDevPair.second;
1833 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1834 itLC != lLegCabinList.end(); ++itLC) {
1835 stdair::LegCabin* lLegCabin_ptr = *itLC;
1836 assert (lLegCabin_ptr != NULL);
1837 lLegCabin_ptr->addDemandInformation (lYield, lMeanValue, lStdDevValue);
1850 if (_rmolServiceContext == NULL) {
1851 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1852 "has not been initialised");
1854 assert (_rmolServiceContext != NULL);
1858 stdair::STDAIR_Service& lSTDAIR_Service =
1859 lRMOL_ServiceContext.getSTDAIR_Service();
1860 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
1862 const stdair::InventoryList_T lInventoryList =
1863 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
1864 assert (!lInventoryList.empty());
1865 for (stdair::InventoryList_T::const_iterator itInv = lInventoryList.begin();
1866 itInv != lInventoryList.end(); ++itInv) {
1867 const stdair::Inventory* lInventory_ptr = *itInv;
1868 assert (lInventory_ptr != NULL);
1875 const stdair::Inventory& iInventory) {
1877 const stdair::OnDDateList_T lOnDDateList =
1878 stdair::BomManager::getList<stdair::OnDDate> (iInventory);
1879 assert (!lOnDDateList.empty());
1880 for (stdair::OnDDateList_T::const_iterator itOD = lOnDDateList.begin();
1881 itOD != lOnDDateList.end(); ++itOD) {
1882 stdair::OnDDate* lOnDDate_ptr = *itOD;
1883 assert (lOnDDate_ptr != NULL);
1886 const stdair::Date_T lDate = iRMEventTime.date();
1888 const stdair::Date_T& lDepartureDate = lOnDDate_ptr->getDate();
1889 stdair::DateOffset_T lDateOffset = lDepartureDate - lDate;
1890 stdair::DTD_T lDTD = short (lDateOffset.days());
1892 stdair::DCPList_T::const_iterator itDCP =
1893 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
1895 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
1898 const stdair::StringDemandStructMap_T& lStringDemandStructMap =
1899 lOnDDate_ptr->getDemandInfoMap ();
1900 for (stdair::StringDemandStructMap_T::const_iterator itStrDS = lStringDemandStructMap.begin();
1901 itStrDS != lStringDemandStructMap.end(); ++itStrDS) {
1902 std::string lCabinClassPath = itStrDS->first;
1903 const stdair::YieldDemandPair_T& lYieldDemandPair = itStrDS->second;
1904 const stdair::CabinClassPairList_T& lCabinClassPairList =
1905 lOnDDate_ptr->getCabinClassPairList(lCabinClassPath);
1906 const stdair::NbOfSegments_T& lNbOfSegments = lOnDDate_ptr->getNbOfSegments();
1908 assert (lCabinClassPairList.size() == lNbOfSegments);
1911 const stdair::SegmentDateList_T lOnDSegmentDateList =
1912 stdair::BomManager::getList<stdair::SegmentDate> (*lOnDDate_ptr);
1914 assert (lOnDSegmentDateList.size() == lNbOfSegments);
1915 stdair::CabinClassPairList_T::const_iterator itCCP = lCabinClassPairList.begin();
1916 stdair::SegmentDateList_T::const_iterator itSD = lOnDSegmentDateList.begin();
1918 stdair::BidPrice_T lTotalBidPrice = 0;
1919 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD) {
1921 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1922 assert (lSegmentDate_ptr != NULL);
1924 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1925 lSegmentDate_ptr->getOperatingSegmentDate ();
1926 if (lOperatingSegmentDate_ptr != NULL) {
1927 lSegmentDate_ptr = lOperatingSegmentDate_ptr;
1929 const stdair::CabinCode_T lCabinCode = itCCP->first;
1930 const stdair::SegmentCabin* lSegmentCabin_ptr =
1931 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1933 assert (lSegmentCabin_ptr != NULL);
1934 const stdair::LegCabinList_T lLegCabinList =
1935 stdair::BomManager::getList<stdair::LegCabin>(*lSegmentCabin_ptr);
1936 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1937 itLC != lLegCabinList.end(); ++itLC) {
1938 const stdair::LegCabin* lLegCabin_ptr = *itLC;
1939 assert (lLegCabin_ptr != NULL);
1940 lTotalBidPrice += lLegCabin_ptr->getCurrentBidPrice();
1945 itCCP = lCabinClassPairList.begin();
1946 itSD = lOnDSegmentDateList.begin();
1947 for (; itSD != lOnDSegmentDateList.end(); ++itCCP, ++itSD) {
1948 const stdair::SegmentDate* lSegmentDate_ptr = *itSD;
1949 assert (lSegmentDate_ptr != NULL);
1950 const stdair::SegmentDate* lOperatingSegmentDate_ptr =
1951 lSegmentDate_ptr->getOperatingSegmentDate ();
1953 if (lOperatingSegmentDate_ptr == NULL) {
1954 const stdair::CabinCode_T lCabinCode = itCCP->first;
1955 const stdair::ClassCode_T lClassCode = itCCP->second;
1956 const stdair::SegmentCabin* lSegmentCabin_ptr =
1957 stdair::BomManager::getObjectPtr<stdair::SegmentCabin> (*lSegmentDate_ptr,
1959 assert (lSegmentCabin_ptr != NULL);
1960 const stdair::LegCabinList_T lLegCabinList =
1961 stdair::BomManager::getList<stdair::LegCabin> (*lSegmentCabin_ptr);
1962 assert (!lLegCabinList.empty());
1963 const stdair::Yield_T& lYield = lYieldDemandPair.first;
1964 const stdair::MeanStdDevPair_T& lMeanStdDevPair =
1965 lYieldDemandPair.second;
1966 const stdair::MeanValue_T& lMeanValue = lMeanStdDevPair.first;
1967 const stdair::StdDevValue_T& lStdDevValue = lMeanStdDevPair.second;
1968 for (stdair::LegCabinList_T::const_iterator itLC = lLegCabinList.begin();
1969 itLC != lLegCabinList.end(); ++itLC) {
1970 stdair::LegCabin* lLegCabin_ptr = *itLC;
1971 assert (lLegCabin_ptr != NULL);
1972 const stdair::BidPrice_T& lBidPrice = lLegCabin_ptr->getCurrentBidPrice();
1973 const stdair::RealNumber_T lDynamicYieldProrationFactor = lBidPrice / lTotalBidPrice;
1974 const stdair::Yield_T lProratedYield = lDynamicYieldProrationFactor*lYield;
1975 lLegCabin_ptr->addDemandInformation (lProratedYield, lMeanValue, lStdDevValue);
1992 if (_rmolServiceContext == NULL) {
1993 throw stdair::NonInitialisedServiceException (
"The Rmol service " 1994 "has not been initialised");
1996 assert (_rmolServiceContext != NULL);
2000 stdair::STDAIR_Service& lSTDAIR_Service =
2001 lRMOL_ServiceContext.getSTDAIR_Service();
2002 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
2005 const stdair::Date_T lDate = iRMEventTime.date();
2008 const stdair::InventoryList_T& lInvList =
2009 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
2010 for (stdair::InventoryList_T::const_iterator itInv = lInvList.begin();
2011 itInv != lInvList.end(); ++itInv) {
2012 stdair::Inventory* lCurrentInv_ptr = *itInv;
2013 assert (lCurrentInv_ptr != NULL);
2015 double lMaxBPVariation = 1.0;
2016 short lIterationCounter = 0;
2018 while (lMaxBPVariation > 0.01 && lIterationCounter < 10) {
2019 lMaxBPVariation = 0.0;
2020 lIterationCounter++;
2021 const stdair::FlightDateList_T& lFlightDateList =
2022 stdair::BomManager::getList<stdair::FlightDate> (*lCurrentInv_ptr);
2023 for (stdair::FlightDateList_T::const_iterator itFlightDate =
2024 lFlightDateList.begin();
2025 itFlightDate != lFlightDateList.end(); ++itFlightDate) {
2026 stdair::FlightDate* lCurrentFlightDate_ptr = *itFlightDate;
2027 assert (lCurrentFlightDate_ptr != NULL);
2029 const stdair::Date_T& lCurrentDepartureDate = lCurrentFlightDate_ptr->getDepartureDate();
2030 stdair::DateOffset_T lDateOffset = lCurrentDepartureDate - lDate;
2031 stdair::DTD_T lDTD = short (lDateOffset.days());
2033 stdair::DCPList_T::const_iterator itDCP =
2034 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
2036 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
2038 lMaxBPVariation = std::max(lMaxBPVariation, lBPVariation);
2052 if (_rmolServiceContext == NULL) {
2053 throw stdair::NonInitialisedServiceException (
"The Rmol service " 2054 "has not been initialised");
2056 assert (_rmolServiceContext != NULL);
2060 stdair::STDAIR_Service& lSTDAIR_Service =
2061 lRMOL_ServiceContext.getSTDAIR_Service();
2062 stdair::BomRoot& lBomRoot = lSTDAIR_Service.getBomRoot();
2065 const stdair::Date_T lDate = iRMEventTime.date();
2067 double lMaxBPVariation = 1.0;
2068 short lIterationCounter = 0;
2072 while (lMaxBPVariation > 0.01 && lIterationCounter < 50) {
2073 lMaxBPVariation = 0.0;
2074 lIterationCounter++;
2076 const stdair::InventoryList_T& lInvList =
2077 stdair::BomManager::getList<stdair::Inventory> (lBomRoot);
2078 for (stdair::InventoryList_T::const_iterator itInv = lInvList.begin();
2079 itInv != lInvList.end(); ++itInv) {
2080 stdair::Inventory* lCurrentInv_ptr = *itInv;
2081 assert (lCurrentInv_ptr != NULL);
2082 const stdair::FlightDateList_T& lFlightDateList =
2083 stdair::BomManager::getList<stdair::FlightDate> (*lCurrentInv_ptr);
2084 for (stdair::FlightDateList_T::const_iterator itFlightDate =
2085 lFlightDateList.begin();
2086 itFlightDate != lFlightDateList.end(); ++itFlightDate) {
2087 stdair::FlightDate* lCurrentFlightDate_ptr = *itFlightDate;
2088 assert (lCurrentFlightDate_ptr != NULL);
2090 const stdair::Date_T& lCurrentDepartureDate = lCurrentFlightDate_ptr->getDepartureDate();
2091 stdair::DateOffset_T lDateOffset = lCurrentDepartureDate - lDate;
2092 stdair::DTD_T lDTD = short (lDateOffset.days());
2094 stdair::DCPList_T::const_iterator itDCP =
2095 std::find (stdair::DEFAULT_DCP_LIST.begin(), stdair::DEFAULT_DCP_LIST.end(), lDTD);
2096 if (itDCP != stdair::DEFAULT_DCP_LIST.end()) {
2098 lMaxBPVariation = std::max(lMaxBPVariation, lBPVariation);
void optimiseOnD(const stdair::DateTime_T &)
static bool preOptimise(stdair::FlightDate &, const stdair::PreOptimisationMethod &)
static void optimalOptimisationByMCIntegration(const stdair::NbOfSamples_T &, stdair::LegCabin &)
void forecastOnD(const stdair::DateTime_T &iRMEventTime)
stdair::YieldFeatures * getYieldFeatures(const stdair::OnDDate &, const stdair::CabinCode_T &, stdair::BomRoot &)
static void heuristicOptimisationByEmsr(stdair::LegCabin &)
void optimiseOnDUsingRMCooperation(const stdair::DateTime_T &)
const stdair::SegmentCabin & retrieveDummySegmentCabin(const bool isForFareFamilies=false)
RMOL_ServiceContext & create()
void updateBidPrice(const stdair::DateTime_T &)
void projectOnDDemandOnLegCabinsUsingYP(const stdair::DateTime_T &)
static void heuristicOptimisationByEmsrB(stdair::LegCabin &)
Inner class holding the context for the RMOL Service object.
void optimiseOnDUsingAdvancedRMCooperation(const stdair::DateTime_T &)
static void heuristicOptimisationByEmsrA(stdair::LegCabin &)
void resetDemandInformation(const stdair::DateTime_T &)
static bool parseInputFileAndBuildBom(const std::string &iInputFileName, stdair::BomRoot &)
static bool forecast(stdair::FlightDate &, const stdair::DateTime_T &, const stdair::UnconstrainingMethod &, const stdair::ForecastingMethod &)
void projectAggregatedDemandOnLegCabins(const stdair::DateTime_T &)
bool optimise(stdair::FlightDate &, const stdair::DateTime_T &, const stdair::UnconstrainingMethod &, const stdair::ForecastingMethod &, const stdair::PreOptimisationMethod &, const stdair::OptimisationMethod &, const stdair::PartnershipTechnique &)
void projectOnDDemandOnLegCabinsUsingDA(const stdair::DateTime_T &)
static double optimiseUsingOnDForecast(stdair::FlightDate &, const bool &iReduceFluctuations=false)
void projectOnDDemandOnLegCabinsUsingDYP(const stdair::DateTime_T &)
static bool optimise(stdair::FlightDate &, const stdair::OptimisationMethod &)
void clonePersistentBom()
static FacRmolServiceContext & instance()
void setOnDForecast(const stdair::AirlineClassList &, const stdair::MeanValue_T &, const stdair::StdDevValue_T &, stdair::OnDDate &, const stdair::CabinCode_T &, stdair::BomRoot &)
void buildComplementaryLinks(stdair::BomRoot &)
void parseAndLoad(const stdair::CabinCapacity_T &iCabinCapacity, const stdair::Filename_T &iDemandAndClassDataFile)