chemicalml 0.2.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.
Files changed (304) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +7 -1
  3. data/CLAUDE.md +48 -41
  4. data/TODO.align/36-molecular-convention-coverage.md +46 -0
  5. data/TODO.align/37-compchem-convention-coverage.md +55 -0
  6. data/TODO.align/38-dictionary-convention-coverage.md +34 -0
  7. data/TODO.align/39-unit-dictionary-convention-coverage.md +33 -0
  8. data/TODO.align/40-unit-type-dictionary-convention-coverage.md +28 -0
  9. data/TODO.align/41-expand-canonical-model-layer.md +43 -0
  10. data/TODO.align/42-translator-wire-new-models.md +31 -0
  11. data/TODO.align/43-dictionary-model-no-to-h.md +39 -0
  12. data/TODO.align/44-schema3-only-and-schema24-module.md +44 -0
  13. data/TODO.align/45-documentation-and-final-verification.md +23 -0
  14. data/TODO.align/46-lattice-vector-content.md +24 -0
  15. data/TODO.align/47-molecule-crystal-spectra-property-lists.md +23 -0
  16. data/TODO.align/48-model-list-and-module-lists.md +21 -0
  17. data/TODO.align/49-more-chemistry-models.md +34 -0
  18. data/TODO.align/50-validation-report.md +29 -0
  19. data/TODO.align/51-convention-auto-detection.md +30 -0
  20. data/TODO.align/52-schema24-legacy-elements.md +28 -0
  21. data/TODO.align/53-round-trip-integration-specs.md +30 -0
  22. data/TODO.align/54-document-versioned-parser-shim.md +38 -0
  23. data/TODO.align/55-molecule-missing-attributes.md +20 -0
  24. data/TODO.align/56-geometry-models.md +24 -0
  25. data/TODO.align/57-compchem-models.md +26 -0
  26. data/TODO.align/58-remaining-models.md +24 -0
  27. data/TODO.align/59-wire-new-models-translator.md +18 -0
  28. data/TODO.align/60-docs-and-final-verification.md +19 -0
  29. data/lib/chemicalml/cml/base/abundance.rb +6 -0
  30. data/lib/chemicalml/cml/base/action.rb +20 -0
  31. data/lib/chemicalml/cml/base/action_list.rb +18 -0
  32. data/lib/chemicalml/cml/base/alternative.rb +28 -0
  33. data/lib/chemicalml/cml/base/amount.rb +2 -0
  34. data/lib/chemicalml/cml/base/angle.rb +12 -0
  35. data/lib/chemicalml/cml/base/annotation.rb +30 -0
  36. data/lib/chemicalml/cml/base/appinfo.rb +32 -0
  37. data/lib/chemicalml/cml/base/arg.rb +46 -0
  38. data/lib/chemicalml/cml/base/array.rb +22 -0
  39. data/lib/chemicalml/cml/base/array_list.rb +2 -0
  40. data/lib/chemicalml/cml/base/atom.rb +18 -0
  41. data/lib/chemicalml/cml/base/atom_array.rb +38 -0
  42. data/lib/chemicalml/cml/base/atom_parity.rb +8 -0
  43. data/lib/chemicalml/cml/base/atom_set.rb +2 -0
  44. data/lib/chemicalml/cml/base/atom_type.rb +4 -0
  45. data/lib/chemicalml/cml/base/atom_type_list.rb +2 -0
  46. data/lib/chemicalml/cml/base/atomic_basis_function.rb +4 -0
  47. data/lib/chemicalml/cml/base/band.rb +2 -0
  48. data/lib/chemicalml/cml/base/basis_set.rb +4 -0
  49. data/lib/chemicalml/cml/base/bond.rb +6 -0
  50. data/lib/chemicalml/cml/base/bond_array.rb +16 -0
  51. data/lib/chemicalml/cml/base/bond_set.rb +2 -0
  52. data/lib/chemicalml/cml/base/bond_stereo.rb +10 -0
  53. data/lib/chemicalml/cml/base/bond_type.rb +2 -0
  54. data/lib/chemicalml/cml/base/bond_type_list.rb +2 -0
  55. data/lib/chemicalml/cml/base/cell_parameter.rb +4 -0
  56. data/lib/chemicalml/cml/base/complex_object.rb +30 -0
  57. data/lib/chemicalml/cml/base/condition_list.rb +4 -0
  58. data/lib/chemicalml/cml/base/crystal.rb +2 -0
  59. data/lib/chemicalml/cml/base/description.rb +2 -0
  60. data/lib/chemicalml/cml/base/dictionary.rb +6 -0
  61. data/lib/chemicalml/cml/base/dimension.rb +10 -0
  62. data/lib/chemicalml/cml/base/eigen.rb +2 -0
  63. data/lib/chemicalml/cml/base/electron.rb +6 -0
  64. data/lib/chemicalml/cml/base/enumeration.rb +32 -0
  65. data/lib/chemicalml/cml/base/expression.rb +32 -0
  66. data/lib/chemicalml/cml/base/float.rb +40 -0
  67. data/lib/chemicalml/cml/base/float_array.rb +42 -0
  68. data/lib/chemicalml/cml/base/fragment.rb +6 -0
  69. data/lib/chemicalml/cml/base/fragment_list.rb +4 -0
  70. data/lib/chemicalml/cml/base/identifier.rb +8 -0
  71. data/lib/chemicalml/cml/base/integer.rb +40 -0
  72. data/lib/chemicalml/cml/base/integer_array.rb +42 -0
  73. data/lib/chemicalml/cml/base/isotope.rb +2 -0
  74. data/lib/chemicalml/cml/base/isotope_list.rb +2 -0
  75. data/lib/chemicalml/cml/base/join.rb +6 -0
  76. data/lib/chemicalml/cml/base/kpoint.rb +2 -0
  77. data/lib/chemicalml/cml/base/label.rb +2 -0
  78. data/lib/chemicalml/cml/base/lattice.rb +2 -0
  79. data/lib/chemicalml/cml/base/lattice_vector.rb +2 -0
  80. data/lib/chemicalml/cml/base/length.rb +10 -0
  81. data/lib/chemicalml/cml/base/line3.rb +6 -0
  82. data/lib/chemicalml/cml/base/link.rb +20 -0
  83. data/lib/chemicalml/cml/base/list.rb +2 -0
  84. data/lib/chemicalml/cml/base/map.rb +12 -0
  85. data/lib/chemicalml/cml/base/matrix.rb +12 -0
  86. data/lib/chemicalml/cml/base/metadata.rb +4 -0
  87. data/lib/chemicalml/cml/base/metadata_list.rb +6 -0
  88. data/lib/chemicalml/cml/base/molecule.rb +10 -0
  89. data/lib/chemicalml/cml/base/molecule_list.rb +2 -0
  90. data/lib/chemicalml/cml/base/name.rb +2 -0
  91. data/lib/chemicalml/cml/base/object.rb +4 -0
  92. data/lib/chemicalml/cml/base/observation.rb +4 -0
  93. data/lib/chemicalml/cml/base/operator.rb +32 -0
  94. data/lib/chemicalml/cml/base/parameter.rb +10 -0
  95. data/lib/chemicalml/cml/base/parameter_list.rb +6 -0
  96. data/lib/chemicalml/cml/base/particle.rb +6 -0
  97. data/lib/chemicalml/cml/base/peak.rb +30 -0
  98. data/lib/chemicalml/cml/base/peak_group.rb +38 -0
  99. data/lib/chemicalml/cml/base/peak_list.rb +2 -0
  100. data/lib/chemicalml/cml/base/peak_structure.rb +14 -0
  101. data/lib/chemicalml/cml/base/plane3.rb +2 -0
  102. data/lib/chemicalml/cml/base/point3.rb +2 -0
  103. data/lib/chemicalml/cml/base/potential_form.rb +2 -0
  104. data/lib/chemicalml/cml/base/product.rb +16 -0
  105. data/lib/chemicalml/cml/base/product_list.rb +14 -0
  106. data/lib/chemicalml/cml/base/property.rb +6 -0
  107. data/lib/chemicalml/cml/base/property_list.rb +6 -0
  108. data/lib/chemicalml/cml/base/reactant.rb +16 -0
  109. data/lib/chemicalml/cml/base/reactant_list.rb +14 -0
  110. data/lib/chemicalml/cml/base/reaction.rb +16 -0
  111. data/lib/chemicalml/cml/base/reaction_list.rb +12 -0
  112. data/lib/chemicalml/cml/base/reaction_scheme.rb +10 -0
  113. data/lib/chemicalml/cml/base/reaction_step.rb +6 -0
  114. data/lib/chemicalml/cml/base/reaction_step_list.rb +8 -0
  115. data/lib/chemicalml/cml/base/region.rb +8 -0
  116. data/lib/chemicalml/cml/base/related_entry.rb +26 -0
  117. data/lib/chemicalml/cml/base/sample.rb +4 -0
  118. data/lib/chemicalml/cml/base/scalar.rb +18 -0
  119. data/lib/chemicalml/cml/base/spectator.rb +2 -0
  120. data/lib/chemicalml/cml/base/spectrum.rb +12 -0
  121. data/lib/chemicalml/cml/base/spectrum_data.rb +2 -0
  122. data/lib/chemicalml/cml/base/spectrum_list.rb +4 -0
  123. data/lib/chemicalml/cml/base/sphere3.rb +2 -0
  124. data/lib/chemicalml/cml/base/string.rb +32 -0
  125. data/lib/chemicalml/cml/base/string_array.rb +40 -0
  126. data/lib/chemicalml/cml/base/substance.rb +12 -0
  127. data/lib/chemicalml/cml/base/substance_list.rb +6 -0
  128. data/lib/chemicalml/cml/base/symmetry.rb +4 -0
  129. data/lib/chemicalml/cml/base/system.rb +4 -0
  130. data/lib/chemicalml/cml/base/table.rb +10 -0
  131. data/lib/chemicalml/cml/base/table_content.rb +2 -0
  132. data/lib/chemicalml/cml/base/table_header_cell.rb +10 -0
  133. data/lib/chemicalml/cml/base/tcell.rb +34 -0
  134. data/lib/chemicalml/cml/base/torsion.rb +12 -0
  135. data/lib/chemicalml/cml/base/trow.rb +32 -0
  136. data/lib/chemicalml/cml/base/unit.rb +12 -0
  137. data/lib/chemicalml/cml/base/unit_list.rb +12 -0
  138. data/lib/chemicalml/cml/base/unit_type.rb +10 -0
  139. data/lib/chemicalml/cml/base/unit_type_list.rb +10 -0
  140. data/lib/chemicalml/cml/base/vector3.rb +2 -0
  141. data/lib/chemicalml/cml/base/xaxis.rb +6 -0
  142. data/lib/chemicalml/cml/base/yaxis.rb +6 -0
  143. data/lib/chemicalml/cml/base.rb +17 -0
  144. data/lib/chemicalml/cml/elements.rb +39 -4
  145. data/lib/chemicalml/cml/role/alternative.rb +10 -0
  146. data/lib/chemicalml/cml/role/annotation.rb +10 -0
  147. data/lib/chemicalml/cml/role/appinfo.rb +10 -0
  148. data/lib/chemicalml/cml/role/arg.rb +10 -0
  149. data/lib/chemicalml/cml/role/cml_module.rb +2 -3
  150. data/lib/chemicalml/cml/role/complex_object.rb +10 -0
  151. data/lib/chemicalml/cml/role/enumeration.rb +10 -0
  152. data/lib/chemicalml/cml/role/expression.rb +10 -0
  153. data/lib/chemicalml/cml/role/float.rb +10 -0
  154. data/lib/chemicalml/cml/role/float_array.rb +10 -0
  155. data/lib/chemicalml/cml/role/integer.rb +10 -0
  156. data/lib/chemicalml/cml/role/integer_array.rb +10 -0
  157. data/lib/chemicalml/cml/role/operator.rb +10 -0
  158. data/lib/chemicalml/cml/role/related_entry.rb +10 -0
  159. data/lib/chemicalml/cml/role/string.rb +10 -0
  160. data/lib/chemicalml/cml/role/string_array.rb +10 -0
  161. data/lib/chemicalml/cml/role/tcell.rb +10 -0
  162. data/lib/chemicalml/cml/role/trow.rb +10 -0
  163. data/lib/chemicalml/cml/role.rb +17 -0
  164. data/lib/chemicalml/cml/schema24/alternative.rb +14 -0
  165. data/lib/chemicalml/cml/schema24/annotation.rb +15 -0
  166. data/lib/chemicalml/cml/schema24/appinfo.rb +15 -0
  167. data/lib/chemicalml/cml/schema24/arg.rb +14 -0
  168. data/lib/chemicalml/cml/schema24/cml_module.rb +18 -0
  169. data/lib/chemicalml/cml/schema24/complex_object.rb +14 -0
  170. data/lib/chemicalml/cml/schema24/configuration.rb +5 -2
  171. data/lib/chemicalml/cml/schema24/enumeration.rb +16 -0
  172. data/lib/chemicalml/cml/schema24/expression.rb +14 -0
  173. data/lib/chemicalml/cml/schema24/float.rb +14 -0
  174. data/lib/chemicalml/cml/schema24/float_array.rb +14 -0
  175. data/lib/chemicalml/cml/schema24/integer.rb +14 -0
  176. data/lib/chemicalml/cml/schema24/integer_array.rb +14 -0
  177. data/lib/chemicalml/cml/schema24/operator.rb +14 -0
  178. data/lib/chemicalml/cml/schema24/related_entry.rb +14 -0
  179. data/lib/chemicalml/cml/schema24/string.rb +14 -0
  180. data/lib/chemicalml/cml/schema24/string_array.rb +14 -0
  181. data/lib/chemicalml/cml/schema24/tcell.rb +14 -0
  182. data/lib/chemicalml/cml/schema24/trow.rb +14 -0
  183. data/lib/chemicalml/cml/schema24.rb +33 -5
  184. data/lib/chemicalml/cml.rb +1 -3
  185. data/lib/chemicalml/context_configuration.rb +8 -2
  186. data/lib/chemicalml/convention/base.rb +17 -3
  187. data/lib/chemicalml/convention/compchem/constraints/array_rules.rb +44 -0
  188. data/lib/chemicalml/convention/compchem/constraints/calculation_requires_finalization.rb +28 -0
  189. data/lib/chemicalml/convention/compchem/constraints/compchem_module_must_contain_job_list.rb +4 -4
  190. data/lib/chemicalml/convention/compchem/constraints/environment_at_most_one_property_list.rb +26 -0
  191. data/lib/chemicalml/convention/compchem/constraints/environment_must_not_contain_parameter.rb +28 -0
  192. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_molecule.rb +26 -0
  193. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_property_list.rb +26 -0
  194. data/lib/chemicalml/convention/compchem/constraints/finalization_must_not_contain_parameter.rb +27 -0
  195. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_molecule.rb +26 -0
  196. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_parameter_list.rb +26 -0
  197. data/lib/chemicalml/convention/compchem/constraints/initialization_must_not_contain_property.rb +28 -0
  198. data/lib/chemicalml/convention/compchem/constraints/job_list_module_must_have_id.rb +24 -0
  199. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_environment.rb +25 -0
  200. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_finalization.rb +25 -0
  201. data/lib/chemicalml/convention/compchem/constraints/job_module_must_have_id.rb +24 -0
  202. data/lib/chemicalml/convention/compchem/constraints/job_must_contain_initialization.rb +6 -9
  203. data/lib/chemicalml/convention/compchem/constraints/matrix_rules.rb +48 -0
  204. data/lib/chemicalml/convention/compchem/constraints/module_predicates.rb +50 -0
  205. data/lib/chemicalml/convention/compchem/constraints/scalar_units.rb +42 -0
  206. data/lib/chemicalml/convention/compchem/constraints.rb +36 -2
  207. data/lib/chemicalml/convention/compchem.rb +16 -0
  208. data/lib/chemicalml/convention/constraint.rb +31 -18
  209. data/lib/chemicalml/convention/coordinator.rb +89 -0
  210. data/lib/chemicalml/convention/detection.rb +33 -0
  211. data/lib/chemicalml/convention/dictionary/constraints/dictionary_must_have_namespace.rb +28 -0
  212. data/lib/chemicalml/convention/dictionary/constraints/dictionary_namespace_should_end_with_slash_or_hash.rb +32 -0
  213. data/lib/chemicalml/convention/dictionary/constraints/entry_id_must_match_pattern.rb +33 -0
  214. data/lib/chemicalml/convention/dictionary/constraints/entry_ids_unique_within_dictionary.rb +3 -3
  215. data/lib/chemicalml/convention/dictionary/constraints/entry_must_contain_definition.rb +28 -0
  216. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_id_and_term.rb +5 -5
  217. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_unit_type.rb +30 -0
  218. data/lib/chemicalml/convention/dictionary/constraints/entry_units_co_constraints.rb +44 -0
  219. data/lib/chemicalml/convention/dictionary/constraints.rb +12 -0
  220. data/lib/chemicalml/convention/dictionary.rb +6 -0
  221. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_be_child_of_molecule_or_formula.rb +40 -0
  222. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_contain_atoms.rb +3 -3
  223. data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +5 -5
  224. data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +4 -4
  225. data/lib/chemicalml/convention/molecular/constraints/atom_ids_unique_within_molecule.rb +2 -2
  226. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +3 -3
  227. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +3 -3
  228. data/lib/chemicalml/convention/molecular/constraints/bond_array_must_be_child_of_molecule.rb +36 -0
  229. data/lib/chemicalml/convention/molecular/constraints/bond_ids_unique_within_molecule.rb +43 -0
  230. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +3 -3
  231. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +3 -3
  232. data/lib/chemicalml/convention/molecular/constraints/bond_must_reference_atoms_in_same_molecule.rb +3 -3
  233. data/lib/chemicalml/convention/molecular/constraints/bond_order_other_must_have_dict_ref.rb +33 -0
  234. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +2 -2
  235. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_cis_trans_must_have_atom_refs4.rb +45 -0
  236. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_other_must_have_dict_ref.rb +32 -0
  237. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_wedge_hash_must_have_atom_refs2.rb +45 -0
  238. data/lib/chemicalml/convention/molecular/constraints/molecule_atom_array_mutually_exclusive_with_children.rb +32 -0
  239. data/lib/chemicalml/convention/molecular/constraints/molecule_bond_array_mutually_exclusive_with_children.rb +31 -0
  240. data/lib/chemicalml/convention/molecular/constraints/molecule_count_must_not_appear_on_top_level.rb +34 -0
  241. data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +3 -3
  242. data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +3 -3
  243. data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +3 -3
  244. data/lib/chemicalml/convention/molecular/constraints.rb +20 -0
  245. data/lib/chemicalml/convention/molecular.rb +10 -0
  246. data/lib/chemicalml/convention/registry.rb +17 -0
  247. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_contain_at_least_one_unit.rb +28 -0
  248. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_have_namespace.rb +36 -0
  249. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_contain_definition.rb +27 -0
  250. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_id.rb +27 -0
  251. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_symbol_and_unit_type.rb +3 -3
  252. data/lib/chemicalml/convention/unit_dictionary/constraints.rb +9 -1
  253. data/lib/chemicalml/convention/unit_dictionary.rb +4 -0
  254. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_id_must_match_pattern.rb +31 -0
  255. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_contain_at_least_one_unit_type.rb +27 -0
  256. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_have_namespace.rb +35 -0
  257. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_contain_definition.rb +27 -0
  258. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_have_id_and_name.rb +5 -5
  259. data/lib/chemicalml/convention/unit_type_dictionary/constraints.rb +9 -1
  260. data/lib/chemicalml/convention/unit_type_dictionary.rb +4 -0
  261. data/lib/chemicalml/convention/validation_report.rb +63 -0
  262. data/lib/chemicalml/convention.rb +11 -0
  263. data/lib/chemicalml/dictionary/entry.rb +6 -6
  264. data/lib/chemicalml/dictionary/enum.rb +1 -1
  265. data/lib/chemicalml/dictionary/link.rb +3 -3
  266. data/lib/chemicalml/dictionary/loader.rb +19 -19
  267. data/lib/chemicalml/dictionary/model.rb +5 -5
  268. data/lib/chemicalml/dictionary/registry.rb +9 -9
  269. data/lib/chemicalml/version.rb +1 -1
  270. data/lib/chemicalml/versioned_parser.rb +18 -0
  271. data/lib/chemicalml.rb +1 -2
  272. metadata +123 -34
  273. data/lib/chemicalml/cml/child_mappings.rb +0 -168
  274. data/lib/chemicalml/cml/translator/value_translations.rb +0 -270
  275. data/lib/chemicalml/cml/translator.rb +0 -484
  276. data/lib/chemicalml/model/atom.rb +0 -64
  277. data/lib/chemicalml/model/atom_parity.rb +0 -21
  278. data/lib/chemicalml/model/bond.rb +0 -39
  279. data/lib/chemicalml/model/bond_stereo.rb +0 -29
  280. data/lib/chemicalml/model/cml_array.rb +0 -27
  281. data/lib/chemicalml/model/cml_module.rb +0 -45
  282. data/lib/chemicalml/model/document.rb +0 -29
  283. data/lib/chemicalml/model/formula.rb +0 -34
  284. data/lib/chemicalml/model/identifier.rb +0 -21
  285. data/lib/chemicalml/model/label.rb +0 -21
  286. data/lib/chemicalml/model/matrix.rb +0 -29
  287. data/lib/chemicalml/model/metadata.rb +0 -23
  288. data/lib/chemicalml/model/metadata_list.rb +0 -25
  289. data/lib/chemicalml/model/molecule.rb +0 -45
  290. data/lib/chemicalml/model/name.rb +0 -21
  291. data/lib/chemicalml/model/node.rb +0 -45
  292. data/lib/chemicalml/model/parameter.rb +0 -27
  293. data/lib/chemicalml/model/parameter_list.rb +0 -25
  294. data/lib/chemicalml/model/product.rb +0 -21
  295. data/lib/chemicalml/model/product_list.rb +0 -21
  296. data/lib/chemicalml/model/property.rb +0 -28
  297. data/lib/chemicalml/model/property_list.rb +0 -25
  298. data/lib/chemicalml/model/reactant.rb +0 -21
  299. data/lib/chemicalml/model/reactant_list.rb +0 -21
  300. data/lib/chemicalml/model/reaction.rb +0 -41
  301. data/lib/chemicalml/model/reaction_list.rb +0 -23
  302. data/lib/chemicalml/model/scalar.rb +0 -25
  303. data/lib/chemicalml/model/substance.rb +0 -25
  304. data/lib/chemicalml/model.rb +0 -40
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module Operator
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module RelatedEntry
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module String
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module StringArray
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module Tcell
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Role
6
+ module Trow
7
+ end
8
+ end
9
+ end
10
+ end
@@ -134,6 +134,23 @@ module Chemicalml
134
134
  autoload :Xaxis, "chemicalml/cml/role/xaxis"
