TraDemGen Logo  0.2.2
C++ Simulated Travel Demand Generation Library
CategoricalAttribute.hpp
Go to the documentation of this file.
00001 #ifndef __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP
00002 #define __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP
00003 
00004 // //////////////////////////////////////////////////////////////////////
00005 // Import section
00006 // //////////////////////////////////////////////////////////////////////
00007 // STL
00008 #include <map>
00009 #include <iosfwd>
00010 // STDAIR
00011 #include <stdair/STDAIR_Types.hpp>
00012 #include <stdair/basic/DictionaryManager.hpp>
00013 
00014 namespace stdair {
00015 
00020   template <typename T>
00021   struct CategoricalAttribute {
00022 
00023   public:
00024     // ///////////////////// Type definitions /////////////////////
00028     typedef std::map<T, DictionaryKey_T> ProbabilityMassFunction_T;
00029 
00033     typedef std::map<DictionaryKey_T, T> InverseCumulativeDistribution_T;
00034     
00035 
00036   private:
00037     // ///////////// Getters ///////////
00041     const ProbabilityMassFunction_T& getProbabilityMassFunction() const {
00042       return _probabilityMassFunction;
00043     }
00044   
00048     const InverseCumulativeDistribution_T& getInverseCumulativeDistribution() const {
00049       return _inverseCumulativeDistribution;
00050     }
00051 
00052     // ///////////// Setters ///////////
00056     void setProbabilityMassFunction (const ProbabilityMassFunction_T& iProbabilityMassFunction) {
00057       _probabilityMassFunction = iProbabilityMassFunction;
00058       determineInverseCumulativeDistributionFromProbabilityMassFunction();
00059     }
00060 
00061 
00062   public:
00063     // /////////////// Business Methods //////////
00067     const T& getValue (const Probability_T& iCumulativeProbability) const {
00068 
00069       const DictionaryKey_T& lKey =
00070         DictionaryManager::valueToKey (iCumulativeProbability);
00071 
00072       InverseCumulativeDistribution_T::const_iterator itT =
00073         _inverseCumulativeDistribution.find (lKey);
00074 
00075       if (itT == _inverseCumulativeDistribution.end()) {
00076         std::ostringstream oStr;
00077         oStr << "The following cumulative probability is out of range: "
00078              << iCumulativeProbability << displayInverseCumulativeDistribution();
00079         throw IndexOutOfRangeException (oStr.str());
00080       }
00081 
00082       return itT->second;
00083     }
00084     
00085 
00086   public:
00087     // ////////////// Display Support Methods //////////
00091     const std::string displayProbabilityMassFunction() const {
00092       std::ostringstream oStr;
00093       unsigned int idx = 0;
00094       
00095       for (typename ProbabilityMassFunction_T::const_iterator it =
00096              _probabilityMassFunction.begin();
00097            it != _probabilityMassFunction.end(); ++it, ++idx) {
00098         if (idx != 0) {
00099           oStr << ", ";
00100         }
00101         oStr << it->first << ":"
00102              << DictionaryManager::keyToValue (it->second);        
00103       }
00104       
00105       return oStr.str();
00106     }
00107     
00111     const std::string displayInverseCumulativeDistribution() const {
00112       std::ostringstream oStr;
00113       
00114       for (typename InverseCumulativeDistribution_T::const_iterator it = 
00115              _inverseCumulativeDistribution.begin();
00116            it != _inverseCumulativeDistribution.end(); ++it) {
00117         oStr << "cumulative prob: " << DictionaryManager::keyToValue (it->first)
00118                  << "  value: " << it->second << std::endl;
00119       }
00120 
00121       return oStr.str();
00122     }
00123     
00124   public:
00125     // ////////// Constructors and destructors /////////
00129     CategoricalAttribute (const ProbabilityMassFunction_T& iProbabilityMassFunction)
00130       : _probabilityMassFunction (iProbabilityMassFunction) {
00131       determineInverseCumulativeDistributionFromProbabilityMassFunction();
00132     }
00133 
00137     CategoricalAttribute() { }
00138 
00142     CategoricalAttribute (const CategoricalAttribute& iCategoricalAttribute)
00143       : _probabilityMassFunction (iCategoricalAttribute._probabilityMassFunction) {
00144       determineInverseCumulativeDistributionFromProbabilityMassFunction();
00145     }
00146 
00150     virtual ~CategoricalAttribute() { }
00151 
00152 
00157     void determineInverseCumulativeDistributionFromProbabilityMassFunction() {
00158 
00159       Probability_T cumulative_probability_so_far = 0.0;
00160       for (typename ProbabilityMassFunction_T::const_iterator
00161              itProbabilityMassFunction = _probabilityMassFunction.begin();
00162            itProbabilityMassFunction != _probabilityMassFunction.end();
00163            ++itProbabilityMassFunction) {
00164         
00165         Probability_T attribute_probability_mass =
00166           DictionaryManager::keyToValue (itProbabilityMassFunction->second);
00167         
00168         if (attribute_probability_mass > 0) {
00169           T attribute_value = itProbabilityMassFunction->first;
00170           cumulative_probability_so_far += attribute_probability_mass;
00171 
00172           const DictionaryKey_T& lKey =
00173             DictionaryManager::valueToKey (cumulative_probability_so_far);
00174           
00175           //_inverseCumulativeDistribution[lKey] = attribute_value;
00176           _inverseCumulativeDistribution.
00177             insert (typename InverseCumulativeDistribution_T::
00178                     value_type (lKey, attribute_value));
00179         }
00180       }
00181     }
00182   
00183   private:
00184     // ////////// Attributes //////////
00188     ProbabilityMassFunction_T _probabilityMassFunction;
00189     
00193     InverseCumulativeDistribution_T _inverseCumulativeDistribution;
00194   };
00195 }
00196 #endif // __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP