From 4b354298f87e335176e91d188458c11a2705b2a0 Mon Sep 17 00:00:00 2001 From: mtnel24 Date: Thu, 19 Mar 2026 10:10:23 -0500 Subject: [PATCH 1/3] Fix bug in evaluate_gradient_threaded that caused wrong transform to be used when sampling overlap --- pyqmc/method/ensemble_optimization_threaded.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyqmc/method/ensemble_optimization_threaded.py b/pyqmc/method/ensemble_optimization_threaded.py index e1352743..d253c2f0 100644 --- a/pyqmc/method/ensemble_optimization_threaded.py +++ b/pyqmc/method/ensemble_optimization_threaded.py @@ -176,6 +176,7 @@ def evaluate_gradients_threaded( ) transform_list = updater[wfi] for sub_iteration in range(len(transform_list)): + transform = transform_list[sub_iteration] overlap_workers_thread = threader.submit( pyqmc.method.sample_many.sample_overlap, wfs[0 : wfi + 1], From 5f8254160fdb79a6b10460644d99a291379090aa Mon Sep 17 00:00:00 2001 From: mtnel24 Date: Thu, 19 Mar 2026 10:15:06 -0500 Subject: [PATCH 2/3] Fix overlap_thread_weight argument for optimize_ensemble not being applied --- pyqmc/method/ensemble_optimization_threaded.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyqmc/method/ensemble_optimization_threaded.py b/pyqmc/method/ensemble_optimization_threaded.py index d253c2f0..824ccee8 100644 --- a/pyqmc/method/ensemble_optimization_threaded.py +++ b/pyqmc/method/ensemble_optimization_threaded.py @@ -320,6 +320,7 @@ def optimize_ensemble( npartitions=npartitions, vmc_kwargs=vmc_kwargs, overlap_kwargs=overlap_kwargs, + overlap_thread_weight=overlap_thread_weight, ) for wfi, wf in enumerate(wfs): transform_list = updater[wfi] From 68c18d4505c20fa1e63855028c0b7c392937e537 Mon Sep 17 00:00:00 2001 From: mtnel24 Date: Thu, 19 Mar 2026 14:38:49 -0500 Subject: [PATCH 3/3] Create test that will fail for old version of evaluate_gradients_threaded --- .../unit/test_evaluate_gradients_threaded.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/unit/test_evaluate_gradients_threaded.py diff --git a/tests/unit/test_evaluate_gradients_threaded.py b/tests/unit/test_evaluate_gradients_threaded.py new file mode 100644 index 00000000..f940c6a5 --- /dev/null +++ b/tests/unit/test_evaluate_gradients_threaded.py @@ -0,0 +1,48 @@ +import pyqmc.api as pyq +import copy +import pyqmc.observables.accumulators +from concurrent.futures import ProcessPoolExecutor + + +def test_transform_consistent_with_wf(H2_casci): + from pyqmc.method.ensemble_optimization_wfbywf import StochasticReconfigurationWfbyWf + from pyqmc.method.ensemble_optimization_threaded import evaluate_gradients_threaded + mol, mf, mc = H2_casci + mcs = [copy.copy(mc) for i in range(2)] + for i in range(2): + mcs[i].ci = mc.ci[i] + + energy = pyq.EnergyAccumulator(mol) + sr_accumulator = [] + tol = 1e-20 + wfs = [] + for i in range(2): + + wf, to_opt = pyq.generate_slater(mol, mf, mc=mcs[i], optimize_determinants=True, tol = tol) + wfs.append(wf) + sr_accumulator.append( + [ + StochasticReconfigurationWfbyWf( + energy, + pyqmc.observables.accumulators.LinearTransform( + wf.parameters, to_opt + ), + ) + ] + ) + + configs = pyq.initial_guess(mol, 100) + configs_ensemble = [ + [[copy.deepcopy(configs) for _ in range(2)] for _ in range(len(sr_accumulator[wfi]))] + for wfi in range(2) +] + with ProcessPoolExecutor() as executor: + _, data_unweighted, configs = pyqmc.method.sample_many.sample_overlap( + wfs, + configs_ensemble[0][0][0], + None, + client=executor, + npartitions=1 + ) + evaluate_gradients_threaded(wfs, configs_ensemble, sr_accumulator, client=executor) + \ No newline at end of file