Skip to content

Commit a559a32

Browse files
authored
Merge pull request QMCPACK#5834 from ye-luo/adjust-ham-pool
Refactor HamiltonianPool
2 parents 6e97e32 + 1234d4f commit a559a32

18 files changed

Lines changed: 90 additions & 100 deletions

docs/hamiltonianobservable.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ attributes:
5151
+============================+==============+=======================+=============+==========================================+
5252
| ``name/id``:math:`^o` | text | *anything* | h0 | Unique id for this Hamiltonian instance |
5353
+----------------------------+--------------+-----------------------+-------------+------------------------------------------+
54-
| ``role``:math:`^o` | text | primary/extra | extra | Designate as Hamiltonian or not |
55-
+----------------------------+--------------+-----------------------+-------------+------------------------------------------+
5654
| ``target``:math:`^o` | text | ``particleset.name`` | e | Identify quantum ``particleset`` |
5755
+----------------------------+--------------+-----------------------+-------------+------------------------------------------+
5856
| ``wavefunction``:math:`^o` | text | ``wavefunction.name`` | "" | Identify ``wavefunction`` |

src/Estimators/tests/test_EstimatorManagerCrowd.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ TEST_CASE("EstimatorManagerCrowd::EstimatorManagerCrowd", "[estimators]")
4444
auto& pset = *(particle_pool.getParticleSet("e"));
4545
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
4646
TrialWaveFunction& twf(wavefunction_pool.getWaveFunction().value());
47-
auto& ham = *(hamiltonian_pool.getPrimary());
47+
QMCHamiltonian& ham(hamiltonian_pool.getHamiltonian().value());
4848

