Changelog
0.50.0rc3 / 2026-03-10
Docs v0.50.0rc3 for current. Docs v0.30.2 for QCSchema v1.
New Features
(GH#391) Add convert_v support to AtomicProperties and AtomicProtocols.
(GH#392) Extend qcelemental.models.v2.optimization to accept ManyBody specifications/results/properties (when qcmanybody is available). Replaces GeneralizedOptimizationInput etc. that worked for QCManyBody and optking for v1 counterpoise-corrected optimizations.
Enhancements
(GH#391) Make Molecule and WavefunctionProperties tolerant of None being passed in during construction (important for relying more in future on pydantic rather than custom serialization).
(GH#392) Update model survey tests to include ManyBody v2 classes and Provenance and to test extra fields mostly forbidden.
Bug Fixes
(GH#392) More precise Pydantic version constraints: v2.11, unless py314+
Misc.
(GH#391) Remove unused config options (canonical_repr and repr_style) and serialize_default_excludes functionality.
0.50.0rc2 / 2026-02-17
Docs v0.50.0rc2 for current. Docs v0.30.2 for QCSchema v1.
Breaking Changes (low impact)
Enhancements
(GH#390) Removed the “Imports will provide non-functional placeholders” FutureWarning for <py314
(GH#390) Added qcelemental.models.QCEL_V1V2_SHIM_CODE as magic var to signal returning _v1v2 model.
(GH#390)) Removed sphinx-autodoc-typehints
(GH#388) Molecule: Fix imports, typing, @property logic (exp. connectivity, printing of float multiplicity, and returning type(self) to handle derived classes
(GH#385) Start building docs for QCSchema v2 models. If downstream docs builds are complaining about dtype here, add os.environ[“SPHINX_BUILD”] = “1” to Sphinx conf.py Note that this changes intersphinx links. Below is current (for next2026).
"qcelemental": ("https://molssi.github.io/QCElemental/next/", None),
"qcengine": ("https://molssi.github.io/QCEngine/next/", None),
"qcfractal": ("https://docs.qcarchive.molssi.org/", None),
0.50.0rc1 / 2026-01-13 (aka “next” aka “QCSchema v2 available”) (Prerelease)
Breaking Changes
(GH#377) Note that Pydantic doesn’t offer its v1 API within version v2 for Python >=3.14. For 314, while all imports will work, attempting to instantiate a QCSchema v1 model will raise a
RuntimeError.
Breaking Changes (long expired)
(GH#346) The very old model names ResultInput, Result, ResultProperties, Optimization deprecated in 2019 are now only available through qcelelemental.models.v1
(GH#347)
models.v2do not support AutoDoc. The AutoDoc routines have been left at pydantic v1 syntax. Use autodoc-pydantic for Sphinx instead.
New Features
(GH#361) Switch from poetry to setuptools build backend.
(GH#346) Downstream code should
from qcelemental.models.v1 import Molecule, AtomicResultetc. to assure medium-term availability of existing models.(GH#347) Introduces QCSchema v2 models written in Pydantic v2 API. New models available as
from qcelemental.models.v2 import Molecule, AtomicResultetc.There is a graphical [cheat sheet](docs/qcschema_cheatsheet_9Jan2026.pdf) comparing QCSchema v1 and v2. There is also a [migration guide](docs/MIGRATION.md)
(GH#352)
AtomicInputandAtomicResultOptimizationInput,OptimizationResult,TorsionDriveInput,TorsionDriveResult,FailedOperation(both versions) learned a.convert_v(ver)function that returns self or the other version.(GH#354) Unlike Levi’s pyd v2, this doesn’t forward define dict, copy, json to v2 models. Instead it backwards-defines model_dump, model_dump_json, model_copy to v1. This will impede upgrading but be cleaner in the long run. See commented-out functions to temporarily restore this functionality. v2.Molecule retains its dict for now
Enhancements
Build, Maintenance, & Versions
(GH#361) Move from poetry to setuptools build backend and versioneer to scm-version for versioning.
Pydantic 2 now required. v2.12 for Python 3.14.
(GH#377) Now all python versions can import everything (even if no good b/c Pydantic v1 API not available for Python 3.14). There’s FutureWarnings thrown (no more DeprecationWarnings) on any import. Python 3.14 will fail to instantiate the forbidden models and raise a RuntimeError, but otherwise all Pythons are operational.
(GH#345) Set up precommit.
(GH#359)
isortversion bumped to 5.13 and imports and syntax take advantage of python 3.8+
Imports, module layout
(GH#345) Move models to models.v1 to preserve the longstanding QCSchema v1.
(GH#349) Dummy files added to models/ directory to mirror v1 layout (e.g., models/results.py). These reroute imports to v1/ so downstream can run w/o alteration with from qcelemental.models.procedures import OptimizationInput, etc. Warnings are added to the dummy files to promote loading from models, models.v1, or models.v2, not models.v1.results etc.
(GH#349, GH#366) Many more of the lesser-used models are importable from
qcel.models(or itsv1andv2subdirectories). This includesTorsionDriveInput,TorsionDriveResult,Model,AtomicResultProtocols,QCInputSpecification,OptimizationSpecification, andTDKeywords(PR 349). Also, ElectronShell, BasisCenter, ECPPotential importable from top levelmodels(PR 366). This is part of a recommended change to always import directly frommodels,models.v1, etc.(GH#366) For models.v2, procedures.py was separated (into opt and td) and results.py was renamed, so models are separated into atomic.py, optimization.py, and torsion_drive.py. Failure models were moved to failed_operation.py. Also, basis.py was renamed to basis_set.py .
(GH#377) Not part of API. If you must have QCSchema v1 in Pydantic v2 API (for Python 3.14), ask @loriab about the _v1v2 transition class. Never return objects of these classes.
Slight alterations to v1 QCSchema
models.v1modelsAtomicInput,AtomicResult,OptimizationInput,OptimizationResult,TorsionDriveInput,TorsionDriveResult,Molecule,BasisSet,QCInputSpecification,OptimizationSpecification,OptimizationProtocols,WavefunctionPropertieslearned a .convert_v(target_version) to return either itself (with target_version=1) or convert to QCSchema v2 (with target_version=2). This is recommended to use over hand-mapping.(GH#352, GH#357) The
models.v1AtomicInput,AtomicResult,OptimizationInput,OptimizationResult,TorsionDriveInput,TorsionDriveResult(PR 352) andBasisSet,QCInputSpecification,OptimizationSpecification(PR 357) had their schema_version changed from an int to a Literal[1]. “Result”s given schema_version in their own right rather than inheriting from Input. (Intermediate PRs in next branch added validation to schema_version so new instances stamped as 1, even if another value passed in. By the time of next merge, all such translation is handled in convert_v, so incorrent values will fail instantiation.)(GH#357)
v1.Moleculehad its schema_version changed to a Literal[2] (remember Mol is one-ahead of general numbering scheme) so new instances will be 2 even if another value is passed in.(GH#354, GH#357)
Molecule.extras(PR 354) andFailedOperation.extras(PR 357) default changed from None to {} rather in both v1 and v2. Input None converts to {} upon instantiation.(GH#352) v1.ProtoModel learned model_copy, model_dump, model_dump_json methods (all w/o warnings) so downstream can unify on newer Pydantic v2 syntax. (Levi’s work alternately/additionally taught v2 copy, dict, json (all w/warning) but dict has an alternate use in Pydantic v2.)
(GH#358)
v1.AtomicResult.convert_vlearned aexternal_input_dataoption to inject that field (if known) rather than using incomplete reconstruction from the v1 Result. may not be the final sol’n.
New v2 Schema: generic changes wrt v1
models.v2modelsAtomicInput,AtomicResult,OptimizationInput,OptimizationResult,TorsionDriveInput,TorsionDriveResult,Molecule,BasisSet,AtomicSpecification,OptimizationSpecification,OptimizationProtocols,WavefunctionPropertieslearned a .convert_v(target_version) to return either itself (with target_version=2) or convert to QCSchema v1 (with target_version=1). This is recommended to use over hand-mapping.(GH#363) All the v2 models (Protocols/Keywords/Specification/Input/Properties/Result) get Literal
schema_namestarting with “qcschema” (many v1 models didn’t have a name; some v1 models allowed “qc_schema_”).(GH#347) The
models.v2have had their schema_version bumped forBasisSet,AtomicInput,OptimizationInput(implicit forAtomicResultandOptimizationResult),TorsionDriveInput, andTorsionDriveResult.(GH#347, GH#352) The
models.v2BasisSet,AtomicInput,AtomicResult,AtomicResultPropertiesOptimizationInput,OptimizationResult,TorsionDriveInput,TorsionDriveResulthad their schema_version bumped (PR 347) and changed to a Literal[2] (PR 352).(GH#366) v2: standardizing on Input/Result get schema_version, Protocols/Keywords/Specification get only schema_name. (v1 models gave schema_version to Input/Specification and Result inherited from Input.)
(GH#357, GH#536)
v2.AtomicResult,v2.OptimizationResult, andv2.TorsionDriveResulthave thesuccessfield enforced toTrue. Previously it could be set T/F. Now validation errors if not T. Likewisev2.FailedOperation.successis enforced toFalse.(GH#357, GH#536)
v2.AtomicResult,v2.OptimizationResult, andv2.TorsionDriveResulthave theerrorfield removed. This isn’t used now thatsuccess=Trueand failure should be routed toFailedOperation.Of the top-level fields normally in a Input schema in v1, only molecule remains in v2; others are moved to a Specification schema. For example, OptimizationInput.specification = OptimizationSpecification. This helps schema be more composible and reuseable.
Result schema classes no longer inherit from Input as in v1. Now input is stored as a field in result, e.g., OptimizationResult.input_data = OptimizationInput. This helps preserve info for restart and prevent overwriting Molecule and Provenance.
New v2 Schema: Molecule, BasisSet, FailedOperation changes wrt v1
(GH#366)
v2.Molecule.schema_versionis now 3, with no layout change.(GH#366) molparse learns to pass through schema v3, though no new field for Mol yet.
(GH#366)
v2.BasisSet.schema_versionis now 2, with no layout change.BasisSet.schema_namestandardized toqcschema_basis_set.(GH#366)
MoleculeandBasisSetandWavefunctionPropertieslearned toconvert_vto interconvert between v1 and v2. No layout changes.(GH#358, GH#366)
v2.FailedOperationgained schema_name and schema_version=2. unversioned in v1(GH#352)
v2.FailedOperationfield id is becoming Optional[str] instead of plain str so that the default validates.
New v2 Schema: Atomic changes wrt v1
(GH#366)
AtomicResultProtocolsrenamed toAtomicProtocolsandAtomicResultPropertiestoAtomicProperties(GH#359)
v2.AtomicInputgained aspecificationfield where driver, model, keywords, extras, and protocols now live.v2.AtomicSpecificationandv1.QCInputSpecification(used by opt and td) learned aconvert_vto interconvert.(GH#359)
v2.AtomicSpecification, unlikev1.QCInputSpecification, doesn’t have schema_name and schema version.(GH#363) Whereas
v1.AtomicInputandv1.QCInputSpecificationshared the same schema_name,v2.AtomicInputandv2.AtomicSpecificationdo not. This is a step towards more explicit schema names.(GH#359)
v2.AtomicInputlost extras so extras belong unambiguously to theAtomicSpecification.(GH#358)
v2.AtomicResultno longer inherits fromv2.AtomicInput. It gained ainput_datafield for the correspondingAtomicInputand independentidandmoleculefields (the latter being equivalvent tov1.AtomicResult.moleculewith the frame of the results;v2.AtomicResult.input_data.moleculeis new, preserving the input frame).AtomicResultgained an independentextras.(GH#363, GH#366)
v2.AtomicResult.schema_namebecomes a Literal, no longer accepts “qc_schema*”, and changes fromqcschema_outputtoqcschema_atomic_result.(GH#363)
qcschema_inputandqcschema_outputnow areqcschema_atomic_inputandqcschema_atomic_output(GH#363)
v2.AtomicResult.convert_v()learned external_protocols option to inject that field if known from OptIn
New v2 Schema: Optimization changes wrt v1
(GH#366)
v2.OptimizationProtocolrenamedtrajectory_resultsfromtrajectoryin accordance with the protocol naming the controlled field. No default change yet.(GH#366) Default of
OptimizationProtocol.trajectory_resultschanged to “none” from “all” in v1. Much info can now come fromtrajectory_properties.(GH#363)
v2.OptimizationInputgot a Literalschema_namenow. Fieldspecificationnow takes anOptimizationSpecificationthat itself takes anAtomicSpecification. This replaces from v1 fieldinput_specificationthat took aQCInputSpecification.v2.OptimizationInputgained aprotocolsfield. Fieldskeywords,extras, andprotocolsfrom Input are now inOptimizationSpecification.(GH#363)
v2.OptimizationSpecificationnow is used every optimization asv2.OptimizationInput.specification=OptimizationSpecificationrather than only in torsion drives. No longer has schema_name and schema_version. Its.proceduresfield is nowprogram. Gains new fieldspecificationthat is most commonlyAtomicSpecificationbut could beManyBodySpecificationor any other E/G/H producer.(GH#357)
v2.OptimizationSpecificationlost its schema_version (compared to v1) but gained anextrasfield.(GH#366)
v2.OptimizationResult.schema_namechanged fromqcschema_optimization_outputtoqcschema_optimization_result.(GH#352) The
models.v1andmodels.v2OptimizationResultgiven schema_version for the first time.(GH#363)
v2.OptimizationResultgained ainput_datafield for the correspondingOptimizationInputand independentidandextras. No longer inherits fromOptimizationInput. Literal schema_name.(GH#363)
v2.OptimizationResultgained anative_filesfield, though not protocols for user control.(GH#363)
v2.OptimizatonResult.energiesbecomesv2.OptimizationResult.trajectory_propertiesand ManyBody allowed as well as atomic. Much expands information returned.(GH#363)
v2.OptimizatonResult.trajectorybecomesv2.OptimizationResult.trajectory_resultsand ManyBody allowed as well as atomic.(GH#363) Added a new basic
v2.OptimizationPropertiesfor expansion later. for now has number of opt iter. Lodged inOptimizationResult.properties.
New v2 Schema: TorsionDrive changes wrt v1
(GH#363, GH#366)
v2.TDKeywordsgot aschema_namefield and was renamed toTorsionDriveKeywords(GH#366) New
v2.TorsionDriveProtocolsmodel with fieldscan_resultsto control all/none/lowest saving ofOptimizationResults at each grid point. Use “all” for proper conversion to v1.(GH#363)
v2. TorsionDriveSpecificationis a new model. instead ofv2.TorsionDriveInputhaving ainput_specificationand anoptimization_specfields, it has aspecificationfield that is aTorsionDriveSpecificationwhich in turn hold opt info and in turn gradient/atomic info.(GH#363)
v2.TorsionDriveResultno longer inherits from Input and now has indep id and extras and new native_files.(GH#367)
v1.TorsionDriveResult.final_energiesreplaced by largerv2.TorsionDriveResult.scan_properties. The former is present in the latter asreturn_energy.(GH#366) main storage for
v2.TorsionDriveResultmoved fromoptimization_historytoscan_results.(GH#363)
v2.TorsionDriveResultgained anative_filesfield, though not protocols for user control.(GH#367)
v2.TorsionDrivePropertiesadded mostly as a placeholder class (one obvious prop at present).
Misc.
(GH#354) Fix a lot of warnings originating in this project.
(GH#348) All of
Datum,DFTFunctional, andCPUInfomodels, none of which are mixed with QCSchema models, are translated to Pydantic v2 API syntax.(GH#377) no longer testing/ensuring np.array([single-float]) are coerced into float property results
0.30.0 / 2026-01-07
Enhancements
Bug Fixes
(GH#371) Add setuptools as general dependency just in case nglview is present, so pkg_resources can be imported. After next nglview release, this can be removed. nglview v4.0 released early October but still very new so setuptools stays.
(GH#372) Fix some PubChem lookups that stopped working.
(GH#376) Fix verbosity of models/molecule.py log messages
Misc.
0.29.0 / 2025-01-13
Breaking Changes
(GH#341) packaging is now a required dependency.
New Features
(GH#350, GH#318, GH#317) Make behavior consistent between molecular_charge/ fragment_charges and molecular_multiplicity/fragment_multiplicities by allowing floating point numbers for multiplicities. Non-fractional multiplicities are coerced to integers for minimal disruption. @awvwgk
(GH#360)
Moleculelearned new functionselement_compositionandmolecular_weight. The first gives a dictionary of element symbols and counts, while the second gives the weight in amu. Both can access the whole molecule or per-fragment like the existingnelectronsandnuclear_repulsion_energy. All four can now select all atoms or exclude ghosts (default).
Enhancements
(GH#340, GH#330) Add molecular charge and multiplicity to Molecule repr formula, so neutral singlet unchanged but radical cation has ‘2^formula+’. @awvwgk
(GH#341) Use packaging instead of deprecated setuptools to provide version parsing for qcelemental.util.parse_version and qcelemental.util.safe_version. This behaves slightly different; “v7.0.0+N/A” was processed ok before but fails with newer version. @berquist
(GH#353) Copied in pkg_resources.safe_version code as follow-up to GH#341, Eric’s switch to packaging. Both NWChem and Gamess are now working again.
(GH#343) Molecular and fragment multiplicities are now always enforced to be >=1.0. Previously this wasn’t checked for Molecule(…, validate=False). Error messages will change sometimes change for validate=True (run by default).
(GH#343) qcelemental.molparse newly allows floats that are ints (e.g., 1.0) for multiplicity. Previously it would raise an error about not being an int.
(GH#337) Solidify the (unchanged)
schema_namefor QCInputSpecification and AtomicResult into Literals where previously they had been regex strings coerced into a single name. The literals allow pydantic to discriminate models, which benefits GeneralizedOptimizationInput/Result in QCManyBody/QCEngine/OptKing. The only way this can interfere is if schema producers have whitespace around schema_name for these models or if any AtomicResult s are still using “qc_schema_output”, which looks to have only been added for compatibility with pre-pydantic QCSchema.
Bug Fixes
Misc.
0.28.0 / 2024-06-21
Enhancements
0.27.1 / 2023-10-26
Bug Fixes
0.27.0 / 2023-10-24
Breaking Changes
New Features
Enhancements
(GH#322) Allow
util.whichto raise a clearer error when handling pyenv shims. Improve docs.
Bug Fixes
(GH#315) Stop resetting numpy print formatting.
(GH#328) Add workaround for only python v3.12.0 and psi4 (can be expanded) to handle
util.whichon Windows when a cmd (non-executable) and a cmd.<executable_extension> live side-by-side. Otherwise see[WinError 193] %1 is not a valid Win32 application.
Misc.
0.26.0 / 2023-07-31
Breaking Changes
- (GH#308) Fix CI Pipelines. Dropped Python3.6. Bring CI pipelines into harmony with local dev experience. Lint and format entire code base. Accelerate CI pipelines. Update setup.py to correctly define extras packages. Breaking change due to dropped support for Python3.6. No code functionality was altered.
Dropped support for dead Python 3.6. Minimum supported Python is now 3.7.
Updated CONTRIBUTING.md to contain detailed instructions for developers on how to contribute.
Fixed broken code that failed to prepend the “v” to version numbers.
Updated CI to run without conda and using only packages defined in setup.py. CI is now much faster and runs the same way for local developers and GitHub Actions.
Added test.sh and format.sh to devtools/scripts for easy execution of formatting and testing.
Formatted all code with black. Sorted imports with isort.
Added pre-commit to repo so code formatting, linting, and testing will all run as part of regular git workflow.
Enhancements
- (GH#310) Modernize DevOps Tooling
Added /scripts directory to root of project that contains scripts for testing, formatting code, and building docs.
Updated build system from setuptools to modern pyproject.toml specification using poetry for the build backend.
Removed complicated versioning code in favor of single source of truth in pyproject.toml. Using standard library importlib for looking up package version in __init__.py file.
Added build_docs.sh script to /scrips and removed Makefile from /docs. Flattened /docs file structure.
Removed travis-ci code from devtools
Removed LGTM code (they no longer exist as a project).
Bring all package directories under black, isort, and autoflake control.
Bug Fixes
(GH#305) Initialize Molecule.extras as empty dictionary.
(GH#311) Update docs location from RTD to GH pages. Resolve escape char warnings. Update changelog.
(GH#311) Clear up NumPy “Conversion of an array with ndim > 0 to a scalar is deprecated” in util.measure_coordinates called by Molecule.measure.
(GH#314) Import pydantic.v1 from pydantic v2 so that QCElemental can work with any >=1.8.2 pydantic until QCElemental is updated for v2.
0.25.1 / 2022-10-31
Bug Fixes
(GH#297) Rearrange imports for compatibility with Pint v0.20. No new restrictions on pint version.
0.25.0 / 2022-06-13
Breaking Changes
New Features
Enhancements
(GH#285) Standardized default on
AtomicResult.native_filesto{}fromNone. May break strict logic.(GH#289, GH#290) Transition from some early documentation tools (class
AutodocBaseSettingsandqcarchive_sphinx_theme) to externally maintained ones (project https://github.com/mansenfranzen/autodoc_pydantic andsphinx_rtd_theme). Expand API docs.
Bug Fixes
(GH#286) Sphinx autodocumentation with typing of
qcelemental.testing.compare_recursiveno longer warns about circular import.
0.24.0 / 2021-11-18
New Features
(GH#275)
AtomicResultgains anative_filesfield of a dictionary of file names (or generic'input') and text (not binary) contents that the CMS program may have generated but which haven’t necessarily been harvested into QCSchema. Contents controlled by a new native_files protocol analogous to stdout protocol.
Enhancements
(GH#281)
TorsionDriveInputnow accepts a list ofMoleculeobjects as theinitial_moleculeto seed the torsiondrive with multiple conformations.
0.23.0 / 2021-09-23
Breaking Changes
(GH#276)
AtomicResultProperties.dict()no longer forces arrays to JSON flat lists but now allows NumPy arrays. That is,AtomicResultPropertiesnow behaves like every other QCElemental model. Expected to be disruptive to QCFractal.(GH#280) Examples of QCSchema from test cases are now saved at branch https://github.com/MolSSI/QCElemental/tree/qcschema-examples . These have passed validation as models by Pydantic and as JSON by schema generated from Pydantic models.
New Features
(GH#277) Documentation is now served from https://molssi.github.io/QCElemental/ and built by https://github.com/MolSSI/QCElemental/blob/master/.github/workflows/CI.yml . https://qcelemental.readthedocs.io/en/latest/ will soon be retired.
Enhancements
(GH#274) The molecule
from_stringparser when no dtype specified learned to return the most specialized error message among the dtypes, not the full input string.(GH#276)
Molecule.to_string(..., dtype="nwchem")learned to handle ghosts (real=False) correctly. It also now prints the user label, which is used downstream for custom basis sets and shows up in a NWChem output file. QCEngine will be edited to process the label, but other uses may need modification.(GH#276)
Molecule.alignlearned a new keywordgeneric_ghosts=Trueso that it can act on molecules that have centers with content Gh, not Gh(He).
Bug Fixes
(GH#276)
Molecule.to_string(..., dtype="gamess")learned to handle ghosts (real=False) correctly forcoord=unique. Note that QCEngine usescoord=prinaxis, so actual ghosts are still NOT interpretable by downstream GAMESS.
0.22.0 / 2021-08-26
New Features
Enhancements
(GH#271)
Moleculelearned to create instances with geometry rounded to other than 8 decimal places throughMolecule(..., geometry_noise=<13>)to optionally overrideqcel.models.molecule.GEOMETRY_NOISE = 8. This should be used sparingly, as it will make more molecules unique in the QCA database. But it is sometimes necessary for accurate finite difference steps and to preserve intrinsic symmetry upon geometry rotation. Previous route was to reset the qcel module variable for the duration of instance creation.(GH#271)
Molecule.alignandMolecule.scramblelearned to return a fuller copy of self than previously. Now has aligned atom_labels, real, and mass_numbers as well as incidentals like Identifiers. Fragmentation still not addressed.(GH#271)
Molecule.to_string(dtype="gamess")learned to write symmetry information to the prinaxis output if passed in through field fix_symmetry. This is provisional, as we’d like the field to be uniform across qcprogs.
Bug Fixes
(GH#271) Testing function
compare_values()on arrays corrected the RMS maximum o-e value displayed and added a relative value.
0.21.0 / 2021-06-30
New Features
(GH#267) Serialization learned msgpack mode that, in contrast to msgpack-ext, doesn’t embed NumPy objects.
Enhancements
(GH#266) Testing function
compare_values()learned to print RMS and MAX statistics for arrays.
Bug Fixes
(GH#265) Fix search path construction. @sheepforce
(GH#266) Bump minimum pydantic to 1.8.2 to avoid security hole – https://github.com/samuelcolvin/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh .
0.20.0 / 2021-05-16
New Features
(GH#257)
PhysicalConstantsContextlearned to write a Fortran header. @awvwgk
Enhancements
(GH#261) Documentation became type-aware and grew more links.
0.19.0 / 2021-03-04
New Features
Enhancements
Bug Fixes
(GH#253) Fixed incompatibility with Pydantic >=1.8.
0.18.0 / 2021-02-16
New Features
(GH#237) Exports models to JSON Schema with
make schema.(GH#237) Build bank of JSON examples from Pydantic models defined in tests. Test that bank against exported schema with
pytest --validate qcelemental/.(GH#237) Many model descriptions edited, dimensions added to array properties,
AtomicInput.model.basisnow takesBasisSetobject not just string, several properties added to match QCSchema, several limitations on number and uniqueness imposed.
Enhancements
Bug Fixes
0.17.0 / 2020-10-01
Enhancements
(GH#238)
molparse.to_stringMRChem dtype developed.
0.16.0 / 2020-08-19
New Features
Enhancements
(GH#231)
compare,compare_values, andcompare_recursivelearned new keywordequal_phasethat whenTrueallows eithercomputedor-computedto pass the comparison. Forcompare_recursive, the leniency can be restricted to specific leaves of the iterable by passing a list of allowed leaves.
Bug Fixes
(GH#229)
Molecule.aligntold the full truth in its documentation that themol_alignargument can take a float.
0.15.1 / 2020-06-25
Bug Fixes
(GH#228) Fix testing bug for installed module, which was missing a dummy directory.
0.15.0 / 2020-06-25
New Features
(GH#182) Added experimental protocol for controlling autocorrection attemps. (That is, when a calculation throws a known error that QCEngine thinks it can tweak the input and rerun.) Currently in trial for NWChem.
Enhancements
(GH#186, GH#223)
molparse.to_stringOrca and MADNESS dtypes developed.(GH#226) Allow
which_importto distinguish between ordinary and namespace packages.(GH#227) Add non-default
strictargument toperiodictable.to_Z,to_symbol, andto_elementthat fails when isotope information is given.(GH#227) Allow nonphysical masses to pass validation in
molparse.from_schema(..., nonphysical=True). Also allowed in formingqcel.models.Molecule(..., nonphysical=True).
Bug Fixes
(GH#227) Fixed deception described in issue 225 where
qcel.models.Molecule(..., symbols=["O18"])accepted “O18” but did not influence the isotope, as user might have expected. That now raisesNotAnElementError, and an example of correctly setting isotope/masses has been added. This error now caught atqcel.molparse.from_arraysso general.
0.14.0 / 2020-03-06
New Features
Enhancements
Bug Fixes
0.13.1 / 2020-02-05
New Features
(GH#209) Added the option to Hill-order molecular formulas.
Bug Fixes
(GH#208) Fixes a Molecule hashing issue due to order of operations changes in
Molecule.from_data. The order of operations changed inMolecule.from_dataand occasionally resulted in different hashes for Molecules undergoing orient operations. This issue was introduced in 0.13.0 and is unlikely to have any serious negative effects as this did not affect hash integrity.
0.13.0 / 2020-01-29
New Features
Enhancements
(GH#179, GH#181) QCElemental works with Python 3.8 at the expense of needing a new 0.10 pint (rather than generic install). Pint 0.10 has optional NumPy dependency of >=1.12.0, so QCElemental that requires both NumPy and pint needs this constraint.
(GH#172, GH#173, GH#202, GH#203) Contribution improvements, including GitHub Actions checking,
make formatguidance, and updatedCONTRIBUTING.md.(GH#189, GH#196) Constants and unit conversion based on 2018 CODATA are available (but 2014 remains the default).
(GH#197, GH#199, GH#200) Added more atomic units and aliases (e.g.
au_length = bohr).(GH#190, GH#191, GH#201) Slim molecules. Many fields in
Moleculeobjects may be optionally inferred.
Bug Fixes
0.12.0 / 2019-11-13
New Features
Enhancements
(GH#156)
Moleculescan now be correctly compared with==.(GH#157)
molparse.to_stringQ-Chem dtype developed. Psi4 dtype now includes label and doesn’t have extraneous info for single fragment systems.(GH#162) New protocol
stdoutadded toResultProtocolscontrolling whetherstdoutfield (which generally contains the primary logfile, whether a program writes it to file or stdout) is returned.(GH#165) The code base is now Black formatted.
Deprecations
Bug Fixes
0.11.1 / 2019-10-28
Bug Fixes
- (GH#152) Patches
Molecule.from_fileandMolecule.from_datato read XYZ+ format and correctly handle keyword arguments. Patches
Molecule.to_fileto write XYZ+ format as the default for XYZ and XYZ+ files.
- (GH#152) Patches
0.11.0 / 2019-10-24
Enhancements
Bug Fixes
(GH#150) Patches
which_importto correctly handle submodules.
0.10.0 / 2019-10-16
Enhancements
0.9.0 / 2019-10-01
New Features
(GH#137, GH#138) Coordinates can now be output in
Turbomoleformat in addition to all other formats.(GH#139) A wavefunction property have been added to the
ResultModel. Adds the ability for Engine and other programs to store and fetch wavefunction data.(GH#140)
Protocolshave been added toQCInputSpecificationwhich allows data to pre-pruned by different specifications. Main intention is to reduce wavefunction data which may be re-computed cheaply rather than storing all of it. This does change the input model, so requires a minor version bump.
Enhancements
(GH#132)
BasisSetandResult’s documentations have been brought up to the standards of other models.
0.8.0 / 2019-09-13
New Features
Enhancements
Bug Fixes
(GH#125) Add back a consistency check that had been optimized out.
0.7.0 / 2019-08-23
Enhancements
(GH#118) Model string representations should be more user friendly and descriptive without overload the output.
(GH#119) The
molparse.to_stringkeyword-argreturn_datanow returns molecule keywords for GAMESS and NWChem. Themodels.Molecule.to_stringcan usereturn_datanow, too.(GH#120) Auto documentation tech is now built into the
ProtoModeland does not need an external function.
0.6.1 / 2019-08-19
Bug Fixes
(GH#114) The Numpy einsum calls reference the top level functions and not core C functions. This fixes an issue which can result in NumPy version dependencies.
0.6.0 / 2019-08-14
New Features
(GH#85, GH#87) Msgpack is a new serialization option for Models. Serialization defaults to msgpack when available (
conda install msgpack-python [-c conda-forge]), falling back to JSON otherwise. This results in substantial speedups for both serialization and deserialization actions and should be a transparent replacement for users within Elemental itself.
Enhancements
(GH#78) Molecular alignments can now be aligned on the derivatives of vector components.
(GH#81) Testing is now operated both on the minimal supported and the latest released versions of dependencies.
(GH#82) Molecule fragment grouping is now disabled by default to match expected behavior.
(GH#84) Testing without internet connection should now pass since PubChem testing is skipped with no connection.
(GH#85) Molecule switches from lists to numpy arrays for internal storage of per-atom fields.
(GH#86) Molecule performance and memory enhancements through reduced validation times and LRU caching of common validations.
(GH#88, GH#109) The
MoleculeModel now has its attributes documented and in an on-the-fly manner derived from the Pydantic Schema of those attributes.(GH#99, GH#100, GH#101, GH#102, GH#103, GH#104, GH#105, GH#106, GH#107) Various documentation, type hints, and small changes.
Bug Fixes
(GH#87) Molecule objects built from Schema are run through validators for consistency.
0.5.0 / 2019-07-16
Enhancements
(GH#76) Adds a built-in
Molecule.to_filefunction for easy serialization into.numpy,.json,.xyz,.psimol, and.psi4file formats.
Bug Fixes
(GH#74) Atom and fragment ordering are preserved when invoking
get_fragment.
0.4.2 / 2019-06-13
New Features
0.4.1 / 2019-05-31
New Features
Enhancements
(GH#68)
molparse.to_stringlearned parameterreturn_datathat contains aspects of themodels.Moleculenot expressible in the string. Implemented for dtypes xyz, cfour, psi4.(GH#68)
Datumgained an attributenumericthat reflects whether arithmetic ondatais valid.Datums that aren’t numeric can now be created by initializing withnumeric=False.
Bug Fixes
0.4.0 / 2019-05-13
New Features
(GH#51) Changes
models.Moleculeconnectivity to default to None rather than an empty list. WARNING this change alters the hashes produced from theMolecule.get_hashfunctionality.(GH#52, GH#53)
models.Moleculelearnednuclear_repulsion_energy,nelectrons, andto_stringfunctions.(GH#54)
models.ResultPropertiessupports CCSD and CCSD(T) properties.(GH#56) Algorithms Kabsch
molutil.kabsch_align, Hungarianutil.linear_sum_assignment, and Unoutil.unoadded. Utilities to generate random 3D rotationsutil.random_rotation_matrixand reindex a NumPy array into smaller blocksutil.blockwise_expandadded.(GH#56) Molecular alignment taking into account displacement, rotation, atom exchange, and mirror symmetry for superimposable and differing geometries was added in
molutil.B787(basis NumPy function) andmodels.Molecule.align(far more convenient). Suitable for QM-sized molecules. Requires addition packagenetworkx.(GH#58)
utilslearnedwhich_importandwhichthat provide a path or boolean result for locating modules or commands, respectively. These were migrated from QCEngine along withsafe_versionandparse_versionto colocate the import utilities.(GH#61) Add molecular visualization to the
models.Moleculeobject through the optional 3dMol.js framework.(GH#65)
testing.compare_molrecslearned parameterrelative_geoms='align'that lets Molecules pass if geometries within a translation and rotation of each other.(GH#65)
testing.compare_recursivelearned parameterforgivethat is a list of paths that may differ without failing the comparison.
Enhancements
(GH#52, GH#53)
molparse.to_stringNWChem and GAMESS dtypes developed.(GH#57)
molparse.to_stringlearneddtype='terachem'for writing the separate XYZ file required by TeraChem. Angstroms or Bohr allowed, though the latter requires extra in input file.(GH#60)
util.whichadded the Python interpreter path to the default search$PATH.(GH#62) Added
*to parameter list of many functions requiring subsequent to be keyword only. Code relying heavily on positional arguments may get broken.(GH#63)
util.whichlearned parameterenvto use an alternate search$PATH.(GH#63)
util.whichandutil.which_importlearned parametersraise_errorandraise_msgwhich raisesModuleNotFoundError(for both functions) when not located. It error will have a generic error message which can be extended byraise_msg. It is strongly encouraged to add specific remedies (like how to install) through this parameter. This is the third exit pattern possible from the “which” functions, of which path/None is the default, True/error happens whenraise_error=True, and True/False happens otherwise whenreturn_bool=True.(GH#65) Testing functions
compare,compare_values,compare_recursivelearned parameterreturn_handlerthat lets other printing, logging, and pass/fail behavior to be interjected.
Bug Fixes
0.3.3 / 2019-03-12
Enhancements
(GH#49) Precompute some mass number and mass lookups and store on
qcel.periodic_table. Also move staticre.compileexpressions out of fns on to module. Mol validation .127s –> .005s.
0.3.2 / 2019-03-11
New Features
Enhancements
(GH#48) If Molecule object has passed through molparse validation because it was created with a molparse constructor (e.g.,
from_string), save some time by not passing it through again atmodel.Moleculecreation time.
Bug Fixes
(GH#48) Fixed a
Molecule.get_fragmentbug where ghosted fragments still asserted charge/multiplicity to the validator, which was rightly confused.
0.3.1 / 2019-03-07
Enhancements
(GH#37) Documentation now pulls from the custom QC Archive Sphinx Theme, but can fall back to the standard RTD theme. This allows all docs across QCA to appear consistent with each other.
(GH#41) Conda-build recipe removed to avoid possible confusion for everyone who isn’t a Conda-Forge recipe maintainer. Tests now rely on the
conda envsetups.(GH#44) Molecule objects are now always validated against a more rigorous model and fragment multiplicities are fixed at the correct times, even when no multiplicities are provided. Molecule defaults to
dtype=2.
Bug Fixes
0.3.0 / 2019-02-27
New Features
(GH#33)
molparse.to_schemarecognizesdtype=2in keeping with GH:MolSSI/QCSchema#60 with internalschema_name=qcschema_moleculeandschema_version=2fields.molparse.from_schemarecognizes external fields (existing functionality), internal fields (dtype=2), and mixed.(GH#33) Pydantic molecule model now contains schema_name and schema_version=2 information.
(GH#35) Models now have an
extrafield for extra attributes, no additional base keys are allowed.
Enhancements
(GH#34) Converts
qcel.Datumto Pydantic model. Changes: (a) comment, doi, glossary fields must be accessed by keyword, (b)to_dict()becomesdict()and instead of only label, units, data fields in dict, now comment, doi, glossary present _if_ non-default, (c) complex values no longer list-ified byto_dict().(GH#36) Changelog and Models documentation.
Bug Fixes
0.2.6 / 2019-02-18
Bug Fixes
(GH#32) Updates compliance with Pydantic v0.20.
0.2.5 / 2019-02-13
Enhancements
(GH#31) Lints the code base preparing for a release and minor test improvements.
Bug Fixes
(GH#30) Fixes
dihedralmeasurement code for incorrect phase in certain quadrants.
0.2.4 / 2019-02-08
New Features
Enhancements
(GH#28) Reduces loading time from ~1 second to 200 ms by delaying
pintimport and ensuring git tags are only computed once.
0.2.3 / 2019-01-29
Enhancements
(GH#24) Update models to be compatible with QCFractal and MongoDB objects in the QCArchive Ecosystem. Also enhances the
Moleculemodel’sjsonfunction to acceptas_dictkeyword, permitting a return as a dictionary of Pydantic-serialized python (primitive) objects, instead of a string.
0.2.2 / 2019-01-28
Bug Fixes
0.2.1 / 2019-01-27
(GH#20) Moves several Molecule parsing functions to the molparse module.
0.2.0 / 2019-01-25
now requires Python 3.6+
now requires Pydantic
New Features
Enhancements
(GH#13) Function
util.unnpthat recursively list-ifies ndarray in a dict now handles lists and flattens.
0.1.3 / 2018-12-14
New Features
(GH#12) Adds “connectivity” validation and storage consistent with QCSchema.
Enhancements
0.1.2 / 2018-11-3
New Features
0.1.1 / 2018-10-30
New Features
Enhancements
(GH#7) Adds outer schema_name/schema_version to
to_schema(..., dtype=1)output so is inverse tofrom_schema.
Bug Fixes
(GH#8) Tests pass for installed module now that comparison tests are xfail.
0.1.0a / 2018-10-24
This is the first alpha release of QCElemental containing the primary three components.
New Features
(GH#6) Updated molparse to write new Molecule QCSchema fields in keeping with GH:MolSSI/QCSchema#44
Periodic Table data from NIST SRD144 (c. pre-2015?) collected into
qcelemental.periodictableinstance, with accessorsto_Z,to_element,to_E,to_mass,to_A(and redundant accessorsto_mass_number,to_atomic_number,to_symbol,to_name) infloatandDecimalformats. Also includes functionality to write a corresponding “C” header.Physical Constants data from NIST SRD121 (CODATA 2014) collected into
qcelemental.constantsinstance, with access throughqcelemental.constants.Faraday_constant(exact capitalization;floatresult) orget(free capitalization;floatorDecimalresult). Also includes functionality to write a corresponding “C” header.molparsesubmodule wherefrom_string,from_array,from_schemaconstructors parse and rearrange (if necessary) and validate molecule topology inputs from the QC and EFP domains into a QCSchema-like data structure. Current deficiencies from QCSchema are non-contiguous fragments and “provenance” fields. Accessorsto_stringandto_schemaare highly customizable.A pint context has been built around the NIST physical constants data so that
qcelemental.constants.conversion_factor(from_unit, to_unit)uses the QCElemental values in its conversions. Resultingfloatis within uncertainty range of NIST constants but won’t be exact for conversions involving multiple fundamental dimensions orwavelength -> energy != 1 / (energy -> wavelength).