Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document that Molecule.from_dict accepts a list of lists but not a numpy array #1998

Open
jaclark5 opened this issue Jan 16, 2025 · 2 comments · May be fixed by #2007
Open

Document that Molecule.from_dict accepts a list of lists but not a numpy array #1998

jaclark5 opened this issue Jan 16, 2025 · 2 comments · May be fixed by #2007
Assignees

Comments

@jaclark5
Copy link
Contributor

Describe the bug
When using the Molecule.from_dict method, molecule_dict["conformers"][0] cannot be a numpy array.

To Reproduce

import numpy as np
from openff.toolkit import Molecule

test = {'atoms': [{'atomic_number': 17,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 7,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 16,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 7,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 16,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 7,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 7,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 6,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 29,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': 'R'},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atomic_number': 1,
            'formal_charge': 0,
            'is_aromatic': False,
            'stereochemistry': None}],
 'bonds': [{'atom1': 0,
            'atom2': 20,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 1,
            'atom2': 4,
            'bond_order': 2,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 1,
            'atom2': 2,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 4,
            'atom2': 7,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 20,
            'atom2': 2,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 20,
            'atom2': 3,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 20,
            'atom2': 8,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 2,
            'atom2': 11,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 7,
            'atom2': 9,
            'bond_order': 2,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 3,
            'atom2': 18,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 11,
            'atom2': 9,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 11,
            'atom2': 12,
            'bond_order': 2,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 8,
            'atom2': 12,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 8,
            'atom2': 10,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 18,
            'atom2': 10,
            'bond_order': 2,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 18,
            'atom2': 6,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 12,
            'atom2': 13,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 6,
            'atom2': 19,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 14,
            'atom2': 13,
            'bond_order': 2,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 14,
            'atom2': 15,
            'bond_order': 1,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 13,
            'atom2': 5,
            'bond_order': 1,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 15,
            'atom2': 16,
            'bond_order': 2,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 5,
            'atom2': 17,
            'bond_order': 2,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 16,
            'atom2': 17,
            'bond_order': 1,
            'is_aromatic': True,
            'stereochemistry': None},
           {'atom1': 1,
            'atom2': 21,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 4,
            'atom2': 22,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 7,
            'atom2': 23,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 9,
            'atom2': 24,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 14,
            'atom2': 25,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 15,
            'atom2': 26,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 16,
            'atom2': 27,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 17,
            'atom2': 28,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 19,
            'atom2': 29,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 19,
            'atom2': 30,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None},
           {'atom1': 19,
            'atom2': 31,
            'bond_order': 1,
            'is_aromatic': False,
            'stereochemistry': None}],
 'conformers': [np.array([[1.032, -1.316, -2.215],
                 [-0.521, -3.197, 0.611],
                 [-0.433, -1.89, 0.232],
                 [2.289, -0.98, 0.702],
                 [-1.7, -3.715, 1.009],
                 [-3.487, 1.084, 0.136],
                 [3.983, 1.697, 0.757],
                 [-2.855, -2.905, 1.036],
                 [0.18, 0.5, -0.023],
                 [-2.777, -1.592, 0.714],
                 [1.312, 1.288, 0.12],
                 [-1.525, -1.028, 0.346],
                 [-1.197, 0.293, 0.106],
                 [-2.189, 1.365, -0.001],
                 [-1.77, 2.681, -0.246],
                 [-2.719, 3.678, -0.344],
                 [-4.061, 3.339, -0.194],
                 [-4.408, 2.023, 0.046],
                 [2.498, 0.788, 0.494],
                 [3.492, 3.401, 0.372],
                 [0.716, -1.001, -0.41],
                 [0.359, -3.823, 0.588],
                 [-1.761, -4.752, 1.307],
                 [-3.805, -3.334, 1.315],
                 [-3.664, -0.975, 0.736],
                 [-0.721, 2.911, -0.357],
                 [-2.427, 4.701, -0.532],
                 [-4.825, 4.098, -0.266],
                 [-5.449, 1.761, 0.161],
                 [4.347, 4.064, 0.502],
                 [3.145, 3.454, -0.66],
                 [2.689, 3.708, 1.041]])],
 'conformers_unit': 'angstrom',
 'hierarchy_schemes': {},
 'name': 'data_0TE',
 'partial_charges': None,
 'properties': {}}

test["conformers"][0] = np.array(test["conformers"][0])
mol = Molecule.from_dict(
        test,
    )

Output

UnboundLocalError                         Traceback (most recent call last)
Cell In[64], [line 13](vscode-notebook-cell:?execution_count=64&line=13)
     [11](vscode-notebook-cell:?execution_count=64&line=11) print(test)
     [12](vscode-notebook-cell:?execution_count=64&line=12) test["conformers"][0] = np.array(test["conformers"][0])
---> [13](vscode-notebook-cell:?execution_count=64&line=13) mol = Molecule.from_dict(
     [14](vscode-notebook-cell:?execution_count=64&line=14)         test,
     [15](vscode-notebook-cell:?execution_count=64&line=15)     )

