Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

running Madness with QCengine #242

Open
wants to merge 126 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
8e34efc
Merge pull request #6 from ahurta92/adrian-Dipole
ahurta92 Jan 30, 2020
00de251
Formating and added preceding 0
ahurta92 Jan 30, 2020
e5f3c63
Merge branch 'master' of https://github.com/ahurta92/QCEngine
ahurta92 Mar 19, 2020
ab8ec4c
Merge remote-tracking branch 'upstream/master'
ahurta92 Apr 21, 2020
f59dbc9
add madness dir
ahurta92 Apr 23, 2020
f368814
init madness dir
ahurta92 Apr 23, 2020
8d7ac78
changin base and test to add madness
ahurta92 Apr 23, 2020
eb0bc38
Add madnessHarness to qca
ahurta92 Apr 23, 2020
e695d7d
first attempt at get_version
ahurta92 Apr 23, 2020
fb3570a
Got a version of get_version that may work
ahurta92 Apr 24, 2020
7d6a24a
simple build_input
ahurta92 Apr 24, 2020
b83169e
simple execuate function
ahurta92 Apr 25, 2020
3a00543
add madness pytest dft w/ xc hf
ahurta92 Apr 25, 2020
61cfa4a
updating
ahurta92 Apr 26, 2020
4a05965
got variables for scf calculation
ahurta92 Apr 27, 2020
82352ff
add gopts method to germinate
ahurta92 Apr 27, 2020
18b721a
added h20MAD for debuggin I think I can get rid of this
ahurta92 Apr 27, 2020
43ec24a
pytest passed madness with h20()
ahurta92 Apr 27, 2020
0e7668c
split output by Converged! STILL Need to read format stuff
ahurta92 Apr 27, 2020
98e0f4c
wrote compute, fix mol.keywords, wrote parse_output
ahurta92 Apr 27, 2020
70b0c15
make format
ahurta92 Apr 28, 2020
61bbf8e
alphabetize
ahurta92 May 4, 2020
2c28fb6
which madness and use helium for command
ahurta92 May 4, 2020
b9d24a2
add scratch_directory to input for execute
ahurta92 May 4, 2020
b1b05fc
the quadrupole work should have been in a different branch
ahurta92 May 4, 2020
2e6c2fc
added k=7 to keywords of test. k=7 is a default but its okay to define
ahurta92 May 4, 2020
7c4f2d8
limit to collecting qc vars in results.py
ahurta92 May 4, 2020
0312265
return scf_exchange_correlation
ahurta92 May 4, 2020
4eb4a75
Add none
ahurta92 May 4, 2020
8e73a4f
make format
ahurta92 May 4, 2020
379c96f
move madness test into separate file
ahurta92 May 5, 2020
dfe6afd
got rid of stuff from nwchem
ahurta92 May 6, 2020
5829ad4
format
ahurta92 May 6, 2020
d6a83d6
add madness dir
ahurta92 Apr 23, 2020
f16796d
init madness dir
ahurta92 Apr 23, 2020
bfa4c55
changin base and test to add madness
ahurta92 Apr 23, 2020
4c306e8
Add madnessHarness to qca
ahurta92 Apr 23, 2020
739c5b5
first attempt at get_version
ahurta92 Apr 23, 2020
e2d83be
Got a version of get_version that may work
ahurta92 Apr 24, 2020
9d4c5f0
simple build_input
ahurta92 Apr 24, 2020
103c031
simple execuate function
ahurta92 Apr 25, 2020
e9d8f3c
add madness pytest dft w/ xc hf
ahurta92 Apr 25, 2020
1373f71
updating
ahurta92 Apr 26, 2020
0cba478
got variables for scf calculation
ahurta92 Apr 27, 2020
8b20a74
add gopts method to germinate
ahurta92 Apr 27, 2020
41e0149
added h20MAD for debuggin I think I can get rid of this
ahurta92 Apr 27, 2020
0574ffe
pytest passed madness with h20()
ahurta92 Apr 27, 2020
56ffcf5
split output by Converged! STILL Need to read format stuff
ahurta92 Apr 27, 2020
b6c21cb
wrote compute, fix mol.keywords, wrote parse_output
ahurta92 Apr 27, 2020
8b93e47
make format
ahurta92 Apr 28, 2020
9d8c950
alphabetize
ahurta92 May 4, 2020
f5bb2d8
which madness and use helium for command
ahurta92 May 4, 2020
acc9bda
add scratch_directory to input for execute
ahurta92 May 4, 2020
98f59be
the quadrupole work should have been in a different branch
ahurta92 May 4, 2020
38aa762
added k=7 to keywords of test. k=7 is a default but its okay to define
ahurta92 May 4, 2020
19f002e
limit to collecting qc vars in results.py
ahurta92 May 4, 2020
eb21253
return scf_exchange_correlation
ahurta92 May 4, 2020
32fce65
Add none
ahurta92 May 4, 2020
eabe89d
make format
ahurta92 May 4, 2020
f18a0de
move madness test into separate file
ahurta92 May 5, 2020
f4f89f9
got rid of stuff from nwchem
ahurta92 May 6, 2020
a30be69
format
ahurta92 May 6, 2020
19baac9
Merge branch 'MADNESS' of https://github.com/ahurta92/QCEngine into M…
ahurta92 May 11, 2020
1d33d2b
get rid of extra arguments
ahurta92 May 11, 2020
4a316f2
Merge branch 'master' into MADNESS
ahurta92 May 12, 2020
20be271
make format
ahurta92 May 12, 2020
0357d40
remove some imports and format
ahurta92 May 18, 2020
5df4552
Merge branch 'master' of https://github.com/MolSSI/QCEngine into MADNESS
ahurta92 Jun 24, 2020
82d110b
add @using("madness") to madness test
ahurta92 Jun 25, 2020
100656e
qca looks for moldft executable for scf calculations
ahurta92 Jun 28, 2020
a7d86eb
debugging madness harvester...split by "Converged!"
ahurta92 Jun 28, 2020
5a10bf5
trying to debug harvester...Converged!
ahurta92 Jun 28, 2020
e937e62
using moldft executable...it's easier for now
ahurta92 Jun 28, 2020
c632313
change test values to reflect changes in master madness
ahurta92 Jun 28, 2020
6eb6491
Merge branch 'MADNESS' of https://github.com/ahurta92/QCEngine into M…
ahurta92 Jun 28, 2020
afd940b
Getting rid of debugging print statemtments
ahurta92 Jun 28, 2020
b87a7a8
Merge branch 'master' of https://github.com/MolSSI/QCEngine into MADNESS
ahurta92 Aug 17, 2020
72e3ec5
Merge pull request #7 from MolSSI/master
ahurta92 Aug 17, 2020
af74ce2
Merge branch 'MADNESS' into master
ahurta92 Aug 17, 2020
f8b64bf
Merge pull request #8 from ahurta92/master
ahurta92 Aug 17, 2020
00a4974
Merge branch 'MADNESS' of https://github.com/ahurta92/QCEngine into M…
ahurta92 Aug 17, 2020
f8e70ca
formatting
ahurta92 Aug 17, 2020
f250cff
comments- don't use mpi command as default
ahurta92 Aug 18, 2020
53fc940
add lda to list of functionals
ahurta92 Aug 18, 2020
cc9c9b4
Merge branch 'master' of https://github.com/MolSSI/QCEngine into MADNESS
ahurta92 Jun 9, 2021
09f55e3
Merge branch 'master' of github.com:MolSSI/QCEngine
ahurta92 Sep 29, 2021
5243a46
Merge branch 'master' of https://github.com/MolSSI/QCEngine
ahurta92 Nov 17, 2021
69c3cd0
black formatting
ahurta92 Nov 17, 2021
c073146
Merge branch 'master' of https://github.com/MolSSI/QCEngine
ahurta92 Jan 4, 2022
8479cf8
Get runner.py to read moldft using new format
ahurta92 Jan 5, 2022
4699aa1
read new moldft output
ahurta92 Jan 5, 2022
1ebe945
Set up initial molresponse runner.
ahurta92 Jan 8, 2022
9085d52
Run black
ahurta92 Jan 8, 2022
835920b
Add initial molresponse test
ahurta92 Jan 8, 2022
e85db37
Add initial molresponse runner and test
ahurta92 Jan 11, 2022
7e74828
black formatting
ahurta92 Jan 11, 2022
240f48f
harvest using the new scf_info and calcinfo json files
ahurta92 Jan 18, 2022
3a35cc9
build input can now deal with geomtry related keywords like "eprec"
ahurta92 Jan 18, 2022
924ffb1
Update germinate.py
ahurta92 Feb 11, 2022
16b0182
We now use json files to read output
ahurta92 Feb 11, 2022
921ad3d
Merge master into MADNESS branch
ahurta92 Feb 11, 2022
a980001
formatting
ahurta92 Feb 11, 2022
59acb7e
Merge remote-tracking branch 'upstream/master' into MADNESS
ahurta92 Feb 11, 2022
508cabe
Merge remote-tracking branch 'upstream/master' into MADNESS
ahurta92 Jun 15, 2022
f89847c
some additions
ahurta92 Jun 15, 2022
4e6e977
Merge branch 'MolSSI:master' into master
ahurta92 Jun 24, 2022
ea814e5
formatting
ahurta92 Jun 24, 2022
5e5c8c5
Merge pull request #9 from ahurta92/master
ahurta92 Jun 24, 2022
68a9193
fix the geometry input for get_version function
ahurta92 Jun 27, 2022
4c74677
remove reading scf_info.json
ahurta92 Jun 28, 2022
3feaf7e
first attempt at saving calc_info.json into "native_files"
ahurta92 Jun 28, 2022
2a70856
save calc_info.json in results.extras[outfiles][calcinfo.json]
ahurta92 Jun 28, 2022
839fb03
remove native_files line
ahurta92 Jun 28, 2022
cc192ef
Merge remote-tracking branch 'upstream/master' into MADNESS
ahurta92 Jun 29, 2022
54b09b4
save calc_info json as dictionary into extras
ahurta92 Jul 13, 2022
3db2391
black
ahurta92 Jul 13, 2022
c04a005
save calc json and input in native files
ahurta92 Jul 14, 2022
b1b23b0
Merge remote-tracking branch 'upstream/master'
ahurta92 Jul 14, 2022
170d422
Merge
ahurta92 Feb 29, 2024
cc86262
typo
ahurta92 Mar 6, 2024
48bffb7
MADNESS runs
ahurta92 Mar 6, 2024
d14841b
Ran black....was this a mistake?
ahurta92 Mar 6, 2024
a1c1b96
Starting new implementation for multiple executables
ahurta92 Mar 27, 2024
fd9fb82
A running implementation that can run both moldft and molresponse
ahurta92 Apr 8, 2024
3de261b
format
ahurta92 Apr 8, 2024
cbe29d9
Add some test lines
ahurta92 Apr 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions qcengine/programs/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from .mopac import MopacHarness
from .mp2d import MP2DHarness
from .nwchem import NWChemHarness
from .madness import MadnessHarness
from .openmm import OpenMMHarness
from .psi4 import Psi4Harness
from .qchem import QChemHarness
Expand Down Expand Up @@ -101,6 +102,7 @@ def list_available_programs() -> Set[str]:
register_program(GAMESSHarness())
register_program(MolproHarness())
register_program(NWChemHarness())
register_program(MadnessHarness())
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alphabetize

