44 static const std::vector<std::string>
suffixes{
"V",
"VGL",
"accept",
"NLratio",
45 "recompute",
"buffer",
"derivs",
"preparegroup"};
50 std::string prefix = std::string(
"WaveFunction:").append(myName).append(
"::");
51 for (std::size_t i = 0; i <
suffixes.size(); ++i)
52 timer_names.push_back({static_cast<TimerEnum>(i), prefix + suffixes[i]});
57 : runtime_options_(runtime_options),
62 BufferCursor_scalar(0),
67 use_tasking_(tasking),
71 throw std::runtime_error(
"TrialWaveFunction::TrialWaveFunction mismatched timer enums and suffixes");
89 std::string aname = aterm->getClassName();
90 if (!aterm->getName().empty())
91 aname +=
":" + aterm->getName();
93 if (aterm->isFermionic())
94 app_log() <<
" Added a fermionic WaveFunctionComponent " << aname << std::endl;
99 Z.emplace_back(std::move(aterm));
104 auto spoit =
spomap_->find(name);
106 throw std::runtime_error(
"SPOSet " + name +
" cannot be found!");
107 return *spoit->second;
113 for (
auto& component :
Z)
114 if (
auto* comp_ptr = dynamic_cast<MultiSlaterDetTableMethod*>(component.get()); comp_ptr)
115 refs.push_back(*comp_ptr);
129 for (
int i = 0; i <
Z.size(); ++i)
134 auto subterm =
Z[i]->evaluateLog(P, P.
G, P.
L);
138 logpsi +=
Z[i]->evaluateLog(P, P.
G, P.
L);
164 const int num_particles = p_leader.getTotalNum();
167 grad.resize(num_particles);
168 lapl.resize(num_particles);
174 for (
int iw = 0; iw < wf_list.size(); iw++)
175 initGandL(wf_list[iw], g_list[iw], l_list[iw]);
177 auto& wavefunction_components = wf_leader.Z;
178 const int num_wfc = wf_leader.Z.size();
179 for (
int i = 0; i < num_wfc; ++i)
183 wavefunction_components[i]->mw_evaluateLog(wfc_list, p_list, g_list, l_list);
186 for (
int iw = 0; iw < wf_list.size(); iw++)
191 for (
int i = 0; i < num_wfc; ++i)
207 for (
int i = 0; i <
Z.size(); ++i)
216 const std::vector<bool>& recompute)
222 auto& wavefunction_components = wf_leader.Z;
223 const int num_wfc = wf_leader.Z.size();
224 for (
int i = 0; i < num_wfc; ++i)
228 wavefunction_components[i]->mw_recompute(wfc_list, p_list,
recompute);
238 for (
int i = 0; i <
Z.size(); ++i)
241 if (
Z[i]->isOptimizable())
242 logpsi +=
Z[i]->evaluateLog(P, P.
G, P.
L);
255 for (
int i = 0; i <
Z.size(); ++i)
258 if (!
Z[i]->isOptimizable())
279 for (
int i = 0; i <
Z.size(); ++i)
282 if (
Z[i]->isOptimizable())
283 logpsi_opt +=
Z[i]->evaluateLog(P, P.
G, P.
L);
285 logpsi_fixed +=
Z[i]->evaluateLog(P, fixedG, fixedL);
296 std::vector<RealType>& logpsi_fixed_list,
297 std::vector<RealType>& logpsi_opt_list,
305 const int num_particles = p_leader.getTotalNum();
311 grad.resize(num_particles);
312 lapl.resize(num_particles);
318 for (
int iw = 0; iw < wf_list.size(); iw++)
319 initGandL(wf_list[iw], g_list[iw], l_list[iw]);
320 auto& wavefunction_components = wf_leader.Z;
321 const int num_wfc = wf_leader.Z.size();
322 for (
int i = 0; i < num_wfc; ++i)
326 if (wavefunction_components[i]->isOptimizable())
328 wavefunction_components[i]->mw_evaluateLog(wfc_list, p_list, g_list, l_list);
329 for (
int iw = 0; iw < wf_list.size(); iw++)
330 logpsi_opt_list[iw] +=
std::real(wfc_list[iw].get_log_value());
334 wavefunction_components[i]->mw_evaluateLog(wfc_list, p_list, fixedG_list, fixedL_list);
335 for (
int iw = 0; iw < wf_list.size(); iw++)
336 logpsi_fixed_list[iw] +=
std::real(wfc_list[iw].get_log_value());
347 for (
int iw = 0; iw < wf_list.size(); iw++)
348 addAndCopyToP(p_list[iw], wf_list[iw], fixedG_list[iw], fixedL_list[iw]);
354 std::vector<RealType>& logpsi_list,
363 int num_particles = p_leader.getTotalNum();
370 grad.resize(num_particles);
371 lapl.resize(num_particles);
377 for (
int iw = 0; iw < wf_list.size(); iw++)
378 initGandL(wf_list[iw], g_list[iw], l_list[iw]);
381 auto& wavefunction_components = wf_leader.Z;
382 const int num_wfc = wf_leader.Z.size();
385 for (
int i = 0; i < num_wfc; ++i)
386 if (wavefunction_components[i]->isOptimizable())
390 wavefunction_components[i]->mw_evaluateLog(wfc_list, p_list, g_list, l_list);
391 for (
int iw = 0; iw < wf_list.size(); iw++)
392 logpsi_list[iw] +=
std::real(wfc_list[iw].get_log_value());
401 for (
int iw = 0; iw < wf_list.size(); iw++)
402 copyToP(p_list[iw], wf_list[iw]);
409 for (
int i = 0; i < num_wfc; ++i)
410 if (!wavefunction_components[i]->isOptimizable())
414 wavefunction_components[i]->mw_evaluateLog(wfc_list, p_list, dummyG_list, dummyL_list);
438 for (
int i = 0; i <
Z.size(); i++)
442 Z[i]->evaluateHessian(P, tmp_hess);
443 grad_grad_psi += tmp_hess;
454 for (
int i = 0; i <
Z.size(); i++)
459 r *=
Z[i]->ratio(P, iat);
469 std::vector<PsiValue>& ratios,
472 const int num_wf = wf_list.size();
473 ratios.resize(num_wf);
474 std::fill(ratios.begin(), ratios.end(),
PsiValue(1));
478 const int num_wfc = wf_leader.Z.size();
479 auto& wavefunction_components = wf_leader.Z;
481 std::vector<PsiValue> ratios_z(num_wf);
482 for (
int i = 0; i < num_wfc; i++)
489 wavefunction_components[i]->mw_calcRatio(wfc_list, p_list, iat, ratios_z);
490 for (
int iw = 0; iw < wf_list.size(); iw++)
491 ratios[iw] *= ratios_z[iw];
495 for (
int iw = 0; iw < wf_list.size(); iw++)
498 wf_list[iw].PhaseDiff = std::arg(ratios[iw]);
504 for (
int i = 0; i <
Z.size(); ++i)
514 const int num_wfc = wf_leader.Z.size();
515 auto& wavefunction_components = wf_leader.Z;
517 for (
int i = 0; i < num_wfc; i++)
521 wavefunction_components[i]->mw_prepareGroup(wfc_list, p_list, ig);
529 for (
int i = 0; i <
Z.size(); ++i)
532 grad_iat +=
Z[i]->evalGrad(P, iat);
543 for (
int i = 0; i <
Z.size(); ++i)
546 grad_iat +=
Z[i]->evalGradWithSpin(P, iat, spingrad);
552 template<CoordsType CT>
558 const int num_wf = wf_list.size();
564 const int num_wfc = wf_leader.Z.size();
565 auto& wavefunction_components = wf_leader.Z;
568 for (
int i = 0; i < num_wfc; i++)
572 wavefunction_components[i]->mw_evalGrad(wfc_list, p_list, iat, grads_z);
576 for (
const GradType& grads : grads.grads_positions)
585 for (
int i = 0; i <
Z.size(); ++i)
598 for (
int dim = 0; dim <
OHMMS_DIM; dim++)
599 for (
int i = 0; i < grad_grad[0].
size(); i++)
602 lapl_grad[dim][i] = 0.0;
604 for (
int i = 0; i <
Z.size(); ++i)
605 grad_iat +=
Z[i]->
evalGradSource(P, source, iat, grad_grad, lapl_grad);
616 std::vector<GradType> grad_components(
Z.size(),
GradType(0.0));
617 std::vector<PsiValue> ratio_components(
Z.size(), 0.0);
618 PRAGMA_OMP_TASKLOOP(
"omp taskloop default(shared)")
619 for (
int i = 0; i <
Z.size(); ++i)
622 ratio_components[i] =
Z[i]->ratioGrad(P, iat, grad_components[i]);
625 for (
int i = 0; i <
Z.size(); ++i)
627 grad_iat += grad_components[i];
628 r *= ratio_components[i];
632 for (
int i = 0; i <
Z.size(); ++i)
635 r *=
Z[i]->ratioGrad(P, iat, grad_iat);
655 for (
int i = 0; i <
Z.size(); ++i)
658 r *=
Z[i]->ratioGradWithSpin(P, iat, grad_iat, spingrad_iat);
669 template<CoordsType CT>
673 std::vector<PsiValue>& ratios,
676 const int num_wf = wf_list.size();
677 ratios.resize(num_wf);
678 std::fill(ratios.begin(), ratios.end(),
PsiValue(1));
683 const int num_wfc = wf_leader.Z.size();
684 auto& wavefunction_components = wf_leader.Z;
686 if (wf_leader.use_tasking_)
688 std::vector<std::vector<PsiValue>> ratios_components(num_wfc, std::vector<PsiValue>(wf_list.size()));
689 std::vector<TWFGrads<CT>> grads_components(num_wfc,
TWFGrads<CT>(num_wf));
690 PRAGMA_OMP_TASKLOOP(
"omp taskloop default(shared)")
691 for (
int i = 0; i < num_wfc; ++i)
695 wavefunction_components[i]->mw_ratioGrad(wfc_list, p_list, iat, ratios_components[i], grads_components[i]);
698 for (
int i = 0; i < num_wfc; ++i)
700 grad_new += grads_components[i];
701 for (
int iw = 0; iw < wf_list.size(); iw++)
702 ratios[iw] *= ratios_components[i][iw];
707 std::vector<PsiValue> ratios_z(wf_list.size());
708 for (
int i = 0; i < num_wfc; ++i)
712 wavefunction_components[i]->mw_ratioGrad(wfc_list, p_list, iat, ratios_z, grad_new);
713 for (
int iw = 0; iw < wf_list.size(); iw++)
714 ratios[iw] *= ratios_z[iw];
717 for (
int iw = 0; iw < wf_list.size(); iw++)
719 wf_list[iw].PhaseDiff = std::arg(ratios[iw]);
723 "TWF::mw_calcRatioGrad at particle " + std::to_string(iat));
729 std::ostringstream o;
730 o <<
"--- reporting " << tag << std::endl <<
" ---" << std::endl;
731 for (
int iat = 0; iat <
L.size(); iat++)
732 o <<
"index: " << std::fixed << iat << std::scientific <<
" G: " <<
G[iat][0] <<
" " <<
G[iat][1] <<
" " 733 <<
G[iat][2] <<
" L: " <<
L[iat] << std::endl;
734 o <<
"--- end ---" << std::endl;
735 std::cout << o.str();
746 for (
int i = 0; i <
Z.size(); i++)
761 PRAGMA_OMP_TASKLOOP(
"omp taskloop default(shared) if (use_tasking_)")
762 for (
int i = 0; i <
Z.size(); i++)
765 Z[i]->acceptMove(P, iat, safe_to_delay);
770 for (
int i = 0; i <
Z.size(); i++)
777 const std::vector<bool>& isAccepted,
782 const int num_wfc = wf_leader.Z.size();
783 auto& wavefunction_components = wf_leader.Z;
785 for (
int iw = 0; iw < wf_list.size(); iw++)
788 wf_list[iw].log_real_ = 0;
789 wf_list[iw].PhaseValue = 0;
792 PRAGMA_OMP_TASKLOOP(
"omp taskloop default(shared) if (wf_leader.use_tasking_)")
793 for (
int i = 0; i < num_wfc; i++)
797 wavefunction_components[i]->mw_accept_rejectMove(wfc_list, p_list, iat, isAccepted, safe_to_delay);
798 for (
int iw = 0; iw < wf_list.size(); iw++)
801 wf_list[iw].log_real_ +=
std::real(wfc_list[iw].get_log_value());
802 wf_list[iw].PhaseValue +=
std::imag(wfc_list[iw].get_log_value());
810 for (
int i = 0; i <
Z.size(); i++)
813 Z[i]->completeUpdates();
821 const int num_wfc = wf_leader.Z.size();
822 auto& wavefunction_components = wf_leader.Z;
824 for (
int i = 0; i < num_wfc; i++)
828 wavefunction_components[i]->mw_completeUpdates(wfc_list);
838 for (
int i = 0; i <
Z.size(); ++i)
841 logpsi +=
Z[i]->evaluateGL(P, P.
G, P.
L, fromscratch);
865 const int num_particles = p_leader.getTotalNum();
868 wfs.G.resize(num_particles);
869 wfs.L.resize(num_particles);
872 wfs.log_real_ =
czero;
873 wfs.PhaseValue =
czero;
876 auto& wavefunction_components = wf_leader.Z;
877 const int num_wfc = wf_leader.Z.size();
879 for (
int i = 0; i < num_wfc; ++i)
883 wavefunction_components[i]->mw_evaluateGL(wfc_list, p_list, g_list, l_list, fromscratch);
886 for (
int iw = 0; iw < wf_list.size(); iw++)
891 for (
int i = 0; i < num_wfc; ++i)
907 for (
int i = 0; i <
Z.size(); i++)
916 obj.checkInVariablesExclusive(active);
921 for (
int i = 0; i <
Z.size(); i++)
922 if (
Z[i]->isOptimizable())
930 obj.resetParametersExclusive(active);
937 obj.reportStatus(os);
942 lvals.resize(
Z.size(), 0);
943 for (
int i = 0; i <
Z.size(); i++)
951 pvals.resize(
Z.size(), 0);
952 for (
int i = 0; i <
Z.size(); i++)
964 for (
int i = 0; i <
Z.size(); ++i)
967 Z[i]->registerData(P, buf);
978 std::ostringstream assert_message;
979 assert_message <<
"On thread:" << Concurrency::getWorkerId<>() <<
" buf_list[iw].get().size():" << buffer.
size()
980 <<
" < buf_list[iw].get().current():" << buffer.
current()
983 throw std::runtime_error(assert_message.str());
995 for (
int i = 0; i <
Z.size(); ++i)
998 logpsi +=
Z[i]->updateBuffer(P, buf, fromscratch);
1018 for (
int i = 0; i <
Z.size(); ++i)
1021 Z[i]->copyFromBuffer(P, buf);
1033 std::vector<ValueType> t(ratios.size());
1034 std::fill(ratios.begin(), ratios.end(), 1.0);
1035 for (
int i = 0; i <
Z.size(); ++i)
1040 Z[i]->evaluateRatios(VP, t);
1041 for (
int j = 0; j < ratios.size(); ++j)
1050 std::vector<ValueType> t(ratios.size());
1051 std::fill(ratios.begin(), ratios.end(), 1.0);
1052 for (
int i = 0; i <
Z.size(); ++i)
1055 Z[i]->evaluateSpinorRatios(VP, spinor_multiplier, t);
1056 for (
int j = 0; j < ratios.size(); ++j)
1063 const RefVector<std::vector<ValueType>>& ratios_list,
1068 auto& wavefunction_components = wf_leader.Z;
1069 std::vector<std::vector<ValueType>> t(ratios_list.size());
1070 for (
int iw = 0; iw < wf_list.size(); iw++)
1072 std::vector<ValueType>& ratios = ratios_list[iw];
1073 assert(vp_list[iw].getTotalNum() == ratios.size());
1074 std::fill(ratios.begin(), ratios.end(), 1.0);
1075 t[iw].resize(ratios.size());
1078 for (
int i = 0; i < wavefunction_components.size(); i++)
1084 wavefunction_components[i]->mw_evaluateRatios(wfc_list, vp_list, t);
1085 for (
int iw = 0; iw < wf_list.size(); iw++)
1087 std::vector<ValueType>& ratios = ratios_list[iw];
1088 for (
int j = 0; j < ratios.size(); ++j)
1089 ratios[j] *= t[iw][j];
1096 std::vector<ValueType>& ratios,
1099 std::fill(ratios.begin(), ratios.end(), 1.0);
1100 std::fill(dratio.
begin(), dratio.
end(), 0.0);
1101 std::vector<ValueType> t(ratios.size());
1102 for (
int i = 0; i <
Z.size(); ++i)
1105 Z[i]->evaluateDerivRatios(VP, optvars, t, dratio);
1106 for (
int j = 0; j < ratios.size(); ++j)
1118 for (
int i = 0; i <
Z.size(); ++i)
1119 myclone->addComponent(
Z[i]->makeClone(tqp));
1137 for (
int i = 0; i <
Z.size(); i++)
1140 Z[i]->evaluateDerivatives(P, optvars, dlogpsi, dhpsioverpsi);
1143 for (
int i = 0; i < dhpsioverpsi.
size(); i++)
1154 for (
int iw = 0; iw < wf_list.size(); iw++)
1159 wf_list[iw].evaluateDerivatives(p_list[iw], optvars, dlogpsi_record_view, dhpsioverpsi_record_view);
1168 for (
int i = 0; i <
Z.size(); i++)
1171 Z[i]->evaluateDerivativesWF(P, optvars, dlogpsi);
1176 std::vector<ValueType>& dgradlogpsi)
1178 for (
int i = 0; i <
Z.size(); i++)
1185 for (
int i = 0; i <
Z.size(); ++i)
1193 std::fill(ratios.begin(), ratios.end(), 1.0);
1194 std::vector<ValueType> t(ratios.size());
1195 for (
int i = 0; i <
Z.size(); ++i)
1198 Z[i]->evaluateRatiosAlltoOne(P, t);
1199 for (
int j = 0; j < t.size(); ++j)
1206 for (
int i = 0; i <
Z.size(); ++i)
1214 auto& wavefunction_components = wf_leader.Z;
1215 const int num_wfc = wf_leader.Z.size();
1216 for (
int i = 0; i < num_wfc; ++i)
1219 wavefunction_components[i]->acquireResource(collection, wfc_list);
1227 auto& wavefunction_components = wf_leader.Z;
1228 const int num_wfc = wf_leader.Z.size();
1229 for (
int i = 0; i < num_wfc; ++i)
1232 wavefunction_components[i]->releaseResource(collection, wfc_list);
1241 wfc_list.reserve(wf_list.size());
1243 wfc_list.push_back(*wf.Z[
id]);
1249 std::vector<WaveFunctionComponent*> WFC_list;
1250 WFC_list.reserve(g.size());
1252 WFC_list.push_back(WF->Z[
id].get());
1261 g_list.push_back(wf.G);
1270 l_list.push_back(wf.L);
1276 for (
int i = 0; i <
Z.size(); ++i)
1278 if (
Z[i]->isFermionic())
1284 Z[i]->registerTWFFastDerivWrapper(P,
twf);
1287 twf.addJastrow(
Z[i].
get());
1296 template void TrialWaveFunction::mw_evalGrad<CoordsType::POS_SPIN>(
1301 template void TrialWaveFunction::mw_calcRatioGrad<CoordsType::POS>(
1305 std::vector<PsiValue>& ratios,
1307 template void TrialWaveFunction::mw_calcRatioGrad<CoordsType::POS_SPIN>(
1311 std::vector<PsiValue>& ratios,
base class for Single-particle orbital sets
size_t BufferCursor_scalar
starting index of the scalar buffer
RealType evaluateLog(ParticleSet &P)
evalaute the log (internally gradients and laplacian) of the trial wavefunction.
WaveFunctionComponent::PsiValue PsiValue
WaveFunctionComponent::RealType RealType
Container_t::iterator begin()
void rejectMove(int iat)
restore to the original state
void evaluateSpinorRatios(const VirtualParticleSet &VP, const std::pair< ValueVector, ValueVector > &spinor_multiplier, std::vector< ValueType > &ratios) const
Used by SOECPComponent to do faster SOC evaluation.
ValueType calcRatio(ParticleSet &P, int iat, ComputeType ct=ComputeType::ALL)
compute psi(R_new) / psi(R_current) ratio It returns a complex value if the wavefunction is complex...
void evaluateRatiosAlltoOne(ParticleSet &P, std::vector< ValueType > &ratios)
void copyFromBuffer(ParticleSet &P, WFBufferType &buf)
copy all the wavefunction components from buffer.
Abstraction of information on executor environments.
helper functions for EinsplineSetBuilder
WaveFunctionComponent::GradType GradType
void getLogs(std::vector< RealType > &lvals)
void createResource(ResourceCollection &collection) const
initialize a shared resource and hand it to a collection
void evaluateDerivatives(ParticleSet &P, const opt_variables_type &optvars, Vector< ValueType > &dlogpsi, Vector< ValueType > &dhpsioverpsi)
evaluate derivatives of KE wrt optimizable varibles
std::vector< TimerIDName_t< T > > TimerNameList_t
~TrialWaveFunction()
Destructor.
size_t getTotalNum() const
void acceptMove(ParticleSet &P, int iat, bool safe_to_delay=false)
update the state with the new data
void evaluateHessian(ParticleSet &P, HessVector &all_grad_grad_psi)
evaluate the hessian w.r.t.
static void mw_prepareGroup(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int ig)
batched version of prepareGroup
void evaluateDerivativesWF(ParticleSet &P, const opt_variables_type &optvars, Vector< ValueType > &dlogpsi)
constexpr std::complex< float > czero
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
void resetParameters(const opt_variables_type &active)
Set values of parameters in each component from the global list.
RealType PhaseDiff
diff of the phase of the trial wave function during ratio calls
A ParticleSet that handles virtual moves of a selected particle of a given physical ParticleSet Virtu...
WaveFunctionComponent::LogValue LogValue
void convertToReal(const T1 &in, T2 &out)
generic conversion from type T1 to type T2 using implicit conversion
const bool use_tasking_
if true, using internal tasking implementation
const SPOSet & getSPOSet(const std::string &name) const
look up SPOSet named 'name', if not found, throw exception.
TrialWaveFunction(const RuntimeOptions &runtime_options, const std::string_view aname="psi0", bool tasking=false)
size_t getTotalNum() const
ParticleAttrib< QTFull::ValueType > ParticleLaplacian
void printGL(ParticleSet::ParticleGradient &G, ParticleSet::ParticleLaplacian &L, std::string tag="GL")
ParticleSet::ParticleLaplacian L
differential laplacians
std::vector< std::unique_ptr< T > > UPtrVector
WaveFunctionComponent::ValueType ValueType
int getNumOfParams() const
static RefVectorWithLeader< WaveFunctionComponent > extractWFCRefList(const RefVectorWithLeader< TrialWaveFunction > &wf_list, int id)
std::complex< T > convertValueToLog(const std::complex< T > &logpsi)
evaluate log(psi) as log(|psi|) and phase
ParticleLaplacian L
laplacians of the particles
TWFFastDerivWrapper is a wrapper class for TrialWavefunction that provides separate and low level acc...
static RefVector< ParticleSet::ParticleGradient > extractGRefList(const RefVectorWithLeader< TrialWaveFunction > &wf_list)
}@
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)
RealType updateBuffer(ParticleSet &P, WFBufferType &buf, bool fromscratch=false)
update all the wavefunction components in buffer.
std::unique_ptr< TrialWaveFunction > makeClone(ParticleSet &tqp) const
RefVector< MultiSlaterDetTableMethod > findMSD() const
find MSD WFCs if exist
void recompute(const ParticleSet &P)
recompute the value of the orbitals which require critical accuracy
void evaluateDeltaLogSetup(ParticleSet &P, RealType &logpsi_fixed, RealType &logpsi_opt, ParticleSet::ParticleGradient &fixedG, ParticleSet::ParticleLaplacian &fixedL)
evaluate the sum of log value of optimizable many-body wavefunctions
UniqueOptObjRefs extractOptimizableObjectRefs()
extract underlying OptimizableObject references
ParticleSet::ParticleGradient G
differential gradients
RealType PhaseValue
sign of the trial wave function
static void mw_evaluateGL(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, bool fromscratch)
WaveFunctionComponent::ComplexType ComplexType
LogValue evaluateGL(ParticleSet &P, bool fromscratch)
compute gradients and laplacian of the TWF with respect to each particle.
Specialized paritlce class for atomistic simulations.
std::vector< std::unique_ptr< WaveFunctionComponent > > Z
a list of WaveFunctionComponents constituting many-body wave functions
float imag(const float &c)
imaginary part of a scalar. Cannot be replaced by std::imag due to AFQMC specific needs...
size_type size() const
return the current size
GradType evalGradWithSpin(ParticleSet &P, int iat, ComplexType &spingrad)
compute d/ds ln(psi) spin gradient at current particle position for iat electron
void evaluateGradDerivatives(const ParticleSet::ParticleGradient &G_in, std::vector< ValueType > &dgradlogpsi)
WaveFunctionComponent::FullPrecRealType FullPrecRealType
static void mw_evaluateParameterDerivatives(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, const opt_variables_type &optvars, RecordArray< ValueType > &dlogpsi, RecordArray< ValueType > &dhpsioverpsi)
ParticleGradient G
gradients of the particles
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
const std::shared_ptr< SPOMap > spomap_
Owned SPOSets. Once a TWF is fully built, SPOSet lookup should be done via TWF.
RealType log_real_
real part of trial wave function log
NewTimer & createGlobalTimer(const std::string &myname, timer_levels mylevel)
class to handle a set of variables that can be modified during optimizations
GradType evalGradSource(ParticleSet &P, ParticleSet &source, int iat)
Returns the logarithmic gradient of the trial wave function with respect to the iat^th atom of the so...
static void mw_evaluateDeltaLog(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, std::vector< RealType > &logpsi_list, RefVector< ParticleSet::ParticleGradient > &dummyG_list, RefVector< ParticleSet::ParticleLaplacian > &dummyL_list, bool recompute=false)
evaluate the log value for optimizable parts of a many-body wave function
void registerData(ParticleSet &P, WFBufferType &buf)
register all the wavefunction components in buffer.
ComputeType
enum type for computing partial WaveFunctionComponents
xmlNodePtr myNode_
XML input node for a many-body wavefunction.
static void checkOneParticleRatio(const PsiValue &ratio, const std::string_view info)
check if ratio is NaN and throw an error if yes.
void checkOutVariables(const opt_variables_type &o)
Check out optimizable variables Assign index mappings from global list (o) to local values in each co...
static const std::vector< std::string > suffixes
static void mw_evalGrad(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, int iat, TWFGrads< CT > &grads)
batched version of evalGrad
static void mw_evaluateDeltaLogSetup(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, std::vector< RealType > &logpsi_fixed_list, std::vector< RealType > &logpsi_opt_list, RefVector< ParticleSet::ParticleGradient > &fixedG_list, RefVector< ParticleSet::ParticleLaplacian > &fixedL_list)
evaluate the sum of log value of optimizable many-body wavefunctions
static void debugOnlyCheckBuffer(WFBufferType &buffer)
static void acquireResource(ResourceCollection &collection, const RefVectorWithLeader< TrialWaveFunction > &wf_list)
acquire external resource Note: use RAII ResourceCollectionLock whenever possible ...
static std::vector< WaveFunctionComponent * > extractWFCPtrList(const UPtrVector< TrialWaveFunction > &wf_list, int id)
helper function for extracting a list of WaveFunctionComponent from a list of TrialWaveFunction ...
void getPhases(std::vector< RealType > &pvals)
static void mw_completeUpdates(const RefVectorWithLeader< TrialWaveFunction > &wf_list)
static TimerNameList_t< TimerEnum > create_names(std::string_view myName)
WaveFunctionComponent::HessVector HessVector
Declaration of a TrialWaveFunction.
TimerList_t TWF_timers_
timers at TrialWaveFunction function call level
size_type current() const
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
size_type size() const
return the size of the data
void reportStatus(std::ostream &os)
print out state of the trial wavefunction
RealType evaluateDeltaLog(ParticleSet &P, bool recompute=false)
evaluate the log value of a many-body wave function
Class to represent a many-body trial wave function.
static RefVector< ParticleSet::ParticleLaplacian > extractLRefList(const RefVectorWithLeader< TrialWaveFunction > &wf_list)
GradType evalGrad(ParticleSet &P, int iat)
static void checkOneParticleGradients(const GradType &grads, const std::string_view info)
check if any gradient component (x,y,z) is NaN and throw an error if yes.
RealType OneOverM
One over mass of target particleset, needed for Local Energy Derivatives.
bool put(xmlNodePtr cur)
read from xmlNode
RealType KECorrection() const
ParticleAttrib< QTFull::GradType > ParticleGradient
ValueType calcRatioGradWithSpin(ParticleSet &P, int iat, GradType &grad_iat, ComplexType &spingrad_iat)
compute psi(R_new) / psi(R_current) ratio and d/ds ln(psi(R_new)) spin gradient It returns a complex ...
const RuntimeOptions & runtime_options_
top-level runtime options from project data information > WaveFunctionPool
void evaluateDerivRatios(const VirtualParticleSet &VP, const opt_variables_type &optvars, std::vector< ValueType > &ratios, Matrix< ValueType > &dratio)
compute both ratios and deriatives of ratio with respect to the optimizables
TimerManager< NewTimer > & getGlobalTimerManager()
size_t BufferCursor
starting index of the buffer
size_type current_scalar() const
static void releaseResource(ResourceCollection &collection, const RefVectorWithLeader< TrialWaveFunction > &wf_list)
release external resource Note: use RAII ResourceCollectionLock whenever possible ...
Container_t::iterator end()
void prepareGroup(ParticleSet &P, int ig)
Prepare internal data for updating WFC correspond to a particle group Particle groups usually corresp...
const std::string myName
getName is in the way
std::vector< std::reference_wrapper< NewTimer > > WFC_timers_
timers at WaveFunctionComponent function call level
void rewind(size_type cur=0, size_type cur_scalar=0)
set the cursors
void put(std::complex< T1 > &x)
ValueType calcRatioGrad(ParticleSet &P, int iat, GradType &grad_iat)
compute psi(R_new) / psi(R_current) ratio and ln(psi(R_new)) gradients It returns a complex value if...
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 ...
void evaluateRatios(const VirtualParticleSet &VP, std::vector< ValueType > &ratios, ComputeType ct=ComputeType::ALL)
compulte multiple ratios to handle non-local moves and other virtual moves
void completeUpdates()
complete all the delayed or asynchronous operations before leaving the p-by-p move region...
void addComponent(std::unique_ptr< WaveFunctionComponent > &&aterm)
add a WaveFunctionComponent
static void mw_evaluateLog(const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list)
batched version of evaluateLog.
void checkInVariables(opt_variables_type &o)
Check in an optimizable parameter.
void initializeTWFFastDerivWrapper(const ParticleSet &P, TWFFastDerivWrapper &twf) const
Initialize a TWF wrapper for fast derivative evaluation.
void add(std::complex< T1 > &x)
void get(std::complex< T1 > &x)