File ~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1252, in FrozenMolecule.from_dict(cls, molecule_dict)
   [1250](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1250) # This implementation is a compromise to let this remain as a classmethod
   [1251](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1251) mol = cls()
-> [1252](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1252) mol._initialize_from_dict(molecule_dict)
   [1253](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1253) return mol

File ~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1291, in FrozenMolecule._initialize_from_dict(self, molecule_dict)
   [1288](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1288) else:
   [1289](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1289)     from openff.toolkit.utils.utils import deserialize_numpy
-> [1291](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1291)     self._conformers = [
   [1292](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1292)         Quantity(
   [1293](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1293)             deserialize_numpy(ser_conf, (self.n_atoms, 3)),
   [1294](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1294)             unit.Unit(molecule_dict["conformers_unit"]),
   [1295](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1295)         )
   [1296](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1296)         for ser_conf in molecule_dict["conformers"]
   [1297](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/topology/molecule.py:1297)     ]
...
    [442](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/utils/utils.py:442)     np_array = np.frombuffer(serialized_np, dtype=dt)
--> [443](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/utils/utils.py:443) np_array = np_array.reshape(shape)
    [444](https://file+.vscode-resource.vscode-cdn.net/Users/jenniferclark/OMSF/OpenFF/Organometallics/Datasets/DS1-CCD/~/bin/openff-toolkit/openff/toolkit/utils/utils.py:444) return np_array

UnboundLocalError: cannot access local variable 'np_array' where it is not associated with a value

Computing environment (please complete the following information):

  • Operating system: MacOS
  • Output of running conda list:
List of packages in environment: "/Users/jenniferclark/.local/share/mamba/envs/qca"

 Name                           Version                  Build                              Channel    
──────────────────────────────────────────────────────────────────────────────────────────────────────────
 alabaster                      1.0.0                    pyhd8ed1ab_1                       conda-forge
 ambertools                     23.6                     cuda_None_nompi_py311h486627a_105  conda-forge
 annotated-types                0.7.0                    pyhd8ed1ab_1                       conda-forge
 anyio                          4.8.0                    pyhd8ed1ab_0                       conda-forge
 appnope                        0.1.4                    pyhd8ed1ab_1                       conda-forge
 apsw                           3.47.0.0                 py311hde754ab_0                    conda-forge
 argcomplete                    3.5.2                    pyhd8ed1ab_0                       conda-forge
 argon2-cffi                    23.1.0                   pyhd8ed1ab_1                       conda-forge
 argon2-cffi-bindings           21.2.0                   py311h460d6c5_5                    conda-forge
 arpack                         3.9.1                    nompi_h1f29f7c_102                 conda-forge
 arrow                          1.3.0                    pyhd8ed1ab_1                       conda-forge
 asttokens                      3.0.0                    pyhd8ed1ab_1                       conda-forge
 async-lru                      2.0.4                    pyhd8ed1ab_1                       conda-forge
 attrs                          24.3.0                   pyh71513ae_0                       conda-forge
 autodoc-pydantic               2.1.0                    pyh3cfb1c2_1                       conda-forge
 babel                          2.16.0                   pyhd8ed1ab_1                       conda-forge
 basis_set_exchange             0.10                     pyhd8ed1ab_1                       conda-forge
 beautifulsoup4                 4.12.3                   pyha770c72_1                       conda-forge
 bleach                         6.2.0                    pyhd8ed1ab_3                       conda-forge
 blosc                          1.21.6                   h7dd00d9_1                         conda-forge
 brotli                         1.1.0                    hd74edd7_2                         conda-forge
 brotli-bin                     1.1.0                    hd74edd7_2                         conda-forge
 brotli-python                  1.1.0                    py311h3f08180_2                    conda-forge
 bson                           0.5.9                    pyhd8ed1ab_1                       conda-forge
 bzip2                          1.0.8                    h99b78c6_7                         conda-forge
 c-ares                         1.34.4                   h5505292_0                         conda-forge
 c-blosc2                       2.15.2                   h9cbb436_1                         conda-forge
 ca-certificates                2024.12.14               hf0a4a13_0                         conda-forge
 cached-property                1.5.2                    hd8ed1ab_1                         conda-forge
 cached_property                1.5.2                    pyha770c72_1                       conda-forge
 cachetools                     5.5.0                    pyhd8ed1ab_1                       conda-forge
 cairo                          1.18.2                   h6a3b0d2_1                         conda-forge
 certifi                        2024.12.14               pyhd8ed1ab_0                       conda-forge
 cffi                           1.17.1                   py311h3a79f62_0                    conda-forge
 chardet                        5.2.0                    py311h267d04e_2                    conda-forge
 charset-normalizer             3.4.1                    pyhd8ed1ab_0                       conda-forge
 click                          8.1.8                    pyh707e725_0                       conda-forge
 click-option-group             0.5.6                    pyhd8ed1ab_0                       conda-forge
 colorama                       0.4.6                    pyhd8ed1ab_1                       conda-forge
 comm                           0.2.2                    pyhd8ed1ab_1                       conda-forge
 commonmark                     0.9.1                    py_0                               conda-forge
 contourpy                      1.3.1                    py311h210dab8_0                    conda-forge
 coverage                       7.6.10                   py311h4921393_0                    conda-forge
 cpython                        3.11.11                  py311hd8ed1ab_1                    conda-forge
 cycler                         0.12.1                   pyhd8ed1ab_1                       conda-forge
 debugpy                        1.8.11                   py311h155a34a_0                    conda-forge
 decorator                      5.1.1                    pyhd8ed1ab_1                       conda-forge
 deepdiff                       8.1.1                    pyhd8ed1ab_0                       conda-forge
 defusedxml                     0.7.1                    pyhd8ed1ab_0                       conda-forge
 docutils                       0.21.2                   pyhd8ed1ab_1                       conda-forge
 entrypoints                    0.4                      pyhd8ed1ab_1                       conda-forge
 exceptiongroup                 1.2.2                    pyhd8ed1ab_1                       conda-forge
 execnet                        2.1.1                    pyhd8ed1ab_1                       conda-forge
 executing                      2.1.0                    pyhd8ed1ab_1                       conda-forge
 fftw                           3.3.10                   nompi_h6637ab6_110                 conda-forge
 filelock                       3.16.1                   pyhd8ed1ab_1                       conda-forge
 font-ttf-dejavu-sans-mono      2.37                     hab24e00_0                         conda-forge
 font-ttf-inconsolata           3.000                    h77eed37_0                         conda-forge
 font-ttf-source-code-pro       2.038                    h77eed37_0                         conda-forge
 font-ttf-ubuntu                0.83                     h77eed37_3                         conda-forge
 fontconfig                     2.15.0                   h1383a14_1                         conda-forge
 fonts-conda-ecosystem          1                        0                                  conda-forge
 fonts-conda-forge              1                        0                                  conda-forge
 fonttools                      4.55.3                   py311h4921393_1                    conda-forge
 fqdn                           1.5.1                    pyhd8ed1ab_1                       conda-forge
 freetype                       2.12.1                   hadb7bae_2                         conda-forge
 freetype-py                    2.3.0                    pyhd8ed1ab_0                       conda-forge
 fsspec                         2024.12.0                pyhd8ed1ab_0                       conda-forge
 future                         1.0.0                    pyhd8ed1ab_1                       conda-forge
 gemmi                          0.7.0                    pypi_0                             pypi       
 geometric                      1.0.2                    pyhd8ed1ab_0                       conda-forge
 gmp                            6.3.0                    h7bae524_2                         conda-forge
 gmpy2                          2.1.5                    py311hb5d9ff4_3                    conda-forge
 greenlet                       3.1.1                    py311h155a34a_1                    conda-forge
 h11                            0.14.0                   pyhd8ed1ab_1                       conda-forge
 h2                             4.1.0                    pyhd8ed1ab_1                       conda-forge
 hdf4                           4.2.15                   h2ee6834_7                         conda-forge
 hdf5                           1.14.3                   nompi_ha698983_108                 conda-forge
 hpack                          4.0.0                    pyhd8ed1ab_1                       conda-forge
 httpcore                       1.0.7                    pyh29332c3_1                       conda-forge
 httpx                          0.28.1                   pyhd8ed1ab_0                       conda-forge
 hyperframe                     6.0.1                    pyhd8ed1ab_1                       conda-forge
 icu                            75.1                     hfee45f7_0                         conda-forge
 idna                           3.10                     pyhd8ed1ab_1                       conda-forge
 imagesize                      1.4.1                    pyhd8ed1ab_0                       conda-forge
 importlib-metadata             8.5.0                    pyha770c72_1                       conda-forge
 importlib_resources            6.4.5                    pyhd8ed1ab_1                       conda-forge
 iniconfig                      2.0.0                    pyhd8ed1ab_1                       conda-forge
 ipykernel                      6.29.5                   pyh57ce528_0                       conda-forge
 ipython                        8.31.0                   pyh707e725_0                       conda-forge
 ipywidgets                     8.1.5                    pyhd8ed1ab_1                       conda-forge
 isoduration                    20.11.0                  pyhd8ed1ab_1                       conda-forge
 jedi                           0.19.2                   pyhd8ed1ab_1                       conda-forge
 jinja2                         3.1.5                    pyhd8ed1ab_0                       conda-forge
 joblib                         1.4.2                    pyhd8ed1ab_1                       conda-forge
 json5                          0.10.0                   pyhd8ed1ab_1                       conda-forge
 jsonpointer                    3.0.0                    py311h267d04e_1                    conda-forge
 jsonschema                     4.23.0                   pyhd8ed1ab_1                       conda-forge
 jsonschema-specifications      2024.10.1                pyhd8ed1ab_1                       conda-forge
 jsonschema-with-format-nongpl  4.23.0                   hd8ed1ab_1                         conda-forge
 jupyter                        1.1.1                    pyhd8ed1ab_1                       conda-forge
 jupyter-lsp                    2.2.5                    pyhd8ed1ab_1                       conda-forge
 jupyter_client                 8.6.3                    pyhd8ed1ab_1                       conda-forge
 jupyter_console                6.6.3                    pyhd8ed1ab_1                       conda-forge
 jupyter_core                   5.7.2                    pyh31011fe_1                       conda-forge
 jupyter_events                 0.11.0                   pyhd8ed1ab_0                       conda-forge
 jupyter_server                 2.15.0                   pyhd8ed1ab_0                       conda-forge
 jupyter_server_terminals       0.5.3                    pyhd8ed1ab_1                       conda-forge
 jupyterlab                     4.3.4                    pyhd8ed1ab_0                       conda-forge
 jupyterlab_pygments            0.3.0                    pyhd8ed1ab_2                       conda-forge
 jupyterlab_server              2.27.3                   pyhd8ed1ab_1                       conda-forge
 jupyterlab_widgets             3.0.13                   pyhd8ed1ab_1                       conda-forge
 khronos-opencl-icd-loader      2024.10.24               h5505292_1                         conda-forge
 kiwisolver                     1.4.7                    py311h2c37856_0                    conda-forge
 krb5                           1.21.3                   h237132a_0                         conda-forge
 latexcodec                     2.0.1                    pyh9f0ad1d_0                       conda-forge
 lcms2                          2.16                     ha0e7c42_0                         conda-forge
 lerc                           4.0.0                    h9a09cb3_0                         conda-forge
 libabseil                      20240722.0               cxx17_h07bc746_4                   conda-forge
 libaec                         1.1.3                    hebf3989_0                         conda-forge
 libblas                        3.9.0                    26_osxarm64_openblas               conda-forge
 libboost                       1.84.0                   hc9fb7c5_7                         conda-forge
 libboost-python                1.84.0                   py311h8fc16d6_7                    conda-forge
 libbrotlicommon                1.1.0                    hd74edd7_2                         conda-forge
 libbrotlidec                   1.1.0                    hd74edd7_2                         conda-forge
 libbrotlienc                   1.1.0                    hd74edd7_2                         conda-forge
 libcblas                       3.9.0                    26_osxarm64_openblas               conda-forge
 libcurl                        8.11.1                   h73640d1_0                         conda-forge
 libcxx                         19.1.6                   ha82da77_1                         conda-forge
 libdeflate                     1.23                     hec38601_0                         conda-forge
 libedit                        3.1.20191231             hc8eb9b7_2                         conda-forge
 libev                          4.33                     h93a5062_2                         conda-forge
 libexpat                       2.6.4                    h286801f_0                         conda-forge
 libffi                         3.4.2                    h3422bc3_5                         conda-forge
 libgfortran                    5.0.0                    13_2_0_hd922786_3                  conda-forge
 libgfortran5                   13.2.0                   hf226fd6_3                         conda-forge
 libglib                        2.82.2                   h07bd6cf_0                         conda-forge
 libiconv                       1.17                     h0d3ecfb_2                         conda-forge
 libintl                        0.22.5                   h8414b35_3                         conda-forge
 libjpeg-turbo                  3.0.0                    hb547adb_1                         conda-forge
 liblapack                      3.9.0                    26_osxarm64_openblas               conda-forge
 liblzma                        5.6.3                    h39f12f2_1                         conda-forge
 libnetcdf                      4.9.2                    nompi_h610d594_116                 conda-forge
 libnghttp2                     1.64.0                   h6d7220d_0                         conda-forge
 libopenblas                    0.3.28                   openmp_hf332438_1                  conda-forge
 libpng                         1.6.44                   hc14010f_0                         conda-forge
 libpq                          16.6                     hb008251_1                         conda-forge
 libprotobuf                    5.28.3                   h3bd63a1_1                         conda-forge
 librdkit                       2024.03.6                h3cc9767_0                         conda-forge
 libsodium                      1.0.20                   h99b78c6_0                         conda-forge
 libsqlite                      3.47.0                   hbaaea75_1                         conda-forge
 libssh2                        1.11.1                   h9cc3647_0                         conda-forge
 libtiff                        4.7.0                    h551f018_3                         conda-forge
 libtorch                       2.5.1                    cpu_generic_h326f772_8             conda-forge
 libuv                          1.49.2                   h7ab814d_0                         conda-forge
 libwebp-base                   1.5.0                    h2471fea_0                         conda-forge
 libxcb                         1.17.0                   hdb1d25a_0                         conda-forge
 libxml2                        2.13.5                   h178c5d8_1                         conda-forge
 libxslt                        1.1.39                   h223e5b9_0                         conda-forge
 libzip                         1.11.2                   h1336266_0                         conda-forge
 libzlib                        1.3.1                    h8359307_2                         conda-forge
 lightning-utilities            0.11.9                   pyhd8ed1ab_1                       conda-forge
 llvm-openmp                    19.1.6                   hdb05f8b_0                         conda-forge
 lxml                           5.3.0                    py311h96511b9_2                    conda-forge
 lz4-c                          1.10.0                   h286801f_1                         conda-forge
 m2r2                           0.3.3.post2              pyhd8ed1ab_0                       conda-forge
 markdown-it-py                 3.0.0                    pyhd8ed1ab_1                       conda-forge
 markupsafe                     3.0.2                    py311h4921393_1                    conda-forge
 matplotlib                     3.10.0                   py311ha1ab1f8_0                    conda-forge
 matplotlib-base                3.10.0                   py311h031da69_0                    conda-forge
 matplotlib-inline              0.1.7                    pyhd8ed1ab_1                       conda-forge
 mdit-py-plugins                0.4.2                    pyhd8ed1ab_1                       conda-forge
 mdtraj                         1.10.2                   py311he9eb210_0                    conda-forge
 mdurl                          0.1.2                    pyhd8ed1ab_1                       conda-forge
 mistune                        0.8.4                    pyh1a96a4e_1006                    conda-forge
 mpc                            1.3.1                    h8f1351a_1                         conda-forge
 mpfr                           4.2.1                    hb693164_3                         conda-forge
 mpmath                         1.3.0                    pyhd8ed1ab_1                       conda-forge
 msgpack-python                 1.1.0                    py311h2c37856_0                    conda-forge
 munkres                        1.1.4                    pyh9f0ad1d_0                       conda-forge
 mypy                           1.14.1                   py311h917b07b_0                    conda-forge
 mypy_extensions                1.0.0                    pyha770c72_1                       conda-forge
 myst-parser                    4.0.0                    pyhd8ed1ab_1                       conda-forge
 nbclient                       0.10.2                   pyhd8ed1ab_0                       conda-forge
 nbconvert                      6.5.3                    pyhd8ed1ab_0                       conda-forge
 nbconvert-core                 6.5.3                    pyhd8ed1ab_0                       conda-forge
 nbconvert-pandoc               6.5.3                    pyhd8ed1ab_0                       conda-forge
 nbformat                       5.10.4                   pyhd8ed1ab_1                       conda-forge
 nbsphinx                       0.9.6                    pyhd8ed1ab_0                       conda-forge
 nbsphinx-link                  1.3.0                    pyh9f0ad1d_0                       conda-forge
 nbval                          0.11.0                   pyhd8ed1ab_1                       conda-forge
 ncurses                        6.5                      h7bae524_1                         conda-forge
 nest-asyncio                   1.6.0                    pyhd8ed1ab_1                       conda-forge
 netcdf-fortran                 4.6.1                    nompi_hb61fc8b_108                 conda-forge
 networkx                       3.4.2                    pyh267e887_2                       conda-forge
 nglview                        3.1.4                    pyhcc81805_0                       conda-forge
 nomkl                          1.0                      h5ca1d4c_0                         conda-forge
 notebook                       7.3.2                    pyhd8ed1ab_0                       conda-forge
 notebook-shim                  0.2.4                    pyhd8ed1ab_1                       conda-forge
 numexpr                        2.10.2                   py311h7469182_0                    conda-forge
 numpy                          1.26.4                   py311h7125741_0                    conda-forge
 ocl_icd_wrapper_apple          1.0.0                    h27ca646_0                         conda-forge
 opencl-headers                 2024.10.24               h286801f_0                         conda-forge
 openeye-toolkits               2024.2.0                 py311_0                            openeye    
 openff-amber-ff-ports          0.0.4                    pyhca7485f_0                       conda-forge
 openff-forcefields             2024.09.0                pyhff2d567_0                       conda-forge
 openff-interchange-base        0.4.0                    pyhd8ed1ab_0                       conda-forge
 openff-nagl-base               0.5.0                    pyhd8ed1ab_0                       conda-forge
 openff-nagl-models             0.3.0                    pyhd8ed1ab_1                       conda-forge
 openff-qcsubmit                0.54.0.post2+gafbbc66    pypi_0                             pypi       
 openff-toolkit                 0.16.7.post37+ge327e05e  pypi_0                             pypi       
 openff-toolkit-base            0.16.7                   pyhd8ed1ab_0                       conda-forge
 openff-units                   0.2.2                    pyhd8ed1ab_1                       conda-forge
 openff-utilities               0.1.13                   pyhd8ed1ab_0                       conda-forge
 openjpeg                       2.5.3                    h8a3d83b_0                         conda-forge
 openmm                         8.2.0                    py311h63f3cee_0_khronos            conda-forge
 openssl                        3.4.0                    h81ee809_1                         conda-forge
 orderly-set                    5.2.3                    pyh29332c3_1                       conda-forge
 overrides                      7.7.0                    pyhd8ed1ab_1                       conda-forge
 packaging                      24.2                     pyhd8ed1ab_2                       conda-forge
 pandas                         2.2.3                    py311h9cb3ce9_1                    conda-forge
 pandoc                         2.19.2                   hce30654_2                         conda-forge
 pandocfilters                  1.5.0                    pyhd8ed1ab_0                       conda-forge
 parmed                         4.3.0                    py311he826523_0                    conda-forge
 parso                          0.8.4                    pyhd8ed1ab_1                       conda-forge
 pcre2                          10.44                    h297a79d_2                         conda-forge
 periodictable                  2.0.2                    pypi_0                             pypi       
 perl                           5.32.1                   7_h4614cfb_perl5                   conda-forge
 pexpect                        4.9.0                    pyhd8ed1ab_1                       conda-forge
 pickleshare                    0.7.5                    pyhd8ed1ab_1004                    conda-forge
 pillow                         11.1.0                   py311hb9ba9e9_0                    conda-forge
 pint                           0.23                     pyhd8ed1ab_1                       conda-forge
 pip                            24.3.1                   pyh8b19718_2                       conda-forge
 pixman                         0.44.2                   h2f9eb0b_0                         conda-forge
 pkgutil-resolve-name           1.3.10                   pyhd8ed1ab_2                       conda-forge
 platformdirs                   4.3.6                    pyhd8ed1ab_1                       conda-forge
 pluggy                         1.5.0                    pyhd8ed1ab_1                       conda-forge
 pockets                        0.9.1                    pyhd8ed1ab_1                       conda-forge
 prometheus_client              0.21.1                   pyhd8ed1ab_0                       conda-forge
 prompt-toolkit                 3.0.48                   pyha770c72_1                       conda-forge
 prompt_toolkit                 3.0.48                   hd8ed1ab_1                         conda-forge
 psutil                         6.1.1                    py311h917b07b_0                    conda-forge
 pthread-stubs                  0.4                      hd74edd7_1002                      conda-forge
 ptyprocess                     0.7.0                    pyhd8ed1ab_1                       conda-forge
 pure_eval                      0.2.3                    pyhd8ed1ab_1                       conda-forge
 py-cpuinfo                     9.0.0                    pyhd8ed1ab_1                       conda-forge
 pybtex                         0.24.0                   pyhd8ed1ab_3                       conda-forge
 pybtex-docutils                1.0.3                    py311h267d04e_2                    conda-forge
 pycairo                        1.27.0                   py311h84a5a08_0                    conda-forge
 pycalverter                    1.6.1                    pyhd8ed1ab_2                       conda-forge
 pycparser                      2.22                     pyh29332c3_1                       conda-forge
 pydantic                       2.10.4                   pyh3cfb1c2_0                       conda-forge
 pydantic-core                  2.27.2                   py311h3ff9189_0                    conda-forge
 pydantic-settings              2.7.1                    pyh3cfb1c2_0                       conda-forge
 pygments                       2.18.0                   pyhd8ed1ab_1                       conda-forge
 pyjwt                          2.10.1                   pyhd8ed1ab_0                       conda-forge
 pyobjc-core                    10.3.2                   py311hab620ed_0                    conda-forge
 pyobjc-framework-cocoa         10.3.2                   py311hab620ed_0                    conda-forge
 pyparsing                      3.2.1                    pyhd8ed1ab_0                       conda-forge
 pysocks                        1.7.1                    pyha55dd90_7                       conda-forge
 pytables                       3.10.2                   py311hd0690c4_0                    conda-forge
 pytest                         8.3.4                    pyhd8ed1ab_1                       conda-forge
 pytest-cov                     6.0.0                    pyhd8ed1ab_1                       conda-forge
 pytest-rerunfailures           15.0                     pyhd8ed1ab_1                       conda-forge
 pytest-timeout                 2.3.1                    pyhd8ed1ab_2                       conda-forge
 pytest-xdist                   3.6.1                    pyhd8ed1ab_1                       conda-forge
 python                         3.11.11                  hc22306f_1_cpython                 conda-forge
 python-constraint              1.4.0                    pyhff2d567_1                       conda-forge
 python-dateutil                2.9.0.post0              pyhff2d567_1                       conda-forge
 python-dotenv                  1.0.1                    pyhd8ed1ab_1                       conda-forge
 python-fastjsonschema          2.21.1                   pyhd8ed1ab_0                       conda-forge
 python-json-logger             2.0.7                    pyhd8ed1ab_0                       conda-forge
 python-tzdata                  2024.2                   pyhd8ed1ab_1                       conda-forge
 python_abi                     3.11                     5_cp311                            conda-forge
 pytorch                        2.5.1                    cpu_generic_py311_h0ba074a_8       conda-forge
 pytorch-lightning              2.5.0.post0              pyh101cb37_0                       conda-forge
 pytz                           2024.1                   pyhd8ed1ab_0                       conda-forge
 pyyaml                         6.0.2                    py311h460d6c5_1                    conda-forge
 pyzmq                          26.2.0                   py311h730b646_3                    conda-forge
 qcaide                         1.0.0+10.g2054cf4.dirty  pypi_0                             pypi       
 qcelemental                    0.28.0                   pyhd8ed1ab_1                       conda-forge
 qcengine                       0.30.0                   pyhd8ed1ab_0                       conda-forge
 qcportal                       0.57                     pyhd8ed1ab_0                       conda-forge
 qhull                          2020.2                   h420ef59_5                         conda-forge
 rdkit                          2024.03.6                py311h4a48902_0                    conda-forge
 readline                       8.2                      h92ec313_1                         conda-forge
 referencing                    0.35.1                   pyhd8ed1ab_1                       conda-forge
 regex                          2024.11.6                py311h917b07b_0                    conda-forge
 reportlab                      4.2.5                    py311h460d6c5_0                    conda-forge
 requests                       2.32.3                   pyhd8ed1ab_1                       conda-forge
 rfc3339-validator              0.1.4                    pyhd8ed1ab_1                       conda-forge
 rfc3986-validator              0.1.1                    pyh9f0ad1d_0                       conda-forge
 rich                           13.9.4                   pyhd8ed1ab_1                       conda-forge
 rlpycairo                      0.2.0                    pyhd8ed1ab_0                       conda-forge
 rpds-py                        0.22.3                   py311h3ff9189_0                    conda-forge
 scipy                          1.13.1                   py311hceeca8c_0                    conda-forge
 send2trash                     1.8.3                    pyh31c8845_1                       conda-forge
 setuptools                     75.6.0                   pyhff2d567_1                       conda-forge
 six                            1.17.0                   pyhd8ed1ab_0                       conda-forge
 sleef                          3.7                      h8391f65_2                         conda-forge
 smirnoff99frosst               1.1.0                    pyh44b312d_0                       conda-forge
 snappy                         1.2.1                    h98b9ce2_1                         conda-forge
 sniffio                        1.3.1                    pyhd8ed1ab_1                       conda-forge
 snowballstemmer                2.2.0                    pyhd8ed1ab_0                       conda-forge
 soupsieve                      2.5                      pyhd8ed1ab_1                       conda-forge
 sphinx                         8.1.3                    pyhd8ed1ab_1                       conda-forge
 sphinx-argparse                0.5.2                    pyhd8ed1ab_1                       conda-forge
 sphinx-notfound-page           1.0.4                    pyhd8ed1ab_1                       conda-forge
 sphinx_rtd_theme               3.0.1                    pyha770c72_0                       conda-forge
 sphinxcontrib-applehelp        2.0.0                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-bibtex           2.6.3                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-devhelp          2.0.0                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-htmlhelp         2.1.0                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-jquery           4.1                      pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-jsmath           1.0.1                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-napoleon         0.7                      pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-qthelp           2.0.0                    pyhd8ed1ab_1                       conda-forge
 sphinxcontrib-serializinghtml  1.1.10                   pyhd8ed1ab_1                       conda-forge
 sqlalchemy                     2.0.36                   py311hae2e1ce_0                    conda-forge
 sqlite                         3.47.0                   hcd14bea_1                         conda-forge
 stack_data                     0.6.3                    pyhd8ed1ab_1                       conda-forge
 sympy                          1.13.3                   pyh2585a3b_104                     conda-forge
 tabulate                       0.9.0                    pyhd8ed1ab_2                       conda-forge
 terminado                      0.18.1                   pyh31c8845_0                       conda-forge
 tinycss2                       1.4.0                    pyhd8ed1ab_0                       conda-forge
 tk                             8.6.13                   h5083fa2_1                         conda-forge
 toml                           0.10.2                   pyhd8ed1ab_1                       conda-forge
 tomli                          2.2.1                    pyhd8ed1ab_1                       conda-forge
 torchmetrics                   1.6.1                    pyhd8ed1ab_0                       conda-forge
 tornado                        6.4.2                    py311h917b07b_0                    conda-forge
 torsiondrive                   1.1.0                    pyhd8ed1ab_0                       conda-forge
 tqdm                           4.67.1                   pyhd8ed1ab_1                       conda-forge
 traitlets                      5.14.3                   pyhd8ed1ab_1                       conda-forge
 types-python-dateutil          2.9.0.20241206           pyhd8ed1ab_0                       conda-forge
 typing-extensions              4.12.2                   hd8ed1ab_1                         conda-forge
 typing_extensions              4.12.2                   pyha770c72_1                       conda-forge
 typing_utils                   0.1.0                    pyhd8ed1ab_1                       conda-forge
 tzdata                         2024b                    hc8b5060_0                         conda-forge
 unicodedata2                   15.1.0                   py311hae2e1ce_1                    conda-forge
 unidecode                      1.3.8                    pyh29332c3_1                       conda-forge
 uri-template                   1.3.0                    pyhd8ed1ab_1                       conda-forge
 urllib3                        2.3.0                    pyhd8ed1ab_0                       conda-forge
 wcwidth                        0.2.13                   pyhd8ed1ab_1                       conda-forge
 webcolors                      24.11.1                  pyhd8ed1ab_0                       conda-forge
 webencodings                   0.5.1                    pyhd8ed1ab_3                       conda-forge
 websocket-client               1.8.0                    pyhd8ed1ab_1                       conda-forge
 wheel                          0.45.1                   pyhd8ed1ab_1                       conda-forge
 widgetsnbextension             4.0.13                   pyhd8ed1ab_1                       conda-forge
 xmltodict                      0.14.2                   pyhd8ed1ab_1                       conda-forge
 xorg-libice                    1.1.2                    h5505292_0                         conda-forge
 xorg-libsm                     1.2.5                    h5505292_0                         conda-forge
 xorg-libx11                    1.8.10                   h6a5fb8c_1                         conda-forge
 xorg-libxau                    1.0.12                   h5505292_0                         conda-forge
 xorg-libxdmcp                  1.1.5                    hd74edd7_0                         conda-forge
 xorg-libxext                   1.3.6                    hd74edd7_0                         conda-forge
 xorg-libxt                     1.3.1                    h5505292_0                         conda-forge
 yaml                           0.2.5                    h3422bc3_2                         conda-forge
 zeromq                         4.3.5                    hc1bb282_7                         conda-forge
 zipp                           3.21.0                   pyhd8ed1ab_1                       conda-forge
 zlib                           1.3.1                    h8359307_2                         conda-forge
 zlib-ng                        2.2.3                    h13dfb9a_0                         conda-forge
 zstandard                      0.23.0                   py311ha60cc69_1                    conda-forge
 zstd                           1.5.6                    hb46c0d2_0                         conda-forge

Additional context
removing np.array() from the conformers key (so a list of lists) will allow the example to run as expected.

@mattwthompson
Copy link
Member

You probably already figured it out, but the fulcrum of the issue is what types are handled by the little helper deserialize_numpy:

>>> from openff.toolkit.utils.utils import deserialize_numpy
/Users/mattthompson/micromamba/envs/openff-interchange-env/lib/python3.11/site-packages/openff/utilities/provenance.py:23: CondaExecutableNotFoundWarning: No conda/mamba/micromamba executable found. Unable to determine package versions.
  warnings.warn(
>>> import numpy
>>> deserialize_numpy(numpy.eye(3).tolist(), shape=(3, 3))
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> deserialize_numpy(numpy.eye(3), shape=(3, 3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mattthompson/software/openff-toolkit/openff/toolkit/utils/utils.py", line 433, in deserialize_numpy
    np_array = np_array.reshape(shape)
               ^^^^^^^^
UnboundLocalError: cannot access local variable 'np_array' where it is not associated with a value
>>>

Something like this should smooth that over:

  1. Short-circuit the conversion but still reshape the input
  2. Also having an explicit error if that function is passed an unexpected type (UnboundLocalError should never happen internally!)
diff --git a/openff/toolkit/utils/utils.py b/openff/toolkit/utils/utils.py
index db599d0a..1f64e80a 100644
--- a/openff/toolkit/utils/utils.py
+++ b/openff/toolkit/utils/utils.py
@@ -406,7 +406,7 @@ def serialize_numpy(np_array) -> tuple[bytes, tuple[int]]:
 
 
 def deserialize_numpy(
-    serialized_np: Union[bytes, list],
+    serialized_np: Union[NDArray, bytes, list],
     shape: tuple[int, ...],
 ) -> NDArray:
     """
@@ -425,11 +425,19 @@ def deserialize_numpy(
     np_array
         The deserialized numpy array
     """
-    if isinstance(serialized_np, list):
+    if isinstance(serialized_np, np.ndarray):
+        np_array = serialized_np
+    elif isinstance(serialized_np, list):
         np_array = np.array(serialized_np)
-    if isinstance(serialized_np, bytes):
+    elif isinstance(serialized_np, bytes):
         dt = np.dtype("float").newbyteorder(">")
         np_array = np.frombuffer(serialized_np, dtype=dt)
+    else:
+        raise ValueError(
+            f"Unexpected type ({type(serialized_np)}) found when attempting to deserialize from the "
+            "serialized form of a numpy array."
+        )
+
     np_array = np_array.reshape(shape)
     return np_array
 
>>> deserialize_numpy(numpy.eye(3).tolist(), shape=(3, 3))
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> deserialize_numpy(numpy.eye(3), shape=(3, 3))
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>>

Arguably this is unsupported since the dict model of a Molecule is defined only by what's produced by the API itself. I can see why this is surprising behavior, though, and the call ultimately is @j-wags's

@j-wags
Copy link
Member

j-wags commented Jan 23, 2025

Yeah, Matt's right here - This isn't intended to be a supported use case. This might be resolved by better docs (like, "the exact format of the input dict for this method is determined by the output of Molecule.to_dict")

@jaclark5 jaclark5 self-assigned this Jan 28, 2025
@j-wags j-wags changed the title Molecule.from_dict accepts a list of lists but not a numpy array which is the final goal. Document that Molecule.from_dict accepts a list of lists but not a numpy array Jan 29, 2025
@mattwthompson mattwthompson linked a pull request Feb 3, 2025 that will close this issue
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants