chemicalml 0.1.0 → 0.2.0
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 +28 -0
- data/CHANGELOG.md +52 -12
- 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/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 +28 -0
- data/lib/chemicalml/cml/base/action.rb +30 -0
- data/lib/chemicalml/cml/base/action_list.rb +33 -0
- data/lib/chemicalml/cml/base/amount.rb +28 -0
- data/lib/chemicalml/cml/base/angle.rb +32 -0
- data/lib/chemicalml/cml/base/any_cml.rb +28 -0
- data/lib/chemicalml/cml/base/array.rb +1 -1
- data/lib/chemicalml/cml/base/array_list.rb +28 -0
- data/lib/chemicalml/cml/base/atom.rb +19 -1
- data/lib/chemicalml/cml/base/atom_array.rb +1 -1
- data/lib/chemicalml/cml/base/atom_parity.rb +1 -1
- data/lib/chemicalml/cml/base/atom_set.rb +28 -0
- data/lib/chemicalml/cml/base/atom_type.rb +32 -0
- data/lib/chemicalml/cml/base/atom_type_list.rb +31 -0
- data/lib/chemicalml/cml/base/atomic_basis_function.rb +40 -0
- data/lib/chemicalml/cml/base/band.rb +32 -0
- data/lib/chemicalml/cml/base/band_list.rb +31 -0
- data/lib/chemicalml/cml/base/basis_set.rb +31 -0
- data/lib/chemicalml/cml/base/bond.rb +5 -1
- data/lib/chemicalml/cml/base/bond_array.rb +1 -1
- data/lib/chemicalml/cml/base/bond_set.rb +28 -0
- data/lib/chemicalml/cml/base/bond_stereo.rb +1 -1
- data/lib/chemicalml/cml/base/bond_type.rb +32 -0
- data/lib/chemicalml/cml/base/bond_type_list.rb +31 -0
- data/lib/chemicalml/cml/base/cell_parameter.rb +34 -0
- data/lib/chemicalml/cml/base/cml_module.rb +1 -1
- data/lib/chemicalml/cml/base/condition_list.rb +33 -0
- data/lib/chemicalml/cml/base/crystal.rb +35 -0
- data/lib/chemicalml/cml/base/definition.rb +30 -0
- data/lib/chemicalml/cml/base/description.rb +30 -0
- data/lib/chemicalml/cml/base/dictionary.rb +1 -1
- data/lib/chemicalml/cml/base/dictionary_entry.rb +1 -1
- data/lib/chemicalml/cml/base/dimension.rb +32 -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 +34 -0
- data/lib/chemicalml/cml/base/electron.rb +36 -0
- data/lib/chemicalml/cml/base/formula.rb +1 -1
- data/lib/chemicalml/cml/base/fragment.rb +35 -0
- data/lib/chemicalml/cml/base/fragment_list.rb +31 -0
- data/lib/chemicalml/cml/base/gradient.rb +32 -0
- data/lib/chemicalml/cml/base/identifier.rb +1 -1
- data/lib/chemicalml/cml/base/isotope.rb +34 -0
- data/lib/chemicalml/cml/base/isotope_list.rb +31 -0
- data/lib/chemicalml/cml/base/join.rb +30 -0
- data/lib/chemicalml/cml/base/kpoint.rb +32 -0
- data/lib/chemicalml/cml/base/kpoint_list.rb +31 -0
- data/lib/chemicalml/cml/base/label.rb +1 -1
- data/lib/chemicalml/cml/base/lattice.rb +35 -0
- data/lib/chemicalml/cml/base/lattice_vector.rb +30 -0
- data/lib/chemicalml/cml/base/length.rb +32 -0
- data/lib/chemicalml/cml/base/line3.rb +30 -0
- data/lib/chemicalml/cml/base/link.rb +38 -0
- data/lib/chemicalml/cml/base/list.rb +1 -1
- data/lib/chemicalml/cml/base/map.rb +28 -0
- data/lib/chemicalml/cml/base/matrix.rb +1 -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 +1 -1
- data/lib/chemicalml/cml/base/metadata_list.rb +1 -1
- data/lib/chemicalml/cml/base/molecule.rb +17 -1
- data/lib/chemicalml/cml/base/molecule_list.rb +31 -0
- data/lib/chemicalml/cml/base/name.rb +1 -1
- data/lib/chemicalml/cml/base/object.rb +30 -0
- data/lib/chemicalml/cml/base/observation.rb +28 -0
- data/lib/chemicalml/cml/base/parameter.rb +1 -1
- data/lib/chemicalml/cml/base/parameter_list.rb +1 -1
- data/lib/chemicalml/cml/base/particle.rb +30 -0
- data/lib/chemicalml/cml/base/peak.rb +40 -0
- data/lib/chemicalml/cml/base/peak_group.rb +31 -0
- data/lib/chemicalml/cml/base/peak_list.rb +33 -0
- data/lib/chemicalml/cml/base/peak_structure.rb +30 -0
- data/lib/chemicalml/cml/base/plane3.rb +30 -0
- data/lib/chemicalml/cml/base/point3.rb +30 -0
- data/lib/chemicalml/cml/base/potential.rb +30 -0
- data/lib/chemicalml/cml/base/potential_form.rb +30 -0
- data/lib/chemicalml/cml/base/potential_list.rb +31 -0
- data/lib/chemicalml/cml/base/product.rb +1 -1
- data/lib/chemicalml/cml/base/product_list.rb +1 -1
- data/lib/chemicalml/cml/base/property.rb +1 -1
- data/lib/chemicalml/cml/base/property_list.rb +1 -1
- data/lib/chemicalml/cml/base/reactant.rb +1 -1
- data/lib/chemicalml/cml/base/reactant_list.rb +1 -1
- data/lib/chemicalml/cml/base/reaction.rb +9 -1
- data/lib/chemicalml/cml/base/reaction_list.rb +1 -1
- data/lib/chemicalml/cml/base/reaction_scheme.rb +33 -0
- data/lib/chemicalml/cml/base/reaction_step.rb +35 -0
- data/lib/chemicalml/cml/base/reaction_step_list.rb +31 -0
- data/lib/chemicalml/cml/base/reactive_centre.rb +30 -0
- data/lib/chemicalml/cml/base/region.rb +28 -0
- data/lib/chemicalml/cml/base/sample.rb +28 -0
- data/lib/chemicalml/cml/base/scalar.rb +1 -1
- data/lib/chemicalml/cml/base/spectator.rb +28 -0
- data/lib/chemicalml/cml/base/spectator_list.rb +31 -0
- data/lib/chemicalml/cml/base/spectrum.rb +41 -0
- data/lib/chemicalml/cml/base/spectrum_data.rb +33 -0
- data/lib/chemicalml/cml/base/spectrum_list.rb +31 -0
- data/lib/chemicalml/cml/base/sphere3.rb +30 -0
- data/lib/chemicalml/cml/base/stmml.rb +28 -0
- data/lib/chemicalml/cml/base/substance.rb +1 -1
- data/lib/chemicalml/cml/base/substance_list.rb +31 -0
- data/lib/chemicalml/cml/base/symmetry.rb +32 -0
- data/lib/chemicalml/cml/base/system.rb +33 -0
- data/lib/chemicalml/cml/base/table.rb +33 -0
- data/lib/chemicalml/cml/base/table_cell.rb +30 -0
- data/lib/chemicalml/cml/base/table_content.rb +33 -0
- data/lib/chemicalml/cml/base/table_header.rb +31 -0
- data/lib/chemicalml/cml/base/table_header_cell.rb +30 -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/torsion.rb +32 -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/unit.rb +1 -1
- data/lib/chemicalml/cml/base/unit_list.rb +1 -1
- data/lib/chemicalml/cml/base/unit_type.rb +1 -1
- data/lib/chemicalml/cml/base/unit_type_list.rb +1 -1
- data/lib/chemicalml/cml/base/vector3.rb +30 -0
- data/lib/chemicalml/cml/base/xaxis.rb +32 -0
- data/lib/chemicalml/cml/base/yaxis.rb +32 -0
- data/lib/chemicalml/cml/base/z_matrix.rb +30 -0
- data/lib/chemicalml/cml/base.rb +85 -0
- data/lib/chemicalml/cml/child_mappings.rb +168 -0
- data/lib/chemicalml/cml/elements.rb +130 -42
- 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/amount.rb +12 -0
- data/lib/chemicalml/cml/role/angle.rb +12 -0
- data/lib/chemicalml/cml/role/any_cml.rb +12 -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/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/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/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/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/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/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/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/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 +86 -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/amount.rb +13 -0
- data/lib/chemicalml/cml/schema24/angle.rb +13 -0
- data/lib/chemicalml/cml/schema24/any_cml.rb +13 -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/condition_list.rb +13 -0
- 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/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/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/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/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/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/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/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 +131 -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/translator/value_translations.rb +40 -35
- data/lib/chemicalml/cml/translator.rb +319 -68
- data/lib/chemicalml/cml/wire_class_registry.rb +42 -0
- data/lib/chemicalml/cml.rb +138 -44
- 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_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_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_order_should_not_be_numeric.rb +27 -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 +20 -3
- data/lib/chemicalml/convention/molecular.rb +10 -0
- data/lib/chemicalml/model/atom.rb +28 -4
- data/lib/chemicalml/model/atom_parity.rb +21 -0
- data/lib/chemicalml/model/bond.rb +9 -3
- data/lib/chemicalml/model/bond_stereo.rb +29 -0
- data/lib/chemicalml/model/molecule.rb +13 -6
- data/lib/chemicalml/model.rb +2 -0
- data/lib/chemicalml/version.rb +1 -1
- data/lib/chemicalml/versioned_parser.rb +53 -12
- data/lib/chemicalml.rb +3 -1
- metadata +476 -40
- 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/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
|
@@ -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,30 @@
|
|
|
1
|
+
# TODO.align (round 10)
|
|
2
|
+
|
|
3
|
+
Code cleanliness fixes.
|
|
4
|
+
|
|
5
|
+
| # | Workstream | Status |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| 40 | Fix Base file indentation + extract Translator helpers | complete |
|
|
8
|
+
|
|
9
|
+
## Issues fixed
|
|
10
|
+
|
|
11
|
+
### 1. Base file indentation
|
|
12
|
+
|
|
13
|
+
All 36 Base mixin files had inconsistent indentation on the
|
|
14
|
+
`namespace` line inside `xml do` blocks — 12 spaces instead of 14.
|
|
15
|
+
Fixed via automated `ruby -i -pe` across `lib/chemicalml/cml/base/*.rb`.
|
|
16
|
+
|
|
17
|
+
### 2. Translator DRY: extracted name_to_canonical / identifier_to_canonical
|
|
18
|
+
|
|
19
|
+
`molecule_to_canonical` was constructing `Model::Name` and
|
|
20
|
+
`Model::Identifier` inline (two multi-argument `.new` calls in a
|
|
21
|
+
single hash value) instead of calling dedicated helper methods —
|
|
22
|
+
unlike every other element type which has its own `X_to_canonical`
|
|
23
|
+
helper. Extracted to `name_to_canonical` / `identifier_to_canonical`
|
|
24
|
+
methods for consistency with the rest of the Translator.
|
|
25
|
+
|
|
26
|
+
## Final metrics
|
|
27
|
+
|
|
28
|
+
- 179 examples, 0 failures
|
|
29
|
+
- 0 forbidden patterns
|
|
30
|
+
- 227 lib files
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# TODO.align (round 11)
|
|
2
|
+
|
|
3
|
+
Full CML schema coverage: every element from the XSD now has wire
|
|
4
|
+
classes across Base, Role, Schema3, Schema24, and the Cml alias
|
|
5
|
+
namespace.
|
|
6
|
+
|
|
7
|
+
| # | Workstream | Status |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 41 | Full CML element coverage (all 121 XSD elements) | complete |
|
|
10
|
+
| 42 | Final spec + lint pass | complete |
|
|
11
|
+
|
|
12
|
+
## What was added
|
|
13
|
+
|
|
14
|
+
85 new CML elements, each with 4 generated files (Base mixin, Role
|
|
15
|
+
module, Schema3 class, Schema24 class) + autoload declarations +
|
|
16
|
+
Elements::ALL entry. The gem now covers every element defined in the
|
|
17
|
+
CML Schema 3 XSD.
|
|
18
|
+
|
|
19
|
+
### New element categories
|
|
20
|
+
|
|
21
|
+
- **Geometry**: crystal, lattice, latticeVector, cellParameter,
|
|
22
|
+
zMatrix, line3, plane3, point3, sphere3, transform3, vector3,
|
|
23
|
+
angle, length, torsion
|
|
24
|
+
- **Spectroscopy**: spectrum, spectrumData, spectrumList, peak,
|
|
25
|
+
peakGroup, peakList, peakStructure, xaxis, yaxis
|
|
26
|
+
- **Reactions**: reactionScheme, reactionStep, reactionStepList,
|
|
27
|
+
reactiveCentre, transitionState, mechanism, mechanismComponent,
|
|
28
|
+
spectator, spectatorList, moleculeList, substanceList
|
|
29
|
+
- **Electronic structure**: electron, atomicBasisFunction, eigen,
|
|
30
|
+
gradient, band, bandList, basisSet, kpoint, kpointList
|
|
31
|
+
- **Sets / types**: atomSet, atomType, atomTypeList, bondSet,
|
|
32
|
+
bondType, bondTypeList
|
|
33
|
+
- **Containers**: conditionList, fragment, fragmentList, region,
|
|
34
|
+
sample, system, potential, potentialForm, potentialList
|
|
35
|
+
- **Documentation**: definition, description, documentation, dimension
|
|
36
|
+
- **Tables**: table, tableCell, tableContent, tableHeader,
|
|
37
|
+
tableHeaderCell, tableRow, tableRowList
|
|
38
|
+
- **Misc**: abundance, action, actionList, amount, anyCml, arrayList,
|
|
39
|
+
isotope, isotopeList, join, link, map, object, observation,
|
|
40
|
+
particle, stmml, symmetry
|
|
41
|
+
|
|
42
|
+
### Metrics
|
|
43
|
+
|
|
44
|
+
- Elements::ALL: 121 entries (up from 36)
|
|
45
|
+
- Base mixins: 121
|
|
46
|
+
- Role modules: 121
|
|
47
|
+
- Schema3 classes: 121
|
|
48
|
+
- Schema24 classes: 120 (Module is schema3-only)
|
|
49
|
+
- 179 specs, 0 failures
|
|
50
|
+
- 0 forbidden patterns
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# TODO.align (round 12)
|
|
2
|
+
|
|
3
|
+
Full CML schema coverage — parent-child wiring + remaining
|
|
4
|
+
dictionaries + universal root parsing.
|
|
5
|
+
|
|
6
|
+
| # | Workstream | Status |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| 42 | Wire parent-child relationships for 33 container elements | complete |
|
|
9
|
+
| 43 | Add cml, cml_name, cml_formula, cif dictionaries | complete |
|
|
10
|
+
| 44 | Universal root parsing (any element can be root) | complete |
|
|
11
|
+
| 45 | Full coverage spec (121 elements + 8 dictionaries) | complete |
|
|
12
|
+
|
|
13
|
+
## What was added
|
|
14
|
+
|
|
15
|
+
### Parent-child relationships (33 containers wired)
|
|
16
|
+
|
|
17
|
+
Every CML container element now declares its valid child elements.
|
|
18
|
+
Previously, parsing `<crystal><scalar>5.64</scalar></crystal>`
|
|
19
|
+
would silently drop the `<scalar>` child. Now it's preserved.
|
|
20
|
+
|
|
21
|
+
Wired containers include:
|
|
22
|
+
Molecule (crystal, spectrum, propertyList), Crystal (scalar,
|
|
23
|
+
lattice, symmetry), Lattice (latticeVector), Spectrum (xaxis,
|
|
24
|
+
yaxis, peakList, conditionList), PeakList (peak, peakGroup),
|
|
25
|
+
Reaction (spectatorList, conditionList, metadataList),
|
|
26
|
+
ReactionScheme, ReactionStepList, ReactionStep, ConditionList,
|
|
27
|
+
FragmentList, Fragment, IsotopeList, BandList, KpointList,
|
|
28
|
+
PotentialList, Table, TableContent, TableHeader, TableRow,
|
|
29
|
+
TableRowList, SpectatorList, MoleculeList, SubstanceList,
|
|
30
|
+
ActionList, AtomTypeList, BondTypeList, Mechanism, SpectrumList,
|
|
31
|
+
SpectrumData, BasisSet, System.
|
|
32
|
+
|
|
33
|
+
### Remaining dictionaries (4 added)
|
|
34
|
+
|
|
35
|
+
- **cml.yaml** (23 entries) — fundamental chemistry concepts
|
|
36
|
+
(molmass, bp, mp, density, refractiveIndex, solubility,
|
|
37
|
+
vaporPressure, flashPoint, autoignitionTemp, pH, viscosity,
|
|
38
|
+
surfaceTension, dipoleMoment, polarizability, heatOfFormation,
|
|
39
|
+
entropy, freeEnergy, ionizationEnergy, electronAffinity,
|
|
40
|
+
electronegativity, bondEnergy, bondLength, bondAngle)
|
|
41
|
+
- **cml_name.yaml** (10 entries) — naming conventions (IUPAC,
|
|
42
|
+
trivial, CAS, InChI, InChIKey, SMILES, PubChem, ChemSpider,
|
|
43
|
+
DrugBank, ChEBI)
|
|
44
|
+
- **cml_formula.yaml** (7 entries) — formula conventions
|
|
45
|
+
(empirical, molecular, structural, condensed, Hill, SMILES,
|
|
46
|
+
LaTeX)
|
|
47
|
+
- **cif.yaml** (19 entries) — crystallography (cell lengths,
|
|
48
|
+
cell angles, cell volume, Z, crystal system, space group,
|
|
49
|
+
fractional coordinates, occupancy, B factor, radiation
|
|
50
|
+
wavelength, resolution)
|
|
51
|
+
|
|
52
|
+
### Universal root parsing
|
|
53
|
+
|
|
54
|
+
The `KNOWN_ROOTS` hash is now a fallback, not the primary lookup.
|
|
55
|
+
`Chemicalml.parse(xml)` first checks KNOWN_ROOTS, then falls back
|
|
56
|
+
to `Elements::ALL` — making ANY CML element parseable as a root.
|
|
57
|
+
Adding a new element to `Elements::ALL` automatically makes it
|
|
58
|
+
parseable as a standalone document. OCP — no parse code changes
|
|
59
|
+
needed.
|
|
60
|
+
|
|
61
|
+
### Total dictionary count: 8
|
|
62
|
+
|
|
63
|
+
compchem (51), cml (23), cml_name (10), cml_formula (7), cif (19),
|
|
64
|
+
unit_si (25), unit_non_si (13), unit_type (35) = 183 total entries.
|
|
65
|
+
|
|
66
|
+
## Final metrics
|
|
67
|
+
|
|
68
|
+
- 188 examples, 0 failures
|
|
69
|
+
- 121 CML elements (full XSD coverage)
|
|
70
|
+
- 8 dictionaries (183 total entries)
|
|
71
|
+
- 33 container elements with child relationships wired
|
|
72
|
+
- Universal root parsing
|
|
73
|
+
- 0 forbidden patterns
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# TODO.align (round 13)
|
|
2
|
+
|
|
3
|
+
Critical data-loss fix + missing unit types/units + convention
|
|
4
|
+
constraint expansion.
|
|
5
|
+
|
|
6
|
+
| # | Workstream | Status |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| 46 | Add atom coordinates (x2/y2/x3/y3/z3/xFract/yFract/zFract) | complete |
|
|
9
|
+
| 47 | Add missing unit types + units | complete |
|
|
10
|
+
| 48 | Add 5 molecular convention constraints | complete |
|
|
11
|
+
| 49 | Final spec + lint pass | complete |
|
|
12
|
+
|
|
13
|
+
## Critical fix: Atom coordinates were silently dropped
|
|
14
|
+
|
|
15
|
+
The most important fix in this round: CML `<atom>` elements with
|
|
16
|
+
2D coordinates (x2, y2), 3D coordinates (x3, y3, z3), or fractional
|
|
17
|
+
coordinates (xFract, yFract, zFract) were being silently dropped
|
|
18
|
+
during parsing. This affected virtually every real-world CML file
|
|
19
|
+
that contains molecular structures.
|
|
20
|
+
|
|
21
|
+
Fixed by:
|
|
22
|
+
- Adding x2, y2, x3, y3, z3, xFract, yFract, zFract attributes to
|
|
23
|
+
`Base::Atom` with `map_attribute` declarations.
|
|
24
|
+
- Adding matching fields to `Model::Atom` (canonical).
|
|
25
|
+
- Updating `atom_to_canonical` / `atom_from_canonical` translator
|
|
26
|
+
rules to carry the coordinates through.
|
|
27
|
+
|
|
28
|
+
Verified: parsing `methanol.cml` now correctly preserves
|
|
29
|
+
`x3="-0.713"` through both wire parse and canonical translation.
|
|
30
|
+
|
|
31
|
+
## Missing unit types + units added
|
|
32
|
+
|
|
33
|
+
4 unit types referenced by the new dictionaries but not defined:
|
|
34
|
+
density, viscosity, surfaceTension, entropy.
|
|
35
|
+
|
|
36
|
+
10 non-SI units referenced but not defined:
|
|
37
|
+
g_cm3, Pa_s, N_m, D (debye), A3, kJ_mol, J_molK, eV,
|
|
38
|
+
angstrom2, angstrom3.
|
|
39
|
+
|
|
40
|
+
## Convention constraints expanded
|
|
41
|
+
|
|
42
|
+
5 new molecular convention constraints added:
|
|
43
|
+
- `AtomMustHaveId` — every atom must have an `id` attribute
|
|
44
|
+
- `AtomMustHaveElementType` — every atom must have `elementType`
|
|
45
|
+
- `BondMustHaveAtomRefs2` — every bond must have `atomRefs2`
|
|
46
|
+
- `BondMustHaveOrder` — every bond must have `order`
|
|
47
|
+
- `MoleculeMustHaveId` — every molecule must have `id`
|
|
48
|
+
|
|
49
|
+
Total molecular constraints: 8 (up from 3).
|
|
50
|
+
|
|
51
|
+
## Final metrics
|
|
52
|
+
|
|
53
|
+
- 188 examples, 0 failures
|
|
54
|
+
- 121 CML elements (full XSD coverage)
|
|
55
|
+
- 8 dictionaries (193+ total entries)
|
|
56
|
+
- 8 molecular convention constraints
|
|
57
|
+
- 12 total convention constraints (across 5 conventions)
|
|
58
|
+
- Atom coordinates fully round-trip (2D, 3D, fractional)
|
|
59
|
+
- 0 forbidden patterns
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# TODO.align (round 14)
|
|
2
|
+
|
|
3
|
+
Common attributes on original elements + performance fix + specs.
|
|
4
|
+
|
|
5
|
+
| # | Workstream | Status |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| 50 | Add dict_ref/convention/id/title to original elements | complete |
|
|
8
|
+
| 51 | O(1) VersionedParser root lookup | complete |
|
|
9
|
+
| 52 | Coordinate + constraint specs | complete |
|
|
10
|
+
|
|
11
|
+
## Fixes
|
|
12
|
+
|
|
13
|
+
### Missing common attributes on original elements
|
|
14
|
+
|
|
15
|
+
Three original Base mixins were missing common CML attributes that
|
|
16
|
+
the 85 generated elements have by default:
|
|
17
|
+
|
|
18
|
+
- **Base::Molecule**: added `dict_ref`, `convention`, `chirality`
|
|
19
|
+
with xml mappings. Without these, molecule-level dictRef
|
|
20
|
+
references and convention attributes were silently dropped.
|
|
21
|
+
- **Base::Document** (`<cml>`): added `id`, `title`, `dict_ref`,
|
|
22
|
+
`convention` with xml mappings. The root `<cml>` element can
|
|
23
|
+
carry these attributes per the CML schema.
|
|
24
|
+
- **Base::Reaction**: added `dict_ref`, `convention` with xml
|
|
25
|
+
mappings.
|
|
26
|
+
|
|
27
|
+
### O(1) root element lookup
|
|
28
|
+
|
|
29
|
+
VersionedParser was using `Elements::ALL.find { |_, id| id.to_s == root }`
|
|
30
|
+
— O(121) linear search on every `parse()` call. Replaced with a
|
|
31
|
+
pre-built reverse index `Elements::XML_TO_CLASS` (frozen Hash)
|
|
32
|
+
giving O(1) lookup. Adding new elements to `Elements::ALL`
|
|
33
|
+
automatically updates the index.
|
|
34
|
+
|
|
35
|
+
### New specs (9 examples)
|
|
36
|
+
|
|
37
|
+
- 5 coordinate round-trip specs: 3D (x3/y3/z3), 2D (x2/y2),
|
|
38
|
+
fractional (xFract/yFract/zFract), through wire → canonical → wire.
|
|
39
|
+
- 4 constraint violation specs: atom missing id, atom missing
|
|
40
|
+
elementType, bond missing atomRefs2, molecule missing id.
|
|
41
|
+
|
|
42
|
+
## Final metrics
|
|
43
|
+
|
|
44
|
+
- **197 examples, 0 failures**
|
|
45
|
+
- 121 CML elements, 8 dictionaries, 12 convention constraints
|
|
46
|
+
- Atom coordinates fully round-trip
|
|
47
|
+
- O(1) root element dispatch
|
|
48
|
+
- 0 forbidden patterns
|