From 5fffac9adfae58e37523832ab8fd39dc56230ccf Mon Sep 17 00:00:00 2001 From: "Ryan M. Richard" Date: Thu, 15 Oct 2026 11:04:25 -0500 Subject: [PATCH 1/2] use plugin class --- cxx/include/scf/scf_mm.hpp | 26 ++---- cxx/src/scf/driver/driver.hpp | 32 +++---- cxx/src/scf/eigen_solver/eigen_solver.hpp | 24 +++--- cxx/src/scf/export_scf.cpp | 3 +- cxx/src/scf/fock_operator/fock_operator.hpp | 18 ++-- cxx/src/scf/guess/guess.hpp | 24 +++--- cxx/src/scf/matrix_builder/matrix_builder.hpp | 41 ++++----- cxx/src/scf/scf_mm.cpp | 67 +++++++-------- cxx/src/scf/update/update.hpp | 14 +-- cxx/src/scf/xc/gauxc/gauxc.cpp | 39 ++++----- cxx/src/scf/xc/gauxc/gauxc.hpp | 4 +- cxx/src/scf/xc/libxc/libxc.cpp | 23 ++--- cxx/src/scf/xc/libxc/libxc.hpp | 4 +- cxx/src/scf/xc/native/native.cpp | 23 ++--- cxx/src/scf/xc/native/native.hpp | 4 +- cxx/src/scf/xc/xc.cpp | 28 +++--- cxx/src/scf/xc/xc.hpp | 4 +- pyproject.toml | 4 +- .../integration_tests/integration_tests.hpp | 11 ++- .../cxx/integration_tests/xc/libxc_energy.cpp | 4 +- .../integration_tests/xc/libxc_potential.cpp | 4 +- tests/cxx/unit_tests/coulombs_law.cpp | 2 +- .../eigen_solver/eigen_generalized.cpp | 2 +- .../unit_tests/eigen_solver/eigen_normal.cpp | 2 +- .../eigen_solver/eigen_solve_driver.cpp | 2 +- .../eigen_solver/eigenvector_uncertainty.cpp | 2 +- .../eigen_solver/generalized_eigen_solver.cpp | 2 +- .../unit_tests/eigen_solver/jacobi_normal.cpp | 4 +- .../unit_tests/fock_operator/restricted.cpp | 2 +- .../matrix_builder/density_matrix.cpp | 2 +- tests/cxx/unit_tests/scf_mm.cpp | 85 ++++++++++++++----- tests/cxx/unit_tests/xc/aos_on_grid.cpp | 2 +- tests/cxx/unit_tests/xc/density2grid.cpp | 2 +- tests/cxx/unit_tests/xc/gau2grid.cpp | 2 +- .../unit_tests/xc/gauxc/basis_conversion.cpp | 2 +- .../cxx/unit_tests/xc/gauxc/gauxc_driver.cpp | 2 +- .../xc/gauxc/molecule_conversion.cpp | 2 +- tests/cxx/unit_tests/xc/gauxc/snlink.cpp | 2 +- tests/cxx/unit_tests/xc/gauxc/xc_energy.cpp | 2 +- .../cxx/unit_tests/xc/gauxc/xc_potential.cpp | 2 +- tests/cxx/unit_tests/xc/grid_from_file.cpp | 2 +- .../unit_tests/xc/grid_from_integratorxx.cpp | 2 +- .../cxx/unit_tests/xc/libxc/libxc_energy.cpp | 2 +- .../unit_tests/xc/libxc/libxc_potential.cpp | 2 +- .../driver/test_scf_driver.py | 9 +- .../eigen_solver/test_eigen_generalized.py | 2 +- uncertainty/eigen_generalized.py | 2 +- 47 files changed, 290 insertions(+), 255 deletions(-) diff --git a/cxx/include/scf/scf_mm.hpp b/cxx/include/scf/scf_mm.hpp index 8f85b1b..b894744 100644 --- a/cxx/include/scf/scf_mm.hpp +++ b/cxx/include/scf/scf_mm.hpp @@ -18,26 +18,18 @@ #include namespace scf { -/** @brief Loads the modules contained in the SCF module collection into the - * provided ModuleManager instance. - */ -void load_modules(pluginplay::ModuleManager& mm); - -/** @brief Connects SCF's modules to the modules other plugins provide. +/** @brief The SCF plugin. + * + * Load it into a ModuleManager with `mm.load_plugin()` + * (`mm.load_plugin(scf.SCF())` from Python). The plugin's name is "scf". * * Several SCF modules need a submodule that SCF itself does not provide (the * Hamiltonian, the AO integrals, the overlap matrix, and the SAD density). - * This function sets those submodules to the default implementations from - * the NUX, Integrals, and ChemCache plugins. - * - * Each submodule is only set if the module providing it has been loaded into - * @p mm, so this function must be called after those plugins' load_modules. - * Submodules whose provider is missing are left unset, and SCF does not - * depend on any of those plugins. - * - * @param[in,out] mm The ModuleManager to set the submodules in. Must already - * contain SCF's modules (see load_modules). + * The plugin records defaults for those submodules from the NUX, Integrals, + * and ChemCache plugins, which ModuleManager::wire_defaults sets once the + * plugins are loaded. Submodules whose provider is not loaded are left unset, + * and SCF does not depend on any of those plugins. */ -void set_defaults(pluginplay::ModuleManager& mm); +DECLARE_PLUGIN(SCF); } // namespace scf diff --git a/cxx/src/scf/driver/driver.hpp b/cxx/src/scf/driver/driver.hpp index c4272d6..c4c7bcc 100644 --- a/cxx/src/scf/driver/driver.hpp +++ b/cxx/src/scf/driver/driver.hpp @@ -22,25 +22,25 @@ namespace scf::driver { DECLARE_MODULE(SCFDriver); DECLARE_MODULE(SCFLoop); -inline void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("SCF Driver"); - mm.add_module("Loop"); +inline void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("SCF Driver"); + modules.add_module("Loop"); } -inline void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("Loop", "Electronic energy", "Electronic energy"); - mm.change_submod("Loop", "Density matrix", "Density matrix builder"); - mm.change_submod("Loop", "Diagonalizer", - "Generalized eigensolve via Eigen"); - mm.change_submod("Loop", "Fock matrix builder", "Fock matrix builder"); - mm.change_submod("Loop", "One-electron Fock operator", - "Restricted One-Electron Fock op"); - mm.change_submod("Loop", "Fock operator", "Restricted Fock Op"); - mm.change_submod("Loop", "Charge-charge", "Coulomb's Law"); - mm.change_submod("Loop", "Fock matrix builder", "Fock matrix builder"); +inline void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("Loop", "Electronic energy", "Electronic energy"); + modules.change_submod("Loop", "Density matrix", "Density matrix builder"); + modules.change_submod("Loop", "Diagonalizer", + "Generalized eigensolve via Eigen"); + modules.change_submod("Loop", "Fock matrix builder", "Fock matrix builder"); + modules.change_submod("Loop", "One-electron Fock operator", + "Restricted One-Electron Fock op"); + modules.change_submod("Loop", "Fock operator", "Restricted Fock Op"); + modules.change_submod("Loop", "Charge-charge", "Coulomb's Law"); + modules.change_submod("Loop", "Fock matrix builder", "Fock matrix builder"); - mm.change_submod("SCF Driver", "Guess", "Core guess"); - mm.change_submod("SCF Driver", "Optimizer", "Loop"); + modules.change_submod("SCF Driver", "Guess", "Core guess"); + modules.change_submod("SCF Driver", "Optimizer", "Loop"); } } // namespace scf::driver diff --git a/cxx/src/scf/eigen_solver/eigen_solver.hpp b/cxx/src/scf/eigen_solver/eigen_solver.hpp index f5dd10e..5fc0137 100644 --- a/cxx/src/scf/eigen_solver/eigen_solver.hpp +++ b/cxx/src/scf/eigen_solver/eigen_solver.hpp @@ -25,20 +25,20 @@ DECLARE_MODULE(EigenGeneralized); DECLARE_MODULE(EigenNormal); DECLARE_MODULE(JacobiNormal); -inline void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("Eigen Solve", "none", "Eigen Solve via Eigen"); - mm.change_submod("Eigen Solve", "uncertain", "Eigen Solve via Jacobi"); - mm.change_submod("Eigen Solve", "interval", "Eigen Solve via Jacobi"); - mm.change_submod("Generalized eigensolve", "Eigen Solve", "Eigen Solve"); +inline void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("Eigen Solve", "none", "Eigen Solve via Eigen"); + modules.change_submod("Eigen Solve", "uncertain", "Eigen Solve via Jacobi"); + modules.change_submod("Eigen Solve", "interval", "Eigen Solve via Jacobi"); + modules.change_submod("Generalized eigensolve", "Eigen Solve", + "Eigen Solve"); } -inline void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("Eigen Solve"); - mm.add_module("Eigen Solve via Eigen"); - mm.add_module("Eigen Solve via Jacobi"); - mm.add_module("Generalized eigensolve via Eigen"); - mm.add_module("Generalized eigensolve"); - set_defaults(mm); +inline void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("Eigen Solve"); + modules.add_module("Eigen Solve via Eigen"); + modules.add_module("Eigen Solve via Jacobi"); + modules.add_module("Generalized eigensolve via Eigen"); + modules.add_module("Generalized eigensolve"); } } // namespace scf::eigen_solver diff --git a/cxx/src/scf/export_scf.cpp b/cxx/src/scf/export_scf.cpp index d26ccc4..ff7e032 100644 --- a/cxx/src/scf/export_scf.cpp +++ b/cxx/src/scf/export_scf.cpp @@ -20,7 +20,7 @@ namespace scf { -EXPORT_PLUGIN(scf, m) { +EXPORT_PLUGIN(scf, SCF, m) { pybind11::module::import("parallelzone"); m.def("initialize", [](pybind11::list py_args) { std::vector args; @@ -34,7 +34,6 @@ EXPORT_PLUGIN(scf, m) { return scf::initialize(argc, argv.data()); }); m.def("finalize", []() { scf::finalize(); }); - m.def("set_defaults", &set_defaults); } } // namespace scf diff --git a/cxx/src/scf/fock_operator/fock_operator.hpp b/cxx/src/scf/fock_operator/fock_operator.hpp index f6ef6de..8d410bf 100644 --- a/cxx/src/scf/fock_operator/fock_operator.hpp +++ b/cxx/src/scf/fock_operator/fock_operator.hpp @@ -25,7 +25,7 @@ DECLARE_MODULE(Restricted); template DECLARE_MODULE(RKohnSham); -inline void load_modules(pluginplay::ModuleManager& mm) { +inline void load_modules(pluginplay::ModuleMap& modules) { using simde::type::decomposable_e_density; using simde::type::e_density; using simde::type::electron; @@ -38,14 +38,14 @@ inline void load_modules(pluginplay::ModuleManager& mm) { using e_ks_e = RKohnSham; using d_ks_many = RKohnSham; using d_ks_e = RKohnSham; - mm.add_module("AO Restricted Fock Op"); - mm.add_module("Restricted Fock Op"); - mm.add_module("AO Restricted One-Electron Fock Op"); - mm.add_module("Restricted One-Electron Fock Op"); - mm.add_module("AO Restricted Kohn-Sham Op"); - mm.add_module("Restricted Kohn-Sham Op"); - mm.add_module("AO Restricted One-Electron Kohn-Sham Op"); - mm.add_module("Restricted One-Electron Kohn-Sham Op"); + modules.add_module("AO Restricted Fock Op"); + modules.add_module("Restricted Fock Op"); + modules.add_module("AO Restricted One-Electron Fock Op"); + modules.add_module("Restricted One-Electron Fock Op"); + modules.add_module("AO Restricted Kohn-Sham Op"); + modules.add_module("Restricted Kohn-Sham Op"); + modules.add_module("AO Restricted One-Electron Kohn-Sham Op"); + modules.add_module("Restricted One-Electron Kohn-Sham Op"); } #define EXTERN_RESTRICTED(density) \ diff --git a/cxx/src/scf/guess/guess.hpp b/cxx/src/scf/guess/guess.hpp index 9c94b3d..659b854 100644 --- a/cxx/src/scf/guess/guess.hpp +++ b/cxx/src/scf/guess/guess.hpp @@ -22,21 +22,21 @@ namespace scf::guess { DECLARE_MODULE(Core); DECLARE_MODULE(SAD); -inline void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("Core guess"); - mm.add_module("SAD guess"); +inline void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("Core guess"); + modules.add_module("SAD guess"); } -inline void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("Core guess", "Build Fock operator", - "Restricted One-Electron Fock Op"); - mm.change_submod("Core guess", "Guess updater", - "Diagonalization Fock update"); +inline void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("Core guess", "Build Fock operator", + "Restricted One-Electron Fock Op"); + modules.change_submod("Core guess", "Guess updater", + "Diagonalization Fock update"); - mm.change_submod("SAD guess", "Build Fock operator", - "Restricted One-Electron Fock Op"); - mm.change_submod("SAD guess", "Guess updater", - "Diagonalization Fock update"); + modules.change_submod("SAD guess", "Build Fock operator", + "Restricted One-Electron Fock Op"); + modules.change_submod("SAD guess", "Guess updater", + "Diagonalization Fock update"); } } // namespace scf::guess diff --git a/cxx/src/scf/matrix_builder/matrix_builder.hpp b/cxx/src/scf/matrix_builder/matrix_builder.hpp index 2e0f74a..5cd3570 100644 --- a/cxx/src/scf/matrix_builder/matrix_builder.hpp +++ b/cxx/src/scf/matrix_builder/matrix_builder.hpp @@ -25,43 +25,46 @@ DECLARE_MODULE(DeterminantDriver); DECLARE_MODULE(ElectronicEnergy); DECLARE_MODULE(Fock); -inline void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("SCF integral driver"); - mm.add_module("Density matrix builder"); - mm.add_module("Determinant driver"); - mm.add_module("Electronic energy"); - mm.add_module("Fock matrix builder"); +inline void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("SCF integral driver"); + modules.add_module("Density matrix builder"); + modules.add_module("Determinant driver"); + modules.add_module("Electronic energy"); + modules.add_module("Fock matrix builder"); } -inline void set_defaults(pluginplay::ModuleManager& mm) { +inline void set_defaults(pluginplay::ModuleMap& modules) { const auto ao_driver = "SCF integral driver"; - // mm.change_submod(ao_driver, "Fock matrix", "Fock Matrix Builder"); - mm.change_submod(ao_driver, "Density matrix", "Density matrix builder"); + // modules.change_submod(ao_driver, "Fock matrix", "Fock Matrix Builder"); + modules.change_submod(ao_driver, "Density matrix", + "Density matrix builder"); // GauXC and LibXC's "XC Potential"/"XC Energy" modules satisfy the same // property types (see scf::xc::gauxc::xc_potential.cpp/xc_energy.cpp and // scf::xc::libxc::libxc_potential.cpp/libxc_energy.cpp), so either is a // valid default; GauXC is preferred when both are available. Neither module -// exists in the ModuleManager when its BUILD_* option is off, and -// mm.change_submod throws if pointed at a key that isn't registered, so +// exists in the plugin when its BUILD_* option is off, and +// ModuleMap::change_submod throws if pointed at a key that isn't registered, so // this must mirror the same guards scf::xc::set_defaults uses (see xc.cpp) // rather than unconditionally defaulting to GauXC. #ifdef BUILD_GAUXC - mm.change_submod(ao_driver, "XC Potential", "GauXC XC Potential"); + modules.change_submod(ao_driver, "XC Potential", "GauXC XC Potential"); #elif defined(BUILD_LIBXC) - mm.change_submod(ao_driver, "XC Potential", "LibXC Potential"); + modules.change_submod(ao_driver, "XC Potential", "LibXC Potential"); #endif - mm.change_submod("Fock Matrix Builder", "Two center evaluator", ao_driver); + modules.change_submod("Fock Matrix Builder", "Two center evaluator", + ao_driver); const auto det_driver = "Determinant driver"; - mm.change_submod(det_driver, "Two center evaluator", ao_driver); - mm.change_submod(det_driver, "Fock matrix", "Fock matrix builder"); + modules.change_submod(det_driver, "Two center evaluator", ao_driver); + modules.change_submod(det_driver, "Fock matrix", "Fock matrix builder"); - mm.change_submod("Electronic energy", "determinant driver", det_driver); + modules.change_submod("Electronic energy", "determinant driver", + det_driver); #ifdef BUILD_GAUXC - mm.change_submod("Electronic energy", "XC Energy", "GauXC XC Energy"); + modules.change_submod("Electronic energy", "XC Energy", "GauXC XC Energy"); #elif defined(BUILD_LIBXC) - mm.change_submod("Electronic energy", "XC Energy", "LibXC Energy"); + modules.change_submod("Electronic energy", "XC Energy", "LibXC Energy"); #endif } diff --git a/cxx/src/scf/scf_mm.cpp b/cxx/src/scf/scf_mm.cpp index 6375ffa..de295c0 100644 --- a/cxx/src/scf/scf_mm.cpp +++ b/cxx/src/scf/scf_mm.cpp @@ -26,50 +26,47 @@ namespace scf { -void load_modules(pluginplay::ModuleManager& mm) { - driver::load_modules(mm); - eigen_solver::load_modules(mm); - fock_operator::load_modules(mm); - guess::load_modules(mm); - matrix_builder::load_modules(mm); - update::load_modules(mm); - xc::load_modules(mm); +PLUGIN_CTOR(SCF) { + set_name("scf"); - mm.add_module("Coulomb's Law"); + // The defaults refer to modules from more than one subdirectory, so all + // modules are added before any defaults are set + driver::load_modules(modules()); + eigen_solver::load_modules(modules()); + fock_operator::load_modules(modules()); + guess::load_modules(modules()); + matrix_builder::load_modules(modules()); + update::load_modules(modules()); + xc::load_modules(modules()); + + add_module("Coulomb's Law"); - // mm.add_module("Driver"); #ifdef BUILD_TAMM_SCF - mm.add_module("SCF Energy via TAMM"); + add_module("SCF Energy via TAMM"); #endif - driver::set_defaults(mm); - guess::set_defaults(mm); - matrix_builder::set_defaults(mm); - update::set_defaults(mm); - xc::set_defaults(mm); -} + driver::set_defaults(modules()); + eigen_solver::set_defaults(modules()); + guess::set_defaults(modules()); + matrix_builder::set_defaults(modules()); + update::set_defaults(modules()); + xc::set_defaults(modules()); -void set_defaults(pluginplay::ModuleManager& mm) { - // Sets submod of module to provider, but only if provider is loaded - auto set_if_loaded = [&mm](const std::string& module, - const std::string& submod, - const std::string& provider) { - if(mm.count(provider)) mm.change_submod(module, submod, provider); - }; + // Submodules SCF does not provide come from these plugins, if loaded + set_preferred_providers("nux", "integrals", "chemcache"); - // From NUX - set_if_loaded("SCF Driver", "Hamiltonian", - "Born-Oppenheimer approximation"); + default_submod_from("nux", "SCF Driver", "Hamiltonian", + "Born-Oppenheimer approximation"); - // From Integrals - set_if_loaded("SCF integral driver", "Fundamental matrices", - "AO integral driver"); - set_if_loaded("Diagonalization Fock update", "Overlap matrix builder", - "Overlap"); - set_if_loaded("Loop", "Overlap matrix builder", "Overlap"); + default_submod_from("integrals", "SCF integral driver", + "Fundamental matrices", "AO integral driver"); + default_submod_from("integrals", "Diagonalization Fock update", + "Overlap matrix builder", "Overlap"); + default_submod_from("integrals", "Loop", "Overlap matrix builder", + "Overlap"); - // From ChemCache - set_if_loaded("SAD guess", "SAD Density", "sto-3g SAD density"); + default_submod_from("chemcache", "SAD guess", "SAD Density", + "sto-3g SAD density"); } } // namespace scf diff --git a/cxx/src/scf/update/update.hpp b/cxx/src/scf/update/update.hpp index cb7277c..f89a7d3 100644 --- a/cxx/src/scf/update/update.hpp +++ b/cxx/src/scf/update/update.hpp @@ -21,15 +21,15 @@ namespace scf::update { DECLARE_MODULE(Diagonalization); -inline void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("Diagonalization Fock update"); +inline void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("Diagonalization Fock update"); } -inline void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("Diagonalization Fock update", "Diagonalizer", - "Generalized eigensolve via Eigen"); - mm.change_submod("Diagonalization Fock update", "Fock matrix builder", - "Fock matrix builder"); +inline void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("Diagonalization Fock update", "Diagonalizer", + "Generalized eigensolve via Eigen"); + modules.change_submod("Diagonalization Fock update", "Fock matrix builder", + "Fock matrix builder"); } } // namespace scf::update diff --git a/cxx/src/scf/xc/gauxc/gauxc.cpp b/cxx/src/scf/xc/gauxc/gauxc.cpp index e4fe9fc..3d64015 100644 --- a/cxx/src/scf/xc/gauxc/gauxc.cpp +++ b/cxx/src/scf/xc/gauxc/gauxc.cpp @@ -18,40 +18,41 @@ namespace scf::xc::gauxc { -void load_modules(pluginplay::ModuleManager& mm) { +void load_modules(pluginplay::ModuleMap& modules) { // Conversion Utilities - mm.add_module("GauXC Basis Converter"); - mm.add_module("GauXC Molecule Converter"); + modules.add_module("GauXC Basis Converter"); + modules.add_module("GauXC Molecule Converter"); // Data geneation utilities - mm.add_module("GauXC Quadrature Batches"); + modules.add_module("GauXC Quadrature Batches"); // XC Integration - mm.add_module("GauXC Driver"); - mm.add_module("GauXC XC Potential"); - mm.add_module("GauXC XC Energy"); + modules.add_module("GauXC Driver"); + modules.add_module("GauXC XC Potential"); + modules.add_module("GauXC XC Energy"); // sn-LinK Integration - mm.add_module("snLinK"); + modules.add_module("snLinK"); } -void set_defaults(pluginplay::ModuleManager& mm) { +void set_defaults(pluginplay::ModuleMap& modules) { // Data geneation utilities - mm.change_submod("GauXC Quadrature Batches", "GauXC Basis Converter", - "GauXC Basis Converter"); - mm.change_submod("GauXC Quadrature Batches", "GauXC Molecule Converter", - "GauXC Molecule Converter"); + modules.change_submod("GauXC Quadrature Batches", "GauXC Basis Converter", + "GauXC Basis Converter"); + modules.change_submod("GauXC Quadrature Batches", + "GauXC Molecule Converter", + "GauXC Molecule Converter"); // XC Integration - mm.change_submod("GauXC Driver", "Quadrature Batches", - "GauXC Quadrature Batches"); + modules.change_submod("GauXC Driver", "Quadrature Batches", + "GauXC Quadrature Batches"); - mm.change_submod("GauXC XC Potential", "XC Driver", "GauXC Driver"); - mm.change_submod("GauXC XC Energy", "XC Driver", "GauXC Driver"); + modules.change_submod("GauXC XC Potential", "XC Driver", "GauXC Driver"); + modules.change_submod("GauXC XC Energy", "XC Driver", "GauXC Driver"); // sn-LinK Integration - mm.change_submod("snLinK", "Quadrature Batches", - "GauXC Quadrature Batches"); + modules.change_submod("snLinK", "Quadrature Batches", + "GauXC Quadrature Batches"); } } // namespace scf::xc::gauxc diff --git a/cxx/src/scf/xc/gauxc/gauxc.hpp b/cxx/src/scf/xc/gauxc/gauxc.hpp index 8dea516..69a26dd 100644 --- a/cxx/src/scf/xc/gauxc/gauxc.hpp +++ b/cxx/src/scf/xc/gauxc/gauxc.hpp @@ -35,7 +35,7 @@ DECLARE_MODULE(MoleculeConversion); // Modules to generate XC Quadrature Batches DECLARE_MODULE(QuadratureBatches); -void set_defaults(pluginplay::ModuleManager& mm); -void load_modules(pluginplay::ModuleManager& mm); +void set_defaults(pluginplay::ModuleMap& modules); +void load_modules(pluginplay::ModuleMap& modules); } // namespace scf::xc::gauxc diff --git a/cxx/src/scf/xc/libxc/libxc.cpp b/cxx/src/scf/xc/libxc/libxc.cpp index b3c7bc3..590a06f 100644 --- a/cxx/src/scf/xc/libxc/libxc.cpp +++ b/cxx/src/scf/xc/libxc/libxc.cpp @@ -40,19 +40,20 @@ const auto* get_const_pointer(const tensorwrapper::buffer::BufferBase& buffer) { } } // namespace -void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("LibXC Energy"); - mm.add_module("LibXC Potential"); +void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("LibXC Energy"); + modules.add_module("LibXC Potential"); } -void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("LibXC Energy", "Integration grid", - "Grid From IntegratorXX"); - mm.change_submod("LibXC Potential", "Integration grid", - "Grid From IntegratorXX"); - mm.change_submod("LibXC Energy", "Density on a grid", "Density2Grid"); - mm.change_submod("LibXC Potential", "Density on a grid", "Density2Grid"); - mm.change_submod("LibXC Potential", "AOs on a grid", "AOs on a Grid"); +void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("LibXC Energy", "Integration grid", + "Grid From IntegratorXX"); + modules.change_submod("LibXC Potential", "Integration grid", + "Grid From IntegratorXX"); + modules.change_submod("LibXC Energy", "Density on a grid", "Density2Grid"); + modules.change_submod("LibXC Potential", "Density on a grid", + "Density2Grid"); + modules.change_submod("LibXC Potential", "AOs on a grid", "AOs on a Grid"); } std::pair to_libxc_codes(chemist::qm_operator::xc_functional func) { diff --git a/cxx/src/scf/xc/libxc/libxc.hpp b/cxx/src/scf/xc/libxc/libxc.hpp index d6d1a23..f827980 100644 --- a/cxx/src/scf/xc/libxc/libxc.hpp +++ b/cxx/src/scf/xc/libxc/libxc.hpp @@ -23,8 +23,8 @@ namespace scf::xc::libxc { DECLARE_MODULE(LibXCEnergy); DECLARE_MODULE(LibXCPotential); -void set_defaults(pluginplay::ModuleManager& mm); -void load_modules(pluginplay::ModuleManager& mm); +void set_defaults(pluginplay::ModuleMap& modules); +void load_modules(pluginplay::ModuleMap& modules); /** @brief Wraps the process of going from NWChemEx's XC specification to * LibXC's. diff --git a/cxx/src/scf/xc/native/native.cpp b/cxx/src/scf/xc/native/native.cpp index c3f7af1..9e9f4d7 100644 --- a/cxx/src/scf/xc/native/native.cpp +++ b/cxx/src/scf/xc/native/native.cpp @@ -88,19 +88,20 @@ simde::type::tensor visit(KernelType&& k, const simde::type::tensor& t) { } // namespace -void load_modules(pluginplay::ModuleManager& mm) { - mm.add_module("SVWN3 Energy"); - mm.add_module("SVWN3 Potential"); +void load_modules(pluginplay::ModuleMap& modules) { + modules.add_module("SVWN3 Energy"); + modules.add_module("SVWN3 Potential"); } -void set_defaults(pluginplay::ModuleManager& mm) { - mm.change_submod("SVWN3 Energy", "Integration grid", - "Grid From IntegratorXX"); - mm.change_submod("SVWN3 Potential", "Integration grid", - "Grid From IntegratorXX"); - mm.change_submod("SVWN3 Energy", "Density on a grid", "Density2Grid"); - mm.change_submod("SVWN3 Potential", "Density on a grid", "Density2Grid"); - mm.change_submod("SVWN3 Potential", "AOs on a grid", "AOs on a grid"); +void set_defaults(pluginplay::ModuleMap& modules) { + modules.change_submod("SVWN3 Energy", "Integration grid", + "Grid From IntegratorXX"); + modules.change_submod("SVWN3 Potential", "Integration grid", + "Grid From IntegratorXX"); + modules.change_submod("SVWN3 Energy", "Density on a grid", "Density2Grid"); + modules.change_submod("SVWN3 Potential", "Density on a grid", + "Density2Grid"); + modules.change_submod("SVWN3 Potential", "AOs on a grid", "AOs on a grid"); } simde::type::tensor svwn3_energy_density( diff --git a/cxx/src/scf/xc/native/native.hpp b/cxx/src/scf/xc/native/native.hpp index 717c817..7d9f63a 100644 --- a/cxx/src/scf/xc/native/native.hpp +++ b/cxx/src/scf/xc/native/native.hpp @@ -29,8 +29,8 @@ namespace scf::xc::native { DECLARE_MODULE(SVWN3Energy); DECLARE_MODULE(SVWN3Potential); -void set_defaults(pluginplay::ModuleManager& mm); -void load_modules(pluginplay::ModuleManager& mm); +void set_defaults(pluginplay::ModuleMap& modules); +void load_modules(pluginplay::ModuleMap& modules); /** @brief Computes the SVWN3 energy density, rho * (eps_x + eps_c). * diff --git a/cxx/src/scf/xc/xc.cpp b/cxx/src/scf/xc/xc.cpp index c2a8187..5e780b1 100644 --- a/cxx/src/scf/xc/xc.cpp +++ b/cxx/src/scf/xc/xc.cpp @@ -22,26 +22,26 @@ #include "xc.hpp" namespace scf::xc { -void load_modules(pluginplay::ModuleManager& mm) { +void load_modules(pluginplay::ModuleMap& modules) { #ifdef BUILD_GAUXC - gauxc::load_modules(mm); + gauxc::load_modules(modules); #endif - libxc::load_modules(mm); - native::load_modules(mm); - mm.add_module("AOs on a grid"); - mm.add_module("Gau2Grid"); - mm.add_module("Grid From File"); - mm.add_module("Grid From IntegratorXX"); - mm.add_module("Density2Grid"); + libxc::load_modules(modules); + native::load_modules(modules); + modules.add_module("AOs on a grid"); + modules.add_module("Gau2Grid"); + modules.add_module("Grid From File"); + modules.add_module("Grid From IntegratorXX"); + modules.add_module("Density2Grid"); } -void set_defaults(pluginplay::ModuleManager& mm) { +void set_defaults(pluginplay::ModuleMap& modules) { #ifdef BUILD_GAUXC - gauxc::set_defaults(mm); + gauxc::set_defaults(modules); #endif - libxc::set_defaults(mm); - native::set_defaults(mm); - mm.change_submod("Density2Grid", "AOs on a grid", "AOs on a grid"); + libxc::set_defaults(modules); + native::set_defaults(modules); + modules.change_submod("Density2Grid", "AOs on a grid", "AOs on a grid"); } } // namespace scf::xc diff --git a/cxx/src/scf/xc/xc.hpp b/cxx/src/scf/xc/xc.hpp index b2a2ace..70e2ce2 100644 --- a/cxx/src/scf/xc/xc.hpp +++ b/cxx/src/scf/xc/xc.hpp @@ -25,7 +25,7 @@ DECLARE_MODULE(Gau2Grid); DECLARE_MODULE(GridFromFile); DECLARE_MODULE(GridFromIntegratorXX); -void set_defaults(pluginplay::ModuleManager& mm); -void load_modules(pluginplay::ModuleManager& mm); +void set_defaults(pluginplay::ModuleMap& modules); +void load_modules(pluginplay::ModuleMap& modules); } // namespace scf::xc diff --git a/pyproject.toml b/pyproject.toml index 70e16aa..f7f46b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,8 +62,8 @@ dependencies = [ [project.optional-dependencies] # The integration tests run SCF's modules with the plugins they are wired to -# (see scf::set_defaults). None of these depends on scf, so installing them -# never pulls in a published copy of the package under test. +# (see the preferred providers in scf_mm.cpp). None of these depends on scf, so +# installing them never pulls in a published copy of the package under test. dev = [ "pytest", "pre-commit", diff --git a/tests/cxx/integration_tests/integration_tests.hpp b/tests/cxx/integration_tests/integration_tests.hpp index 6fff071..1eaf93a 100644 --- a/tests/cxx/integration_tests/integration_tests.hpp +++ b/tests/cxx/integration_tests/integration_tests.hpp @@ -44,12 +44,11 @@ template pluginplay::ModuleManager load_modules() { auto rv = std::make_shared(); pluginplay::ModuleManager mm(rv); - scf::load_modules(mm); - integrals::load_modules(mm); - integrals::set_defaults(mm); - nux::load_modules(mm); - chemcache::load_modules(mm); - scf::set_defaults(mm); + mm.load_plugin(); + mm.load_plugin(); + mm.load_plugin(); + mm.load_plugin(); + mm.wire_defaults(); if constexpr(std::is_same_v) { configure_uq(mm, "uncertain"); diff --git a/tests/cxx/integration_tests/xc/libxc_energy.cpp b/tests/cxx/integration_tests/xc/libxc_energy.cpp index 1a7f44e..9a6672c 100644 --- a/tests/cxx/integration_tests/xc/libxc_energy.cpp +++ b/tests/cxx/integration_tests/xc/libxc_energy.cpp @@ -29,7 +29,7 @@ TEST_CASE("LibXCEnergy") { using tensorwrapper::operations::approximately_equal; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); mm.change_submod("LibXC Energy", "Integration grid", "Grid From IntegratorXX"); auto& mod = mm.at("LibXC Energy"); @@ -112,7 +112,7 @@ simde::type::tensor to_float_type(const simde::type::tensor& t) { /// Makes a ModuleManager whose IntegratorXX grid matches the LibXC tests pluginplay::ModuleManager make_svwn3_mm(const std::string& float_type) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); const auto grid_key = "Grid From IntegratorXX"; mm.change_input(grid_key, "Radial Size", std::size_t(150)); mm.change_input(grid_key, "Angular Size", std::size_t(194)); diff --git a/tests/cxx/integration_tests/xc/libxc_potential.cpp b/tests/cxx/integration_tests/xc/libxc_potential.cpp index 137c529..9e23082 100644 --- a/tests/cxx/integration_tests/xc/libxc_potential.cpp +++ b/tests/cxx/integration_tests/xc/libxc_potential.cpp @@ -29,7 +29,7 @@ TEST_CASE("LibXCPotential") { using tensorwrapper::operations::approximately_equal; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); mm.change_submod("LibXC Potential", "Integration grid", "Grid From IntegratorXX"); auto& mod = mm.at("LibXC Potential"); @@ -113,7 +113,7 @@ simde::type::tensor to_float_type(const simde::type::tensor& t) { /// Makes a ModuleManager whose IntegratorXX grid matches the LibXC tests pluginplay::ModuleManager make_svwn3_mm(const std::string& float_type) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); const auto grid_key = "Grid From IntegratorXX"; mm.change_input(grid_key, "Radial Size", std::size_t(150)); mm.change_input(grid_key, "Angular Size", std::size_t(194)); diff --git a/tests/cxx/unit_tests/coulombs_law.cpp b/tests/cxx/unit_tests/coulombs_law.cpp index 628c9e3..ac0fb7d 100644 --- a/tests/cxx/unit_tests/coulombs_law.cpp +++ b/tests/cxx/unit_tests/coulombs_law.cpp @@ -25,7 +25,7 @@ using Catch::Matchers::WithinAbs; TEST_CASE("CoulombsLaw") { using float_type = double; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Coulomb's Law"); tensorwrapper::shape::Smooth shape_corr{}; diff --git a/tests/cxx/unit_tests/eigen_solver/eigen_generalized.cpp b/tests/cxx/unit_tests/eigen_solver/eigen_generalized.cpp index 9c8388f..2c1e9e0 100644 --- a/tests/cxx/unit_tests/eigen_solver/eigen_generalized.cpp +++ b/tests/cxx/unit_tests/eigen_solver/eigen_generalized.cpp @@ -23,7 +23,7 @@ using namespace test_eigen_solver; TEMPLATE_LIST_TEST_CASE("EigenGeneralized H2 dimer", "", types) { using pt = simde::GeneralizedEigenSolve; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto rtol = std::is_same_v ? 5e-4 : 1e-5; auto A = h2_dimer_fock_as(); diff --git a/tests/cxx/unit_tests/eigen_solver/eigen_normal.cpp b/tests/cxx/unit_tests/eigen_solver/eigen_normal.cpp index 8c1b88c..1e05c49 100644 --- a/tests/cxx/unit_tests/eigen_solver/eigen_normal.cpp +++ b/tests/cxx/unit_tests/eigen_solver/eigen_normal.cpp @@ -22,7 +22,7 @@ using namespace tensorwrapper::generate; TEMPLATE_LIST_TEST_CASE("EigenNormal", "", types) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Eigen Solve via Eigen"); auto rtol = std::is_same_v ? 1e-3 : 1e-5; diff --git a/tests/cxx/unit_tests/eigen_solver/eigen_solve_driver.cpp b/tests/cxx/unit_tests/eigen_solver/eigen_solve_driver.cpp index 5538868..4507246 100644 --- a/tests/cxx/unit_tests/eigen_solver/eigen_solve_driver.cpp +++ b/tests/cxx/unit_tests/eigen_solver/eigen_solve_driver.cpp @@ -21,7 +21,7 @@ using namespace test_eigen_solver; TEMPLATE_LIST_TEST_CASE("EigenSolveDriver", "", types) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Eigen Solve"); using pt = simde::EigenSolve; diff --git a/tests/cxx/unit_tests/eigen_solver/eigenvector_uncertainty.cpp b/tests/cxx/unit_tests/eigen_solver/eigenvector_uncertainty.cpp index bb461bf..53d6315 100644 --- a/tests/cxx/unit_tests/eigen_solver/eigenvector_uncertainty.cpp +++ b/tests/cxx/unit_tests/eigen_solver/eigenvector_uncertainty.cpp @@ -38,7 +38,7 @@ TEMPLATE_LIST_TEST_CASE("attach_eigenvector_uncertainty", "", uq_types) { auto radius = [](const TestType& x) { return uq_upper(x) - uq_center(x); }; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Eigen Solve via Jacobi"); auto noise_level = 1e-6; using pt = simde::EigenSolve; diff --git a/tests/cxx/unit_tests/eigen_solver/generalized_eigen_solver.cpp b/tests/cxx/unit_tests/eigen_solver/generalized_eigen_solver.cpp index 89cd2b1..dccf7c8 100644 --- a/tests/cxx/unit_tests/eigen_solver/generalized_eigen_solver.cpp +++ b/tests/cxx/unit_tests/eigen_solver/generalized_eigen_solver.cpp @@ -23,7 +23,7 @@ using namespace test_eigen_solver; TEMPLATE_LIST_TEST_CASE("GeneralizedEigenSolver H2 dimer", "", types) { using pt = simde::GeneralizedEigenSolve; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto rtol = std::is_same_v ? 5e-4 : 1e-5; auto A = h2_dimer_fock_as(); diff --git a/tests/cxx/unit_tests/eigen_solver/jacobi_normal.cpp b/tests/cxx/unit_tests/eigen_solver/jacobi_normal.cpp index 4bef32f..1f0e731 100644 --- a/tests/cxx/unit_tests/eigen_solver/jacobi_normal.cpp +++ b/tests/cxx/unit_tests/eigen_solver/jacobi_normal.cpp @@ -24,7 +24,7 @@ using namespace tensorwrapper::generate; TEMPLATE_LIST_TEST_CASE("JacobiNormal", "", types) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Eigen Solve via Jacobi"); auto rtol = std::is_same_v ? 5e-4 : 1e-5; @@ -68,7 +68,7 @@ TEMPLATE_LIST_TEST_CASE("JacobiNormal", "", types) { using types2 = std::tuple; TEMPLATE_LIST_TEST_CASE("JacobiNormal with noise", "", types2) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Eigen Solve via Jacobi"); auto noise_level = 1e-6; diff --git a/tests/cxx/unit_tests/fock_operator/restricted.cpp b/tests/cxx/unit_tests/fock_operator/restricted.cpp index 45bd920..09f7db5 100644 --- a/tests/cxx/unit_tests/fock_operator/restricted.cpp +++ b/tests/cxx/unit_tests/fock_operator/restricted.cpp @@ -20,7 +20,7 @@ TEMPLATE_LIST_TEST_CASE("Restricted", "", test_scf::float_types) { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); using float_type = double; using density_type = simde::type::decomposable_e_density; using pt = simde::FockOperator; diff --git a/tests/cxx/unit_tests/matrix_builder/density_matrix.cpp b/tests/cxx/unit_tests/matrix_builder/density_matrix.cpp index 87c806d..7e53858 100644 --- a/tests/cxx/unit_tests/matrix_builder/density_matrix.cpp +++ b/tests/cxx/unit_tests/matrix_builder/density_matrix.cpp @@ -21,7 +21,7 @@ using pt = simde::aos_rho_e_aos; TEMPLATE_LIST_TEST_CASE("Density Matrix Builder", "", test_scf::float_types) { using float_type = TestType; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Density matrix builder"); auto aos = test_scf::h2_aos(); auto cmos = test_scf::h2_cmos(); diff --git a/tests/cxx/unit_tests/scf_mm.cpp b/tests/cxx/unit_tests/scf_mm.cpp index cd93072..8e8813a 100644 --- a/tests/cxx/unit_tests/scf_mm.cpp +++ b/tests/cxx/unit_tests/scf_mm.cpp @@ -24,7 +24,7 @@ namespace { // Stands in for a module from another plugin. It only needs to satisfy the -// property type; set_defaults never runs it. +// property type; wiring never runs it. template struct StubProvider : pluginplay::ModuleBase { StubProvider() : pluginplay::ModuleBase(this) { @@ -40,40 +40,81 @@ struct StubProvider : pluginplay::ModuleBase { using ham_pt = simde::Convert; -// (module, submodule, provider) for every submodule set_defaults sets -const std::vector> wiring{ - {"SCF Driver", "Hamiltonian", "Born-Oppenheimer approximation"}, - {"SCF integral driver", "Fundamental matrices", "AO integral driver"}, - {"Diagonalization Fock update", "Overlap matrix builder", "Overlap"}, - {"Loop", "Overlap matrix builder", "Overlap"}, - {"SAD guess", "SAD Density", "sto-3g SAD density"}}; +// Stand-ins for the plugins SCF gets default submodules from +class FakeNUX : public pluginplay::Plugin { +public: + FakeNUX() { + set_name("nux"); + add_module>("Born-Oppenheimer approximation"); + } +}; + +class FakeIntegrals : public pluginplay::Plugin { +public: + FakeIntegrals() { + set_name("integrals"); + add_module>("AO integral driver"); + add_module>("Overlap"); + } +}; + +class FakeChemCache : public pluginplay::Plugin { +public: + FakeChemCache() { + set_name("chemcache"); + add_module>("sto-3g SAD density"); + } +}; + +// (module, submodule, provider plugin, provider) for every default SCF records +const std::vector> wiring{ + {"SCF Driver", "Hamiltonian", "nux", "Born-Oppenheimer approximation"}, + {"SCF integral driver", "Fundamental matrices", "integrals", + "AO integral driver"}, + {"Diagonalization Fock update", "Overlap matrix builder", "integrals", + "Overlap"}, + {"Loop", "Overlap matrix builder", "integrals", "Overlap"}, + {"SAD guess", "SAD Density", "chemcache", "sto-3g SAD density"}}; } // namespace -TEST_CASE("set_defaults") { +TEST_CASE("SCF plugin") { + scf::SCF plugin; + const auto& modules = plugin.get_modules(); + + SECTION("Identity") { + REQUIRE(plugin.name() == "scf"); + using provider_list = scf::SCF::provider_list_type; + provider_list corr{"nux", "integrals", "chemcache"}; + REQUIRE(plugin.preferred_providers() == corr); + } + + SECTION("Defaults set across subdirectories") { + REQUIRE(modules.has_submod("SCF Driver", "Optimizer")); + REQUIRE(modules.has_submod("Generalized eigensolve", "Eigen Solve")); + REQUIRE(modules.has_submod("Density2Grid", "AOs on a grid")); + REQUIRE(modules.has_submod("Loop", "Charge-charge")); + } + pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); SECTION("No providers loaded") { - scf::set_defaults(mm); - for(const auto& [module, submod, provider] : wiring) { + mm.wire_defaults(); + for(const auto& [module, submod, plugin_name, provider] : wiring) { REQUIRE_FALSE(mm.at(module).submods().at(submod).has_module()); } } SECTION("All providers loaded") { - mm.add_module>("Born-Oppenheimer approximation"); - mm.add_module>( - "AO integral driver"); - mm.add_module>("Overlap"); - mm.add_module>( - "sto-3g SAD density"); - - scf::set_defaults(mm); - for(const auto& [module, submod, provider] : wiring) { + mm.load_plugin(); + mm.load_plugin(); + mm.load_plugin(); + mm.wire_defaults(); + for(const auto& [module, submod, plugin_name, provider] : wiring) { const auto& request = mm.at(module).submods().at(submod); REQUIRE(request.has_module()); - REQUIRE(request.uuid() == mm.at(provider).uuid()); + REQUIRE(request.uuid() == mm.at({plugin_name, provider}).uuid()); } } } diff --git a/tests/cxx/unit_tests/xc/aos_on_grid.cpp b/tests/cxx/unit_tests/xc/aos_on_grid.cpp index 53e7b8f..52988cd 100644 --- a/tests/cxx/unit_tests/xc/aos_on_grid.cpp +++ b/tests/cxx/unit_tests/xc/aos_on_grid.cpp @@ -68,7 +68,7 @@ ao_basis_type one_shell_basis(chemist::ShellType purity, unsigned l, TEST_CASE("AOsOnGrid") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("AOs on a grid"); auto path = test_scf::get_test_directory_path(); diff --git a/tests/cxx/unit_tests/xc/density2grid.cpp b/tests/cxx/unit_tests/xc/density2grid.cpp index 0cb2e3c..6b8129a 100644 --- a/tests/cxx/unit_tests/xc/density2grid.cpp +++ b/tests/cxx/unit_tests/xc/density2grid.cpp @@ -26,7 +26,7 @@ using tensorwrapper::operations::approximately_equal; TEST_CASE("Density2Grid") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Density2Grid"); auto path = test_scf::get_test_directory_path(); diff --git a/tests/cxx/unit_tests/xc/gau2grid.cpp b/tests/cxx/unit_tests/xc/gau2grid.cpp index 1ce3186..4857c20 100644 --- a/tests/cxx/unit_tests/xc/gau2grid.cpp +++ b/tests/cxx/unit_tests/xc/gau2grid.cpp @@ -27,7 +27,7 @@ using tensorwrapper::operations::approximately_equal; TEST_CASE("Gau2Grid") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Gau2Grid"); using float_type = double; diff --git a/tests/cxx/unit_tests/xc/gauxc/basis_conversion.cpp b/tests/cxx/unit_tests/xc/gauxc/basis_conversion.cpp index 585cdeb..f8ceb4e 100644 --- a/tests/cxx/unit_tests/xc/gauxc/basis_conversion.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/basis_conversion.cpp @@ -22,7 +22,7 @@ using pt = scf::xc::gauxc::gauxc_basis_conversion_t; TEST_CASE("BasisConversion") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("GauXC Basis Converter"); using nuclei_type = simde::type::nuclei; diff --git a/tests/cxx/unit_tests/xc/gauxc/gauxc_driver.cpp b/tests/cxx/unit_tests/xc/gauxc/gauxc_driver.cpp index 6c37a67..79d02d5 100644 --- a/tests/cxx/unit_tests/xc/gauxc/gauxc_driver.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/gauxc_driver.cpp @@ -26,7 +26,7 @@ using tensorwrapper::operations::approximately_equal; TEST_CASE("GauXCDriver") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("GauXC Driver"); auto func = chemist::qm_operator::xc_functional::PBE0; diff --git a/tests/cxx/unit_tests/xc/gauxc/molecule_conversion.cpp b/tests/cxx/unit_tests/xc/gauxc/molecule_conversion.cpp index a64d31c..406dd5b 100644 --- a/tests/cxx/unit_tests/xc/gauxc/molecule_conversion.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/molecule_conversion.cpp @@ -22,7 +22,7 @@ using pt = scf::xc::gauxc::basis_to_gauxc_molecule_conversion_t; TEST_CASE("MoleculeConversion") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("GauXC Molecule Converter"); using nuclei_type = simde::type::nuclei; diff --git a/tests/cxx/unit_tests/xc/gauxc/snlink.cpp b/tests/cxx/unit_tests/xc/gauxc/snlink.cpp index 22bc967..f676aa3 100644 --- a/tests/cxx/unit_tests/xc/gauxc/snlink.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/snlink.cpp @@ -21,7 +21,7 @@ using tensorwrapper::operations::approximately_equal; TEST_CASE("snLinK") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("snLinK"); SECTION("h2") { diff --git a/tests/cxx/unit_tests/xc/gauxc/xc_energy.cpp b/tests/cxx/unit_tests/xc/gauxc/xc_energy.cpp index 93b2104..67664e9 100644 --- a/tests/cxx/unit_tests/xc/gauxc/xc_energy.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/xc_energy.cpp @@ -33,7 +33,7 @@ TEST_CASE("XCEnergy") { using float_type = double; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("GauXC XC Energy"); auto func = chemist::qm_operator::xc_functional::PBE0; diff --git a/tests/cxx/unit_tests/xc/gauxc/xc_potential.cpp b/tests/cxx/unit_tests/xc/gauxc/xc_potential.cpp index 307ca56..15edc5e 100644 --- a/tests/cxx/unit_tests/xc/gauxc/xc_potential.cpp +++ b/tests/cxx/unit_tests/xc/gauxc/xc_potential.cpp @@ -25,7 +25,7 @@ using tensorwrapper::operations::approximately_equal; TEST_CASE("XCPotential") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("GauXC XC Potential"); simde::type::electron e; diff --git a/tests/cxx/unit_tests/xc/grid_from_file.cpp b/tests/cxx/unit_tests/xc/grid_from_file.cpp index f2844e3..5991226 100644 --- a/tests/cxx/unit_tests/xc/grid_from_file.cpp +++ b/tests/cxx/unit_tests/xc/grid_from_file.cpp @@ -24,7 +24,7 @@ using pt = simde::MolecularGrid; TEST_CASE("GridFromFile") { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Grid From File"); int process_rank; diff --git a/tests/cxx/unit_tests/xc/grid_from_integratorxx.cpp b/tests/cxx/unit_tests/xc/grid_from_integratorxx.cpp index da3e5d9..e348dc0 100644 --- a/tests/cxx/unit_tests/xc/grid_from_integratorxx.cpp +++ b/tests/cxx/unit_tests/xc/grid_from_integratorxx.cpp @@ -31,7 +31,7 @@ constexpr std::size_t angular_size = 6; pluginplay::ModuleManager make_mm() { pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("Grid From IntegratorXX"); mod.change_input("Radial Size", radial_size); mod.change_input("Angular Size", angular_size); diff --git a/tests/cxx/unit_tests/xc/libxc/libxc_energy.cpp b/tests/cxx/unit_tests/xc/libxc/libxc_energy.cpp index aa1c1eb..48f68d6 100644 --- a/tests/cxx/unit_tests/xc/libxc/libxc_energy.cpp +++ b/tests/cxx/unit_tests/xc/libxc/libxc_energy.cpp @@ -26,7 +26,7 @@ TEST_CASE("LibXCEnergy") { using float_type = double; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); auto& mod = mm.at("LibXC Energy"); auto rho = test_scf::h2_density(); diff --git a/tests/cxx/unit_tests/xc/libxc/libxc_potential.cpp b/tests/cxx/unit_tests/xc/libxc/libxc_potential.cpp index 4de4005..93e41a6 100644 --- a/tests/cxx/unit_tests/xc/libxc/libxc_potential.cpp +++ b/tests/cxx/unit_tests/xc/libxc/libxc_potential.cpp @@ -26,7 +26,7 @@ TEST_CASE("LibXCPotential") { using tensorwrapper::operations::approximately_equal; pluginplay::ModuleManager mm; - scf::load_modules(mm); + mm.load_plugin(); mm.change_submod("LibXC Potential", "Integration grid", "Grid From File"); auto& mod = mm.at("LibXC Potential"); diff --git a/tests/python/integration_tests/driver/test_scf_driver.py b/tests/python/integration_tests/driver/test_scf_driver.py index 6c8988c..fb28c9b 100644 --- a/tests/python/integration_tests/driver/test_scf_driver.py +++ b/tests/python/integration_tests/driver/test_scf_driver.py @@ -53,10 +53,11 @@ def test_dft_driver(self): def setUp(self): # Setup Module Manager self.mm = pp.ModuleManager(pz.runtime.RuntimeView()) - for plugin in (scf, integrals, chemcache, nux): - plugin.load_modules(self.mm) - integrals.set_defaults(self.mm) - scf.set_defaults(self.mm) + self.mm.load_plugin(scf.SCF()) + self.mm.load_plugin(integrals.Integrals()) + self.mm.load_plugin(chemcache.ChemCache()) + self.mm.load_plugin(nux.NUX()) + self.mm.wire_defaults() # Property Types self.mol = simde.MoleculeFromString() diff --git a/tests/python/unit_tests/eigen_solver/test_eigen_generalized.py b/tests/python/unit_tests/eigen_solver/test_eigen_generalized.py index 8ee62e9..c5d2a8a 100644 --- a/tests/python/unit_tests/eigen_solver/test_eigen_generalized.py +++ b/tests/python/unit_tests/eigen_solver/test_eigen_generalized.py @@ -40,4 +40,4 @@ def test_eigen_generalized(self): def setUp(self): self.mm = pp.ModuleManager(pz.runtime.RuntimeView()) - scf.load_modules(self.mm) + self.mm.load_plugin(scf.SCF()) diff --git a/uncertainty/eigen_generalized.py b/uncertainty/eigen_generalized.py index 8ea3e7f..39dd47a 100644 --- a/uncertainty/eigen_generalized.py +++ b/uncertainty/eigen_generalized.py @@ -22,7 +22,7 @@ class GeneralizedEigenSolverTester: def __init__(self): self.mm = ModuleManager() - scf.load_modules(self.mm) + self.mm.load_plugin(scf.SCF()) self.solver = self.mm.at("Generalized eigensolve via Eigen") def solve_gen_eigenproblem(self, A, B, verify=True): From e9eefeafeb444d21a69fb676bf34d84088d92f4e Mon Sep 17 00:00:00 2001 From: "Ryan M. Richard" Date: Thu, 15 Oct 2026 13:00:21 -0500 Subject: [PATCH 2/2] bump simde floor --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f7f46b4..fb4770b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ requires = [ # [project].dependencies; leave the floors unbounded so the newest # release is always resolved. "nwchemex-nwxcmake>=0.1.0", - "nwchemex-simde>=0.0.77", + "nwchemex-simde>=0.0.85", ] build-backend = "scikit_build_core.build" @@ -57,7 +57,7 @@ dependencies = [ # registries and breaks cross-module type exchange. "pybind11==3.1.0", "nwchemex-nwxcmake>=0.1.0", - "nwchemex-simde>=0.0.77", + "nwchemex-simde>=0.0.85", ] [project.optional-dependencies]