QMCPACK
EngineHandle.h
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) 2022 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 // Leon Otis, leon_otis@berkeley.edu, UC Berkeley
9 //
10 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
11 //////////////////////////////////////////////////////////////////////////////////////
12 
13 #ifndef QMCPLUSPLUS_ENGINE_HANDLE_HEADER
14 #define QMCPLUSPLUS_ENGINE_HANDLE_HEADER
15 
17 #include "Concurrency/OpenMP.h"
18 
20 
21 #ifdef HAVE_LMY_ENGINE
22 #include "formic/utils/lmyengine/engine.h"
23 #endif
24 
25 
26 namespace qmcplusplus
27 {
29 {
30 public:
35 
36  virtual ~EngineHandle() = default;
37  /** Function for preparing derivative ratio vectors used by optimizer engines
38  *
39  *\param[in] num_params Number of optimizable parameters
40  */
41  virtual void prepareSampling(int num_params, int num_samples) = 0;
42  /** Function for passing derivative ratios to optimizer engines
43  *
44  * \param[in] energy_list Vector of local energy values
45  * \param[in] dlogpsi_array Parameter derivatives of log psi
46  * \param[in] dhpsioverpsi_array Parameter derivatives of local energy
47  * \param[in] local_index Crowd local index
48  * \param[in] sample_index Index of sample on a MPI rank
49  *
50  */
51  virtual void takeSample(const std::vector<FullPrecReal>& energy_list,
52  const RecordArray<Value>& dlogpsi_array,
53  const RecordArray<Value>& dhpsioverpsi_array,
54  int base_sample_index) = 0;
55  /** Function for having optimizer engines execute their sample_finish functions
56  */
57  virtual void finishSampling() = 0;
58 };
59 
61 {
62 public:
63  void prepareSampling(int num_params, int num_samples) override {}
64  void takeSample(const std::vector<FullPrecReal>& energy_list,
65  const RecordArray<Value>& dlogpsi_array,
66  const RecordArray<Value>& dhpsioverpsi_array,
67  int base_sample_index) override
68  {}
69  void finishSampling() override {}
70 };
71 
73 {
74 private:
76  std::vector<FullPrecValue> der_rat_samp;
77  std::vector<FullPrecValue> le_der_samp;
78 
79 public:
81 
82  //Retrieve der_rat_samp vector for testing
83  const std::vector<FullPrecValue>& getVector() const { return der_rat_samp; }
84 
85  void prepareSampling(int num_params, int num_samples) override
86  {
87  //FIXME it should respect num_samples and avoid relying on threads.
89 
90  der_rat_samp.resize(num_params + 1, 0.0);
91  le_der_samp.resize(num_params + 1, 0.0);
92  }
93 
94  void takeSample(const std::vector<FullPrecReal>& energy_list,
95  const RecordArray<Value>& dlogpsi_array,
96  const RecordArray<Value>& dhpsioverpsi_array,
97  int base_sample_index) override
98  {
99  const int current_batch_size = dlogpsi_array.getNumOfEntries();
100  for (int local_index = 0; local_index < current_batch_size; local_index++)
101  {
102  der_rat_samp[0] = 1.0;
103  le_der_samp[0] = energy_list[local_index];
104 
105  int num_params = der_rat_samp.size() - 1;
106  for (int j = 0; j < num_params; j++)
107  {
108  der_rat_samp[j + 1] = static_cast<FullPrecValue>(dlogpsi_array[local_index][j]);
109  le_der_samp[j + 1] = static_cast<FullPrecValue>(dhpsioverpsi_array[local_index][j]) +
110  le_der_samp[0] * static_cast<FullPrecValue>(dlogpsi_array[local_index][j]);
111  }
112  //FIXME it should respect base_sample_index and avoid relying on threads.
113  int ip = omp_get_thread_num();
115  }
116  }
117 
118  void finishSampling() override { engine_.sample_finish(); }
119 };
120 
122 {
123 #ifdef HAVE_LMY_ENGINE
124 private:
125  cqmc::engine::LMYEngine<Value>& lm_engine_;
126  std::vector<FullPrecValue> der_rat_samp;
127  std::vector<FullPrecValue> le_der_samp;
128 
129 public:
130  LMYEngineHandle(cqmc::engine::LMYEngine<Value>& lmyEngine) : lm_engine_(lmyEngine){};
131 
132  void prepareSampling(int num_params, int num_samples) override
133  {
134  der_rat_samp.resize(num_params + 1, 0.0);
135  le_der_samp.resize(num_params + 1, 0.0);
136  if (lm_engine_.getStoringSamples())
137  lm_engine_.setUpStorage(num_params, num_samples);
138  }
139  void takeSample(const std::vector<FullPrecReal>& energy_list,
140  const RecordArray<Value>& dlogpsi_array,
141  const RecordArray<Value>& dhpsioverpsi_array,
142  int base_sample_index) override
143  {
144  int current_batch_size = dlogpsi_array.getNumOfEntries();
145  for (int local_index = 0; local_index < current_batch_size; local_index++)
146  {
147  const int sample_index = base_sample_index + local_index;
148  der_rat_samp[0] = 1.0;
149  le_der_samp[0] = energy_list[local_index];
150 
151  int num_params = der_rat_samp.size() - 1;
152  for (int j = 0; j < num_params; j++)
153  {
154  der_rat_samp[j + 1] = static_cast<FullPrecValue>(dlogpsi_array[local_index][j]);
155  le_der_samp[j + 1] = static_cast<FullPrecValue>(dhpsioverpsi_array[local_index][j]) +
156  le_der_samp[0] * static_cast<FullPrecValue>(dlogpsi_array[local_index][j]);
157  }
158 
159 
160  if (lm_engine_.getStoringSamples())
161  lm_engine_.store_sample(der_rat_samp, le_der_samp, le_der_samp, 1.0, 1.0, sample_index);
162  else
163  lm_engine_.take_sample(der_rat_samp, le_der_samp, le_der_samp, 1.0, 1.0);
164  }
165  }
166  void finishSampling() override
167  {
168  if (!lm_engine_.getStoringSamples())
169  lm_engine_.sample_finish();
170  }
171 #endif
172 };
173 
174 
175 } // namespace qmcplusplus
176 #endif
void finishSampling() override
Function for having optimizer engines execute their sample_finish functions.
Definition: EngineHandle.h:118
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
void prepareSampling(int num_params, int num_samples) override
Function for preparing derivative ratio vectors used by optimizer engines.
Definition: EngineHandle.h:85
DescentEngineHandle(DescentEngine &engine)
Definition: EngineHandle.h:80
QTBase::RealType RealType
Definition: Configuration.h:58
void sample_finish()
Function that reduces all vector information from all processors to the root processor.
virtual ~EngineHandle()=default
QMCTraits::RealType Real
Definition: EngineHandle.h:31
QMCTraits::FullPrecRealType FullPrecReal
Definition: EngineHandle.h:33
void prepareSampling(int num_params, int num_samples) override
Function for preparing derivative ratio vectors used by optimizer engines.
Definition: EngineHandle.h:63
void prepareStorage(const int num_replicas, const int num_optimizables)
Prepare for taking samples.
QMCTraits::FullPrecValueType FullPrecValue
Definition: EngineHandle.h:34
omp_int_t omp_get_thread_num()
Definition: OpenMP.h:25
void takeSample(const std::vector< FullPrecReal > &energy_list, const RecordArray< Value > &dlogpsi_array, const RecordArray< Value > &dhpsioverpsi_array, int base_sample_index) override
Function for passing derivative ratios to optimizer engines.
Definition: EngineHandle.h:94
QTFull::ValueType FullPrecValueType
Definition: Configuration.h:67
omp_int_t omp_get_max_threads()
Definition: OpenMP.h:26
QTBase::ValueType ValueType
Definition: Configuration.h:60
const std::vector< FullPrecValue > & getVector() const
Definition: EngineHandle.h:83
void takeSample(const std::vector< FullPrecReal > &energy_list, const RecordArray< Value > &dlogpsi_array, const RecordArray< Value > &dhpsioverpsi_array, int base_sample_index) override
Function for passing derivative ratios to optimizer engines.
Definition: EngineHandle.h:64
virtual void prepareSampling(int num_params, int num_samples)=0
Function for preparing derivative ratio vectors used by optimizer engines.
virtual void takeSample(const std::vector< FullPrecReal > &energy_list, const RecordArray< Value > &dlogpsi_array, const RecordArray< Value > &dhpsioverpsi_array, int base_sample_index)=0
Function for passing derivative ratios to optimizer engines.
QTFull::RealType FullPrecRealType
Definition: Configuration.h:66
virtual void finishSampling()=0
Function for having optimizer engines execute their sample_finish functions.
void takeSample(const int replica_id, const std::vector< FullPrecValueType > &der_rat_samp, const std::vector< FullPrecValueType > &le_der_samp, const std::vector< FullPrecValueType > &ls_der_samp, ValueType vgs_samp, ValueType weight_samp)
Function that Take Sample Data from the Host Code.
QMCTraits::ValueType Value
Definition: EngineHandle.h:32
std::vector< FullPrecValue > der_rat_samp
Definition: EngineHandle.h:76
std::vector< FullPrecValue > le_der_samp
Definition: EngineHandle.h:77
void finishSampling() override
Function for having optimizer engines execute their sample_finish functions.
Definition: EngineHandle.h:69