register_program(Psi4Harness())
register_program(QChemHarness())
register_program(TeraChemHarness())
Expand Down
1 change: 1 addition & 0 deletions qcengine/programs/madness/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .runner import MadnessHarness
131 changes: 131 additions & 0 deletions qcengine/programs/madness/germinate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
from typing import Any, Dict, Tuple

Check notice

Code scanning / CodeQL

Unused import Note

Import of 'Tuple' is not used.

from qcengine.exceptions import InputError

# List of XC functionals known to NWChem
_xc_functionals = [
"hf",
"acm",
"b3lyp",
"beckehandh",
"pbe0",
"becke97",
"becke97-1",
"becke97-2",
"becke97-3",
"becke97-d",
"becke98",
"hcth",
"hcth120",
"hcth147",
"hcth407",
"becke97gga1",
"hcth407p",
"mpw91",
"mpw1k",
"xft97",
"cft97",
"ft97",
"op",
"bop",
"pbeop",
"xpkzb99",
"cpkzb99",
"xtpss03",
"ctpss03",
"xctpssh",
"b1b95",
"bb1k",
"mpw1b95",
"mpwb1k",
"pw6b95",
"pwb6k",
"m05",
"m05-2x",
"vs98",
"m06",
"m06-hf",
"m06-L",
"m06-2x",
"HFexch",
"becke88",
"xperdew91",
"xpbe96",
"gill96",
"lyp",
"perdew81",
"perdew86",
"perdew91",
"cpbe96",
"pw91lda",
"slater",
"vwn_1",
"vwn_2",
"vwn_3",
"vwn_4",
"vwn_5",
"vwn_1_rpa",
"xtpss03",
"ctpss03",
"bc95",
"xpw6b95",
"xpwb6k",
"xm05",
"xm05-2x",
"cpw6b95",
"cpwb6k",
"cm05",
"cm05-2x",
"xvs98",
"cvs98",
"xm06-L",
"xm06-hf",
"xm06",
"xm06-2x",
"cm06-L",
"cm06-hf",
"cm06",
"cm06-2x",
]