4949
EstimatorManagerNew emn(ham, comm);
5050
emn.constructEstimators(std::move(emi), pset, twf, ham, particle_pool.getPool());
@@ -73,7 +73,7 @@ TEST_CASE("EstimatorManagerCrowd PerParticleHamiltonianLogger integration", "[es
7373
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
7474

7575
TrialWaveFunction& twf(wavefunction_pool.getWaveFunction().value());
76-
auto& ham = *(hamiltonian_pool.getPrimary());
76+
QMCHamiltonian& ham(hamiltonian_pool.getHamiltonian().value());
7777

7878
ham.informOperatorsOfListener();
7979

@@ -101,7 +101,7 @@ TEST_CASE("EstimatorManagerCrowd PerParticleHamiltonianLogger integration", "[es
101101
psets.emplace_back(pset);
102102
psets.back().randomizeFromSource(*particle_pool.getParticleSet("ion"));
103103
twfs.emplace_back(twf.makeClone(psets.back()));
104-
hams.emplace_back(hamiltonian_pool.getPrimary()->makeClone(psets.back(), *twfs.back()));
104+
hams.emplace_back(ham.makeClone(psets.back(), *twfs.back()));
105105
}
106106

107107
EstimatorManagerCrowd emc(emn);

src/Estimators/tests/test_EstimatorManagerNew.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ TEST_CASE("EstimatorManagerNew::EstimatorManagerNew(EstimatorManagerInput,...)",
6363
auto& pset = *(particle_pool.getParticleSet("e"));
6464
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
6565
TrialWaveFunction& twf(wavefunction_pool.getWaveFunction().value());
66-
auto& ham = *(hamiltonian_pool.getPrimary());
66+
QMCHamiltonian& ham(hamiltonian_pool.getHamiltonian().value());
6767
EstimatorManagerNew emn(ham, comm);
6868
emn.constructEstimators(std::move(emi), pset, twf, ham, particle_pool.getPool());
6969

@@ -110,7 +110,7 @@ TEST_CASE("EstimatorManagerNew_estimator_naming", "[estimators]")
110110
auto& pset = *(particle_pool.getParticleSet("e"));
111111
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
112112
TrialWaveFunction& twf(wavefunction_pool.getWaveFunction().value());
113-
auto& ham = *(hamiltonian_pool.getPrimary());
113+
QMCHamiltonian& ham(hamiltonian_pool.getHamiltonian().value());
114114
EstimatorManagerNew emn(ham, comm);
115115
emn.constructEstimators(std::move(emi), pset, twf, ham, particle_pool.getPool());
116116
EstimatorManagerNewTestAccess emnta(emn);

src/Estimators/tests/test_StructureFactorEstimator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ TEST_CASE("StructureFactorEstimator::Accumulate", "[estimators]")
144144
// These hamiltomians are just pro forma arguments needed to hold off UBSan,
145145
// StructureFactorEstimator never accesses into them.
146146
auto hamiltonian_pool = MinimalHamiltonianPool::makeHamWithEEEI(comm, particle_pool, wavefunction_pool);
147-
auto& gold_hamiltonian = *(hamiltonian_pool.getPrimary());
147+
QMCHamiltonian& gold_hamiltonian(hamiltonian_pool.getHamiltonian().value());
148148
std::vector<UPtr<QMCHamiltonian>> hams(nwalkers);
149149
for (int iw = 0; iw < nwalkers; ++iw)
150150
hams[iw] = gold_hamiltonian.makeClone(psets[iw], ref_wfns[iw]);

src/QMCDrivers/QMCDriverFactory.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,24 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
157157
throw UniformCommunicateError("Failed to find the wavefunction named \"" + name + "\"!");
158158
};
159159

160+
auto getHam = [&hamiltonian_pool](const std::string& name) -> QMCHamiltonian& {
161+
if (auto ham_optional = hamiltonian_pool.getHamiltonian(name); ham_optional)
162+
return *ham_optional;
163+
else if (name.empty())
164+
throw UniformCommunicateError("Failed to find a hamiltonian! Please specify the name of hamiltonian using a "
165+
"qmcsystem node in the driver input.");
166+
else
167+
throw UniformCommunicateError("Failed to find the hamiltonian named \"" + name + "\"!");
168+
};
169+
160170
if (das.new_run_type == QMCRunType::CSVMC)
161171
{ // CSVMC requires multiple pairs of Psi and Ham
162172
std::vector<TrialWaveFunction*> multi_psi;
163173
std::vector<QMCHamiltonian*> multi_ham;
164174
for (const auto& name_pair : PsiHamNamePairReader::readMultiplePairs(cur))
165175
{
166176
multi_psi.emplace_back(&getPsi(name_pair.first));
167-
multi_ham.emplace_back(hamiltonian_pool.getHamiltonian(name_pair.second));
177+
multi_ham.emplace_back(&getHam(name_pair.second));
168178
}
169179
new_driver = std::make_unique<CSVMC>(project_data_, qmc_system, std::move(multi_psi), std::move(multi_ham), comm);
170180
new_driver->setUpdateMode(das.what_to_do[UPDATE_MODE]);
@@ -175,7 +185,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
175185
// get primaryPsi
176186
auto& primaryPsi = getPsi(one_pair ? one_pair->first : "");
177187
// get primaryH
178-
QMCHamiltonian* primaryH = hamiltonian_pool.getPrimary();
188+
auto& primaryH = getHam(one_pair ? one_pair->second : "");
179189

180190
auto makeEstimatorManager =
181191
[&](const std::optional<EstimatorManagerInput>& global_emi,
@@ -193,15 +203,15 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
193203
return {};
194204
};
195205

196-
auto estimator_manager = std::make_unique<EstimatorManagerNew>(*primaryH, comm);
206+
auto estimator_manager = std::make_unique<EstimatorManagerNew>(primaryH, comm);
197207
estimator_manager->constructEstimators(makeEstimatorManagerInput(global_emi, driver_emi), qmc_system, primaryPsi,
198-
*primaryH, particle_pool.getPool());
208+
primaryH, particle_pool.getPool());
199209
return estimator_manager;
200210
};
201211

