QMCPACK
TWFdispatcher.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2021 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 #include "TWFdispatcher.h"
14 #include <cassert>
15 #include "TrialWaveFunction.h"
16 
17 namespace qmcplusplus
18 {
19 TWFdispatcher::TWFdispatcher(bool use_batch) : use_batch_(use_batch) {}
20 
22  const RefVectorWithLeader<ParticleSet>& p_list) const
23 {
24  assert(wf_list.size() == p_list.size());
25  if (use_batch_)
26  TrialWaveFunction::mw_evaluateLog(wf_list, p_list);
27  else
28  for (size_t iw = 0; iw < wf_list.size(); iw++)
29  wf_list[iw].evaluateLog(p_list[iw]);
30 }
31 
34  const std::vector<bool>& recompute) const
35 {
36  assert(wf_list.size() == p_list.size());
37  if (use_batch_)
38  TrialWaveFunction::mw_recompute(wf_list, p_list, recompute);
39  else
40  for (size_t iw = 0; iw < wf_list.size(); iw++)
41  if (recompute[iw])
42  wf_list[iw].recompute(p_list[iw]);
43 }
44 
47  int iat,
48  std::vector<PsiValue>& ratios,
49  ComputeType ct) const
50 {
51  assert(wf_list.size() == p_list.size());
52  if (use_batch_)
53  TrialWaveFunction::mw_calcRatio(wf_list, p_list, iat, ratios, ct);
54  else
55  {
56  const int num_wf = wf_list.size();
57  ratios.resize(num_wf);
58  for (size_t iw = 0; iw < num_wf; iw++)
59  ratios[iw] = wf_list[iw].calcRatio(p_list[iw], iat, ct);
60  }
61 }
62 
65  int ig) const
66 {
67  assert(wf_list.size() == p_list.size());
68  if (use_batch_)
69  TrialWaveFunction::mw_prepareGroup(wf_list, p_list, ig);
70  else
71  for (size_t iw = 0; iw < wf_list.size(); iw++)
72  wf_list[iw].prepareGroup(p_list[iw], ig);
73 }
74 
75 template<CoordsType CT>
78  int iat,
79  TWFGrads<CT>& grads) const
80 {
81  assert(wf_list.size() == p_list.size());
82  if (use_batch_)
83  TrialWaveFunction::mw_evalGrad(wf_list, p_list, iat, grads);
84  else
85  {
86  const int num_wf = wf_list.size();
87  assert(grads.grads_positions.size() == wf_list.size());
88  for (size_t iw = 0; iw < num_wf; iw++)
89  if constexpr (CT == CoordsType::POS_SPIN)
90  grads.grads_positions[iw] = wf_list[iw].evalGradWithSpin(p_list[iw], iat, grads.grads_spins[iw]);
91  else
92  grads.grads_positions[iw] = wf_list[iw].evalGrad(p_list[iw], iat);
93  }
94 }
95 
96 template<CoordsType CT>
99  int iat,
100  std::vector<PsiValue>& ratios,
101  TWFGrads<CT>& grads) const
102 {
103  assert(wf_list.size() == p_list.size());
104  if (use_batch_)
105  TrialWaveFunction::mw_calcRatioGrad(wf_list, p_list, iat, ratios, grads);
106  else
107  {
108  const int num_wf = wf_list.size();
109  ratios.resize(num_wf);
110  assert(wf_list.size() == grads.grads_positions.size());
111  for (size_t iw = 0; iw < num_wf; iw++)
112  if constexpr (CT == CoordsType::POS_SPIN)
113  ratios[iw] =
114  wf_list[iw].calcRatioGradWithSpin(p_list[iw], iat, grads.grads_positions[iw], grads.grads_spins[iw]);
115  else
116  ratios[iw] = wf_list[iw].calcRatioGrad(p_list[iw], iat, grads.grads_positions[iw]);
117  }
118 }
119 
121  const RefVectorWithLeader<ParticleSet>& p_list,
122  int iat,
123  const std::vector<bool>& isAccepted,
124  bool safe_to_delay) const
125 {
126  assert(wf_list.size() == p_list.size());
127  if (use_batch_)
128  TrialWaveFunction::mw_accept_rejectMove(wf_list, p_list, iat, isAccepted, safe_to_delay);
129  else
130  for (size_t iw = 0; iw < wf_list.size(); iw++)
131  if (isAccepted[iw])
132  wf_list[iw].acceptMove(p_list[iw], iat, safe_to_delay);
133  else
134  wf_list[iw].rejectMove(iat);
135 }
136 
138 {
139  if (use_batch_)
141  else
142  for (TrialWaveFunction& wf : wf_list)
143  wf.completeUpdates();
144 }
145 
147  const RefVectorWithLeader<ParticleSet>& p_list,
148  bool fromscratch) const
149 {
150  assert(wf_list.size() == p_list.size());
151  if (use_batch_)
152  TrialWaveFunction::mw_evaluateGL(wf_list, p_list, fromscratch);
153  else
154  for (size_t iw = 0; iw < wf_list.size(); iw++)
155  wf_list[iw].evaluateGL(p_list[iw], fromscratch);
156 }
157 
160  const RefVector<std::vector<ValueType>>& ratios_list,
161  ComputeType ct) const
162 {
163  assert(wf_list.size() == vp_list.size());
164  assert(wf_list.size() == ratios_list.size());
165  if (use_batch_)
166  TrialWaveFunction::mw_evaluateRatios(wf_list, vp_list, ratios_list, ct);
167  else
168  for (size_t iw = 0; iw < wf_list.size(); iw++)
169  wf_list[iw].evaluateRatios(vp_list[iw], ratios_list[iw], ct);
170 }
171 
172 template void TWFdispatcher::flex_evalGrad<CoordsType::POS>(const RefVectorWithLeader<TrialWaveFunction>& wf_list,
173  const RefVectorWithLeader<ParticleSet>& p_list,
174  int iat,
175  TWFGrads<CoordsType::POS>& grads) const;
176 template void TWFdispatcher::flex_evalGrad<CoordsType::POS_SPIN>(const RefVectorWithLeader<TrialWaveFunction>& wf_list,
177  const RefVectorWithLeader<ParticleSet>& p_list,
178  int iat,
179  TWFGrads<CoordsType::POS_SPIN>& grads) const;
180 template void TWFdispatcher::flex_calcRatioGrad<CoordsType::POS>(const RefVectorWithLeader<TrialWaveFunction>& wf_list,
181  const RefVectorWithLeader<ParticleSet>& p_list,
182  int iat,
183  std::vector<PsiValue>& ratios,
184  TWFGrads<CoordsType::POS>& grads) const;
185 template void TWFdispatcher::flex_calcRatioGrad<CoordsType::POS_SPIN>(
187  const RefVectorWithLeader<ParticleSet>& p_list,
188  int iat,
189  std::vector<PsiValue>& ratios,
190  TWFGrads<CoordsType::POS_SPIN>& grads) const;
191 
192 } // namespace qmcplusplus
void flex_evalGrad(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, TWFGrads< CT > &grads) const
void flex_accept_rejectMove(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, const std::vector< bool > &isAccepted, bool safe_to_delay) const
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
void flex_evaluateGL(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, bool fromscratch) const
static void mw_prepareGroup(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int ig)
batched version of prepareGroup
static void mw_calcRatioGrad(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, std::vector< PsiValue > &ratios, TWFGrads< CT > &grads)
batched version of ratioGrad
TWFdispatcher(bool use_batch)
static void mw_accept_rejectMove(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, const std::vector< bool > &isAccepted, bool safe_to_delay=false)
void flex_evaluateLog(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list) const
void flex_prepareGroup(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int ig) const
static void mw_evaluateGL(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, bool fromscratch)
void flex_recompute(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, const std::vector< bool > &recompute) const
void flex_completeUpdates(const RefVectorWithLeader< TrialWaveFunction > &wf_list) const
static void mw_calcRatio(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, std::vector< PsiValue > &ratios, ComputeType ct=ComputeType::ALL)
batched version of calcRatio
void flex_evaluateRatios(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< const VirtualParticleSet > &vp_list, const RefVector< std::vector< ValueType >> &ratios_list, ComputeType ct) const
void flex_calcRatio(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, std::vector< PsiValue > &ratios, ComputeType ct=ComputeType::ALL) const
ComputeType
enum type for computing partial WaveFunctionComponents
static void mw_evalGrad(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, TWFGrads< CT > &grads)
batched version of evalGrad
void flex_calcRatioGrad(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, std::vector< PsiValue > &ratios, TWFGrads< CT > &grads) const
static void mw_completeUpdates(const RefVectorWithLeader< TrialWaveFunction > &wf_list)
Declaration of a TrialWaveFunction.
std::vector< std::reference_wrapper< T > > RefVector
static void mw_recompute(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, const std::vector< bool > &recompute)
batched version of recompute
Class to represent a many-body trial wave function.
static void mw_evaluateRatios(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< const VirtualParticleSet > &Vp_list, const RefVector< std::vector< ValueType >> &ratios_list, ComputeType ct=ComputeType::ALL)
batched version of evaluateRatios Note: unlike other mw_ static functions, *this is the batch leader ...
static void mw_evaluateLog(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list)
batched version of evaluateLog.