$treeview $search $mathjax
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