Merge pull request #836 from ye-luo/remove-branch-clones

Remove branchEngine clones
This commit is contained in:
Mark Dewing 2018-05-03 14:58:36 -05:00 committed by GitHub
commit 7fff5094b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 18 additions and 121 deletions

View File

@ -81,7 +81,6 @@ CloneManager::~CloneManager()
{
// delete_iter(CSMovers.begin(),CSMovers.end());
delete_iter(Movers.begin(),Movers.end());
delete_iter(branchClones.begin(),branchClones.end());
delete_iter(estimatorClones.begin(),estimatorClones.end());
#if !defined(REMOVE_TRACEMANAGER)

View File

@ -83,8 +83,6 @@ protected:
std::vector<EstimatorManagerBase*> estimatorClones;
///trace managers
std::vector<TraceManager*> traceClones;
///Branch engines
std::vector<SimpleFixedNodeBranch*> branchClones;
//for correlated sampling.
static std::vector<std::vector<MCWalkerConfiguration*> > WPoolClones;

View File

@ -237,7 +237,6 @@ void CSVMC::resetRun()
if(Movers.empty())
{
CSMovers.resize(NumThreads,0);
branchClones.resize(NumThreads,0);
estimatorClones.resize(NumThreads,0);
traceClones.resize(NumThreads,0);
Rng.resize(NumThreads,0);
@ -255,8 +254,6 @@ void CSVMC::resetRun()
#endif
Rng[ip]=new RandomGenerator_t(*(RandomNumberControl::Children[ip]));
branchClones[ip] = new BranchEngineType(*branchEngine);
if(QMCDriverMode[QMC_UPDATE_MODE])
{
if (UseDrift == "yes")
@ -288,7 +285,7 @@ void CSVMC::resetRun()
app_log() << os.str() << std::endl;
CSMovers[ip]->put(qmcNode);
CSMovers[ip]->resetRun( branchClones[ip], estimatorClones[ip],traceClones[ip]);
CSMovers[ip]->resetRun(branchEngine, estimatorClones[ip],traceClones[ip]);
}
}
@ -314,7 +311,7 @@ void CSVMC::resetRun()
{
//int ip=omp_get_thread_num();
CSMovers[ip]->put(qmcNode);
CSMovers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
CSMovers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
if (QMCDriverMode[QMC_UPDATE_MODE])
CSMovers[ip]->initCSWalkersForPbyP(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1], nWarmupSteps>0);
else

View File

@ -85,10 +85,8 @@ void DMCOMP::resetComponents(xmlNodePtr cur)
{
delete Movers[ip];
delete estimatorClones[ip];
delete branchClones[ip];
estimatorClones[ip]= new EstimatorManagerBase(*Estimators);
estimatorClones[ip]->setCollectionMode(false);
branchClones[ip] = new BranchEngineType(*branchEngine);
#if !defined(REMOVE_TRACEMANAGER)
delete traceClones[ip];
traceClones[ip] = Traces->makeClone();
@ -101,7 +99,7 @@ void DMCOMP::resetComponents(xmlNodePtr cur)
{
Movers[ip] = new DMCUpdatePbyPWithRejectionFast(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
Movers[ip]->put(cur);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
Movers[ip]->initWalkersForPbyP(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
}
else
@ -111,7 +109,7 @@ void DMCOMP::resetComponents(xmlNodePtr cur)
else
Movers[ip] = new DMCUpdateAllWithRejection(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
Movers[ip]->put(cur);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
Movers[ip]->initWalkers(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
}
}
@ -136,7 +134,6 @@ void DMCOMP::resetUpdateEngines()
}
//if(QMCDriverMode[QMC_UPDATE_MODE]) W.clearAuxDataSet();
Movers.resize(NumThreads,0);
branchClones.resize(NumThreads,0);
Rng.resize(NumThreads,0);
estimatorClones.resize(NumThreads,0);
traceClones.resize(NumThreads,0);
@ -171,12 +168,11 @@ void DMCOMP::resetUpdateEngines()
Rng[ip]=new RandomGenerator_t(*RandomNumberControl::Children[ip]);
hClones[ip]->setRandomGenerator(Rng[ip]);
#endif
branchClones[ip] = new BranchEngineType(*branchEngine);
if(QMCDriverMode[QMC_UPDATE_MODE])
{
Movers[ip] = new DMCUpdatePbyPWithRejectionFast(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
Movers[ip]->put(qmcNode);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
Movers[ip]->initWalkersForPbyP(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
}
else
@ -186,7 +182,7 @@ void DMCOMP::resetUpdateEngines()
else
Movers[ip] = new DMCUpdateAllWithRejection(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
Movers[ip]->put(qmcNode);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
Movers[ip]->initWalkers(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
}
}
@ -302,7 +298,7 @@ bool DMCOMP::run()
for(int ip=1; ip<NumThreads; ++ip)
W.Collectables += wClones[ip]->Collectables;
}
branchEngine->branch(CurrentStep, W, branchClones);
branchEngine->branch(CurrentStep, W);
// if(storeConfigs && (CurrentStep%storeConfigs == 0)) {
// ForwardWalkingHistory.storeConfigsForForwardWalking(W);
// W.resetWalkerParents();

View File

@ -86,8 +86,6 @@ bool QMCUpdateBase::put(xmlNodePtr cur)
{
H.setNonLocalMoves(cur);
bool s=myParams.put(cur);
if (branchEngine)
branchEngine->put(cur);
return s;
}
@ -95,7 +93,6 @@ void QMCUpdateBase::resetRun(BranchEngineType* brancher, EstimatorManagerBase* e
{
Estimators=est;
branchEngine=brancher;
branchEngine->setEstimatorManager(est);
NumPtcl = W.getTotalNum();
deltaR.resize(NumPtcl);
drift.resize(NumPtcl);
@ -128,14 +125,6 @@ void QMCUpdateBase::resetRun(BranchEngineType* brancher, EstimatorManagerBase* e
Traces = traces;
}
void QMCUpdateBase::resetEtrial(RealType et)
{
//branchEngine->E_T=et;
branchEngine->setTrialEnergy(et,1.0);
branchEngine->flush(0);
}
void QMCUpdateBase::startRun(int blocks, bool record)
{
Estimators->start(blocks,record);

View File

@ -137,8 +137,6 @@ public:
/** stop a run */
void stopRun();
void stopRun2();
/** reset the trial energy */
void resetEtrial(RealType et);
/** prepare to start a block
* @param steps number of steps within the block
@ -272,7 +270,7 @@ protected:
///random number generator
RandomGenerator_t& RandomGen;
///branch engine
BranchEngineType* branchEngine;
const BranchEngineType* branchEngine;
///estimator
EstimatorManagerBase* Estimators;
///parameters

View File

@ -106,7 +106,7 @@ namespace qmcplusplus
if (Period4WalkerDump && now_loc % myPeriod4WalkerDump == 0)
wClones[ip]->saveEnsemble (wit, wit_end);
branchEngine->collect (CurrentStep, W, branchClones); //Ray Clay: For now, collects and syncs based on first reptile. Need a better way to do this.
branchEngine->collect (CurrentStep, W); //Ray Clay: For now, collects and syncs based on first reptile. Need a better way to do this.
}
Movers[ip]->stopBlock (false);
} //end-of-parallel for
@ -211,7 +211,6 @@ namespace qmcplusplus
if (Movers.empty ())
{
Movers.resize (NumThreads, 0);
branchClones.resize (NumThreads, 0);
estimatorClones.resize (NumThreads, 0);
traceClones.resize (NumThreads, 0);
Rng.resize (NumThreads, 0);
@ -229,7 +228,6 @@ namespace qmcplusplus
traceClones[ip] = Traces->makeClone ();
#endif
hClones[ip]->setRandomGenerator (Rng[ip]);
branchClones[ip] = new BranchEngineType (*branchEngine);
if (QMCDriverMode[QMC_UPDATE_MODE])
{
os <<
@ -271,7 +269,7 @@ namespace qmcplusplus
for (int ip = 0; ip < NumThreads; ++ip)
{
Movers[ip]->put (qmcNode);
Movers[ip]->resetRun (branchClones[ip], estimatorClones[ip],
Movers[ip]->resetRun (branchEngine, estimatorClones[ip],
traceClones[ip]);
// wClones[ip]->reptile = new Reptile(*wClones[ip], W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
wClones[ip]->reptile = W.ReptileList[ip];
@ -316,7 +314,7 @@ namespace qmcplusplus
{
Movers[ip]->advanceWalkers (W.begin () + wPerNode[ip],
W.begin () + wPerNode[ip + 1], false);
branchEngine->collect (CurrentStep, W, branchClones);
branchEngine->collect (CurrentStep, W);
}
}

View File

@ -121,7 +121,6 @@ void SimpleFixedNodeBranch::start(const std::string& froot, bool append)
MyEstimator->reset();
}
//void SimpleFixedNodeBranch::initWalkerController(MCWalkerConfiguration& walkers, RealType tau, bool fixW, bool killwalker)
int SimpleFixedNodeBranch::initWalkerController(MCWalkerConfiguration& walkers, bool fixW, bool killwalker)
{
BranchMode.set(B_DMC,1);//set DMC
@ -180,7 +179,7 @@ int SimpleFixedNodeBranch::initWalkerController(MCWalkerConfiguration& walkers,
//update the simulation parameters
WalkerController->put(myNode);
//assign current Eref and a large number for variance
WalkerController->setEnergyAndVariance(vParam[B_EREF],vParam[B_SIGMA2]);
WalkerController->setTrialEnergy(vParam[B_ETRIAL]);
this->reset();
if(fromscratch)
{
@ -371,24 +370,9 @@ void SimpleFixedNodeBranch::branch(int iter, MCWalkerConfiguration& walkers)
MyEstimator->accumulate(walkers);
}
/** perform branching
*
* Set the trial energy of clones
*/
void SimpleFixedNodeBranch::branch(int iter, MCWalkerConfiguration& walkers, std::vector<ThisType*>& clones)
{
branch(iter,walkers);
//synchronize it
for(int i=0; i<clones.size(); i++)
clones[i]->vParam=vParam;
if((BranchMode[B_DMCSTAGE])&&(ToDoSteps==0))
for(int i=0; i<clones.size(); i++)
clones[i]->BranchMode=BranchMode;
}
/**
*
*/
void SimpleFixedNodeBranch::collect(int iter, MCWalkerConfiguration& W)
{
//Update the current energy and accumulate.
@ -476,23 +460,9 @@ void SimpleFixedNodeBranch::collect(int iter, MCWalkerConfiguration& W)
MyEstimator->accumulate(W);
}
//Ray Clay: Have to come up with a better way to collect and sync up reptile copies. This is taken from DMC. See RMCSingleOMP
void SimpleFixedNodeBranch::collect(int iter, MCWalkerConfiguration& W, std::vector<ThisType*>& clones)
{
collect(iter,W);
//synchronize it
for(int i=0; i<clones.size(); i++)
clones[i]->vParam=vParam;
if((BranchMode[B_RMCSTAGE])&&(ToDoSteps==0))
for(int i=0; i<clones.size(); i++)
clones[i]->BranchMode=BranchMode;
}
/** Calculates and saves various action components, also does necessary updates for running averages.
*
*/
void SimpleFixedNodeBranch::reset()
{
//use effective time step of BranchInterval*Tau
@ -634,7 +604,6 @@ int SimpleFixedNodeBranch::resetRun(xmlNodePtr cur)
WalkerController->put(myNode);
ToDoSteps=iParam[B_WARMUPSTEPS]=(iParam[B_WARMUPSTEPS])?iParam[B_WARMUPSTEPS]:10;
setBranchCutoff(vParam[B_SIGMA2],WalkerController->targetSigma,10);
WalkerController->setEnergyAndVariance(vParam[B_EREF],vParam[B_SIGMA2]);
WalkerController->reset();
#ifdef QMC_CUDA
reset(); // needed. Ye

View File

@ -359,33 +359,18 @@ struct SimpleFixedNodeBranch: public QMCTraits
return vParam[B_TAUEFF];
}
inline void setTrialEnergy(RealType etot, RealType wtot=1.0)
{
vParam[B_EREF]=vParam[B_ETRIAL]=etot/wtot;
//Eref=Etrial=etot/wtot;
}
/** perform branching
* @param iter current step
* @param w Walker configuration
*/
void branch(int iter, MCWalkerConfiguration& w);
/** perform branching
* @param iter the iteration
* @param w the walker ensemble
* @param clones of the branch engine for OpenMP threads
*/
void branch(int iter, MCWalkerConfiguration& w, std::vector<ThisType*>& clones);
/** update RMC counters and running averages.
* @param iter the iteration
* @param w the walker ensemble
* @param clones of the branch engine for OpenMP threads
*/
void collect(int iter, MCWalkerConfiguration& w);
void collect(int iter, MCWalkerConfiguration& w, std::vector<ThisType*>& clones);
/** restart averaging
* @param counter Counter to determine the cummulative average will be reset.

View File

@ -481,7 +481,6 @@ void VMCLinearOptOMP::resetRun()
{
Movers.resize(NumThreads,0);
// CSMovers.resize(NumThreads,0);
branchClones.resize(NumThreads,0);
estimatorClones.resize(NumThreads,0);
traceClones.resize(NumThreads,0);
Rng.resize(NumThreads,0);
@ -502,7 +501,6 @@ void VMCLinearOptOMP::resetRun()
#endif
Rng[ip]=new RandomGenerator_t(*(RandomNumberControl::Children[ip]));
hClones[ip]->setRandomGenerator(Rng[ip]);
branchClones[ip] = new BranchEngineType(*branchEngine);
if (QMCDriverMode[QMC_UPDATE_MODE])
{
// if (UseDrift == "rn")
@ -526,7 +524,7 @@ void VMCLinearOptOMP::resetRun()
// CSMovers[ip]=
Movers[ip]=new VMCUpdatePbyP(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
// }
//Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip]);
//Movers[ip]->resetRun(branchEngine,estimatorClones[ip]);
}
else
{
@ -549,7 +547,7 @@ void VMCLinearOptOMP::resetRun()
// CSMovers[ip]=
Movers[ip]=new VMCUpdateAll(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
// }
//Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip]);
//Movers[ip]->resetRun(branchEngine,estimatorClones[ip]);
}
if (ip==0)
app_log() << os.str() << std::endl;
@ -570,8 +568,8 @@ void VMCLinearOptOMP::resetRun()
int ip=omp_get_thread_num();
Movers[ip]->put(qmcNode);
// CSMovers[ip]->put(qmcNode);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
// CSMovers[ip]->resetRun(branchClones[ip],estimatorClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
// CSMovers[ip]->resetRun(branchEngine,estimatorClones[ip]);
if (QMCDriverMode[QMC_UPDATE_MODE])
Movers[ip]->initWalkersForPbyP(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
else

View File

@ -157,7 +157,6 @@ void VMCSingleOMP::resetRun()
{
movers_created=true;
Movers.resize(NumThreads,0);
branchClones.resize(NumThreads,0);
estimatorClones.resize(NumThreads,0);
traceClones.resize(NumThreads,0);
Rng.resize(NumThreads,0);
@ -177,7 +176,6 @@ void VMCSingleOMP::resetRun()
Rng[ip]=new RandomGenerator_t(*(RandomNumberControl::Children[ip]));
hClones[ip]->setRandomGenerator(Rng[ip]);
#endif
branchClones[ip] = new BranchEngineType(*branchEngine);
if (QMCDriverMode[QMC_UPDATE_MODE])
{
Movers[ip]=new VMCUpdatePbyP(*wClones[ip],*psiClones[ip],*hClones[ip],*Rng[ip]);
@ -235,7 +233,7 @@ void VMCSingleOMP::resetRun()
{
//int ip=omp_get_thread_num();
Movers[ip]->put(qmcNode);
Movers[ip]->resetRun(branchClones[ip],estimatorClones[ip],traceClones[ip]);
Movers[ip]->resetRun(branchEngine,estimatorClones[ip],traceClones[ip]);
if (QMCDriverMode[QMC_UPDATE_MODE])
Movers[ip]->initWalkersForPbyP(W.begin()+wPerNode[ip],W.begin()+wPerNode[ip+1]);
else

View File

@ -27,8 +27,7 @@ namespace qmcplusplus
WalkerControlBase::WalkerControlBase(Communicate* c, bool rn)
: MPIObjectBase(c), SwapMode(0), Nmin(1), Nmax(10)
, MaxCopy(2), NumWalkersCreated(0), NumWalkersSent(0)
, targetEnergyBound(10), targetVar(2), targetSigma(10)
, dmcStream(0), WriteRN(rn)
, targetSigma(10), dmcStream(0), WriteRN(rn)
{
MyMethod=-1; //assign invalid method
NumContexts=myComm->size();
@ -560,7 +559,6 @@ bool WalkerControlBase::put(xmlNodePtr cur)
int nw_target=0, nw_max=0;
std::string nonblocking="yes";
ParameterSet params;
params.add(targetEnergyBound,"energyBound","double");
params.add(targetSigma,"sigmaBound","double");
params.add(MaxCopy,"maxCopy","int");
params.add(nw_target,"targetwalkers","int");

View File

@ -94,16 +94,8 @@ public:
IndexType NumWalkersSent;
///trial energy energy
RealType trialEnergy;
///target average energy
RealType targetAvg;
///target average variance
RealType targetVar;
///target sigma to limit fluctuations of the trial energy
RealType targetSigma;
///bound of the energy window
RealType targetEnergyBound;
///current variance
RealType curVar;
///number of particle per node
std::vector<int> NumPerNode;
///offset of the particle index
@ -179,15 +171,6 @@ public:
return curData[i];
}
/** set the target average and variance
*/
inline void setEnergyAndVariance(RealType e, RealType v)
{
trialEnergy=e;
targetAvg=e;
targetVar=v;
}
/** update properties without branching */
int doNotBranch(int iter, MCWalkerConfiguration& W);

View File

@ -53,18 +53,9 @@ TEST_CASE("Fixed node branch", "[drivers][walker_control]")
REQUIRE(fnb.getTau() == Approx(tau));
fnb.advanceQMCCounter();
REQUIRE(fnb.iParam[SimpleFixedNodeBranch::B_COUNTER] == 0);
fnb.setTrialEnergy(-4.0);
REQUIRE(fnb.getEtrial() == Approx(-4.0));
REQUIRE(fnb.getEref() == Approx(-4.0));
// default is classic cutoff scheme
//fnb.setBranchCutoff();
}