diff --git a/pyproject.toml b/pyproject.toml index 2f6263e..5bf5b10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,8 +36,9 @@ dependencies = [ "typing_extensions", "numpy>=1.20.1", "spglib>=2.5", - "hsnf>=0.3.15", # Hermite normal form + "hsnf>=0.3.15", # Hermite normal form "spgrep>=0.3.2", + "moyopy>=0.7.1", ] [project.urls] @@ -64,6 +65,7 @@ dev = [ "spinspg[docs]", "spgrep-modulation>=0.2.5", "toml", + "ipython", ] [dependency-groups] diff --git a/src/spinspg/core.py b/src/spinspg/core.py index b0192f5..8f0fcf0 100644 --- a/src/spinspg/core.py +++ b/src/spinspg/core.py @@ -6,7 +6,11 @@ import numpy as np -from spinspg.group import get_primitive_spin_symmetry, get_symmetry_with_cell +from spinspg.group import ( + SYMMETRY_FINDER_BACKEND, + get_primitive_spin_symmetry, + get_symmetry_with_cell, +) if TYPE_CHECKING: from spinspg.spin import SpinOnlyGroup @@ -20,6 +24,7 @@ def get_spin_symmetry( magmoms: NDArrayFloat, symprec: float = 1e-5, angle_tolerance: float = -1.0, + backend: SYMMETRY_FINDER_BACKEND = "spglib", ) -> tuple[SpinOnlyGroup, NDArrayInt, NDArrayFloat, NDArrayFloat]: """Return spin symmetry operations of a given spin arrangement. @@ -53,7 +58,9 @@ def get_spin_symmetry( Spin rotation parts of spin symmetry operations in Cartesian coordinates. """ - ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, angle_tolerance) + ns = get_symmetry_with_cell( + lattice, positions, numbers, symprec, angle_tolerance, backend=backend + ) ssg = get_primitive_spin_symmetry(ns, magmoms, symprec) spin_only_group = ssg.spin_only_group diff --git a/src/spinspg/group.py b/src/spinspg/group.py index 4a3e142..ac7c76c 100644 --- a/src/spinspg/group.py +++ b/src/spinspg/group.py @@ -3,10 +3,13 @@ from __future__ import annotations from dataclasses import dataclass +from typing import Literal import numpy as np from hsnf import column_style_hermite_normal_form +from moyopy import Cell, MoyoDataset from spglib import get_symmetry_dataset +from typing_extensions import assert_never from spinspg.permutation import Permutation, get_symmetry_permutations from spinspg.spin import SpinOnlyGroup, SpinOnlyGroupType, get_spin_only_group, solve_procrustes @@ -17,6 +20,8 @@ ndarray2d_to_integer_tuple, ) +SYMMETRY_FINDER_BACKEND = Literal["spglib", "moyopy"] + @dataclass class NonmagneticSymmetry: @@ -55,12 +60,27 @@ def get_symmetry_with_cell( numbers: NDArrayInt, symprec: float, angle_tolerance: float, + backend: SYMMETRY_FINDER_BACKEND = "spglib", ) -> NonmagneticSymmetry: """Find spatial symmetry operations from nonmagnetic crystal structure.""" - dataset = get_symmetry_dataset((lattice, positions, numbers), symprec, angle_tolerance) - rotations = dataset.rotations - translations = dataset.translations - prim_lattice = dataset.primitive_lattice + if backend == "spglib": + dataset = get_symmetry_dataset((lattice, positions, numbers), symprec, angle_tolerance) + rotations = dataset.rotations + translations = dataset.translations + prim_lattice = dataset.primitive_lattice + elif backend == "moyopy": + cell = Cell(basis=lattice.tolist(), positions=positions.tolist(), numbers=numbers.tolist()) + dataset = MoyoDataset( + cell, + symprec=symprec, + angle_tolerance=float(np.deg2rad(angle_tolerance)) if angle_tolerance > 0 else None, + rotate_basis=False, + ) + rotations = np.array(dataset.operations.rotations, dtype=int) + translations = np.array(dataset.operations.translations) + prim_lattice = np.array(dataset.prim_std_cell.basis) + else: + assert_never(backend) # Unique by rotation parts uniq_rotations = [] diff --git a/tests/test_group.py b/tests/test_group.py index e72f9ca..74a0dab 100644 --- a/tests/test_group.py +++ b/tests/test_group.py @@ -3,32 +3,40 @@ from spglib import get_magnetic_symmetry from spinspg.core import get_spin_symmetry -from spinspg.group import get_primitive_spin_symmetry, get_symmetry_with_cell, purify_spin_rotation +from spinspg.group import ( + SYMMETRY_FINDER_BACKEND, + get_primitive_spin_symmetry, + get_symmetry_with_cell, + purify_spin_rotation, +) from spinspg.spin import SpinOnlyGroup, SpinOnlyGroupType from spinspg.utils import NDArrayFloat -def test_get_symmetry_with_cell(fcc): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_get_symmetry_with_cell(fcc, backend: SYMMETRY_FINDER_BACKEND): lattice, positions, numbers, _ = fcc - symmetry = get_symmetry_with_cell(lattice, positions, numbers, 1e-5, -1) + symmetry = get_symmetry_with_cell(lattice, positions, numbers, 1e-5, -1, backend=backend) assert symmetry.prim_rotations.shape == (48, 3, 3) assert symmetry.prim_centerings.shape == (4, 3) -def test_spin_space_group_fcc(fcc): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_spin_space_group_fcc(fcc, backend: SYMMETRY_FINDER_BACKEND): lattice, positions, numbers, magmoms = fcc symprec = 1e-5 - ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1) + ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1, backend=backend) ssg = get_primitive_spin_symmetry(ns, magmoms, symprec) assert ssg.spin_only_group.spin_only_group_type == SpinOnlyGroupType.COPLANAR assert len(ssg.spin_translation_coset) == 2 -def test_spin_space_group_kagome(layer_triangular_kagome): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_spin_space_group_kagome(layer_triangular_kagome, backend: SYMMETRY_FINDER_BACKEND): lattice, positions, numbers, magmoms = layer_triangular_kagome symprec = 1e-5 - ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1) + ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1, backend=backend) ssg = get_primitive_spin_symmetry(ns, magmoms, symprec) assert ssg.spin_only_group.spin_only_group_type == SpinOnlyGroupType.COPLANAR @@ -42,10 +50,11 @@ def test_spin_space_group_kagome(layer_triangular_kagome): assert len(ssg.nontrivial_coset) == 24 # 6/mmm -def test_spin_space_group_rutile(rutile): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_spin_space_group_rutile(rutile, backend: SYMMETRY_FINDER_BACKEND): lattice, positions, numbers, magmoms = rutile symprec = 1e-5 - ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1) + ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1, backend=backend) ssg = get_primitive_spin_symmetry(ns, magmoms, symprec) assert ssg.spin_only_group.spin_only_group_type == SpinOnlyGroupType.COLLINEAR @@ -72,10 +81,13 @@ def test_spin_space_group_rutile(rutile): ("Ni_in_NiTa2O6", SpinOnlyGroupType.COLLINEAR, [1, -1, 0]), ], ) -def test_spin_space_groups(request, testcase, spin_only_group_type, axis): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_spin_space_groups( + request, testcase, spin_only_group_type, axis, backend: SYMMETRY_FINDER_BACKEND +): lattice, positions, numbers, magmoms = request.getfixturevalue(testcase) symprec = 1e-5 - ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1) + ns = get_symmetry_with_cell(lattice, positions, numbers, symprec, -1, backend=backend) ssg = get_primitive_spin_symmetry(ns, magmoms, symprec) assert ssg.spin_only_group.spin_only_group_type == spin_only_group_type @@ -90,10 +102,11 @@ def test_spin_space_groups(request, testcase, spin_only_group_type, axis): assert num_sym >= len(mag_symmetry["rotations"]) -def test_get_spin_symmetry(rutile): +@pytest.mark.parametrize("backend", ["spglib", "moyopy"]) +def test_get_spin_symmetry(rutile, backend: SYMMETRY_FINDER_BACKEND): lattice, positions, numbers, magmoms = rutile sog, rotations, translations, spin_rotations = get_spin_symmetry( - lattice, positions, numbers, magmoms + lattice, positions, numbers, magmoms, backend=backend ) assert sog.spin_only_group_type == SpinOnlyGroupType.COLLINEAR @@ -205,7 +218,9 @@ def test_get_spin_symmetry(rutile): for rot, trans, srot in zip(rotations, translations, spin_rotations): for i in range(len(expects)): if (not found[i]) and np.allclose(rot, expects[i][0]): - assert np.allclose(trans, expects[i][1]) + diff = trans - expects[i][1] + diff -= np.rint(diff) + assert np.allclose(diff, 0) assert np.allclose(srot, expects[i][2]) found[i] = True diff --git a/uv.lock b/uv.lock index 2cbf78b..dc30c6e 100644 --- a/uv.lock +++ b/uv.lock @@ -71,6 +71,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/9f/fa9971d2a0c6fef64c87ba362a493a4f230eff4ea8dfb9f4c7cbdf71892e/apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf", size = 99286, upload-time = "2024-01-30T17:45:46.764Z" }, ] +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, +] + [[package]] name = "autodocsumm" version = "0.2.14" @@ -508,6 +517,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + [[package]] name = "dict2css" version = "0.3.0.post1" @@ -585,6 +603,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, ] +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + [[package]] name = "filelock" version = "3.19.1" @@ -772,6 +799,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] +[[package]] +name = "ipython" +version = "8.37.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi", marker = "python_full_version < '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, + { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, + { name = "pygments", marker = "python_full_version < '3.11'" }, + { name = "stack-data", marker = "python_full_version < '3.11'" }, + { name = "traitlets", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, +] + +[[package]] +name = "ipython" +version = "9.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version >= '3.11' and python_full_version < '3.13'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/34/29b18c62e39ee2f7a6a3bba7efd952729d8aadd45ca17efc34453b717665/ipython-9.6.0.tar.gz", hash = "sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731", size = 4396932, upload-time = "2025-09-29T10:55:53.948Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/c5/d5e07995077e48220269c28a221e168c91123ad5ceee44d548f54a057fc0/ipython-9.6.0-py3-none-any.whl", hash = "sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196", size = 616170, upload-time = "2025-09-29T10:55:47.676Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -1076,6 +1178,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/53/8d8fa0ea32a8c8239e04d022f6c059ee5e1b77517769feccd50f1df43d6d/matplotlib-3.10.6-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d6ca6ef03dfd269f4ead566ec6f3fb9becf8dab146fb999022ed85ee9f6b3eb", size = 8693933, upload-time = "2025-08-30T00:14:22.942Z" }, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + [[package]] name = "mdit-py-plugins" version = "0.5.0" @@ -1106,6 +1220,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, ] +[[package]] +name = "moyopy" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/df/911d3f027ddf29fc82607c0ab194480777a05ed7d3af78cc55d0cf3fd513/moyopy-0.7.1.tar.gz", hash = "sha256:9c0783d88d33fbb8c5fbe568c2f71aa35a4fc8066ff984e2196f5b0e66632382", size = 411614, upload-time = "2025-10-25T03:56:45.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/3c/c71842f0aae8982f233dff2b01006353302e2c8c3093b9a18d624afe53e0/moyopy-0.7.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:77c3949df12f247071701a31d4b687494bfae444343105128603bb723e27db7d", size = 867093, upload-time = "2025-10-25T03:56:38.765Z" }, + { url = "https://files.pythonhosted.org/packages/1b/55/1d23dcfc2dad9004d0d2d324b9c7817a42bfbe7d8d7f7d6e074dbc2f0c67/moyopy-0.7.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:544259c619bb9878f543cca75dde2d65fb43d55b561efabddfac27f8829b6d79", size = 842122, upload-time = "2025-10-25T03:56:40.367Z" }, + { url = "https://files.pythonhosted.org/packages/a0/72/c25cc515242d1be0faa834c54626610b10b74ff25e14d019cad40c85018d/moyopy-0.7.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdfe44de2874a37dbcce27440831bc08ec61d5a9db3b398197fbbc364074c528", size = 999140, upload-time = "2025-10-25T03:56:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/e2/07/df7532c9fa965c433a930cb64a65ea425d950a055c4ec2eb8a42f2afc038/moyopy-0.7.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e494484af2c9d1cf3df7576527b40b401fc9f1839a65900263836c82515536f4", size = 959004, upload-time = "2025-10-25T03:56:43.147Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f4/6815d5cf5725b265d29fad18ad00713e63c2cf880acba228d1a829e0b8ba/moyopy-0.7.1-cp39-abi3-win_amd64.whl", hash = "sha256:eed450b41bc06ad181ff8c089cd49eb3d7a71be1e33a48b08c16be9f8d8c4a36", size = 682554, upload-time = "2025-10-25T03:56:44.52Z" }, +] + [[package]] name = "msgpack" version = "1.1.1" @@ -1349,6 +1479,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + [[package]] name = "phonopy" version = "2.43.2" @@ -1522,6 +1673,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + [[package]] name = "pydata-sphinx-theme" version = "0.15.4" @@ -2317,6 +2498,7 @@ name = "spinspg" source = { editable = "." } dependencies = [ { name = "hsnf" }, + { name = "moyopy" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "setuptools" }, @@ -2331,6 +2513,8 @@ dependencies = [ dev = [ { name = "enum-tools", extra = ["sphinx"] }, { name = "importlib-metadata" }, + { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "linkify-it-py" }, { name = "myst-parser" }, { name = "pre-commit" }, @@ -2371,7 +2555,9 @@ requires-dist = [ { name = "enum-tools", extras = ["sphinx"], marker = "extra == 'docs'" }, { name = "hsnf", specifier = ">=0.3.15" }, { name = "importlib-metadata", marker = "extra == 'docs'" }, + { name = "ipython", marker = "extra == 'dev'" }, { name = "linkify-it-py", marker = "extra == 'docs'" }, + { name = "moyopy", specifier = ">=0.7.1" }, { name = "myst-parser", marker = "extra == 'docs'" }, { name = "numpy", specifier = ">=1.20.1" }, { name = "pre-commit", marker = "extra == 'testing'" }, @@ -2396,6 +2582,20 @@ provides-extras = ["testing", "docs", "dev"] [package.metadata.requires-dev] dev = [{ name = "spinspg", extras = ["dev"] }] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + [[package]] name = "standard-imghdr" version = "3.10.14" @@ -2491,6 +2691,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -2647,6 +2856,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009, upload-time = "2025-06-15T19:06:52.896Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "webencodings" version = "0.5.1"