chemicalml 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/docs.yml +63 -0
- data/.github/workflows/links.yml +99 -0
- data/.github/workflows/opal.yml +34 -0
- data/.github/workflows/performance.yml +25 -0
- data/.github/workflows/rake.yml +19 -0
- data/.github/workflows/release.yml +34 -0
- data/CHANGELOG.md +52 -12
- data/CLAUDE.md +48 -41
- data/Gemfile +2 -1
- data/Rakefile +9 -4
- data/TODO.align/18-wire-class-registry.md +46 -0
- data/TODO.align/19-schema-aware-translator.md +33 -0
- data/TODO.align/20-missing-translator-rules.md +44 -0
- data/TODO.align/21-encapsulate-translator.md +33 -0
- data/TODO.align/22-dry-role-modules.md +32 -0
- data/TODO.align/23-final-spec-lint.md +25 -0
- data/TODO.align/24-autoload-wire-classes.md +84 -0
- data/TODO.align/25-value-container-schema-awareness.md +44 -0
- data/TODO.align/26-remove-dead-code.md +16 -0
- data/TODO.align/27-final-spec-lint.md +26 -0
- data/TODO.align/28-stereo-model.md +40 -0
- data/TODO.align/29-stereo-wire-children.md +30 -0
- data/TODO.align/30-stereo-translator.md +32 -0
- data/TODO.align/31-final-spec-lint.md +20 -0
- data/TODO.align/32-polymorphic-translator.md +43 -0
- data/TODO.align/33-polymorphic-parse.md +43 -0
- data/TODO.align/34-polymorphic-specs.md +16 -0
- data/TODO.align/35-final-spec-lint.md +10 -0
- data/TODO.align/36-molecular-convention-coverage.md +46 -0
- data/TODO.align/37-compchem-convention-coverage.md +55 -0
- data/TODO.align/38-dictionary-convention-coverage.md +34 -0
- data/TODO.align/39-unit-dictionary-convention-coverage.md +33 -0
- data/TODO.align/40-unit-type-dictionary-convention-coverage.md +28 -0
- data/TODO.align/41-expand-canonical-model-layer.md +43 -0
- data/TODO.align/42-translator-wire-new-models.md +31 -0
- data/TODO.align/43-dictionary-model-no-to-h.md +39 -0
- data/TODO.align/44-schema3-only-and-schema24-module.md +44 -0
- data/TODO.align/45-documentation-and-final-verification.md +23 -0
- data/TODO.align/46-lattice-vector-content.md +24 -0
- data/TODO.align/47-molecule-crystal-spectra-property-lists.md +23 -0
- data/TODO.align/48-model-list-and-module-lists.md +21 -0
- data/TODO.align/49-more-chemistry-models.md +34 -0
- data/TODO.align/50-validation-report.md +29 -0
- data/TODO.align/51-convention-auto-detection.md +30 -0
- data/TODO.align/52-schema24-legacy-elements.md +28 -0
- data/TODO.align/53-round-trip-integration-specs.md +30 -0
- data/TODO.align/54-document-versioned-parser-shim.md +38 -0
- data/TODO.align/55-molecule-missing-attributes.md +20 -0
- data/TODO.align/56-geometry-models.md +24 -0
- data/TODO.align/57-compchem-models.md +26 -0
- data/TODO.align/58-remaining-models.md +24 -0
- data/TODO.align/59-wire-new-models-translator.md +18 -0
- data/TODO.align/60-docs-and-final-verification.md +19 -0
- data/TODO.align/README.round10.md +30 -0
- data/TODO.align/README.round11.md +50 -0
- data/TODO.align/README.round12.md +73 -0
- data/TODO.align/README.round13.md +59 -0
- data/TODO.align/README.round14.md +48 -0
- data/TODO.align/README.round15.md +86 -0
- data/TODO.align/README.round16.md +46 -0
- data/TODO.align/README.round3.md +27 -0
- data/TODO.align/README.round4.md +18 -0
- data/TODO.align/README.round5.md +20 -0
- data/TODO.align/README.round6.md +27 -0
- data/TODO.align/README.round7.md +43 -0
- data/TODO.align/README.round8.md +24 -0
- data/TODO.align/README.round9.md +50 -0
- data/data/dictionaries/_index.yaml +9 -1
- data/data/dictionaries/cif.yaml +155 -0
- data/data/dictionaries/cml.yaml +172 -0
- data/data/dictionaries/cml_formula.yaml +63 -0
- data/data/dictionaries/cml_name.yaml +84 -0
- data/data/dictionaries/unit_non_si.yaml +30 -0
- data/data/dictionaries/unit_type.yaml +12 -0
- data/lib/chemicalml/cml/aliases.rb +20 -0
- data/lib/chemicalml/cml/base/abundance.rb +34 -0
- data/lib/chemicalml/cml/base/action.rb +50 -0
- data/lib/chemicalml/cml/base/action_list.rb +51 -0
- data/lib/chemicalml/cml/base/alternative.rb +28 -0
- data/lib/chemicalml/cml/base/amount.rb +30 -0
- data/lib/chemicalml/cml/base/angle.rb +44 -0
- data/lib/chemicalml/cml/base/annotation.rb +30 -0
- data/lib/chemicalml/cml/base/any_cml.rb +28 -0
- data/lib/chemicalml/cml/base/appinfo.rb +32 -0
- data/lib/chemicalml/cml/base/arg.rb +46 -0
- data/lib/chemicalml/cml/base/array.rb +23 -1
- data/lib/chemicalml/cml/base/array_list.rb +30 -0
- data/lib/chemicalml/cml/base/atom.rb +37 -1
- data/lib/chemicalml/cml/base/atom_array.rb +39 -1
- data/lib/chemicalml/cml/base/atom_parity.rb +9 -1
- data/lib/chemicalml/cml/base/atom_set.rb +30 -0
- data/lib/chemicalml/cml/base/atom_type.rb +36 -0
- data/lib/chemicalml/cml/base/atom_type_list.rb +33 -0
- data/lib/chemicalml/cml/base/atomic_basis_function.rb +44 -0
- data/lib/chemicalml/cml/base/band.rb +34 -0
- data/lib/chemicalml/cml/base/band_list.rb +31 -0
- data/lib/chemicalml/cml/base/basis_set.rb +35 -0
- data/lib/chemicalml/cml/base/bond.rb +11 -1
- data/lib/chemicalml/cml/base/bond_array.rb +17 -1
- data/lib/chemicalml/cml/base/bond_set.rb +30 -0
- data/lib/chemicalml/cml/base/bond_stereo.rb +11 -1
- data/lib/chemicalml/cml/base/bond_type.rb +34 -0
- data/lib/chemicalml/cml/base/bond_type_list.rb +33 -0
- data/lib/chemicalml/cml/base/cell_parameter.rb +38 -0
- data/lib/chemicalml/cml/base/cml_module.rb +1 -1
- data/lib/chemicalml/cml/base/complex_object.rb +30 -0
- data/lib/chemicalml/cml/base/condition_list.rb +37 -0
- data/lib/chemicalml/cml/base/crystal.rb +37 -0
- data/lib/chemicalml/cml/base/definition.rb +30 -0
- data/lib/chemicalml/cml/base/description.rb +32 -0
- data/lib/chemicalml/cml/base/dictionary.rb +7 -1
- data/lib/chemicalml/cml/base/dictionary_entry.rb +1 -1
- data/lib/chemicalml/cml/base/dimension.rb +42 -0
- data/lib/chemicalml/cml/base/document.rb +9 -1
- data/lib/chemicalml/cml/base/documentation.rb +30 -0
- data/lib/chemicalml/cml/base/eigen.rb +36 -0
- data/lib/chemicalml/cml/base/electron.rb +42 -0
- data/lib/chemicalml/cml/base/enumeration.rb +32 -0
- data/lib/chemicalml/cml/base/expression.rb +32 -0
- data/lib/chemicalml/cml/base/float.rb +40 -0
- data/lib/chemicalml/cml/base/float_array.rb +42 -0
- data/lib/chemicalml/cml/base/formula.rb +1 -1
- data/lib/chemicalml/cml/base/fragment.rb +41 -0
- data/lib/chemicalml/cml/base/fragment_list.rb +35 -0
- data/lib/chemicalml/cml/base/gradient.rb +32 -0
- data/lib/chemicalml/cml/base/identifier.rb +9 -1
- data/lib/chemicalml/cml/base/integer.rb +40 -0
- data/lib/chemicalml/cml/base/integer_array.rb +42 -0
- data/lib/chemicalml/cml/base/isotope.rb +36 -0
- data/lib/chemicalml/cml/base/isotope_list.rb +33 -0
- data/lib/chemicalml/cml/base/join.rb +36 -0
- data/lib/chemicalml/cml/base/kpoint.rb +34 -0
- data/lib/chemicalml/cml/base/kpoint_list.rb +31 -0
- data/lib/chemicalml/cml/base/label.rb +3 -1
- data/lib/chemicalml/cml/base/lattice.rb +37 -0
- data/lib/chemicalml/cml/base/lattice_vector.rb +32 -0
- data/lib/chemicalml/cml/base/length.rb +42 -0
- data/lib/chemicalml/cml/base/line3.rb +36 -0
- data/lib/chemicalml/cml/base/link.rb +58 -0
- data/lib/chemicalml/cml/base/list.rb +3 -1
- data/lib/chemicalml/cml/base/map.rb +40 -0
- data/lib/chemicalml/cml/base/matrix.rb +13 -1
- data/lib/chemicalml/cml/base/mechanism.rb +31 -0
- data/lib/chemicalml/cml/base/mechanism_component.rb +30 -0
- data/lib/chemicalml/cml/base/metadata.rb +5 -1
- data/lib/chemicalml/cml/base/metadata_list.rb +7 -1
- data/lib/chemicalml/cml/base/molecule.rb +27 -1
- data/lib/chemicalml/cml/base/molecule_list.rb +33 -0
- data/lib/chemicalml/cml/base/name.rb +3 -1
- data/lib/chemicalml/cml/base/object.rb +34 -0
- data/lib/chemicalml/cml/base/observation.rb +32 -0
- data/lib/chemicalml/cml/base/operator.rb +32 -0
- data/lib/chemicalml/cml/base/parameter.rb +11 -1
- data/lib/chemicalml/cml/base/parameter_list.rb +7 -1
- data/lib/chemicalml/cml/base/particle.rb +36 -0
- data/lib/chemicalml/cml/base/peak.rb +70 -0
- data/lib/chemicalml/cml/base/peak_group.rb +69 -0
- data/lib/chemicalml/cml/base/peak_list.rb +35 -0
- data/lib/chemicalml/cml/base/peak_structure.rb +44 -0
- data/lib/chemicalml/cml/base/plane3.rb +32 -0
- data/lib/chemicalml/cml/base/point3.rb +32 -0
- data/lib/chemicalml/cml/base/potential.rb +30 -0
- data/lib/chemicalml/cml/base/potential_form.rb +32 -0
- data/lib/chemicalml/cml/base/potential_list.rb +31 -0
- data/lib/chemicalml/cml/base/product.rb +17 -1
- data/lib/chemicalml/cml/base/product_list.rb +15 -1
- data/lib/chemicalml/cml/base/property.rb +7 -1
- data/lib/chemicalml/cml/base/property_list.rb +7 -1
- data/lib/chemicalml/cml/base/reactant.rb +17 -1
- data/lib/chemicalml/cml/base/reactant_list.rb +15 -1
- data/lib/chemicalml/cml/base/reaction.rb +25 -1
- data/lib/chemicalml/cml/base/reaction_list.rb +13 -1
- data/lib/chemicalml/cml/base/reaction_scheme.rb +43 -0
- data/lib/chemicalml/cml/base/reaction_step.rb +41 -0
- data/lib/chemicalml/cml/base/reaction_step_list.rb +39 -0
- data/lib/chemicalml/cml/base/reactive_centre.rb +30 -0
- data/lib/chemicalml/cml/base/region.rb +36 -0
- data/lib/chemicalml/cml/base/related_entry.rb +26 -0
- data/lib/chemicalml/cml/base/sample.rb +32 -0
- data/lib/chemicalml/cml/base/scalar.rb +19 -1
- data/lib/chemicalml/cml/base/spectator.rb +30 -0
- data/lib/chemicalml/cml/base/spectator_list.rb +31 -0
- data/lib/chemicalml/cml/base/spectrum.rb +53 -0
- data/lib/chemicalml/cml/base/spectrum_data.rb +35 -0
- data/lib/chemicalml/cml/base/spectrum_list.rb +35 -0
- data/lib/chemicalml/cml/base/sphere3.rb +32 -0
- data/lib/chemicalml/cml/base/stmml.rb +28 -0
- data/lib/chemicalml/cml/base/string.rb +32 -0
- data/lib/chemicalml/cml/base/string_array.rb +40 -0
- data/lib/chemicalml/cml/base/substance.rb +13 -1
- data/lib/chemicalml/cml/base/substance_list.rb +37 -0
- data/lib/chemicalml/cml/base/symmetry.rb +36 -0
- data/lib/chemicalml/cml/base/system.rb +37 -0
- data/lib/chemicalml/cml/base/table.rb +43 -0
- data/lib/chemicalml/cml/base/table_cell.rb +30 -0
- data/lib/chemicalml/cml/base/table_content.rb +35 -0
- data/lib/chemicalml/cml/base/table_header.rb +31 -0
- data/lib/chemicalml/cml/base/table_header_cell.rb +40 -0
- data/lib/chemicalml/cml/base/table_row.rb +31 -0
- data/lib/chemicalml/cml/base/table_row_list.rb +31 -0
- data/lib/chemicalml/cml/base/tcell.rb +34 -0
- data/lib/chemicalml/cml/base/torsion.rb +44 -0
- data/lib/chemicalml/cml/base/transform3.rb +30 -0
- data/lib/chemicalml/cml/base/transition_state.rb +28 -0
- data/lib/chemicalml/cml/base/trow.rb +32 -0
- data/lib/chemicalml/cml/base/unit.rb +13 -1
- data/lib/chemicalml/cml/base/unit_list.rb +13 -1
- data/lib/chemicalml/cml/base/unit_type.rb +11 -1
- data/lib/chemicalml/cml/base/unit_type_list.rb +11 -1
- data/lib/chemicalml/cml/base/vector3.rb +32 -0
- data/lib/chemicalml/cml/base/xaxis.rb +38 -0
- data/lib/chemicalml/cml/base/yaxis.rb +38 -0
- data/lib/chemicalml/cml/base/z_matrix.rb +30 -0
- data/lib/chemicalml/cml/base.rb +102 -0
- data/lib/chemicalml/cml/elements.rb +166 -43
- data/lib/chemicalml/cml/role/abundance.rb +12 -0
- data/lib/chemicalml/cml/role/action.rb +12 -0
- data/lib/chemicalml/cml/role/action_list.rb +12 -0
- data/lib/chemicalml/cml/role/alternative.rb +10 -0
- data/lib/chemicalml/cml/role/amount.rb +12 -0
- data/lib/chemicalml/cml/role/angle.rb +12 -0
- data/lib/chemicalml/cml/role/annotation.rb +10 -0
- data/lib/chemicalml/cml/role/any_cml.rb +12 -0
- data/lib/chemicalml/cml/role/appinfo.rb +10 -0
- data/lib/chemicalml/cml/role/arg.rb +10 -0
- data/lib/chemicalml/cml/role/array_list.rb +12 -0
- data/lib/chemicalml/cml/role/atom_set.rb +12 -0
- data/lib/chemicalml/cml/role/atom_type.rb +12 -0
- data/lib/chemicalml/cml/role/atom_type_list.rb +12 -0
- data/lib/chemicalml/cml/role/atomic_basis_function.rb +12 -0
- data/lib/chemicalml/cml/role/band.rb +12 -0
- data/lib/chemicalml/cml/role/band_list.rb +12 -0
- data/lib/chemicalml/cml/role/basis_set.rb +12 -0
- data/lib/chemicalml/cml/role/bond_set.rb +12 -0
- data/lib/chemicalml/cml/role/bond_type.rb +12 -0
- data/lib/chemicalml/cml/role/bond_type_list.rb +12 -0
- data/lib/chemicalml/cml/role/cell_parameter.rb +12 -0
- data/lib/chemicalml/cml/role/cml_module.rb +2 -3
- data/lib/chemicalml/cml/role/complex_object.rb +10 -0
- data/lib/chemicalml/cml/role/condition_list.rb +12 -0
- data/lib/chemicalml/cml/role/crystal.rb +12 -0
- data/lib/chemicalml/cml/role/definition.rb +12 -0
- data/lib/chemicalml/cml/role/description.rb +12 -0
- data/lib/chemicalml/cml/role/dimension.rb +12 -0
- data/lib/chemicalml/cml/role/documentation.rb +12 -0
- data/lib/chemicalml/cml/role/eigen.rb +12 -0
- data/lib/chemicalml/cml/role/electron.rb +12 -0
- data/lib/chemicalml/cml/role/enumeration.rb +10 -0
- data/lib/chemicalml/cml/role/expression.rb +10 -0
- data/lib/chemicalml/cml/role/float.rb +10 -0
- data/lib/chemicalml/cml/role/float_array.rb +10 -0
- data/lib/chemicalml/cml/role/fragment.rb +12 -0
- data/lib/chemicalml/cml/role/fragment_list.rb +12 -0
- data/lib/chemicalml/cml/role/gradient.rb +12 -0
- data/lib/chemicalml/cml/role/integer.rb +10 -0
- data/lib/chemicalml/cml/role/integer_array.rb +10 -0
- data/lib/chemicalml/cml/role/isotope.rb +12 -0
- data/lib/chemicalml/cml/role/isotope_list.rb +12 -0
- data/lib/chemicalml/cml/role/join.rb +12 -0
- data/lib/chemicalml/cml/role/kpoint.rb +12 -0
- data/lib/chemicalml/cml/role/kpoint_list.rb +12 -0
- data/lib/chemicalml/cml/role/lattice.rb +12 -0
- data/lib/chemicalml/cml/role/lattice_vector.rb +12 -0
- data/lib/chemicalml/cml/role/length.rb +12 -0
- data/lib/chemicalml/cml/role/line3.rb +12 -0
- data/lib/chemicalml/cml/role/link.rb +12 -0
- data/lib/chemicalml/cml/role/map.rb +12 -0
- data/lib/chemicalml/cml/role/mechanism.rb +12 -0
- data/lib/chemicalml/cml/role/mechanism_component.rb +12 -0
- data/lib/chemicalml/cml/role/molecule_list.rb +12 -0
- data/lib/chemicalml/cml/role/object.rb +12 -0
- data/lib/chemicalml/cml/role/observation.rb +12 -0
- data/lib/chemicalml/cml/role/operator.rb +10 -0
- data/lib/chemicalml/cml/role/particle.rb +12 -0
- data/lib/chemicalml/cml/role/peak.rb +12 -0
- data/lib/chemicalml/cml/role/peak_group.rb +12 -0
- data/lib/chemicalml/cml/role/peak_list.rb +12 -0
- data/lib/chemicalml/cml/role/peak_structure.rb +12 -0
- data/lib/chemicalml/cml/role/plane3.rb +12 -0
- data/lib/chemicalml/cml/role/point3.rb +12 -0
- data/lib/chemicalml/cml/role/potential.rb +12 -0
- data/lib/chemicalml/cml/role/potential_form.rb +12 -0
- data/lib/chemicalml/cml/role/potential_list.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_scheme.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_step.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_step_list.rb +12 -0
- data/lib/chemicalml/cml/role/reactive_centre.rb +12 -0
- data/lib/chemicalml/cml/role/region.rb +12 -0
- data/lib/chemicalml/cml/role/related_entry.rb +10 -0
- data/lib/chemicalml/cml/role/sample.rb +12 -0
- data/lib/chemicalml/cml/role/spectator.rb +12 -0
- data/lib/chemicalml/cml/role/spectator_list.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum_data.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum_list.rb +12 -0
- data/lib/chemicalml/cml/role/sphere3.rb +12 -0
- data/lib/chemicalml/cml/role/stmml.rb +12 -0
- data/lib/chemicalml/cml/role/string.rb +10 -0
- data/lib/chemicalml/cml/role/string_array.rb +10 -0
- data/lib/chemicalml/cml/role/substance_list.rb +12 -0
- data/lib/chemicalml/cml/role/symmetry.rb +12 -0
- data/lib/chemicalml/cml/role/system.rb +12 -0
- data/lib/chemicalml/cml/role/table.rb +12 -0
- data/lib/chemicalml/cml/role/table_cell.rb +12 -0
- data/lib/chemicalml/cml/role/table_content.rb +12 -0
- data/lib/chemicalml/cml/role/table_header.rb +12 -0
- data/lib/chemicalml/cml/role/table_header_cell.rb +12 -0
- data/lib/chemicalml/cml/role/table_row.rb +12 -0
- data/lib/chemicalml/cml/role/table_row_list.rb +12 -0
- data/lib/chemicalml/cml/role/tcell.rb +10 -0
- data/lib/chemicalml/cml/role/torsion.rb +12 -0
- data/lib/chemicalml/cml/role/transform3.rb +12 -0
- data/lib/chemicalml/cml/role/transition_state.rb +12 -0
- data/lib/chemicalml/cml/role/trow.rb +10 -0
- data/lib/chemicalml/cml/role/vector3.rb +12 -0
- data/lib/chemicalml/cml/role/xaxis.rb +12 -0
- data/lib/chemicalml/cml/role/yaxis.rb +12 -0
- data/lib/chemicalml/cml/role/z_matrix.rb +12 -0
- data/lib/chemicalml/cml/role.rb +103 -1
- data/lib/chemicalml/cml/schema24/abundance.rb +13 -0
- data/lib/chemicalml/cml/schema24/action.rb +13 -0
- data/lib/chemicalml/cml/schema24/action_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/alternative.rb +14 -0
- data/lib/chemicalml/cml/schema24/amount.rb +13 -0
- data/lib/chemicalml/cml/schema24/angle.rb +13 -0
- data/lib/chemicalml/cml/schema24/annotation.rb +15 -0
- data/lib/chemicalml/cml/schema24/any_cml.rb +13 -0
- data/lib/chemicalml/cml/schema24/appinfo.rb +15 -0
- data/lib/chemicalml/cml/schema24/arg.rb +14 -0
- data/lib/chemicalml/cml/schema24/array.rb +15 -0
- data/lib/chemicalml/cml/schema24/array_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_array.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_parity.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom_type.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/atomic_basis_function.rb +13 -0
- data/lib/chemicalml/cml/schema24/band.rb +13 -0
- data/lib/chemicalml/cml/schema24/band_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/basis_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_array.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond_stereo.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_type.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/cell_parameter.rb +13 -0
- data/lib/chemicalml/cml/schema24/cml_module.rb +18 -0
- data/lib/chemicalml/cml/schema24/complex_object.rb +14 -0
- data/lib/chemicalml/cml/schema24/condition_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/configuration.rb +5 -2
- data/lib/chemicalml/cml/schema24/context.rb +18 -0
- data/lib/chemicalml/cml/schema24/crystal.rb +13 -0
- data/lib/chemicalml/cml/schema24/definition.rb +13 -0
- data/lib/chemicalml/cml/schema24/description.rb +13 -0
- data/lib/chemicalml/cml/schema24/dictionary.rb +15 -0
- data/lib/chemicalml/cml/schema24/dictionary_entry.rb +15 -0
- data/lib/chemicalml/cml/schema24/dimension.rb +13 -0
- data/lib/chemicalml/cml/schema24/document.rb +15 -0
- data/lib/chemicalml/cml/schema24/documentation.rb +13 -0
- data/lib/chemicalml/cml/schema24/eigen.rb +13 -0
- data/lib/chemicalml/cml/schema24/electron.rb +13 -0
- data/lib/chemicalml/cml/schema24/enumeration.rb +16 -0
- data/lib/chemicalml/cml/schema24/expression.rb +14 -0
- data/lib/chemicalml/cml/schema24/float.rb +14 -0
- data/lib/chemicalml/cml/schema24/float_array.rb +14 -0
- data/lib/chemicalml/cml/schema24/formula.rb +15 -0
- data/lib/chemicalml/cml/schema24/fragment.rb +13 -0
- data/lib/chemicalml/cml/schema24/fragment_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/gradient.rb +13 -0
- data/lib/chemicalml/cml/schema24/identifier.rb +15 -0
- data/lib/chemicalml/cml/schema24/integer.rb +14 -0
- data/lib/chemicalml/cml/schema24/integer_array.rb +14 -0
- data/lib/chemicalml/cml/schema24/isotope.rb +13 -0
- data/lib/chemicalml/cml/schema24/isotope_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/join.rb +13 -0
- data/lib/chemicalml/cml/schema24/kpoint.rb +13 -0
- data/lib/chemicalml/cml/schema24/kpoint_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/label.rb +15 -0
- data/lib/chemicalml/cml/schema24/lattice.rb +13 -0
- data/lib/chemicalml/cml/schema24/lattice_vector.rb +13 -0
- data/lib/chemicalml/cml/schema24/length.rb +13 -0
- data/lib/chemicalml/cml/schema24/line3.rb +13 -0
- data/lib/chemicalml/cml/schema24/link.rb +13 -0
- data/lib/chemicalml/cml/schema24/list.rb +15 -0
- data/lib/chemicalml/cml/schema24/map.rb +13 -0
- data/lib/chemicalml/cml/schema24/matrix.rb +15 -0
- data/lib/chemicalml/cml/schema24/mechanism.rb +13 -0
- data/lib/chemicalml/cml/schema24/mechanism_component.rb +13 -0
- data/lib/chemicalml/cml/schema24/metadata.rb +15 -0
- data/lib/chemicalml/cml/schema24/metadata_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/molecule.rb +15 -0
- data/lib/chemicalml/cml/schema24/molecule_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/name.rb +15 -0
- data/lib/chemicalml/cml/schema24/object.rb +13 -0
- data/lib/chemicalml/cml/schema24/observation.rb +13 -0
- data/lib/chemicalml/cml/schema24/operator.rb +14 -0
- data/lib/chemicalml/cml/schema24/parameter.rb +15 -0
- data/lib/chemicalml/cml/schema24/parameter_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/particle.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_group.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_structure.rb +13 -0
- data/lib/chemicalml/cml/schema24/plane3.rb +13 -0
- data/lib/chemicalml/cml/schema24/point3.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential_form.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/product.rb +15 -0
- data/lib/chemicalml/cml/schema24/product_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/property.rb +15 -0
- data/lib/chemicalml/cml/schema24/property_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reactant.rb +15 -0
- data/lib/chemicalml/cml/schema24/reactant_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction_scheme.rb +13 -0
- data/lib/chemicalml/cml/schema24/reaction_step.rb +13 -0
- data/lib/chemicalml/cml/schema24/reaction_step_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/reactive_centre.rb +13 -0
- data/lib/chemicalml/cml/schema24/region.rb +13 -0
- data/lib/chemicalml/cml/schema24/related_entry.rb +14 -0
- data/lib/chemicalml/cml/schema24/sample.rb +13 -0
- data/lib/chemicalml/cml/schema24/scalar.rb +15 -0
- data/lib/chemicalml/cml/schema24/spectator.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectator_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum_data.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/sphere3.rb +13 -0
- data/lib/chemicalml/cml/schema24/stmml.rb +13 -0
- data/lib/chemicalml/cml/schema24/string.rb +14 -0
- data/lib/chemicalml/cml/schema24/string_array.rb +14 -0
- data/lib/chemicalml/cml/schema24/substance.rb +15 -0
- data/lib/chemicalml/cml/schema24/substance_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/symmetry.rb +13 -0
- data/lib/chemicalml/cml/schema24/system.rb +13 -0
- data/lib/chemicalml/cml/schema24/table.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_cell.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_content.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_header.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_header_cell.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_row.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_row_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/tcell.rb +14 -0
- data/lib/chemicalml/cml/schema24/torsion.rb +13 -0
- data/lib/chemicalml/cml/schema24/transform3.rb +13 -0
- data/lib/chemicalml/cml/schema24/transition_state.rb +13 -0
- data/lib/chemicalml/cml/schema24/trow.rb +14 -0
- data/lib/chemicalml/cml/schema24/unit.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_type.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_type_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/vector3.rb +13 -0
- data/lib/chemicalml/cml/schema24/xaxis.rb +13 -0
- data/lib/chemicalml/cml/schema24/yaxis.rb +13 -0
- data/lib/chemicalml/cml/schema24/z_matrix.rb +13 -0
- data/lib/chemicalml/cml/schema24.rb +159 -19
- data/lib/chemicalml/cml/schema3/abundance.rb +13 -0
- data/lib/chemicalml/cml/schema3/action.rb +13 -0
- data/lib/chemicalml/cml/schema3/action_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/amount.rb +13 -0
- data/lib/chemicalml/cml/schema3/angle.rb +13 -0
- data/lib/chemicalml/cml/schema3/any_cml.rb +13 -0
- data/lib/chemicalml/cml/schema3/array.rb +15 -0
- data/lib/chemicalml/cml/schema3/array_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_array.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_parity.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom_type.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/atomic_basis_function.rb +13 -0
- data/lib/chemicalml/cml/schema3/band.rb +13 -0
- data/lib/chemicalml/cml/schema3/band_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/basis_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_array.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond_stereo.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_type.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/cell_parameter.rb +13 -0
- data/lib/chemicalml/cml/schema3/cml_module.rb +15 -0
- data/lib/chemicalml/cml/schema3/condition_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/context.rb +18 -0
- data/lib/chemicalml/cml/schema3/crystal.rb +13 -0
- data/lib/chemicalml/cml/schema3/definition.rb +13 -0
- data/lib/chemicalml/cml/schema3/description.rb +13 -0
- data/lib/chemicalml/cml/schema3/dictionary.rb +15 -0
- data/lib/chemicalml/cml/schema3/dictionary_entry.rb +15 -0
- data/lib/chemicalml/cml/schema3/dimension.rb +13 -0
- data/lib/chemicalml/cml/schema3/document.rb +15 -0
- data/lib/chemicalml/cml/schema3/documentation.rb +13 -0
- data/lib/chemicalml/cml/schema3/eigen.rb +13 -0
- data/lib/chemicalml/cml/schema3/electron.rb +13 -0
- data/lib/chemicalml/cml/schema3/formula.rb +15 -0
- data/lib/chemicalml/cml/schema3/fragment.rb +13 -0
- data/lib/chemicalml/cml/schema3/fragment_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/gradient.rb +13 -0
- data/lib/chemicalml/cml/schema3/identifier.rb +15 -0
- data/lib/chemicalml/cml/schema3/isotope.rb +13 -0
- data/lib/chemicalml/cml/schema3/isotope_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/join.rb +13 -0
- data/lib/chemicalml/cml/schema3/kpoint.rb +13 -0
- data/lib/chemicalml/cml/schema3/kpoint_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/label.rb +15 -0
- data/lib/chemicalml/cml/schema3/lattice.rb +13 -0
- data/lib/chemicalml/cml/schema3/lattice_vector.rb +13 -0
- data/lib/chemicalml/cml/schema3/length.rb +13 -0
- data/lib/chemicalml/cml/schema3/line3.rb +13 -0
- data/lib/chemicalml/cml/schema3/link.rb +13 -0
- data/lib/chemicalml/cml/schema3/list.rb +15 -0
- data/lib/chemicalml/cml/schema3/map.rb +13 -0
- data/lib/chemicalml/cml/schema3/matrix.rb +15 -0
- data/lib/chemicalml/cml/schema3/mechanism.rb +13 -0
- data/lib/chemicalml/cml/schema3/mechanism_component.rb +13 -0
- data/lib/chemicalml/cml/schema3/metadata.rb +15 -0
- data/lib/chemicalml/cml/schema3/metadata_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/molecule.rb +15 -0
- data/lib/chemicalml/cml/schema3/molecule_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/name.rb +15 -0
- data/lib/chemicalml/cml/schema3/object.rb +13 -0
- data/lib/chemicalml/cml/schema3/observation.rb +13 -0
- data/lib/chemicalml/cml/schema3/parameter.rb +15 -0
- data/lib/chemicalml/cml/schema3/parameter_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/particle.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_group.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_structure.rb +13 -0
- data/lib/chemicalml/cml/schema3/plane3.rb +13 -0
- data/lib/chemicalml/cml/schema3/point3.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential_form.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/product.rb +15 -0
- data/lib/chemicalml/cml/schema3/product_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/property.rb +15 -0
- data/lib/chemicalml/cml/schema3/property_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reactant.rb +15 -0
- data/lib/chemicalml/cml/schema3/reactant_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction_scheme.rb +13 -0
- data/lib/chemicalml/cml/schema3/reaction_step.rb +13 -0
- data/lib/chemicalml/cml/schema3/reaction_step_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/reactive_centre.rb +13 -0
- data/lib/chemicalml/cml/schema3/region.rb +13 -0
- data/lib/chemicalml/cml/schema3/sample.rb +13 -0
- data/lib/chemicalml/cml/schema3/scalar.rb +15 -0
- data/lib/chemicalml/cml/schema3/spectator.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectator_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum_data.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/sphere3.rb +13 -0
- data/lib/chemicalml/cml/schema3/stmml.rb +13 -0
- data/lib/chemicalml/cml/schema3/substance.rb +15 -0
- data/lib/chemicalml/cml/schema3/substance_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/symmetry.rb +13 -0
- data/lib/chemicalml/cml/schema3/system.rb +13 -0
- data/lib/chemicalml/cml/schema3/table.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_cell.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_content.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_header.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_header_cell.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_row.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_row_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/torsion.rb +13 -0
- data/lib/chemicalml/cml/schema3/transform3.rb +13 -0
- data/lib/chemicalml/cml/schema3/transition_state.rb +13 -0
- data/lib/chemicalml/cml/schema3/unit.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_type.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_type_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/vector3.rb +13 -0
- data/lib/chemicalml/cml/schema3/xaxis.rb +13 -0
- data/lib/chemicalml/cml/schema3/yaxis.rb +13 -0
- data/lib/chemicalml/cml/schema3/z_matrix.rb +13 -0
- data/lib/chemicalml/cml/schema3.rb +132 -17
- data/lib/chemicalml/cml/wire_class_registry.rb +42 -0
- data/lib/chemicalml/cml.rb +136 -44
- data/lib/chemicalml/context_configuration.rb +8 -2
- data/lib/chemicalml/convention/base.rb +17 -3
- data/lib/chemicalml/convention/compchem/constraints/array_rules.rb +44 -0
- data/lib/chemicalml/convention/compchem/constraints/calculation_requires_finalization.rb +28 -0
- data/lib/chemicalml/convention/compchem/constraints/compchem_module_must_contain_job_list.rb +4 -4
- data/lib/chemicalml/convention/compchem/constraints/environment_at_most_one_property_list.rb +26 -0
- data/lib/chemicalml/convention/compchem/constraints/environment_must_not_contain_parameter.rb +28 -0
- data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_molecule.rb +26 -0
- data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_property_list.rb +26 -0
- data/lib/chemicalml/convention/compchem/constraints/finalization_must_not_contain_parameter.rb +27 -0
- data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_molecule.rb +26 -0
- data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_parameter_list.rb +26 -0
- data/lib/chemicalml/convention/compchem/constraints/initialization_must_not_contain_property.rb +28 -0
- data/lib/chemicalml/convention/compchem/constraints/job_list_module_must_have_id.rb +24 -0
- data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_environment.rb +25 -0
- data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_finalization.rb +25 -0
- data/lib/chemicalml/convention/compchem/constraints/job_module_must_have_id.rb +24 -0
- data/lib/chemicalml/convention/compchem/constraints/job_must_contain_initialization.rb +6 -9
- data/lib/chemicalml/convention/compchem/constraints/matrix_rules.rb +48 -0
- data/lib/chemicalml/convention/compchem/constraints/module_predicates.rb +50 -0
- data/lib/chemicalml/convention/compchem/constraints/scalar_units.rb +42 -0
- data/lib/chemicalml/convention/compchem/constraints.rb +36 -2
- data/lib/chemicalml/convention/compchem.rb +16 -0
- data/lib/chemicalml/convention/constraint.rb +31 -18
- data/lib/chemicalml/convention/coordinator.rb +89 -0
- data/lib/chemicalml/convention/detection.rb +33 -0
- data/lib/chemicalml/convention/dictionary/constraints/dictionary_must_have_namespace.rb +28 -0
- data/lib/chemicalml/convention/dictionary/constraints/dictionary_namespace_should_end_with_slash_or_hash.rb +32 -0
- data/lib/chemicalml/convention/dictionary/constraints/entry_id_must_match_pattern.rb +33 -0
- data/lib/chemicalml/convention/dictionary/constraints/entry_ids_unique_within_dictionary.rb +3 -3
- data/lib/chemicalml/convention/dictionary/constraints/entry_must_contain_definition.rb +28 -0
- data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_id_and_term.rb +5 -5
- data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_unit_type.rb +30 -0
- data/lib/chemicalml/convention/dictionary/constraints/entry_units_co_constraints.rb +44 -0
- data/lib/chemicalml/convention/dictionary/constraints.rb +12 -0
- data/lib/chemicalml/convention/dictionary.rb +6 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_array_must_be_child_of_molecule_or_formula.rb +40 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_array_must_contain_atoms.rb +3 -3
- data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +32 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +26 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_ids_unique_within_molecule.rb +2 -2
- data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_array_must_be_child_of_molecule.rb +36 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_ids_unique_within_molecule.rb +43 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_must_reference_atoms_in_same_molecule.rb +3 -3
- data/lib/chemicalml/convention/molecular/constraints/bond_order_other_must_have_dict_ref.rb +33 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +27 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_stereo_cis_trans_must_have_atom_refs4.rb +45 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_stereo_other_must_have_dict_ref.rb +32 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_stereo_wedge_hash_must_have_atom_refs2.rb +45 -0
- data/lib/chemicalml/convention/molecular/constraints/molecule_atom_array_mutually_exclusive_with_children.rb +32 -0
- data/lib/chemicalml/convention/molecular/constraints/molecule_bond_array_mutually_exclusive_with_children.rb +31 -0
- data/lib/chemicalml/convention/molecular/constraints/molecule_count_must_not_appear_on_top_level.rb +34 -0
- data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints.rb +40 -3
- data/lib/chemicalml/convention/molecular.rb +20 -0
- data/lib/chemicalml/convention/registry.rb +17 -0
- data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_contain_at_least_one_unit.rb +28 -0
- data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_have_namespace.rb +36 -0
- data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_contain_definition.rb +27 -0
- data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_id.rb +27 -0
- data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_symbol_and_unit_type.rb +3 -3
- data/lib/chemicalml/convention/unit_dictionary/constraints.rb +9 -1
- data/lib/chemicalml/convention/unit_dictionary.rb +4 -0
- data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_id_must_match_pattern.rb +31 -0
- data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_contain_at_least_one_unit_type.rb +27 -0
- data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_have_namespace.rb +35 -0
- data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_contain_definition.rb +27 -0
- data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_have_id_and_name.rb +5 -5
- data/lib/chemicalml/convention/unit_type_dictionary/constraints.rb +9 -1
- data/lib/chemicalml/convention/unit_type_dictionary.rb +4 -0
- data/lib/chemicalml/convention/validation_report.rb +63 -0
- data/lib/chemicalml/convention.rb +11 -0
- data/lib/chemicalml/dictionary/entry.rb +6 -6
- data/lib/chemicalml/dictionary/enum.rb +1 -1
- data/lib/chemicalml/dictionary/link.rb +3 -3
- data/lib/chemicalml/dictionary/loader.rb +19 -19
- data/lib/chemicalml/dictionary/model.rb +5 -5
- data/lib/chemicalml/dictionary/registry.rb +9 -9
- data/lib/chemicalml/version.rb +1 -1
- data/lib/chemicalml/versioned_parser.rb +71 -12
- data/lib/chemicalml.rb +4 -3
- metadata +594 -69
- data/lib/chemicalml/cml/array.rb +0 -10
- data/lib/chemicalml/cml/atom.rb +0 -10
- data/lib/chemicalml/cml/atom_array.rb +0 -10
- data/lib/chemicalml/cml/atom_parity.rb +0 -10
- data/lib/chemicalml/cml/bond.rb +0 -10
- data/lib/chemicalml/cml/bond_array.rb +0 -10
- data/lib/chemicalml/cml/bond_stereo.rb +0 -10
- data/lib/chemicalml/cml/cml_module.rb +0 -10
- data/lib/chemicalml/cml/dictionary.rb +0 -10
- data/lib/chemicalml/cml/dictionary_entry.rb +0 -10
- data/lib/chemicalml/cml/document.rb +0 -10
- data/lib/chemicalml/cml/formula.rb +0 -10
- data/lib/chemicalml/cml/identifier.rb +0 -10
- data/lib/chemicalml/cml/label.rb +0 -10
- data/lib/chemicalml/cml/list.rb +0 -10
- data/lib/chemicalml/cml/matrix.rb +0 -10
- data/lib/chemicalml/cml/metadata.rb +0 -10
- data/lib/chemicalml/cml/metadata_list.rb +0 -10
- data/lib/chemicalml/cml/molecule.rb +0 -10
- data/lib/chemicalml/cml/name.rb +0 -10
- data/lib/chemicalml/cml/parameter.rb +0 -10
- data/lib/chemicalml/cml/parameter_list.rb +0 -10
- data/lib/chemicalml/cml/product.rb +0 -10
- data/lib/chemicalml/cml/product_list.rb +0 -10
- data/lib/chemicalml/cml/property.rb +0 -10
- data/lib/chemicalml/cml/property_list.rb +0 -10
- data/lib/chemicalml/cml/reactant.rb +0 -10
- data/lib/chemicalml/cml/reactant_list.rb +0 -10
- data/lib/chemicalml/cml/reaction.rb +0 -10
- data/lib/chemicalml/cml/reaction_list.rb +0 -10
- data/lib/chemicalml/cml/scalar.rb +0 -10
- data/lib/chemicalml/cml/substance.rb +0 -10
- data/lib/chemicalml/cml/translator/value_translations.rb +0 -265
- data/lib/chemicalml/cml/translator.rb +0 -233
- data/lib/chemicalml/cml/unit.rb +0 -10
- data/lib/chemicalml/cml/unit_list.rb +0 -10
- data/lib/chemicalml/cml/unit_type.rb +0 -10
- data/lib/chemicalml/cml/unit_type_list.rb +0 -10
- data/lib/chemicalml/cml/wire_class_macro.rb +0 -45
- data/lib/chemicalml/model/atom.rb +0 -40
- data/lib/chemicalml/model/bond.rb +0 -33
- data/lib/chemicalml/model/cml_array.rb +0 -27
- data/lib/chemicalml/model/cml_module.rb +0 -45
- data/lib/chemicalml/model/document.rb +0 -29
- data/lib/chemicalml/model/formula.rb +0 -34
- data/lib/chemicalml/model/identifier.rb +0 -21
- data/lib/chemicalml/model/label.rb +0 -21
- data/lib/chemicalml/model/matrix.rb +0 -29
- data/lib/chemicalml/model/metadata.rb +0 -23
- data/lib/chemicalml/model/metadata_list.rb +0 -25
- data/lib/chemicalml/model/molecule.rb +0 -38
- data/lib/chemicalml/model/name.rb +0 -21
- data/lib/chemicalml/model/node.rb +0 -45
- data/lib/chemicalml/model/parameter.rb +0 -27
- data/lib/chemicalml/model/parameter_list.rb +0 -25
- data/lib/chemicalml/model/product.rb +0 -21
- data/lib/chemicalml/model/product_list.rb +0 -21
- data/lib/chemicalml/model/property.rb +0 -28
- data/lib/chemicalml/model/property_list.rb +0 -25
- data/lib/chemicalml/model/reactant.rb +0 -21
- data/lib/chemicalml/model/reactant_list.rb +0 -21
- data/lib/chemicalml/model/reaction.rb +0 -41
- data/lib/chemicalml/model/reaction_list.rb +0 -23
- data/lib/chemicalml/model/scalar.rb +0 -25
- data/lib/chemicalml/model/substance.rb +0 -25
- data/lib/chemicalml/model.rb +0 -38
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 21 — Encapsulate translator internals
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** 19, 20
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
The Translator has 17 public class methods today. Only `to_canonical`
|
|
9
|
+
and `from_canonical` are part of the public API. Every helper
|
|
10
|
+
(`molecule_to_canonical`, `atom_from_canonical`, `cml_order_to_kind`,
|
|
11
|
+
etc.) is an implementation detail and should be private.
|
|
12
|
+
|
|
13
|
+
## Why
|
|
14
|
+
|
|
15
|
+
- Public API surface = mental load for users. They see 17 methods and
|
|
16
|
+
wonder which to use.
|
|
17
|
+
- Internal helpers shouldn't be callable from outside — encapsulation
|
|
18
|
+
violation.
|
|
19
|
+
- Risk: a future refactor (e.g. visitor pattern) would need to keep
|
|
20
|
+
these as public for backward compat.
|
|
21
|
+
|
|
22
|
+
## Deliverables
|
|
23
|
+
|
|
24
|
+
- [ ] Add `private_class_method` for every helper method on
|
|
25
|
+
`Translator`.
|
|
26
|
+
- [ ] Same for `ValueTranslations::ClassMethods` helpers.
|
|
27
|
+
- [ ] Verify no spec or external code calls the helpers directly.
|
|
28
|
+
|
|
29
|
+
## Acceptance
|
|
30
|
+
|
|
31
|
+
- `Chemicalml::Cml::Translator.public_methods(false)` returns only
|
|
32
|
+
`to_canonical` and `from_canonical`.
|
|
33
|
+
- All specs still pass.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 22 — DRY role modules
|
|
2
|
+
|
|
3
|
+
**Status:** rejected
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal (rejected)
|
|
7
|
+
|
|
8
|
+
Replace 36 nearly-identical Role module files with a single
|
|
9
|
+
`Elements::ALL.each_key { const_set(class_name, Module.new) }`
|
|
10
|
+
block.
|
|
11
|
+
|
|
12
|
+
## Why rejected
|
|
13
|
+
|
|
14
|
+
`const_set(class_name, Module.new)` is **eager** — every role module
|
|
15
|
+
is created when `cml/role.rb` loads. The user's global rule mandates
|
|
16
|
+
**autoload** (lazy file loading), not `const_set`. The two are not
|
|
17
|
+
equivalent:
|
|
18
|
+
|
|
19
|
+
- `autoload :Foo, "path"` — registers a hook; the file loads only
|
|
20
|
+
when `Foo` is first referenced. Enables lazy loading, avoids
|
|
21
|
+
circular dependencies, keeps the load path clean.
|
|
22
|
+
- `const_set(:Foo, Module.new)` — creates the constant eagerly at
|
|
23
|
+
file-load time. No lazy loading.
|
|
24
|
+
|
|
25
|
+
The 36 tiny role files are the price of admission for the lazy-load
|
|
26
|
+
guarantee. They stay.
|
|
27
|
+
|
|
28
|
+
## Acceptance
|
|
29
|
+
|
|
30
|
+
- Keep the 36 individual role files under `lib/chemicalml/cml/role/`.
|
|
31
|
+
- Keep the autoload declarations in `lib/chemicalml/cml/role.rb`.
|
|
32
|
+
- Do not use `const_set` for role modules.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 23 — Final spec + lint pass
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** all
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Run the full suite, audit forbidden patterns, document final state.
|
|
9
|
+
|
|
10
|
+
## Deliverables
|
|
11
|
+
|
|
12
|
+
- [ ] `bundle exec rspec spec/chemicalml/` green.
|
|
13
|
+
- [ ] `Chemicalml::Cml::Translator.public_methods(false)` returns only
|
|
14
|
+
`to_canonical` and `from_canonical`.
|
|
15
|
+
- [ ] No hardcoded `Cml::Foo.new` in translator files.
|
|
16
|
+
- [ ] `from_canonical(schema: :schema24)` produces Schema24 children
|
|
17
|
+
at every level (spec verification).
|
|
18
|
+
- [ ] `lib/chemicalml/cml/role/` directory removed.
|
|
19
|
+
- [ ] Zero `require_relative`, `respond_to?`, `instance_variable_set`/`get`,
|
|
20
|
+
private `send` in lib/.
|
|
21
|
+
- [ ] TODO.align/README.round3.md marked complete.
|
|
22
|
+
|
|
23
|
+
## Acceptance
|
|
24
|
+
|
|
25
|
+
All checks pass.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 24 — Autoload wire classes (revert round-2 task 12)
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Replace the `const_set`-based wire class generation in `schema3.rb`
|
|
9
|
+
and `schema24.rb` with per-class files loaded via `autoload`.
|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
|
|
13
|
+
Round 2 task 12 consolidated 72 per-class files into two `const_set`
|
|
14
|
+
loops. The user later pushed back on the same `const_set` pattern in
|
|
15
|
+
role modules — `const_set` is eager, not autoload. The same logic
|
|
16
|
+
applies here: `autoload` is required for lazy loading.
|
|
17
|
+
|
|
18
|
+
## Design
|
|
19
|
+
|
|
20
|
+
To avoid 72 nearly-identical boilerplate files, each schema gets a
|
|
21
|
+
`Context` module that provides `lutaml_default_register`:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
# lib/chemicalml/cml/schema3/context.rb
|
|
25
|
+
module Chemicalml
|
|
26
|
+
module Cml
|
|
27
|
+
module Schema3
|
|
28
|
+
module Context
|
|
29
|
+
def lutaml_default_register
|
|
30
|
+
:chemicalml_schema3
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Each per-class file is then minimal:
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
# lib/chemicalml/cml/schema3/atom.rb
|
|
42
|
+
module Chemicalml
|
|
43
|
+
module Cml
|
|
44
|
+
module Schema3
|
|
45
|
+
class Atom < Lutaml::Model::Serializable
|
|
46
|
+
include Base::Atom
|
|
47
|
+
include Visitable
|
|
48
|
+
extend Context
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
And `schema3.rb` declares autoloads:
|
|
56
|
+
|
|
57
|
+
```ruby
|
|
58
|
+
module Schema3
|
|
59
|
+
autoload :Atom, "chemicalml/cml/schema3/atom"
|
|
60
|
+
autoload :Molecule, "chemicalml/cml/schema3/molecule"
|
|
61
|
+
# ...
|
|
62
|
+
end
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Deliverables
|
|
66
|
+
|
|
67
|
+
- [ ] `lib/chemicalml/cml/schema3/context.rb` — provides
|
|
68
|
+
`lutaml_default_register` returning `:chemicalml_schema3`.
|
|
69
|
+
- [ ] `lib/chemicalml/cml/schema24/context.rb` — same for
|
|
70
|
+
`:chemicalml_schema24`.
|
|
71
|
+
- [ ] 36 per-class files under `lib/chemicalml/cml/schema3/` (one
|
|
72
|
+
per element in `Elements::ALL`).
|
|
73
|
+
- [ ] 35 per-class files under `lib/chemicalml/cml/schema24/` (no
|
|
74
|
+
`Module` — schema 2.4 lacks it).
|
|
75
|
+
- [ ] `schema3.rb` / `schema24.rb` rewritten with autoloads only,
|
|
76
|
+
no `const_set`.
|
|
77
|
+
- [ ] All specs pass.
|
|
78
|
+
|
|
79
|
+
## Acceptance
|
|
80
|
+
|
|
81
|
+
- `grep -rn 'const_set' lib/chemicalml/cml/schema3.rb
|
|
82
|
+
lib/chemicalml/cml/schema24.rb` returns nothing.
|
|
83
|
+
- `Schema3::Atom` loads lazily (only when referenced).
|
|
84
|
+
- All 155+ specs still pass.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 25 — value_container schema-awareness
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
`Chemicalml::Cml::Translator::ValueTranslations` provides
|
|
9
|
+
`scalar_from_canonical`, `array_from_canonical`,
|
|
10
|
+
`matrix_from_canonical`, `value_container_from_canonical`, etc. All
|
|
11
|
+
of them hardcode `Cml::Scalar` / `Cml::Array` / `Cml::Matrix` (which
|
|
12
|
+
are Schema3 aliases).
|
|
13
|
+
|
|
14
|
+
When `Translator.from_canonical(doc, schema: :schema24)` is called
|
|
15
|
+
and the document has properties with scalar values, the scalars end
|
|
16
|
+
up as `Schema3::Scalar` instances inside `Schema24::Property` objects
|
|
17
|
+
— same kind of bug we just fixed for Document → Molecule → Atom.
|
|
18
|
+
|
|
19
|
+
## Why
|
|
20
|
+
|
|
21
|
+
Consistency. The Translator's main `from_canonical` is now
|
|
22
|
+
schema-aware via `WireClassRegistry`. The value-container path should
|
|
23
|
+
be too.
|
|
24
|
+
|
|
25
|
+
## Deliverables
|
|
26
|
+
|
|
27
|
+
- [ ] `scalar_from_canonical(scalar, schema:)`,
|
|
28
|
+
`array_from_canonical(array, schema:)`,
|
|
29
|
+
`matrix_from_canonical(matrix, schema:)` — take schema, look
|
|
30
|
+
up wire class via `WireClassRegistry`.
|
|
31
|
+
- [ ] `value_container_from_canonical(value, schema:)` — passes
|
|
32
|
+
schema through.
|
|
33
|
+
- [ ] `property_from_canonical(prop, schema:)`,
|
|
34
|
+
`parameter_from_canonical(param, schema:)` — passes schema to
|
|
35
|
+
value_container_from_canonical.
|
|
36
|
+
- [ ] All callers updated.
|
|
37
|
+
- [ ] Spec verifying `Schema24::Property` has `Schema24::Scalar`
|
|
38
|
+
children.
|
|
39
|
+
|
|
40
|
+
## Acceptance
|
|
41
|
+
|
|
42
|
+
- A round-trip canonical → Schema24 wire with a property+scalar
|
|
43
|
+
produces `Schema24::Property` with a `Schema24::Scalar` value.
|
|
44
|
+
- All specs pass.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 26 — Remove dead wire_class_macro.rb
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
`lib/chemicalml/cml/wire_class_macro.rb` is dead code — a leftover
|
|
9
|
+
from the round-2 macro experiment. Nothing references it. Remove.
|
|
10
|
+
|
|
11
|
+
## Acceptance
|
|
12
|
+
|
|
13
|
+
- `lib/chemicalml/cml/wire_class_macro.rb` deleted.
|
|
14
|
+
- No references to `WireClassMacro` or `define_wire_classes` in lib/
|
|
15
|
+
or spec/.
|
|
16
|
+
- All specs pass.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 27 — Final spec + lint pass
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** all
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Verify the round-4 changes don't regress anything and the autoload
|
|
9
|
+
rule is now satisfied everywhere it can be.
|
|
10
|
+
|
|
11
|
+
## Deliverables
|
|
12
|
+
|
|
13
|
+
- [ ] `bundle exec rspec spec/chemicalml/` green.
|
|
14
|
+
- [ ] `grep -rn 'const_set' lib/chemicalml/cml/schema3.rb
|
|
15
|
+
lib/chemicalml/cml/schema24.rb` clean.
|
|
16
|
+
- [ ] `grep -rn 'require_relative' lib/` clean.
|
|
17
|
+
- [ ] `grep -rn '^require .chemicalml' lib/` clean.
|
|
18
|
+
- [ ] `grep -rn 'respond_to?' lib/` clean.
|
|
19
|
+
- [ ] `grep -rn 'instance_variable_set\|instance_variable_get' lib/`
|
|
20
|
+
clean.
|
|
21
|
+
- [ ] `grep -rnE '[^a-zA-Z_\.]send[ ]*\(' lib/` clean.
|
|
22
|
+
- [ ] TODO.align/README.round4.md shows every workstream complete.
|
|
23
|
+
|
|
24
|
+
## Acceptance
|
|
25
|
+
|
|
26
|
+
All checks pass.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 28 — Model::AtomParity + Model::BondStereo
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Add canonical Model classes for the CML stereo elements `<atomParity>`
|
|
9
|
+
and `<bondStereo>`. Wire classes exist; the canonical layer is
|
|
10
|
+
missing.
|
|
11
|
+
|
|
12
|
+
## Why
|
|
13
|
+
|
|
14
|
+
CML's molecular convention uses `<atomParity>` (atom-centre chirality)
|
|
15
|
+
and `<bondStereo>` (cis/trans + wedge/hatch) to represent
|
|
16
|
+
stereochemistry. Without canonical classes, the gem can parse these
|
|
17
|
+
elements but can't represent them in the format-agnostic model —
|
|
18
|
+
forcing callers to drop stereo info when going through canonical.
|
|
19
|
+
|
|
20
|
+
## Deliverables
|
|
21
|
+
|
|
22
|
+
- [ ] `lib/chemicalml/model/atom_parity.rb` — Model::AtomParity with
|
|
23
|
+
`atom_refs4` (four atom IDs as array) and `value` (typically
|
|
24
|
+
`"1"`, `"-1"`, `"0"`).
|
|
25
|
+
- [ ] `lib/chemicalml/model/bond_stereo.rb` — Model::BondStereo with
|
|
26
|
+
`atom_refs2` (optional array), `atom_refs4` (optional array),
|
|
27
|
+
`dict_ref` (optional), `value` (the convention letter: `"W"`,
|
|
28
|
+
`"H"`, `"C"`, `"T"`, `"other"`).
|
|
29
|
+
- [ ] Both classes inherit from `Model::Node` and implement
|
|
30
|
+
`value_attributes`.
|
|
31
|
+
- [ ] Autoloads declared in `lib/chemicalml/model.rb`.
|
|
32
|
+
- [ ] Specs.
|
|
33
|
+
|
|
34
|
+
## Acceptance
|
|
35
|
+
|
|
36
|
+
- `Chemicalml::Model::AtomParity.new(atom_refs4: %w[a1 a2 a3 a4], value: "1")`
|
|
37
|
+
works.
|
|
38
|
+
- `Chemicalml::Model::BondStereo.new(atom_refs4: %w[a1 a2 a3 a4], value: "C")`
|
|
39
|
+
works.
|
|
40
|
+
- Specs pass.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# 29 — Wire Atom/Bond to carry stereo children
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** 28
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Today `Base::Atom` doesn't declare an `atom_parity` child attribute.
|
|
9
|
+
Same for `Base::Bond` and `bond_stereo`. So parsing a fixture with
|
|
10
|
+
`<atom><atomParity .../></atom>` silently drops the parity. Add the
|
|
11
|
+
child attributes to the Base mixins.
|
|
12
|
+
|
|
13
|
+
## Why
|
|
14
|
+
|
|
15
|
+
Without this, the wire classes can't represent stereo even though
|
|
16
|
+
their dedicated wire classes (AtomParity, BondStereo) exist.
|
|
17
|
+
|
|
18
|
+
## Deliverables
|
|
19
|
+
|
|
20
|
+
- [ ] `Base::Atom` declares `attribute :atom_parity, :atomParity`
|
|
21
|
+
and `xml do map_element "atomParity", to: :atom_parity end`.
|
|
22
|
+
- [ ] `Base::Bond` declares `attribute :bond_stereo, :bondStereo`
|
|
23
|
+
and `xml do map_element "bondStereo", to: :bond_stereo end`.
|
|
24
|
+
- [ ] Parse a fixture with `<atomParity>` and confirm it's loaded.
|
|
25
|
+
- [ ] Round-trip preserves the child.
|
|
26
|
+
|
|
27
|
+
## Acceptance
|
|
28
|
+
|
|
29
|
+
- Parsing `ethene_with_bond_stereo.cml` retains the bondStereo.
|
|
30
|
+
- Parsing `chiral_center.cml` retains the atomParity.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 30 — Translator rules for stereo
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** 28, 29
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Add Translator rules so stereo elements round-trip through the
|
|
9
|
+
canonical Model:
|
|
10
|
+
|
|
11
|
+
- `atom_parity_to_canonical` / `atom_parity_from_canonical`
|
|
12
|
+
- `bond_stereo_to_canonical` / `bond_stereo_from_canonical`
|
|
13
|
+
|
|
14
|
+
And wire them into `molecule_to_canonical` / `molecule_from_canonical`
|
|
15
|
+
so atoms and bonds carry their stereo children across the translation.
|
|
16
|
+
|
|
17
|
+
## Deliverables
|
|
18
|
+
|
|
19
|
+
- [ ] Translator methods for both elements, schema-aware via
|
|
20
|
+
WireClassRegistry.
|
|
21
|
+
- [ ] `molecule_to_canonical` reads `cml_atom.atom_parity` and
|
|
22
|
+
translates it.
|
|
23
|
+
- [ ] `molecule_from_canonical` writes the parity back to the wire atom.
|
|
24
|
+
- [ ] Same for bonds and `bond_stereo`.
|
|
25
|
+
- [ ] Spec round-tripping a chiral molecule through canonical.
|
|
26
|
+
|
|
27
|
+
## Acceptance
|
|
28
|
+
|
|
29
|
+
- Round-trip a chiral_center fixture through canonical preserves
|
|
30
|
+
the atomParity value.
|
|
31
|
+
- Round-trip ethene_with_bond_stereo through canonical preserves
|
|
32
|
+
the bondStereo.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 31 — Final spec + lint pass
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** all
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Verify the stereo additions don't regress anything.
|
|
9
|
+
|
|
10
|
+
## Deliverables
|
|
11
|
+
|
|
12
|
+
- [ ] `bundle exec rspec spec/chemicalml/` green.
|
|
13
|
+
- [ ] Round-trip of chiral_center.cml and ethene_with_bond_stereo.cml
|
|
14
|
+
preserves the stereo elements.
|
|
15
|
+
- [ ] Zero forbidden patterns in lib/.
|
|
16
|
+
- [ ] TODO.align/README.round5.md marked complete.
|
|
17
|
+
|
|
18
|
+
## Acceptance
|
|
19
|
+
|
|
20
|
+
All checks pass.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 32 — Polymorphic Translator
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** —
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
`Translator.to_canonical` and `from_canonical` currently only handle
|
|
9
|
+
Document roots. A compchem `<module>` root can't go through the
|
|
10
|
+
canonical round-trip via the public API — callers must know to use
|
|
11
|
+
`module_to_canonical` / `module_from_canonical` directly.
|
|
12
|
+
|
|
13
|
+
Make both methods polymorphic: dispatch on the input's class via
|
|
14
|
+
Role module checks.
|
|
15
|
+
|
|
16
|
+
## Why
|
|
17
|
+
|
|
18
|
+
Consistency with the rest of the gem. `WireClassRegistry` already
|
|
19
|
+
abstracts over schema versions; the Translator should abstract over
|
|
20
|
+
root element kinds too. Users shouldn't need to know upfront whether
|
|
21
|
+
their CML is `<cml>`-rooted or `<module>`-rooted.
|
|
22
|
+
|
|
23
|
+
## Deliverables
|
|
24
|
+
|
|
25
|
+
- [ ] `Translator.to_canonical(node)`:
|
|
26
|
+
- if `node.is_a?(Chemicalml::Cml::Role::Document)` → existing
|
|
27
|
+
document translation
|
|
28
|
+
- if `node.is_a?(Chemicalml::Cml::Role::Module)` →
|
|
29
|
+
`module_to_canonical(node)`
|
|
30
|
+
- else raise `ArgumentError`
|
|
31
|
+
- [ ] `Translator.from_canonical(node, schema:)`:
|
|
32
|
+
- if `node.is_a?(Chemicalml::Model::Document)` → existing
|
|
33
|
+
document translation
|
|
34
|
+
- if `node.is_a?(Chemicalml::Model::Module)` →
|
|
35
|
+
`module_from_canonical(node, schema: schema)`
|
|
36
|
+
- else raise `ArgumentError`
|
|
37
|
+
|
|
38
|
+
## Acceptance
|
|
39
|
+
|
|
40
|
+
- Compchem fixture's wire Module translates to canonical Module
|
|
41
|
+
through the public `to_canonical` API.
|
|
42
|
+
- Canonical Module translates back through `from_canonical`.
|
|
43
|
+
- Unknown input raises `ArgumentError`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 33 — Polymorphic Chemicalml.parse
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** 32
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
`Chemicalml.parse(xml)` today only handles `<cml>`-rooted documents.
|
|
9
|
+
Compchem documents rooted at `<module>` silently parse as empty
|
|
10
|
+
Documents — the content is dropped without warning.
|
|
11
|
+
|
|
12
|
+
Detect the root element via a regex peek and dispatch to the right
|
|
13
|
+
parser.
|
|
14
|
+
|
|
15
|
+
## Why
|
|
16
|
+
|
|
17
|
+
Silent data loss. Today's behavior:
|
|
18
|
+
```
|
|
19
|
+
Chemicalml.parse(File.read("h2_dft.cml"))
|
|
20
|
+
# => #<Chemicalml::Cml::Schema3::Document molecules=[] reactions=[]>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The caller has no indication that all the jobList / job / init / fin
|
|
24
|
+
content was dropped. Should be either parsed correctly or raise an
|
|
25
|
+
error.
|
|
26
|
+
|
|
27
|
+
## Deliverables
|
|
28
|
+
|
|
29
|
+
- [ ] `Chemicalml.parse(xml, schema:)` peeks the root tag.
|
|
30
|
+
- [ ] `cml`, `molecule`, `reactionList`, `reaction` → Document parser.
|
|
31
|
+
- [ ] `module` → Module parser (Schema3 only — Schema 2.4 lacks it).
|
|
32
|
+
- [ ] Unknown root → `ArgumentError`.
|
|
33
|
+
- [ ] Return type matches the root: Document or Module.
|
|
34
|
+
- [ ] `Chemicalml.serialize(node)` remains polymorphic — already
|
|
35
|
+
just calls `node.to_xml`.
|
|
36
|
+
|
|
37
|
+
## Acceptance
|
|
38
|
+
|
|
39
|
+
- `Chemicalml.parse(File.read("h2_dft.cml"))` returns a Schema3 Module
|
|
40
|
+
with the jobList intact.
|
|
41
|
+
- `Chemicalml.parse(File.read("water.cml"))` continues to return a
|
|
42
|
+
Schema3 Document.
|
|
43
|
+
- Unknown root raises `ArgumentError`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 34 — Polymorphic API specs
|
|
2
|
+
|
|
3
|
+
**Status:** complete
|
|
4
|
+
**Depends on:** 32, 33
|
|
5
|
+
|
|
6
|
+
## Goal
|
|
7
|
+
|
|
8
|
+
Specs covering:
|
|
9
|
+
- Compchem fixture parses to a non-empty Schema3 Module.
|
|
10
|
+
- Polymorphic Translator dispatches Document and Module correctly.
|
|
11
|
+
- Unknown roots / inputs raise ArgumentError.
|
|
12
|
+
- Round-trip compchem → canonical → compchem preserves structure.
|
|
13
|
+
|
|
14
|
+
## Acceptance
|
|
15
|
+
|
|
16
|
+
All specs green.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 36 — Molecular convention: full upstream constraint coverage
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
`reference-docs/conventions/molecular.md` mandates more rules than the
|
|
6
|
+
gem currently enforces. The walker framework already exists; this is
|
|
7
|
+
purely additive constraint registration.
|
|
8
|
+
|
|
9
|
+
## Current constraints (13)
|
|
10
|
+
|
|
11
|
+
AtomArrayMustContainAtoms, AtomIdsUniqueWithinMolecule,
|
|
12
|
+
BondMustReferenceAtomsInSameMolecule, AtomMustHaveId,
|
|
13
|
+
AtomMustHaveElementType, BondMustHaveAtomRefs2, BondMustHaveOrder,
|
|
14
|
+
MoleculeMustHaveId, AtomCoordinatesMustBePaired,
|
|
15
|
+
PropertyMustHaveDictRef, ScalarMustHaveDataType,
|
|
16
|
+
BondOrderShouldNotBeNumeric, AtomIdMustMatchPattern.
|
|
17
|
+
|
|
18
|
+
## Missing rules per upstream spec
|
|
19
|
+
|
|
20
|
+
- `count` attribute MUST NOT appear on top-level molecules (only on
|
|
21
|
+
children of another molecule).
|
|
22
|
+
- `atomArray` — at most one per molecule; mutually exclusive with
|
|
23
|
+
child `<molecule>` elements.
|
|
24
|
+
- `bondArray` — at most one per molecule; mutually exclusive with
|
|
25
|
+
child `<molecule>` elements.
|
|
26
|
+
- `bondStereo` value `W` or `H` MUST have `atomRefs2`, MUST NOT have
|
|
27
|
+
`atomRefs4`.
|
|
28
|
+
- `bondStereo` value `C` or `T` MUST have `atomRefs4`, MUST NOT have
|
|
29
|
+
`atomRefs2`.
|
|
30
|
+
- `bondStereo` value `other` MUST have `dictRef`.
|
|
31
|
+
- `bond` `id` MUST be unique within the eldest containing molecule.
|
|
32
|
+
- `bond` with `order="other"` MUST have `dictRef`.
|
|
33
|
+
- `atomArray` MUST be a child of `molecule` or `formula`.
|
|
34
|
+
- `bondArray` MUST be a child of `molecule`.
|
|
35
|
+
|
|
36
|
+
## Implementation
|
|
37
|
+
|
|
38
|
+
Each rule → one Constraint subclass + `register` call in
|
|
39
|
+
`lib/chemicalml/convention/molecular.rb`. New files autoloaded from
|
|
40
|
+
`lib/chemicalml/convention/molecular/constraints.rb`.
|
|
41
|
+
|
|
42
|
+
## Acceptance
|
|
43
|
+
|
|
44
|
+
- 10 new constraint classes registered.
|
|
45
|
+
- Per-class spec under `spec/chemicalml/convention/molecular/`.
|
|
46
|
+
- Full suite still green.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 37 — CompChem convention: full upstream constraint coverage
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
`reference-docs/conventions/compchem.md` defines a deep module
|
|
6
|
+
structure (jobList → job → initialization/calculation/finalization/
|
|
7
|
+
environment) and value-container rules. The gem currently ships only
|
|
8
|
+
2 of the ~19 rules.
|
|
9
|
+
|
|
10
|
+
## Current constraints (2)
|
|
11
|
+
|
|
12
|
+
CompchemModuleMustContainJobList, JobMustContainInitialization.
|
|
13
|
+
|
|
14
|
+
## Missing structural rules
|
|
15
|
+
|
|
16
|
+
- `jobList` module MUST have `id` unique within compchem module.
|
|
17
|
+
- `job` module MUST have `id` unique within compchem module.
|
|
18
|
+
- `job` module MUST contain at most one `finalization`.
|
|
19
|
+
- `job` module MUST contain at most one `environment`.
|
|
20
|
+
- If a `calculation` is present in a `job`, a `finalization` MUST
|
|
21
|
+
also be present (co-constraint).
|
|
22
|
+
- `initialization` module MUST NOT contain `property`/`propertyList`.
|
|
23
|
+
- `initialization` module MUST NOT contain more than one `molecule`.
|
|
24
|
+
- `initialization` module MUST NOT contain more than one
|
|
25
|
+
`parameterList`.
|
|
26
|
+
- `finalization` module MUST NOT contain `parameter`/`parameterList`.
|
|
27
|
+
- `finalization` module MUST NOT contain more than one `molecule`.
|
|
28
|
+
- `finalization` module MUST NOT contain more than one `propertyList`.
|
|
29
|
+
- `environment` module MUST NOT contain more than one `propertyList`.
|
|
30
|
+
- `environment` module MUST NOT contain `parameter`/`parameterList`
|
|
31
|
+
directly.
|
|
32
|
+
|
|
33
|
+
## Missing value-container rules
|
|
34
|
+
|
|
35
|
+
- `scalar` with `dataType` `xsd:integer` or `xsd:double` MUST have
|
|
36
|
+
`units`.
|
|
37
|
+
- `scalar` with `dataType` `xsd:string` MUST NOT have `units`.
|
|
38
|
+
- `array` MUST have `size` ≥ 1; `dataType` MUST be integer or double;
|
|
39
|
+
MUST have `units`.
|
|
40
|
+
- `matrix` MUST have `rows` ≥ 1 and `columns` ≥ 1; `dataType` MUST
|
|
41
|
+
be integer or double; MUST have `units`.
|
|
42
|
+
|
|
43
|
+
## Implementation
|
|
44
|
+
|
|
45
|
+
Use `DocumentConstraint` for cross-node rules (calculation→finalization
|
|
46
|
+
co-constraint), `NodeConstraint` for single-node rules.
|
|
47
|
+
|
|
48
|
+
CompChem modules are `<module dictRef="compchem:*">`. Match by
|
|
49
|
+
`node.is_a?(Chemicalml::Cml::Role::Module)` then check `dict_ref`.
|
|
50
|
+
|
|
51
|
+
## Acceptance
|
|
52
|
+
|
|
53
|
+
- 17 new constraint classes registered.
|
|
54
|
+
- Per-class spec under `spec/chemicalml/convention/compchem/`.
|
|
55
|
+
- Full suite still green.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 38 — Dictionary convention: full upstream constraint coverage
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
`reference-docs/conventions/dictionary.md` requires namespace,
|
|
6
|
+
definition children, id patterns, and unitType/units co-constraints.
|
|
7
|
+
Currently 2 of 7 rules enforced.
|
|
8
|
+
|
|
9
|
+
## Current constraints (2)
|
|
10
|
+
|
|
11
|
+
EntryMustHaveIdAndTerm, EntryIdsUniqueWithinDictionary.
|
|
12
|
+
|
|
13
|
+
## Missing rules
|
|
14
|
+
|
|
15
|
+
- `dictionary` MUST have `namespace` attribute.
|
|
16
|
+
- `dictionary` `namespace` SHOULD end with `/` or `#` (warning).
|
|
17
|
+
- `entry` MUST contain a single `definition` child.
|
|
18
|
+
- `entry` `id` MUST match `[A-Za-z][A-Za-z0-9._-]*`.
|
|
19
|
+
- `entry` MUST have `unitType` attribute.
|
|
20
|
+
- If `unitType` is `unknown`, `units` MUST NOT be present.
|
|
21
|
+
- If `unitType` is `none`, `units` MUST be present and point to
|
|
22
|
+
`http://www.xml-cml.org/unit/si#none`.
|
|
23
|
+
|
|
24
|
+
## Implementation
|
|
25
|
+
|
|
26
|
+
New files under
|
|
27
|
+
`lib/chemicalml/convention/dictionary/constraints/`, registered in
|
|
28
|
+
`lib/chemicalml/convention/dictionary.rb`.
|
|
29
|
+
|
|
30
|
+
## Acceptance
|
|
31
|
+
|
|
32
|
+
- 7 new constraint classes registered.
|
|
33
|
+
- Per-class spec under `spec/chemicalml/convention/dictionary/`.
|
|
34
|
+
- Full suite still green.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 39 — Unit-dictionary convention: full upstream constraint coverage
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
`reference-docs/conventions/unit-dictionary.md` requires 8 attributes
|
|
6
|
+
on every `<unit>`. The gem currently ships 1 rule.
|
|
7
|
+
|
|
8
|
+
## Current constraints (1)
|
|
9
|
+
|
|
10
|
+
UnitMustHaveSymbolAndUnitType.
|
|
11
|
+
|
|
12
|
+
## Missing rules
|
|
13
|
+
|
|
14
|
+
- `unitList` MUST have `namespace` attribute.
|
|
15
|
+
- `unit` MUST have `id` (unique within unitList — already implied by
|
|
16
|
+
pattern rules but enforce presence).
|
|
17
|
+
- `unit` MUST have `title` attribute.
|
|
18
|
+
- `unit` MUST have `parentSI` attribute.
|
|
19
|
+
- `unit` MUST have at least one of `multiplierToSI` or `constantToSI`.
|
|
20
|
+
- `unit` MUST contain a single `definition` child.
|
|
21
|
+
- `unitList` MUST contain at least one `unit` child.
|
|
22
|
+
|
|
23
|
+
## Implementation
|
|
24
|
+
|
|
25
|
+
NodeConstraint subclasses. Register in
|
|
26
|
+
`lib/chemicalml/convention/unit_dictionary.rb`.
|
|
27
|
+
|
|
28
|
+
## Acceptance
|
|
29
|
+
|
|
30
|
+
- 7 new constraint classes registered (some may consolidate with
|
|
31
|
+
existing UnitMustHaveSymbolAndUnitType).
|
|
32
|
+
- Per-class spec under `spec/chemicalml/convention/unit_dictionary/`.
|
|
33
|
+
- Full suite still green.
|