continuing population control work

This commit is contained in:
Peter Doak 2019-09-28 10:03:54 -04:00
parent 5653ffacd1
commit 30513ef5df
5 changed files with 23 additions and 8 deletions

View File

@ -411,6 +411,8 @@ struct Walker
*/
inline size_t byteSize()
{
// TODO: fix this! this is a non intuitive side effect for a size call
// breaks a bunch of things that could be const
if (!DataSet.size())
{
registerData();

View File

@ -513,8 +513,8 @@ void WalkerControlMPI::swapWalkersSimple(MCPopulation& pop, PopulationAdjustment
++messages_incoming;
if ( adjust.bad_walkers.size() > 0)
{
pop.kill_walker(adjust.bad_walkers.back());
adjust.bad_walkers.pop();
pop.killWalker(adjust.bad_walkers.back());
adjust.bad_walkers.pop_back();
}
}
@ -550,7 +550,7 @@ void WalkerControlMPI::swapWalkersSimple(MCPopulation& pop, PopulationAdjustment
messages_incoming *= 2; // extra message sent for multiplicity
if( messages_incoming > 0)
{
for( int im = 0 ; im < messasges_incoming; ++im)
for( int im = 0 ; im < messages_incoming; ++im)
{
WalkerMessage message(pop.spawnWalker(), MyContext);
receive_requests.push_back(myComm->comm.ireceive_value(message.multiplicity));

View File

@ -26,12 +26,12 @@ class WalkerControlMPITest;
struct WalkerMessage
{
const WalkerControlBase::MCPWalker& walker;
WalkerControlBase::MCPWalker& walker;
// i.e. MPI rank
const int target_rank;
int multiplicity = 1;
size_t byteSize = 0;
WalkerMessage(const WalkerControlBase::MCPWalker& walk, const int target) : walker(walk), target_rank(target){};
WalkerMessage(WalkerControlBase::MCPWalker& walk, const int target) : walker(walk), target_rank(target){};
};
bool operator==(const WalkerMessage& A, const WalkerMessage& B)

View File

@ -142,18 +142,30 @@ void MCPopulation::createWalkers(IndexType num_walkers)
/** creates a walker and returns a reference
*/
MCPopulation::MCPWalker& MCPopulation::spawnWalker(const MCPWalker& walker)
MCPopulation::MCPWalker& MCPopulation::spawnWalker()
{
auto it_walkers = walkers_.begin();
int walker_index;
while (it_walkers != walkers_.end())
{
if (*it_walkers == nullptr)
{
createWalkerInplace(*it_walkers);
allocateWalkerStuffInplace(walker_index);
break;
}
++walker_index;
}
// you need to add to all the vectors if no walkers have been killed
// for now we throw since this must be implemented
if (walker_index == walkers_.size())
throw std::runtime_error("Needed to add to population in MCPopulation but it is not implemented.");
return **it_walkers;
}
/** Kill a walker
*/
void MCPopulation::killWalker(const MCPWalker& walker)
void MCPopulation::killWalker(MCPWalker& walker)
{
// find the walker and null its pointer in the walker vector
auto it_walkers = walkers_.begin();

View File

@ -107,6 +107,7 @@ public:
MCPWalker& spawnWalker();
void killWalker(MCPWalker&);
void createWalkerInplace(UPtr<MCPWalker>& walker_ptr);
void allocateWalkerStuffInplace(int walker_index);
/** }@ */
void createWalkers();