41 #ifndef SHAREDCONEXT_HPP_
42 #define SHAREDCONEXT_HPP_
45 #include "RepastErrors.h"
47 #include <boost/mpi.hpp>
58 IsLocalAgent(
int rankInCommunicator): rank(rankInCommunicator){ }
60 bool operator()(
const boost::shared_ptr<T>& ptr) {
61 return ptr->getId().currentRank() == rank;
76 AgentStateFilter(
bool localFlag,
int rankInCommunicator): rank(rankInCommunicator), local(localFlag) { }
78 bool operator()(
const boost::shared_ptr<T>& ptr) {
79 return (local ? ptr->getId().currentRank() == rank : ptr->getId().currentRank() != rank);
103 void rpRemoveAgent(
const AgentId&
id);
119 typedef typename boost::unordered_map<AgentId, int, HashId> RefMap;
137 std::vector<std::string> getAgentsToPushProjOrder;
139 typedef typename boost::filter_iterator<IsLocalAgent<T> ,
typename Context<T>::const_iterator> const_local_iterator;
141 typedef typename boost::filter_iterator<AgentStateFilter<T> ,
typename Context<T>::const_iterator> const_state_aware_iterator;
142 typedef typename boost::filter_iterator<AgentStateFilter<T> ,
typename Context<T>::const_bytype_iterator> const_state_aware_bytype_iterator;
144 typedef typename Projection<T>::RADIUS RADIUS;
163 const_local_iterator
localEnd()
const;
212 enum filterLocalFlag{
234 const_state_aware_iterator
begin(filterLocalFlag local);
241 const_state_aware_iterator
end(filterLocalFlag local);
250 const_state_aware_bytype_iterator
byTypeBegin(filterLocalFlag local,
int type);
259 const_state_aware_bytype_iterator
byTypeEnd(filterLocalFlag local,
int type);
272 template<
typename filterStruct>
273 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_iterator>
filteredBegin(filterLocalFlag local, filterStruct& fStruct);
285 template<
typename filterStruct>
286 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_iterator>
filteredEnd(filterLocalFlag local, filterStruct& fStruct);
300 template<
typename filterStruct>
301 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_bytype_iterator>
byTypeFilteredBegin(filterLocalFlag local,
int type, filterStruct& fStruct);
314 template<
typename filterStruct>
315 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_bytype_iterator>
byTypeFilteredEnd(filterLocalFlag local,
int type, filterStruct& fStruct);
342 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::set<T*>& selectedAgents,
bool remove =
false,
int popSize = -1);
362 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::vector<T*>& selectedAgents,
bool remove =
false,
int popSize = -1);
388 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents,
bool remove =
false,
int popSize = -1);
414 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents,
bool remove =
false,
int popSize = -1);
436 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::set<T*>& selectedAgents,
int type,
bool remove =
false,
int popSize = -1);
458 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::vector<T*>& selectedAgents,
int type,
bool remove =
false,
int popSize = -1);
485 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents,
int type,
bool remove =
false,
int popSize = -1);
512 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents,
int type,
bool remove =
false,
int popSize = -1);
537 template<
typename filterStruct>
538 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::set<T*>& selectedAgents, filterStruct& filter,
bool remove =
false,
int popSize = -1);
563 template<
typename filterStruct>
564 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::vector<T*>& selectedAgents, filterStruct& filter,
bool remove =
false,
int popSize = -1);
594 template<
typename filterStruct>
595 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents, filterStruct& filter,
bool remove =
false,
int popSize = -1);
625 template<
typename filterStruct>
626 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents, filterStruct& filter,
bool remove =
false,
int popSize = -1);
652 template<
typename filterStruct>
653 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::set<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove =
false,
int popSize = -1);
679 template<
typename filterStruct>
680 void selectAgents(filterLocalFlag localOrNonLocalOnly, std::vector<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove =
false,
int popSize = -1);
711 template<
typename filterStruct>
712 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove =
false,
int popSize = -1);
744 template<
typename filterStruct>
745 void selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove =
false,
int popSize = -1);
757 bool sendsSecondaryDataOnStatusExchange();
759 void getProjInfoExchangePartners(std::set<int>& sends, std::set<int>& recvs);
761 void getAgentStatusInfoExchangePartners(std::set<int>& sends, std::set<int>& recvs);
775 void getAgentsToPushToOtherProcesses(std::map<
int, std::set<AgentId> >& agentsToPush);
783 LOCAL_FILTER(true, comm->rank()),
784 NON_LOCAL_FILTER(false, comm->rank()){
788 SharedContext<T>::~SharedContext() { }
792 removeAgent(agent->getId());
797 if (
id.currentRank() != _rank) {
798 if (projRefMap.find(
id) == projRefMap.end()) {
807 template <
typename T>
809 projRefMap.erase(
id);
815 if (
id.currentRank() != _rank) {
816 RefMap::iterator iter = projRefMap.find(
id);
817 if (iter == projRefMap.end()) {
820 projRefMap[id] = ++(iter->second);
827 if (
id.currentRank() == _rank)
return;
829 RefMap::iterator iter = projRefMap.find(
id);
830 if (iter == projRefMap.end())
throw Repast_Error_31<AgentId>(
id);
832 int count = --(iter->second);
833 if (count == 0) projRefMap.erase(iter);
834 else projRefMap[id] = count;
854 boost::filter_iterator<AgentStateFilter<T> ,
typename Context<T>::const_iterator>
SharedContext<T>::begin(filterLocalFlag local){
860 boost::filter_iterator<AgentStateFilter<T> ,
typename Context<T>::const_iterator>
SharedContext<T>::end(filterLocalFlag local){
872 boost::filter_iterator<AgentStateFilter<T> ,
typename Context<T>::const_bytype_iterator>
SharedContext<T>::byTypeEnd(filterLocalFlag local,
int type){
878 template<
typename filterStruct>
879 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_iterator>
SharedContext<T>::filteredBegin(filterLocalFlag local, filterStruct& fStruct){
884 template<
typename filterStruct>
885 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_iterator>
SharedContext<T>::filteredEnd(filterLocalFlag local, filterStruct& fStruct){
891 template<
typename filterStruct>
897 template<
typename filterStruct>
898 boost::filter_iterator<filterStruct, typename SharedContext<T>::const_state_aware_bytype_iterator>
SharedContext<T>::byTypeFilteredEnd(filterLocalFlag local,
int type, filterStruct& fStruct){
907 if(popSize <= -1) selectNElementsAtRandom(begin(localOrNonLocalOnly), end(localOrNonLocalOnly), size(), selectedAgents, remove);
908 else selectNElementsAtRandom(begin(localOrNonLocalOnly), popSize, size(), selectedAgents, remove);
913 if(popSize <= -1) selectNElementsInRandomOrder(begin(localOrNonLocalOnly), end(localOrNonLocalOnly), size(), selectedAgents, remove);
914 else selectNElementsInRandomOrder(begin(localOrNonLocalOnly), popSize, size(), selectedAgents, remove);
919 if(popSize <= -1) selectNElementsAtRandom(begin(localOrNonLocalOnly), end(localOrNonLocalOnly), count, selectedAgents, remove);
920 else selectNElementsAtRandom(begin(localOrNonLocalOnly), popSize, count, selectedAgents, remove);
925 if(popSize <= -1) selectNElementsInRandomOrder(begin(localOrNonLocalOnly), end(localOrNonLocalOnly), count, selectedAgents, remove);
926 else selectNElementsInRandomOrder(begin(localOrNonLocalOnly), popSize, count, selectedAgents, remove);
931 if(popSize <= -1) selectNElementsAtRandom(byTypeBegin(localOrNonLocalOnly, type), byTypeEnd(localOrNonLocalOnly, type), size(), selectedAgents, remove);
932 else selectNElementsAtRandom(byTypeBegin(localOrNonLocalOnly, type), popSize, size(), selectedAgents, remove);
937 if(popSize <= -1) selectNElementsInRandomOrder(byTypeBegin(localOrNonLocalOnly, type), byTypeEnd(localOrNonLocalOnly, type), size(), selectedAgents, remove);
938 else selectNElementsInRandomOrder(byTypeBegin(localOrNonLocalOnly, type), popSize, size(), selectedAgents, remove);
943 if(popSize <= -1) selectNElementsAtRandom(byTypeBegin(localOrNonLocalOnly, type), byTypeEnd(localOrNonLocalOnly, type), count, selectedAgents, remove);
944 else selectNElementsAtRandom(byTypeBegin(localOrNonLocalOnly, type), popSize, count, selectedAgents, remove);
949 if(popSize <= -1) selectNElementsInRandomOrder(byTypeBegin(localOrNonLocalOnly, type), byTypeEnd(localOrNonLocalOnly, type), count, selectedAgents, remove);
950 else selectNElementsInRandomOrder(byTypeBegin(localOrNonLocalOnly, type), popSize, count, selectedAgents, remove);
954 template<
typename filterStruct>
956 if(popSize <= -1) selectNElementsAtRandom(filteredBegin(localOrNonLocalOnly, filter), filteredEnd(localOrNonLocalOnly, filter), size(), selectedAgents, remove);
957 else selectNElementsAtRandom(filteredBegin(localOrNonLocalOnly, filter), popSize, size(), selectedAgents, remove);
961 template<
typename filterStruct>
963 if(popSize <= -1) selectNElementsInRandomOrder(filteredBegin(localOrNonLocalOnly, filter), filteredEnd(localOrNonLocalOnly, filter), size(), selectedAgents, remove);
964 else selectNElementsInRandomOrder(filteredBegin(localOrNonLocalOnly, filter), popSize, size(), selectedAgents, remove);
968 template<
typename filterStruct>
969 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents, filterStruct& filter,
bool remove,
int popSize){
970 if(popSize <= -1) selectNElementsAtRandom(filteredBegin(localOrNonLocalOnly, filter), filteredEnd(localOrNonLocalOnly, filter), count, selectedAgents, remove);
971 else selectNElementsAtRandom(filteredBegin(localOrNonLocalOnly, filter), popSize, count, selectedAgents, remove);
975 template<
typename filterStruct>
976 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents, filterStruct& filter,
bool remove,
int popSize){
977 if(popSize <= -1) selectNElementsInRandomOrder(filteredBegin(localOrNonLocalOnly, filter), filteredEnd(localOrNonLocalOnly, filter), count, selectedAgents, remove);
978 else selectNElementsInRandomOrder(filteredBegin(localOrNonLocalOnly, filter), popSize, count, selectedAgents, remove);
982 template<
typename filterStruct>
983 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly, std::set<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove,
int popSize){
984 if(popSize <= -1) selectNElementsAtRandom(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), byTypeFilteredEnd(localOrNonLocalOnly, type, filter), size(), selectedAgents, remove);
985 else selectNElementsAtRandom(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), popSize, size(), selectedAgents, remove);
989 template<
typename filterStruct>
990 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly, std::vector<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove,
int popSize){
991 if(popSize <= -1) selectNElementsInRandomOrder(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), byTypeFilteredEnd(localOrNonLocalOnly, type, filter), size(), selectedAgents, remove);
992 else selectNElementsInRandomOrder(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), popSize, size(), selectedAgents, remove);
996 template<
typename filterStruct>
997 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::set<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove,
int popSize){
998 if(popSize <= -1) selectNElementsAtRandom(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), byTypeFilteredEnd(localOrNonLocalOnly, type, filter), count, selectedAgents, remove);
999 else selectNElementsAtRandom(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), popSize, count, selectedAgents, remove);
1002 template<
typename T>
1003 template<
typename filterStruct>
1004 void SharedContext<T>::selectAgents(filterLocalFlag localOrNonLocalOnly,
int count, std::vector<T*>& selectedAgents,
int type, filterStruct& filter,
bool remove,
int popSize){
1005 if(popSize <= -1) selectNElementsInRandomOrder(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), byTypeFilteredEnd(localOrNonLocalOnly, type, filter), count, selectedAgents, remove);
1006 else selectNElementsInRandomOrder(byTypeFilteredBegin(localOrNonLocalOnly, type, filter), popSize, count, selectedAgents, remove);
1014 template<
typename T>
1018 while((iter != iterEnd)){
1019 if((*iter)->keepsAgentsOnSyncProj())
return true;
1025 template<
typename T>
1028 if((*iter)->sendsSecondaryAgentsOnStatusExchange())
return true;
1033 template<
typename T>
1034 void SharedContext<T>::getProjInfoExchangePartners(std::set<int>& sends, std::set<int>& recvs){
1035 for(
typename std::vector<Projection<T> *>::iterator iter = Context<T>::projections.begin(), iterEnd = Context<T>::projections.end(); iter != iterEnd; iter++){
1036 (*iter)->getInfoExchangePartners(sends, recvs);
1041 template<
typename T>
1042 void SharedContext<T>::getAgentStatusInfoExchangePartners(std::set<int>& sends, std::set<int>& recvs){
1043 for(
typename std::vector<Projection<T> *>::iterator iter = Context<T>::projections.begin(), iterEnd = Context<T>::projections.end(); iter != iterEnd; iter++){
1044 (*iter)->getAgentStatusExchangePartners(sends, recvs);
1049 template<
typename T>
1053 while((iter != iterEnd) && (agentsToTest.size() > 0)){
1054 (*iter)->getRequiredAgents(agentsToTest, agentsToKeep, radius);
1059 template<
typename T>
1061 if(agentsToKeep.size() > 0){
1062 const_state_aware_iterator iter = begin(NON_LOCAL), iterEnd = end(NON_LOCAL);
1063 std::set<AgentId>::iterator notFound = agentsToKeep.end();
1064 while(iter != iterEnd){
1065 AgentId id = (*iter)->getId();
1066 if(agentsToKeep.find(
id) == notFound) agentsToDrop.insert((*iter)->getId());
1071 const_state_aware_iterator iter = begin(NON_LOCAL), iterEnd = end(NON_LOCAL);
1072 while(iter != iterEnd){
1073 agentsToDrop.insert((*iter)->getId());
1077 getRequiredAgents(agentsToDrop, agentsToKeep, radius);
1080 template<
typename T>
1082 std::vector<AgentId> tmp;
1083 std::set<AgentId> agentsToTest;
1084 for(const_state_aware_iterator iter = begin(LOCAL), iterEnd = end(LOCAL); iter != iterEnd; ++iter){
1085 tmp.push_back((*iter)->getId());
1087 agentsToTest.insert(tmp.begin(), tmp.end());
1088 for(
typename std::vector<std::string>::iterator iter = getAgentsToPushProjOrder.begin(), iterEnd = getAgentsToPushProjOrder.end(); iter != iterEnd; iter++){
1093 template<
typename T>