From bc269cf2ae5ccd3742a68f30ba58c7a9e2ac2dc3 Mon Sep 17 00:00:00 2001 From: Reiher Research Group Date: Mon, 26 Aug 2024 06:19:17 +0200 Subject: [PATCH] Release 3.1.0 --- .conan_test_package/conanfile.py | 83 +--------- CHANGELOG.rst | 5 + CMakeLists.txt | 2 +- README.rst | 7 + conanfile.py | 4 +- dev | 2 +- src/Serenity/CMakeLists.txt | 9 +- src/Serenity/Python/Tests/__init__.py | 4 + src/Serenity/Python/Tests/test_calculators.py | 152 ++++++++++++++++++ src/Serenity/Python/setup.py | 5 +- tests/test_calculators.py | 92 ----------- 11 files changed, 185 insertions(+), 180 deletions(-) create mode 100644 src/Serenity/Python/Tests/__init__.py create mode 100644 src/Serenity/Python/Tests/test_calculators.py delete mode 100644 tests/test_calculators.py diff --git a/.conan_test_package/conanfile.py b/.conan_test_package/conanfile.py index d23c22f..edeae71 100644 --- a/.conan_test_package/conanfile.py +++ b/.conan_test_package/conanfile.py @@ -6,6 +6,7 @@ from conans import ConanFile + class TestPackageConan(ConanFile): def build(self): pass @@ -16,84 +17,6 @@ def test(self): import scine_serenity_wrapper self.output.info("Import worked") - import scine_utilities as utils - - h2 = utils.AtomCollection( - [utils.ElementType.H, utils.ElementType.H], - [[-0.7, 0.0, 0.0], [0.7, 0.0, 0.0]] - ) - - # Test R-KS-DFT - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'dft') - assert calculator.name() == 'SerenityDFTCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'pbe-d3bj' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.166043) < 1e-6 - self.output.info("R-KS-DFT worked") - - # Test U-KS-DFT - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'dft') - assert calculator.name() == 'SerenityDFTCalculator' - calculator.structure = h2 - calculator.settings['spin_mode'] = 'unrestricted' - calculator.settings['method'] = 'pbe-d3bj' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.166043) < 1e-6 - self.output.info("U-KS-DFT worked") - - # Test R-HF - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'hf') - assert calculator.name() == 'SerenityHFCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'hf' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.132535) < 1e-6 - self.output.info("U-KS-DFT worked") - - # Test U-HF - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'hf') - assert calculator.name() == 'SerenityHFCalculator' - calculator.structure = h2 - calculator.settings['spin_mode'] = 'unrestricted' - calculator.settings['method'] = 'hf' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.132535) < 1e-6 - self.output.info("U-KS-DFT worked") - - # Test R-CCSD(T) - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'cc') - assert calculator.name() == 'SerenityCCCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'ccsd(t)' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.168261) < 1e-6 - self.output.info("R-CCSD(T) worked") - - # Test R-DLPNO-CCSD(T0) - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'cc') - assert calculator.name() == 'SerenityCCCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'dlpno-ccsd(t0)' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.168311) < 1e-6 - self.output.info("R-DLPNO-CCSD(T) worked") + from scine_serenity_wrapper.Tests.test_calculators import run_all_tests + run_all_tests() diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 397ea19..804bfe4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,11 @@ Changelog ========= +Release 3.1.0 +------------- + +- Add unit tests for Python package and remove obsolete tests + Release 3.0.0 ------------- diff --git a/CMakeLists.txt b/CMakeLists.txt index 532df76..6840c7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.9) # Setup the Scine Project project(Serenity - VERSION 3.0.0 + VERSION 3.1.0 DESCRIPTION "SCINE Serenity Wrapper." ) diff --git a/README.rst b/README.rst index 4868d08..bfb13fa 100644 --- a/README.rst +++ b/README.rst @@ -87,6 +87,13 @@ When publishing results obtained with the SCINE Serenity wrapper, please cite th release as archived on `Zenodo `_ (DOI 10.5281/zenodo.6695038; please use the DOI of the respective release). +Furthermore, when publishing results obtained with any SCINE module, please cite the following paper: + +T. Weymuth, J. P. Unsleber, P. L. Türtscher, M. Steiner, J.-G. Sobez, C. H. Müller, M. Mörchen, +V. Klasovita, S. A. Grimmel, M. Eckhoff, K.-S. Csizi, F. Bosia, M. Bensberg, M. Reiher, +"SCINE—Software for chemical interaction networks", *J. Chem. Phys.*, **2024**, *160*, 222501 +(DOI `10.1063/5.0206974 `_). + This wrapper should also not be mistaken for the actual Serenity code it wraps. For the latter code and its citations, we refer you to the original Serenity repository. There you will find the references of the actual methods diff --git a/conanfile.py b/conanfile.py index 0ec9433..6e257b1 100644 --- a/conanfile.py +++ b/conanfile.py @@ -3,7 +3,7 @@ class ScineSerenityConan(ScineConan): name = "scine_serenity_wrapper" - version = "3.0.0" + version = "3.1.0" url = "https://github.com/qcscine/serenity_wrapper" description = """A wrapper around Serenity (https://github.com/qcserenity/serenity), it exports DFT, HF and other quantum chemistry capabilities into the SCINE tool @@ -29,5 +29,5 @@ class ScineSerenityConan(ScineConan): "dev/cmake/*", "src/*", "CMakeLists.txt", "README.rst", "LICENSE.txt", "dev/conan/hook.cmake", "dev/conan/glue/*" ] - requires = ["scine_utilities/9.0.0", "serenity/1.5.2"] + requires = ["scine_utilities/[=10.0.0]", "serenity/1.5.2"] cmake_name = "Serenity" diff --git a/dev b/dev index 518ab3c..2712fd3 160000 --- a/dev +++ b/dev @@ -1 +1 @@ -Subproject commit 518ab3c7f8a0a724081fcd7ed518c669724bcd37 +Subproject commit 2712fd3204d703c777244b077066ad75c6bc0db1 diff --git a/src/Serenity/CMakeLists.txt b/src/Serenity/CMakeLists.txt index b4ee7a2..7aca57a 100644 --- a/src/Serenity/CMakeLists.txt +++ b/src/Serenity/CMakeLists.txt @@ -58,7 +58,7 @@ if(SCINE_BUILD_PYTHON_BINDINGS) add_custom_command(TARGET Serenity POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_CURRENT_BINARY_DIR}/scine_serenity_wrapper - COMMENT "Copying 'serenity.module.so' to 'scine_serenity'" + COMMENT "Copying 'serenity.module.so' to 'scine_serenity_wrapper'" ) install(CODE @@ -68,13 +68,18 @@ if(SCINE_BUILD_PYTHON_BINDINGS) message(FATAL_ERROR \"Fatal error when installing Python module using PIP.\") endif()" ) - # Copy the setup file and README.rst into the binary dir so you can install + # Copy the setup file into the binary dir so you can install # using pip or make a distribution with the compiled binary file( COPY ${CMAKE_CURRENT_SOURCE_DIR}/Python/__init__.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/scine_serenity_wrapper ) + file( + COPY ${CMAKE_CURRENT_SOURCE_DIR}/Python/Tests + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/scine_serenity_wrapper + ) + # Figure out the location of serenity's data directory dependending on # whether serenity is imported or in-tree get_target_property(_serenity_imported serenity IMPORTED) diff --git a/src/Serenity/Python/Tests/__init__.py b/src/Serenity/Python/Tests/__init__.py new file mode 100644 index 0000000..0bd7b7a --- /dev/null +++ b/src/Serenity/Python/Tests/__init__.py @@ -0,0 +1,4 @@ +__copyright__ = """This code is licensed under the 3-clause BSD license. +Copyright ETH Zurich, Department of Chemistry and Applied Biosciences, Reiher Group. +See LICENSE.txt for details. +""" diff --git a/src/Serenity/Python/Tests/test_calculators.py b/src/Serenity/Python/Tests/test_calculators.py new file mode 100644 index 0000000..4c7a9a0 --- /dev/null +++ b/src/Serenity/Python/Tests/test_calculators.py @@ -0,0 +1,152 @@ +__copyright__ = """This code is licensed under the 3-clause BSD license. +Copyright ETH Zurich, Department of Chemistry and Applied Biosciences, Reiher Group. +See LICENSE.txt for details. +""" + +import pytest +import scine_utilities as utils + +def create_h2() -> utils.AtomCollection: + return utils.AtomCollection( + [utils.ElementType.H, utils.ElementType.H], + [[-0.7, 0.0, 0.0], [0.7, 0.0, 0.0]] + ) + +def test_dft_restricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'dft') + assert calculator.name() == 'SerenityDFTCalculator' + calculator.structure = h2 + calculator.settings['method'] = 'pbe-d3bj' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.166043) < 1e-6 + +def test_dft_restricted_other_properties() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'dft') + assert calculator.name() == 'SerenityDFTCalculator' + calculator.structure = h2 + calculator.settings['method'] = 'pbe-d3bj' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.AOtoAtomMapping, + utils.Property.AtomicCharges, + # utils.Property.OneElectronMatrix, + utils.Property.OverlapMatrix, + utils.Property.Thermochemistry, + utils.Property.Gradients]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy is not None + assert abs(results.energy - -1.166043) < 1e-6 + assert results.gradients is not None + assert results.ao_to_atom_mapping is not None + assert results.atomic_charges is not None + assert results.overlap_matrix is not None + # assert results.one_electron_matrix is not None + +# TODO This should be included again as soon as the serenity wrapper avoids running SCF calculations for everything. +# def test_dft_restricted_non_scf_properties() -> None: +# h2 = create_h2() +# module_manager = utils.core.ModuleManager.get_instance() +# calculator = module_manager.get('calculator', 'dft') +# assert calculator.name() == 'SerenityDFTCalculator' +# calculator.structure = h2 +# calculator.settings['method'] = 'pbe-d3bj' +# calculator.settings['basis_set'] = 'def2-tzvp' +# calculator.set_required_properties([utils.Property.AOtoAtomMapping, +# utils.Property.OneElectronMatrix, +# utils.Property.OverlapMatrix, +# ]) +# results = calculator.calculate() +# assert results.successful_calculation +# assert results.ao_to_atom_mapping is not None +# assert results.overlap_matrix is not None +# assert results.one_electron_matrix is not None +# assert results.energy is None + +def test_dft_unrestricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'dft') + assert calculator.name() == 'SerenityDFTCalculator' + calculator.structure = h2 + calculator.settings['spin_mode'] = 'unrestricted' + calculator.settings['method'] = 'pbe-d3bj' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.166043) < 1e-6 + +def test_hf_restricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'hf') + assert calculator.name() == 'SerenityHFCalculator' + calculator.structure = h2 + calculator.settings['method'] = 'hf' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.132535) < 1e-6 + +def test_hf_unrestricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'hf') + assert calculator.name() == 'SerenityHFCalculator' + calculator.structure = h2 + calculator.settings['spin_mode'] = 'unrestricted' + calculator.settings['method'] = 'hf' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.132535) < 1e-6 + +def test_ccsd_t_restricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'cc') + assert calculator.name() == 'SerenityCCCalculator' + calculator.structure = h2 + calculator.settings['method'] = 'ccsd(t)' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.168261) < 1e-6 + +def test_dlpno_ccsd_t0_restricted() -> None: + h2 = create_h2() + module_manager = utils.core.ModuleManager.get_instance() + calculator = module_manager.get('calculator', 'cc') + assert calculator.name() == 'SerenityCCCalculator' + calculator.structure = h2 + calculator.settings['method'] = 'dlpno-ccsd(t0)' + calculator.settings['basis_set'] = 'def2-tzvp' + calculator.set_required_properties([utils.Property.Energy]) + results = calculator.calculate() + assert results.successful_calculation + assert results.energy + assert abs(results.energy - -1.168311) < 1e-6 + +def run_all_tests() -> None: + test_dft_restricted() + test_dft_unrestricted() + test_dft_restricted_other_properties() + test_hf_restricted() + test_hf_unrestricted() + test_ccsd_t_restricted() + test_dlpno_ccsd_t0_restricted() \ No newline at end of file diff --git a/src/Serenity/Python/setup.py b/src/Serenity/Python/setup.py index 93ed6bd..f2867ac 100644 --- a/src/Serenity/Python/setup.py +++ b/src/Serenity/Python/setup.py @@ -16,7 +16,7 @@ def package_files(directory): return paths # Read README.rst for the long description -with open("README.rst", "r") as fh: +with open("README.rst", "r", encoding="utf-8") as fh: long_description = fh.read() @@ -37,7 +37,8 @@ def __len__(self): long_description=long_description, url="https://www.scine.ethz.ch", packages=["scine_serenity_wrapper"], - package_data={"scine_serenity_wrapper": ['*.txt' @serenity_PY_DEPS@]}, + include_package_data=True, + package_data={"scine_serenity_wrapper": ['*.txt' @serenity_PY_DEPS@, "Tests/*"]}, install_requires=["scine_utilities"], classifiers=[ "Programming Language :: Python", diff --git a/tests/test_calculators.py b/tests/test_calculators.py deleted file mode 100644 index 8ffe7d2..0000000 --- a/tests/test_calculators.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -__copyright__ = """ This code is licensed under the 3-clause BSD license. -Copyright ETH Zurich, Laboratory of Physical Chemistry, Reiher Group. -See LICENSE.txt for details. -""" - -import pytest -import scine_utilities as utils -import scine_serenity_wrapper - -def create_h2() -> utils.AtomCollection: - return utils.AtomCollection( - [utils.Elements.H, utils.Elements.H], - [[0.0, 0.0, 0.0], [0.7, 0.0, 0.0]] - ) - -def test_dft_restricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'dft') - assert calculator.name() == 'SerenityDFTCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'pbe-d3bj' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.166043) < 1e-6 - -def test_dft_unrestricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'dft') - assert calculator.name() == 'SerenityDFTCalculator' - calculator.structure = h2 - calculator.settings['spin_mode'] = 'unrestricted' - calculator.settings['method'] = 'pbe-d3bj' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.166043) < 1e-6 - self.output.info("U-KS-DFT worked") - -def test_hf_restricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'hf') - assert calculator.name() == 'SerenityHFCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'hf' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.132535) < 1e-6 - -def test_hf_unrestricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'hf') - assert calculator.name() == 'SerenityHFCalculator' - calculator.structure = h2 - calculator.settings['spin_mode'] = 'unrestricted' - calculator.settings['method'] = 'hf' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.132535) < 1e-6 - -def test_ccsd_t_restricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'cc') - assert calculator.name() == 'SerenityCCCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'ccsd(t)' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.168261) < 1e-6 - -def test_dlpno_ccsd_t0_restricted() -> None: - h2 = create_h2() - module_manager = utils.core.ModuleManager.get_instance() - calculator = module_manager.get('calculator', 'cc') - assert calculator.name() == 'SerenityCCCalculator' - calculator.structure = h2 - calculator.settings['method'] = 'dlpno-ccsd(t0)' - calculator.settings['basis_set'] = 'def2-tzvp' - results = calculator.calculate() - assert results.successful_calculation - assert abs(results.energy - -1.168311) < 1e-6 -