202212
if (das.new_run_type == QMCRunType::VMC)
203213
{
204-
new_driver = std::make_unique<VMC>(project_data_, qmc_system, primaryPsi, *primaryH,
214+
new_driver = std::make_unique<VMC>(project_data_, qmc_system, primaryPsi, primaryH,
205215
RandomNumberControl::getChildren(), comm, das.enable_profiling);
206216
new_driver->setUpdateMode(das.what_to_do[UPDATE_MODE]);
207217
}
@@ -234,15 +244,15 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
234244
std::make_unique<VMCBatched>(project_data_, std::move(qmcdriver_input),
235245
makeEstimatorManager(emi, qmcdriver_input.get_estimator_manager_input()),
236246
std::move(vmcdriver_input), qmc_system,
237-
MCPopulation(comm->size(), comm->rank(), qmc_system, primaryPsi, *primaryH),
247+
MCPopulation(comm->size(), comm->rank(), qmc_system, primaryPsi, primaryH),
238248
RandomNumberControl::getChildrenRefs(), qmc_system.getSampleStack(), comm);
239249

240250
new_driver->setUpdateMode(1);
241251
}
242252
else if (das.new_run_type == QMCRunType::DMC)
243253
{
244254
DMCFactory fac(das.what_to_do[UPDATE_MODE], das.what_to_do[GPU_MODE], cur);
245-
new_driver = fac.create(project_data_, qmc_system, primaryPsi, *primaryH, comm, das.enable_profiling);
255+
new_driver = fac.create(project_data_, qmc_system, primaryPsi, primaryH, comm, das.enable_profiling);
246256
}
247257
else if (das.new_run_type == QMCRunType::DMC_BATCH)
248258
{
@@ -267,13 +277,13 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
267277
std::make_unique<DMCBatched>(project_data_, std::move(qmcdriver_input),
268278
makeEstimatorManager(emi, qmcdriver_input.get_estimator_manager_input()),
269279
std::move(dmcdriver_input), qmc_system,
270-
MCPopulation(comm->size(), comm->rank(), qmc_system, primaryPsi, *primaryH),
280+
MCPopulation(comm->size(), comm->rank(), qmc_system, primaryPsi, primaryH),
271281
RandomNumberControl::getChildrenRefs(), comm);
272282
}
273283
else if (das.new_run_type == QMCRunType::RMC)
274284
{
275285
RMCFactory fac(das.what_to_do[UPDATE_MODE], cur);
276-
new_driver = fac.create(project_data_, qmc_system, primaryPsi, *primaryH, comm);
286+
new_driver = fac.create(project_data_, qmc_system, primaryPsi, primaryH, comm);
277287
}
278288
else if (das.new_run_type == QMCRunType::LINEAR_OPTIMIZE)
279289
{
@@ -283,8 +293,8 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
283293
"full precision build instead.");
284294
#endif
285295
QMCFixedSampleLinearOptimize* opt =
286-
new QMCFixedSampleLinearOptimize(project_data_, qmc_system, primaryPsi, *primaryH, comm);
287-
//ZeroVarianceOptimize *opt = new ZeroVarianceOptimize(qmc_system,primaryPsi,*primaryH );
296+
new QMCFixedSampleLinearOptimize(project_data_, qmc_system, primaryPsi, primaryH, comm);
297+
//ZeroVarianceOptimize *opt = new ZeroVarianceOptimize(qmc_system,primaryPsi,primaryH );
288298
opt->setWaveFunctionNode(wavefunction_pool.getWaveFunctionNode("psi0"));
289299
new_driver.reset(opt);
290300
}
@@ -319,7 +329,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
319329
auto opt = std::make_unique<QMCFixedSampleLinearOptimizeBatched>(project_data_, std::move(qmcdriver_input),
320330
std::move(vmcdriver_input), qmc_system,
321331
MCPopulation(comm->size(), comm->rank(),
322-
qmc_system, primaryPsi, *primaryH),
332+
qmc_system, primaryPsi, primaryH),
323333
RandomNumberControl::getChildrenRefs(),
324334
qmc_system.getSampleStack(), comm);
325335
opt->setWaveFunctionNode(wavefunction_pool.getWaveFunctionNode("psi0"));
@@ -329,7 +339,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
329339
{
330340
app_log() << "Testing wavefunctions." << std::endl;
331341
QMCDriverInterface* temp_ptr =
332-
new WaveFunctionTester(project_data_, qmc_system, primaryPsi, *primaryH, particle_pool, comm);
342+
new WaveFunctionTester(project_data_, qmc_system, primaryPsi, primaryH, particle_pool, comm);
333343
new_driver.reset(temp_ptr);
334344
}
335345
else

src/QMCDrivers/tests/SetupDMCTest.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class SetupDMCTest : public SetupPools
5151
std::move(dmc_input_copy),
5252
walker_confs,
5353
MCPopulation(comm->size(), comm->rank(), *particle_pool->getParticleSet("e"),
54-
wavefunction_pool->getWaveFunction().value(), *hamiltonian_pool->getPrimary()),
54+
wavefunction_pool->getWaveFunction().value(), hamiltonian_pool->getHamiltonian().value()),
5555
rng_pool.getRngRefs(),
5656
comm};
5757
}

