Skip to content

Commit df5d593

Browse files
authored
Merge pull request QMCPACK#5535 from PDoakORNL/estimator_type_name_hdf5_consistency
Consistent init and use of batched Estimator input name and type
2 parents deb1df3 + dad2e43 commit df5d593

35 files changed

Lines changed: 328 additions & 147 deletions

src/Estimators/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ set(QMCEST_SRC
3535
OneBodyDensityMatrices.cpp
3636
MagnetizationDensity.cpp
3737
MagnetizationDensityInput.cpp
38+
SelfHealingOverlapInput.cpp
3839
SelfHealingOverlap.cpp
3940
PerParticleHamiltonianLoggerInput.cpp
4041
PerParticleHamiltonianLogger.cpp

src/Estimators/EnergyDensityEstimator.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2023 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
88
// Jaron T. Krogel, krogeljt@ornl.gov, Oak Ridge National Laboratory
@@ -49,7 +49,9 @@ auto NEEnergyDensityEstimator::extractIonPositionsAndCharge(const ParticleSet& p
4949
NEEnergyDensityEstimator::NEEnergyDensityEstimator(const EnergyDensityInput& input,
5050
const PSPool& pset_pool,
5151
DataLocality data_locality)
52-
: OperatorEstBase(data_locality), input_(input), pset_dynamic_(getParticleSet(pset_pool, input.get_dynamic()))
52+
: OperatorEstBase(data_locality, input.get_name(), input.get_type()),
53+
input_(input),
54+
pset_dynamic_(getParticleSet(pset_pool, input.get_dynamic()))
5355
{
5456
requires_listener_ = true;
5557
my_name_ = "NEEnergyDensityEstimator";
@@ -83,7 +85,7 @@ NEEnergyDensityEstimator::NEEnergyDensityEstimator(const EnergyDensityInput& inp
8385
}
8486

8587
NEEnergyDensityEstimator::NEEnergyDensityEstimator(const NEEnergyDensityEstimator& ede, const DataLocality dl)
86-
: OperatorEstBase(dl),
88+
: OperatorEstBase(dl, ede.input_.get_name(), ede.input_.get_type()),
8789
input_(ede.input_),
8890
pset_dynamic_(ede.pset_dynamic_),
8991
pset_static_(ede.pset_static_),

src/Estimators/EnergyDensityInput.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2024 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
88
//
99
// Some code refactored from: QMCHamiltonian/EnergyDensityEstimator.cpp
1010
//////////////////////////////////////////////////////////////////////////////////////
1111

1212
#include "EnergyDensityInput.h"
13-
14-
#include "string_utils.h"
1513
#include "EstimatorInput.h"
1614

1715
namespace qmcplusplus
@@ -22,12 +20,11 @@ EnergyDensityInput::EnergyDensityInput(xmlNodePtr cur)
2220
input_section_.readXML(cur);
2321
auto setIfInInput = LAMBDA_setIfInInput;
2422
setIfInInput(name_, "name");
25-
// setIfInInput(type_, "type");
23+
setIfInInput(type_, "type");
2624
setIfInInput(dynamic_, "dynamic");
2725
setIfInInput(static_, "static");
2826
setIfInInput(ion_points_, "ion_points");
2927
setIfInInput(ref_points_input_, "reference_points");
30-
3128
}
3229

3330
std::vector<SpaceGridInput> EnergyDensityInput::get_space_grid_inputs() const

src/Estimators/EnergyDensityInput.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2024 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
88
//
@@ -15,7 +15,6 @@
1515
#include "InputSection.h"
1616
#include "ReferencePointsInput.h"
1717
#include "SpaceGridInput.h"
18-
#include "type_traits/template_types.hpp"
1918

2019
namespace qmcplusplus
2120
{
@@ -38,12 +37,13 @@ class EnergyDensityInput
3837
public:
3938
using Consumer = NEEnergyDensityEstimator;
4039

40+
static constexpr std::string_view type_tag{"EnergyDensity"};
4141
class EnergyDensityInputSection : public InputSection
4242
{
4343
public:
4444
EnergyDensityInputSection()
4545
{
46-
section_name = "EnergyDensity";
46+
section_name = type_tag;
4747
attributes = {"name", "dynamic", "static", "ion_points", "type"};
4848
parameters = {"reference_points", "spacegrid"};
4949
strings = {"name", "type", "dynamic", "static"};
@@ -64,13 +64,16 @@ class EnergyDensityInput
6464
EnergyDensityInput(xmlNodePtr cur);
6565

6666
const std::string& get_name() const { return name_; }
67+
const std::string& get_type() const { return type_; }
6768
const std::string& get_dynamic() const { return dynamic_; }
6869
const std::string& get_static() const { return static_; }
6970
ReferencePointsInput get_ref_points_input() const { return ref_points_input_; }
7071
std::vector<SpaceGridInput> get_space_grid_inputs() const;
7172
const bool& get_ion_points() const { return ion_points_; }
73+
7274
private:
73-
std::string name_;
75+
std::string name_{type_tag};
76+
std::string type_{type_tag};
7477
std::string dynamic_;
7578
std::string static_;
7679
bool ion_points_{false};

src/Estimators/EstimatorManagerInput.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2024 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
88
//
@@ -12,6 +12,8 @@
1212
#include "EstimatorManagerInput.h"
1313
#include "EstimatorInputDelegates.h"
1414
#include <algorithm>
15+
#include <variant>
16+
#include "MagnetizationDensityInput.h"
1517
#include "ModernStringUtils.hpp"
1618

1719
namespace qmcplusplus
@@ -76,19 +78,19 @@ void EstimatorManagerInput::readXML(xmlNodePtr cur)
7678
appendScalarEstimatorInput<RMCLocalEnergyInput>(child);
7779
app_warning() << "RMCLocalEnergyEstimator support is at best experimental with batch drivers" << std::endl;
7880
}
79-
else if (atype == "onebodydensitymatrices")
81+
else if (atype == lowerCase(OneBodyDensityMatricesInput::type_tag))
8082
appendEstimatorInput<OneBodyDensityMatricesInput>(child);
81-
else if (atype == "spindensity")
83+
else if (atype == lowerCase(SpinDensityInput::type_tag))
8284
appendEstimatorInput<SpinDensityInput>(child);
83-
else if (atype == "momentumdistribution")
85+
else if (atype == lowerCase(MomentumDistributionInput::type_tag))
8486
appendEstimatorInput<MomentumDistributionInput>(child);
85-
else if (atype == "selfhealingoverlap")
87+
else if (atype == lowerCase(SelfHealingOverlapInput::type_tag))
8688
appendEstimatorInput<SelfHealingOverlapInput>(child);
87-
else if (atype == "perparticlehamiltonianlogger")
89+
else if (atype == lowerCase(PerParticleHamiltonianLoggerInput::type_tag))
8890
appendEstimatorInput<PerParticleHamiltonianLoggerInput>(child);
89-
else if (atype == "magnetizationdensity")
91+
else if (atype == lowerCase(MagnetizationDensityInput::type_tag))
9092
appendEstimatorInput<MagnetizationDensityInput>(child);
91-
else if (atype == "energydensity")
93+
else if (atype == lowerCase(EnergyDensityInput::type_tag))
9294
appendEstimatorInput<EnergyDensityInput>(child);
9395
else
9496
throw UniformCommunicateError(error_tag + "unparsable <estimator> node, name: " + aname + " type: " + atype +
@@ -112,8 +114,29 @@ void EstimatorManagerInput::readXML(xmlNodePtr cur)
112114
}
113115
}
114116

117+
template<typename T>
118+
std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes() const
119+
{
120+
std::vector<int> type_indexes;
121+
for (int i = 0; i < estimator_inputs_.size(); ++i)
122+
{
123+
if (std::holds_alternative<T>(estimator_inputs_[i]))
124+
type_indexes.push_back(i);
125+
}
126+
return type_indexes;
127+
}
128+
129+
115130
void EstimatorManagerInput::append(const EstimatorInput& ei) { estimator_inputs_.emplace_back(ei); }
116131
void EstimatorManagerInput::append(const ScalarEstimatorInput& sei) { scalar_estimator_inputs_.emplace_back(sei); }
117132

133+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<EnergyDensityInput>() const;
134+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<SpinDensityInput>() const;
135+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<MomentumDistributionInput>() const;
136+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<OneBodyDensityMatricesInput>() const;
137+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<SelfHealingOverlapInput>() const;
138+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<MagnetizationDensityInput>() const;
139+
template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<PerParticleHamiltonianLoggerInput>() const;
140+
118141

119142
} // namespace qmcplusplus

src/Estimators/EstimatorManagerInput.h

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,20 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2022 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
88
//
99
// File refactored from: EstimatorManagerNew.h
1010
//////////////////////////////////////////////////////////////////////////////////////
1111

1212
/** \file
13-
* declares the list supported estimator input types and declares the input type for
13+
* declares the list supported estimator input types and declares the input type for
1414
* EstimatorManagerNew.
1515
*/
1616
#ifndef QMCPLUSPLUS_ESIMATORMANAGERINPUT_H
1717
#define QMCPLUSPLUS_ESIMATORMANAGERINPUT_H
1818

19-
20-
#include "type_traits/template_types.hpp"
21-
#include <functional>
2219
#include <vector>
2320
#include <variant>
2421
#include <libxml/tree.h>
@@ -94,6 +91,16 @@ class EstimatorManagerInput
9491
void append(const EstimatorInput& ei);
9592
void append(const ScalarEstimatorInput& sei);
9693

94+
/** Get Indexes of inputs of type T
95+
*
96+
* Right now This is only used to prevent magic numbers in tests,
97+
* magic numbers that will result in test maintence issues as the
98+
* EstimatorManagerInputTest::create.. cases are
99+
* expanded.
100+
*/
101+
template<typename T>
102+
std::vector<int> getEstimatorTypeIndexes() const;
103+
97104
private:
98105
/// this is a vector of variants for typesafe access to the estimator inputs
99106
EstimatorInputs estimator_inputs_;
@@ -114,6 +121,18 @@ class EstimatorManagerInput
114121
friend class testing::EstimatorManagerInputTests;
115122
};
116123

124+
// Explicity instantiate these to prevent type bleed into the header.
125+
// There is one of these for each forward declaration of a type in the
126+
// EstimaterInput variant
127+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<EnergyDensityInput>() const;
128+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<SpinDensityInput>() const;
129+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<MomentumDistributionInput>() const;
130+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<OneBodyDensityMatricesInput>() const;
131+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<SelfHealingOverlapInput>() const;
132+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<MagnetizationDensityInput>() const;
133+
extern template std::vector<int> EstimatorManagerInput::getEstimatorTypeIndexes<PerParticleHamiltonianLoggerInput>()
134+
const;
135+
117136
} // namespace qmcplusplus
118137

