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) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
8 //                    Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
9 //                    Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
10 //
11 // File created by: Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
12 //////////////////////////////////////////////////////////////////////////////////////
13 
14 
15 #ifndef QMCPLUSPLUS_COSTFUNCTION_H
16 #define QMCPLUSPLUS_COSTFUNCTION_H
17 
18 #include "QMCDrivers/WFOpt/QMCCostFunctionBase.h"
19 #include "QMCDrivers/CloneManager.h"
20 #include "QMCWaveFunctions/OrbitalSetTraits.h"
21 
22 namespace qmcplusplus
23 {
24 /** @ingroup QMCDrivers
25  * @brief Implements wave-function optimization
26  *
27  * Optimization by correlated sampling method with configurations
28  * generated from VMC running on a single thread.
29  */
30 class QMCCostFunction : public QMCCostFunctionBase, public CloneManager
31 {
32 public:
33   ///Constructor.
34   QMCCostFunction(MCWalkerConfiguration& w, TrialWaveFunction& psi, QMCHamiltonian& h, Communicate* comm);
35 
36   ///Destructor
37   ~QMCCostFunction();
38 
39   void getConfigurations(const std::string& aroot) override;
40   void checkConfigurations() override;
41 #ifdef HAVE_LMY_ENGINE
42   void engine_checkConfigurations(cqmc::engine::LMYEngine<Return_t>* EngineObj,
43                                   DescentEngine& descentEngineObj,
44                                   const std::string& MinMethod) override;
45 #endif
46 
47 
48   void resetPsi(bool final_reset = false) override;
49   void GradCost(std::vector<Return_rt>& PGradient, const std::vector<Return_rt>& PM, Return_rt FiniteDiff = 0) override;
50   Return_rt fillOverlapHamiltonianMatrices(Matrix<Return_rt>& Left, Matrix<Return_rt>& Right) override;
51 
52 protected:
53   std::vector<QMCHamiltonian*> H_KE_Node;
54   std::vector<Matrix<Return_rt>*> RecordsOnNode;
55 
56   /** Temp derivative properties and Hderivative properties of all the walkers
57   */
58   std::vector<Matrix<Return_rt>*> DerivRecords;
59   std::vector<Matrix<Return_rt>*> HDerivRecords;
60   Return_rt CSWeight;
61 
62   Return_rt correlatedSampling(bool needGrad = true) override;
63 
64 #ifdef HAVE_LMY_ENGINE
65   int total_samples();
66   Return_rt LMYEngineCost_detail(cqmc::engine::LMYEngine<Return_t>* EngineObj) override;
67 #endif
68 };
69 } // namespace qmcplusplus
70 #endif
71