135
135
  autoload :Yaxis, "chemicalml/cml/role/yaxis"
136
136
  autoload :ZMatrix, "chemicalml/cml/role/z_matrix"
137
+ autoload :Alternative, "chemicalml/cml/role/alternative"
138
+ autoload :Arg, "chemicalml/cml/role/arg"
139
+ autoload :ComplexObject, "chemicalml/cml/role/complex_object"
140
+ autoload :Expression, "chemicalml/cml/role/expression"
141
+ autoload :Float, "chemicalml/cml/role/float"
142
+ autoload :FloatArray, "chemicalml/cml/role/float_array"
143
+ autoload :Integer, "chemicalml/cml/role/integer"
144
+ autoload :IntegerArray, "chemicalml/cml/role/integer_array"
145
+ autoload :Operator, "chemicalml/cml/role/operator"
146
+ autoload :RelatedEntry, "chemicalml/cml/role/related_entry"
147
+ autoload :String, "chemicalml/cml/role/string"
148
+ autoload :StringArray, "chemicalml/cml/role/string_array"
149
+ autoload :Tcell, "chemicalml/cml/role/tcell"
150
+ autoload :Trow, "chemicalml/cml/role/trow"
151
+ autoload :Annotation, "chemicalml/cml/role/annotation"
152
+ autoload :Appinfo, "chemicalml/cml/role/appinfo"
153
+ autoload :Enumeration, "chemicalml/cml/role/enumeration"
137
154
  end