def muster_modelchem(method: str, derint: int, use_tce: bool) -> Tuple[str, Dict[str, Any]]:
"""Converts the QC method into NWChem keywords

Args:
method (str): Name of the QC method to use
derint (str): Index of the run type
use_tce (bool): Whether to use the Tensor Contraction Engine
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Be good to comment out everything that's just a copy from nwchem and hasn't been validated for madness, like the fctl list above, tce here, and presumably Hessian harvesting below.

Returns:
(str): Task command for NWChem
(dict): Any options for NWChem
"""

# Standardize the method name
method = method.lower()
opts = {}

# Map the run type to
# runtyp = {"energy": "energy", "gradient": "gradient", "hessian": "hessian", "properties": "property"}[derint]
# runtyp = {"energy": "energy", "optimization": "gopt", "hessian": "hessian", "properties": "property"}[derint]

# Write out the theory directive

mdccmd = f"" ## we don't need this right now
## in the future when we link other exec this will change
## all we have to do is add options to the dft block in order to change the run type
## default in energy
# do nothing
if method == "optimization":
opts["dft__gopt"] = True
elif method == "response":
opts["dft__response"] = True
elif method.split()[0] in _xc_functionals:
opts["dft__xc"] = method
else:
raise InputError(f"Method not recognized: {method}")

