From d53f9d03587acd3fde7fea6f92c7a9c233625fa8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:47:35 +0000 Subject: [PATCH 1/5] Initial plan From bca5c80ecddb077147c18a65e2dd330c69f11efe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:50:38 +0000 Subject: [PATCH 2/5] Add validation for G_new to check for non-positive values Co-authored-by: The9Cat <25960766+The9Cat@users.noreply.github.com> --- EXP-units/__pycache__/expunits.cpython-312.pyc | Bin 0 -> 13864 bytes EXP-units/expunits.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 EXP-units/__pycache__/expunits.cpython-312.pyc diff --git a/EXP-units/__pycache__/expunits.cpython-312.pyc b/EXP-units/__pycache__/expunits.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da7178dfb15bcfdef766c67057c0586c48e42122 GIT binary patch literal 13864 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 B4QK!W literal 0 HcmV?d00001 diff --git a/EXP-units/expunits.py b/EXP-units/expunits.py index 196a0d9..65d9395 100644 --- a/EXP-units/expunits.py +++ b/EXP-units/expunits.py @@ -106,6 +106,10 @@ def compute_scales(G_old, G_new, s_L, s_V, s_M): s_L, s_V, s_M are either floats or None. Returns (s_L, s_V, s_M). Raises ValueError if insufficient or inconsistent. """ + # Validate G_new is physically meaningful + if G_new <= 0: + raise ValueError(f"G_new must be positive (got {G_new}). Zero or negative gravitational constants are not physically meaningful.") + known = [(s_L is not None), (s_V is not None), (s_M is not None)] n_known = sum(known) @@ -114,7 +118,7 @@ def compute_scales(G_old, G_new, s_L, s_V, s_M): G_check = (s_L * s_V**2) / (G_old * s_M) if not math.isfinite(G_check): raise ValueError("Computed G_check is not finite.") - if abs((G_check - G_new) / (abs(G_new) if G_new != 0 else 1.0)) > 1e-9: + if abs((G_check - G_new) / abs(G_new)) > 1e-9: raise ValueError(f"Inconsistent scales: G_new requested {G_new} but scales give {G_check}.") return s_L, s_V, s_M From 744705a524148716b592e77ca7bfd6f82ac859c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:50:50 +0000 Subject: [PATCH 3/5] Add __pycache__ to .gitignore and remove cached files Co-authored-by: The9Cat <25960766+The9Cat@users.noreply.github.com> --- .gitignore | 1 + EXP-units/__pycache__/expunits.cpython-312.pyc | Bin 13864 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 EXP-units/__pycache__/expunits.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 314ca4c..4fcac03 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Binary/*run1* DiskHaloA/*run0* DiskHaloA/processor.rates +__pycache__/ diff --git a/EXP-units/__pycache__/expunits.cpython-312.pyc b/EXP-units/__pycache__/expunits.cpython-312.pyc deleted file mode 100644 index da7178dfb15bcfdef766c67057c0586c48e42122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13864 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 B4QK!W From 83cde979d9aa254e6cbf6e3daf7c4c3bf1b2923f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:51:37 +0000 Subject: [PATCH 4/5] Add validation for G_old to prevent division errors Co-authored-by: The9Cat <25960766+The9Cat@users.noreply.github.com> --- EXP-units/expunits.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EXP-units/expunits.py b/EXP-units/expunits.py index 65d9395..513ef23 100644 --- a/EXP-units/expunits.py +++ b/EXP-units/expunits.py @@ -109,6 +109,8 @@ def compute_scales(G_old, G_new, s_L, s_V, s_M): # Validate G_new is physically meaningful if G_new <= 0: raise ValueError(f"G_new must be positive (got {G_new}). Zero or negative gravitational constants are not physically meaningful.") + if G_old <= 0: + raise ValueError(f"G_old must be positive (got {G_old}). Zero or negative gravitational constants are not physically meaningful.") known = [(s_L is not None), (s_V is not None), (s_M is not None)] n_known = sum(known) From c28a276bacadabb5eb184eae0eaf37c513fe07ac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:52:26 +0000 Subject: [PATCH 5/5] Simplify division by G_new since it's guaranteed positive Co-authored-by: The9Cat <25960766+The9Cat@users.noreply.github.com> --- EXP-units/expunits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EXP-units/expunits.py b/EXP-units/expunits.py index 513ef23..1536a63 100644 --- a/EXP-units/expunits.py +++ b/EXP-units/expunits.py @@ -120,7 +120,7 @@ def compute_scales(G_old, G_new, s_L, s_V, s_M): G_check = (s_L * s_V**2) / (G_old * s_M) if not math.isfinite(G_check): raise ValueError("Computed G_check is not finite.") - if abs((G_check - G_new) / abs(G_new)) > 1e-9: + if abs((G_check - G_new) / G_new) > 1e-9: raise ValueError(f"Inconsistent scales: G_new requested {G_new} but scales give {G_check}.") return s_L, s_V, s_M