138
155
  end
139
156
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Alternative < Lutaml::Model::Serializable
8
+ include Base::Alternative
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. `<annotation>` wraps documentation for an
7
+ # entry or element. Not in Schema 3.
8
+ class Annotation < Lutaml::Model::Serializable
9
+ include Base::Annotation
10
+ include Visitable
11
+ extend Context
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. `<appinfo>` carries application-specific
7
+ # metadata. Not in Schema 3.
8
+ class Appinfo < Lutaml::Model::Serializable
9
+ include Base::Appinfo
10
+ include Visitable
11
+ extend Context
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Arg < Lutaml::Model::Serializable
8
+ include Base::Arg
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # CML <module> wire class. Schema 2.4 declares <module> in its
7
+ # XSD (verified against `reference-docs/schemas/schema24/`), so
8
+ # this class exists and is registered by `Schema24::Configuration`.
9
+ # See `Chemicalml::Cml::Base::Module` for the shared attribute
10
+ # + xml-mapping declarations.
11
+ class Module < Lutaml::Model::Serializable
12
+ include Base::Module
13
+ include Visitable
14
+ extend Context
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class ComplexObject < Lutaml::Model::Serializable
8
+ include Base::ComplexObject
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,10 +8,13 @@ module Chemicalml
8
8
 
