Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize ratio evaluation in 1RDM estimator #1672

Merged
merged 8 commits into from Jun 28, 2019
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 36 additions & 10 deletions src/QMCHamiltonians/DensityMatrices1B.cpp
Expand Up @@ -312,6 +312,7 @@ void DensityMatrices1B::initialize()

rsamples.resize(samples);
sample_weights.resize(samples);
psi_ratios.resize(nparticles);

if (evaluator == matrix)
{
Expand Down Expand Up @@ -359,6 +360,16 @@ void DensityMatrices1B::initialize()
normalize();
}

const TimerNameList_t<DMTimers>
DMTimerNames = {{DM_eval , "DensityMatrices1B::evaluate"},
{DM_gen_samples , "DensityMatrices1B::generate_samples"},
{DM_gen_sample_basis , "DensityMatrices1B::generate_sample_basis"},
{DM_gen_sample_ratios , "DensityMatrices1B::generate_sample_ratios"},
{DM_gen_particle_basis, "DensityMatrices1B::generate_particle_basis"},
{DM_matrix_products , "DensityMatrices1B::evaluate_matrix_products"},
{DM_accumulate , "DensityMatrices1B::evaluate_matrix_accum"}};
setup_timers(timers,DMTimerNames,timer_level_fine);

initialized = true;
}

Expand Down Expand Up @@ -576,6 +587,7 @@ void DensityMatrices1B::warmup_sampling()

DensityMatrices1B::Return_t DensityMatrices1B::evaluate(ParticleSet& P)
{
timers[DM_eval]->start();
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
if (have_required_traces || !energy_mat)
{
if (check_derivatives)
Expand All @@ -587,6 +599,7 @@ DensityMatrices1B::Return_t DensityMatrices1B::evaluate(ParticleSet& P)
else
APP_ABORT("DensityMatrices1B::evaluate invalid evaluator");
}
timers[DM_eval]->stop();
return 0.0;
}

Expand All @@ -612,6 +625,7 @@ DensityMatrices1B::Return_t DensityMatrices1B::evaluate_matrix(ParticleSet& P)
generate_sample_ratios(Psi_NM); // conj(Psi ratio) : particles x samples
generate_particle_basis(P, Phi_NB); // conj(basis) : particles x basis_size
// perform integration via matrix products
timers[DM_matrix_products]->start();
for (int s = 0; s < nspecies; ++s)
{
Matrix_t& Psi_nm = *Psi_NM[s];
Expand All @@ -627,7 +641,9 @@ DensityMatrices1B::Return_t DensityMatrices1B::evaluate_matrix(ParticleSet& P)
product_AtB(Phi_nb, Phi_Psi_nb, *E_BB[s]); // (energies*conj(basis))^T*ratio*basis
}
}
timers[DM_matrix_products]->stop();
// accumulate data into collectables
timers[DM_accumulate]->start();
const int basis_size2 = basis_size * basis_size;
int ij = nindex;
for (int s = 0; s < nspecies; ++s)
Expand Down Expand Up @@ -664,6 +680,7 @@ DensityMatrices1B::Return_t DensityMatrices1B::evaluate_matrix(ParticleSet& P)
}
}
}
timers[DM_accumulate]->stop();


// jtk come back to this
Expand Down Expand Up @@ -874,6 +891,7 @@ DensityMatrices1B::Return_t DensityMatrices1B::evaluate_loop(ParticleSet& P)

inline void DensityMatrices1B::generate_samples(RealType weight, int steps)
{
timers[DM_gen_samples]->start();
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
RandomGenerator_t& rng = *uniform_random;
bool save = false;
if (steps == 0)
Expand Down Expand Up @@ -927,6 +945,7 @@ inline void DensityMatrices1B::generate_samples(RealType weight, int steps)
app_log() << " rmean = " << rmean << std::endl;
app_log() << " rstd = " << rstd << std::endl;
}
timers[DM_gen_samples]->stop();
}


Expand Down Expand Up @@ -1128,39 +1147,45 @@ void DensityMatrices1B::get_energies(std::vector<Vector_t*>& E_n)