return mdccmd, opts
Fixed Show fixed Hide fixed


# # # #
222 changes: 222 additions & 0 deletions qcengine/programs/madness/harvester.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
import re
import json
import logging
from decimal import Decimal
from typing import Tuple

import numpy as np
import qcelemental as qcel
from qcelemental.models import Molecule
from qcelemental.models.results import AtomicResultProperties
from qcelemental.molparse import regex

from ..util import PreservingDict

logger = logging.getLogger(__name__)


def harvest_output(outtext: str) -> Tuple[PreservingDict, Molecule, list, str, str]:
"""Function to read an entire MADNESS output file.

Reads all of the different "line search" segments of a file and returns
values from the last segment for which a geometry was written.

Args:
outtext (str): Output written to stdout
Returns:
- (PreservingDict) Variables extracted from the output file in the last complete step
- (Molecule): Molecule from the last complete step
- (list): Gradient from the last complete step
- (str): Version string
- (str): Error message, if any
"""

# Loop over all steps
# TODO (wardlt): Is it only necessary to read the last two steps?
pass_psivar = []

Check notice

Code scanning / CodeQL

Unused local variable Note

Variable pass_psivar is not used.
pass_coord = []

Check notice

Code scanning / CodeQL

Unused local variable Note

Variable pass_coord is not used.
pass_grad = []

