From bcec1072dae6c97b06b70cca6c5bb273c932d104 Mon Sep 17 00:00:00 2001 From: Lester Hedges Date: Mon, 22 Apr 2024 10:04:55 +0100 Subject: [PATCH] Add support for using no backend. --- bin/emle-server | 4 ++++ emle/calculator.py | 44 ++++++++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/bin/emle-server b/bin/emle-server index c71464e..652ca74 100755 --- a/bin/emle-server +++ b/bin/emle-server @@ -558,6 +558,10 @@ if args["log_file"] is None: if args["save_settings"] is None: args["save_settings"] = True +# Use the default backend if no backend is specified. +if args["backend"] is None: + args["backend"] = "torchani" + # Use the default backend if no external backend is specified. if args["external_backend"] is None: if args["backend"] is None: diff --git a/emle/calculator.py b/emle/calculator.py index c6a8a5a..83526b7 100644 --- a/emle/calculator.py +++ b/emle/calculator.py @@ -418,7 +418,9 @@ def __init__( region. backend: str - The backend to use to compute in vacuo energies and gradients. + The backend to use to compute in vacuo energies and gradients. If None, + then no backend will be used, allowing you to obtain the electrostatic + embedding energy and gradients only. external_backend: str The name of an external backend to use to compute in vacuo energies. @@ -640,19 +642,17 @@ def __init__( _logger.error(msg) raise IOError(msg) - if backend is None: - backend = "torchani" - - if not isinstance(backend, str): - msg = "'backend' must be of type 'str'" - _logger.error(msg) - raise TypeError(msg) - # Strip whitespace and convert to lower case. - backend = backend.lower().replace(" ", "") - if not backend in self._supported_backends: - msg = f"Unsupported backend '{backend}'. Options are: {', '.join(self._supported_backends)}" - _logger.error(msg) - raise ValueError(msg) + if backend is not None: + if not isinstance(backend, str): + msg = "'backend' must be of type 'str'" + _logger.error(msg) + raise TypeError(msg) + # Strip whitespace and convert to lower case. + backend = backend.lower().replace(" ", "") + if not backend in self._supported_backends: + msg = f"Unsupported backend '{backend}'. Options are: {', '.join(self._supported_backends)}" + _logger.error(msg) + raise ValueError(msg) self._backend = backend if external_backend is not None: @@ -1316,7 +1316,7 @@ def run(self, path=None): raise RuntimeError(msg) # DeePMD. - if self._backend == "deepmd": + elif self._backend == "deepmd": try: E_vac, grad_vac = self._run_deepmd(xyz_qm, elements) except Exception as e: @@ -1368,6 +1368,10 @@ def run(self, path=None): _logger.error(msg) raise RuntimeError(msg) + # No backend. + else: + E_vac, grad_vac = 0.0, _np.zeros_like(xyz_qm) + # External backend. else: try: @@ -1380,7 +1384,7 @@ def run(self, path=None): raise RuntimeError(msg) # Apply delta-learning corrections using Rascal. - if self._is_delta: + if self._is_delta and self._backend is not None: try: delta_E, delta_grad = self._run_rascal(atoms) except Exception as e: @@ -1700,7 +1704,7 @@ def _sire_callback(self, atomic_numbers, charges_mm, xyz_qm, xyz_mm): raise RuntimeError(msg) # DeePMD. - if self._backend == "deepmd": + elif self._backend == "deepmd": try: E_vac, grad_vac = self._run_deepmd(xyz_qm, elements) except Exception as e: @@ -1754,6 +1758,10 @@ def _sire_callback(self, atomic_numbers, charges_mm, xyz_qm, xyz_mm): _logger.error(msg) raise RuntimeError(msg) + # No backend. + else: + E_vac, grad_vac = 0.0, _np.zeros_like(xyz_qm) + # External backend. else: try: @@ -1767,7 +1775,7 @@ def _sire_callback(self, atomic_numbers, charges_mm, xyz_qm, xyz_mm): raise RuntimeError(msg) # Apply delta-learning corrections using Rascal. - if self._is_delta: + if self._is_delta and self._backend is not None: try: if atoms is None: atoms = _ase.Atoms(positions=xyz_qm, numbers=atomic_numbers)