9
9
  CONTEXT_ID = :chemicalml_schema24
10
10
 
11
- # Schema 2.4 lacks the generic <module> element (introduced
12
- # in Schema 3) skip its registration.
11
+ # Schema 2.4 lacks <anyCml> (Schema 3 only) — skip its
12
+ # registration. Schema 2.4 also declares three legacy
13
+ # elements (<annotation>, <appinfo>, <enumeration>) not in
14
+ # Schema 3; register those explicitly from SCHEMA24_ONLY.
13
15
  def self.register_models!
14
16
  register_elements!(except: Chemicalml::Cml::Elements::SCHEMA3_ONLY)
17
+ register_elements!(only: true)
15
18
  end
16
19
  end
17
20
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. `<enumeration>` declares a closed/open set of
7
+ # values for a dictionary entry. Not in Schema 3 (Schema 3 uses
8
+ # the `enum` attribute on `<entry>`).
9
+ class Enumeration < Lutaml::Model::Serializable
10
+ include Base::Enumeration
11
+ include Visitable
12
+ extend Context
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Expression < Lutaml::Model::Serializable
8
+ include Base::Expression
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Float < Lutaml::Model::Serializable
8
+ include Base::Float
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class FloatArray < Lutaml::Model::Serializable
8
+ include Base::FloatArray
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Integer < Lutaml::Model::Serializable
8
+ include Base::Integer
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class IntegerArray < Lutaml::Model::Serializable
8
+ include Base::IntegerArray
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Operator < Lutaml::Model::Serializable
8
+ include Base::Operator
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class RelatedEntry < Lutaml::Model::Serializable
8
+ include Base::RelatedEntry
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class String < Lutaml::Model::Serializable
8
+ include Base::String
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class StringArray < Lutaml::Model::Serializable
8
+ include Base::StringArray
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Tcell < Lutaml::Model::Serializable
8
+ include Base::Tcell
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cml
5
+ module Schema24
6
+ # Schema 2.4 only. Not in Schema 3.
7
+ class Trow < Lutaml::Model::Serializable
8
+ include Base::Trow
9
+ include Visitable
10
+ extend Context
11
+ end
12
+ end
13
+ end
14
+ end
@@ -7,10 +7,21 @@ module Chemicalml
7
7
  # `Base::*` mixin and `Visitable`, and `extend`s
