32 using my_map_t =
typename std::conditional< std::is_same<T,double>::value or std::is_same<T,float>::value,
33 std::map<T,double,floating_point_compare<double>>,
34 std::map<T,double>>::type;
43 if(a.second > bestv) {
52 void show(std::ostream& out,
unsigned long nprint=0)
const { out << this->
string(nprint); }
53 void show(
unsigned long nprint=0)
const {
show(std::cout, nprint); }
60 std::string
string(
unsigned long nprint=0)
const {
71 for(
const auto& a : m) {
76 std::sort(v.begin(), v.end(), [
this](T a, T b) {
return this->m.at(a) > this->m.at(b); });
79 std::string out =
"{";
80 auto upper_bound = (nprint == 0 ? v.size() : std::min(v.size(), nprint));
81 for(
size_t i=0;i<upper_bound;i++){
82 out +=
"'" +
str(v[i]) +
"':" + std::to_string(m.at(v[i]));
83 if(i < upper_bound-1) { out +=
", "; }
85 out +=
"} [Z=" +
str(z) +
", N=" + std::to_string(v.size()) +
"]";
99 if constexpr (std::is_same<T, double>::value or
100 std::is_same<T, float>::value){
101 assert((not std::isnan(x)) &&
"*** Cannot store NaNs here, sorry. They don't work with maps and you'll be in for an unholy nightmare");
104 if(m.find(x) == m.end()) {
112 double get(T x,
double v)
const {
113 if(m.find(x) == m.end()) {
122 return m.contains(x);
126 auto end() {
return m.end(); }
128 const std::map<T,double>&
values()
const {
136 void operator<<(const DiscreteDistribution<T>& x) {
138 for(
auto a : x.values()) {
145 for(
const auto& a : m){
151 double lp(
const T& x) {
166 std::vector<T>
best(
size_t n,
bool include_equal)
const {
174 std::vector<std::pair<T,double>> v(m.size());
175 std::copy(m.begin(), m.end(), v.begin());
176 std::sort(v.begin(), v.end(), [](
auto x,
auto y){
return x.second > y.second; });
180 for(
size_t i=0; (i<v.size()) and ((i<=until) or (include_equal and v[i].second == v[until].second));i++){
181 out.push_back(v[i].first);
187 std::vector<std::pair<T,double>>
sorted(
bool decreasing=
false)
const {
192 std::vector<std::pair<T,double>> v(m.size());
193 std::copy(m.begin(), m.end(), v.begin());
194 if(decreasing) std::sort(v.begin(), v.end(), [](
auto x,
auto y){
return x.second > y.second; });
195 else std::sort(v.begin(), v.end(), [](
auto x,
auto y){
return x.second < y.second; });
201 size_t count(T x)
const {
return m.count(x); }
202 size_t size()
const {
return m.size(); }
204 if(m.count(x))
return m[x];
210 double at(T x)
const {
211 if(m.count(x))
return m.at(x);
229 const double threshold = 1e-6;
232 std::transform(m.begin(), m.end(), std::inserter(keys, keys.end()), [](
auto pair){
return pair.first; });
233 std::transform(other.
m.begin(), other.
m.end(), std::inserter(keys, keys.end()), [](
auto pair){
return pair.first; });
235 for(
auto& k : keys) {
236 if(abs(
at(k) - other.
at(k)) > threshold)
247 std::ostream& operator<<(std::ostream& o, const DiscreteDistribution<T>& x) {
my_map_t m
Definition: DiscreteDistribution.h:35
std::string string(unsigned long nprint=0) const
Definition: DiscreteDistribution.h:60
auto end()
Definition: DiscreteDistribution.h:126
double at(T x) const
Definition: DiscreteDistribution.h:210
virtual T argmax() const
Definition: DiscreteDistribution.h:39
Definition: DiscreteDistribution.h:25
DiscreteDistribution()
Definition: DiscreteDistribution.h:37
double operator[](const T x)
Definition: DiscreteDistribution.h:203
std::vector< std::pair< T, double > > sorted(bool decreasing=false) const
Definition: DiscreteDistribution.h:187
constexpr double infinity
Definition: Numerics.h:20
bool contains(const T &x) const
Definition: DiscreteDistribution.h:121
void show(unsigned long nprint=0) const
Definition: DiscreteDistribution.h:53
T logplusexp(const T a, const T b)
Definition: Numerics.h:131
void addmass(T x, double v)
Definition: DiscreteDistribution.h:91
size_t count(T x) const
Definition: DiscreteDistribution.h:201
double lp(const T &x)
Definition: DiscreteDistribution.h:151
bool operator==(const DiscreteDistribution< T > &other) const
Definition: DiscreteDistribution.h:226
void show(std::ostream &out, unsigned long nprint=0) const
Definition: DiscreteDistribution.h:52
const std::map< T, double > & values() const
Definition: DiscreteDistribution.h:128
size_t size() const
Definition: DiscreteDistribution.h:202
std::string str(const DiscreteDistribution< T > &a)
Definition: DiscreteDistribution.h:253
auto begin()
Definition: DiscreteDistribution.h:125
std::vector< T > best(size_t n, bool include_equal) const
Definition: DiscreteDistribution.h:166
void erase(const T &k)
Definition: DiscreteDistribution.h:55
double Z() const
Definition: DiscreteDistribution.h:143
typename std::conditional< std::is_same< T, double >::value or std::is_same< T, float >::value, std::map< T, double, floating_point_compare< double > >, std::map< T, double > >::type my_map_t
Definition: DiscreteDistribution.h:34