RMOL Logo  0.25.3
C++ library of Revenue Management and Optimisation classes and functions
Utilities.cpp
Go to the documentation of this file.
00001 
00002 // //////////////////////////////////////////////////////////////////////
00003 // Import section
00004 // //////////////////////////////////////////////////////////////////////
00005 // STL
00006 #include <cassert>
00007 #include <string>
00008 #include <numeric>
00009 #include <algorithm>
00010 #include <cmath>
00011 // StdAir
00012 #include <stdair/basic/BasConst_Inventory.hpp>
00013 #include <stdair/bom/BomManager.hpp>
00014 #include <stdair/bom/SegmentCabin.hpp>
00015 #include <stdair/service/Logger.hpp>
00016 // RMOL
00017 #include <rmol/basic/BasConst_General.hpp>
00018 #include <rmol/bom/Utilities.hpp>
00019 #include <rmol/bom/GuillotineBlockHelper.hpp>
00020 
00021 namespace RMOL {
00022   // ////////////////////////////////////////////////////////////////////
00023   void Utilities::
00024   computeDistributionParameters (const UnconstrainedDemandVector_T& iVector,
00025                                  double& ioMean, double& ioStdDev) {
00026     ioMean = 0.0; ioStdDev = 0.0;
00027     unsigned int lNbOfSamples = iVector.size();
00028     assert (lNbOfSamples > 1);
00029 
00030     // Compute the mean
00031     for (UnconstrainedDemandVector_T::const_iterator itSample = iVector.begin();
00032          itSample != iVector.end(); ++itSample) {
00033       //STDAIR_LOG_NOTIFICATION (*itSample);
00034       ioMean += *itSample;
00035     }
00036     ioMean /= lNbOfSamples;
00037 
00038     // Compute the standard deviation
00039     for (UnconstrainedDemandVector_T::const_iterator itSample = iVector.begin();
00040          itSample != iVector.end(); ++itSample) {
00041       const double& lSample = *itSample;
00042       ioStdDev += ((lSample - ioMean) * (lSample - ioMean));
00043     }
00044     ioStdDev /= (lNbOfSamples - 1);
00045     ioStdDev = sqrt (ioStdDev);
00046 
00047     // Sanity check
00048     if (ioStdDev == 0) {
00049       ioStdDev = 0.1;
00050     }
00051   }
00052 
00053   // ////////////////////////////////////////////////////////////////////
00054   stdair::DCPList_T Utilities::
00055   buildRemainingDCPList (const stdair::DTD_T& iDTD) {
00056     stdair::DCPList_T oDCPList;
00057 
00058     const stdair::DCPList_T lWholeDCPList = stdair::DEFAULT_DCP_LIST;
00059     stdair::DCPList_T::const_iterator itDCP = lWholeDCPList.begin();
00060     while (itDCP != lWholeDCPList.end()) {
00061       const stdair::DCP_T& lDCP = *itDCP;
00062       if (iDTD >= lDCP) {
00063         break;
00064       }
00065       ++itDCP;
00066     }
00067     assert (itDCP != lWholeDCPList.end());
00068 
00069     oDCPList.push_back (iDTD);
00070     ++itDCP;
00071     for (; itDCP != lWholeDCPList.end(); ++itDCP) {
00072       oDCPList.push_back (*itDCP);
00073     }
00074     
00075     return oDCPList;
00076   }
00077 
00078   // ////////////////////////////////////////////////////////////////////
00079   stdair::DCPList_T Utilities::
00080   buildRemainingDCPList2 (const stdair::DTD_T& iDTD) {
00081     stdair::DCPList_T oDCPList;
00082 
00083     const stdair::DCPList_T lWholeDCPList = RMOL::DEFAULT_DCP_LIST;
00084     stdair::DCPList_T::const_iterator itDCP = lWholeDCPList.begin();
00085     while (itDCP != lWholeDCPList.end()) {
00086       const stdair::DCP_T& lDCP = *itDCP;
00087       if (iDTD >= lDCP) {
00088         break;
00089       }
00090       ++itDCP;
00091     }
00092     assert (itDCP != lWholeDCPList.end());
00093 
00094     oDCPList.push_back (iDTD);
00095     ++itDCP;
00096     for (; itDCP != lWholeDCPList.end(); ++itDCP) {
00097       oDCPList.push_back (*itDCP);
00098     }
00099     
00100     return oDCPList;
00101   }
00102 
00103   // ////////////////////////////////////////////////////////////////////
00104   stdair::NbOfSegments_T Utilities::
00105   getNbOfDepartedSimilarSegments (const stdair::SegmentCabin& iSegmentCabin,
00106                                   const stdair::Date_T& iEventDate) {
00107     stdair::DTD_T lDTD = 0;
00108     // Retrieve the guillotine block.
00109     const stdair::GuillotineBlock& lGuillotineBlock =
00110       iSegmentCabin.getGuillotineBlock();
00111     return GuillotineBlockHelper::
00112       getNbOfSegmentAlreadyPassedThisDTD (lGuillotineBlock, lDTD, iEventDate);
00113   }
00114 
00115 }