From f5ba3c7aeb61f273150bf40faef5f56172e0ba77 Mon Sep 17 00:00:00 2001 From: Kushagar garg Date: Tue, 25 Nov 2025 00:56:28 +0530 Subject: [PATCH 01/10] MAINT: Replace old numpy assertions --- testsuite/MDAnalysisTests/coordinates/base.py | 101 ++++++++++-------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 1568dfab87a..04cf647bd57 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -28,8 +28,6 @@ from unittest import TestCase from numpy.testing import ( assert_equal, - assert_almost_equal, - assert_array_almost_equal, assert_allclose, ) @@ -118,10 +116,11 @@ def test_dt(self): def test_coordinates(self): A10CA = self.universe.select_atoms("name CA")[10] # restrict accuracy to maximum in PDB files (3 decimals) - assert_almost_equal( + assert_allclose( A10CA.position, self.ref_coordinates["A10CA"], - 3, + atol=1e-3, + rtol=0, err_msg="wrong coordinates for A10:CA", ) @@ -129,10 +128,11 @@ def test_distances(self): NTERM = self.universe.select_atoms("name N")[0] CTERM = self.universe.select_atoms("name C")[-1] d = mda.lib.mdamath.norm(NTERM.position - CTERM.position) - assert_almost_equal( + assert_allclose( d, self.ref_distances["endtoend"], - self.prec, + atol=10**(-self.prec), + rtol=0, err_msg="distance between M1:N and G214:C", ) @@ -322,21 +322,21 @@ def test_get_writer_2(self, ref, reader, tmpdir): assert_equal(W.n_atoms, 100) def test_dt(self, ref, reader): - assert_almost_equal(reader.dt, ref.dt, decimal=ref.prec) + assert_allclose(reader.dt, ref.dt, atol=10**(-ref.prec), rtol=0) def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): - assert_almost_equal(reader.totaltime, ref.totaltime, decimal=ref.prec) + assert_allclose(reader.totaltime, ref.totaltime, atol=10**(-ref.prec), rtol=0) def test_first_dimensions(self, ref, reader): reader.rewind() if ref.dimensions is None: assert reader.ts.dimensions is None else: - assert_array_almost_equal( - reader.ts.dimensions, ref.dimensions, decimal=ref.prec + assert_allclose( + reader.ts.dimensions, ref.dimensions, atol=10**(-ref.prec), rtol=0 ) def test_changing_dimensions(self, ref, reader): @@ -345,17 +345,18 @@ def test_changing_dimensions(self, ref, reader): if ref.dimensions is None: assert reader.ts.dimensions is None else: - assert_array_almost_equal( - reader.ts.dimensions, ref.dimensions, decimal=ref.prec + assert_allclose( + reader.ts.dimensions, ref.dimensions, atol=10**(-ref.prec), rtol=0 ) reader[1] if ref.dimensions_second_frame is None: assert reader.ts.dimensions is None else: - assert_array_almost_equal( + assert_allclose( reader.ts.dimensions, ref.dimensions_second_frame, - decimal=ref.prec, + atol=10**(-ref.prec), + rtol=0 ) def test_volume(self, ref, reader): @@ -363,7 +364,7 @@ def test_volume(self, ref, reader): vol = reader.ts.volume # Here we can only be sure about the numbers upto the decimal point due # to floating point impressions. - assert_almost_equal(vol, ref.volume, 0) + assert_allclose(vol, ref.volume, atol=1, rtol=0) def test_iter(self, ref, reader): for i, ts in enumerate(reader): @@ -387,9 +388,11 @@ def test_remove_nonexistant_auxiliary_raises_ValueError(self, reader): def test_iter_auxiliary(self, ref, reader): # should go through all steps in 'highf' for i, auxstep in enumerate(reader.iter_auxiliary("highf")): - assert_almost_equal( + assert_allclose( auxstep.data, ref.aux_highf_all_data[i], + atol=1e-7, + rtol = 0, err_msg="Auxiliary data does not match for " "step {}".format(i), ) @@ -453,8 +456,8 @@ def test_transformations_iter(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 - assert_array_almost_equal( - ts.positions, idealcoords, decimal=ref.prec + assert_allclose( + ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0 ) def test_transformations_2iter(self, ref, transformed): @@ -465,12 +468,12 @@ def test_transformations_2iter(self, ref, transformed): idealcoords = [] for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) - assert_array_almost_equal( - ts.positions, idealcoords[i], decimal=ref.prec + assert_allclose( + ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0 ) for i, ts in enumerate(transformed): - assert_almost_equal(ts.positions, idealcoords[i], decimal=ref.prec) + assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? @@ -478,8 +481,8 @@ def test_transformations_slice(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 - assert_array_almost_equal( - ts.positions, idealcoords, decimal=ref.prec + assert_allclose( + ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0 ) def test_transformations_switch_frame(self, ref, transformed): @@ -490,26 +493,26 @@ def test_transformations_switch_frame(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) first_ideal = ref.iter_ts(0).positions + v1 + v2 if len(transformed) > 1: - assert_array_almost_equal( - transformed[0].positions, first_ideal, decimal=ref.prec + assert_allclose( + transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 ) second_ideal = ref.iter_ts(1).positions + v1 + v2 - assert_array_almost_equal( - transformed[1].positions, second_ideal, decimal=ref.prec + assert_allclose( + transformed[1].positions, second_ideal, atol=10**(-ref.prec), rtol=0 ) # What if we comeback to the previous frame? - assert_array_almost_equal( - transformed[0].positions, first_ideal, decimal=ref.prec + assert_allclose( + transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 ) # How about we switch the frame to itself? - assert_array_almost_equal( - transformed[0].positions, first_ideal, decimal=ref.prec + assert_allclose( + transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 ) else: - assert_array_almost_equal( - transformed[0].positions, first_ideal, decimal=ref.prec + assert_allclose( + transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 ) def test_transformation_rewind(self, ref, transformed): @@ -519,8 +522,8 @@ def test_transformation_rewind(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) ideal_coords = ref.iter_ts(0).positions + v1 + v2 transformed.rewind() - assert_array_almost_equal( - transformed[0].positions, ideal_coords, decimal=ref.prec + assert_allclose( + transformed[0].positions, ideal_coords, atol=10**(-ref.prec), rtol=0 ) def test_transformations_copy(self, ref, transformed): @@ -536,8 +539,8 @@ def test_transformations_copy(self, ref, transformed): ) for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 - assert_array_almost_equal( - ts.positions, ideal_coords, decimal=ref.prec + assert_allclose( + ts.positions, ideal_coords, atol=10**(-ref.prec), rtol=0 ) def test_add_another_transformations_raises_ValueError(self, transformed): @@ -812,8 +815,8 @@ def test_write_different_box(self, ref, universe, tmpdir): for ts_ref, ts_w in zip(universe.trajectory, written): universe.dimensions[:3] += 1 - assert_array_almost_equal( - universe.dimensions, ts_w.dimensions, decimal=ref.prec + assert_allclose( + universe.dimensions, ts_w.dimensions, atol=10**(-ref.prec), rtol = 0 ) def test_write_trajectory_atomgroup(self, ref, reader, universe, tmpdir): @@ -853,10 +856,11 @@ def test_write_selection( copy = ref.reader(outfile) for orig_ts, copy_ts in zip(universe.trajectory, copy): - assert_array_almost_equal( + assert_allclose( copy_ts._pos, sel.atoms.positions, - ref.prec, + atol=10**(-ref.prec), + rtol=0, err_msg="coordinate mismatch between original and written " "trajectory at frame {} (orig) vs {} (copy)".format( orig_ts.frame, copy_ts.frame @@ -933,10 +937,11 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): ) if A.has_positions: - assert_array_almost_equal( + assert_allclose( A.positions, B.positions, - decimal=decimal, + atol=10**(-decimal), + rtol=0, err_msg="Timestep positions", verbose=verbose, ) @@ -949,10 +954,11 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): ) ) if A.has_velocities: - assert_array_almost_equal( + assert_allclose( A.velocities, B.velocities, - decimal=decimal, + atol=10**(-decimal), + rtol=0, err_msg="Timestep velocities", verbose=verbose, ) @@ -965,10 +971,11 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): ) ) if A.has_forces: - assert_array_almost_equal( + assert_allclose( A.forces, B.forces, - decimal=decimal, + atol=10**(-decimal), + rtol=0, err_msg="Timestep forces", verbose=verbose, ) From 9afe7351ee7c79e5a327959e4d76e84c53c3f076 Mon Sep 17 00:00:00 2001 From: Kushagar garg Date: Tue, 25 Nov 2025 01:31:27 +0530 Subject: [PATCH 02/10] STYLE: Apply black formatting --- testsuite/MDAnalysisTests/coordinates/base.py | 79 +++++++++++++------ 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 04cf647bd57..757c5f5baff 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -131,7 +131,7 @@ def test_distances(self): assert_allclose( d, self.ref_distances["endtoend"], - atol=10**(-self.prec), + atol=10 ** (-self.prec), rtol=0, err_msg="distance between M1:N and G214:C", ) @@ -322,13 +322,15 @@ def test_get_writer_2(self, ref, reader, tmpdir): assert_equal(W.n_atoms, 100) def test_dt(self, ref, reader): - assert_allclose(reader.dt, ref.dt, atol=10**(-ref.prec), rtol=0) + assert_allclose(reader.dt, ref.dt, atol=10 ** (-ref.prec), rtol=0) def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): - assert_allclose(reader.totaltime, ref.totaltime, atol=10**(-ref.prec), rtol=0) + assert_allclose( + reader.totaltime, ref.totaltime, atol=10 ** (-ref.prec), rtol=0 + ) def test_first_dimensions(self, ref, reader): reader.rewind() @@ -336,7 +338,10 @@ def test_first_dimensions(self, ref, reader): assert reader.ts.dimensions is None else: assert_allclose( - reader.ts.dimensions, ref.dimensions, atol=10**(-ref.prec), rtol=0 + reader.ts.dimensions, + ref.dimensions, + atol=10 ** (-ref.prec), + rtol=0, ) def test_changing_dimensions(self, ref, reader): @@ -346,7 +351,10 @@ def test_changing_dimensions(self, ref, reader): assert reader.ts.dimensions is None else: assert_allclose( - reader.ts.dimensions, ref.dimensions, atol=10**(-ref.prec), rtol=0 + reader.ts.dimensions, + ref.dimensions, + atol=10 ** (-ref.prec), + rtol=0, ) reader[1] if ref.dimensions_second_frame is None: @@ -355,8 +363,8 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions_second_frame, - atol=10**(-ref.prec), - rtol=0 + atol=10 ** (-ref.prec), + rtol=0, ) def test_volume(self, ref, reader): @@ -392,7 +400,7 @@ def test_iter_auxiliary(self, ref, reader): auxstep.data, ref.aux_highf_all_data[i], atol=1e-7, - rtol = 0, + rtol=0, err_msg="Auxiliary data does not match for " "step {}".format(i), ) @@ -457,7 +465,7 @@ def test_transformations_iter(self, ref, transformed): for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 assert_allclose( - ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0 + ts.positions, idealcoords, atol=10 ** (-ref.prec), rtol=0 ) def test_transformations_2iter(self, ref, transformed): @@ -469,11 +477,13 @@ def test_transformations_2iter(self, ref, transformed): for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) assert_allclose( - ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0 + ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 ) for i, ts in enumerate(transformed): - assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) + assert_allclose( + ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 + ) def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? @@ -482,7 +492,7 @@ def test_transformations_slice(self, ref, transformed): for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 assert_allclose( - ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0 + ts.positions, idealcoords, atol=10 ** (-ref.prec), rtol=0 ) def test_transformations_switch_frame(self, ref, transformed): @@ -494,25 +504,40 @@ def test_transformations_switch_frame(self, ref, transformed): first_ideal = ref.iter_ts(0).positions + v1 + v2 if len(transformed) > 1: assert_allclose( - transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 + transformed[0].positions, + first_ideal, + atol=10 ** (-ref.prec), + rtol=0, ) second_ideal = ref.iter_ts(1).positions + v1 + v2 assert_allclose( - transformed[1].positions, second_ideal, atol=10**(-ref.prec), rtol=0 + transformed[1].positions, + second_ideal, + atol=10 ** (-ref.prec), + rtol=0, ) # What if we comeback to the previous frame? assert_allclose( - transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 + transformed[0].positions, + first_ideal, + atol=10 ** (-ref.prec), + rtol=0, ) # How about we switch the frame to itself? assert_allclose( - transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 + transformed[0].positions, + first_ideal, + atol=10 ** (-ref.prec), + rtol=0, ) else: assert_allclose( - transformed[0].positions, first_ideal, atol=10**(-ref.prec), rtol=0 + transformed[0].positions, + first_ideal, + atol=10 ** (-ref.prec), + rtol=0, ) def test_transformation_rewind(self, ref, transformed): @@ -523,7 +548,10 @@ def test_transformation_rewind(self, ref, transformed): ideal_coords = ref.iter_ts(0).positions + v1 + v2 transformed.rewind() assert_allclose( - transformed[0].positions, ideal_coords, atol=10**(-ref.prec), rtol=0 + transformed[0].positions, + ideal_coords, + atol=10 ** (-ref.prec), + rtol=0, ) def test_transformations_copy(self, ref, transformed): @@ -540,7 +568,7 @@ def test_transformations_copy(self, ref, transformed): for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 assert_allclose( - ts.positions, ideal_coords, atol=10**(-ref.prec), rtol=0 + ts.positions, ideal_coords, atol=10 ** (-ref.prec), rtol=0 ) def test_add_another_transformations_raises_ValueError(self, transformed): @@ -816,7 +844,10 @@ def test_write_different_box(self, ref, universe, tmpdir): for ts_ref, ts_w in zip(universe.trajectory, written): universe.dimensions[:3] += 1 assert_allclose( - universe.dimensions, ts_w.dimensions, atol=10**(-ref.prec), rtol = 0 + universe.dimensions, + ts_w.dimensions, + atol=10 ** (-ref.prec), + rtol=0, ) def test_write_trajectory_atomgroup(self, ref, reader, universe, tmpdir): @@ -859,7 +890,7 @@ def test_write_selection( assert_allclose( copy_ts._pos, sel.atoms.positions, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, err_msg="coordinate mismatch between original and written " "trajectory at frame {} (orig) vs {} (copy)".format( @@ -940,7 +971,7 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): assert_allclose( A.positions, B.positions, - atol=10**(-decimal), + atol=10 ** (-decimal), rtol=0, err_msg="Timestep positions", verbose=verbose, @@ -957,7 +988,7 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): assert_allclose( A.velocities, B.velocities, - atol=10**(-decimal), + atol=10 ** (-decimal), rtol=0, err_msg="Timestep velocities", verbose=verbose, @@ -974,7 +1005,7 @@ def assert_timestep_almost_equal(A, B, decimal=6, verbose=True): assert_allclose( A.forces, B.forces, - atol=10**(-decimal), + atol=10 ** (-decimal), rtol=0, err_msg="Timestep forces", verbose=verbose, From c3106e8ce0eb13938626b1cdefcb5c07d0aebaea Mon Sep 17 00:00:00 2001 From: Kushagar garg Date: Sun, 30 Nov 2025 22:58:13 +0530 Subject: [PATCH 03/10] style: standardize precision to 1e-3 and fix author order --- package/AUTHORS | 1 + testsuite/MDAnalysisTests/coordinates/base.py | 38 +++++++++---------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/package/AUTHORS b/package/AUTHORS index e23f2afcf2c..bb46baae076 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -265,6 +265,7 @@ Chronological list of authors - Raúl Lois-Cuns - Pranay Pelapkar - Shreejan Dolai + - Kushagar Garg External code ------------- diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 757c5f5baff..88258f11bf0 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -131,7 +131,7 @@ def test_distances(self): assert_allclose( d, self.ref_distances["endtoend"], - atol=10 ** (-self.prec), + atol=1e-3, rtol=0, err_msg="distance between M1:N and G214:C", ) @@ -322,14 +322,14 @@ def test_get_writer_2(self, ref, reader, tmpdir): assert_equal(W.n_atoms, 100) def test_dt(self, ref, reader): - assert_allclose(reader.dt, ref.dt, atol=10 ** (-ref.prec), rtol=0) + assert_allclose(reader.dt, ref.dt, atol=1e-3, rtol=0) def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): assert_allclose( - reader.totaltime, ref.totaltime, atol=10 ** (-ref.prec), rtol=0 + reader.totaltime, ref.totaltime, atol=1e-3, rtol=0 ) def test_first_dimensions(self, ref, reader): @@ -340,7 +340,7 @@ def test_first_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -353,7 +353,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) reader[1] @@ -363,7 +363,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions_second_frame, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -465,7 +465,7 @@ def test_transformations_iter(self, ref, transformed): for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 assert_allclose( - ts.positions, idealcoords, atol=10 ** (-ref.prec), rtol=0 + ts.positions, idealcoords, atol=1e-3, rtol=0 ) def test_transformations_2iter(self, ref, transformed): @@ -477,12 +477,12 @@ def test_transformations_2iter(self, ref, transformed): for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) assert_allclose( - ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 + ts.positions, idealcoords[i], atol=1e-3, rtol=0 ) for i, ts in enumerate(transformed): assert_allclose( - ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 + ts.positions, idealcoords[i], atol=1e-3, rtol=0 ) def test_transformations_slice(self, ref, transformed): @@ -492,7 +492,7 @@ def test_transformations_slice(self, ref, transformed): for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 assert_allclose( - ts.positions, idealcoords, atol=10 ** (-ref.prec), rtol=0 + ts.positions, idealcoords, atol=1e-3, rtol=0 ) def test_transformations_switch_frame(self, ref, transformed): @@ -506,14 +506,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) second_ideal = ref.iter_ts(1).positions + v1 + v2 assert_allclose( transformed[1].positions, second_ideal, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -521,7 +521,7 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -529,14 +529,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) else: assert_allclose( transformed[0].positions, first_ideal, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -550,7 +550,7 @@ def test_transformation_rewind(self, ref, transformed): assert_allclose( transformed[0].positions, ideal_coords, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -568,7 +568,7 @@ def test_transformations_copy(self, ref, transformed): for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 assert_allclose( - ts.positions, ideal_coords, atol=10 ** (-ref.prec), rtol=0 + ts.positions, ideal_coords, atol=1e-3, rtol=0 ) def test_add_another_transformations_raises_ValueError(self, transformed): @@ -846,7 +846,7 @@ def test_write_different_box(self, ref, universe, tmpdir): assert_allclose( universe.dimensions, ts_w.dimensions, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, ) @@ -890,7 +890,7 @@ def test_write_selection( assert_allclose( copy_ts._pos, sel.atoms.positions, - atol=10 ** (-ref.prec), + atol=1e-3, rtol=0, err_msg="coordinate mismatch between original and written " "trajectory at frame {} (orig) vs {} (copy)".format( From df0067441a9a3bb713e71ba3cac34ca9a04b464d Mon Sep 17 00:00:00 2001 From: Kushagar Garg Date: Sun, 30 Nov 2025 23:14:16 +0530 Subject: [PATCH 04/10] style: apply black formatting --- testsuite/MDAnalysisTests/coordinates/base.py | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 88258f11bf0..51856cd7b3f 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -328,9 +328,7 @@ def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): - assert_allclose( - reader.totaltime, ref.totaltime, atol=1e-3, rtol=0 - ) + assert_allclose(reader.totaltime, ref.totaltime, atol=1e-3, rtol=0) def test_first_dimensions(self, ref, reader): reader.rewind() @@ -464,9 +462,7 @@ def test_transformations_iter(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 - assert_allclose( - ts.positions, idealcoords, atol=1e-3, rtol=0 - ) + assert_allclose(ts.positions, idealcoords, atol=1e-3, rtol=0) def test_transformations_2iter(self, ref, transformed): # Are the transformations applied and @@ -476,14 +472,10 @@ def test_transformations_2iter(self, ref, transformed): idealcoords = [] for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) - assert_allclose( - ts.positions, idealcoords[i], atol=1e-3, rtol=0 - ) + assert_allclose(ts.positions, idealcoords[i], atol=1e-3, rtol=0) for i, ts in enumerate(transformed): - assert_allclose( - ts.positions, idealcoords[i], atol=1e-3, rtol=0 - ) + assert_allclose(ts.positions, idealcoords[i], atol=1e-3, rtol=0) def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? @@ -491,9 +483,7 @@ def test_transformations_slice(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 - assert_allclose( - ts.positions, idealcoords, atol=1e-3, rtol=0 - ) + assert_allclose(ts.positions, idealcoords, atol=1e-3, rtol=0) def test_transformations_switch_frame(self, ref, transformed): # This test checks if the transformations are applied and if the coordinates @@ -567,9 +557,7 @@ def test_transformations_copy(self, ref, transformed): ) for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 - assert_allclose( - ts.positions, ideal_coords, atol=1e-3, rtol=0 - ) + assert_allclose(ts.positions, ideal_coords, atol=1e-3, rtol=0) def test_add_another_transformations_raises_ValueError(self, transformed): # After defining the transformations, the workflow cannot be changed From e21472c4b1cd0512ed4ca74751ab5cea9e125c2e Mon Sep 17 00:00:00 2001 From: Dreamstick Date: Sun, 14 Dec 2025 23:21:27 +0530 Subject: [PATCH 05/10] Update testsuite/MDAnalysisTests/coordinates/base.py Co-authored-by: Egor Marin --- testsuite/MDAnalysisTests/coordinates/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 51856cd7b3f..9fc1a21e6ff 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -370,7 +370,7 @@ def test_volume(self, ref, reader): vol = reader.ts.volume # Here we can only be sure about the numbers upto the decimal point due # to floating point impressions. - assert_allclose(vol, ref.volume, atol=1, rtol=0) + assert_allclose(vol, ref.volume, atol=0.01, rtol=0) def test_iter(self, ref, reader): for i, ts in enumerate(reader): From beac4ccba368da9a8ace3b73e783a513011baa78 Mon Sep 17 00:00:00 2001 From: Dreamstick Date: Sun, 14 Dec 2025 23:21:46 +0530 Subject: [PATCH 06/10] Update testsuite/MDAnalysisTests/coordinates/base.py Co-authored-by: Egor Marin --- testsuite/MDAnalysisTests/coordinates/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 9fc1a21e6ff..27f81b54514 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -462,7 +462,7 @@ def test_transformations_iter(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 - assert_allclose(ts.positions, idealcoords, atol=1e-3, rtol=0) + assert_allclose(ts.positions, idealcoords, atol=ref.prec, rtol=0) def test_transformations_2iter(self, ref, transformed): # Are the transformations applied and From 725ef9c3319a3ff4dc9ce3f1e59c9d6dbd088f6c Mon Sep 17 00:00:00 2001 From: Kushagar Garg Date: Mon, 15 Dec 2025 00:40:50 +0530 Subject: [PATCH 07/10] refactor: revert remaining hardcoded tolerance to dynamic ref.prec --- testsuite/MDAnalysisTests/coordinates/base.py | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 27f81b54514..c75823a8cb3 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -119,7 +119,7 @@ def test_coordinates(self): assert_allclose( A10CA.position, self.ref_coordinates["A10CA"], - atol=1e-3, + atol=10 ** (-self.prec), rtol=0, err_msg="wrong coordinates for A10:CA", ) @@ -131,7 +131,7 @@ def test_distances(self): assert_allclose( d, self.ref_distances["endtoend"], - atol=1e-3, + atol=10 ** (-self.prec), rtol=0, err_msg="distance between M1:N and G214:C", ) @@ -322,13 +322,13 @@ def test_get_writer_2(self, ref, reader, tmpdir): assert_equal(W.n_atoms, 100) def test_dt(self, ref, reader): - assert_allclose(reader.dt, ref.dt, atol=1e-3, rtol=0) + assert_allclose(reader.dt, ref.dt, atol=10**(-ref.prec), rtol=0) def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): - assert_allclose(reader.totaltime, ref.totaltime, atol=1e-3, rtol=0) + assert_allclose(reader.totaltime, ref.totaltime, atol=10**(-ref.prec), rtol=0) def test_first_dimensions(self, ref, reader): reader.rewind() @@ -338,7 +338,7 @@ def test_first_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -351,7 +351,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) reader[1] @@ -361,7 +361,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions_second_frame, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -472,10 +472,10 @@ def test_transformations_2iter(self, ref, transformed): idealcoords = [] for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) - assert_allclose(ts.positions, idealcoords[i], atol=1e-3, rtol=0) + assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) for i, ts in enumerate(transformed): - assert_allclose(ts.positions, idealcoords[i], atol=1e-3, rtol=0) + assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? @@ -483,7 +483,7 @@ def test_transformations_slice(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 - assert_allclose(ts.positions, idealcoords, atol=1e-3, rtol=0) + assert_allclose(ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0) def test_transformations_switch_frame(self, ref, transformed): # This test checks if the transformations are applied and if the coordinates @@ -496,14 +496,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) second_ideal = ref.iter_ts(1).positions + v1 + v2 assert_allclose( transformed[1].positions, second_ideal, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -511,7 +511,7 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -519,14 +519,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) else: assert_allclose( transformed[0].positions, first_ideal, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -540,7 +540,7 @@ def test_transformation_rewind(self, ref, transformed): assert_allclose( transformed[0].positions, ideal_coords, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -557,7 +557,7 @@ def test_transformations_copy(self, ref, transformed): ) for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 - assert_allclose(ts.positions, ideal_coords, atol=1e-3, rtol=0) + assert_allclose(ts.positions, ideal_coords, atol=10**(-ref.prec), rtol=0) def test_add_another_transformations_raises_ValueError(self, transformed): # After defining the transformations, the workflow cannot be changed @@ -834,7 +834,7 @@ def test_write_different_box(self, ref, universe, tmpdir): assert_allclose( universe.dimensions, ts_w.dimensions, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, ) @@ -878,7 +878,7 @@ def test_write_selection( assert_allclose( copy_ts._pos, sel.atoms.positions, - atol=1e-3, + atol=10**(-ref.prec), rtol=0, err_msg="coordinate mismatch between original and written " "trajectory at frame {} (orig) vs {} (copy)".format( From 42fe56c08fa01aca979672771a18954b19a7323d Mon Sep 17 00:00:00 2001 From: Kushagar Garg Date: Mon, 22 Dec 2025 15:55:55 +0530 Subject: [PATCH 08/10] chore: trigger GitHub Actions From b4bc14b6618391a243ba75e6144e160b55dc1698 Mon Sep 17 00:00:00 2001 From: Kushagar Garg Date: Tue, 23 Dec 2025 00:11:46 +0530 Subject: [PATCH 09/10] test: fix volume tolerance and revert dynamic precision --- testsuite/MDAnalysisTests/coordinates/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index c75823a8cb3..b08e0c383ac 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -370,7 +370,7 @@ def test_volume(self, ref, reader): vol = reader.ts.volume # Here we can only be sure about the numbers upto the decimal point due # to floating point impressions. - assert_allclose(vol, ref.volume, atol=0.01, rtol=0) + assert_allclose(vol, ref.volume, atol=1, rtol=0) def test_iter(self, ref, reader): for i, ts in enumerate(reader): From cf564b7bbf72d0290d3033b6900e2788320d28a1 Mon Sep 17 00:00:00 2001 From: Kushagar Garg Date: Tue, 23 Dec 2025 00:19:42 +0530 Subject: [PATCH 10/10] style: run black to fix CI formatting --- testsuite/MDAnalysisTests/coordinates/base.py | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index b08e0c383ac..21e3517beaa 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -322,13 +322,15 @@ def test_get_writer_2(self, ref, reader, tmpdir): assert_equal(W.n_atoms, 100) def test_dt(self, ref, reader): - assert_allclose(reader.dt, ref.dt, atol=10**(-ref.prec), rtol=0) + assert_allclose(reader.dt, ref.dt, atol=10 ** (-ref.prec), rtol=0) def test_ts_dt_matches_reader(self, reader): assert_equal(reader.ts.dt, reader.dt) def test_total_time(self, ref, reader): - assert_allclose(reader.totaltime, ref.totaltime, atol=10**(-ref.prec), rtol=0) + assert_allclose( + reader.totaltime, ref.totaltime, atol=10 ** (-ref.prec), rtol=0 + ) def test_first_dimensions(self, ref, reader): reader.rewind() @@ -338,7 +340,7 @@ def test_first_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -351,7 +353,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) reader[1] @@ -361,7 +363,7 @@ def test_changing_dimensions(self, ref, reader): assert_allclose( reader.ts.dimensions, ref.dimensions_second_frame, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -472,10 +474,14 @@ def test_transformations_2iter(self, ref, transformed): idealcoords = [] for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) - assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) + assert_allclose( + ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 + ) for i, ts in enumerate(transformed): - assert_allclose(ts.positions, idealcoords[i], atol=10**(-ref.prec), rtol=0) + assert_allclose( + ts.positions, idealcoords[i], atol=10 ** (-ref.prec), rtol=0 + ) def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? @@ -483,7 +489,9 @@ def test_transformations_slice(self, ref, transformed): v2 = np.float32((0, 0, 0.33)) for i, ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 - assert_allclose(ts.positions, idealcoords, atol=10**(-ref.prec), rtol=0) + assert_allclose( + ts.positions, idealcoords, atol=10 ** (-ref.prec), rtol=0 + ) def test_transformations_switch_frame(self, ref, transformed): # This test checks if the transformations are applied and if the coordinates @@ -496,14 +504,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) second_ideal = ref.iter_ts(1).positions + v1 + v2 assert_allclose( transformed[1].positions, second_ideal, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -511,7 +519,7 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -519,14 +527,14 @@ def test_transformations_switch_frame(self, ref, transformed): assert_allclose( transformed[0].positions, first_ideal, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) else: assert_allclose( transformed[0].positions, first_ideal, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -540,7 +548,7 @@ def test_transformation_rewind(self, ref, transformed): assert_allclose( transformed[0].positions, ideal_coords, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -557,7 +565,9 @@ def test_transformations_copy(self, ref, transformed): ) for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 - assert_allclose(ts.positions, ideal_coords, atol=10**(-ref.prec), rtol=0) + assert_allclose( + ts.positions, ideal_coords, atol=10 ** (-ref.prec), rtol=0 + ) def test_add_another_transformations_raises_ValueError(self, transformed): # After defining the transformations, the workflow cannot be changed @@ -834,7 +844,7 @@ def test_write_different_box(self, ref, universe, tmpdir): assert_allclose( universe.dimensions, ts_w.dimensions, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, ) @@ -878,7 +888,7 @@ def test_write_selection( assert_allclose( copy_ts._pos, sel.atoms.positions, - atol=10**(-ref.prec), + atol=10 ** (-ref.prec), rtol=0, err_msg="coordinate mismatch between original and written " "trajectory at frame {} (orig) vs {} (copy)".format(