Go to the documentation of this file.00001 #ifndef __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP
00002 #define __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP
00003
00004
00005
00006
00007
00008 #include <map>
00009 #include <iosfwd>
00010
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
00028 typedef std::map<T, DictionaryKey_T> ProbabilityMassFunction_T;
00029
00033 typedef std::map<DictionaryKey_T, T> InverseCumulativeDistribution_T;
00034
00035
00036 private:
00037
00041 const ProbabilityMassFunction_T& getProbabilityMassFunction() const {
00042 return _probabilityMassFunction;
00043 }
00044
00048 const InverseCumulativeDistribution_T& getInverseCumulativeDistribution() const {
00049 return _inverseCumulativeDistribution;
00050 }
00051
00052
00056 void setProbabilityMassFunction (const ProbabilityMassFunction_T& iProbabilityMassFunction) {
00057 _probabilityMassFunction = iProbabilityMassFunction;
00058 determineInverseCumulativeDistributionFromProbabilityMassFunction();
00059 }
00060
00061
00062 public:
00063
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
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
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
00176 _inverseCumulativeDistribution.
00177 insert (typename InverseCumulativeDistribution_T::
00178 value_type (lKey, attribute_value));
00179 }
00180 }
00181 }
00182
00183 private:
00184
00188 ProbabilityMassFunction_T _probabilityMassFunction;
00189
00193 InverseCumulativeDistribution_T _inverseCumulativeDistribution;
00194 };
00195 }
00196 #endif // __STDAIR_BAS_CATEGORICALATTRIBUTE_HPP