8
8
  # `Schema24::Context` for `lutaml_default_register`.
9
9
  #
10
- # NOTE: Schema 2.4 lacks the generic `<module>` element
11
- # (introduced in Schema 3). `Schema24::Module` therefore does not
12
- # exist compchem-convention documents MUST be parsed as
13
- # Schema 3. See `Chemicalml::Cml::Elements::SCHEMA3_ONLY`.
10
+ # Schema 2.4 wire classes. Same structure as Schema3 — each is a
11
+ # `Lutaml::Model::Serializable` subclass that includes the
12
+ # `Base::*` mixin and `Visitable`, and `extend`s
13
+ # `Schema24::Context` for `lutaml_default_register`.
14
+ #
15
+ # Schema 2.4 lacks `<anyCml>` (Schema 3 only — see
16
+ # `Chemicalml::Cml::Elements::SCHEMA3_ONLY`). Every other element
17
+ # modeled here is declared in the Schema 2.4 XSD, including
18
+ # `<module>`. Schema 2.4 also declares 17 legacy elements not in
19
+ # Schema 3 (`alternative`, `annotation`, `appinfo`, `arg`,
20
+ # `complexObject`, `enumeration`, `expression`, `float`,
21
+ # `floatArray`, `integer`, `integerArray`, `operator`,
22
+ # `relatedEntry`, `string`, `stringArray`, `tcell`, `trow`); all
23
+ # are modeled under Schema24 only and registered via
24
+ # `Elements::SCHEMA24_ONLY`.
14
25
  module Schema24
