41 #ifndef WEIGHTEDRANDOMSELECTOR_H_
42 #define WEIGHTEDRANDOMSELECTOR_H_
55 static bool dblComp (
double lhs,
double rhs) {
return lhs > rhs; }
57 std::multimap<double, T*, bool(*)(double, double)>* scoresAndObjects;
58 std::set<T*>* contentSet;
66 void set(T* instance,
double score);
68 double remove(T* instance);
70 bool contains(T* instance);
72 T* getRandomInstance();
84 scoresAndObjects =
new std::multimap<double, T*, bool(*)(double, double)>(dblComp);
85 contentSet =
new std::set<T*>();
90 WeightedRandomSelector<T>::~WeightedRandomSelector(){
91 delete scoresAndObjects;
96 void WeightedRandomSelector<T>::set(T* instance,
double score){
98 if(score <= 0)
return;
99 scoresAndObjects->emplace(score, instance);
100 contentSet->emplace(instance);
105 double WeightedRandomSelector<T>::remove(T* instance){
106 if(contentSet->find(instance) != contentSet->end()){
107 contentSet->erase(instance);
108 for(
typename std::multimap<double, T*>::iterator iter = scoresAndObjects->begin(); iter != scoresAndObjects->end(); iter++){
109 if(iter->second == instance){
110 double score = iter->first;
112 scoresAndObjects->erase(iter);
121 bool WeightedRandomSelector<T>::contains(T* instance){
122 return contentSet->find() != contentSet->end();
126 T* WeightedRandomSelector<T>::getRandomInstance(){
127 if(scoresAndObjects->size() == 0)
return 0;
130 for(
typename std::multimap<double, T*>::iterator iter = scoresAndObjects->begin(); iter != scoresAndObjects->end(); iter++){
132 if(sum > val)
return iter->second;
135 typename std::multimap<double, T*>::iterator iter = scoresAndObjects->end();
141 void WeightedRandomSelector<T>::clear(){
142 scoresAndObjects->clear();
148 size_t WeightedRandomSelector<T>::size(){
149 return contentSet->size();
153 void WeightedRandomSelector<T>::report(){
154 for(
typename std::multimap<double, T*>::iterator iter = scoresAndObjects->begin(); iter != scoresAndObjects->end(); iter++){
155 std::cout <<
" " << *(iter->second) <<
" == " << iter->first << std::endl;