45 #define USE_RANDOM_RELOGO_SET_OPS
52 #include "repast_hpc/Random.h"
61 template<
typename T,
typename ValueGetter>
64 const ValueGetter* _getter;
66 SetCmp(
const ValueGetter* getter) :
70 bool operator()(T* one, T* two) {
71 return (*_getter)(one) < (*_getter)(two);
85 typedef typename std::vector<T*>::iterator as_iterator;
86 typedef typename std::vector<T*>::const_iterator const_as_iterator;
96 template<
typename input_iterator>
110 template<
typename input_iterator>
126 template<
typename Functor>
139 template<
typename Functor,
typename P1>
151 template<
typename Functor,
typename P1>
159 template<
typename Functor>
167 template<
typename Functor>
184 return agents.size();
193 return agents.size();
211 return agents.begin();
220 return agents.begin();
237 const_as_iterator
end()
const {
260 template<
typename ValueGetter>
261 T*
minOneOf(
const ValueGetter& getter);
275 template<
typename ValueGetter>
276 T*
maxOneOf(
const ValueGetter& getter);
289 template<
typename ValueGetter>
303 template<
typename ValueGetter>
324 template<
typename ValueGetter>
345 template<
typename ValueGetter>
365 std::vector<T*> agents;
374 template<
typename input_iterator>
377 std::random_shuffle(agents.begin(), agents.end(), uni_random);
382 agents(set.agents.begin(), set.agents.end()) {
391 std::random_shuffle(agents.begin(), agents.end(), uni_random);
395 template<
typename input_iterator>
397 agents.insert(agents.end(), begin, end);
402 return agents[index];
407 agents.push_back(agent);
412 return agents.at(index);
416 template<
typename Functor>
418 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
424 template<
typename Functor>
426 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
432 template<
typename Functor>
434 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
441 template<
typename Functor,
typename P1>
443 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
450 template<
typename Functor,
typename P1>
452 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
459 template<
typename ValueGetter>
461 if (agents.size() == 0)
464 std::vector<T*> mins;
465 double min = std::numeric_limits<double>::max();
466 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
468 double val = getter(agent);
471 mins.push_back(agent);
473 }
else if (val == min) {
474 mins.push_back(agent);
478 if (mins.size() > 1) {
486 template<
typename ValueGetter>
488 if (agents.size() == 0)
491 std::vector<T*> maxs;
492 double max = -(std::numeric_limits<double>::max());
493 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
495 double val = getter(agent);
498 maxs.push_back(agent);
500 }
else if (val == max) {
501 maxs.push_back(agent);
505 if (maxs.size() > 1) {
513 template<
typename ValueGetter>
516 if (agents.size() == 0)
519 double min = std::numeric_limits<double>::max();
520 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
522 double val = getter(agent);
527 }
else if (val == min) {
534 template<
typename ValueGetter>
537 if (agents.size() == 0)
return;
539 double max = std::numeric_limits<double>::max() * (-1);
540 for (as_iterator iter = agents.begin(); iter != agents.end(); ++iter) {
542 double val = getter(agent);
547 }
else if (val == max) {
553 template<
typename ValueGetter>
556 if (size() <= count) {
557 set.
addAll(begin(), end());
560 if(!initialSetIsSorted){
564 #ifdef USE_RANDOM_RELOGO_SET_OPS
565 int numberToAdd = count;
566 while(numberToAdd > 0){
567 double v1 = getter(tmp[0]);
569 while(getter(tmp[indx]) == v1) indx++;
570 if(indx <= numberToAdd){
571 for(
size_t i = 0; i < indx; i++){
578 while(numberToAdd > 0){
588 for (
size_t i = 0; i < count; i++) {
596 template<
typename ValueGetter>
599 if (size() <= count) {
600 set.
addAll(begin(), end());
603 if(!initialSetIsSorted){
607 #ifdef USE_RANDOM_RELOGO_SET_OPS
608 int numberToAdd = count;
609 int endIndx = tmp.
size() -1;
610 while(numberToAdd > 0){
611 double v1 = getter(tmp[endIndx]);
612 int indx = endIndx - 1;
613 while(getter(tmp[indx]) == v1) indx--;
614 if((endIndx - indx) <= numberToAdd){
615 while( endIndx > indx){
616 set.
add(tmp[endIndx]);
623 while(numberToAdd > 0){
633 for (
size_t i = tmp.
size() - count; i < tmp.
size(); i++) {
642 size_t size = agents.size();
646 return agents[index];
651 typename std::vector<T*>::iterator iter = agents.begin();
652 while (iter != agents.end()) {
653 iter = std::find(iter, agents.end(), agent);
654 if (iter != agents.end())
655 iter = agents.erase(iter);
void minNOf(size_t count, const ValueGetter &getter, AgentSet< T > &set, bool initialSetIsSorted=false)
Gets count number of set members that have the minimum value of the number returned by ValueGetter.
Definition: AgentSet.h:554
static Random * instance()
Gets the singleton instance of this Random.
Definition: Random.cpp:80
T * operator[](size_t index)
Gets the item at the specified index without doing any range checking.
Definition: AgentSet.h:401
Functor interface.
Definition: Schedule.h:55
Specialized indexable collection class for agents.
Definition: AgentSet.h:82
T * minOneOf(const ValueGetter &getter)
Gets the set member that has the minimum value of the number returned by ValueGetter.
Definition: AgentSet.h:460
T * at(int index)
Gets the item at the specified index.
Definition: AgentSet.h:411
void maxNOf(size_t count, const ValueGetter &getter, AgentSet< T > &set, bool initialSetIsSorted=false)
Definition: AgentSet.h:597
void withMin(const ValueGetter &getter, AgentSet< T > &set)
Gets the set members that have the minimum value of the number returned by ValueGetter,...
Definition: AgentSet.h:514
const_as_iterator end() const
Gets a const iterator to the end of this AgentSet.
Definition: AgentSet.h:237
void ask(Functor func)
Calls the Functor on each agent in this AgentSet.
Definition: AgentSet.h:433
as_iterator end()
Gets an iterator to the end of this AgentSet.
Definition: AgentSet.h:228
const_as_iterator begin() const
Gets a const iterator to the begining of this AgentSet.
Definition: AgentSet.h:219
T * oneOf()
Gets one of the members of this AgentSet at random.
Definition: AgentSet.h:641
double next()
Gets the "next" number from this Number Generator.
Definition: Random.h:113
void add(T *agent)
Adds an agent to this AgentSet.
Definition: AgentSet.h:406
Compares two items using the specified getter.
Definition: AgentSet.h:62
void withMax(const ValueGetter &getter, AgentSet< T > &set)
Gets the set members that have the maximum value of the number returned by ValueGetter and puts them ...
Definition: AgentSet.h:535
as_iterator begin()
Gets an iterator to the begining of this AgentSet.
Definition: AgentSet.h:210
size_t count() const
Gets the size of this AgentSet.
Definition: AgentSet.h:183
AgentSet()
Creates an empty agent set.
Definition: AgentSet.h:370
size_t size() const
Gets the size of this AgentSet.
Definition: AgentSet.h:192
void addAll(input_iterator begin, input_iterator end)
Adds all the agents from the start iterator through the end to this AgentSet.
Definition: AgentSet.h:396
void remove(T *agent)
Removes all instances of the specified agent from this AgentSet.
Definition: AgentSet.h:650
void clear()
Clears this AgentSet of any agents that it contains.
Definition: AgentSet.h:244
void shuffle()
Randomly shuffles the elements of this AgentSet.
Definition: AgentSet.h:390
IntUniformGenerator createUniIntGenerator(int from, int to)
Creates a generator that produces ints in the range [from, to].
Definition: Random.cpp:100
void apply(Functor &func)
Applies the functor to each each agent in the agent set.
Definition: AgentSet.h:417
T * maxOneOf(const ValueGetter &getter)
Gets the set member that has the maximum value of the number returned by ValueGetter.
Definition: AgentSet.h:487