15
26
  extend Chemicalml::VersionedParser
16
27
 
@@ -19,7 +30,6 @@ module Chemicalml
19
30
  autoload :ActionList, "chemicalml/cml/schema24/action_list"
20
31
  autoload :Amount, "chemicalml/cml/schema24/amount"
21
32
  autoload :Angle, "chemicalml/cml/schema24/angle"
22
- autoload :AnyCml, "chemicalml/cml/schema24/any_cml"
23
33
  autoload :ArrayList, "chemicalml/cml/schema24/array_list"
24
34
  autoload :AtomSet, "chemicalml/cml/schema24/atom_set"
25
35
  autoload :AtomType, "chemicalml/cml/schema24/atom_type"
@@ -121,6 +131,7 @@ module Chemicalml
121
131
  autoload :Matrix, "chemicalml/cml/schema24/matrix"
122
132
  autoload :Metadata, "chemicalml/cml/schema24/metadata"
123
133
  autoload :MetadataList, "chemicalml/cml/schema24/metadata_list"
134
+ autoload :Module, "chemicalml/cml/schema24/cml_module"
124
135
  autoload :Molecule, "chemicalml/cml/schema24/molecule"
125
136
  autoload :Name, "chemicalml/cml/schema24/name"
126
137
  autoload :Parameter, "chemicalml/cml/schema24/parameter"
