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

[WIP] Fix CI by upgrading to new GROMACS #301

Open
wants to merge 42 commits into
base: master
Choose a base branch
from
Open

[WIP] Fix CI by upgrading to new GROMACS #301

wants to merge 42 commits into from

Conversation

j-wags
Copy link
Collaborator

@j-wags j-wags commented Aug 15, 2024

  • Wait for fixes to gmx dump to come out in the GROMACS 2024.3 release
  • Use pseudovacuum because real vacuum (cutoff-scheme group) is no longer available

@j-wags
Copy link
Collaborator Author

j-wags commented Aug 15, 2024

src/tests/test_gmxio.py::TestAbInitio_GMX::test_get_function is failing, seemingly because gromacs changed how the output of gmx dump -sys looks, so now ForceBalance doesn't know which particles are atoms vs. virtual sites. I've opened an issue on the gromacs tracker here: https://gitlab.com/gromacs/gromacs/-/issues/5124

@mattwthompson
Copy link
Contributor

Info: conda builds of the new GROMACS aren't passing yet, and I admit I haven't looked into why just yet

conda-forge/gromacs-feedstock#60

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 9, 2024

(notes to self)

The new GROMACS packages seem to have the tests involving gmxdump happy again. Huzzah.

The psuedovacuum calcs might be happy. I'll need to look closer at these to verify.

Currently the only failing test in CI is TestWaterTutorial::test_water_tutorial. Weirdly, I have an env where this passes locally. Summary of this situation:

I have two gromacs=2024 forcebalance dev conda envs on my computer.

  1. fb-dev is from my earlier work in this PR a few months ago (without tinker and OE)
  2. fb-dev-clean is a clean install I made today, using micromamba (so with osx-arm64 packages) and mirroring the CI build pretty precisely (also without tinker and OE)

I also have two directories:

  1. forcebalance, which I've been using to commit to this PR
  2. forcebalance_clean, which is a clean clone of this branch

When run locally, the water study passes/fails as follows, when run using the env in the column, in the forcebalance directory in the row:

fb-dev fb-clean-dev
forcebalance
forcebalance_clean

I think this means that there's something special that I did in the fb-dev env a few months back that got the test passing, since the test results don't change depending on the folder I run them in.

In recent commits, I've tried to get the env in CI matching the versions of deps in my local fb-dev env, to no avail.

