diff --git a/src/QMCDrivers/WFOpt/QMCCostFunction.cpp b/src/QMCDrivers/WFOpt/QMCCostFunction.cpp index 265ee348ed..d93c676c59 100644 --- a/src/QMCDrivers/WFOpt/QMCCostFunction.cpp +++ b/src/QMCDrivers/WFOpt/QMCCostFunction.cpp @@ -346,14 +346,16 @@ void QMCCostFunction::checkConfigurations(EngineHandle& handle) *In future, both the LM and descent engines should be children of some parent engine base class. * */ void QMCCostFunction::engine_checkConfigurations(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, const std::string& MinMethod) { const auto num_opt_vars = opt_vars.size(); if (MinMethod == "descent") { + if (!descentEngineObj) + throw std::runtime_error("Descent optimization requires a DescentEngine"); //Reset vectors and scalars from any previous iteration - descentEngineObj.prepareStorage(omp_get_max_threads(), num_opt_vars); + descentEngineObj->prepareStorage(omp_get_max_threads(), num_opt_vars); } RealType et_tot = 0.0; RealType e2_tot = 0.0; @@ -438,7 +440,8 @@ void QMCCostFunction::engine_checkConfigurations(cqmc::engine::LMYEngine der_rat_samp_comp(der_rat_samp.begin(), der_rat_samp.end()); std::vector le_der_samp_comp(le_der_samp.begin(), le_der_samp.end()); - descentEngineObj.takeSample(ip, der_rat_samp_comp, le_der_samp_comp, le_der_samp_comp, 1.0, saved[REWEIGHT]); + descentEngineObj->takeSample(ip, der_rat_samp_comp, le_der_samp_comp, le_der_samp_comp, 1.0, + saved[REWEIGHT]); } #endif } @@ -480,7 +483,7 @@ void QMCCostFunction::engine_checkConfigurations(cqmc::engine::LMYEnginesample_finish(); #endif app_log().flush(); diff --git a/src/QMCDrivers/WFOpt/QMCCostFunction.h b/src/QMCDrivers/WFOpt/QMCCostFunction.h index 4d16b99711..1845188f25 100644 --- a/src/QMCDrivers/WFOpt/QMCCostFunction.h +++ b/src/QMCDrivers/WFOpt/QMCCostFunction.h @@ -41,7 +41,7 @@ class QMCCostFunction : public QMCCostFunctionBase, public CloneManager void checkConfigurations(EngineHandle& handle) override; #ifdef HAVE_LMY_ENGINE void engine_checkConfigurations(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, const std::string& MinMethod) override; #endif diff --git a/src/QMCDrivers/WFOpt/QMCCostFunctionBase.h b/src/QMCDrivers/WFOpt/QMCCostFunctionBase.h index d06502db45..49dc33351f 100644 --- a/src/QMCDrivers/WFOpt/QMCCostFunctionBase.h +++ b/src/QMCDrivers/WFOpt/QMCCostFunctionBase.h @@ -159,7 +159,7 @@ class QMCCostFunctionBase : public MPIObjectBase virtual void checkConfigurationsSR(EngineHandle& handle); #ifdef HAVE_LMY_ENGINE virtual void engine_checkConfigurations(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, const std::string& MinMethod) = 0; #endif diff --git a/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.cpp b/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.cpp index 8025703ad9..0c6cf7667d 100644 --- a/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.cpp +++ b/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.cpp @@ -627,7 +627,7 @@ void QMCCostFunctionBatched::checkConfigurationsSR(EngineHandle& handle) #ifdef HAVE_LMY_ENGINE void QMCCostFunctionBatched::engine_checkConfigurations(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, const std::string& MinMethod) { APP_ABORT("LMYEngine not implemented with batch optimization"); } #endif diff --git a/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.h b/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.h index b99d1fa170..42f1ebc574 100644 --- a/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.h +++ b/src/QMCDrivers/WFOpt/QMCCostFunctionBatched.h @@ -55,7 +55,7 @@ class QMCCostFunctionBatched : public QMCCostFunctionBase, public QMCTraits void checkConfigurationsSR(EngineHandle& handle) override; #ifdef HAVE_LMY_ENGINE void engine_checkConfigurations(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, const std::string& MinMethod) override; #endif diff --git a/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.cpp b/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.cpp index 8275bcf678..abc79e5362 100644 --- a/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.cpp +++ b/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.cpp @@ -981,7 +981,7 @@ bool QMCFixedSampleLinearOptimize::adaptive_three_shift_run() EngineObj->reset(); // generate samples and compute weights, local energies, and derivative vectors - engine_start(*EngineObj, *descentEngineObj, MinMethod); + engine_start(*EngineObj, descentEngineObj.get(), MinMethod); // get dimension of the linear method matrices size_t N = numParams + 1; @@ -1018,7 +1018,7 @@ bool QMCFixedSampleLinearOptimize::adaptive_three_shift_run() finish(); // take sample - engine_start(*EngineObj, *descentEngineObj, MinMethod); + engine_start(*EngineObj, descentEngineObj.get(), MinMethod); } // say what we are doing @@ -1396,7 +1396,7 @@ bool QMCFixedSampleLinearOptimize::descent_run() optTarget->setneedGrads(true); //Compute Lagrangian derivatives needed for parameter updates with engine_checkConfigurations, which is called inside engine_start - engine_start(*EngineObj, *descentEngineObj, MinMethod); + engine_start(*EngineObj, descentEngineObj.get(), MinMethod); int descent_num = descentEngineObj->getDescentNum(); @@ -1519,7 +1519,7 @@ void QMCFixedSampleLinearOptimize::start() #ifdef HAVE_LMY_ENGINE void QMCFixedSampleLinearOptimize::engine_start(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, std::string MinMethod) { app_log() << "entering engine_start function" << std::endl; diff --git a/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.h b/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.h index 7ab491745e..2feb6edf3b 100644 --- a/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.h +++ b/src/QMCDrivers/WFOpt/QMCFixedSampleLinearOptimize.h @@ -234,7 +234,7 @@ class QMCFixedSampleLinearOptimize : public QMCDriver, public LinearMethod, priv void start(); #ifdef HAVE_LMY_ENGINE void engine_start(cqmc::engine::LMYEngine& EngineObj, - DescentEngine& descentEngineObj, + DescentEngine* descentEngineObj, std::string MinMethod); #endif ///common operation to finish optimization, used by the derived classes diff --git a/src/formic/utils/lmyengine/engine.cpp b/src/formic/utils/lmyengine/engine.cpp index b4c469d67f..93c3d62660 100644 --- a/src/formic/utils/lmyengine/engine.cpp +++ b/src/formic/utils/lmyengine/engine.cpp @@ -106,6 +106,9 @@ cqmc::engine::LMYEngine::LMYEngine(const formic::VarDeps* dep_ptr, _lm_ham_shift_i(lm_ham_shift_i), _lm_ham_shift_s(lm_ham_shift_s), _lm_max_update_abs(lm_max_update_abs), + _le_list(1), + _vg(1), + _weight(1), _shift_scale(shift_scale), _dep_ptr(dep_ptr), _mbuilder(_der_rat,