@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,192 +0,0 @@
1
- from functools import cached_property
2
- from typing import List, Tuple, Union
3
-
4
- from mat3ra.code.vector import Vector3D
5
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
6
- from mat3ra.made.material import Material
7
-
8
- from ..build_components.metadata import MaterialWithBuildMetadata
9
- from ..convert import from_pymatgen, to_pymatgen
10
- from ..entities import MillerIndices, Termination, TerminationHolder
11
- from ..third_party import PymatgenSlab, PymatgenSlabGenerator, label_pymatgen_slab_termination
12
- from .lattice import LatticeMaterialAnalyzer
13
-
14
-
15
- def select_slab_with_termination_by_formula(slabs: List[PymatgenSlab], termination: Termination) -> PymatgenSlab:
16
- for slab in slabs:
17
- if Termination.from_string(label_pymatgen_slab_termination(slab)).formula == termination.formula:
18
- return slab
19
- raise ValueError(f"No slab found with termination: {termination}")
20
-
21
-
22
- class CrystalLatticePlanesMaterialAnalyzer(LatticeMaterialAnalyzer):
23
- # Values used to generate slabs with terminations, these values are set to allow for all terminations to be found.
24
- # Heuristic showed that these values are sufficient for all slabs configurations.
25
- DEFAULT_THICKNESS_FOR_TERMINATIONS: int = 3
26
- DEFAULT_VACUUM_SIZE_FOR_TERMINATIONS: int = 1
27
- # Values used to generate slabs for later use. A single layer thickness and no vacuum.
28
- DEFAULT_THICKNESS_FOR_GENERATION: int = 1
29
- DEFAULT_VACUUM_SIZE_FOR_GENERATION: int = 0
30
- DEFAULT_SYMMETRIZE: bool = False
31
- miller_indices: Union[List[int], Tuple[int, int, int]]
32
-
33
- def get_pymatgen_slab_generator(
34
- self,
35
- min_slab_size: float = DEFAULT_VACUUM_SIZE_FOR_GENERATION,
36
- min_vacuum_size: float = DEFAULT_VACUUM_SIZE_FOR_GENERATION,
37
- in_unit_planes: bool = True,
38
- make_primitive: bool = False,
39
- ):
40
- return PymatgenSlabGenerator(
41
- initial_structure=to_pymatgen(self.material_with_conventional_lattice),
42
- miller_index=MillerIndices(root=self.miller_indices).to_tuple(),
43
- min_slab_size=min_slab_size,
44
- min_vacuum_size=min_vacuum_size,
45
- in_unit_planes=in_unit_planes,
46
- primitive=make_primitive,
47
- )
48
-
49
- @cached_property
50
- def pymatgen_slab_generator_with_vacuum(self) -> PymatgenSlabGenerator:
51
- # This generator is used to create slabs with vacuum and thick enough to allow for all terminations to be found.
52
- return self.get_pymatgen_slab_generator(
53
- min_slab_size=self.DEFAULT_THICKNESS_FOR_TERMINATIONS,
54
- min_vacuum_size=self.DEFAULT_VACUUM_SIZE_FOR_TERMINATIONS,
55
- )
56
-
57
- @cached_property
58
- def pymatgen_slab_generator_without_vacuum(self) -> PymatgenSlabGenerator:
59
- # This generator is used to create slabs without vacuum and with a single layer thickness.
60
- return self.get_pymatgen_slab_generator(
61
- min_slab_size=self.DEFAULT_THICKNESS_FOR_GENERATION, min_vacuum_size=self.DEFAULT_VACUUM_SIZE_FOR_GENERATION
62
- )
63
-
64
- @cached_property
65
- def all_planes_as_pymatgen_slabs_with_vacuum(self) -> List[PymatgenSlab]:
66
- return [
67
- *self.pymatgen_slab_generator_with_vacuum.get_slabs(symmetrize=True),
68
- # Leaving option to create a non-symmetrized slabs too for additional terminations.
69
- # As of now, looks like symmetrize=True gives all the unique terminations needed.
70
- # *self.pymatgen_slab_generator_with_vacuum.get_slabs(symmetrize=False),
71
- ]
72
-
73
- @cached_property
74
- def all_planes_as_pymatgen_slabs_without_vacuum(self) -> List[PymatgenSlab]:
75
- return [
76
- *self.pymatgen_slab_generator_without_vacuum.get_slabs(symmetrize=self.DEFAULT_SYMMETRIZE),
77
- # Leaving option to create symmetrized slabs for layers generation.
78
- # *self.pymatgen_slab_generator_without_vacuum.get_slabs(symmetrize=not self.DEFAULT_SYMMETRIZE),
79
- ]
80
-
81
- def _create_fallback_termination_for_failed_slab_generation(self) -> TerminationHolder:
82
- """
83
- Creates a fallback termination when pymatgen's SlabGenerator fails to generate slabs.
84
-
85
- This happens for certain materials where SlabGenerator removes "too many sites"
86
- and returns empty slab lists (e.g., some nanoribbons, thin 2D materials).
87
-
88
- Returns:
89
- TerminationHolder: A basic termination using the material's chemical formula
90
- """
91
- formula = self.formula
92
- fallback_termination = Termination(chemical_elements=formula, space_group_symmetry_label="")
93
-
94
- return TerminationHolder(
95
- termination_with_vacuum=fallback_termination,
96
- termination_without_vacuum=fallback_termination,
97
- shift_with_vacuum=0.0,
98
- shift_without_vacuum=0.0,
99
- )
100
-
101
- @cached_property
102
- def termination_holders(self):
103
- termination_holders = []
104
- slabs_with_vacuum = self.all_planes_as_pymatgen_slabs_with_vacuum
105
- slabs_without_vacuum = self.all_planes_as_pymatgen_slabs_without_vacuum
106
-
107
- # Handle case where pymatgen fails to generate slabs for certain materials
108
- # (e.g., some nanoribbons where "Too many sites removed" by SlabGenerator)
109
- if not slabs_with_vacuum:
110
- fallback_holder = self._create_fallback_termination_for_failed_slab_generation()
111
- termination_holders.append(fallback_holder)
112
-
113
- for slab_with_vacuum in slabs_with_vacuum:
114
- termination_with_vacuum_string = label_pymatgen_slab_termination(slab_with_vacuum)
115
- termination_with_vacuum = Termination.from_string(termination_with_vacuum_string)
116
-
117
- try:
118
- matching_slab_without_vacuum = select_slab_with_termination_by_formula(
119
- slabs_without_vacuum, termination_with_vacuum
120
- )
121
- termination_without_vacuum_string = label_pymatgen_slab_termination(matching_slab_without_vacuum)
122
- termination_without_vacuum = Termination.from_string(termination_without_vacuum_string)
123
- shift_without_vacuum = matching_slab_without_vacuum.shift
124
- except ValueError:
125
- termination_without_vacuum = None
126
- shift_without_vacuum = 0.0
127
- shift_with_vacuum = slab_with_vacuum.shift
128
-
129
- termination_holders.append(
130
- TerminationHolder(
131
- termination_with_vacuum=termination_with_vacuum,
132
- termination_without_vacuum=termination_without_vacuum,
133
- shift_with_vacuum=shift_with_vacuum,
134
- shift_without_vacuum=shift_without_vacuum,
135
- )
136
- )
137
-
138
- return termination_holders
139
-
140
- @cached_property
141
- def terminations_with_vacuum(self) -> List[Termination]:
142
- return [holder.termination_with_vacuum for holder in self.termination_holders]
143
-
144
- @cached_property
145
- def terminations_without_vacuum(self) -> List[Termination]:
146
- return [holder.termination_without_vacuum for holder in self.termination_holders]
147
-
148
- @cached_property
149
- def terminations(self):
150
- return self.terminations_with_vacuum
151
-
152
- @property
153
- def default_termination(self) -> Termination:
154
- return self.terminations[0]
155
-
156
- @property
157
- def miller_supercell_matrix(self) -> Matrix3x3Schema:
158
- return self.pymatgen_slab_generator_without_vacuum.slab_scale_factor.tolist()
159
-
160
- def get_material_name_for_termination(self, termination: Termination) -> str:
161
- # for example: "Si(001), termination Si_P4/mmm_1, Slab"
162
- return f"{self.material.formula}({self.miller_indices}), termination {termination}, Slab"
163
-
164
- def get_material_with_termination_without_vacuum(self, termination: Termination) -> Material:
165
- # Note: termination is passed with vacuum, but we return the material without vacuum
166
- holder = next((h for h in self.termination_holders if h.termination_with_vacuum == termination), None)
167
- if holder is None:
168
- raise ValueError(f"Termination {termination} not found.")
169
-
170
- slabs_without_vacuum = self.all_planes_as_pymatgen_slabs_without_vacuum
171
- slab = select_slab_with_termination_by_formula(slabs_without_vacuum, termination)
172
- material = MaterialWithBuildMetadata.create(from_pymatgen(slab))
173
- material.name = self.get_material_name_for_termination(termination)
174
- return material
175
-
176
- def get_translation_vector_for_termination_without_vacuum(self, termination: Termination) -> Vector3D:
177
- holder = next((h for h in self.termination_holders if h.termination_with_vacuum == termination), None)
178
- if holder is None:
179
- raise ValueError(f"Termination {termination} not found.")
180
-
181
- # NOTE: pymatgen shift values are in fractional crystal coordinates and need to be negated
182
- # Convert from crystal to cartesian coordinates using the conventional lattice
183
- crystal_shift = [0.0, 0.0, -holder.shift_without_vacuum]
184
- cartesian_shift = self.material_with_conventional_lattice.basis.cell.convert_point_to_cartesian(crystal_shift)
185
- return cartesian_shift
186
-
187
- def get_materials_for_all_terminations_without_vacuum(self) -> List[Material]:
188
- return [
189
- self.get_material_with_termination_without_vacuum(holder.termination_with_vacuum)
190
- for holder in self.termination_holders
191
- if holder.termination_without_vacuum is not None
192
- ]
@@ -1,105 +0,0 @@
1
- from typing import Union
2
-
3
- import numpy as np
4
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
5
- from mat3ra.made.material import Material
6
- from pydantic import BaseModel, Field
7
-
8
- from ..build_components.metadata.material_with_build_metadata import MaterialWithBuildMetadata
9
- from ..operations.reusable.unary import transform_material_by_matrix
10
- from .basis import BasisMaterialAnalyzer
11
- from .enums import POSSIBLE_TRANSFORMATION_MATRICES
12
-
13
-
14
- class LatticeSwapDetectionResult(BaseModel):
15
- model_config = {"arbitrary_types_allowed": True}
16
- is_swapped: bool = Field(..., description="Whether a lattice swap was detected")
17
- permutation: Matrix3x3Schema = Field(..., description="Transformation matrix representing the swap")
18
- confidence: float = Field(..., description="Confidence score (0.0 to 1.0)")
19
-
20
-
21
- class MaterialLatticeSwapAnalyzer(BaseModel):
22
- """
23
- Analyzer to detect lattice vector swaps/permutations between materials.
24
-
25
- This detects when lattice vectors have been reoriented (e.g., a->a, b->c, c->-b)
26
- rather than the basis being rotated within the lattice.
27
- """
28
-
29
- material: Union[Material, MaterialWithBuildMetadata]
30
- tolerance: float = 0.01
31
-
32
- def _compute_transformation_score(self, matrix: np.ndarray, target_fingerprint) -> float:
33
- transformed_material = transform_material_by_matrix(self.material, matrix)
34
- new_analyzer = BasisMaterialAnalyzer(material=transformed_material)
35
- new_fingerprint = new_analyzer.get_layer_fingerprint(target_fingerprint.layer_thickness)
36
- return target_fingerprint.get_similarity_score(new_fingerprint)
37
-
38
- def _create_detection_result(self, matrix: np.ndarray, score: float) -> LatticeSwapDetectionResult:
39
- is_identity = np.allclose(matrix, np.eye(3), atol=self.tolerance)
40
- return LatticeSwapDetectionResult(
41
- is_swapped=not is_identity,
42
- permutation=Matrix3x3Schema(root=matrix.tolist()),
43
- confidence=score,
44
- )
45
-
46
- def detect_swap_from_original(
47
- self, original_material: MaterialWithBuildMetadata, layer_thickness: float = 1.0, threshold: float = 0.1
48
- ) -> LatticeSwapDetectionResult:
49
- """
50
- Detect lattice swap from the original material.
51
-
52
- We apply every transformation matrix to lattice and basis, compute the fingerprint along z, then compare
53
- to the original material's fingerprint. The best matching transformation (if above threshold) is considered
54
- a detected swap.
55
-
56
-
57
- Args:
58
- original_material: The original material before transformation
59
- layer_thickness: Thickness of layers for fingerprint comparison
60
- threshold: Minimum improvement threshold to consider a swap detected
61
-
62
- Returns:
63
- LatticeSwapDetectionResult: Swap detection results with permutation and new lattice
64
- """
65
- target_analyzer = BasisMaterialAnalyzer(material=original_material)
66
- target_fingerprint = target_analyzer.get_layer_fingerprint(layer_thickness)
67
- possible_matrices = list(map(np.array, POSSIBLE_TRANSFORMATION_MATRICES))
68
-
69
- best_match = None
70
- max_score = 0
71
-
72
- for matrix in possible_matrices:
73
- score = self._compute_transformation_score(matrix, target_fingerprint)
74
- if score > max_score:
75
- best_match = self._create_detection_result(matrix, score)
76
- max_score = score
77
-
78
- if best_match and best_match.is_swapped and best_match.confidence >= threshold:
79
- return best_match
80
- # If no swap detected, return identity result
81
- return self._create_detection_result(np.eye(3), 1.0)
82
-
83
- def get_corrected_material(
84
- self,
85
- target: MaterialWithBuildMetadata,
86
- layer_thickness: float = 1.0,
87
- threshold: float = 0.1,
88
- ) -> MaterialWithBuildMetadata:
89
- """
90
- Correct the material's lattice to match the target material's orientation if a swap is detected.
91
-
92
- Args:
93
- target: The target material to match
94
- layer_thickness: Thickness of layers for fingerprint comparison
95
- threshold: Minimum improvement threshold to consider a swap detected
96
-
97
- Returns:
98
- MaterialWithBuildMetadata: Corrected material with lattice matching the target orientation
99
- """
100
- swap_info = self.detect_swap_from_original(target, layer_thickness, threshold)
101
- if swap_info.is_swapped:
102
- matrix_list = [list(row.root) if hasattr(row, "root") else row for row in swap_info.permutation.root]
103
- matrix_array = np.array(matrix_list)
104
- return transform_material_by_matrix(self.material, matrix_array)
105
- return self.material
@@ -1,276 +0,0 @@
1
- from typing import List, Optional, Tuple
2
-
3
- import numpy as np
4
- from mat3ra.code.array_with_ids import ArrayWithIds
5
- from mat3ra.made.material import Material
6
- from scipy.spatial._ckdtree import cKDTree
7
-
8
- from ..bond_directions.bond_directions import BondDirections
9
- from ..bond_directions.bond_directions_templates_for_element import BondDirectionsTemplatesForElement
10
- from ..build_components.entities.auxiliary.zero_dimensional.crystal_site import CrystalSite, CrystalSiteList
11
- from .rdf import RadialDistributionFunction
12
- from .utils import decorator_handle_periodic_boundary_conditions
13
-
14
-
15
- class MaterialWithCrystalSites(Material):
16
- crystal_sites: CrystalSiteList = CrystalSiteList.from_values([])
17
- nearest_neighbor_vectors: ArrayWithIds = ArrayWithIds.from_values([])
18
-
19
- @classmethod
20
- def from_material(cls, material: Material):
21
- new_material = material.clone()
22
- new_material.to_cartesian()
23
- return cls(name=material.name, basis=new_material.basis, lattice=new_material.lattice)
24
-
25
- def analyze(self):
26
- """
27
- Analyze the material in place and generate the crystal sites with properties.
28
-
29
- Generated properties:
30
- - nearest_neighbor_vectors: The nearest neighbor vectors for all sites.
31
- """
32
- self.nearest_neighbor_vectors = self.get_neighbors_vectors_for_all_sites(cutoff=3.0)
33
- self.crystal_sites = CrystalSiteList(
34
- values=[CrystalSite(nearest_neighbor_vectors=item) for item in self.nearest_neighbor_vectors.values],
35
- ids=self.nearest_neighbor_vectors.ids,
36
- )
37
-
38
- @property
39
- def coordinates_as_kdtree(self):
40
- return cKDTree(self.basis.coordinates.values)
41
-
42
- def get_neighbors_vectors_for_site(
43
- self, site_index: int, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
44
- ) -> List[np.ndarray]:
45
- """
46
- Get the nearest neighbor vectors for a specific site.
47
-
48
- Args:
49
- site_index (int): The index of the site to
50
- cutoff (float): The maximum cutoff radius for identifying neighbors.
51
- max_number_of_neighbors (int): The max number of neighbors possible.
52
-
53
- Returns:
54
- List[np.ndarray]: List of vectors to the nearest neighbors.
55
- """
56
- coordinates = self.basis.coordinates.values
57
- neighbors, distances = self.get_neighbors_for_site(site_index, cutoff, max_number_of_neighbors)
58
- vectors = [np.array(coordinates[neighbor]) - np.array(coordinates[site_index]) for neighbor in neighbors]
59
- return vectors
60
-
61
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
62
- def get_neighbors_vectors_for_all_sites(
63
- self, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
64
- ) -> ArrayWithIds:
65
- """
66
- Get the nearest neighbor vectors for all sites.
67
-
68
- Args:
69
- cutoff (float): The maximum cutoff radius for identifying neighbors.
70
- max_number_of_neighbors (int): The max number of neighbors possible.
71
-
72
- Returns:
73
- ArrayWithIds: Array with the nearest neighbor vectors for all sites.
74
- """
75
- nearest_neighbors = ArrayWithIds(values=[], ids=[])
76
- for site_index in range(len(self.basis.coordinates.values)):
77
- vectors = self.get_neighbors_vectors_for_site(site_index, cutoff, max_number_of_neighbors)
78
- nearest_neighbors.add_item(vectors, site_index)
79
- return nearest_neighbors
80
-
81
- def get_neighbors_for_site(
82
- self,
83
- site_index: int,
84
- cutoff: float = 3.0,
85
- max_number_of_neighbors: Optional[int] = None,
86
- nearest_only: bool = True,
87
- ) -> Tuple[np.ndarray, np.ndarray]:
88
- """
89
- Get the nearest neighbors for a specific site.
90
-
91
- Args:
92
- site_index (int): The index of the site to
93
- cutoff (float): The maximum cutoff radius for identifying neighbors.
94
- max_number_of_neighbors (int): The max number of neighbors possible.
95
- nearest_only (bool): If True, only consider the first shell of neighbors.
96
-
97
- Returns:
98
- Tuple[np.ndarray, np.ndarray]: Tuple of neighbors and distances.
99
- """
100
- coordinates = self.basis.coordinates
101
- max_number_of_neighbors = (
102
- len(coordinates.values) if max_number_of_neighbors is None else max_number_of_neighbors
103
- )
104
- coordinate = coordinates.get_element_value_by_index(site_index)
105
- distances, neighbors = self.coordinates_as_kdtree.query(
106
- coordinate, k=max_number_of_neighbors, distance_upper_bound=cutoff
107
- )
108
- valid_indices = (distances != np.inf) & (distances != 0)
109
- distances = distances[valid_indices]
110
- neighbors = neighbors[valid_indices]
111
-
112
- if nearest_only:
113
- rdf = RadialDistributionFunction.from_material(self)
114
- valid_indices = np.where([rdf.is_within_first_peak(distance) for distance in distances])
115
- distances = distances[valid_indices]
116
- neighbors = neighbors[valid_indices]
117
- return neighbors, distances
118
-
119
- def get_nearest_neighbors_for_all_sites(
120
- self, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
121
- ) -> ArrayWithIds:
122
- """
123
- Get the nearest neighbors for all sites.
124
-
125
- Args:
126
- cutoff (float): The maximum cutoff radius for identifying neighbors.
127
- max_number_of_neighbors (int): The max number of neighbors possible.
128
-
129
- Returns:
130
- ArrayWithIds: Array with the nearest neighbors for all sites.
131
- """
132
- nearest_neighbors = ArrayWithIds(values=[], ids=[])
133
- for site_index in self.basis.coordinates.ids:
134
- neighbors, distances = self.get_neighbors_for_site(site_index, cutoff, max_number_of_neighbors)
135
- nearest_neighbors.add_item(neighbors, site_index)
136
- return nearest_neighbors
137
-
138
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
139
- def get_coordination_numbers(self, cutoff: float = 3.0) -> ArrayWithIds:
140
- """
141
- Calculate the coordination numbers for all atoms in the material.
142
-
143
- Args:
144
- cutoff (float): The cutoff radius for identifying neighbors.
145
-
146
- Returns:
147
- ArrayWithIds: Array with the coordination numbers for all sites.
148
- """
149
- nearest_neighbors = self.get_nearest_neighbors_for_all_sites(cutoff)
150
- coordination_numbers = [len(neighbors) for neighbors in nearest_neighbors.values]
151
- return ArrayWithIds(values=coordination_numbers, ids=nearest_neighbors.ids)
152
-
153
- def get_undercoordinated_atom_indices(self, cutoff: float, coordination_threshold: int) -> List[int]:
154
- """
155
- Identify undercoordinated atoms based on the coordination threshold (inclusive).
156
-
157
- Args:
158
- cutoff (float): The cutoff radius for identifying neighbors.
159
- coordination_threshold (int): The coordination number threshold for an atom
160
- to be considered undercoordinated, inclusive.
161
-
162
- Returns:
163
- List[int]: List of indices of undercoordinated atoms.
164
- """
165
- coordination_numbers = self.get_coordination_numbers(cutoff)
166
- return [
167
- item.id
168
- for item in coordination_numbers.to_array_of_values_with_ids()
169
- if item.value <= coordination_threshold
170
- ]
171
-
172
- def get_unique_coordination_numbers(self, cutoff: float) -> List[int]:
173
- """
174
- Get the unique coordination numbers for all atoms in the material.
175
-
176
- Args:
177
- self (MaterialWithCrystalSites): The material object with crystal sites.
178
- cutoff (float): The cutoff radius for identifying neighbors.
179
-
180
- Returns:
181
- List[int]: A list of unique coordination numbers present in the material.
182
- """
183
- coordination_numbers = self.get_coordination_numbers(cutoff)
184
- return sorted(list(set(coordination_numbers.values)))
185
-
186
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
187
- def find_missing_bonds_for_all_sites(
188
- self,
189
- bond_templates_list: List[BondDirectionsTemplatesForElement],
190
- max_bonds_to_add: int = 1,
191
- angle_tolerance: float = 0.1,
192
- ) -> List[BondDirections]:
193
- """
194
- Find missing bonds for all sites in the material.
195
-
196
- Args:
197
- self (MaterialWithCrystalSites): The material object with crystal sites.
198
- bond_templates_list (List[BondDirectionsTemplatesForElement]): List of bond templates for each element.
199
-
200
- Returns:
201
- List[BondDirections]: List of missing bonds for each site.
202
- """
203
- missing_bonds: List[BondDirections] = []
204
- for coordinate in self.basis.coordinates.to_array_of_values_with_ids():
205
- existing_bond_directions = BondDirections(self.get_neighbors_vectors_for_site(coordinate.id, cutoff=3.0))
206
- element = self.basis.elements.get_element_value_by_index(coordinate.id)
207
- bond_templates = [
208
- bond_templates_for_element.to_ndarray()
209
- for bond_templates_for_element in bond_templates_list
210
- if bond_templates_for_element.element == element
211
- ]
212
- if bond_templates is None:
213
- continue
214
- missing_bonds_for_site = existing_bond_directions.find_missing_directions(
215
- bond_templates=bond_templates,
216
- angle_tolerance=angle_tolerance,
217
- max_bonds_to_add=max_bonds_to_add,
218
- )
219
- missing_bonds.append(BondDirections(missing_bonds_for_site))
220
-
221
- return missing_bonds
222
-
223
- def find_unique_bond_directions(self) -> List[BondDirectionsTemplatesForElement]:
224
- """
225
- Find unique bond templates for each element type.
226
-
227
- Args:
228
- self (Material): The material object.
229
-
230
- Returns:
231
- List[BondDirectionsTemplatesForElement]: List of unique bond templates for each element.
232
-
233
- Example schematic structure for Graphene with 2 unique bond directions:
234
- {"C": [[0, 1, 0], [-2, -1, 0], [2, -1, 0]], [[0,-1,0], [-2, 1, 0], [2, 1, 0]]}
235
- """
236
- element_templates: List[BondDirectionsTemplatesForElement] = []
237
-
238
- for element in set(self.basis.elements.values):
239
- element_templates.append(self.find_bond_directions_for_element(element))
240
-
241
- return element_templates
242
-
243
- def find_bond_directions_for_element(self, element: str) -> BondDirectionsTemplatesForElement:
244
- """
245
- Find bond directions templates for each element.
246
-
247
- Args:
248
- self (MaterialWithCrystalSites): The material object with crystal sites.
249
- element (str): Chemical element to find templates for.
250
-
251
- Returns:
252
- List[BondDirectionsTemplatesForElement]: List of unique bond templates for the element.
253
- """
254
- atom_vectors = self.nearest_neighbor_vectors
255
- atom_elements = self.basis.elements.values
256
-
257
- element_indices = [i for i, e in enumerate(atom_elements) if e == element]
258
- element_vector_lists = [np.array(atom_vectors.get_element_value_by_index(i)) for i in element_indices]
259
-
260
- if not element_vector_lists:
261
- return BondDirectionsTemplatesForElement(bond_directions_templates=[], element=element)
262
-
263
- max_coordination_number = max(len(vectors) for vectors in element_vector_lists)
264
- max_coordination_number_vectors = [v for v in element_vector_lists if len(v) == max_coordination_number]
265
-
266
- unique_templates: BondDirectionsTemplatesForElement = BondDirectionsTemplatesForElement(
267
- bond_directions_templates=[], element=element
268
- )
269
- for template in max_coordination_number_vectors:
270
- bond_direction = BondDirections(template)
271
- if not any(
272
- np.array_equal(bond_direction, existing) for existing in unique_templates.bond_directions_templates
273
- ):
274
- unique_templates.bond_directions_templates.append(bond_direction)
275
-
276
- return unique_templates