src/QMCDrivers/tests/test_Crowd.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ class CrowdWithWalkers
4242
DriverWalkerResourceCollection driverwalker_resource_collection_;
4343

4444
public:
45-
CrowdWithWalkers(SetupPools& pools) : em(*pools.hamiltonian_pool->getPrimary(), pools.comm)
45+
CrowdWithWalkers(SetupPools& pools) : em(pools.hamiltonian_pool->getHamiltonian().value(), pools.comm)
4646
{
4747
crowd_ptr =
4848
std::make_unique<Crowd>(em, driverwalker_resource_collection_, *pools.particle_pool->getParticleSet("e"),
4949
pools.wavefunction_pool->getWaveFunction().value(),
50-
*pools.hamiltonian_pool->getPrimary());
50+
pools.hamiltonian_pool->getHamiltonian().value());
5151
Crowd& crowd = *crowd_ptr;
5252
// To match the minimal particle set
5353
int num_particles = 2;
@@ -57,7 +57,7 @@ class CrowdWithWalkers
5757
walkers.back()->R[0] = pos;
5858
psets.emplace_back(std::make_unique<ParticleSet>(*(pools.particle_pool->getParticleSet("e"))));
5959
twfs.emplace_back(pools.wavefunction_pool->getWaveFunction().value().get().makeClone(*psets.back()));
60-
hams.emplace_back(pools.hamiltonian_pool->getPrimary()->makeClone(*psets.back(), *twfs.back()));
60+
hams.emplace_back(pools.hamiltonian_pool->getHamiltonian().value().get().makeClone(*psets.back(), *twfs.back()));
6161
crowd.addWalker(*walkers.back(), *psets.back(), *twfs.back(), *hams.back());
6262
};
6363

@@ -83,12 +83,12 @@ TEST_CASE("Crowd integration", "[drivers]")
8383
using namespace testing;
8484
SetupPools pools;
8585

86-
EstimatorManagerNew em(*pools.hamiltonian_pool->getPrimary(), comm);
86+
EstimatorManagerNew em(pools.hamiltonian_pool->getHamiltonian().value(), comm);
8787

8888
DriverWalkerResourceCollection driverwalker_resource_collection_;
8989

9090
Crowd crowd(em, driverwalker_resource_collection_, *pools.particle_pool->getParticleSet("e"),
91-
pools.wavefunction_pool->getWaveFunction().value(), *pools.hamiltonian_pool->getPrimary());
91+
pools.wavefunction_pool->getWaveFunction().value(), pools.hamiltonian_pool->getHamiltonian().value());
9292
}
9393

9494
TEST_CASE("Crowd redistribute walkers")

src/QMCDrivers/tests/test_DMCBatched.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ TEST_CASE("DMCDriver+QMCDriverNew integration", "[drivers]")
7575

7676
DMCBatched dmcdriver(test_project, std::move(qmcdriver_input), nullptr, std::move(dmcdriver_input), walker_confs,
7777
MCPopulation(comm->size(), comm->rank(), *particle_pool.getParticleSet("e"),
78-
wavefunction_pool.getWaveFunction().value(), *hamiltonian_pool.getPrimary()),
78+
wavefunction_pool.getWaveFunction().value(), hamiltonian_pool.getHamiltonian().value()),
7979
rng_pool.getRngRefs(), comm);
8080

8181
// setStatus must be called before process

src/QMCDrivers/tests/test_MCPopulation.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ TEST_CASE("MCPopulation::createWalkers", "[particle][population]")
3939
WalkerConfigurations walker_confs;
4040

4141
// Test is intended to be run on one rank
42-
MCPopulation population(1, comm->rank(), *particle_pool.getParticleSet("e"), twf, *hamiltonian_pool.getPrimary());
42+
MCPopulation population(1, comm->rank(), *particle_pool.getParticleSet("e"), twf, hamiltonian_pool.getHamiltonian().value());
4343

4444
population.createWalkers(8, walker_confs, 2.0);
4545
CHECK(population.get_walkers().size() == 8);
@@ -48,7 +48,7 @@ TEST_CASE("MCPopulation::createWalkers", "[particle][population]")
4848
population.saveWalkerConfigurations(walker_confs);
4949
CHECK(walker_confs.getActiveWalkers() == 8);
5050