void DensityMatrices1B::generate_sample_basis(Matrix_t& Phi_mb)
{
timers[DM_gen_sample_basis]->start();
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
int mb = 0;
for (int m = 0; m < samples; ++m)
{
update_basis(rsamples[m]);
for (int b = 0; b < basis_size; ++b, ++mb)
Phi_mb(mb) = basis_values[b];
}
timers[DM_gen_sample_basis]->stop();
}


void DensityMatrices1B::generate_sample_ratios(std::vector<Matrix_t*> Psi_nm)
{
int p = 0;
for (int s = 0; s < nspecies; ++s)
timers[DM_gen_sample_ratios]->start();
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
for (int m = 0; m < samples; ++m)
{
int nm = 0;
Matrix_t& P_nm = *Psi_nm[s];
for (int n = 0; n < species_size[s]; ++n, ++p)
// get N ratios for the current sample point
Pq.makeVirtualMoves(rsamples[m]);
Psi.evaluateRatiosAlltoOne(Pq, psi_ratios);

// collect ratios into per-species matrices
int p = 0;
for (int s = 0; s < nspecies; ++s)
{
PosType& Rp = Pq.R[p];
for (int m = 0; m < samples; ++m, ++nm)
Matrix_t& P_nm = *Psi_nm[s];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not necessary to fix now but keep in mind of replacing pointers with containers when you are refactoring old codes.

for (int n = 0; n < species_size[s]; ++n, ++p)
{
Pq.makeMove(p, rsamples[m] - Rp);
P_nm(nm) = qmcplusplus::conj(Psi.full_ratio(Pq, p));
Pq.rejectMove(p);
P_nm(n,m) = qmcplusplus::conj(psi_ratios[p]);
}
}
}
timers[DM_gen_sample_ratios]->stop();
}


void DensityMatrices1B::generate_particle_basis(ParticleSet& P, std::vector<Matrix_t*>& Phi_nb)
{
timers[DM_gen_particle_basis]->start();
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
int p = 0;
for (int s = 0; s < nspecies; ++s)
{
Expand All @@ -1173,6 +1198,7 @@ void DensityMatrices1B::generate_particle_basis(ParticleSet& P, std::vector<Matr
P_nb(nb) = qmcplusplus::conj(basis_values[b]);
}
}
timers[DM_gen_particle_basis]->stop();
}


Expand Down
24 changes: 24 additions & 0 deletions src/QMCHamiltonians/DensityMatrices1B.h
Expand Up @@ -22,6 +22,20 @@ namespace qmcplusplus
{
class DensityMatrices1B : public QMCHamiltonianBase
{
protected:
enum DMTimers
{
DM_eval,
DM_gen_samples,
DM_gen_sample_basis,
DM_gen_sample_ratios,
DM_gen_particle_basis,
DM_matrix_products,
DM_accumulate,
};

TimerList_t timers;

public:
enum
{
Expand Down Expand Up @@ -71,6 +85,7 @@ class DensityMatrices1B : public QMCHamiltonianBase
bool warmed_up;
std::vector<PosType> rsamples;
Vector<RealType> sample_weights;
std::vector<ValueType> psi_ratios;
RealType dens;
PosType drift;
int nindex;
Expand Down Expand Up @@ -138,6 +153,15 @@ class DensityMatrices1B : public QMCHamiltonianBase

RandomGenerator_t* uniform_random;

NewTimer* eval_timer;
ye-luo marked this conversation as resolved.
Show resolved Hide resolved
NewTimer* gen_samples_timer;
NewTimer* gen_sample_basis_timer;
NewTimer* gen_sample_ratios_timer;
NewTimer* gen_particle_basis_timer;
NewTimer* matrix_products_timer;
NewTimer* accumulate_timer;


//constructor/destructor
DensityMatrices1B(ParticleSet& P, TrialWaveFunction& psi, ParticleSet* Pcl);
DensityMatrices1B(DensityMatrices1B& master, ParticleSet& P, TrialWaveFunction& psi);
Expand Down