@@ -139,6 +150,23 @@ module Chemicalml
139
150
  autoload :UnitList, "chemicalml/cml/schema24/unit_list"
140
151
  autoload :UnitType, "chemicalml/cml/schema24/unit_type"
141
152
  autoload :UnitTypeList, "chemicalml/cml/schema24/unit_type_list"
153
+ autoload :Alternative, "chemicalml/cml/schema24/alternative"
154
+ autoload :Arg, "chemicalml/cml/schema24/arg"
155
+ autoload :ComplexObject, "chemicalml/cml/schema24/complex_object"
156
+ autoload :Expression, "chemicalml/cml/schema24/expression"
157
+ autoload :Float, "chemicalml/cml/schema24/float"
158
+ autoload :FloatArray, "chemicalml/cml/schema24/float_array"
159
+ autoload :Integer, "chemicalml/cml/schema24/integer"
160
+ autoload :IntegerArray, "chemicalml/cml/schema24/integer_array"
161
+ autoload :Operator, "chemicalml/cml/schema24/operator"
162
+ autoload :RelatedEntry, "chemicalml/cml/schema24/related_entry"
163
+ autoload :String, "chemicalml/cml/schema24/string"
164
+ autoload :StringArray, "chemicalml/cml/schema24/string_array"
165
+ autoload :Tcell, "chemicalml/cml/schema24/tcell"
166
+ autoload :Trow, "chemicalml/cml/schema24/trow"
167
+ autoload :Annotation, "chemicalml/cml/schema24/annotation"
168
+ autoload :Appinfo, "chemicalml/cml/schema24/appinfo"
169
+ autoload :Enumeration, "chemicalml/cml/schema24/enumeration"
142
170
 
143
171
  def self.schema
144
172
  SCHEMA
@@ -9,17 +9,15 @@ module Chemicalml
9
9
  module Cml
10
10
  # Structural modules (each in its own file, loaded independently).
11
11
  autoload :Base, "chemicalml/cml/base"
12
- autoload :ChildMappings, "chemicalml/cml/child_mappings"
13
12
  autoload :Elements, "chemicalml/cml/elements"
14
13
  autoload :Namespace, "chemicalml/cml/namespace"
15
14
  autoload :Role, "chemicalml/cml/role"
16
15
  autoload :Schema3, "chemicalml/cml/schema3"
17
16
  autoload :Schema24, "chemicalml/cml/schema24"
18
- autoload :Translator, "chemicalml/cml/translator"
19
17
  autoload :Visitable, "chemicalml/cml/visitable"
20
18
  autoload :WireClassRegistry, "chemicalml/cml/wire_class_registry"
21
19
 
22
- # Backward-compatible aliases (Cml::Foo = Schema3::Foo). All 36
20
+ # Backward-compatible aliases (Cml::Foo = Schema3::Foo). All 121
23
21
  # aliases load from a single file via autoload — the file loads
24
22
  # lazily when the first alias is referenced, then defines all of
25
23
  # them via const_set (aliasing existing Schema3 classes, not
@@ -40,10 +40,16 @@ module Chemicalml
40
40
  # each class on the parent (schema) module, and register it. Pass
41
41
  # `except:` to skip specific elements (used by Schema 2.4 which
