QMCPACK
EstimatorManagerNewTest.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) 2022 QMCPACK developers.
6 //
7 // File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
8 //
9 // File created by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 #include "catch.hpp"
13 
18 #include "FakeOperatorEstimator.h"
19 
20 namespace qmcplusplus
21 {
22 namespace testing
23 {
25  : em(ham, comm), comm_(comm)
26 {
27  int num_ranks = comm_->size();
28  if (num_ranks != ranks)
29  throw std::runtime_error("Bad Rank Count, test expects different number of ranks.");
30 
31  app_log() << "running on " << num_ranks << '\n';
32 }
33 
35 {
36  // Must create on heap since the EstimatorManager destructor deletes all estimators
37  auto fake_est_uptr = std::make_unique<FakeEstimator>();
38  FakeEstimator* fake_est = fake_est_uptr.get();
39 
40  em.addMainEstimator(std::move(fake_est_uptr));
41 
42  CHECK(em.main_estimator_->getSubTypeStr() == "fake");
43 
44  auto fake_est2 = std::make_unique<FakeEstimator>();
45  fake_est2->type_ = "Fake2";
46 
47  em.addMainEstimator(std::move(fake_est2));
48 
49  return em.main_estimator_->getSubTypeStr() == "Fake2";
50 }
51 
53 {
54  estimators_.clear();
55  FakeEstimator fake_estimator;
56  fake_estimator.scalars.resize(4);
57  fake_estimator.scalars_saved.resize(4);
58  fake_estimator.scalars[0](1.0);
59  fake_estimator.scalars[1](2.0);
60  fake_estimator.scalars[2](3.0);
61  fake_estimator.scalars[3](4.0);
62 
63  //three estimators
64  estimators_.push_back(fake_estimator);
65  estimators_.push_back(fake_estimator);
66  estimators_.push_back(fake_estimator);
67 
68  estimators_[2].scalars[0](2.0);
69  estimators_[2].scalars[1](2.0);
70  estimators_[2].scalars[2](2.0);
71  estimators_[2].scalars[3](2.0);
72 
73  em.get_AverageCache().resize(4);
74 }
75 
77 {
78  estimators_.clear();
79  FakeEstimator fake_estimator;
80  fake_estimator.scalars.resize(4);
81  fake_estimator.scalars_saved.resize(4);
82  fake_estimator.scalars[0](1.0);
83  fake_estimator.scalars[1](2.0);
84  fake_estimator.scalars[2](3.0);
85  fake_estimator.scalars[3](4.0);
86 
87  //three estimators
88  estimators_.push_back(fake_estimator);
89  estimators_.push_back(fake_estimator);
90  estimators_.push_back(fake_estimator);
91 
92  estimators_[2].scalars[0](2.0);
93  estimators_[2].scalars[1](2.0);
94  estimators_[2].scalars[2](2.0);
95  estimators_[2].scalars[3](2.0);
96 
97  std::vector<FakeEstimator> estimators2;
98  estimators2.push_back(fake_estimator);
99  estimators2.push_back(fake_estimator);
100  estimators2.push_back(fake_estimator);
101 
102  std::vector<FakeEstimator> estimators3;
103  estimators3.push_back(fake_estimator);
104  estimators3.push_back(fake_estimator);
105  estimators3.push_back(fake_estimator);
106 
107  em.addScalarEstimator(std::make_unique<FakeEstimator>());
108  em.addScalarEstimator(std::make_unique<FakeEstimator>());
109  em.addScalarEstimator(std::make_unique<FakeEstimator>());
110 
111  scalar_estimators_.push_back(makeRefVector<ScalarEstimatorBase>(estimators_));
112  scalar_estimators_.push_back(makeRefVector<ScalarEstimatorBase>(estimators2));
113  scalar_estimators_.push_back(makeRefVector<ScalarEstimatorBase>(estimators3));
114 
115  em.get_AverageCache().resize(4);
116 
118 }
119 
121 {
123  FakeOperatorEstimator& foe = dynamic_cast<FakeOperatorEstimator&>(*(em.operator_ests_.back()));
124  std::vector<QMCT::RealType>& data = foe.get_data();
125  for (int id = 0; id < data.size(); ++id)
126  {
127  if (id > rank)
128  data[id] += rank + 1;
129  }
130  foe.set_walker_weights(1);
131 }
132 
134 {
135  std::vector<QMCT::RealType> data(num_ranks * 10, 0.0);
136  for (int ir = 0; ir < num_ranks; ++ir)
137  {
138  for (int id = 0; id < data.size(); ++id)
139  {
140  if (id > ir)
141  data[id] += ir + 1;
142  }
143  }
144  return data;
145 }
146 
148 {
149  auto crowd_main_estimators = makeRefVector<ScalarEstimatorBase>(estimators_);
150  em.collectMainEstimators(crowd_main_estimators);
151 }
152 
154 
155 } // namespace testing
156 } // namespace qmcplusplus
int addScalarEstimator(std::unique_ptr< ScalarEstimatorBase > &&estimator)
add an Estimator
std::vector< QMCT::RealType > & get_data()
void fakeSomeOperatorEstimatorSamples(int rank)
Quickly add scalar samples using FakeOperatorEstimator mock estimator.
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
Declaration of OutputManager class.
std::vector< std::unique_ptr< OperatorEstBase > > operator_ests_
OperatorEst Observables.
std::ostream & app_log()
Definition: OutputManager.h:65
bool testReplaceMainEstimator()
test replacing the main estimator
void addMainEstimator(std::unique_ptr< ScalarEstimatorBase > &&estimator)
EstimatorManagerNewTest(const QMCHamiltonian &ham, Communicate *comm, int ranks)
Collection of Local Energy Operators.
void collectMainEstimators()
call private EMB method and collect EMBTs estimators_ as main_estimators
void fakeMainScalarSamples()
Quickly add main scalar samples using FakeEstimator mock estimator.
int size() const
return the number of tasks
Definition: Communicate.h:118
std::vector< accumulator_type > scalars
scalars to be measured
void collectScalarEstimators(const std::vector< RefVector< ScalarEstimatorBase >> &scalar_ests)
Deals with possible free form scalar estimators.
void reduceOperatorEstimators()
do the rank wise reduction of the OperatorEstimators
Wrapping information on parallelism.
Definition: Communicate.h:68
void set_walker_weights(QMCT::RealType weight)
void collectMainEstimators(const RefVector< ScalarEstimatorBase > &scalar_estimators)
At end of block collect the main scalar estimators for the entire rank.
std::vector< accumulator_type > scalars_saved
scalars saved
UPtr< ScalarEstimatorBase > main_estimator_
main estimator i.e. some version of a local energy estimator.
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
void fakeScalarSamplesAndCollect()
Quickly add scalar samples using FakeEstimator mock estimator.
std::vector< RefVector< ScalarEstimatorBase > > scalar_estimators_
std::vector< QMCT::RealType > generateGoodOperatorData(int num_ranks)
for mpi test (it&#39;s trivial for 1 rank)