- Improved constrained optimisation (
CRFOptimiser
) and handling of multiple constraints - Adds compatability with numpy v2.0
- Improved implementation of the RFO-TRM (
QAOptimiser
) optimiser that can handle constraints - Added static internal back-transform and damping for faster and easier DIC to Cartesian coordinate transformation
- DIC to Cartesian transform will now always use
PIC.close_to()
to ensure steps along dihedral have the smallest change, even after back-transform is complete
- Optimiser convergence criteria have been improved to consider energy change, RMS and max. gradient and step sizes.
- DHS and DHS-GS can now switch between two step sizes
- Peak detection in bracket methods now uses cubic polynomial fit with energies and gradients instead of only projecting gradients
- Fixes no solvent being added in QRC calculations
- Fixes cases where .xyz files are printed with no space between coordinates when the coordinate value is large.
- Fixes DHS and DHS-GS methods ignoring number of cores
- Added consistent aliases for double dagger across all energies in
autode.reaction.delta
- Optimiser trajectories are saved on disk instead of keeping completely in memory
- Hessian updates the refactored into
OptCoordinates
class
- Replaces hard-coded derivatives for primitive internal coordinates with automatic differentiation
- More comprehensive primitive internal coordinate generation
- Adds the capacity to handle linear molecules in internal coordinate system
- Fixes triangular rings being incorrectly treated as dihedral angles
- Faster import of autode package by lazily loading matplotlib
- ORCA output files copied after a calculation are configurable
- Adds the thermochemistry method from A. Otlyotov, Y. Minenkov in https://doi.org/10.1002/jcc.27129
- Adds the improved Elastic Image Pair (i-EIP) method for double-ended transition state search
- Adds a
autode.Species.solvent_name
property and setter for setting solvents from a string - Enables reloading molecules from xyz files with their previously defined charge/multiplicity/solvent
- Fixes Hessian extraction in some G16 output files
- Fixes large step sizes in DHSGS
- Fixes the ability to define both a SMILES string and a xyz file without raising an exception
- Adds
temporary_config()
context manager for temporary configuration changes - Adds a
ForceConstant
value - Adds a more robust hybrid RFO-TRM geometry optimiser with trust radius update and a feature to detect oscillation and damp it
- Adds Dewar-Healy-Stewart (DHS) method and its variant DHS-GS to find transition states from initial and final geometries
- Adds full usability of autodE on Windows, including parallelisation with
loky
- Optional timeout for graph isomorphism test in Windows, turned on by
Config.use_experimental_timeout=True
(default behaviour kept for Linux/macOS) - The electronic temperature and the version of parameterisation for xTB calculations are made configurable
- A NEB
Image
now derives from aSpecies
superclass - Modifies NEB
Image
constructor to be formed from an image - Defines named constructors (
from_end_points(...)
,from_list(...)
) forNEB
- Removes
NEB().contains_peak()
in favour ofNEB().images.contains_peak
- Modifies the
CImages
constructor to ensure it's constructed from anImages
instance - Removes
NEB.get_species_saddle_point()
in favour ofNEB.peak_species
- Defines named constructors (
from_end_points(...)
,from_list(...)
) forNEB
- Removes
mol_graphs.get_atom_ids_sorted_type()
- Fixes pickling issue with
autode.config.Config
on Windows and in multiprocessing spawn for Linux/macOS - Fixes RFO Hessian update bug
- Fixes QChem not using
Config.max_core
autode.value.ValueArray.to()
now defaults to copying the object rather than inplace modification
- Adds a
to_
method toautode.value.ValueArray
for explicit inplace modification of the array
- Fixes
ERROR
logging level being ignored from environment variableAUTODE_LOG_LEVEL
- Fixes
autode.values.Value
instances generating items with units on division, and throw a warning if multiplying - Fixes the printing of cartesian constraints in XTB input files, meaning they are no longer ignored
- Fixes
Hessian
instances changing units when normal modes are calculated - Fixes an incorrect alias for
ev_per_ang
Feature additions.
- Throw useful exception for invalid
ade.Config.ts_template_folder_path
- Adds
ade.transition_states.TransitionState.from_species
method to construct transition states from a species or molecule - Adds
autode.Reaction.save()
andautode.Reaction.load()
to save and reload a reaction state - Adds saving checkpoints of a reaction during
autode.Reaction.calculate_reaction_profile
- Fixes calculation
clean_up()
failing with a null filename
Bugfix release.
- Adds skipping Hessian re-evaluation when using autodE optimisers if a molecules has a Hessian calculated at the same level of theory
- Adds a Hessian recalculation frequency to
autode.optimisers.PRFOptimiser
- Improves the default step size for TS optimising to be consistent with the ORCA default
- Adds checking of SMILES-defined charge against the user-specified value
- Fixes
autode.optimisers.CRFOptimiser
building incomplete internal coordinates for partially or completely fragmented molecules
Bugfix release.
- Removes
autode.geom.get_distance_constraints
in favour of a better named methodTSBase().active_bond_constraints
autode.transition_states.ts_guess.TSguess.from_species
now inherits solvent from the species- Fixes a possible race condition in I/O for XTB conformer optimisations
Bugfix release.
- Fixes behaviour of
autode.utils.work_in_tmp_dir
andautode.utils.work_in
decorators - Fixes an exception being raised when
autode.Calculation.clean_up
is called with a method that doesn't implement external I/O - Fixes autodE driven optimisations skipping execution when the input but not name changes
Optimisation features, graph assignment improvements and bugfixes.
- Defines dummy atoms to have zero covalent and vdW radii
- Renames
Method().available
toMethod().is_available
- Removes
autode.bonds.get_ideal_bond_length_matrix
andautode.bonds.get_avg_bond_length
- Removes
autode.geom.rotate_columns
- Modifies the names of most optimiser classes e.g.
autode.opt.optimisers.PRFOOptimiser
->PRFOptimiser
- Simplifies initialising a
autode.calculations.Calculation
by:- Requiring constraints to be attributed to a molecule
- Removing the
bond_ids_to_add
argument and using the labeled graph instead (active edges) - Removing the
other_input_block
argument and appending to the keywords instead
- Removes
autode.calculations.Calculation.print_final_output_lines
in favour of a method oncalculation.output
- Makes many methods in
autode.calculations.Calculation
private - Deprecates all
autode.calculations.Calculation.get_<method>
methods in favour of setting properties of the input molecule - Returns
None
rather than rasies exceptions when calling the (deprecated) calculation get methods, to be consistent with ...get_energy - Adds an
autode.wrappers.keywords
package to improve file structure - Removes any exceptions on calling
.run()
on an optimiser instance where the system has no degrees of freedom - Removes support for Python < v3.8
- Tweaks the default ORCA TS optimisation keywords to be more conservative, i.e. slower and more accurate
- Adds a
autode.atoms.Atom.covalent_radius
property - Adds a
autode.atoms.Atoms.eqm_bond_distance
method for the equilibrium bonded distance between two atoms - Adds vibrational frequency scaling through both
autode.Config.freq_scale_factor
and a default value in wrapped functional keywords - Adds a much more robust constrained rational function constrained optimiser in delocalised internal coordinates (DIC)
- Adds bond angle and dihedral primitive coordinates which can form part of the DIC set
- Improves the back transformation
- Adds an optional callback argument to
autode.opt.optimisers.base.Optimiser
for running custom functions after every optimisation step - Adds the ability to save/reload an
autode.opt.optimisers.NDOptimiser
instance to/from a file - Adds a solvent attribute to a
autode.transition_states.transition_state.TransitionState
constructor - Adds functionality to partition a nudged elastic band into images where the maximum atom-atom distance between images is below a threshold
- Adds a sequential adapt+NEB TS finding method where a pure adapt. path fails to generate a geometry close enough to the TS for a successful TS optimisation
- Fixes variable harmonic frequencies (<2 cm-1 differences) due to projection vectors becoming close to rotational axes
- Fixes the extraction of atomic partial charges from ORCA output files
- Fixes gradients and Hessians not being reset on a molecule where the coordinates change
- Fixes unhelpful exception when calculating thermochemistry with EST methods without implemented "get_hessian" methods
See the table below for a quick benchmark of constrained optimisations in autodE compared to ORCA. In all cases the structures were generated from SMILES strings (RDKit) and optimised with a single constraint on the (0,1) distance of +0.1 Å from its current value.
Molecule | autodE | ORCA |
---|---|---|
C7H12 | 6 | 7 |
C3H7 | 8 | 17 |
C4H6 | 3 | 5 |
CClH3 | 3 | 4 |
C2H3O2 | 3 | 7 |
C2FH5 | 3 | 5 |
C4H6O2S | 6 | 11 |
Minor functionality improvements and bugfixes.
- All exceptions now inherit from a base
autode.exceptions.AutodeException
- Fixes a typo in
autode.exceptions.UnsupoportedCalculationInput
- Adds documentation explaining the intention of each exception in
autode.exceptions
- Molecular graphs are now 'laziliy-loaded' i.e. generated once when the property is accessed
- Adds the ability to define atom classes for molecules in turn allowing for identity reactions to be calculated
- Fixes clashing names for a reaction initialised explicitly from molecules without defined names
Bugfix release.
- Fixes output redirection from XTB calculations resulting in missed lines on Mac
Bugfix release.
- Adds
autode.mol_graphs.MolecularGraph
(subclass ofnetworkx.Graph
) with aexpected_planar_geometry
method - Adds an
are_planar
method toautode.atoms.Atoms
- Fixes a bug in assigning reasonable geometries which, in turn, could lead to skipped single point energy evaluations
Adds optimisation algorithms experimental explicit solvation, improves potential energy surface module as well as an array of usability improvements.
- Adds more type hints and documentation
- Updates the TS template saved in the default template library
- Adds a setter for
autode.species.Species.solvent
somol.solvent = 'water'
will assign aautode.solvent.Solvent
- Removes
autode.calculation.CalculationInput.solvent
as an attribute in favour of using the molecule's solvent - Removes
autode.calculation.get_solvent_name
in favour of a molecule check - Removes
autode.species.molecule.reactant_to_product
in favour of ato_product()
method forautode.species.molecule.Reactant
(and likewise with a Reactant) - Removes partially implemented
autode.species.molecule.SolvatedMolecule
andautode.species.complex.SolvatedReactantComplex
as the type of solvation (implicit/explicit) should be a property of the solvent and not the molecule - Removes
autode.reactions.Reaction.calc_deltaXXX
in favour ofautode.reactions.Reaction.delta()
- Refactors classes to place constructors at the top
- Removes
autode.values.PlottedEnergy
as an estimated attribute is useful for all energies, not just those that are plotted - Removes
autode.reactions.Reaction.find_lowest_energy_ts
as the function is not well named and can be replaced by aautode.reactions.Reaction.ts
property - Adds
autode.transition_states.TransitionStates
as a wrapper for TSs, much likeautode.conformers.Conformers
- Updates
autode.solvent.solvents.get_solvent
to require specifying either an implicit or explicit solvent - Improves validation of distance constraints and adds invariance to the key order i.e.
autode.constraints.distance[(0, 1)] == autode.constraints.distance[(1, 0)]
- Removes
autode.KcalMol
andKjMol
and enables a reaction to be plotted using a string representation of the units. - Allows for keywords to be set using just a list or a string, rather than requiring a specific type
- Changes
autode.wrappers.keywords.Keyword.has_only_name
to a property - Modifies the constructor of
autode.species.molecule.Molecule
to allow for a name to be specified when initialising from a .xyz file - Modifies
autode.calculation.Calculation.get_energy
to raise an exception if the energy cannot be extracted - Adds a runtime error if e.g.
autode.calculation.Calculation.get_energy
is called on a calculation that has not been run - Skips low-level adaptive path searching if the high and low-level methods are identical (when XTB or MOPAC are not installed)
- Adds a default set of low-level single point keywords
- Adds a flag to override exiting a reaction profile calculation when association complexes are generated
- Adds a check that a calculation isn't going to exceed the maximum amount of physical memory on the computer
- Adds a selection of molecule optimisers to locate minima and transition states
- Refactors
autode.smiles.angles
to use unique class names (preventing overlap with e.g.autode.values.Angle
) - Adds a
autode.solvent.Solvent.dielectric
property for a solvent's dielectric constant - Adds a
autode.solvent.Solvent.is_implicit
property - Adds methods (e.g. translate and rotate) to
autode.point_charges.PointCharge
- Adds checking that both high and low-level electronic structure methods are available before running
autode.reaction.Reaction.calculate_reaction_profile
orcalculate_reaction_profile
- Adds a more robust explicit solvation generation (
autode.species.molecule.Molecule.explicitly_solvate()
) - Removes criteria on using a TS template with large distance differences between the structure and the template in favour of running sequential constrained optimisations to the required point
- Rewrites
autode.pes
into a consistent module while maintaining much of the functionality. Simplifies the interface - Adds a QChem electronic structure method wrapper
- Adds
autode.species.Species.calc_hessian
to calculate either an analytic or numerical Hessian (in parallel) - Adds image dependent pair potential (IDPP) relaxation improved interpolated geometries
- Adds
autode.hessians.HybridHessianCalculator
to calculate numerical Hessians at two levels of theory
- Updates the TS template saved in the default template library
- Reloads output file lines from a failed then re-run calculation
- Fixes Hessian extractions from some Gaussian output files
Usability improvements
- Improves consistency and behaviour of
calc_thermo
method of a species, allowing for keywords and non-run calculations - Allows for a non-fork multiprocessing 'start_method'
Bugfixes
- Fixes typo in
autode.exceptions.ReactionFormationFalied
- Fixes a bug where rings containing mostly double bonds failed to build with
autode.smiles.builder.Builder
- Fixes using XTB as a high-level method with the xtb-gaussian wrapper (thanks @kjelljorner)
Documentation and typing hints
- Adds typing to user-facing functions
- Adds
autode.config.location
to easily locate the core configuration file for permanent editing - Updates documentation for readability
- Ensures units are kept if constructing a
Value
from aValue
(i.e.Value(x)
, whenx
is aValue
)
- Changes
Keyword
to an abstract base class - Improves speed of
Species
rotation (numpy rather than a Python for loop)
- Fixes bug where NCI conformers were generated with the same name thus did not optimise uniquely (introduced in v.1.1.0)
API improvements that broadly maintain backwards compatibility.
- Adds more argument and return types
- Changes
AtomCollection.atoms
to a property for more flexible sub-classing - Changes
ElectronicStructureMethod.doi_str
andKeyword.doi_str
to properties - Adds interpretable
repr(Species)
Species.energies
is zeroed when theSpecies.atoms
are reset or changeSpecies.energy
is a property of the last computed energy on that speciesSpecies.is_linear
now uses an angle tolerance to determine linearity, which is slightly tighter than the previous float-based tolerance- Removes
CalculationOutput.set_lines
in favour of a cached file_lines property to avoidset_file_lines()
- Removes
CalculationOutput.get_free_energy()
in favour ofSpecies.free_energy
once a Hessian is set for a molecule and similarly withCalculationOutput.get_enthalpy()
- Removes
CalculationOutput.get_imaginary_freqs()
(nowSpecies.imaginary_frequencies
) andCalculationOutput.get_normal_mode_displacements()
(nowSpecies.normal_mode()
) Species.imaginary_frequencies
now returnsNone
rather than an empty list for a species without any imaginary frequencies, to be consistent with other properties- Changes
CalculationOutput.terminated_normally()
to a property (CalculationOutput.terminated_normally
) - Removes
Reaction.find_complexes
in favour of setting the reactant and product complexes dynamically, unlessReaction.calculate_complexes
is called to find association complexes - Tweaks the default relative tolerance on bonds to account for M-X agostic interactions lengthening bonds
- Enables
Species.atoms
to be added, even if they are None - Improved atom setting of
Complex.atoms
- Changes
Complex.get_atom_indexes()
toComplex.atom_indexes()
- Changes
Complex.molecules
to a private attribute as the atoms/energy/gradient is not propagated - Allows for
Species.translate()
andSpecies.rotate()
to be called using vectors as lists or tuples rather than just numpy arrays - Modifies
get_truncated_complex()
toget_truncated_species()
and changes the return type to a species to reflect a possibly different molecular composition of the complex - Improves peak checking in adaptive path TS guess generation
- Removes
autode.atoms.get_thing()
functions, in favour ofAtom.thing
- Raises an exception if a single point energy evaluation fails to execute successfully
- Removes
autode.conformers.conformer.get_conformer()
in favour of a more flexibleautode.conformer.Conformer
constructor - Adds
Species.constraints
that are used in optimisations (still available inCalculation
initialisation) - Adds
Conformers
to enable parallel electronic structure calculations across a set of conformers - Improves readability of pruning of conformers based on RMSD and energy thresholds
- Adds angle and dihedral angle properties to an
AtomCollection
- Improves and adds more
Unit
definitions - Adds
Value
andValueArray
base classes for energies, gradients etc. These allow for implicit (1 Hartree == 617.509 kcal mol-1) comparisons and explicit conversion (1 Hartree).to('kcal') - Adds further conversion factors to
Constants
- Adds
Species.energies
as a container of all energies that have been calculated at a geometry - Adds
Keywords.bstring
as a 'brief' summary of the keywords e.g. PBE0/def2-SVP and are associated with anEnergy
(a type ofValue
) - Improves quick reaction coordinate characterisation of TSs by providing a maximum atomic displacement for improved initial structures
- Adds Hessian diagonalisation to obtain normal modes with and without translation and rotation projections for linear and non-linear molecules
- Adds
Species.weight
andSpecies.mass
as equivalent properties for the molecular weight - Improves dihedral sampling in molecule generation
- Adds
atoms.remove_dummy()
to remove all dummy atoms from a set - Enables different force constants to be used in XTB constrained optimisations (
Config.XTB.force_constant
, which setswrappers.XTB.XTB.force_constant
) - Adds
Solvent.copy()
- Adds
Species.reorder_atoms()
to reorder the atoms in a species using a mapping - Adds
Config.ORCA.other_input_block
to allow for a block of input to be printed in all ORCA input files - Changes the loose optimisations to only use a maximum of 10 iterations. This is based on an analysis of 3500 ORCA
optimisations, which plateaus quickly:
suggesting a value of 10 is a appropriate. This will be system dependent and need increasing for large/flexible systems. For path optimisations loose optimisations use a maximum of 50 cycles.
- Skips conformers with no atoms in finding unique conformers
- Corrects benchmark TS location for the Grubbs metathesis example, where the reactant complex is bound
- Fixes possible zero distance constraint for a single atom
- Fixes spin state definition for XTB calculations
- Fixes possible override of a constructor-defined spin state by the SMILES parser
Bugfix release
- Saves transition state templates with correct atom labels
Bug fixes in SMILES parser and 3D geometry builder from 1.0.3.
- Improves doc strings
- Throws interpretable error when calling
find_tss
withoutreaction.reactant
set
- SMILES strings with >9 ring closures are parsed correctly
- cis-double bonds in rings no longer minimise with constraints, which is a little faster
- Tweaks repulsion parameters in minimisation to build fused rings
- Enables SMILES parsing with "X(...)1" branching
- Fixes spin multiplicity for odd numbers of hydrogens
- Improves ring closure 3D build
- Fixes incorrect implicit valency for aromatic heteroatoms
- Improves metal finding in SMILES strings with regex
- Corrects atom type for sp2 group 16 elements
- Fixes dihedral rotation with atoms not close to any other
A minor API revision from 1.0.2 but adds C++ extension which should be extensible to further developments of fast C-based code.
autode.Species()
inherit from aAtomCollection()
base class for more flexibilityautode.Constants
attributes have more readable names (while retaining backwards compatability)autode.geom.length()
as an explicit alias ofnp.linalg.norm
has been removedautode.input_output.xyz_file_to_atoms()
throws more informative errorsautode.mol_graphs.make_graph()
throws NoAtomsInMolecule for a species with no atomsspecies.formula
andspecies.is_explicitly_solvated
are now a propertiesautode.smiles.parser
has been rewritten & is (hopefully) a more robust SMILES parser
- Metal complex initial geometries can now be generated with the correct stereochemistry
- Macrocycles default to an autodE builder that conserves SMILES stereochemistry (RDKit#1852)
species.coordinates
can be set from either 3xN matrices or 3N length vectorsautode.Atom()`s have :code:
.group`.period
and.tm_row
properties referring to their location in the periodic tableautode.atoms.PeriodicTable
addedspecies.bond_matrix
added as a property and returns a boolean array for interactions between all atom pairs
reaction.calculate_complexes()
callsreaction.find_complexes()
if needed thus can be called in isolation
- Effective core potentials can now be specified in
Keywords()
- ORCA fitting basis sets now default to def2/J, which should be smaller but as accurate as AutoAux
- Molecule initialisation from a .xyz file now checks for an odd number of electrons. For example,
Molecule('H_atom.xyz')
will raise aValueError
butMolecule('H_atom.xyz', charge=1)
orMolecule('H_atom.xyz', mult=2)
are acceptable
atom.atomic_number
has been added as an atom attributeatom.atomic_symbol
is a more intuitive alias foratom.label
- Molecular complexes can now be initialised with a reasonable geometry
Complex(..., do_init_translation=True)
species.radius
has been added as an approximate molecular radius (in Angstroms, excluding VdW radii)
- Final breaking bond distances are now the minimum of the product X-Y distance if present in the product, or 2x the distance. This is required for breaking bonds that cross a ring.
- Neighbour lists for comparing possibly equivalent bond rearrangements are now compared using a sorted list
The first stable release! Mostly documentation updates from v.1.0.0b3 with the package now being conda-install-able.
- More documentation
- XTB wrapper now supports v. 6.4 (and hopefully higher)
Thanks to Joe, Alistair, Matina, Kjell, Gabe, Cher-Tian amongst others for their invaluable contributions.
This version brings several major changes and in some instances breaks backwards compatibility, but does feature significant improvements in speed and accuracy for finding transition states.
species.get_distance(i, j)
is nowspecies.distance(i, j)
species.set_atoms(new_atoms)
is now properly handled with a setter sospecies.atoms = new_atoms
will set the new atomsspecies.n_atoms
is more robustspecies.get_coordinates()
is nowspecies.coordinates
, returning a numpy array copy of the species coordinates (Nx3 in Å)species.centre()
will translate a species so it's coordinate centroid lies at the origin- PBE0/def2-SVP is now the default 'low opt' method (keywords.low_opt) with loose optimisation. Path exploration uses this method, thus it needs to be very close to the 'opt' level
- 1D, 2D potential energy surface scans and nudged elastic band (NEB) methods to generate TS guesses from reactants have been replaced by an adaptive path search which seems to be very efficient for generating initial paths
For the prototypical SN2 between fluoride and methyl chloride the relaxed PES (PBE0-D3BJ/ma-def2-SVP/CPCM(water)) is
where the previously employed linear path (red) is compared to the adaptive scheme (blue, purple) and the 'true' intrinsic reaction coordinate. With a small minimum step size a path very close to the MEP is traversed with a very small number of required constrained optimisations. This enables NEB relaxations to be skipped and the associated limitations (corner cutting, oscillating path, optimisation in Cartesian coordinates) avoided. This exploration is essential when a linear path over multiple bonds leads to rearrangements, e.g. an (E2) elimination reaction the comparison for the linear, adaptive and IRC paths are shown below
- (CI)-NEB with adaptive force constant has been added
- Initial path exploration from reactants is performed at the 'low_opt' level with a final breaking bond distance below.
Previous implementations made use of a 1.5 Å additional shift for uncharged reactions and 2.5 Å for charged, this however lead to possible final C-H distances of ~3.6 Å and steps into unphysical regions. 1.0.0b3 uses an estimate based on the distance where the bond is mostly broken, as below
where X-Y corresponds to a molecule e.g. C-C with the appropriate hydrogens added then the BDE curve calculated at the GFN2-XTB level of theory. A multiplier of ~2 affords a 'mostly broken bond' (i.e. the distance at 3/4 of energy of the broken bond).
- There is now a heuristic used to skip TSs that go via small rings (3, 4-membered) if there is a >4-membered equivalent (
ade.Config.skip_small_ring_tss
)
- Calculations are now unique based on constraints, so NEB calculations executed in the same directory are not skipped with different bond rearrangements