42
42
  # lacks `<module>`).
43
- def register_elements!(except: [])
43
+ def register_elements!(except: [], only: nil)
44
44
  parent = version_parent_module
45
45
  skip = except.to_set
46
- Chemicalml::Cml::Elements::ALL.each do |class_name, element_id|
46
+ source =
47
+ if only
48
+ Chemicalml::Cml::Elements::SCHEMA24_ONLY
49
+ else
50
+ Chemicalml::Cml::Elements::ALL
51
+ end
52
+ source.each do |class_name, element_id|
47
53
  next if skip.include?(class_name)
48
54
  next unless parent.const_defined?(class_name)
49
55
 
@@ -27,13 +27,20 @@ module Chemicalml
27
27
 
28
28
  def register(constraint_class)
29
29
  constraints << constraint_class unless constraints.include?(constraint_class)
30
+ @coordinator = nil # invalidate cached coordinator
30
31
  self
31
32
  end
32
33
 
34
+ # Single-pass validation via Convention::Coordinator. The
35
+ # coordinator builds a role-dispatch table from the declared
36
+ # `applies_to` on each constraint, walks the tree once, and
37
+ # dispatches each node only to applicable constraints.
33
38
  def validate(document)
34
- constraints.flat_map do |klass|
35
- klass.new.check(document)
36
- end
39
+ coordinator.validate(document)
40
+ end
41
+
42
+ def validate_report(document)
43
+ ValidationReport.new(validate(document))
37
44
  end
38
45
 
39
46
  def constraint_count
@@ -42,6 +49,13 @@ module Chemicalml
42
49
 
43
50
  def reset_constraints!
44
51
  @constraints = []
52
+ @coordinator = nil
53
+ end
54
+
55
+ private
56
+
57
+ def coordinator
58
+ @coordinator ||= Coordinator.new(constraints)
45
59
  end
46
60
  end
47
61
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Convention
5
+ module Compchem
6
+ module Constraints
7
+ # CompChem `array` value-container rules: MUST have `size`
8
+ # attribute (≥ 1); `dataType` MUST be integer or double;
9
+ # MUST have `units`.
10
+ class ArrayRules < Chemicalml::Convention::Constraint::NodeConstraint
11
+ applies_to Chemicalml::Cml::Role::Array
12
+ include ModulePredicates
13
+
14
+ ALLOWED_TYPES = %w[xsd:integer xsd:double].freeze
15
+
16
+ def check_node(node, path)
17
+
18
+ violations = []
19
+ if node.size.to_s.empty? || node.size.to_i < 1
20
+ violations << violation(path: path.join('/'),
21
+ message: 'array must have a size attribute (minimum 1)')
22
+ end
23
+ unless ALLOWED_TYPES.include?(node.data_type.to_s)
24
+ violations << violation(path: path.join('/'),
25
+ message: 'array dataType must be xsd:integer or xsd:double ' \
26
+ "(got #{node.data_type.inspect})")
27
+ end
28
+ if node.units.to_s.empty?
29
+ violations << violation(path: path.join('/'),
30
+ message: 'array must have units (even if dimensionless)')
31
+ end
32
+ violations
33
+ end
34
+
35
+ private
36
+
37
+ def array?(node)
38
+ node.is_a?(Chemicalml::Cml::Role::Array)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Convention
5
+ module Compchem
6
+ module Constraints
7
+ # Co-constraint: if a calculation module is present inside a
8
+ # job, a finalization MUST also be present.
9
+ class CalculationRequiresFinalization < Chemicalml::Convention::Constraint::NodeConstraint
10
+ applies_to Chemicalml::Cml::Role::Module
11
+ include ModulePredicates
12
+
13
+ def check_node(node, path)
14
+
15
+ calculations = child_modules_with(node, 'compchem:calculation')
16
+ finalizations = child_modules_with(node, 'compchem:finalization')
17
+ return [] if calculations.empty?
18
+ return [] unless finalizations.empty?
19
+
20
+ [violation(path: path.join('/'),
21
+ message: 'job module has a calculation but no finalization ' \
22
+ '(finalization MUST be present when calculation is)')]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -10,17 +10,17 @@ module Chemicalml
10
10
  def check_node(node, path)
11
11
  return [] unless compchem_root?(node)
12
12
 
13
- job_lists = node.modules.select { |m| m.dict_ref == "compchem:jobList" }
13
+ job_lists = node.modules.select { |m| m.dict_ref == 'compchem:jobList' }
14
14
  return [] unless job_lists.empty?
15
15
 
16
- [violation(path: path.join("/"),
17
- message: "compchem module must contain at least one jobList module")]
16
+ [violation(path: path.join('/'),
17
+ message: 'compchem module must contain at least one jobList module')]
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def compchem_root?(node)
23
- module?(node) && node.convention == "convention:compchem"
23
+ module?(node) && node.convention == 'convention:compchem'
24
24
  end
25
25
 
26
26
  def module?(node)