Check notice

Code scanning / CodeQL

Unused local variable Note

Variable pass_grad is not used.
for outpass in re.split(r"Converged!", outtext, re.MULTILINE):
psivar, madcoord, madgrad, version, error = harvest_outfile_pass(outpass)
pass_psivar.append(psivar)## all the variables extracted
pass_coord.append(madcoord)
pass_grad.append(madgrad)

# Determine which segment contained the last geometry
retindx = -1 #if pass_coord[-1] else -2
return pass_psivar[retindx], pass_coord[retindx], pass_grad[retindx], version, error


def harvest_outfile_pass(outtext):
"""Function to read Madness output file *outtext* and parse important
quantum chemical information from it in

"""
psivar = PreservingDict()
psivar_coord = None
psivar_grad = None
version = ""
error = "" # TODO (wardlt): The error string is never used.

NUMBER = r"(?x:" + regex.NUMBER + ")"
# fmt: off
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just fixed this in nwchem. it's better to have fmt: off/on multiple times within regexes rather than suppressing it for a whole file.


# Process version
mobj = re.search(
r'^\s+' + r'MADNESS' + r'\s+' + r'(\d+.\d\d+.\d)' +r'\s'+ r'multiresolution suite'+r'\s*$',
outtext, re.MULTILINE)
if mobj:
logger.debug('matched version')
version = mobj.group(1)

# Process SCF
# 1)Fail to converge (TODO Robert ask for failed convergence)
mobj = re.search(r'^\s+' + r'(?:Calculation failed to converge)' + r'\s*$', outtext, re.MULTILINE)
if mobj:
logger.debug('failed to converge')

# 2)Calculation converged
else:
OPTIONS=[r'kinetic',r'nonlocal psp',r'nuclear attraction',r'coulomb',r'PCM',r'exchange-correlation',r'nuclear-repulsion',r'total']
PSIVAR=['KINETIC ENERGY','NONLOCAL PSP','NUCLEAR ATTRACTION ENERGY','COULOMB','PCM','EXCHANGE-CORRELATION','NUCLEAR REPULSION ENERGY','TOTAL SCF ENERGY']
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe collect into AtomicResultProperties directly, since those names will get validated. these aren't "official" psivars/qcvars (but the code that checks names isn't in qcengine).

optDict=dict(zip(OPTIONS,PSIVAR))

for var,VAR in optDict.items():
mobj = re.search(r'^\s+' + var + r'\s*' + NUMBER + r's*$', outtext, re.MULTILINE)
if mobj:
logger.debug('matched SCF')## not sure what this means
psivar[VAR] = mobj.group(1)
# Other options


# Process CURRENT energies (TODO: needs better way)
if "TOTAL SCF ENERGY" in psivar:
psivar["CURRENT REFERENCE ENERGY"] = psivar["TOTAL SCF ENERGY"]
psivar["CURRENT ENERGY"] = psivar["TOTAL SCF ENERGY"]


return psivar, psivar_coord, psivar_grad, version, error


def harvest_hessian(hess: str) -> np.ndarray: pass
# """Parses the contents of the NWChem hess file into a hessian array.

# Args:
# hess (str): Contents of the hess file
# Returns:
# (np.ndarray) Hessian matrix as a 2D array
# """

# Change the "D[+-]" notation of Fortran output to "E[+-]" used by Python
# hess_conv = hess.replace("D", "E")

# # Parse all of the float values
# hess_tri = [float(x) for x in hess_conv.strip().splitlines()]

# # The value in the Hessian matrix is the lower triangle printed row-wise (e.g., 0,0 -> 1,0 -> 1,1 -> ...)
# n = int(np.sqrt(8 * len(hess_tri) + 1) - 1) // 2 # Size of the 2D matrix

# # Add the lower diagonal
# hess_arr = np.zeros((n, n))
# hess_arr[np.tril_indices(n)] = hess_tri

# # Transpose and then set the lower diagonal again
# hess_arr = np.transpose(hess_arr) # Numpy implementations might only change the ordering to column-major
# hess_arr[np.tril_indices(n)] = hess_tri

