From d0709cf928d61ed17afbc367a6bd3122918644b9 Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sat, 22 Nov 2025 08:16:54 -0600 Subject: [PATCH 1/8] Change API of calc_sfh_galpop, calc_sfh_singlegal, mc_diffstar_sfh_singlegal, and mc_diffstar_sfh_galpop so that lgt0 and fb are required keyword arguments with no defaults --- diffstar/diffstarpop/mc_diffstarpop_mgash.py | 12 +++++++----- diffstar/sfh_model.py | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/diffstar/diffstarpop/mc_diffstarpop_mgash.py b/diffstar/diffstarpop/mc_diffstarpop_mgash.py index 23e63d7..db7fd6d 100644 --- a/diffstar/diffstarpop/mc_diffstarpop_mgash.py +++ b/diffstar/diffstarpop/mc_diffstarpop_mgash.py @@ -6,7 +6,7 @@ from jax import random as jran from jax import vmap -from ..defaults import FB, LGT0, get_bounded_diffstar_params +from ..defaults import get_bounded_diffstar_params from ..sfh_model import calc_sfh_galpop, calc_sfh_singlegal from .kernels.diffstarpop_mgash import mc_diffstar_u_params_singlegal_kernel @@ -35,8 +35,9 @@ def mc_diffstar_sfh_singlegal( gyr_since_infall, ran_key, tarr, - lgt0=LGT0, - fb=FB, + *, + lgt0, + fb, ): """Monte Carlo realization of a single point in Diffstar parameter space, along with the computation of SFH for this point. @@ -376,8 +377,9 @@ def mc_diffstar_sfh_galpop( gyr_since_infall, ran_key, tarr, - lgt0=LGT0, - fb=FB, + *, + lgt0, + fb, ): """Monte Carlo realization of a single point in Diffstar parameter space, along with the computation of SFH for this point. diff --git a/diffstar/sfh_model.py b/diffstar/sfh_model.py index 0cfdf71..d35ee12 100644 --- a/diffstar/sfh_model.py +++ b/diffstar/sfh_model.py @@ -7,7 +7,6 @@ from jax import numpy as jnp from jax import vmap -from .defaults import FB, LGT0 from .kernels.history_kernel_builders import _sfh_galpop_kern, _sfh_singlegal_kern from .utils import cumulative_mstar_formed @@ -18,7 +17,13 @@ @partial(jjit, static_argnames="return_smh") def calc_sfh_singlegal( - sfh_params, mah_params, tarr, lgt0=LGT0, fb=FB, return_smh=False + sfh_params, + mah_params, + tarr, + *, + lgt0, + fb, + return_smh=False, ): """Calculate the Diffstar SFH for a single galaxy @@ -72,7 +77,15 @@ def calc_sfh_singlegal( @partial(jjit, static_argnames="return_smh") -def calc_sfh_galpop(sfh_params, mah_params, tarr, lgt0=LGT0, fb=FB, return_smh=False): +def calc_sfh_galpop( + sfh_params, + mah_params, + tarr, + *, + lgt0, + fb, + return_smh=False, +): """Calculate the Diffstar SFH for a single galaxy Parameters From f0b19ec774896833b917917a85c37cc5d9d2ceeb Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sun, 23 Nov 2025 11:07:28 -0600 Subject: [PATCH 2/8] Resolve all but two failing tests --- .../loss_kernels/mstar_ssfr_loss_mgash_anyz.py | 16 +++++++++++++--- diffstar/diffstarpop/tests/test_gradients.py | 6 +++--- .../tests/test_mc_diffstarpop_mgash.py | 4 +++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py b/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py index a576376..b5c2a41 100644 --- a/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py +++ b/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py @@ -1,18 +1,18 @@ """ """ from diffsky.diffndhist import tw_ndhist_weighted -from diffstar.utils import cumulative_mstar_formed from jax import jit as jjit from jax import numpy as jnp from jax import value_and_grad, vmap +from diffstar.utils import cumulative_mstar_formed + from ..kernels.defaults_mgash import ( DEFAULT_DIFFSTARPOP_U_PARAMS, get_bounded_diffstarpop_params, ) from ..mc_diffstarpop_mgash import mc_diffstar_sfh_galpop - N_TIMES = 20 _A = (None, 0) @@ -51,6 +51,8 @@ def _mc_diffstar_sfh_galpop_vmap_kern( gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ): tarr = jnp.logspace(-1, jnp.log10(tobs_target), N_TIMES) res = mc_diffstar_sfh_galpop( @@ -63,11 +65,13 @@ def _mc_diffstar_sfh_galpop_vmap_kern( gyr_since_infall, ran_key, tarr, + lgt0=lgt0, + fb=fb, ) return res -_U = (None, *[0] * 8) +_U = (None, *[0] * 8, None, None) mc_diffstar_sfh_galpop_vmap = jjit(vmap(_mc_diffstar_sfh_galpop_vmap_kern, in_axes=_U)) @@ -133,6 +137,8 @@ def mstar_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ) diffstar_params_ms, diffstar_params_q, sfh_ms, sfh_q, frac_q, mc_is_q = _res @@ -255,6 +261,8 @@ def mstar_ssfr_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ) diffstar_params_ms, diffstar_params_q, sfh_ms, sfh_q, frac_q, mc_is_q = _res @@ -369,6 +377,8 @@ def mstar_ssfr_sat_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ) diffstar_params_ms, diffstar_params_q, sfh_ms, sfh_q, frac_q, mc_is_q = _res diff --git a/diffstar/diffstarpop/tests/test_gradients.py b/diffstar/diffstarpop/tests/test_gradients.py index b09e728..c62b841 100644 --- a/diffstar/diffstarpop/tests/test_gradients.py +++ b/diffstar/diffstarpop/tests/test_gradients.py @@ -105,7 +105,7 @@ def test_all_diffstarpop_u_param_gradients_are_nonzero(): default_sfh_q, frac_q, mc_is_q, - ) = mc_diffstar_sfh_galpop(*args) + ) = mc_diffstar_sfh_galpop(*args, lgt0=1.14, fb=0.156) assert default_sfh_q.shape == (n_halos, ntimes) assert np.all(np.isfinite(default_sfh_q)) @@ -140,7 +140,7 @@ def test_all_diffstarpop_u_param_gradients_are_nonzero(): alt_sfh_q, alt_frac_q, mc_is_q, - ) = mc_diffstar_sfh_galpop(*args) + ) = mc_diffstar_sfh_galpop(*args, lgt0=1.14, fb=0.156) assert alt_sfh_q.shape == (n_halos, ntimes) assert np.all(np.isfinite(alt_sfh_q)) @@ -167,7 +167,7 @@ def _loss(u_params): pred_sfh_q, pred_frac_q, mc_is_q, - ) = mc_diffstar_sfh_galpop(*args) + ) = mc_diffstar_sfh_galpop(*args, lgt0=1.14, fb=0.156) pred_mean_sfh_total = jnp.mean( pred_frac_q[:, None] * pred_sfh_q + (1.0 - pred_frac_q[:, None]) * pred_sfh_ms, diff --git a/diffstar/diffstarpop/tests/test_mc_diffstarpop_mgash.py b/diffstar/diffstarpop/tests/test_mc_diffstarpop_mgash.py index eccbc68..4b46c52 100644 --- a/diffstar/diffstarpop/tests/test_mc_diffstarpop_mgash.py +++ b/diffstar/diffstarpop/tests/test_mc_diffstarpop_mgash.py @@ -55,7 +55,7 @@ def test_mc_diffstar_sfh_singlegal_evaluates(): ran_key, tarr, ) - _res = mcdsp.mc_diffstar_sfh_singlegal(*args) + _res = mcdsp.mc_diffstar_sfh_singlegal(*args, lgt0=1.14, fb=0.156) params_ms, params_q, sfh_ms, sfh_q, frac_q, mc_is_q = _res assert np.all(frac_q >= 0) assert np.all(frac_q <= 1) @@ -147,6 +147,8 @@ def test_mc_diffstar_sfh_galpop(): gyr_since_infall, ran_key, t_table, + lgt0=1.14, + fb=0.156, ) sfh_q, sfh_ms, frac_q = _res[2:5] From 1ad5e3e8386ce95593ecf11eceb30f95fc010531 Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sun, 23 Nov 2025 12:52:53 -0600 Subject: [PATCH 3/8] Update demo diffstar notebook [skip ci] --- .../demo_diffmahpop_diffstarpop_sfh.ipynb | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/docs/source/demo_diffmahpop_diffstarpop_sfh.ipynb b/docs/source/demo_diffmahpop_diffstarpop_sfh.ipynb index 0b95dbc..0ec8969 100644 --- a/docs/source/demo_diffmahpop_diffstarpop_sfh.ipynb +++ b/docs/source/demo_diffmahpop_diffstarpop_sfh.ipynb @@ -83,7 +83,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "from jax import jit as jjit\n", "from jax import numpy as jnp\n", "from jax import random as jran\n", @@ -91,7 +90,8 @@ "\n", "# Some constants\n", "from dsps.constants import T_TABLE_MIN\n", - "from diffstar.defaults import LGT0, TODAY\n" + "from diffstar.defaults import LGT0 as DEFAULT_LGT0\n", + "TODAY = 10**DEFAULT_LGT0" ] }, { @@ -202,13 +202,15 @@ "source": [ "from diffmah.diffmah_kernels import mah_halopop\n", "from diffstar.diffstarpop import mc_diffstar_sfh_galpop\n", + "from diffstar.defaults import FB as DEFAULT_FB\n", + "\n", "\n", "# Create a table of times where to calculate the MAH and SFH\n", "ntimes = 50\n", "tarr = np.linspace(T_TABLE_MIN, TODAY, ntimes)\n", "\n", "# Calculate the mass accreation history of every halo\n", - "dmhdt_fit, log_mah_fit = mah_halopop(subcat.mah_params, tarr, LGT0)\n", + "dmhdt_fit, log_mah_fit = mah_halopop(subcat.mah_params, tarr, DEFAULT_LGT0)\n", "\n", "# Manually set the infall data of each halo to no infall,\n", "# since this part of the Diffstarpop model has not been calibrated\n", @@ -239,7 +241,7 @@ " default_sfh_q,\n", " frac_q,\n", " mc_is_q,\n", - ") = mc_diffstar_sfh_galpop(*args)\n", + ") = mc_diffstar_sfh_galpop(*args, lgt0=DEFAULT_LGT0, fb=DEFAULT_FB)\n", "\n", "# select at random if a galaxy is MS or Q based on frac_q.\n", "default_sfh = np.zeros_like(default_sfh_ms) \n", @@ -350,7 +352,8 @@ " range_log_mah_fit = np.percentile(log_mah_fit[sel], [15.865, 84.135], axis=0)\n", " \n", " ax[0].plot(tarr, mean_log_mah_fit, color=colors[i])\n", - " ax[0].fill_between(tarr, range_log_mah_fit[0], range_log_mah_fit[1], color=colors[i], alpha=0.1)\n", + " ax[0].fill_between(tarr, range_log_mah_fit[0], range_log_mah_fit[1], \n", + " color=colors[i], alpha=0.1)\n", "\n", "for k, params in enumerate([DIFFSTARPOP_UM, DIFFSTARPOP_TNG, DIFFSTARPOP_GALCUS]):\n", " # compute SFHs for the default galaxy population\n", @@ -373,19 +376,23 @@ " default_sfh_q,\n", " frac_q,\n", " mc_is_q,\n", - " ) = mc_diffstar_sfh_galpop(*args)\n", + " ) = mc_diffstar_sfh_galpop(*args, lgt0=DEFAULT_LGT0, fb=DEFAULT_FB)\n", "\n", " default_sfh = np.zeros_like(default_sfh_ms) \n", " default_sfh[mc_is_q] = default_sfh_q[mc_is_q]\n", " default_sfh[~mc_is_q] = default_sfh_ms[~mc_is_q]\n", "\n", " for i, mpeak in enumerate(mpeak_vals):\n", - " sel = (subcat.logmp0 > mpeak - 0.2) & (subcat.logmp0 < mpeak + 0.2)\n", + " sel = (subcat.logmp0 > mpeak - 0.2) \n", + " sel = sel & (subcat.logmp0 < mpeak + 0.2)\n", " mean_default_sfh = np.mean(default_sfh[sel], axis=0)\n", - " range_mean_default_sfh = np.percentile(default_sfh[sel], [15.865, 84.135], axis=0)\n", + " range_mean_default_sfh = np.percentile(\n", + " default_sfh[sel], [15.865, 84.135], axis=0)\n", " \n", " ax[k+1].plot(tarr, mean_default_sfh, color=colors[i])\n", - " ax[k+1].fill_between(tarr, range_mean_default_sfh[0], range_mean_default_sfh[1], color=colors[i], alpha=0.1)\n", + " ax[k+1].fill_between(\n", + " tarr, range_mean_default_sfh[0], range_mean_default_sfh[1], \n", + " color=colors[i], alpha=0.1)\n", "\n", "\n", "ax[0].set_ylim(9, 14)\n", @@ -428,7 +435,7 @@ ], "metadata": { "kernelspec": { - "display_name": "diffstuff", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -442,7 +449,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.9" } }, "nbformat": 4, From 309d66cd92fdfc46c37aea809ba3a1892f365d2a Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sun, 23 Nov 2025 13:01:07 -0600 Subject: [PATCH 4/8] Update demo_diffstar_sfh.ipynb [skip ci] --- docs/source/demo_diffstar_sfh.ipynb | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/source/demo_diffstar_sfh.ipynb b/docs/source/demo_diffstar_sfh.ipynb index 416b8f9..0d078d0 100644 --- a/docs/source/demo_diffstar_sfh.ipynb +++ b/docs/source/demo_diffstar_sfh.ipynb @@ -60,7 +60,9 @@ "from diffmah.defaults import DEFAULT_MAH_PARAMS\n", "from diffstar.defaults import DEFAULT_DIFFSTAR_PARAMS\n", "\n", - "today_gyr = 13.8 \n", + "today_gyr = 13.8\n", + "LGT0 = np.log10(today_gyr)\n", + "DEFAULT_FB = 0.156\n", "tarr = np.linspace(0.9, today_gyr, 100)" ] }, @@ -74,7 +76,8 @@ "from diffstar import calc_sfh_singlegal\n", "\n", "sfh_gal = calc_sfh_singlegal(\n", - " DEFAULT_DIFFSTAR_PARAMS, DEFAULT_MAH_PARAMS, tarr)" + " DEFAULT_DIFFSTAR_PARAMS, DEFAULT_MAH_PARAMS, tarr, \n", + " lgt0=LGT0, fb=DEFAULT_FB)" ] }, { @@ -163,6 +166,7 @@ " gyr_since_infall,\n", " sfh_key,\n", " tarr,\n", + " lgt0=LGT0, fb=DEFAULT_FB\n", ")\n", "\n", "print(mc_diffstar_result._fields)" @@ -183,7 +187,10 @@ "metadata": {}, "outputs": [], "source": [ - "sfh = np.where(mc_diffstar_result.mc_is_q.reshape((n_halos, 1)), mc_diffstar_result.sfh_q, mc_diffstar_result.sfh_ms)" + "sfh = np.where(\n", + " mc_diffstar_result.mc_is_q.reshape((n_halos, 1)), \n", + " mc_diffstar_result.sfh_q, mc_diffstar_result.sfh_ms\n", + ")" ] }, { @@ -205,11 +212,19 @@ "ylabel = ax.set_ylabel(r'${\\rm SFR\\ [M_{\\odot}/yr]}$')\n", "ax.set_xticks(np.arange(1.0, 14.0, 2.0))\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de5b95cd-96e8-4082-ba86-6c1f2a55c123", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "diffstuff", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -223,7 +238,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.9" } }, "nbformat": 4, From 8b5bf931f487ba0d9c12d4710f0b5b70dc3ad689 Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sun, 23 Nov 2025 13:27:41 -0600 Subject: [PATCH 5/8] update changelog --- CHANGES.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5bb2eaf..72b96c3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,8 @@ +1.0.2 (unreleased) +------------------ +- Monte Carlo SFH generators now have required kwargs lgt0 and fb (https://github.com/ArgonneCPAC/diffstar/pull/108) + + 1.0.1 (2025-11-02) ------------------ - Update scaling relations and recalibrate default parameters (https://github.com/ArgonneCPAC/diffstar/pull/106) From 4ab89c29ff954813c7ea5fe4a4c6757b68137c34 Mon Sep 17 00:00:00 2001 From: Andrew Hearin Date: Sun, 23 Nov 2025 13:32:18 -0600 Subject: [PATCH 6/8] Rename testing workflows --- .github/workflows/linting.yaml | 4 ++-- .github/workflows/monthly-warning-test.yaml | 4 ++-- .github/workflows/test_releases.yaml | 4 ++-- .github/workflows/tests_cron.yaml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/linting.yaml b/.github/workflows/linting.yaml index 16ec46d..6fe30b6 100644 --- a/.github/workflows/linting.yaml +++ b/.github/workflows/linting.yaml @@ -1,4 +1,4 @@ -name: linting +name: Flake8 test of source code on: push: @@ -8,7 +8,7 @@ on: jobs: tests: - name: lintest + name: flake8 diffstar runs-on: "ubuntu-latest" steps: diff --git a/.github/workflows/monthly-warning-test.yaml b/.github/workflows/monthly-warning-test.yaml index a371090..32dc135 100644 --- a/.github/workflows/monthly-warning-test.yaml +++ b/.github/workflows/monthly-warning-test.yaml @@ -1,4 +1,4 @@ -name: Test for Warnings +name: Monthly test for warnings on: workflow_dispatch: null @@ -8,7 +8,7 @@ on: jobs: tests: - name: tests + name: pytest with diffmah/dsps/diffsky@main runs-on: "ubuntu-latest" steps: diff --git a/.github/workflows/test_releases.yaml b/.github/workflows/test_releases.yaml index 05b2de9..366d870 100644 --- a/.github/workflows/test_releases.yaml +++ b/.github/workflows/test_releases.yaml @@ -1,4 +1,4 @@ -name: tests +name: Test against latest diffstuff releases on: workflow_dispatch: null @@ -9,7 +9,7 @@ on: jobs: tests: - name: tests + name: pytest with latest releases on conda-forge runs-on: "ubuntu-latest" steps: diff --git a/.github/workflows/tests_cron.yaml b/.github/workflows/tests_cron.yaml index 5bed46d..9e6f451 100644 --- a/.github/workflows/tests_cron.yaml +++ b/.github/workflows/tests_cron.yaml @@ -1,4 +1,4 @@ -name: test_main_branch_dependencies +name: Weekly cron testing on: workflow_dispatch: null @@ -12,7 +12,7 @@ on: jobs: tests: - name: tests + name: pytest with diffmah/dsps/diffsky@main runs-on: "ubuntu-latest" steps: From 72eddc925c9510e4bf5d4503039170acd5585b14 Mon Sep 17 00:00:00 2001 From: Alex Alarcon Date: Mon, 15 Dec 2025 17:53:22 +0100 Subject: [PATCH 7/8] Modifying mstar_ssfr_loss_mgash_anyz.py script to use fb and lgt0 as input parameters. Make all loss_data scripts now create and accept these two additional parameters. --- .../mstar_ssfr_loss_mgash_anyz.py | 6 ++ .../tests/test_mstar_ssfr_loss_mgash_anyz.py | 6 ++ .../loss_kernels_testing_data_10halos.h5 | Bin 214464 -> 213272 bytes .../fit_get_loss_helpers_mgash.py | 74 +++++++++++------- 4 files changed, 59 insertions(+), 27 deletions(-) diff --git a/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py b/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py index b5c2a41..971d5bf 100644 --- a/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py +++ b/diffstar/diffstarpop/loss_kernels/mstar_ssfr_loss_mgash_anyz.py @@ -121,6 +121,8 @@ def mstar_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, logmstar_bins, target_mstar_pdf, ) = loss_data @@ -239,6 +241,8 @@ def mstar_ssfr_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins, @@ -355,6 +359,8 @@ def mstar_ssfr_sat_kern_tobs(u_params, loss_data): gyr_since_infall, ran_key, tobs_target, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins, diff --git a/diffstar/diffstarpop/loss_kernels/tests/test_mstar_ssfr_loss_mgash_anyz.py b/diffstar/diffstarpop/loss_kernels/tests/test_mstar_ssfr_loss_mgash_anyz.py index 3aa8923..8fc0fb7 100644 --- a/diffstar/diffstarpop/loss_kernels/tests/test_mstar_ssfr_loss_mgash_anyz.py +++ b/diffstar/diffstarpop/loss_kernels/tests/test_mstar_ssfr_loss_mgash_anyz.py @@ -91,6 +91,8 @@ def test_h5_data_shapes_and_sanity(loss_data_mstar, loss_data_ssfr, loss_data_ss gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) = loss_data_mstar @@ -122,6 +124,8 @@ def test_h5_data_shapes_and_sanity(loss_data_mstar, loss_data_ssfr, loss_data_ss _, _, _, + _, + _, ndbins_lo, ndbins_hi, logmstar_bins_pdf2, @@ -148,6 +152,8 @@ def test_h5_data_shapes_and_sanity(loss_data_mstar, loss_data_ssfr, loss_data_ss _, _, _, + _, + _, ndbins_lo_s, ndbins_hi_s, logmstar_bins_pdf_s, diff --git a/diffstar/diffstarpop/loss_kernels/tests/testing_data/loss_kernels_testing_data_10halos.h5 b/diffstar/diffstarpop/loss_kernels/tests/testing_data/loss_kernels_testing_data_10halos.h5 index b375b9783afd9c90e888405a7ee2e3c2126227a3..47b080e6991c773061907999ca5234f4aa55dd35 100644 GIT binary patch delta 73249 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≷Q5UPuGq2o`pp-O!0Q!9`O0`aFcsTrXqVxA#K*Yz_$s-bq$YmJovq{e z4Kn${Bi8bPV@~1?zDfKeUE|gfJJdgR8z1a;bUfCRd=_CnJB&*M! z;tlpyKF0H=Isf5}qtshqT`P?*wZFS@S#Pw%T|7S4s0hmo)?Dz2n_hu+J#}p?M2Xzf{f8fR*xuOd3ZJ(#CmzRN*slp+;kqtyzg>Z-{sr#^UIESUO%l6Z>%#KQ9QouHvi?~qZJP< z)(x>#_j&D%?X~uw!yE2AwHHevvPmOn4#ER0VmjWy^g=8?z|N|ccwy=(4}9ge4qOU8 zcb6+7?G^^%bqls!#&XfLk9d8o-7>uX%JCw+PElfy=SzC?1*cs^G`1^jen37hso6`e zcpzlUU2J&aOJBV4nJ(Vgf$65ZSbv%|1J6I~?}EoarSk2!W|A4+Ft8oprY~;b5>e#g z6WDHK{BA63hn~fL5~o*Soxcf~|D#>`0&%bNe7r$Qv#D4-mDGamo#+Z!(|tkA@cypAu&(j|#&HlfFFVmp(8Kk>M}=2~oj zc|TwI!~(WFjVmbfH-P*9-D$V*hHfqSlSdZTUN266DKakxL#KbZRFoTbx1wtBm}6$ zbh)hp=_i}R|sII1|mW(~9saYkI$IU zQC|{sPDjzXo_ELN7B&z~{(O+nUqvWQ<354Nr}NE*de{8!C23CF>Wa3O2{}D9zN&8NrJk_VL?fp4{{y>I B$65dY diff --git a/scripts/diffstarpop_scripts/fit_get_loss_helpers_mgash.py b/scripts/diffstarpop_scripts/fit_get_loss_helpers_mgash.py index d8c8bb8..8699aa9 100644 --- a/scripts/diffstarpop_scripts/fit_get_loss_helpers_mgash.py +++ b/scripts/diffstarpop_scripts/fit_get_loss_helpers_mgash.py @@ -4,12 +4,12 @@ import h5py import numpy as np from diffmah.diffmah_kernels import DiffmahParams, mah_halopop -from diffstar.defaults import LGT0 +from diffstar.defaults import LGT0, FB from jax import random as jran from jax import numpy as jnp -def get_loss_data_smhm(indir, nhalos): +def get_loss_data_smhm(indir, nhalos, lgt0=LGT0, fb=FB): # Load SMHM data --------------------------------------------- print("Loading SMHM data...") @@ -61,7 +61,7 @@ def get_loss_data_smhm(indir, nhalos): t_obs_targets = [] smhm_targets = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -81,7 +81,7 @@ def get_loss_data_smhm(indir, nhalos): t_obs_targets.append(t_target) smhm_targets.append(smhm[i, j]) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) mah_params_data = np.array(mah_params_data) @@ -124,7 +124,7 @@ def get_loss_data_smhm(indir, nhalos): return loss_data, plot_data -def get_loss_data_pdfs_mstar(indir, nhalos): +def get_loss_data_pdfs_mstar(indir, nhalos, lgt0=LGT0, fb=FB): # Load PDF data --------------------------------------------- print("Loading PDF Mstar data...") @@ -195,7 +195,7 @@ def get_loss_data_pdfs_mstar(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -216,7 +216,7 @@ def get_loss_data_pdfs_mstar(indir, nhalos): t_obs_targets.append(t_target) mstar_counts_target.append(mstar_wcounts[i, j] / mstar_wcounts[i, j].sum()) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -239,6 +239,8 @@ def get_loss_data_pdfs_mstar(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) @@ -261,7 +263,7 @@ def get_loss_data_pdfs_mstar(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -282,7 +284,7 @@ def get_loss_data_pdfs_mstar(indir, nhalos): t_obs_targets.append(t_target) mstar_counts_target.append(mstar_wcounts[i, j] / mstar_wcounts[i, j].sum()) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -305,6 +307,8 @@ def get_loss_data_pdfs_mstar(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) @@ -344,7 +348,7 @@ def prepare_ragged(indx_pdf, nmhalo_pdf, index_mhalo): return idx, w # shapes: (nz, Mmax), (nz, Mmax) -def get_loss_data_pdfs_ssfr_central(indir, nhalos): +def get_loss_data_pdfs_ssfr_central(indir, nhalos, lgt0=LGT0, fb=FB): print("Loading PDF Mstar data...") @@ -431,7 +435,7 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): "zmab,zm->zab", mstar_ssfr_pdfs_cent, mhalo_pdf_cen ) - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) index_mhalo = [] indx_pdf = [] @@ -456,7 +460,7 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): gyr_since_infall_data.append(np.ones(len(arange_sel)) * gyr_since_infall) t_obs_targets.append(t_target) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) index_mhalo_atz.append(j) @@ -514,6 +518,8 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins_pdf, @@ -577,7 +583,7 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): gyr_since_infall_data.append(np.ones(len(arange_sel)) * gyr_since_infall) t_obs_targets.append(t_target) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) index_mhalo_atz.append(j) @@ -635,6 +641,8 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins_pdf, @@ -655,7 +663,7 @@ def get_loss_data_pdfs_ssfr_central(indir, nhalos): return loss_data_ssfr, plot_data -def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): +def get_loss_data_pdfs_ssfr_satellite(indir, nhalos, lgt0=LGT0, fb=FB): print("Loading PDF Mstar data...") @@ -743,7 +751,7 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): indx_pdf = [] _run_indx = 0 - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] index_mhalo_atz = [] @@ -764,7 +772,7 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): gyr_since_infall_data.append(np.ones(len(arange_sel)) * gyr_since_infall) t_obs_targets.append(t_target) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) index_mhalo_atz.append(j) @@ -823,6 +831,8 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins_pdf, @@ -884,7 +894,7 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): gyr_since_infall_data.append(np.ones(len(arange_sel)) * gyr_since_infall) t_obs_targets.append(t_target) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) index_mhalo_atz.append(j) @@ -942,6 +952,8 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, ndbins_lo, ndbins_hi, logmstar_bins_pdf, @@ -962,7 +974,7 @@ def get_loss_data_pdfs_ssfr_satellite(indir, nhalos): return loss_data_ssfr_sat, plot_data -def get_loss_data_pdfs_mstar_cen(indir, nhalos): +def get_loss_data_pdfs_mstar_cen(indir, nhalos, lgt0=LGT0, fb=FB): # Load PDF data --------------------------------------------- print("Loading PDF Mstar for centrals data...") @@ -1037,7 +1049,7 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -1060,7 +1072,7 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): mstar_wcounts_cen[i, j] / mstar_wcounts_cen[i, j].sum() ) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -1083,6 +1095,8 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) @@ -1105,7 +1119,7 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -1128,7 +1142,7 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): mstar_wcounts_cen[i, j] / mstar_wcounts_cen[i, j].sum() ) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -1151,6 +1165,8 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) @@ -1168,7 +1184,7 @@ def get_loss_data_pdfs_mstar_cen(indir, nhalos): return loss_data_mstar, plot_data -def get_loss_data_pdfs_mstar_sat(indir, nhalos): +def get_loss_data_pdfs_mstar_sat(indir, nhalos, lgt0=LGT0, fb=FB): # Load PDF data --------------------------------------------- print("Loading PDF Mstar for satellites data...") @@ -1243,7 +1259,7 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -1266,7 +1282,7 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): mstar_wcounts_sat[i, j] / mstar_wcounts_sat[i, j].sum() ) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -1289,6 +1305,8 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) @@ -1311,7 +1329,7 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): t_obs_targets = [] mstar_counts_target = [] - tarr_logm0 = np.logspace(-1, LGT0, 50) + tarr_logm0 = np.logspace(-1, lgt0, 50) for i in range(len(age_targets)): t_target = age_targets[i] @@ -1334,7 +1352,7 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): mstar_wcounts_sat[i, j] / mstar_wcounts_sat[i, j].sum() ) mah_pars_ntuple = DiffmahParams(*mah_params_samp[:, arange_sel]) - dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, LGT0) + dmhdt_fit, log_mah_fit = mah_halopop(mah_pars_ntuple, tarr_logm0, lgt0) logmp0_data.append(log_mah_fit[:, -1]) # break @@ -1357,6 +1375,8 @@ def get_loss_data_pdfs_mstar_sat(indir, nhalos): gyr_since_infall_data, ran_key_data, t_obs_targets, + lgt0, + fb, logmstar_bins_pdf, mstar_counts_target, ) From 06cd5812ecef08703667864a15f502c01fff2e92 Mon Sep 17 00:00:00 2001 From: Alex Alarcon Date: Mon, 15 Dec 2025 17:53:50 +0100 Subject: [PATCH 8/8] Adding script that generates diffstarpop testing loss_data for test_mstar_ssfr_loss_mgash_anyz.py --- scripts/diffstarpop_scripts/save_loss_data.py | 319 ++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 scripts/diffstarpop_scripts/save_loss_data.py diff --git a/scripts/diffstarpop_scripts/save_loss_data.py b/scripts/diffstarpop_scripts/save_loss_data.py new file mode 100644 index 0000000..e0df86c --- /dev/null +++ b/scripts/diffstarpop_scripts/save_loss_data.py @@ -0,0 +1,319 @@ +""" +save_loss_data.py + +Usage (inside Python): + from save_loss_data import save_loss_data_h5 + save_loss_data_h5("unit_test_loss_data.h5", + loss_data_mstar, + loss_data_ssfr, + loss_data_ssfr_sat) + +This expects you already have the three tuples in memory, in the exact orders shown +in your message. +""" + +from typing import Any, Iterable, Sequence +import numpy as np +import h5py +import json + +from fit_get_loss_helpers_mgash import ( + get_loss_data_smhm, + get_loss_data_pdfs_mstar, + get_loss_data_pdfs_ssfr_central, + get_loss_data_pdfs_ssfr_satellite, +) + +# --- Names in tuple order (so we can label datasets clearly) --- + +MSTAR_FIELDS = [ + "mah_params_data", + "logmp0_data", + "upid_data", + "lgmu_infall_data", + "logmhost_infall_data", + "gyr_since_infall_data", + "ran_key_data", + "t_obs_targets", + "lgt0", + "fb", + "logmstar_bins_pdf", + "mstar_counts_target", +] + +SSFR_FIELDS = [ + "mah_params_data", + "logmp0_data", + "upid_data", + "lgmu_infall_data", + "logmhost_infall_data", + "gyr_since_infall_data", + "ran_key_data", + "t_obs_targets", + "lgt0", + "fb", + "ndbins_lo", + "ndbins_hi", + "logmstar_bins_pdf", + "logssfr_bins_pdf", + "mhalo_pdf_cen_ragged", # ragged allowed + "indx_pdf", + "target_mstar_ids", + "target_data", +] + +SSFR_SAT_FIELDS = [ + "mah_params_data", + "logmp0_data", + "upid_data", + "lgmu_infall_data", + "logmhost_infall_data", + "gyr_since_infall_data", + "ran_key_data", + "t_obs_targets", + "lgt0", + "fb", + "ndbins_lo", + "ndbins_hi", + "logmstar_bins_pdf", + "logssfr_bins_pdf", + "mhalo_pdf_sat_ragged", # ragged allowed + "indx_pdf", + "target_mstar_ids", + "target_data_sat", +] + + +def _to_numpy(x: Any): + """Convert JAX/array-like -> NumPy array without copying if possible.""" + if isinstance(x, np.ndarray): + return x + try: + return np.asarray(x) + except Exception: + return x # leave as-is (e.g., a list of arrays) + + +def _is_array_like(x: Any) -> bool: + return isinstance(x, (np.ndarray,)) or hasattr(x, "__array__") + + +def _is_sequence(x: Any) -> bool: + return isinstance(x, (list, tuple)) + + +def _is_ragged_sequence(seq: Sequence[Any]) -> bool: + """ + Heuristic: sequence of array-like where shapes are not all equal. + Also treat object-dtype arrays as ragged. + """ + if isinstance(seq, np.ndarray) and seq.dtype == object: + return True + if not _is_sequence(seq): + return False + shapes = [] + for el in seq: + if _is_array_like(el): + a = _to_numpy(el) + shapes.append(a.shape) + else: + # Non-array element -> treat as ragged to be safe + return True + return len(set(shapes)) > 1 + + +def _save_value(group: h5py.Group, name: str, value: Any): + """ + Save a single item under group/name. + - Regular ndarrays: one dataset + - Scalar: 0-D dataset + - Ragged sequences: a subgroup with datasets '0000', '0001', ... + - Sequence with equal shapes: stacked into one dataset + """ + # If object-dtype NumPy => likely ragged + if isinstance(value, np.ndarray) and value.dtype == object: + value = list(value) # treat as ragged sequence + + if _is_sequence(value) and _is_ragged_sequence(value): + # Save as subgroup with one dataset per element + sub = group.create_group(name) + for i, el in enumerate(value): + arr = _to_numpy(el) + sub.create_dataset(f"{i:04d}", data=arr) + sub.attrs["format"] = "ragged_list_of_datasets" + sub.attrs["length"] = len(value) + return + + # Non-ragged sequences of equal-shaped arrays -> stack + if _is_sequence(value): + # Convert to array if possible (will stack) + try: + arr = _to_numpy(value) + group.create_dataset(name, data=arr) + return + except Exception: + # Fallback: save as subgroup + sub = group.create_group(name) + for i, el in enumerate(value): + arr = _to_numpy(el) + sub.create_dataset(f"{i:04d}", data=arr) + sub.attrs["format"] = "list_of_datasets" + sub.attrs["length"] = len(value) + return + + # Scalar or array-like + if _is_array_like(value): + arr = _to_numpy(value) + group.create_dataset(name, data=arr) + return + + # Last resort: store JSON-serializable objects as attrs + try: + group.attrs[name] = json.dumps(value) + except Exception: + # If we end up here, user passed a very custom object + # Save a string repr so the test can still load something. + group.attrs[name] = repr(value) + + +def save_loss_data_h5( + filename: str, + loss_data_mstar: Iterable[Any], + loss_data_ssfr: Iterable[Any], + loss_data_ssfr_sat: Iterable[Any], +): + """ + Save three loss-data tuples into an HDF5 file with a clean hierarchy: + + /loss_data_mstar/... + /loss_data_ssfr/... + /loss_data_ssfr_sat/... + + Each dataset is named after the variable (e.g., 'mah_params_data'). + Ragged arrays/lists are stored as a subgroup with one dataset per element. + + Parameters + ---------- + filename : str + Output .h5 path. + loss_data_mstar, loss_data_ssfr, loss_data_ssfr_sat : tuple-like + Tuples exactly matching the field orders defined above. + """ + # Sanity checks on tuple lengths + if len(loss_data_mstar) != len(MSTAR_FIELDS): + raise ValueError( + f"loss_data_mstar length {len(loss_data_mstar)} != {len(MSTAR_FIELDS)}" + ) + if len(loss_data_ssfr) != len(SSFR_FIELDS): + raise ValueError( + f"loss_data_ssfr length {len(loss_data_ssfr)} != {len(SSFR_FIELDS)}" + ) + if len(loss_data_ssfr_sat) != len(SSFR_SAT_FIELDS): + raise ValueError( + f"loss_data_ssfr_sat length {len(loss_data_ssfr_sat)} != {len(SSFR_SAT_FIELDS)}" + ) + + with h5py.File(filename, "w") as f: + # mstar + g_m = f.create_group("loss_data_mstar") + g_m.attrs["field_order"] = json.dumps(MSTAR_FIELDS) + for name, val in zip(MSTAR_FIELDS, loss_data_mstar): + _save_value(g_m, name, val) + + # ssfr (centrals) + g_c = f.create_group("loss_data_ssfr") + g_c.attrs["field_order"] = json.dumps(SSFR_FIELDS) + for name, val in zip(SSFR_FIELDS, loss_data_ssfr): + _save_value(g_c, name, val) + + # ssfr (satellites) + g_s = f.create_group("loss_data_ssfr_sat") + g_s.attrs["field_order"] = json.dumps(SSFR_SAT_FIELDS) + for name, val in zip(SSFR_SAT_FIELDS, loss_data_ssfr_sat): + _save_value(g_s, name, val) + + # File-level note to help future you + f.attrs["description"] = ( + "Unit testing data for mstar/ssfr kernels. Ragged lists are stored as groups " + "with one dataset per element and 'format' attr." + ) + + print(f"Wrote {filename}") + + +# --- Optional: small loader helper for ragged groups (use in tests) --- + + +def load_loss_data_h5(filename: str): + """ + Load the three tuples back from disk. Ragged groups are returned as lists + of NumPy arrays. Returns (loss_data_mstar, loss_data_ssfr, loss_data_ssfr_sat). + """ + + def _load_group(g: h5py.Group, field_names): + out = [] + for name in field_names: + if name in g: + obj = g[name] + if isinstance(obj, h5py.Dataset): + out.append(obj[()]) + elif isinstance(obj, h5py.Group): + fmt = ( + obj.attrs.get("format", "").decode() + if isinstance(obj.attrs.get("format", ""), bytes) + else obj.attrs.get("format", "") + ) + if fmt in ("ragged_list_of_datasets", "list_of_datasets"): + items = [obj[k][()] for k in sorted(obj.keys())] + out.append(items) + else: + # Unknown layout—try datasets in key order + items = [obj[k][()] for k in sorted(obj.keys())] + out.append(items) + else: + raise RuntimeError(f"Unexpected HDF5 object at {g.name}/{name}") + else: + # Might be stored as attr (rare) + if name in g.attrs: + val = g.attrs[name] + try: + out.append(json.loads(val)) + except Exception: + out.append(val) + else: + raise KeyError(f"Field '{name}' not found in group {g.name}") + return tuple(out) + + with h5py.File(filename, "r") as f: + m_fields = json.loads(f["loss_data_mstar"].attrs["field_order"]) + c_fields = json.loads(f["loss_data_ssfr"].attrs["field_order"]) + s_fields = json.loads(f["loss_data_ssfr_sat"].attrs["field_order"]) + + mstar = _load_group(f["loss_data_mstar"], m_fields) + ssfr = _load_group(f["loss_data_ssfr"], c_fields) + ssfr_s = _load_group(f["loss_data_ssfr_sat"], s_fields) + + return mstar, ssfr, ssfr_s + + +indir = ( + "/Users/alarcon/Documents/diffmah_data/mgash/smdpl_dr1_nomerging_pdf_target_data/" +) +nhalos = 10 +loss_data_mstar, plot_data_pdf = get_loss_data_pdfs_mstar(indir, nhalos) +loss_data_ssfr, plot_data_pdf_ssfr_cen = get_loss_data_pdfs_ssfr_central(indir, nhalos) +loss_data_ssfr_sat, plot_data_pdf_ssfr_sat = get_loss_data_pdfs_ssfr_satellite( + indir, nhalos +) +fname = "loss_kernels_testing_data_10halos.h5" +save_loss_data_h5(fname, loss_data_mstar, loss_data_ssfr, loss_data_ssfr_sat) + + +nhalos = 100 +loss_data_mstar, plot_data_pdf = get_loss_data_pdfs_mstar(indir, nhalos) +loss_data_ssfr, plot_data_pdf_ssfr_cen = get_loss_data_pdfs_ssfr_central(indir, nhalos) +loss_data_ssfr_sat, plot_data_pdf_ssfr_sat = get_loss_data_pdfs_ssfr_satellite( + indir, nhalos +) +fname = "loss_kernels_testing_data_100halos.h5" +save_loss_data_h5(fname, loss_data_mstar, loss_data_ssfr, loss_data_ssfr_sat)