119138
#endif

src/Estimators/EstimatorManagerNew.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2024 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
88
//
@@ -174,7 +174,7 @@ void EstimatorManagerNew::makeConfigReport(std::ostream& os) const
174174
{
175175
os << " General Estimators:\n";
176176
for (auto& est : operator_ests_)
177-
os << " " << est->get_my_name() << '\n';
177+
os << " " << est->getMyType() << " (" << est->getMyName() << ")\n";
178178
}
179179
}
180180

src/Estimators/MagnetizationDensity.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2023 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Raymond Clay, rclay@sandia.gov, Sandia National Laboratories
88
//
@@ -14,9 +14,8 @@
1414
namespace qmcplusplus
1515
{
1616
MagnetizationDensity::MagnetizationDensity(MagnetizationDensityInput&& minput, const Lattice& lat)
17-
: OperatorEstBase(DataLocality::crowd), input_(minput), lattice_(lat)
17+
: OperatorEstBase(DataLocality::crowd, minput.get_name(), minput.get_type()), input_(minput), lattice_(lat)
1818
{
19-
my_name_ = "MagnetizationDensity";
2019
//Pull consistent corner, grids, etc., from already inititalized input.
2120
//DerivedParameters does the sanity checks and consistent initialization of these variables.
2221
MagnetizationDensityInput::DerivedParameters derived = minput.calculateDerivedParameters(lat);
@@ -39,10 +38,9 @@ MagnetizationDensity::MagnetizationDensity(MagnetizationDensityInput&& minput, c
3938
MagnetizationDensity::MagnetizationDensity(const MagnetizationDensity& magdens, DataLocality dl)
4039
: MagnetizationDensity(magdens)
4140
{
42-
my_name_ = "MagnetizationDensity";
4341
data_locality_ = dl;
4442
}
45-
void MagnetizationDensity::startBlock(int steps){};
43+
void MagnetizationDensity::startBlock(int steps) {};
4644

4745
size_t MagnetizationDensity::getFullDataSize() const { return npoints_ * DIM; }
4846

src/Estimators/MagnetizationDensityInput.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is distributed under the University of Illinois/NCSA Open Source License.
33
// See LICENSE file in top directory for details.
44
//
5-
// Copyright (c) 2023 QMCPACK developers.
5+
// Copyright (c) 2025 QMCPACK developers.
66
//
77
// File developed by: Raymond Clay, rclay@sandia.gov, Sandia National Laboratories
88
//
@@ -26,14 +26,15 @@ MagnetizationDensityInput::MagnetizationDensityInput(xmlNodePtr cur)
2626
input_section_.readXML(cur);
2727
auto setIfInInput = LAMBDA_setIfInInput;
2828
setIfInInput(nsamples_, "samples");
29+
setIfInInput(name_, "name");
30+
setIfInInput(type_, "type");
2931
setIfInInput(integrator_, "integrator");
3032
have_center_ = setIfInInput(center_, "center");
3133
have_corner_ = setIfInInput(corner_, "corner");
3234
have_grid_ = setIfInInput(grid_real_, "grid");
3335
have_dr_ = setIfInInput(dr_, "dr");
3436
}
3537

36-
3738
MagnetizationDensityInput::DerivedParameters MagnetizationDensityInput::calculateDerivedParameters(
3839
const Lattice& lattice) const
3940
{

0 commit comments

Comments
 (0)