# return hess_arr.T # So that the array is listed in C-order, needed by some alignment routines


def extract_formatted_properties(psivars: PreservingDict) -> AtomicResultProperties:
"""Get named properties out of the general variables extracted out of the result file

Args:
psivars (PreservingDict): Dictionary of the output results
Returns:
(AtomicResultProperties) Properties in a standard format
"""
# TODO (wardlt): Get more of the named variables out of the NWChem file

# Initialize the output
output = dict()

# Extract the Calc Info
output.update(
{
"calcinfo_nbasis": psivars.get("N BASIS", None), ## Not a thing in madness
"calcinfo_nmo": psivars.get("N MO", None), ## Number of Mo orbitals
"calcinfo_natom": psivars.get("N ATOMS", None), ## Get madness to print this out
"calcinfo_nalpha": psivars.get("N ALPHA ELECTRONS", None), ## TODO (figure out how to read)
"calcinfo_nbeta": psivars.get("N BETA ELECTRONS", None),
}
)

# Get the "canonical" properties
output["return_energy"] = psivars["CURRENT ENERGY"]
output["nuclear_repulsion_energy"] = psivars["NUCLEAR REPULSION ENERGY"]

# Get the SCF properties
output["scf_total_energy"] = psivars.get("TOTAL SCF ENERGY", None)
#output["scf_one_electron_energy"] = psivars.get("ONE-ELECTRON ENERGY", None)
#output["scf_two_electron_energy"] = psivars.get("TWO-ELECTRON ENERGY", None)
#output["scf_dispersion_correction_energy"] = psivars.get("DFT DISPERSION ENERGY", None)

return AtomicResultProperties(**output)


def harvest(in_mol: Molecule, madout: str, **outfiles) -> Tuple[PreservingDict, None, None, Molecule, str, str]:
"""Parses all the pieces of output from NWChem: the stdout in
*nwout* Scratch files are not yet considered at this moment.

Args:
in_mol (Molecule): Input molecule
madout (str): Madness output molecule
outfiles (dict): Dictionary of outfile files and their contents
Returns:
- (PreservingDict) Variables extracted from the output file in the last complete step
- (None): Hessian from the last complete step (Not yet implemented)
- (None): Gradient from the last complete step (Not yet implemented)
- (Molecule): Molecule from the last complete step
- (str): Version string
- (str): Error message, if any
"""

# Parse the Madness output
out_psivar, out_mol, out_grad, version, error = harvest_output(madout)


# If available, read higher-accuracy gradients
# These were output using a Python Task in NWChem to read them out of the database
if outfiles.get("mad.grad") is not None:
logger.debug("Reading higher-accuracy gradients")
out_grad = json.loads(outfiles.get("mad.grad"))

# If available, read the hessian
out_hess = None
if outfiles.get("mad.hess") is not None:
out_hess = harvest_hessian(outfiles.get("mad.hess"))

# Make sure the input and output molecules are the same
if out_mol:
if in_mol:
if abs(out_mol.nuclear_repulsion_energy() - in_mol.nuclear_repulsion_energy()) > 1.0e-3:
raise ValueError(
"""Madness outfile (NRE: %f) inconsistent with Psi4 input (NRE: %f)."""
% (out_mol.nuclear_repulsion_energy(), in_mol.nuclear_repulsion_energy())
)
#else:
# raise ValueError("""No coordinate information extracted from Madness output.""")

# If present, align the gradients and hessian with the original molecular coordinates
# Madness rotates the coordinates of the input molecule. `out_mol` contains the coordinates for the
# rotated molecule, which we can use to determine how to rotate the gradients/hessian
#amol, data = out_mol.align(in_mol, atoms_map=False, mols_align=True, verbose=0)

# mill = data["mill"] # Retrieve tool with alignment routines

if out_grad is not None:
out_grad = mill.align_gradient(np.array(out_grad).reshape(-1, 3))
if out_hess is not None:
out_hess = mill.align_hessian(np.array(out_hess))

return out_psivar, out_hess, out_grad, out_mol, version, error
Loading