So, there's something causing tests to pass locally but fail in CI. It's not in some local changes to the test files since the fb-dev env passes tests in a clean checkout of this branch. I'm ruling out differences in the conda envs. Remaining possibilities are:

  • micromamba (in CI and my bad fb-clean-dev env) vs. mamba (in my good fb-dev env)
  • some local change in fb-dev that I made several weeks ago and forgot 🤦
  • Maybe I futzed with an unzipped local test file (that wouldn't be caught by the git diff!... but then how is fb-clean-dev FAILING in the forcebalance directory?)

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 17, 2024

(more notes to self)

All tests pass for me locally in the fb-dev env, (except the TINKER ones, I don't have that installed locally)

The single non-passing test (AFAICT) both in GH CI and in my fb-clean-dev conda env is src/tests/test_system.py::TestWaterTutorial::test_water_tutorial. It's failing due to a change in the numerical output:

FAILED src/tests/test_system.py::TestWaterTutorial::test_water_tutorial - AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0.005

Calculation results have changed from previously calculated values.
 If this seems reasonable, update EXPECTED_WATER_RESULTS in test_system.py with these values
Mismatched elements: 1 / 9 (11.1%)
Max absolute difference: 0.006
Max relative difference: 0.1142
 x: array([ 0.04237 ,  0.031217,  0.005692, -0.048114,  0.016735, -0.41722 ,  0.006272,  0.004631,
        0.2596  ])
 y: array([ 0.042536,  0.031029,  0.005694, -0.048178,  0.016767, -0.417264,  0.005953,  0.005228,
        0.253551])

What's confusing is that this DOES pass in my "good" local fb-dev environment.I can't figure out what's different between my local conda envs (fb-dev and fb-clean-dev). In the fb-dev env, the y numbers are:

         y: array([ 0.042407,  0.031134,  0.005692, -0.048177,  0.016751, -0.41727 ,
                0.006098,  0.004958,  0.25635 ])

Even pip-installing the package from the (good) forcebalance directory to my fb-dev-clean conda env fails to get the water tutorial passing in the forcebalance dir.

The fb-dev env had openmm 7.7 for some reason, though updating it to 8 made no difference. This is a little confusing because there's GH CI showed an AMOEBA test failing with the wrong version of openmm (needs a particular method signature that changed in OMM 8), but I think I didn't get this error because the AMOEBA tests don't run for me locally (because I don't have TINKER installed locally).

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 18, 2024

I tried installing some specific versions of deps to fb-clean-dev to get it to match fb-dev better: xmltodict=0.13 toolz=0 pyarrow=16 ndcctools=7.11 libglib=2.80 libcxx=18. This didn't change the erroring water study.

The env diff between fb-dev and fb-clean-dev is here:

Collapsed env diff
(fb-dev) jw@mba$ difft --override="*:yaml" xx_fb_dev xx_fb_dev_clean
xx_fb_dev_clean --- YAML
  1 name: fb-dev                                           1 name: fb-dev-clean
  2 channels:                                              2 channels:
  3   - conda-forge                                        3 - conda-forge
  4 dependencies:                                          4 dependencies:
  5   - ambertools=23.3=py39h3add3c7_6                     5 - ambertools=23.3=py39h436489c_6
  6   - anyio=4.4.0=pyhd8ed1ab_0                           6 - anyio=4.6.0=pyhd8ed1ab_1
  7   - appnope=0.1.4=pyhd8ed1ab_0                         7 - appnope=0.1.4=pyhd8ed1ab_0
  8   - archspec=0.2.3=pyhd8ed1ab_0                        8 - archspec=0.2.3=pyhd8ed1ab_0
  9   - argon2-cffi=23.1.0=pyhd8ed1ab_0                    9 - argon2-cffi=23.1.0=pyhd8ed1ab_0
 10   - argon2-cffi-bindings=21.2.0=py39hdc70f33_4        10 - argon2-cffi-bindings=21.2.0=py39h06df861_5
 11   - arpack=3.8.0=nompi_hb44a6d1_101                   11 - arpack=3.8.0=nompi_ha3438d0_101
 12   - arrow=1.3.0=pyhd8ed1ab_0                          12 - arrow=1.3.0=pyhd8ed1ab_0
 13   - asttokens=2.4.1=pyhd8ed1ab_0                      13 - asttokens=2.4.1=pyhd8ed1ab_0
 14   - astunparse=1.6.3=pyhd8ed1ab_0                     14 - astunparse=1.6.3=pyhd8ed1ab_0
 15   - async-lru=2.0.4=pyhd8ed1ab_0                      15 - async-lru=2.0.4=pyhd8ed1ab_0
 16   - attrs=23.2.0=pyh71513ae_0                         16 - attrs=24.2.0=pyh71513ae_0
 17   - aws-c-auth=0.7.22=hb04b931_10                     17 - aws-c-auth=0.7.31=hc27b277_0
 18   - aws-c-cal=0.7.1=hd73d8db_1                        18 - aws-c-cal=0.7.4=h41dd001_1
 19   - aws-c-common=0.9.23=hfdf4475_0                    19 - aws-c-common=0.9.28=hd74edd7_0
 20   - aws-c-compression=0.2.18=hd73d8db_7               20 - aws-c-compression=0.2.19=h41dd001_1
 21   - aws-c-event-stream=0.4.2=h2713d70_15              21 - aws-c-event-stream=0.4.3=h40a8fc1_2
 22   - aws-c-http=0.8.2=he29c2fd_6                       22 - aws-c-http=0.8.10=hf5a2c8c_0
 23   - aws-c-io=0.14.10=h4406d91_1                       23 - aws-c-io=0.14.18=hc3cb426_11
 24   - aws-c-mqtt=0.10.4=hf6997d9_8                      24 - aws-c-mqtt=0.10.7=h3acc7b9_0
 25   - aws-c-s3=0.6.0=h13137a3_2                         25 - aws-c-s3=0.6.6=hd16c091_0
 26   - aws-c-sdkutils=0.1.16=hd73d8db_3                  26 - aws-c-sdkutils=0.1.19=h41dd001_3
 27   - aws-checksums=0.1.18=hd73d8db_7                   27 - aws-checksums=0.1.20=h41dd001_0
 28   - aws-crt-cpp=0.27.3=h0a15bd7_2                     28 - aws-crt-cpp=0.28.3=h433f80b_6
 29   - aws-sdk-cpp=1.11.329=h554caeb_9                   29 - aws-sdk-cpp=1.11.407=h0455a66_0
 30   - azure-core-cpp=1.12.0=hf8dbe3c_0                  30 - azure-core-cpp=1.13.0=hd01fc5c_0
 31   - azure-identity-cpp=1.8.0=h906f3f0_1               31 - azure-identity-cpp=1.9.0=h13ea094_0
 32   - azure-storage-blobs-cpp=12.11.0=h5f32033_1        32 - azure-storage-blobs-cpp=12.13.0=ha282d6b_0
 33   - azure-storage-common-cpp=12.6.0=h0dc8e96_1        33 - azure-storage-common-cpp=12.8.0=h7677ebe_0
 34   - azure-storage-files-datalake-cpp=12.10.0=hc1cec4  34 - azure-storage-files-datalake-cpp=12.12.0=h3c24752_
 .. e_1                                                   .. 0
 35   - babel=2.14.0=pyhd8ed1ab_0                         35 - babel=2.14.0=pyhd8ed1ab_0
 36   - beautifulsoup4=4.12.3=pyha770c72_0                36 - beautifulsoup4=4.12.3=pyha770c72_0
 37   - biopython=1.84=py39hded5825_0                     .. 
 38   - bleach=6.1.0=pyhd8ed1ab_0                         37 - bleach=6.1.0=pyhd8ed1ab_0
 39   - blosc=1.21.6=h7d75f6d_0                           38 - blosc=1.21.6=h5499902_0
 40   - bokeh=3.4.2=pyhd8ed1ab_0                          39 - bokeh=3.4.2=pyhd8ed1ab_0
 41   - boltons=24.0.0=pyhd8ed1ab_0                       40 - boltons=24.0.0=pyhd8ed1ab_0
 42   - brotli=1.1.0=h0dc2134_1                           41 - brotli=1.1.0=hd74edd7_2
 43   - brotli-bin=1.1.0=h0dc2134_1                       42 - brotli-bin=1.1.0=hd74edd7_2
 44   - brotli-python=1.1.0=py39h840bb9f_1                43 - brotli-python=1.1.0=py39hfa9831e_2
 45   - bson=0.5.9=py_0                                   .. 
 46   - bzip2=1.0.8=hfdf4475_7                            44 - bzip2=1.0.8=h99b78c6_7
 47   - c-ares=1.32.2=h51dda26_0                          45 - c-ares=1.33.1=hd74edd7_0
 48   - c-blosc2=2.15.0=hb9356d3_1                        46 - c-blosc2=2.15.1=h5063078_0
 49   - ca-certificates=2024.8.30=h8857fd0_0              47 - ca-certificates=2024.8.30=hf0a4a13_0
 50   - cached-property=1.5.2=hd8ed1ab_1                  48 - cached-property=1.5.2=hd8ed1ab_1
 51   - cached_property=1.5.2=pyha770c72_1                49 - cached_property=1.5.2=pyha770c72_1
 52   - cachetools=5.4.0=pyhd8ed1ab_0                     50 - cachetools=5.5.0=pyhd8ed1ab_0
 53   - cairo=1.18.0=h9f650ed_2                           51 - cairo=1.18.0=hc6c324b_2
 54   - certifi=2024.8.30=pyhd8ed1ab_0                    52 - certifi=2024.8.30=pyhd8ed1ab_0
 55   - cffi=1.16.0=py39h18ef598_0                        53 - cffi=1.17.1=py39h7f933ea_0
 56   - cftime=1.6.4=py39hb943cd9_0                       54 - cftime=1.6.4=py39h914ef23_1
 57   - chardet=5.2.0=py39h6e9494a_1                      55 - chardet=5.2.0=py39h2804cbe_2
 58   - charset-normalizer=3.3.2=pyhd8ed1ab_0             56 - charset-normalizer=3.3.2=pyhd8ed1ab_0
 59   - click=8.1.7=unix_pyh707e725_0                     57 - click=8.1.7=unix_pyh707e725_0
 60   - cloudpickle=3.0.0=pyhd8ed1ab_0                    58 - cloudpickle=3.0.0=pyhd8ed1ab_0
 61   - codecov=2.1.13=pyhd8ed1ab_0                       59 - codecov=2.1.13=pyhd8ed1ab_0
 62   - colorama=0.4.6=pyhd8ed1ab_0                       60 - colorama=0.4.6=pyhd8ed1ab_0
 63   - comm=0.2.2=pyhd8ed1ab_0                           61 - comm=0.2.2=pyhd8ed1ab_0
 64   - conda=23.11.0=py39h6e9494a_1                      62 - conda=23.11.0=py39h2804cbe_1
 65   - conda-libmamba-solver=24.7.0=pyhd8ed1ab_0         63 - conda-libmamba-solver=24.9.0=pyhd8ed1ab_0
 66   - conda-pack=0.8.0=pyhd8ed1ab_0                     64 - conda-pack=0.8.0=pyhd8ed1ab_0
 67   - conda-package-handling=2.3.0=pyh7900ff3_0         65 - conda-package-handling=2.3.0=pyh7900ff3_0
 68   - conda-package-streaming=0.10.0=pyhd8ed1ab_0       66 - conda-package-streaming=0.10.0=pyhd8ed1ab_0
 69   - contourpy=1.2.1=py39h0ca7971_0                    67 - contourpy=1.3.0=py39h157d57c_2
 70   - coverage=7.6.0=py39hded5825_0                     68 - coverage=7.6.1=py39h06df861_1
 71   - cycler=0.12.1=pyhd8ed1ab_0                        69 - cycler=0.12.1=pyhd8ed1ab_0
 72   - cytoolz=0.12.3=py39ha09f3b3_0                     70 - cytoolz=1.0.0=py39h06df861_1
 73   - dask=2024.2.1=pyhd8ed1ab_0                        71 - dask=2024.2.1=pyhd8ed1ab_0
 74   - dask-core=2024.2.1=pyhd8ed1ab_1                   72 - dask-core=2024.2.1=pyhd8ed1ab_1
 75   - dask-jobqueue=0.8.5=pyhd8ed1ab_0                  73 - dask-jobqueue=0.8.5=pyhd8ed1ab_0
 76   - debugpy=1.8.2=py39h09c4c31_0                      74 - debugpy=1.8.6=py39hfa9831e_0
 77   - decorator=5.1.1=pyhd8ed1ab_0                      75 - decorator=5.1.1=pyhd8ed1ab_0
 78   - defusedxml=0.7.1=pyhd8ed1ab_0                     76 - defusedxml=0.7.1=pyhd8ed1ab_0
 79   - distributed=2024.2.1=pyhd8ed1ab_0                 77 - distributed=2024.2.1=pyhd8ed1ab_0
 80   - distro=1.9.0=pyhd8ed1ab_0                         78 - distro=1.9.0=pyhd8ed1ab_0
 81   - entrypoints=0.4=pyhd8ed1ab_0                      79 - entrypoints=0.4=pyhd8ed1ab_0
 82   - exceptiongroup=1.2.2=pyhd8ed1ab_0                 80 - exceptiongroup=1.2.2=pyhd8ed1ab_0
 83   - executing=2.0.1=pyhd8ed1ab_0                      81 - executing=2.1.0=pyhd8ed1ab_0
 84   - expat=2.6.2=h73e2aa4_0                            82 - expat=2.6.3=hf9b8971_0
 85   - fasteners=0.17.3=pyhd8ed1ab_0                     .. 
 86   - fftw=3.3.10=nompi_h292e606_110                    83 - fftw=3.3.10=nompi_h6637ab6_110
 87   - fmt=10.2.1=h7728843_0                             84 - fmt=11.0.2=h420ef59_0
 88   - font-ttf-dejavu-sans-mono=2.37=hab24e00_0         85 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
 89   - font-ttf-inconsolata=3.000=h77eed37_0             86 - font-ttf-inconsolata=3.000=h77eed37_0
 90   - font-ttf-source-code-pro=2.038=h77eed37_0         87 - font-ttf-source-code-pro=2.038=h77eed37_0
 91   - font-ttf-ubuntu=0.83=h77eed37_2                   88 - font-ttf-ubuntu=0.83=h77eed37_3
 92   - fontconfig=2.14.2=h5bb23bf_0                      89 - fontconfig=2.14.2=h82840c6_0
 93   - fonts-conda-ecosystem=1=0                         90 - fonts-conda-ecosystem=1=0
 94   - fonts-conda-forge=1=0                             91 - fonts-conda-forge=1=0
 95   - fonttools=4.53.1=py39hded5825_0                   92 - fonttools=4.54.1=py39h06df861_0
 96   - fqdn=1.5.1=pyhd8ed1ab_0                           93 - fqdn=1.5.1=pyhd8ed1ab_0
 97   - freetype=2.12.1=h60636b9_2                        94 - freetype=2.12.1=hadb7bae_2
 98   - freetype-py=2.3.0=pyhd8ed1ab_0                    95 - freetype-py=2.3.0=pyhd8ed1ab_0
 99   - fsspec=2024.6.1=pyhff2d567_0                      96 - fsspec=2024.9.0=pyhff2d567_0
100   - future=1.0.0=pyhd8ed1ab_0                         97 - future=1.0.0=pyhd8ed1ab_0
101   - geometric=1.0=pyhd8ed1ab_1                        98 - geometric=1.0=pyhd8ed1ab_1
102   - gflags=2.2.2=hb1e8313_1004                        99 - gflags=2.2.2=hf9b8971_1005
103   - glog=0.7.1=h2790a97_0                            100 - glog=0.7.1=heb240a5_0
104   - greenlet=3.0.3=py39hd253f6c_0                    101 - greenlet=3.1.1=py39hfa9831e_0
105   - griddataformats=1.0.2=pyhd8ed1ab_0               ... 
106   - gromacs=2024.3=nompi_hd5818fb_101                102 - gromacs=2024.3=nompi_h24a893c_101
107   - gsd=3.3.1=py39hb943cd9_0                         ... 
108   - h11=0.14.0=pyhd8ed1ab_0                          103 - h11=0.14.0=pyhd8ed1ab_0
109   - h2=4.1.0=pyhd8ed1ab_0                            104 - h2=4.1.0=pyhd8ed1ab_0
110   - h5py=3.11.0=nompi_py39hac72f59_102               ... 
111   - hdf4=4.2.15=h8138101_7                           105 - hdf4=4.2.15=h2ee6834_7
112   - hdf5=1.14.3=nompi_h687a608_105                   106 - hdf5=1.14.3=nompi_hec07895_105
113   - hpack=4.0.0=pyh9f0ad1d_0                         107 - hpack=4.0.0=pyh9f0ad1d_0
114   - httpcore=1.0.5=pyhd8ed1ab_0                      108 - httpcore=1.0.6=pyhd8ed1ab_0
115   - httpx=0.27.0=pyhd8ed1ab_0                        109 - httpx=0.27.2=pyhd8ed1ab_0
116   - hyperframe=6.0.1=pyhd8ed1ab_0                    110 - hyperframe=6.0.1=pyhd8ed1ab_0
117   - icu=73.2=hf5e326d_0                              111 - icu=73.2=hc8870d7_0
118   - idna=3.7=pyhd8ed1ab_0                            112 - idna=3.10=pyhd8ed1ab_0
119   - importlib-metadata=8.0.0=pyha770c72_0            113 - importlib-metadata=8.5.0=pyha770c72_0
120   - importlib-resources=6.4.0=pyhd8ed1ab_0           114 - importlib-resources=6.4.5=pyhd8ed1ab_0
121   - importlib_metadata=8.0.0=hd8ed1ab_0              115 - importlib_metadata=8.5.0=hd8ed1ab_0
122   - importlib_resources=6.4.0=pyhd8ed1ab_0           116 - importlib_resources=6.4.5=pyhd8ed1ab_0
123   - iniconfig=2.0.0=pyhd8ed1ab_0                     117 - iniconfig=2.0.0=pyhd8ed1ab_0
124   - ipykernel=6.29.5=pyh57ce528_0                    118 - ipykernel=6.29.5=pyh57ce528_0
125   - ipython=8.18.1=pyh707e725_3                      119 - ipython=8.18.1=pyh707e725_3
126   - ipython_genutils=0.2.0=pyhd8ed1ab_1              120 - ipython_genutils=0.2.0=pyhd8ed1ab_1
127   - ipywidgets=7.8.2=pyhd8ed1ab_0                    121 - ipywidgets=7.8.4=pyhd8ed1ab_0
128   - isoduration=20.11.0=pyhd8ed1ab_0                 122 - isoduration=20.11.0=pyhd8ed1ab_0
129   - jedi=0.19.1=pyhd8ed1ab_0                         123 - jedi=0.19.1=pyhd8ed1ab_0
130   - jinja2=3.1.4=pyhd8ed1ab_0                        124 - jinja2=3.1.4=pyhd8ed1ab_0
131   - joblib=1.4.2=pyhd8ed1ab_0                        125 - joblib=1.4.2=pyhd8ed1ab_0
132   - json5=0.9.25=pyhd8ed1ab_0                        126 - json5=0.9.25=pyhd8ed1ab_0
133   - jsonpatch=1.33=pyhd8ed1ab_0                      127 - jsonpatch=1.33=pyhd8ed1ab_0
134   - jsonpointer=3.0.0=py39h6e9494a_0                 128 - jsonpointer=3.0.0=py39h2804cbe_1
135   - jsonschema=4.23.0=pyhd8ed1ab_0                   129 - jsonschema=4.23.0=pyhd8ed1ab_0
136   - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 130 - jsonschema-specifications=2024.10.1=pyhd8ed1ab_0
137   - jsonschema-with-format-nongpl=4.23.0=hd8ed1ab_0  131 - jsonschema-with-format-nongpl=4.23.0=hd8ed1ab_0
138   - jupyter-lsp=2.2.5=pyhd8ed1ab_0                   132 - jupyter-lsp=2.2.5=pyhd8ed1ab_0
139   - jupyter_client=8.6.2=pyhd8ed1ab_0                133 - jupyter_client=8.6.3=pyhd8ed1ab_0
140   - jupyter_core=5.7.1=py39h6e9494a_0                134 - jupyter_core=5.7.2=pyh31011fe_1
141   - jupyter_events=0.10.0=pyhd8ed1ab_0               135 - jupyter_events=0.10.0=pyhd8ed1ab_0
142   - jupyter_server=2.14.2=pyhd8ed1ab_0               136 - jupyter_server=2.14.2=pyhd8ed1ab_0
143   - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0      137 - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0
144   - jupyterlab=4.2.4=pyhd8ed1ab_0                    138 - jupyterlab=4.2.5=pyhd8ed1ab_0
145   - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1           139 - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1
146   - jupyterlab_server=2.27.3=pyhd8ed1ab_0            140 - jupyterlab_server=2.27.3=pyhd8ed1ab_0
147   - jupyterlab_widgets=1.1.8=pyhd8ed1ab_0            141 - jupyterlab_widgets=1.1.10=pyhd8ed1ab_0
148   - khronos-opencl-icd-loader=2023.04.17=h37ebe6b_1  142 - khronos-opencl-icd-loader=2024.05.08=hd74edd7_0
149   - kiwisolver=1.4.5=py39h8ee36c8_1                  143 - kiwisolver=1.4.7=py39h157d57c_0
150   - krb5=1.21.3=h37d8d59_0                           144 - krb5=1.21.3=h237132a_0
151   - lcms2=2.16=ha2f27b4_0                            145 - lcms2=2.16=ha0e7c42_0
152   - lerc=4.0.0=hb486fe8_0                            146 - lerc=4.0.0=h9a09cb3_0
153   - libabseil=20240116.2=cxx17_hf036a51_1            147 - libabseil=20240722.0=cxx17_hf9b8971_1
154   - libaec=1.1.3=h73e2aa4_0                          148 - libaec=1.1.3=hebf3989_0
155   - libarchive=3.7.4=h20e244c_0                      149 - libarchive=3.7.4=h83d404f_0
156   - libarrow=16.1.0=had6961a_14_cpu                  150 - libarrow=17.0.0=h73906d8_19_cpu
157   - libarrow-acero=16.1.0=hf036a51_14_cpu            151 - libarrow-acero=17.0.0=hd1b2877_19_cpu
158   - libarrow-dataset=16.1.0=hf036a51_14_cpu          152 - libarrow-dataset=17.0.0=hd1b2877_19_cpu
159   - libarrow-substrait=16.1.0=h85bc590_14_cpu        153 - libarrow-substrait=17.0.0=h6479abe_19_cpu
160   - libblas=3.9.0=22_osx64_openblas                  154 - libblas=3.9.0=24_osxarm64_openblas
161   - libboost=1.82.0=h99d8d82_6                       155 - libboost=1.82.0=h489e689_6
162   - libboost-python=1.82.0=py39h50e3203_6            156 - libboost-python=1.82.0=py39h819cc4c_6
163   - libbrotlicommon=1.1.0=h0dc2134_1                 157 - libbrotlicommon=1.1.0=hd74edd7_2
164   - libbrotlidec=1.1.0=h0dc2134_1                    158 - libbrotlidec=1.1.0=hd74edd7_2
165   - libbrotlienc=1.1.0=h0dc2134_1                    159 - libbrotlienc=1.1.0=hd74edd7_2
166   - libcblas=3.9.0=22_osx64_openblas                 160 - libcblas=3.9.0=24_osxarm64_openblas
167   - libcrc32c=1.1.2=he49afe7_0                       161 - libcrc32c=1.1.2=hbdafb3b_0
168   - libcurl=8.8.0=hf9fcc65_1                         162 - libcurl=8.10.1=h13a7ad3_0
169   - libcxx=18.1.8=hef8daea_0                         163 - libcxx=19.1.1=ha82da77_0
170   - libdeflate=1.20=h49d49c5_0                       164 - libdeflate=1.22=hd74edd7_0
171   - libedit=3.1.20191231=h0678c8f_2                  165 - libedit=3.1.20191231=hc8eb9b7_2
172   - libev=4.33=h10d778d_2                            166 - libev=4.33=h93a5062_2
173   - libevent=2.1.12=ha90c15b_1                       167 - libevent=2.1.12=h2757513_1
174   - libexpat=2.6.2=h73e2aa4_0                        168 - libexpat=2.6.3=hf9b8971_0
175   - libffi=3.4.2=h0d85af4_5                          169 - libffi=3.4.2=h3422bc3_5
176   - libgfortran=5.0.0=13_2_0_h97931a8_3              170 - libgfortran=5.0.0=13_2_0_hd922786_3
177   - libgfortran5=13.2.0=h2873a65_3                   171 - libgfortran5=13.2.0=hf226fd6_3
178   - libglib=2.80.3=h736d271_1                        172 - libglib=2.82.1=h4821c08_0
179   - libgoogle-cloud=2.26.0=h721cda5_0                173 - libgoogle-cloud=2.29.0=h2e6cea1_1
180   - libgoogle-cloud-storage=2.26.0=h9e84e37_0        174 - libgoogle-cloud-storage=2.29.0=h90fd6fa_1
181   - libgrpc=1.62.2=h384b2fc_0                        175 - libgrpc=1.65.5=h3d9cf25_0
182   - libhwloc=2.11.2=default_hb6fbd3b_1000            176 - libhwloc=2.11.2=default_h3f80f97_1000
183   - libiconv=1.17=hd75f5a5_2                         177 - libiconv=1.17=h0d3ecfb_2
184   - libintl=0.22.5=h5ff76d1_2                        178 - libintl=0.22.5=h8414b35_3
185   - libjpeg-turbo=3.0.0=h0dc2134_1                   179 - libjpeg-turbo=3.0.0=hb547adb_1
186   - liblapack=3.9.0=22_osx64_openblas                180 - liblapack=3.9.0=24_osxarm64_openblas
187   - libllvm14=14.0.6=hc8e404f_4                      181 - libllvm14=14.0.6=hd1a9a77_4
188   - libmamba=1.5.8=ha449628_0                        182 - libmamba=1.5.10=h66a2e1b_1
189   - libmambapy=1.5.8=py39hb0188b1_0                  183 - libmambapy=1.5.10=py39ha041727_1
190   - libnetcdf=4.9.2=nompi_h7334405_114               184 - libnetcdf=4.9.2=nompi_he469be0_114
191   - libnghttp2=1.58.0=h64cf6d3_1                     185 - libnghttp2=1.58.0=ha4dd798_1
192   - libopenblas=0.3.27=openmp_h8869122_1             186 - libopenblas=0.3.27=openmp_h517c56d_1
193   - libparquet=16.1.0=h904a336_14_cpu                187 - libparquet=17.0.0=hff2b6b3_19_cpu
194   - libpng=1.6.43=h92b6c6a_0                         188 - libpng=1.6.44=hc14010f_0
195   - libprotobuf=4.25.3=h4e4d658_0                    189 - libprotobuf=5.27.5=h53f8970_2
196   - libre2-11=2023.09.01=h81f5012_2                  190 - libre2-11=2023.09.01=h2348fd5_3
197   - libsodium=1.0.18=hbcb3906_1                      191 - libsodium=1.0.20=h99b78c6_0
198   - libsolv=0.7.30=h69d5d9b_0                        192 - libsolv=0.7.30=h6c9b7f8_0
199   - libsqlite=3.46.0=h1b8f9f3_0                      193 - libsqlite=3.46.1=hc14010f_0
200   - libssh2=1.11.0=hd019ec5_0                        194 - libssh2=1.11.0=h7a5bd25_0
201   - libthrift=0.19.0=h064b379_1                      195 - libthrift=0.21.0=h64651cc_0
202   - libtiff=4.6.0=h129831d_3                         196 - libtiff=4.7.0=hfce79cd_1
203   - libutf8proc=2.8.0=hb7f2c08_0                     197 - libutf8proc=2.8.0=h1a8c8d9_0
204   - libwebp-base=1.4.0=h10d778d_0                    198 - libwebp-base=1.4.0=h93a5062_0
205   - libxcb=1.16=h0dc2134_0                           199 - libxcb=1.17.0=hdb1d25a_0
206   - libxml2=2.12.7=hc603aa4_3                        200 - libxml2=2.12.7=h9a80f22_3
207   - libxslt=1.1.39=h03b04e6_0                        201 - libxslt=1.1.39=h223e5b9_0
208   - libzip=1.10.1=hc158999_3                         202 - libzip=1.11.1=hfc4440f_0
209   - libzlib=1.3.1=h87427d6_1                         203 - libzlib=1.3.1=h8359307_2
210   - llvm-openmp=18.1.8=h15ab845_0                    204 - llvm-openmp=19.1.0=h6cdba0f_1
211   - llvmlite=0.43.0=py39hcb5866c_0                   205 - llvmlite=0.43.0=py39h05480be_1
212   - locket=1.0.0=pyhd8ed1ab_0                        206 - locket=1.0.0=pyhd8ed1ab_0
213   - lxml=5.2.2=py39h96e9569_0                        207 - lxml=5.3.0=py39h2518886_1
214   - lz4=4.3.3=py39h91cfb08_0                         208 - lz4=4.3.3=py39h32162fe_1
215   - lz4-c=1.9.4=hf0c8a7f_0                           209 - lz4-c=1.9.4=hb7217d7_0
216   - lzo=2.10=h10d778d_1001                           210 - lzo=2.10=h93a5062_1001
217   - markdown-it-py=3.0.0=pyhd8ed1ab_0                211 - markdown-it-py=3.0.0=pyhd8ed1ab_0
218   - markupsafe=2.1.5=py39ha09f3b3_0                  212 - markupsafe=3.0.1=py39h06df861_0
219   - matplotlib-base=3.9.1=py39hb2d44f9_0             213 - matplotlib-base=3.9.2=py39hc57f556_1
220   - matplotlib-inline=0.1.7=pyhd8ed1ab_0             214 - matplotlib-inline=0.1.7=pyhd8ed1ab_0
221   - mda-xdrlib=0.2.0=pyhd8ed1ab_0                    215 - mda-xdrlib=0.2.0=pyhd8ed1ab_0
222   - mdanalysis=2.7.0=py39hcc9a0c8_1                  ... 
223   - mdtraj=1.10.0=py39h9872ee1_0                     216 - mdtraj=1.10.0=py39h14bebe9_0
224   - mdurl=0.1.2=pyhd8ed1ab_0                         217 - mdurl=0.1.2=pyhd8ed1ab_0
225   - menuinst=2.1.1=py39h6e9494a_0                    218 - menuinst=2.1.2=py39h2804cbe_1
226   - mistune=3.0.2=pyhd8ed1ab_0                       219 - mistune=3.0.2=pyhd8ed1ab_0
227   - mmtf-python=1.1.3=pyhd8ed1ab_0                   ... 
228   - mpiplus=v0.0.2=pyhd8ed1ab_0                      220 - mpiplus=v0.0.2=pyhd8ed1ab_0
229   - mrcfile=1.5.3=pyhd8ed1ab_0                       ... 
230   - msgpack-python=1.0.8=py39hdf1af86_0              221 - msgpack-python=1.1.0=py39h157d57c_0
231   - munkres=1.1.4=pyh9f0ad1d_0                       222 - munkres=1.1.4=pyh9f0ad1d_0
232   - nbclient=0.10.0=pyhd8ed1ab_0                     223 - nbclient=0.10.0=pyhd8ed1ab_0
233   - nbconvert-core=7.16.4=pyhd8ed1ab_1               224 - nbconvert-core=7.16.4=pyhd8ed1ab_1
234   - nbformat=5.10.4=pyhd8ed1ab_0                     225 - nbformat=5.10.4=pyhd8ed1ab_0
235   - ncurses=6.5=h5846eda_0                           226 - ncurses=6.5=h7bae524_1
236   - ndcctools=7.11.1=py39hb04c0e1_0                  227 - ndcctools=7.13.1=py39hd968b93_0
237   - nest-asyncio=1.6.0=pyhd8ed1ab_0                  228 - nest-asyncio=1.6.0=pyhd8ed1ab_0
238   - netcdf-fortran=4.6.1=nompi_h3a6982b_104          229 - netcdf-fortran=4.6.1=nompi_hb210b0d_106
239   - netcdf4=1.7.1=nompi_py39h874e418_101             230 - netcdf4=1.7.1=nompi_py39hc9bf5a8_102
240   - networkx=3.2.1=pyhd8ed1ab_0                      231 - networkx=3.2.1=pyhd8ed1ab_0
241   - nose=1.3.7=py_1006                               232 - nose=1.3.7=py_1006
242   - notebook=7.2.1=pyhd8ed1ab_0                      233 - notebook=7.2.2=pyhd8ed1ab_0
243   - notebook-shim=0.2.4=pyhd8ed1ab_0                 234 - notebook-shim=0.2.4=pyhd8ed1ab_0
244   - numba=0.60.0=py39h90d9702_0                      235 - numba=0.60.0=py39h2d4ef1e_0
245   - numexpr=2.10.0=py39hbb604f3_0                    236 - numexpr=2.10.0=py39h998126f_0
246   - numpy=1.26.4=py39h28c39a1_0                      237 - numpy=1.26.4=py39h7aa2656_0
247   - ocl_icd_wrapper_apple=1.0.0=hbcb3906_0           238 - ocl_icd_wrapper_apple=1.0.0=h27ca646_0
248   - openff-amber-ff-ports=0.0.4=pyhca7485f_0         239 - openff-amber-ff-ports=0.0.4=pyhca7485f_0
249   - openff-evaluator-base=0.4.3=pyhd8ed1ab_2         240 - openff-evaluator-base=0.4.3=pyhd8ed1ab_2
250   - openff-forcefields=2024.04.0=pyhca7485f_0        241 - openff-forcefields=2024.09.0=pyhff2d567_0
251   - openff-interchange=0.2.3=pyhd8ed1ab_1            242 - openff-interchange=0.2.3=pyhd8ed1ab_1
252   - openff-interchange-base=0.2.3=pyhd8ed1ab_1       243 - openff-interchange-base=0.2.3=pyhd8ed1ab_1
253   - openff-models=0.1.2=pyhca7485f_0                 ... 
254   - openff-toolkit=0.12.1=pyhd8ed1ab_2               244 - openff-toolkit=0.12.1=pyhd8ed1ab_2
255   - openff-toolkit-base=0.12.1=pyhd8ed1ab_2          245 - openff-toolkit-base=0.12.1=pyhd8ed1ab_2
256   - openff-units=0.2.0=pyh1a96a4e_0                  246 - openff-units=0.2.0=pyh1a96a4e_0
257   - openff-utilities=0.1.12=pyhd8ed1ab_0             247 - openff-utilities=0.1.12=pyhd8ed1ab_0
258   - openjpeg=2.5.2=h7310d3a_0                        248 - openjpeg=2.5.2=h9f1df11_0
259   - openmm=7.7.0=py39h8d72adf_0_khronos              249 - openmm=8.1.2=py39h4b76ec7_3_khronos
260   - openmmtools=0.23.1=pyhd8ed1ab_0                  250 - openmmtools=0.23.1=pyhd8ed1ab_0
261   - openssl=3.3.2=hd23fc13_0                         251 - openssl=3.3.2=h8359307_0
262   - orc=2.0.1=hf43e91b_1                             252 - orc=2.0.2=h4a9587e_1
263   - overrides=7.7.0=pyhd8ed1ab_0                     253 - overrides=7.7.0=pyhd8ed1ab_0
264   - packaging=24.1=pyhd8ed1ab_0                      254 - packaging=24.1=pyhd8ed1ab_0
265   - packmol=20.15.0=ha55dbfc_0                       255 - packmol=20.15.1=h4c1867c_1
266   - pandas=1.5.3=py39hecff1ad_1                      256 - pandas=1.5.3=py39hde7b980_1
267   - pandocfilters=1.5.0=pyhd8ed1ab_0                 257 - pandocfilters=1.5.0=pyhd8ed1ab_0
268   - panedr=0.8.0=pyhd8ed1ab_0                        258 - panedr=0.8.0=pyhd8ed1ab_0
269   - parmed=4.2.2=py39h110ca85_1                      259 - parmed=4.2.2=py39hf3050f2_1
270   - parso=0.8.4=pyhd8ed1ab_0                         260 - parso=0.8.4=pyhd8ed1ab_0
271   - partd=1.4.2=pyhd8ed1ab_0                         261 - partd=1.4.2=pyhd8ed1ab_0
272   - patsy=0.5.6=pyhd8ed1ab_0                         ... 
273   - pcre2=10.44=h7634a1b_0                           262 - pcre2=10.44=h297a79d_2
274   - pdbfixer=1.8.1=pyh6c4a22f_0                      263 - pdbfixer=1.9=pyh1a96a4e_0
275   - perl=5.32.1=7_h10d778d_perl5                     264 - perl=5.32.1=7_h4614cfb_perl5
276   - pexpect=4.9.0=pyhd8ed1ab_0                       265 - pexpect=4.9.0=pyhd8ed1ab_0
277   - pickleshare=0.7.5=py_1003                        266 - pickleshare=0.7.5=py_1003
278   - pillow=10.4.0=py39hc3a33ae_0                     267 - pillow=10.4.0=py39hab9ce06_1
279   - pint=0.20.1=pyhd8ed1ab_0                         268 - pint=0.20.1=pyhd8ed1ab_0
280   - pip=24.0=pyhd8ed1ab_0                            269 - pip=24.2=pyh8b19718_1
281   - pixman=0.43.4=h73e2aa4_0                         270 - pixman=0.43.4=hebf3989_0
282   - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1         271 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1
283   - platformdirs=4.2.2=pyhd8ed1ab_0                  272 - platformdirs=4.3.6=pyhd8ed1ab_0
284   - pluggy=1.5.0=pyhd8ed1ab_0                        273 - pluggy=1.5.0=pyhd8ed1ab_0
285   - prometheus_client=0.20.0=pyhd8ed1ab_0            274 - prometheus_client=0.21.0=pyhd8ed1ab_0
286   - prompt-toolkit=3.0.47=pyha770c72_0               275 - prompt-toolkit=3.0.48=pyha770c72_0
287   - psutil=6.0.0=py39hded5825_0                      276 - psutil=6.0.0=py39h06df861_1
288   - pthread-stubs=0.4=hc929b4f_1001                  277 - pthread-stubs=0.4=hd74edd7_1002
289   - ptyprocess=0.7.0=pyhd3deb0d_0                    278 - ptyprocess=0.7.0=pyhd3deb0d_0
290   - pure_eval=0.2.2=pyhd8ed1ab_0                     279 - pure_eval=0.2.3=pyhd8ed1ab_0
291   - py-cpuinfo=9.0.0=pyhd8ed1ab_0                    280 - py-cpuinfo=9.0.0=pyhd8ed1ab_0
292   - pyarrow=16.1.0=py39h810aed5_4                    281 - pyarrow=17.0.0=py39h2beb185_1
293   - pyarrow-core=16.1.0=py39hb064662_4_cpu           282 - pyarrow-core=17.0.0=py39ha397a34_1_cpu
294   - pyarrow-hotfix=0.6=pyhd8ed1ab_0                  283 - pyarrow-hotfix=0.6=pyhd8ed1ab_0
295   - pybind11-abi=4=hd8ed1ab_3                        284 - pybind11-abi=4=hd8ed1ab_3
296   - pycairo=1.26.1=py39h01f7e57_0                    285 - pycairo=1.27.0=py39hf081598_0
297   - pycosat=0.6.6=py39hdc70f33_0                     286 - pycosat=0.6.6=py39h0f82c59_0
298   - pycparser=2.22=pyhd8ed1ab_0                      287 - pycparser=2.22=pyhd8ed1ab_0
299   - pydantic=1.10.16=py39hded5825_0                  288 - pydantic=1.10.17=py39hfea33bf_0
300   - pyedr=0.8.0=pyhd8ed1ab_0                         289 - pyedr=0.8.0=pyhd8ed1ab_0
301   - pygments=2.18.0=pyhd8ed1ab_0                     290 - pygments=2.18.0=pyhd8ed1ab_0
302   - pymbar=3.1.1=py39h1e1c333_3                      291 - pymbar=3.1.1=py39h37867e2_3
303   - pyobjc-core=10.3.1=py39hf8f43b1_0                292 - pyobjc-core=10.3.1=py39hdc109a9_1
304   - pyobjc-framework-cocoa=10.3.1=py39hf8f43b1_0     293 - pyobjc-framework-cocoa=10.3.1=py39hdc109a9_1
305   - pyparsing=3.1.2=pyhd8ed1ab_0                     294 - pyparsing=3.1.4=pyhd8ed1ab_0
306   - pysocks=1.7.1=pyha2e5f31_6                       295 - pysocks=1.7.1=pyha2e5f31_6
307   - pytables=3.9.2=py39hc01bc6a_3                    296 - pytables=3.9.2=py39h08360a6_3
308   - pytest=8.2.2=pyhd8ed1ab_0                        297 - pytest=8.3.3=pyhd8ed1ab_0
309   - pytest-cov=5.0.0=pyhd8ed1ab_0                    298 - pytest-cov=5.0.0=pyhd8ed1ab_0
310   - python=3.9.19=h7a9c478_0_cpython                 299 - python=3.9.20=h9e33284_1_cpython
311   - python-constraint=1.4.0=py_0                     300 - python-constraint=1.4.0=py_0
312   - python-dateutil=2.9.0=pyhd8ed1ab_0               301 - python-dateutil=2.9.0=pyhd8ed1ab_0
313   - python-fastjsonschema=2.20.0=pyhd8ed1ab_0        302 - python-fastjsonschema=2.20.0=pyhd8ed1ab_0
314   - python-json-logger=2.0.7=pyhd8ed1ab_0            303 - python-json-logger=2.0.7=pyhd8ed1ab_0
315   - python_abi=3.9=4_cp39                            304 - python_abi=3.9=5_cp39
316   - pytng=0.3.3=py39hef4fc2d_0                       ... 
317   - pytz=2024.1=pyhd8ed1ab_0                         305 - pytz=2024.2=pyhd8ed1ab_0
318   - pyyaml=6.0.1=py39hdc70f33_1                      306 - pyyaml=6.0.2=py39h06df861_1
319   - pyzmq=26.0.3=py39h304b177_0                      307 - pyzmq=26.2.0=py39h6f9cb01_2
320   - qhull=2020.2=h3c5361c_5                          308 - qhull=2020.2=h420ef59_5
321   - rdkit=2023.09.6=py39h9678a92_1                   309 - rdkit=2023.09.6=py39hed78e32_1
322   - re2=2023.09.01=hb168e87_2                        310 - re2=2023.09.01=hcd0e937_3
323   - readline=8.2=h9e318b2_1                          311 - readline=8.2=h92ec313_1
324   - referencing=0.35.1=pyhd8ed1ab_0                  312 - referencing=0.35.1=pyhd8ed1ab_0
325   - reportlab=4.2.2=py39hded5825_0                   313 - reportlab=4.2.5=py39h06df861_0
326   - reproc=14.2.4.post0=h10d778d_1                   314 - reproc=14.2.4.post0=h93a5062_1
327   - reproc-cpp=14.2.4.post0=h93d8f39_1               315 - reproc-cpp=14.2.4.post0=h965bd2d_1
328   - requests=2.32.3=pyhd8ed1ab_0                     316 - requests=2.32.3=pyhd8ed1ab_0
329   - rfc3339-validator=0.1.4=pyhd8ed1ab_0             317 - rfc3339-validator=0.1.4=pyhd8ed1ab_0
330   - rfc3986-validator=0.1.1=pyh9f0ad1d_0             318 - rfc3986-validator=0.1.1=pyh9f0ad1d_0
331   - rich=13.7.1=pyhd8ed1ab_0                         319 - rich=13.9.2=pyhd8ed1ab_0
332   - rlpycairo=0.2.0=pyhd8ed1ab_0                     320 - rlpycairo=0.2.0=pyhd8ed1ab_0
333   - rpds-py=0.19.0=py39hf59063a_0                    321 - rpds-py=0.20.0=py39h9c3e640_1
334   - ruamel.yaml=0.18.6=py39ha09f3b3_0                322 - ruamel.yaml=0.18.6=py39h17cfd9d_0
335   - ruamel.yaml.clib=0.2.8=py39ha09f3b3_0            323 - ruamel.yaml.clib=0.2.8=py39h17cfd9d_0
336   - scikit-learn=1.5.1=py39hf6a2366_0                ... 
337   - scipy=1.13.1=py39h038d4f4_0                      324 - scipy=1.13.1=py39h3d5391c_0
338   - seaborn=0.13.2=hd8ed1ab_2                        ... 
339   - seaborn-base=0.13.2=pyhd8ed1ab_2                 ... 
340   - send2trash=1.8.3=pyh31c8845_0                    325 - send2trash=1.8.3=pyh31c8845_0
341   - setuptools=71.0.3=pyhd8ed1ab_0                   326 - setuptools=75.1.0=pyhd8ed1ab_0
342   - six=1.16.0=pyh6c4a22f_0                          327 - six=1.16.0=pyh6c4a22f_0
343   - smirnoff99frosst=1.1.0=pyh44b312d_0              328 - smirnoff99frosst=1.1.0=pyh44b312d_0
344   - snappy=1.2.1=he1e6707_0                          329 - snappy=1.2.1=hd02b534_0
345   - sniffio=1.3.1=pyhd8ed1ab_0                       330 - sniffio=1.3.1=pyhd8ed1ab_0
346   - sortedcontainers=2.4.0=pyhd8ed1ab_0              331 - sortedcontainers=2.4.0=pyhd8ed1ab_0
347   - soupsieve=2.5=pyhd8ed1ab_1                       332 - soupsieve=2.5=pyhd8ed1ab_1
348   - sqlalchemy=2.0.31=py39hded5825_0                 333 - sqlalchemy=2.0.35=py39h06df861_0
349   - stack_data=0.6.2=pyhd8ed1ab_0                    334 - stack_data=0.6.2=pyhd8ed1ab_0
350   - statsmodels=0.14.2=py39hb943cd9_0                ... 
351   - swig=4.2.1=h5c5c8f3_1                            335 - swig=4.2.1=hd6c3d49_1
352   - tblib=3.0.0=pyhd8ed1ab_0                         336 - tblib=3.0.0=pyhd8ed1ab_0
353   - terminado=0.18.1=pyh31c8845_0                    337 - terminado=0.18.1=pyh31c8845_0
354   - threadpoolctl=3.5.0=pyhc1e730c_0                 338 - threadpoolctl=3.5.0=pyhc1e730c_0
355   - tidynamics=1.1.2=pyhd8ed1ab_0                    ... 
356   - tinycss2=1.3.0=pyhd8ed1ab_0                      339 - tinycss2=1.3.0=pyhd8ed1ab_0
357   - tk=8.6.13=h1abcd95_1                             340 - tk=8.6.13=h5083fa2_1
358   - toml=0.10.2=pyhd8ed1ab_0                         341 - toml=0.10.2=pyhd8ed1ab_0
359   - tomli=2.0.1=pyhd8ed1ab_0                         342 - tomli=2.0.2=pyhd8ed1ab_0
360   - toolz=0.12.1=pyhd8ed1ab_0                        343 - toolz=1.0.0=pyhd8ed1ab_0
361   - tornado=6.4.1=py39hded5825_0                     344 - tornado=6.4.1=py39h06df861_1
362   - tqdm=4.66.4=pyhd8ed1ab_0                         345 - tqdm=4.66.5=pyhd8ed1ab_0
363   - traitlets=5.14.3=pyhd8ed1ab_0                    346 - traitlets=5.14.3=pyhd8ed1ab_0
364   - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_ 347 - types-python-dateutil=2.9.0.20241003=pyhff2d567_0
... 0                                                    ... 
365   - typing-extensions=4.12.2=hd8ed1ab_0              348 - typing-extensions=4.12.2=hd8ed1ab_0
366   - typing_extensions=4.12.2=pyha770c72_0            349 - typing_extensions=4.12.2=pyha770c72_0
367   - typing_utils=0.1.0=pyhd8ed1ab_0                  350 - typing_utils=0.1.0=pyhd8ed1ab_0
368   - tzdata=2024a=h0c530f3_0                          351 - tzdata=2024b=hc8b5060_0
369   - uncertainties=3.2.2=pyhd8ed1ab_1                 352 - uncertainties=3.2.2=pyhd8ed1ab_1
370   - unicodedata2=15.1.0=py39hdc70f33_0               353 - unicodedata2=15.1.0=py39h0f82c59_0
371   - uri-template=1.3.0=pyhd8ed1ab_0                  354 - uri-template=1.3.0=pyhd8ed1ab_0
372   - urllib3=2.2.2=pyhd8ed1ab_1                       355 - urllib3=2.2.3=pyhd8ed1ab_0
373   - wcwidth=0.2.13=pyhd8ed1ab_0                      356 - wcwidth=0.2.13=pyhd8ed1ab_0
374   - webcolors=24.6.0=pyhd8ed1ab_0                    357 - webcolors=24.8.0=pyhd8ed1ab_0
375   - webencodings=0.5.1=pyhd8ed1ab_2                  358 - webencodings=0.5.1=pyhd8ed1ab_2
376   - websocket-client=1.8.0=pyhd8ed1ab_0              359 - websocket-client=1.8.0=pyhd8ed1ab_0
377   - wheel=0.43.0=pyhd8ed1ab_1                        360 - wheel=0.44.0=pyhd8ed1ab_0
378   - widgetsnbextension=3.6.7=pyhd8ed1ab_0            361 - widgetsnbextension=3.6.9=pyhd8ed1ab_0
379   - xmltodict=0.13.0=pyhd8ed1ab_0                    362 - xmltodict=0.14.0=pyhd8ed1ab_0
380   - xorg-kbproto=1.0.7=h35c211d_1002                 ... 
381   - xorg-libice=1.1.1=h0dc2134_0                     363 - xorg-libice=1.1.1=hd74edd7_1
382   - xorg-libsm=1.2.4=h0dc2134_0                      364 - xorg-libsm=1.2.4=hd74edd7_1
383   - xorg-libx11=1.8.9=h7022169_1                     365 - xorg-libx11=1.8.10=h2321a68_0
384   - xorg-libxau=1.0.11=h0dc2134_0                    366 - xorg-libxau=1.0.11=hd74edd7_1
385   - xorg-libxdmcp=1.1.3=h35c211d_0                   367 - xorg-libxdmcp=1.1.5=hd74edd7_0
386   - xorg-libxext=1.3.4=hb7f2c08_2                    368 - xorg-libxext=1.3.6=hd74edd7_0
387   - xorg-libxt=1.3.0=h0dc2134_1                      369 - xorg-libxt=1.3.0=hd74edd7_2
388   - xorg-xextproto=7.3.0=hb7f2c08_1003               370 - xorg-xorgproto=2024.1=hd74edd7_1
389   - xorg-xproto=7.0.31=h35c211d_1007                 ... 
390   - xyzservices=2024.6.0=pyhd8ed1ab_0                371 - xyzservices=2024.9.0=pyhd8ed1ab_0
391   - xz=5.2.6=h775f41a_0                              372 - xz=5.2.6=h57fd34a_0
392   - yaml=0.2.5=h0d85af4_2                            373 - yaml=0.2.5=h3422bc3_2
393   - yaml-cpp=0.8.0=he965462_0                        374 - yaml-cpp=0.8.0=h13dd4ca_0
394   - zeromq=4.3.5=hde137ed_4                          375 - zeromq=4.3.5=h9f5b81c_6
395   - zict=3.0.0=pyhd8ed1ab_0                          376 - zict=3.0.0=pyhd8ed1ab_0
396   - zipp=3.19.2=pyhd8ed1ab_0                         377 - zipp=3.20.2=pyhd8ed1ab_0
397   - zlib=1.3.1=h87427d6_1                            378 - zlib=1.3.1=h8359307_2
398   - zlib-ng=2.2.1=hf036a51_0                         379 - zlib-ng=2.2.2=hf9b8971_0
399   - zstandard=0.18.0=py39ha30fb19_1                  380 - zstandard=0.18.0=py39h02fc5c5_1
400   - zstd=1.5.6=h915ae27_0                            381 - zstd=1.5.6=hb46c0d2_0
401   - pip:                                             382 
402       - amberutils==21.0                                 
403       - edgembar==0.2                                    
404       - forcebalance==1.9.6                              
405       - mmpbsa-py==16.0                                  
406       - packmol-memgen==2023.2.24                        
407       - pdb4amber==22.0                                  
408       - pymsmt==22.0                                     
409       - pytraj==2.0.6                                    
410       - sander==22.0                                     
411 prefix: /Users/jeffreywagner/conda/envs/fb-dev           


@j-wags
Copy link
Collaborator Author

j-wags commented Oct 19, 2024

My major finding in the past day has been that fresh conda envs using the current yaml pass all tests on mac (both intel and ARM hardware) with osx-64 packages. This is true both of envs built using my regular mamba (mamba 1.5.1 with conda 23.1.0) and micromamba (mamba 1.5.7). However ARM-native macs using osx-arm64 packages fail the water tutorial test, by having a seemingly slight numerical difference in the results.

Linux tests are failing. My last commit tried switching the ubuntu tests to an older runner, but to no avail.

Next steps are to debug what's going on with the failing codecov step, and to see if we can get the ubuntu tests happy again.

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 23, 2024

Hi @leeping,

(you can ignore everything above and the current messy diff for the purpose of this question, I'll clean it up before asking for a code review. This message is self-contained so all relevant info is here)

I've got all but one test working with the following two changes:

  • Using the new 2024.3 gromacs conda package with the bugfix we need for the forcebalance interface
  • Using pseudovacuum instead of true vacuum

The one test that doesn't pass is src/tests/test_system.py::TestWaterTutorial::test_water_tutorial. This doesn't pass because of a numerical difference in 1/9 elements in the expected output (it's off by up to 0.0065 vs. an abs tolerance of 0.005). An example output of this test failing is:

FAILED src/tests/test_system.py::TestWaterTutorial::test_water_tutorial - AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0.005

Calculation results have changed from previously calculated values.
 If this seems reasonable, update EXPECTED_WATER_RESULTS in test_system.py with these values
Mismatched elements: 1 / 9 (11.1%)
Max absolute difference: 0.006
Max relative difference: 0.1142
 x: array([ 0.04237 ,  0.031217,  0.005692, -0.048114,  0.016735, -0.41722 ,  0.006272,  0.004631,
        0.2596  ])
 y: array([ 0.042536,  0.031029,  0.005694, -0.048178,  0.016767, -0.417264,  0.005953,  0.005228,
        0.253551])

I've tried downpinning versions of several math-y conda packages to determine which one is responsible for the numerical change, however I haven't found a culprit. Ultimately, the only signal I found is that it's due to slightly different numerical results on different architectures.

GitHub runner image native architecture conda package platform max absolute difference
macos-12 intel 64-bit osx-64 0.0039 (PASS)
macos-13 intel 64-bit osx-64 0.0039 (PASS)
macos-14 arm 64-bit osx-64 (rosetta emulation) 0.0032 (PASS)
macos-14 arm 64-bit osx-arm64 0.006 (FAIL)
macos-15 arm 64-bit osx-64 (rosetta emulation) 0.0032 (PASS)
macos-15 arm 64-bit osx-arm64 0.006 (FAIL)
ubuntu-20.04 intel 64-bit (presumably) linux-64 0.0065 (FAIL)
ubuntu-22.04 intel 64-bit (presumably) linux-64 0.0065 (FAIL)
ubuntu-24.04 intel 64-bit (presumably) linux-64 0.0065 (FAIL)

Basically, the packages built for intel 64-bit always pass, even when they're run on ARM machines emulating intel-64 using rosetta. The packages built for ARM machines always fail by slightly exceeding the absolute threshold.

(The failures do appear to be consistent over a few dozen runs of various configurations - for the same machine configuration the results either do not vary at all, or vary only slightly, but never enough to change a pass to a fail or vice versa)

Given the gradual and slight drift, my top theory right now is that this is due to something beyond our control on the computer architecture or OS level, so I'd advocate updating EXPECTED_WATER_RESULTS with the new values. If you agree with that, then I can make those changes and and clean up this PR for review.

@leeping
Copy link
Owner

leeping commented Oct 23, 2024

Hi Jeff,

Thanks so much for your herculean efforts. I agree updating the value of EXPECTED_WATER_RESULTS should be okay.

  • Lee-Ping

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 23, 2024

Great, thanks @leeping! I'll update the expected results and clean up this PR, then I'll tag you again when it's ready for review.

@j-wags
Copy link
Collaborator Author

j-wags commented Oct 29, 2024

The bromine study seems to be a little random - it failed on ubuntu/3.8 5 runs ago but has passed since then, despite none of the commits touching that pathway or build steps.

=========================== short test summary info ============================
FAILED src/tests/test_system.py::TestThermoBromineStudy::test_thermo_bromine_study - AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0.05

Calculation results have changed from previously calculated values.
 If this seems reasonable, update EXPECTED_BROMINE_RESULTS in test_system.py with these values
Mismatched elements: 1 / 2 (50%)
Max absolute difference: 0.053
Max relative difference: 0.2099
 x: array([-0.305718, -0.12497 ])
 y: array([-0.252674, -0.129278])
= 1 failed, 64 passed, 11 skipped, 1 deselected, 18 warnings in 587.68s (0:09:47) =

@j-wags
Copy link
Collaborator Author

j-wags commented Dec 2, 2024

Hi @leeping - I've resolved the issue from my earlier message, and have things mostly passing. However I have a few more questions:

  1. I found that I can get the ARM macs agreeing with the expected results by using the double-precision GROMACS conda packages (which they make now!). This seems greatly preferable to changing the expected results. However this requires calling gmx_d instead of gmx. If we hard-wire in calls to gmx_d everywhere, then users who used to be able to use certain functionality in forcebalance with only gmx installed will get lots of command not found errors. What would be your preferred solution here? Two options come to mind:
    • Update all GROMACS-involving studies so their .in files have gmxsuffix _d since that is required for reproducibility. This has the downside of confusing new/existing users who will get an error message if they try to run the studies without having installed gmx_d
    • Modify the GitHub Actions testing workflow to do something like aliasing gmx_d to gmx. This doesn't change the user experience but leaves some cruft in the testing workflow.
  2. Pseudovacuum works pretty well as a substitute for true vacuum. however there's one test series (test_engine.py::TestAmber99SB) where we'd need to relax the tolerance quite a lot to get it agreeing with the reference values. This may be because the system has a net charge, so moving to pseudovacuum puts it in a "net-charged universe" and thereby increases the total energy a lot. How would you prefer this be handled?
  3. There was a line where rvdw = rlist - 0.05, explained by the comment # Gromacs likes rvdw to be a bit smaller than rlist. However, in the new setup with pseudovacuum+PME, rvdw must be equal to- or greater than- rcoulomb. Based on the comment this seems like it was a hack all along, so setting rvdw = rlist should be fine. But I wanted to raise this to your attention since it is a significant change.
  4. Currently things are a bit hacky - I've modified edit_mdp to unconditionally overwrite nonbonded settings in the studies' mdp files to get pseudovacuum working. I could use advice on how to implement these changes in a more sustainable way (basically, assuming that a lot of the stuff from the shot.mdp files is no longer suitable - should we change settings in the files themselves, or have the pseudovacuum implementation automativally set things like cutoffs to huge values)

Let me know if you'd like to have a call to review this together. The current change set is pretty hacky and may be hard to read, but this is getting to the point where I know which functional changes to make but will need your input on where to put them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants