@mat3ra/made 2026.8.7-0 → 2026.8.18-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.
Files changed (522) hide show
  1. package/dist/js/Material.d.ts +219 -0
  2. package/dist/js/Material.js +457 -0
  3. package/dist/js/basis/basis.d.ts +14 -9
  4. package/dist/js/basis/basis.js +15 -13
  5. package/dist/js/basis/constrained_basis.d.ts +9 -7
  6. package/dist/js/basis/constrained_basis.js +4 -4
  7. package/dist/js/generated/MaterialSchemaMixin.d.ts +5 -0
  8. package/dist/js/generated/MaterialSchemaMixin.js +69 -0
  9. package/dist/js/lattice/lattice.d.ts +4 -3
  10. package/dist/js/lattice/lattice.js +1 -2
  11. package/dist/js/made.d.ts +12 -12
  12. package/dist/js/made.js +38 -5
  13. package/dist/js/parsers/espresso.d.ts +2 -3
  14. package/dist/js/parsers/espresso.js +0 -1
  15. package/dist/js/parsers/native_format_parsers.d.ts +9 -8
  16. package/dist/js/parsers/native_format_parsers.js +6 -6
  17. package/dist/js/parsers/parsers.d.ts +6 -6
  18. package/dist/js/parsers/poscar.d.ts +5 -4
  19. package/dist/js/parsers/poscar.js +3 -2
  20. package/dist/js/parsers/xyz.d.ts +3 -5
  21. package/dist/js/parsers/xyz.js +3 -4
  22. package/dist/js/parsers/xyz_combinatorial_basis.js +3 -1
  23. package/dist/js/tools/basis.d.ts +1 -1
  24. package/dist/js/tools/index.d.ts +7 -7
  25. package/dist/js/tools/material.d.ts +1 -1
  26. package/dist/js/tools/material.js +8 -7
  27. package/dist/js/tools/supercell.d.ts +4 -5
  28. package/dist/js/tools/supercell.js +2 -4
  29. package/dist/js/tools/surface.d.ts +4 -4
  30. package/dist/js/tools/surface.js +2 -7
  31. package/package.json +12 -8
  32. package/.babelrc +0 -10
  33. package/.eslintrc.json +0 -11
  34. package/.gitattributes +0 -1
  35. package/.husky/post-checkout +0 -3
  36. package/.husky/post-commit +0 -3
  37. package/.husky/post-merge +0 -3
  38. package/.husky/pre-commit +0 -6
  39. package/.husky/pre-push +0 -3
  40. package/.mocharc.json +0 -5
  41. package/.pre-commit-config.yaml +0 -26
  42. package/.prettierignore +0 -2
  43. package/.prettierrc +0 -6
  44. package/AGENTS.md +0 -133
  45. package/MANIFEST.in +0 -1
  46. package/data/constants.json +0 -13
  47. package/data/reciprocal_paths.json +0 -111
  48. package/dist/js/material.d.ts +0 -169
  49. package/dist/js/material.js +0 -362
  50. package/images/made/tools/tools_diagram_general.png +0 -3
  51. package/images/made/tools/tools_diagram_interface.png +0 -3
  52. package/pyproject.toml +0 -123
  53. package/src/__init__.py +0 -0
  54. package/src/js/basis/basis.ts +0 -621
  55. package/src/js/basis/constrained_basis.ts +0 -114
  56. package/src/js/basis/coordinates.ts +0 -93
  57. package/src/js/basis/elements.ts +0 -24
  58. package/src/js/basis/helpers.ts +0 -20
  59. package/src/js/basis/labels.ts +0 -6
  60. package/src/js/cell/cell.ts +0 -150
  61. package/src/js/cell/conventional_cell.ts +0 -86
  62. package/src/js/cell/primitive_cell.ts +0 -166
  63. package/src/js/constants/molecule.ts +0 -18
  64. package/src/js/constants.ts +0 -4
  65. package/src/js/constraints/constraints.ts +0 -45
  66. package/src/js/lattice/lattice.ts +0 -306
  67. package/src/js/lattice/lattice_types.ts +0 -134
  68. package/src/js/lattice/reciprocal/lattice_reciprocal.ts +0 -193
  69. package/src/js/lattice/reciprocal/paths.ts +0 -39
  70. package/src/js/lattice/reciprocal/symmetry_points.ts +0 -886
  71. package/src/js/lattice/unit_cell.ts +0 -66
  72. package/src/js/made.ts +0 -62
  73. package/src/js/material.ts +0 -458
  74. package/src/js/parsers/cif.ts +0 -25
  75. package/src/js/parsers/errors.ts +0 -6
  76. package/src/js/parsers/espresso.ts +0 -30
  77. package/src/js/parsers/native_format_parsers.ts +0 -51
  78. package/src/js/parsers/parsers.ts +0 -13
  79. package/src/js/parsers/poscar.ts +0 -212
  80. package/src/js/parsers/xyz.ts +0 -187
  81. package/src/js/parsers/xyz_combinatorial_basis.ts +0 -265
  82. package/src/js/tools/basis.ts +0 -132
  83. package/src/js/tools/cell.ts +0 -41
  84. package/src/js/tools/index.ts +0 -11
  85. package/src/js/tools/material.ts +0 -62
  86. package/src/js/tools/supercell.ts +0 -88
  87. package/src/js/tools/surface.ts +0 -223
  88. package/src/py/__init__.py +0 -0
  89. package/src/py/mat3ra/__init__.py +0 -1
  90. package/src/py/mat3ra/made/__init__.py +0 -7
  91. package/src/py/mat3ra/made/basis/__init__.py +0 -255
  92. package/src/py/mat3ra/made/basis/coordinates.py +0 -43
  93. package/src/py/mat3ra/made/cell/__init__.py +0 -55
  94. package/src/py/mat3ra/made/cell/primitive_cell.py +0 -156
  95. package/src/py/mat3ra/made/data_helper.py +0 -5
  96. package/src/py/mat3ra/made/lattice.py +0 -195
  97. package/src/py/mat3ra/made/material.py +0 -134
  98. package/src/py/mat3ra/made/metadata.py +0 -45
  99. package/src/py/mat3ra/made/reciprocal/__init__.py +0 -5
  100. package/src/py/mat3ra/made/reciprocal/lattice_reciprocal.py +0 -147
  101. package/src/py/mat3ra/made/reciprocal/paths.py +0 -30
  102. package/src/py/mat3ra/made/reciprocal/symmetry_points.py +0 -385
  103. package/src/py/mat3ra/made/tools/README.md +0 -173
  104. package/src/py/mat3ra/made/tools/__init__.py +0 -0
  105. package/src/py/mat3ra/made/tools/analyze/__init__.py +0 -31
  106. package/src/py/mat3ra/made/tools/analyze/basis/__init__.py +0 -3
  107. package/src/py/mat3ra/made/tools/analyze/basis/analyzer.py +0 -50
  108. package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer.py +0 -32
  109. package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer_factory.py +0 -31
  110. package/src/py/mat3ra/made/tools/analyze/coordination.py +0 -56
  111. package/src/py/mat3ra/made/tools/analyze/crystal_site/__init__.py +0 -0
  112. package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_crystal_site_material_analyzer.py +0 -35
  113. package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_material_analyzer.py +0 -49
  114. package/src/py/mat3ra/made/tools/analyze/crystal_site/crystal_site_analyzer.py +0 -65
  115. package/src/py/mat3ra/made/tools/analyze/crystal_site/voronoi_crystal_site_analyzer.py +0 -47
  116. package/src/py/mat3ra/made/tools/analyze/enums.py +0 -33
  117. package/src/py/mat3ra/made/tools/analyze/fingerprint/__init__.py +0 -4
  118. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/__init__.py +0 -0
  119. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/layered_fingerprint_along_axis.py +0 -83
  120. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/unique_element_string_per_layer.py +0 -9
  121. package/src/py/mat3ra/made/tools/analyze/interface/__init__.py +0 -20
  122. package/src/py/mat3ra/made/tools/analyze/interface/commensurate.py +0 -156
  123. package/src/py/mat3ra/made/tools/analyze/interface/enums.py +0 -60
  124. package/src/py/mat3ra/made/tools/analyze/interface/grain_boundary.py +0 -80
  125. package/src/py/mat3ra/made/tools/analyze/interface/simple.py +0 -251
  126. package/src/py/mat3ra/made/tools/analyze/interface/twisted_nanoribbons.py +0 -91
  127. package/src/py/mat3ra/made/tools/analyze/interface/utils/__init__.py +0 -77
  128. package/src/py/mat3ra/made/tools/analyze/interface/utils/holders.py +0 -14
  129. package/src/py/mat3ra/made/tools/analyze/interface/utils/vector.py +0 -56
  130. package/src/py/mat3ra/made/tools/analyze/interface/zsl.py +0 -259
  131. package/src/py/mat3ra/made/tools/analyze/interface_material.py +0 -45
  132. package/src/py/mat3ra/made/tools/analyze/lattice/__init__.py +0 -2
  133. package/src/py/mat3ra/made/tools/analyze/lattice/analyzer.py +0 -126
  134. package/src/py/mat3ra/made/tools/analyze/lattice/helpers.py +0 -31
  135. package/src/py/mat3ra/made/tools/analyze/lattice_lines.py +0 -30
  136. package/src/py/mat3ra/made/tools/analyze/lattice_planes.py +0 -192
  137. package/src/py/mat3ra/made/tools/analyze/lattice_swap_analyzer.py +0 -105
  138. package/src/py/mat3ra/made/tools/analyze/material.py +0 -276
  139. package/src/py/mat3ra/made/tools/analyze/other.py +0 -434
  140. package/src/py/mat3ra/made/tools/analyze/rdf.py +0 -74
  141. package/src/py/mat3ra/made/tools/analyze/slab.py +0 -76
  142. package/src/py/mat3ra/made/tools/analyze/solid_solution_analyzer.py +0 -171
  143. package/src/py/mat3ra/made/tools/analyze/terrace.py +0 -105
  144. package/src/py/mat3ra/made/tools/analyze/utils.py +0 -162
  145. package/src/py/mat3ra/made/tools/bond_directions/__init__.py +0 -0
  146. package/src/py/mat3ra/made/tools/bond_directions/bond_directions.py +0 -150
  147. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_for_element_list.py +0 -7
  148. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_enum.py +0 -8
  149. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_for_element.py +0 -16
  150. package/src/py/mat3ra/made/tools/build/__init__.py +0 -25
  151. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/__init__.py +0 -7
  152. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/helpers.py +0 -59
  153. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/types.py +0 -26
  154. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/utils.py +0 -139
  155. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/__init__.py +0 -47
  156. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/__init__.py +0 -11
  157. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/build_parameters.py +0 -5
  158. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/builder.py +0 -164
  159. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/configuration.py +0 -48
  160. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/helpers.py +0 -134
  161. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/__init__.py +0 -6
  162. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/helpers.py +0 -157
  163. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/enums.py +0 -7
  164. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/__init__.py +0 -7
  165. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/configuration.py +0 -13
  166. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/helpers.py +0 -70
  167. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/utils.py +0 -87
  168. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/__init__.py +0 -6
  169. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/helpers.py +0 -129
  170. package/src/py/mat3ra/made/tools/build/defective_structures/__init__.py +0 -0
  171. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/__init__.py +0 -0
  172. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/__init__.py +0 -0
  173. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/build_parameters.py +0 -12
  174. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/builder.py +0 -17
  175. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/configuration.py +0 -40
  176. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/helpers.py +0 -82
  177. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/__init__.py +0 -1
  178. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/__init__.py +0 -9
  179. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/builder.py +0 -37
  180. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/configuration.py +0 -30
  181. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/enums.py +0 -8
  182. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/helpers.py +0 -76
  183. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/__init__.py +0 -0
  184. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/__init__.py +0 -0
  185. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/builder.py +0 -11
  186. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/configuration.py +0 -18
  187. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/helpers.py +0 -137
  188. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/types.py +0 -22
  189. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/__init__.py +0 -0
  190. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/builder.py +0 -28
  191. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/configuration.py +0 -55
  192. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/helpers.py +0 -75
  193. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/builder.py +0 -15
  194. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/configuration.py +0 -16
  195. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/helpers.py +0 -116
  196. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/build_parameters.py +0 -10
  197. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/builder.py +0 -30
  198. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/configuration.py +0 -11
  199. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/helpers.py +0 -78
  200. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/__init__.py +0 -0
  201. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/__init__.py +0 -0
  202. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/builder.py +0 -31
  203. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/configuration.py +0 -45
  204. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/helpers.py +0 -80
  205. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/__init__.py +0 -40
  206. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/atom_placement_method_enum.py +0 -14
  207. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/__init__.py +0 -7
  208. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/builder.py +0 -42
  209. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/configuration.py +0 -27
  210. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/complex_defect_type_enum.py +0 -5
  211. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/factories.py +0 -69
  212. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/helpers.py +0 -92
  213. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/__init__.py +0 -7
  214. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/builder.py +0 -8
  215. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/configuration.py +0 -29
  216. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/helpers.py +0 -48
  217. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/interstitial_placement_method_enum.py +0 -8
  218. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/point_defect_type_enum.py +0 -8
  219. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/__init__.py +0 -7
  220. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/builder.py +0 -6
  221. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/configuration.py +0 -41
  222. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/helpers.py +0 -43
  223. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/substitution_placement_method_enum.py +0 -7
  224. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/types.py +0 -24
  225. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/__init__.py +0 -7
  226. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/builder.py +0 -19
  227. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/configuration.py +0 -27
  228. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/helpers.py +0 -42
  229. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/vacancy_placement_method_enum.py +0 -7
  230. package/src/py/mat3ra/made/tools/build/pristine_structures/__init__.py +0 -0
  231. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/__init__.py +0 -0
  232. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/builder.py +0 -80
  233. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/configurations.py +0 -22
  234. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/helpers.py +0 -40
  235. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/__init__.py +0 -0
  236. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/__init__.py +0 -29
  237. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/build_parameters.py +0 -5
  238. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/builders.py +0 -56
  239. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/configuration.py +0 -33
  240. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/helpers.py +0 -76
  241. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/__init__.py +0 -11
  242. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/build_parameters.py +0 -9
  243. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/builders.py +0 -83
  244. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/configuration.py +0 -35
  245. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/helpers.py +0 -62
  246. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/__init__.py +0 -9
  247. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/build_parameters.py +0 -8
  248. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/builder.py +0 -42
  249. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/configuration.py +0 -99
  250. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/helpers.py +0 -95
  251. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/termination_utils.py +0 -14
  252. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/utils.py +0 -61
  253. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/builder.py +0 -22
  254. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/configuration.py +0 -17
  255. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/__init__.py +0 -0
  256. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/__init__.py +0 -19
  257. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/analyzer.py +0 -86
  258. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/__init__.py +0 -7
  259. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/builder.py +0 -54
  260. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/configuration.py +0 -19
  261. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/enums.py +0 -42
  262. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/helpers.py +0 -127
  263. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/__init__.py +0 -7
  264. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/builder.py +0 -33
  265. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/configuration.py +0 -16
  266. package/src/py/mat3ra/made/tools/build/processed_structures/__init__.py +0 -0
  267. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/__init__.py +0 -0
  268. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/__init__.py +0 -0
  269. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/__init__.py +0 -9
  270. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/coordination_based_passivation_material_analyzer.py +0 -112
  271. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/passivation_material_analyzer.py +0 -16
  272. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/surface_passivation_material_analyzer.py +0 -32
  273. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/builder.py +0 -23
  274. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/configuration.py +0 -31
  275. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/enums.py +0 -7
  276. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/helpers.py +0 -151
  277. package/src/py/mat3ra/made/tools/build_components/__init__.py +0 -10
  278. package/src/py/mat3ra/made/tools/build_components/entities/__init__.py +0 -0
  279. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/__init__.py +0 -0
  280. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/one_dimensional/miller_indices_2d.py +0 -0
  281. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/miller_indices.py +0 -18
  282. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/termination.py +0 -33
  283. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/__init__.py +0 -0
  284. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/__init__.py +0 -2
  285. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site.py +0 -24
  286. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site_list.py +0 -9
  287. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/builder.py +0 -32
  288. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/configuration.py +0 -14
  289. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/__init__.py +0 -0
  290. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/builder.py +0 -29
  291. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/configuration.py +0 -19
  292. package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/builder.py +0 -48
  293. package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/configuration.py +0 -17
  294. package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/builder.py +0 -25
  295. package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/configuration.py +0 -8
  296. package/src/py/mat3ra/made/tools/build_components/entities/reusable/__init__.py +0 -0
  297. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/__init__.py +0 -16
  298. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_configuration_pydantic.py +0 -5
  299. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_single_builder.py +0 -87
  300. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/build_parameters.py +0 -5
  301. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/__init__.py +0 -0
  302. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/__init__.py +0 -4
  303. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/builder.py +0 -46
  304. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/configuration.py +0 -19
  305. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/edge_types.py +0 -51
  306. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/helpers.py +0 -58
  307. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/__init__.py +0 -4
  308. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/builder.py +0 -42
  309. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/configuration.py +0 -21
  310. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/__init__.py +0 -0
  311. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/configuration.py +0 -11
  312. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/helpers.py +0 -38
  313. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/__init__.py +0 -24
  314. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/__init__.py +0 -7
  315. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/builder.py +0 -62
  316. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/configuration.py +0 -14
  317. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/helpers.py +0 -42
  318. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/__init__.py +0 -7
  319. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/builder.py +0 -39
  320. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/configuration.py +0 -24
  321. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/__init__.py +0 -10
  322. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/builder.py +0 -36
  323. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/configuration.py +0 -31
  324. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/helpers.py +0 -80
  325. package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/__init__.py +0 -0
  326. package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/coordinates_shape_enum.py +0 -8
  327. package/src/py/mat3ra/made/tools/build_components/metadata/__init__.py +0 -2
  328. package/src/py/mat3ra/made/tools/build_components/metadata/build_metadata.py +0 -7
  329. package/src/py/mat3ra/made/tools/build_components/metadata/material_build_metadata.py +0 -35
  330. package/src/py/mat3ra/made/tools/build_components/metadata/material_with_build_metadata.py +0 -8
  331. package/src/py/mat3ra/made/tools/build_components/mixins/__init__.py +0 -2
  332. package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_ase_atoms_mixin.py +0 -8
  333. package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_pymatgen_structure_mixin.py +0 -8
  334. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/__init__.py +0 -0
  335. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/enums.py +0 -11
  336. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/__init__.py +0 -6
  337. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/build_parameters.py +0 -18
  338. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/builder.py +0 -93
  339. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/configuration.py +0 -20
  340. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/builder.py +0 -83
  341. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/configuration.py +0 -24
  342. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/__init__.py +0 -15
  343. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/build_parameters.py +0 -5
  344. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/base.py +0 -33
  345. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/isometric.py +0 -25
  346. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/configuration.py +0 -24
  347. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/__init__.py +0 -13
  348. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/atomic_mass_dependent_function_holder.py +0 -32
  349. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/function_holder.py +0 -80
  350. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/maxwell_boltzmann.py +0 -39
  351. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/perturbation_function_holder.py +0 -45
  352. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/sine_wave_perturbation_function_holder.py +0 -29
  353. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/helpers.py +0 -83
  354. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py +0 -5
  355. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py +0 -25
  356. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py +0 -23
  357. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py +0 -49
  358. package/src/py/mat3ra/made/tools/build_components/utils.py +0 -44
  359. package/src/py/mat3ra/made/tools/calculate/__init__.py +0 -149
  360. package/src/py/mat3ra/made/tools/calculate/ase/__init__.py +0 -133
  361. package/src/py/mat3ra/made/tools/calculate/ase/constraints.py +0 -91
  362. package/src/py/mat3ra/made/tools/calculate/calculators/__init__.py +0 -4
  363. package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator.py +0 -70
  364. package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator_parameters.py +0 -14
  365. package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator.py +0 -32
  366. package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator_parameters.py +0 -17
  367. package/src/py/mat3ra/made/tools/calculate/interaction_functions.py +0 -23
  368. package/src/py/mat3ra/made/tools/convert/__init__.py +0 -286
  369. package/src/py/mat3ra/made/tools/convert/interface_parts_enum.py +0 -9
  370. package/src/py/mat3ra/made/tools/convert/utils.py +0 -96
  371. package/src/py/mat3ra/made/tools/entities/__init__.py +0 -5
  372. package/src/py/mat3ra/made/tools/entities/coordinate/__init__.py +0 -14
  373. package/src/py/mat3ra/made/tools/entities/coordinate/box_coordinate_condition.py +0 -15
  374. package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_condition.py +0 -16
  375. package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_functions.py +0 -158
  376. package/src/py/mat3ra/made/tools/entities/coordinate/cylinder_coordinate_condition.py +0 -17
  377. package/src/py/mat3ra/made/tools/entities/coordinate/plane_coordinate_condition.py +0 -14
  378. package/src/py/mat3ra/made/tools/entities/coordinate/sphere_coordinate_condition.py +0 -15
  379. package/src/py/mat3ra/made/tools/entities/coordinate/triangular_prism_coordinate_condition.py +0 -26
  380. package/src/py/mat3ra/made/tools/entities/termination_holder.py +0 -12
  381. package/src/py/mat3ra/made/tools/helpers.py +0 -168
  382. package/src/py/mat3ra/made/tools/modify.py +0 -627
  383. package/src/py/mat3ra/made/tools/operations/core/binary.py +0 -106
  384. package/src/py/mat3ra/made/tools/operations/core/unary.py +0 -170
  385. package/src/py/mat3ra/made/tools/operations/core/utils.py +0 -138
  386. package/src/py/mat3ra/made/tools/operations/reusable/unary.py +0 -53
  387. package/src/py/mat3ra/made/tools/optimize.py +0 -55
  388. package/src/py/mat3ra/made/tools/third_party.py +0 -69
  389. package/src/py/mat3ra/made/tools/utils.py +0 -182
  390. package/src/py/mat3ra/made/utils.py +0 -144
  391. package/tests/.gitattributes +0 -1
  392. package/tests/fixtures/AsGe-basis.json +0 -3
  393. package/tests/fixtures/C2H4-translated.json +0 -3
  394. package/tests/fixtures/C2H4.json +0 -3
  395. package/tests/fixtures/FeLiSi-basis.json +0 -3
  396. package/tests/fixtures/FeO.json +0 -3
  397. package/tests/fixtures/Ge2-basis.json +0 -3
  398. package/tests/fixtures/Graphene.json +0 -3
  399. package/tests/fixtures/Graphene.poscar +0 -3
  400. package/tests/fixtures/H2+H-final.json +0 -3
  401. package/tests/fixtures/H2+H-image.json +0 -3
  402. package/tests/fixtures/H2+H-initial.json +0 -3
  403. package/tests/fixtures/H2O.poscar +0 -3
  404. package/tests/fixtures/LiFeSi-basis-labels.json +0 -3
  405. package/tests/fixtures/LiFeSi-basis.json +0 -3
  406. package/tests/fixtures/Na.json +0 -3
  407. package/tests/fixtures/Na4Cl4-cartesian.json +0 -3
  408. package/tests/fixtures/Na4Cl4.json +0 -3
  409. package/tests/fixtures/Na4Cl4.poscar +0 -3
  410. package/tests/fixtures/Ni-hex.json +0 -3
  411. package/tests/fixtures/Ni-hex.poscar +0 -3
  412. package/tests/fixtures/OSi-basis.json +0 -3
  413. package/tests/fixtures/Si-hex.poscar +0 -3
  414. package/tests/fixtures/Si-pwscf.in +0 -3
  415. package/tests/fixtures/Si-slab.json +0 -3
  416. package/tests/fixtures/Si-supercell.json +0 -3
  417. package/tests/fixtures/Si2-basis-repeated.json +0 -3
  418. package/tests/fixtures/Si2-basis.json +0 -3
  419. package/tests/fixtures/Zr1H23Zr1H1.json +0 -3
  420. package/tests/fixtures/Zr1H23Zr1H1.poscar +0 -3
  421. package/tests/fixtures/atomic-constraints.json +0 -3
  422. package/tests/fixtures/hashes.json +0 -3
  423. package/tests/fixtures/si-slab-100.json +0 -3
  424. package/tests/fixtures/si-slab-111-0-vacuum.json +0 -3
  425. package/tests/fixtures/si-slab-111-0.5-vacuum-gamma-120.json +0 -3
  426. package/tests/fixtures/si-slab-111-0.5-vacuum-ratio.json +0 -3
  427. package/tests/fixtures/si-standata.json +0 -3
  428. package/tests/js/basis/basis.ts +0 -247
  429. package/tests/js/cell/cell.ts +0 -182
  430. package/tests/js/cell/primitive_cell.ts +0 -21
  431. package/tests/js/constraints/constraints.ts +0 -11
  432. package/tests/js/fixtures.ts +0 -120
  433. package/tests/js/lattice/lattice.ts +0 -43
  434. package/tests/js/lattice/lattice_reciprocal.ts +0 -104
  435. package/tests/js/material.test.ts +0 -42
  436. package/tests/js/parsers/espresso.ts +0 -15
  437. package/tests/js/parsers/native_formats.ts +0 -35
  438. package/tests/js/parsers/poscar.ts +0 -89
  439. package/tests/js/parsers/xyz.ts +0 -33
  440. package/tests/js/parsers/xyz_combinatorial_basis.ts +0 -156
  441. package/tests/js/setup.ts +0 -6
  442. package/tests/js/tools/basis.ts +0 -22
  443. package/tests/js/tools/supercell.ts +0 -58
  444. package/tests/js/tools/surface.ts +0 -115
  445. package/tests/py/conftest.py +0 -34
  446. package/tests/py/mat3ra/debug_utils.py +0 -75
  447. package/tests/py/unit/__init__.py +0 -0
  448. package/tests/py/unit/fixtures/__init__.py +0 -0
  449. package/tests/py/unit/fixtures/adatom.py +0 -60
  450. package/tests/py/unit/fixtures/bulk.py +0 -162
  451. package/tests/py/unit/fixtures/cuts.py +0 -118
  452. package/tests/py/unit/fixtures/grain_boundary.py +0 -875
  453. package/tests/py/unit/fixtures/interface/commensurate.py +0 -498
  454. package/tests/py/unit/fixtures/interface/gaas_dia.py +0 -837
  455. package/tests/py/unit/fixtures/interface/gr_ni_111_top_hcp.py +0 -123
  456. package/tests/py/unit/fixtures/interface/simple.py +0 -84
  457. package/tests/py/unit/fixtures/interface/twisted_nanoribbons.py +0 -131
  458. package/tests/py/unit/fixtures/interface/zsl.py +0 -756
  459. package/tests/py/unit/fixtures/island.py +0 -336
  460. package/tests/py/unit/fixtures/merge.py +0 -147
  461. package/tests/py/unit/fixtures/monolayer.py +0 -46
  462. package/tests/py/unit/fixtures/nanoparticle.py +0 -116
  463. package/tests/py/unit/fixtures/nanoribbon/__init__.py +0 -0
  464. package/tests/py/unit/fixtures/nanoribbon/armchair.py +0 -102
  465. package/tests/py/unit/fixtures/nanoribbon/nanoribbon.py +0 -145
  466. package/tests/py/unit/fixtures/nanoribbon/zigzag.py +0 -54
  467. package/tests/py/unit/fixtures/pair_defects.py +0 -41
  468. package/tests/py/unit/fixtures/passivated/nanoribbon.py +0 -69
  469. package/tests/py/unit/fixtures/passivated/slab.py +0 -58
  470. package/tests/py/unit/fixtures/point_defects.py +0 -158
  471. package/tests/py/unit/fixtures/slab.py +0 -606
  472. package/tests/py/unit/fixtures/strain.py +0 -42
  473. package/tests/py/unit/fixtures/supercell.py +0 -64
  474. package/tests/py/unit/fixtures/terrace.py +0 -70
  475. package/tests/py/unit/fixtures/thrid_party/ase_atoms.py +0 -13
  476. package/tests/py/unit/test_analyze_lattice_planes.py +0 -131
  477. package/tests/py/unit/test_cell.py +0 -104
  478. package/tests/py/unit/test_data_files.py +0 -68
  479. package/tests/py/unit/test_lattice.py +0 -103
  480. package/tests/py/unit/test_lattice_type_extended.py +0 -53
  481. package/tests/py/unit/test_material.py +0 -158
  482. package/tests/py/unit/test_operations.py +0 -126
  483. package/tests/py/unit/test_primitive_cell.py +0 -118
  484. package/tests/py/unit/test_reciprocal_lattice.py +0 -86
  485. package/tests/py/unit/test_reciprocal_paths.py +0 -64
  486. package/tests/py/unit/test_symmetry_points.py +0 -151
  487. package/tests/py/unit/test_tools_analyze.py +0 -219
  488. package/tests/py/unit/test_tools_analyze_basis.py +0 -105
  489. package/tests/py/unit/test_tools_analyze_interface.py +0 -223
  490. package/tests/py/unit/test_tools_analyze_interface_material.py +0 -63
  491. package/tests/py/unit/test_tools_analyze_interface_zsl.py +0 -187
  492. package/tests/py/unit/test_tools_analyze_lattice.py +0 -74
  493. package/tests/py/unit/test_tools_analyze_swap.py +0 -80
  494. package/tests/py/unit/test_tools_build.py +0 -158
  495. package/tests/py/unit/test_tools_build_defect/__init__.py +0 -0
  496. package/tests/py/unit/test_tools_build_defect/test_adatom.py +0 -84
  497. package/tests/py/unit/test_tools_build_defect/test_island.py +0 -45
  498. package/tests/py/unit/test_tools_build_defect/test_pair_defect.py +0 -84
  499. package/tests/py/unit/test_tools_build_defect/test_point_defect.py +0 -196
  500. package/tests/py/unit/test_tools_build_defect/test_slab_stack.py +0 -30
  501. package/tests/py/unit/test_tools_build_defect/test_solid_solution.py +0 -90
  502. package/tests/py/unit/test_tools_build_defect/test_terrace.py +0 -44
  503. package/tests/py/unit/test_tools_build_grain_boundary.py +0 -133
  504. package/tests/py/unit/test_tools_build_heterostructure.py +0 -46
  505. package/tests/py/unit/test_tools_build_interface.py +0 -292
  506. package/tests/py/unit/test_tools_build_interface_zsl.py +0 -263
  507. package/tests/py/unit/test_tools_build_maxwell_disorder.py +0 -123
  508. package/tests/py/unit/test_tools_build_metadata.py +0 -79
  509. package/tests/py/unit/test_tools_build_monolayer.py +0 -33
  510. package/tests/py/unit/test_tools_build_nanoparticle.py +0 -42
  511. package/tests/py/unit/test_tools_build_nanoribbon.py +0 -45
  512. package/tests/py/unit/test_tools_build_passivation.py +0 -85
  513. package/tests/py/unit/test_tools_build_perturbation.py +0 -103
  514. package/tests/py/unit/test_tools_build_slab.py +0 -382
  515. package/tests/py/unit/test_tools_build_strain.py +0 -36
  516. package/tests/py/unit/test_tools_build_supercell.py +0 -47
  517. package/tests/py/unit/test_tools_calculate.py +0 -67
  518. package/tests/py/unit/test_tools_convert.py +0 -174
  519. package/tests/py/unit/test_tools_modify.py +0 -248
  520. package/tests/py/unit/utils.py +0 -142
  521. package/tsconfig-transpile.json +0 -3
  522. package/tsconfig.json +0 -3
