00001 #include "Quantile.hpp"
00002 #include <cstring>
00003
00004 namespace aitools {
00005 namespace invertedindex {
00006
00007 Quantile::Quantile()
00008 {
00009 std::memset(values_, 0, size);
00010 }
00011
00012 Quantile::Quantile(const Quantile& quantile)
00013 {
00014 std::memcpy(values_, quantile.values_, size);
00015 }
00016
00017 Quantile::~Quantile()
00018 {}
00019
00020 void
00021 Quantile::clear()
00022 {
00023 std::memset(values_, 0, size);
00024 }
00025
00026 uint32_t&
00027 Quantile::at(Order order)
00028 {
00029 return values_[order];
00030 }
00031
00032 Quantile&
00033 Quantile::operator=(const Quantile& quantile)
00034 {
00035 if (values_ != quantile.values_)
00036 {
00037 std::memcpy(values_, quantile.values_, size);
00038 }
00039 return *this;
00040 }
00041
00042 Quantile&
00043 Quantile::operator+=(const Quantile& quantile)
00044 {
00045 for (unsigned i(0); i != COUNT; ++i)
00046 {
00047 values_[i] += quantile.values_[i];
00048 }
00049 return *this;
00050 }
00051
00052 void
00053 Quantile::parse(std::istream& is)
00054 {
00055 for (unsigned i(0); i != COUNT; ++i)
00056 {
00057 is >> values_[i];
00058 }
00059 }
00060
00061 void
00062 Quantile::print(std::ostream& os) const
00063 {
00064 for (unsigned i(0); i != COUNT; ++i)
00065 {
00066 os << ' ' << values_[i];
00067 }
00068 }
00069
00070 uint32_t*
00071 Quantile::values()
00072 {
00073 return values_;
00074 }
00075
00076 const uint32_t*
00077 Quantile::values() const
00078 {
00079 return values_;
00080 }
00081
00082 uint32_t
00083 Quantile::get(Order order) const
00084 {
00085 return values_[order];
00086 }
00087
00088 }
00089 }
00090
00091 namespace std {
00092
00093 istream&
00094 operator>>(istream& is, aitools::invertedindex::Quantile& quantile)
00095 {
00096 if (is) quantile.parse(is);
00097 return is;
00098 }
00099
00100 ostream&
00101 operator<<(ostream& os, const aitools::invertedindex::Quantile& quantile)
00102 {
00103 if (os) quantile.print(os);
00104 return os;
00105 }
00106
00107 ostream&
00108 operator<<(ostream& os, aitools::invertedindex::Quantile::Order order)
00109 {
00110 if (os)
00111 {
00112 if (order < aitools::invertedindex::Quantile::P91)
00113 {
00114 os << (order + 1) * 0.1;
00115 }
00116 else
00117 {
00118 os << 0.9 + (order - aitools::invertedindex::Quantile::P90) * 0.01;
00119 }
00120 }
00121 return os;
00122 }
00123
00124 }