51-
MCPopulation population2(1, comm->rank(), *particle_pool.getParticleSet("e"), twf, *hamiltonian_pool.getPrimary());
51+
MCPopulation population2(1, comm->rank(), *particle_pool.getParticleSet("e"), twf, hamiltonian_pool.getHamiltonian().value());
5252
// keep 3 only configurations.
5353
WalkerConfigurations walker_confs2;
5454
walker_confs2.resize(3, 0);
@@ -94,7 +94,7 @@ TEST_CASE("MCPopulation::createWalkers_walker_ids", "[particle][population]")
9494

9595
int num_ranks = 3;
9696
for (int i = 0; i < num_ranks; ++i)
97-
pops.emplace_back(num_ranks, i, *particle_pool.getParticleSet("e"), twf, *hamiltonian_pool.getPrimary());
97+
pops.emplace_back(num_ranks, i, *particle_pool.getParticleSet("e"), twf, hamiltonian_pool.getHamiltonian().value());
9898

9999
std::vector<long> walker_ids;
100100
std::array<std::vector<long>, 3> per_rank_walker_ids;
@@ -162,7 +162,7 @@ TEST_CASE("MCPopulation::redistributeWalkers", "[particle][population]")
162162
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
163163
WalkerConfigurations walker_confs;
164164
MCPopulation population(1, comm->rank(), *particle_pool.getParticleSet("e"),
165-
wavefunction_pool.getWaveFunction().value(), *hamiltonian_pool.getPrimary());
165+
wavefunction_pool.getWaveFunction().value(), hamiltonian_pool.getHamiltonian().value());
166166

167167
population.createWalkers(8, walker_confs);
168168
REQUIRE(population.get_walkers().size() == 8);
@@ -196,7 +196,7 @@ TEST_CASE("MCPopulation::fissionHighMultiplicityWalkers", "[particle][population
196196
auto hamiltonian_pool = MinimalHamiltonianPool::make_hamWithEE(comm, particle_pool, wavefunction_pool);
197197
WalkerConfigurations walker_confs;
198198
MCPopulation population(1, comm->rank(), *particle_pool.getParticleSet("e"),
199-
wavefunction_pool.getWaveFunction().value(), *hamiltonian_pool.getPrimary());
199+
wavefunction_pool.getWaveFunction().value(), hamiltonian_pool.getHamiltonian().value());
200200

201201
population.createWalkers(8, walker_confs);
202202
auto& walkers = population.get_walkers();

src/QMCDrivers/tests/test_QMCDriverNew.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ TEST_CASE("QMCDriverNew tiny case", "[drivers]")
4949
QMCDriverNewTestWrapper qmcdriver(test_project, std::move(qmcdriver_input), walker_confs,
5050
MCPopulation(comm->size(), comm->rank(), *particle_pool.getParticleSet("e"),
5151
wavefunction_pool.getWaveFunction().value(),
52-
*hamiltonian_pool.getPrimary()),
52+
hamiltonian_pool.getHamiltonian().value()),
5353
rng_pool.getRngRefs(), comm);
5454

5555
// setStatus must be called before process
@@ -93,7 +93,7 @@ TEST_CASE("QMCDriverNew walker counts", "[drivers]")
9393
QMCDriverNewTestWrapper qmc_batched(test_project, std::move(qmcdriver_copy), walker_confs,
9494
MCPopulation(comm->size(), comm->rank(), *particle_pool.getParticleSet("e"),
9595
wavefunction_pool.getWaveFunction().value(),
96-
*hamiltonian_pool.getPrimary()),
96+
hamiltonian_pool.getHamiltonian().value()),
9797
rng_pool.getRngRefs(), comm);
9898

9999
qmc_batched.testAdjustGlobalWalkerCount();
@@ -123,7 +123,7 @@ TEST_CASE("QMCDriverNew test driver operations", "[drivers]")
123123
QMCDriverNewTestWrapper qmcdriver(test_project, std::move(qmcdriver_input), walker_confs,
124124
MCPopulation(comm->size(), comm->rank(), *particle_pool.getParticleSet("e"),
125125
wavefunction_pool.getWaveFunction().value().get(),
126-
*hamiltonian_pool.getPrimary()),
126+
hamiltonian_pool.getHamiltonian().value()),
127127
rng_pool.getRngRefs(), comm);
128128

129129

0 commit comments

Comments
 (0)