@@ -1,80 +0,0 @@
1
- from typing import List, Tuple
2
-
3
- from mat3ra.code.entity import InMemoryEntityPydantic
4
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
5
- from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
6
- SupercellMatrix2DSchema,
7
- )
8
- from mat3ra.made.material import Material
9
- from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
10
- from pydantic import model_validator
11
-
12
- from .utils.holders import MatchedSubstrateFilmConfigurationHolder
13
- from .zsl import ZSLInterfaceAnalyzer
14
-
15
-
16
- class GrainBoundaryPlanarMatchHolder(InMemoryEntityPydantic):
17
- match_id: int
18
- substrate_transformation_matrix: SupercellMatrix2DSchema
19
- film_transformation_matrix: SupercellMatrix2DSchema
20
- match_area: float
21
- strain_transformation_matrix: Matrix3x3Schema
22
- total_strain_percentage: float
23
-
24
-
25
- class GrainBoundaryPlanarAnalyzer(ZSLInterfaceAnalyzer):
26
- """
27
- Analyzer for creating grain boundaries between two orientations of the same material.
28
-
29
- Uses ZSL to find matching supercells between two phases with different
30
- orientations, then stacks them in x/y direction to create a grain boundary configuration.
31
- """
32
-
33
- phase_1_material: Material
34
- phase_2_material: Material
35
- phase_1_miller_indices: Tuple[int, int, int]
36
- phase_2_miller_indices: Tuple[int, int, int]
37
- phase_1_thickness: int = 1
38
- phase_2_thickness: int = 1
39
-
40
- @model_validator(mode="before")
41
- @classmethod
42
- def _setup_slab_configurations(cls, values):
43
- # we need to create slab configurations for both phases for InterfaceAnalyzer to use
44
- values["substrate_slab_configuration"] = SlabConfiguration.from_parameters(
45
- material_or_dict=values["phase_1_material"],
46
- miller_indices=values["phase_1_miller_indices"],
47
- number_of_layers=values.get("phase_1_thickness", 1),
48
- vacuum=0.0,
49
- )
50
- values["film_slab_configuration"] = SlabConfiguration.from_parameters(
51
- material_or_dict=values["phase_2_material"],
52
- miller_indices=values["phase_2_miller_indices"],
53
- number_of_layers=values.get("phase_2_thickness", 1),
54
- vacuum=0.0,
55
- )
56
- return values
57
-
58
- @property
59
- def grain_boundary_match_holders(self) -> List[GrainBoundaryPlanarMatchHolder]:
60
- zsl_matches = self.zsl_match_holders
61
- match_holders = []
62
-
63
- for idx, zsl_match in enumerate(zsl_matches):
64
- match_holder = GrainBoundaryPlanarMatchHolder(
65
- match_id=idx,
66
- substrate_transformation_matrix=zsl_match.substrate_supercell_matrix,
67
- film_transformation_matrix=zsl_match.film_supercell_matrix,
68
- match_area=zsl_match.match_area,
69
- strain_transformation_matrix=zsl_match.strain_transformation_matrix,
70
- total_strain_percentage=zsl_match.total_strain_percentage,
71
- )
72
- match_holders.append(match_holder)
73
-
74
- return match_holders
75
-
76
- def get_grain_boundary_configuration_by_match_id(self, match_id: int) -> MatchedSubstrateFilmConfigurationHolder:
77
- return self.get_strained_configuration_by_match_id(match_id)
78
-
79
- def get_grain_boundary_configurations(self) -> List[MatchedSubstrateFilmConfigurationHolder]:
80
- return self.get_strained_configurations()
@@ -1,251 +0,0 @@
1
- from functools import cached_property
2
- from typing import Optional, Tuple
3
-
4
- import numpy as np
5
- from mat3ra.code.entity import InMemoryEntityPydantic
6
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
7
- from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
8
- SupercellMatrix2DSchema,
9
- )
10
- from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.build_parameters import SlabBuilderParameters
11
- from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.builder import SlabBuilder
12
- from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
13
-
14
- from ...build.pristine_structures.two_dimensional.slab_strained_supercell.configuration import (
15
- SlabStrainedSupercellConfiguration,
16
- )
17
- from ...operations.core.unary import supercell
18
- from ...utils import unwrap
19
- from ..interface.utils.holders import MatchedSubstrateFilmConfigurationHolder
20
- from ..utils import calculate_von_mises_strain
21
-
22
-
23
- class InterfaceAnalyzer(InMemoryEntityPydantic):
24
- """
25
- Analyzes the interface between two slabs, calculating strain matrices and strained configurations.
26
- This class is used to prepare the configurations for the substrate and film materials, ensuring that the film
27
- material's lattice vectors match the substrate material's lattice vectors.
28
-
29
- `substrate_strained_configuration` and `film_strained_configuration` properties provide the strained configurations.
30
- """
31
-
32
- substrate_slab_configuration: SlabConfiguration
33
- film_slab_configuration: SlabConfiguration
34
- substrate_build_parameters: Optional[SlabBuilderParameters] = None
35
- film_build_parameters: Optional[SlabBuilderParameters] = None
36
- optimize_film_supercell: bool = False
37
-
38
- def get_component_material(self, configuration: SlabConfiguration):
39
- return SlabBuilder().get_material(configuration)
40
-
41
- @cached_property
42
- def substrate_material(self):
43
- return self.get_component_material(self.substrate_slab_configuration)
44
-
45
- @cached_property
46
- def film_material(self):
47
- return self.get_component_material(self.film_slab_configuration)
48
-
49
- @property
50
- def identity_supercell(self) -> SupercellMatrix2DSchema:
51
- return SupercellMatrix2DSchema(root=[[1, 0], [0, 1]])
52
-
53
- @property
54
- def _no_strain_matrix(self) -> Matrix3x3Schema:
55
- return Matrix3x3Schema(root=np.eye(3).tolist())
56
-
57
- def get_film_strain_matrix(
58
- self,
59
- substrate_lattice_vector_arrays: np.ndarray,
60
- film_lattice_vector_arrays: np.ndarray,
61
- ) -> Matrix3x3Schema:
62
- """Calculate film strain to match substrate using ZSL approach.
63
-
64
- This function calculates the 2D strain matrix needed to transform the film
65
- lattice vectors to match the substrate lattice vectors.
66
-
67
- Args:
68
- substrate_lattice_vector_arrays: 3x3 array of substrate lattice vectors
69
- film_lattice_vector_arrays: 3x3 array of film lattice vectors
70
-
71
- Returns:
72
- 2x2 strain matrix that transforms film vectors to substrate vectors
73
- """
74
- substrate_vectors = np.array(substrate_lattice_vector_arrays)
75
- film_vectors = np.array(film_lattice_vector_arrays)
76
-
77
- substrate_2d_vectors = substrate_vectors[:2, :2]
78
- film_2d_vectors = film_vectors[:2, :2]
79
-
80
- try:
81
- strain_2d = np.linalg.solve(film_2d_vectors, substrate_2d_vectors)
82
- except np.linalg.LinAlgError:
83
- raise ValueError("Film lattice vectors are not linearly independent.")
84
-
85
- strain_3d = np.eye(3)
86
- strain_3d[:2, :2] = strain_2d
87
- return Matrix3x3Schema(root=strain_3d.tolist())
88
-
89
- def get_substrate_strain_matrix(self) -> Matrix3x3Schema:
90
- return self._no_strain_matrix
91
-
92
- def _calculate_strain_for_film_supercell(self, film_n: int, film_m: int) -> float:
93
- """
94
- Calculate strain for given film supercell configuration against unchanged substrate.
95
-
96
- Args:
97
- film_n: Film supercell multiplier in a direction
98
- film_m: Film supercell multiplier in b direction
99
-
100
- Returns:
101
- Von Mises strain percentage
102
- """
103
-
104
- # Apply supercell to film material
105
- supercell_matrix = [[film_n, 0], [0, film_m]]
106
- film_with_supercell = supercell(self.film_material, supercell_matrix)
107
-
108
- # Use existing get_film_strain_matrix with supercelled film
109
- strain_matrix = self.get_film_strain_matrix(
110
- self.substrate_material.lattice.vector_arrays, film_with_supercell.lattice.vector_arrays
111
- )
112
-
113
- return calculate_von_mises_strain(np.array(unwrap(strain_matrix.root)))
114
-
115
- def _find_optimal_supercell_factor_for_direction(self, substrate_length: float, film_length: float) -> int:
116
- """
117
- Finds a multiplier for the component of diagonal supercell matrix
118
- that will get film supercell lattice vector length around substrate length.
119
- The N leads to the film supercell vector length being shorter than substrate length,
120
- and N+1 leads to the film supercell vector length being longer than substrate length.
121
- """
122
-
123
- # Find optimal: when n*film_length < substrate_length < (n+1)*film_length
124
- optimal = max(1, int(substrate_length / film_length))
125
- if (optimal + 1) * film_length - substrate_length < substrate_length - optimal * film_length:
126
- optimal += 1
127
-
128
- return optimal
129
-
130
- def find_optimal_film_supercell(self) -> Tuple[int, int]:
131
- """
132
- Find optimal (n, m) supercell multipliers for film that minimize strain.
133
-
134
- Returns:
135
- Tuple of (n, m) supercell multipliers that minimize strain
136
- """
137
- substrate_vectors = np.array(self.substrate_material.lattice.vector_arrays[:2])
138
- film_vectors = np.array(self.film_material.lattice.vector_arrays[:2])
139
-
140
- substrate_lengths = [np.linalg.norm(substrate_vectors[i, :2]) for i in range(2)]
141
- film_lengths = [np.linalg.norm(film_vectors[i, :2]) for i in range(2)]
142
-
143
- optimal_values = []
144
- for substrate_length, film_length in zip(substrate_lengths, film_lengths):
145
- optimal = self._find_optimal_supercell_factor_for_direction(substrate_length, film_length)
146
- optimal_values.append(optimal)
147
-
148
- n_optimal, m_optimal = optimal_values
149
-
150
- # Test neighboring values to find minimum strain
151
- candidates = [
152
- (n_optimal, m_optimal),
153
- (n_optimal + 1, m_optimal),
154
- (n_optimal, m_optimal + 1),
155
- (n_optimal + 1, m_optimal + 1),
156
- ]
157
-
158
- min_strain = float("inf")
159
- best_n, best_m = n_optimal, m_optimal
160
-
161
- for n, m in candidates:
162
- strain = self._calculate_strain_for_film_supercell(n, m)
163
- if strain < min_strain:
164
- min_strain = strain
165
- best_n, best_m = n, m
166
-
167
- return best_n, best_m
168
-
169
- def get_component_strained_configuration(
170
- self,
171
- configuration: SlabConfiguration,
172
- strain_matrix: Matrix3x3Schema,
173
- xy_supercell_matrix: SupercellMatrix2DSchema = None,
174
- ) -> SlabStrainedSupercellConfiguration:
175
- if xy_supercell_matrix is not None:
176
- matrix_list = [[item.root[0], item.root[1]] for item in xy_supercell_matrix.root]
177
- else:
178
- matrix_list = [[1, 0], [0, 1]]
179
-
180
- return SlabStrainedSupercellConfiguration(
181
- stack_components=configuration.stack_components,
182
- direction=configuration.direction,
183
- strain_matrix=strain_matrix,
184
- xy_supercell_matrix=matrix_list,
185
- )
186
-
187
- def create_matched_configuration_holder(
188
- self,
189
- substrate_slab_config: SlabConfiguration,
190
- film_slab_config: SlabConfiguration,
191
- match_id: int = 0,
192
- substrate_xy_supercell_matrix: SupercellMatrix2DSchema = None,
193
- film_xy_supercell_matrix: SupercellMatrix2DSchema = None,
194
- substrate_strain_matrix: Matrix3x3Schema = None,
195
- film_strain_matrix: Matrix3x3Schema = None,
196
- total_strain_percentage: Optional[float] = None,
197
- ) -> MatchedSubstrateFilmConfigurationHolder:
198
- if substrate_strain_matrix is None:
199
- substrate_strain_matrix = self._no_strain_matrix
200
- if film_strain_matrix is None:
201
- film_strain_matrix = self._no_strain_matrix
202
-
203
- substrate_config = self.get_component_strained_configuration(
204
- substrate_slab_config,
205
- substrate_strain_matrix,
206
- xy_supercell_matrix=substrate_xy_supercell_matrix,
207
- )
208
-
209
- film_config = self.get_component_strained_configuration(
210
- film_slab_config, film_strain_matrix, xy_supercell_matrix=film_xy_supercell_matrix
211
- )
212
-
213
- return MatchedSubstrateFilmConfigurationHolder(
214
- match_id=match_id,
215
- substrate_configuration=substrate_config,
216
- film_configuration=film_config,
217
- total_strain_percentage=total_strain_percentage,
218
- )
219
-
220
- @property
221
- def substrate_supercell_matrix(self) -> SupercellMatrix2DSchema:
222
- if self.substrate_build_parameters and self.substrate_build_parameters.xy_supercell_matrix:
223
- return SupercellMatrix2DSchema(root=self.substrate_build_parameters.xy_supercell_matrix)
224
- return self.identity_supercell
225
-
226
- @property
227
- def film_supercell_matrix(self) -> SupercellMatrix2DSchema:
228
- if self.optimize_film_supercell:
229
- n, m = self.find_optimal_film_supercell()
230
- return SupercellMatrix2DSchema(root=[[n, 0], [0, m]])
231
- elif self.film_build_parameters and self.film_build_parameters.xy_supercell_matrix:
232
- return SupercellMatrix2DSchema(root=self.film_build_parameters.xy_supercell_matrix)
233
- return self.identity_supercell
234
-
235
- @cached_property
236
- def substrate_strained_configuration(self) -> SlabStrainedSupercellConfiguration:
237
- return self.get_component_strained_configuration(
238
- self.substrate_slab_configuration,
239
- self._no_strain_matrix,
240
- xy_supercell_matrix=self.substrate_supercell_matrix,
241
- )
242
-
243
- @cached_property
244
- def film_strained_configuration(self) -> SlabStrainedSupercellConfiguration:
245
- return self.get_component_strained_configuration(
246
- self.film_slab_configuration,
247
- self.get_film_strain_matrix(
248
- self.substrate_material.lattice.vector_arrays, self.film_material.lattice.vector_arrays
249
- ),
250
- xy_supercell_matrix=self.film_supercell_matrix,
251
- )
@@ -1,91 +0,0 @@
1
- from typing import Tuple
2
-
3
- from mat3ra.made.material import Material
4
- from mat3ra.made.tools.build.pristine_structures.two_dimensional.slab.configuration import SlabConfiguration
5
-
6
- from ...modify import translate_to_center
7
- from ...operations.core.unary import rotate
8
- from ..other import get_surface_area
9
- from . import InterfaceAnalyzer
10
- from .utils.holders import MatchedSubstrateFilmConfigurationHolder
11
-
12
-
13
- class TwistedNanoribbonsInterfaceAnalyzer(InterfaceAnalyzer):
14
- """
15
- Analyzer for creating twisted interfaces between two nanoribbons.
16
-
17
- Takes two nanoribbons (or any 0D materials) and returns them with:
18
- - Same lattice vectors
19
- - One rotated by the specified angle
20
- - Nanoribbons centered
21
- - Gap handled separately through vacuum configuration
22
-
23
- Args:
24
-
25
- angle (float): Twist angle in degrees.
26
- vacuum_x (float): Vacuum along x on both sides, in Angstroms.
27
- vacuum_y (float): Vacuum along y on both sides, in Angstroms.
28
- """
29
-
30
- angle: float = 0.0
31
- vacuum_x: float = 5.0
32
- vacuum_y: float = 5.0
33
-
34
- @property
35
- def nanoribbon1(self):
36
- return self.substrate_slab_configuration.atomic_layers.crystal
37
-
38
- @property
39
- def nanoribbon2(self):
40
- return self.film_slab_configuration.atomic_layers.crystal
41
-
42
- def _create_default_slab_from_nanoribbon(self, nanoribbon: Material) -> SlabConfiguration:
43
- return SlabConfiguration.from_parameters(
44
- material_or_dict=nanoribbon,
45
- miller_indices=(0, 0, 1),
46
- number_of_layers=1,
47
- vacuum=0.0,
48
- use_conventional_cell=False,
49
- )
50
-
51
- def _match_lattice_vectors(self, material1: Material, material2: Material) -> Tuple[Material, Material]:
52
- """
53
- Matches the lattice vectors of two nanoribbons with vacuum on the sides to assume the size of the larger one.
54
- Before stacking, two materials must have the same lattice vectors.
55
- """
56
- area1 = get_surface_area(material1)
57
- area2 = get_surface_area(material2)
58
-
59
- if area1 >= area2:
60
- material1_matched = material1
61
- material2_matched = material2.clone()
62
- material2_matched.set_lattice(material1.lattice)
63
- else:
64
- material1_matched = material1.clone()
65
- material1_matched.set_lattice(material2.lattice)
66
- material2_matched = material2
67
-
68
- return material1_matched, material2_matched
69
-
70
- def get_strained_configuration(self) -> MatchedSubstrateFilmConfigurationHolder:
71
- centered_nanoribbon1 = translate_to_center(self.nanoribbon1, axes=["x", "y"])
72
- centered_nanoribbon2 = translate_to_center(self.nanoribbon2, axes=["x", "y"])
73
-
74
- matched_nanoribbon1, matched_nanoribbon2 = self._match_lattice_vectors(
75
- centered_nanoribbon1, centered_nanoribbon2
76
- )
77
-
78
- rotated_nanoribbon2 = rotate(matched_nanoribbon2, [0, 0, 1], self.angle, wrap=False)
79
-
80
- substrate_slab_config = self._create_default_slab_from_nanoribbon(matched_nanoribbon1)
81
- film_slab_config = self._create_default_slab_from_nanoribbon(rotated_nanoribbon2)
82
-
83
- return self.create_matched_configuration_holder(substrate_slab_config, film_slab_config, match_id=0)
84
-
85
- @property
86
- def substrate_nanoribbon_configuration(self):
87
- return self.get_strained_configuration().substrate_configuration
88
-
89
- @property
90
- def film_nanoribbon_configuration(self):
91
- return self.get_strained_configuration().film_configuration
@@ -1,77 +0,0 @@
1
- from typing import Union
2
-
3
- from mat3ra.made.material import Material
4
-
5
- from ....build.pristine_structures.two_dimensional.slab import SlabConfiguration
6
- from ....build_components.entities.reusable.three_dimensional.supercell.helpers import create_supercell
7
- from ...rdf import RadialDistributionFunction
8
- from .holders import MatchedSubstrateFilmConfigurationHolder
9
-
10
-
11
- def calculate_interfacial_distance_from_rdf(
12
- substrate_material: Union[Material, dict, "SlabConfiguration"],
13
- film_material: Union[Material, dict, "SlabConfiguration"],
14
- rdf_cutoff: float = 10.0,
15
- rdf_bin_size: float = 0.1,
16
- supercell_size: tuple = (3, 3, 3),
17
- ) -> float:
18
- """
19
- Calculate interfacial distance based on RDF analysis of bulk materials.
20
-
21
- Creates temporary supercells of substrate and film bulk materials,
22
- calculates their RDFs to find the first peak (nearest neighbor distance),
23
- and returns the average of these distances as the initial guess for interfacial distance.
24
-
25
- Args:
26
- substrate_material: Material, dict, or SlabConfiguration for the substrate
27
- film_material: Material, dict, or SlabConfiguration for the film
28
- rdf_cutoff: Maximum distance for RDF calculation in Angstroms
29
- rdf_bin_size: Bin size for RDF histogram in Angstroms
30
- supercell_size: Size of supercell for RDF analysis (default: 3x3x3)
31
-
32
- Returns:
33
- float: Calculated interfacial distance in Angstroms
34
- """
35
-
36
- if isinstance(substrate_material, SlabConfiguration):
37
- substrate_bulk = substrate_material.atomic_layers.crystal
38
- elif isinstance(substrate_material, dict):
39
- substrate_bulk = Material.create(substrate_material)
40
- else:
41
- substrate_bulk = substrate_material
42
-
43
- if isinstance(film_material, SlabConfiguration):
44
- film_bulk = film_material.atomic_layers.crystal
45
- elif isinstance(film_material, dict):
46
- film_bulk = Material.create(film_material)
47
- else:
48
- film_bulk = film_material
49
-
50
- substrate_supercell = create_supercell(material=substrate_bulk, scaling_factor=list(supercell_size))
51
-
52
- film_supercell = create_supercell(material=film_bulk, scaling_factor=list(supercell_size))
53
-
54
- substrate_rdf = RadialDistributionFunction.from_material(
55
- substrate_supercell,
56
- cutoff=rdf_cutoff,
57
- bin_size=rdf_bin_size,
58
- )
59
-
60
- film_rdf = RadialDistributionFunction.from_material(
61
- film_supercell,
62
- cutoff=rdf_cutoff,
63
- bin_size=rdf_bin_size,
64
- )
65
-
66
- substrate_first_peak = substrate_rdf.first_peak_distance
67
- film_first_peak = film_rdf.first_peak_distance
68
-
69
- interfacial_distance = (substrate_first_peak + film_first_peak) / 2.0
70
-
71
- return interfacial_distance
72
-
73
-
74
- __all__ = [
75
- "MatchedSubstrateFilmConfigurationHolder",
76
- "calculate_interfacial_distance_from_rdf",
77
- ]
@@ -1,14 +0,0 @@
1
- from typing import Optional
2
-
3
- from mat3ra.code.entity import InMemoryEntityPydantic
4
-
5
- from ....build.pristine_structures.two_dimensional.slab_strained_supercell.configuration import (
6
- SlabStrainedSupercellConfiguration,
7
- )
8
-
9
-
10
- class MatchedSubstrateFilmConfigurationHolder(InMemoryEntityPydantic):
11
- match_id: int
12
- substrate_configuration: SlabStrainedSupercellConfiguration
13
- film_configuration: SlabStrainedSupercellConfiguration
14
- total_strain_percentage: Optional[float] = None
@@ -1,56 +0,0 @@
1
- from functools import reduce
2
- from typing import List
3
-
4
- import numpy as np
5
- from mat3ra.esse.models.core.abstract.vector_2d import Vector2dSchema
6
- from mat3ra.esse.models.materials_category_components.entities.auxiliary.two_dimensional.supercell_matrix_2d import (
7
- SupercellMatrix2DSchema,
8
- )
9
-
10
-
11
- def are_vectors_colinear(v1: Vector2dSchema, v2: Vector2dSchema, tol=1e-3):
12
- v1 = np.array(v1)
13
- v2 = np.array(v2)
14
- norm1 = np.linalg.norm(v1)
15
- norm2 = np.linalg.norm(v2)
16
- if norm1 < tol or norm2 < tol:
17
- return False
18
- cos_angle = np.dot(v1, v2) / (norm1 * norm2)
19
- # Colinear if |cos_angle| close to 1
20
- return np.abs(np.abs(cos_angle) - 1) < tol
21
-
22
-
23
- def align_first_vector_to_x_2d_right_handed(vectors: List[Vector2dSchema]):
24
- """
25
- Rotates a set of 2D lattice vectors so that the first vector is aligned with the x-axis,
26
- and makes the cell right-handed.
27
- vectors: (2, 2) array
28
- Returns: rotated (2, 2) array
29
- """
30
- vectors_np = np.array(vectors)
31
- if vectors_np.shape != (2, 2):
32
- raise ValueError("Input must be two 2D vectors (shape (2, 2)).")
33
- v = vectors_np[0]
34
- a = np.linalg.norm(v)
35
- if a == 0:
36
- raise ValueError("First lattice vector has zero length.")
37
- # Angle to x-axis
38
- angle = np.arctan2(v[1], v[0])
39
- # 2D rotation matrix to align v with x-axis
40
- R = np.array([[np.cos(-angle), -np.sin(-angle)], [np.sin(-angle), np.cos(-angle)]])
41
- rotated_vectors = vectors_np @ R.T
42
- # Set first vector to [a, 0]
43
- rotated_vectors[0] = np.array([a, 0])
44
-
45
- # Check handedness: z-component of cross product should be positive
46
- cross_z = np.cross(rotated_vectors[0], rotated_vectors[1])
47
- if cross_z < 0:
48
- rotated_vectors[1] = -rotated_vectors[1]
49
-
50
- return rotated_vectors
51
-
52
-
53
- def get_global_gcd(A: SupercellMatrix2DSchema, B: SupercellMatrix2DSchema) -> int:
54
- # flatten all entries, compute gcd over them
55
- vals = np.hstack((A.ravel(), B.ravel())).astype(int)
56
- return reduce(np.gcd, vals.tolist())