From 94605969b3adc8e8f88c210b2d0d1cb8cc9ef1d8 Mon Sep 17 00:00:00 2001 From: Jim Arquin Date: Wed, 19 Nov 2025 13:11:19 +0200 Subject: [PATCH 1/9] Added reverse mapping implementation to LabelMap with unit tests --- src/lammpsio/topology.py | 12 ++++++++++-- tests/test_topology.py | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index 5f05241f..7b4b989d 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -387,17 +387,20 @@ class LabelMap(collections.abc.MutableMapping[int, str]): def __init__(self, map=None): self._map = {} + self._inverse_map = {} if map is not None: - self.update(map) + self.update(map) def __getitem__(self, key): return self._map[key] def __setitem__(self, key, value): self._map[key] = value + self._inverse_map[value] = key def __delitem__(self, key): - del self._map[key] + value = self._map.pop(key) + del self._inverse_map[value] def __iter__(self): return iter(self._map) @@ -414,3 +417,8 @@ def types(self): def typeid(self): """tuple of int: Type IDs in map.""" return tuple(self._map.keys()) + + @property + def inverse(self): + """ exposes _inverse_map as a read-only property """ + return self._inverse_map diff --git a/tests/test_topology.py b/tests/test_topology.py index c82d7c4f..218ff29e 100644 --- a/tests/test_topology.py +++ b/tests/test_topology.py @@ -204,16 +204,21 @@ def test_impropers_wrong_shape(snap_8): def test_LabelMap(): # create a simple label map label = lammpsio.topology.LabelMap({1: "typeA", 2: "typeB"}) - + # check inverse mapping + assert label.inverse == {"typeA":1,"typeB":2} # check the types assert label.types == ("typeA", "typeB") # check the typeids assert label.typeid == (1, 2) # get assert label[2] == "typeB" + # get inverse + assert label.inverse["typeB"] == 2 # set label[3] = "typeC" assert label[3] == "typeC" + assert label.inverse["typeC"] == 3 # delete del label[3] assert 3 not in label + assert "typeC" not in label.inverse From a3a7c080fed74fd7952a4992d69bd2111a09a198 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 12:14:50 +0000 Subject: [PATCH 2/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/lammpsio/topology.py | 10 +++++----- tests/test_topology.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index 7b4b989d..b3ff4201 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -389,7 +389,7 @@ def __init__(self, map=None): self._map = {} self._inverse_map = {} if map is not None: - self.update(map) + self.update(map) def __getitem__(self, key): return self._map[key] @@ -417,8 +417,8 @@ def types(self): def typeid(self): """tuple of int: Type IDs in map.""" return tuple(self._map.keys()) - - @property + + @property def inverse(self): - """ exposes _inverse_map as a read-only property """ - return self._inverse_map + """exposes _inverse_map as a read-only property""" + return self._inverse_map diff --git a/tests/test_topology.py b/tests/test_topology.py index 218ff29e..e0da9455 100644 --- a/tests/test_topology.py +++ b/tests/test_topology.py @@ -205,7 +205,7 @@ def test_LabelMap(): # create a simple label map label = lammpsio.topology.LabelMap({1: "typeA", 2: "typeB"}) # check inverse mapping - assert label.inverse == {"typeA":1,"typeB":2} + assert label.inverse == {"typeA": 1, "typeB": 2} # check the types assert label.types == ("typeA", "typeB") # check the typeids From f3ee0d5a8c63853cbbc5640a1b9381e4f2116d30 Mon Sep 17 00:00:00 2001 From: Jim-Arq <147927431+Jim-Arq@users.noreply.github.com> Date: Wed, 19 Nov 2025 22:44:59 +0200 Subject: [PATCH 3/9] Update src/lammpsio/topology.py type hint usage Co-authored-by: Michael Howard --- src/lammpsio/topology.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index b3ff4201..d22f675a 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -419,6 +419,6 @@ def typeid(self): return tuple(self._map.keys()) @property - def inverse(self): - """exposes _inverse_map as a read-only property""" + def inverse(self) -> dict[str, int]: + """dict: Inverse map from type label to type id.""" return self._inverse_map From 7dceb869823eb8378a2675504e78a3f14db7ae2f Mon Sep 17 00:00:00 2001 From: Jim-Arq <147927431+Jim-Arq@users.noreply.github.com> Date: Wed, 19 Nov 2025 22:46:51 +0200 Subject: [PATCH 4/9] Apply suggestions from code review Co-authored-by: Michael Howard --- tests/test_topology.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_topology.py b/tests/test_topology.py index e0da9455..1917feaa 100644 --- a/tests/test_topology.py +++ b/tests/test_topology.py @@ -204,8 +204,6 @@ def test_impropers_wrong_shape(snap_8): def test_LabelMap(): # create a simple label map label = lammpsio.topology.LabelMap({1: "typeA", 2: "typeB"}) - # check inverse mapping - assert label.inverse == {"typeA": 1, "typeB": 2} # check the types assert label.types == ("typeA", "typeB") # check the typeids From 03591986d2356c5fdc9fbe0bf1da14d5aa9d67d8 Mon Sep 17 00:00:00 2001 From: Jim Arquin Date: Wed, 19 Nov 2025 22:52:19 +0200 Subject: [PATCH 5/9] Added suggested documentation (became outdated) --- src/lammpsio/topology.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index d22f675a..9e12e6ee 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -383,6 +383,18 @@ class LabelMap(collections.abc.MutableMapping[int, str]): This creates a dictionary mapping numeric type ID labels 1 and 2 used by LAMMPS to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. + to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. The + map can be accessed directly: + + .. code-block:: python + + assert type_label[1] == "A" + + The `LabelMap` additionally supports inverse mapping from type label to type ID: + + .. code-block:: python + + assert type_label.inverse["B"] == 2 """ def __init__(self, map=None): From 5719b2217483b967aec1e9620aacf252615bf344 Mon Sep 17 00:00:00 2001 From: Jim Arquin Date: Wed, 19 Nov 2025 23:02:39 +0200 Subject: [PATCH 6/9] Final changes and credits addition --- doc/source/credits.rst | 1 + src/lammpsio/topology.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/source/credits.rst b/doc/source/credits.rst index 01ec5b09..df1c29ba 100644 --- a/doc/source/credits.rst +++ b/doc/source/credits.rst @@ -6,3 +6,4 @@ Credits * Mayukh Kundu * Philipp Leclercq * C\. Levi Petix +* Dimitris Arquin diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index 9e12e6ee..755fbfe4 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -381,8 +381,6 @@ class LabelMap(collections.abc.MutableMapping[int, str]): type_label = lammpsio.topology.LabelMap({1: "A", 2: "B"}) This creates a dictionary mapping numeric type ID labels 1 and 2 used by LAMMPS - to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. - to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. The map can be accessed directly: From 823d9bc7e50fcf49f277ab8d2d5cafe303d61606 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:07:22 +0000 Subject: [PATCH 7/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/lammpsio/topology.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lammpsio/topology.py b/src/lammpsio/topology.py index 755fbfe4..43b1583f 100644 --- a/src/lammpsio/topology.py +++ b/src/lammpsio/topology.py @@ -383,15 +383,15 @@ class LabelMap(collections.abc.MutableMapping[int, str]): This creates a dictionary mapping numeric type ID labels 1 and 2 used by LAMMPS to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. The map can be accessed directly: - + .. code-block:: python - + assert type_label[1] == "A" - + The `LabelMap` additionally supports inverse mapping from type label to type ID: - + .. code-block:: python - + assert type_label.inverse["B"] == 2 """ From cac6195227c2dfcff5ddd9da82e7f8c4391a7535 Mon Sep 17 00:00:00 2001 From: Michael Howard Date: Wed, 19 Nov 2025 15:43:14 -0600 Subject: [PATCH 8/9] Apply suggestion from @mphoward --- doc/source/credits.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/source/credits.rst b/doc/source/credits.rst index df1c29ba..373d15d3 100644 --- a/doc/source/credits.rst +++ b/doc/source/credits.rst @@ -7,3 +7,7 @@ Credits * Philipp Leclercq * C\. Levi Petix * Dimitris Arquin +* Michael P. Howard +* Mayukh Kundu +* Philipp Leclercq +* C\. Levi Petix From e56f04c2ef763c58c59219cd8cf7fc994fe90612 Mon Sep 17 00:00:00 2001 From: Michael Howard Date: Wed, 19 Nov 2025 15:44:41 -0600 Subject: [PATCH 9/9] Fix botched suggestion application --- doc/source/credits.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/doc/source/credits.rst b/doc/source/credits.rst index 373d15d3..52b0ac4d 100644 --- a/doc/source/credits.rst +++ b/doc/source/credits.rst @@ -2,10 +2,6 @@ Credits ======= -* Michael P. Howard -* Mayukh Kundu -* Philipp Leclercq -* C\. Levi Petix * Dimitris Arquin * Michael P. Howard * Mayukh Kundu