Changelog#
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased#
v2.0.0 - 2026-11-12#
Fixed#
The
Releasejob in theMainworkflow now generates the release notes throughuv run, sorelease_notes.pyfinds thepackagingmodule installed in the project environment. Previously it used the system Python and failed after thev2.0.0rc2publish.
v2.0.0rc2 - 2026-11-11#
Fixed#
Replaced the invalid
Topic :: Scientific/Engineering :: Cosmologytrove classifier, which made TestPyPI reject thev2.0.0rc1upload, with valid Astronomy, Physics, Information Analysis and Mathematics topics, and addedOperating System,Python 3 :: OnlyandTyping :: Typedclassifiers. The development status classifier is raised from Alpha to Beta. The version is bumped to2.0.0rc2because the failedv2.0.0rc1tag cannot be reused.
v2.0.0rc1 - 2026-11-11#
Added#
scripts/maintenance/release/release.shrewritten as a guarded, step-by-step release helper: it requires a clean, up-to-datemain, checks that the tag does not exist and thatversion.pyandCITATION.cffagree, explains and confirms each step, commits onlyCHANGELOG.md, creates the tag, supports--dry-runand--yes, and never pushes (it prints the push commands and the post-release checks instead).Release guide
docs/source/releasing.md(TestPyPI and PyPI flow, one-time setup, recovery), replacing the outdateddocs/RELEASE_PROCESS.md.scripts/maintenance/release/check_version_consistency.pyand aMetadataCI task that fail when theversion:entry ofCITATION.cffdiffers fromcosmicjellyfish/version.py.environment.ymlformamba/condausers (conda-forgechannel, versions mirroringpyproject.toml), documented in the installation guide and README.
Removed#
requirements.txt. It had drifted frompyproject.toml(unpinned NumPy, a pinneduv, no JAX extras) and nothing used it;pyproject.tomlis the single source of truth forpip/uv, andenvironment.ymlcovers conda.
Changed#
Package version bumped to
2.0.0rc1(first PyPI release candidate of the 2.0 series, which covers thecosmicfishpietocosmicjellyfishrename, the JAX backend and the symbolic backend overhaul). The legacy1.3.1heading now uses the## [vX.Y.Z]format thatrelease_notes.pyexpects.Prepare PyPI publishing.
symbolic-pofkis no longer a direct-URL dependency of the package (PyPI rejects those);code="symbolic"now raises anImportErrorwith install instructions (pip install git+https://github.com/DeaglanBartlett/symbolic_pofk.git) when it is missing. Source checkouts keep installing it throughuv(default dependency group, unpinned upstream repository). The release workflow now uses PyPI Trusted Publishing:rctags and manual runs go to TestPyPI, finalvX.Y.Ztags to PyPI, replacing the stored-passwordtwine upload.
Fixed#
Review fixes for the PyPI preparation: the publish jobs check out with
persist-credentials: false; the legacy symbolic backend only shows thesymbolic_pofkinstall hint whensymbolic_pofkitself is missing (a missingcolossusis reported as such);environment.ymlusesnodefaultsand provides conda-forgegcc,gxxandmake(the commands the source-builtclassycalls by name);release.shaccepts multi-wordPYTHONvalues such asPYTHON="uv run python"and keeps an executable path with spaces as one argument; the macOS SDK prerequisite for the source-builtclassyis documented. Tests cover the import-error paths.Align metadata and docs:
CITATION.cffnow carries version 1.3.1 and all four authors (matchingpyproject.tomland the docs BibTeX entry), the comprehensive guide no longer says JAX is not implemented, and the README feature list mentions JAX autodiff.Normalise GCsp Fisher parameter axes before covariance inversion and nuisance marginalisation so physical
Asunits do not suppress other uncertainties; use a purely relative finite-difference step for physicalAsin the final Jacobian; makejacobian_from_functionraise on non-finite finite-difference columns. Recommend10^9Asfor forecasts.Harden Fisher Jacobian inputs and aliases, preserve numeric-string cosmology fiducials, report infinite uncertainties for unconstrained redshift bins and null combinations, and map
As/10^9Asaliases in direct comparisons without changing relative steps.Respect explicit
omch2fiducials without conflicting defaultOmegamvalues.Add a two-stage GCsp forecast in intermediate parameters, following Euclid preparation VII, section 4.2.1 (
cosmicjellyfish.LSSsurvey.gcsp_intermediate). Shape parameters(omegab, h, omegam, ns)and per-binln D_A,ln H,ln fsigma8,ln bsigma8andP_sare differentiated with JAX autodiff or paper-style finite differences, nuisances are marginalised, and the result is projected onto the final cosmological parameters withF = J^T F J. Matches the direct Fisher forecast to about 1e-12.TheoryTablesnow exposes an optionalsigma8(z).Add
reparametriseandjacobian_from_functiontocosmicjellyfish.analysis.fisher_operationsfor general Fisher-space Jacobian reparametrisations (in contrast to the covariance pull-back offisher_derived).Add the
gcsp_intermediatedocumentation page with figures and the notebook08-GCsp-intermediate-parameters.ipynb. Fix a doctest directive injaxcosmo_derivativesthat newer Python versions reject.Add the CosmicJellyfish logo, theme-aware README and documentation banners, navbar icons, landing-page wordmark and updated favicons.
Move the YAML sampler examples to
scripts/likelihood/sampler/, remove the bundled chain samples, and document cjfp-data downloads and validation workflows with a real chain-metadata example. The default sampler output remains./chains/.Rename the distribution and import package from
cosmicfishpietocosmicjellyfish.import cosmicfishpiekeeps working through a deprecated compatibility alias that resolves to the same module objects, so configuration state, class identities and old pickles are preserved. Theneutrino_scheme: cosmicfishpiesetting is still accepted.Reject non-finite
jaxcosmodensities and dark-energy parameters, detect conflictingns/n_saliases, normalize integral sample counts to integers, and check array-valuedsigmap_*/sigmav_*fiducials for unsupported rescaling.Tighten
jaxcosmoinput validation for conflicting density, expansion-rate, and dark-energy aliases; reject invalidhand fractional sample counts. Permit unchanged unitsigmap_*/sigmav_*fiducials while rejecting unsupported non-unit rescaling.Tighten the
jaxcosmoguards after review: check every neutrino alias, reject density keys the backend ignores, require a positive finite primordial amplitude, enforce minimumNUMERICSgrid sizes, validatedistance_stepsbefore truncation, refuse a conflictingw0/waundercosmo_model="LCDM", compare fiducial overrides to near-machine precision, take the spectroscopic fiducialhfrom the resolved cosmology, reject the unimplementedrescale_sigma_pvparameters, and require a finite non-zero--fd-step. A Halofit bracket with no root now returnsNaNso the provider rejects it.Upgrade the development Black requirement to
>=26.5.1,<27.0, apply its formatting with an explicit Python 3.10 target, and refresh the development dependency lockfile.Validate
jaxcosmoinputs further: reject theta-like expansion parameters, conflicting amplitude aliases and non-positivesigma8; fail when the Halofit nonlinear scale has no root instead of returning a spurious spectrum; keep the wavenumber axis in the Halofit output; accept only GCph+WL or GCsp per derivative request, and differentiatePs_*shot-noise parameters with the JAX Jacobian rather than the legacy analytic formulas.Harden the
jaxcosmobackend in response to review: reject the unsupportedclusteringtracer, non-integerdistance_stepsand non-zero neutrino densities; validate only the probes each observable was asked for; keep the WL kernel finite at a zero bin edge; parsePs_*shot-noise bins from their names; honoursettings["nonlinear"]; and make the photometric comparison report reference spectra that the candidate is missing.Test the JAX photometric observable against the legacy
ComputeCls: the fiducialC_ell, a shifted cosmology and shifted bias / intrinsic-alignment amplitudes agree tomax |dC|/max|C| < 1e-3(observed ~2e-5), and the autodiff derivatives match central differences of the same observable. This takesjaxcosmo_photofrom 16% to 92% coverage.CI and docs for the
jaxcosmobackend: add atest (jaxcosmo)job that installs thejaxcosmoextra and runs the JAX tests (they skip themselves in the default job, where JAX is not installed), uploading coverage with thejaxcosmoCodecov flag; mockjaxandjax_cosmoin the Sphinx build (autodoc_mock_imports) so the strict API docs build succeeds without the extra.Document that the roughly 10% difference in the marginalized
10^9Aserror between SYREN-NEW and JAXcosmo is a matter-power-model difference, not an implementation or differentiation artefact: unmarginalized errors agree to 2.6%, the gap appears through galaxy-bias marginalization, and putting the SYREN-NEW power spectrum inside the JAX observable reproduces the SYREN result to 0.08% (scripts/validation/compare_theory_amplitude_response.py). Also document why two “Eisenstein-Hu” models still differ: SYREN-NEW is the no-wiggle fit times a fitted correction to the true linear spectrum, and feeding Halofit with that linear shape reproduces the sign and most of the size of the gap.Document the JAXcosmo backend, AD/FD providers and configuration in the user guide, with a downloadable photometric comparison notebook against SYREN-NEW. Its Fisher comparison keeps
nsfixed while retaining the spectral-index response diagnostic.Add the optional, differentiable
jaxcosmobackend (options["code"] = "jaxcosmo", install withpip install 'cosmicjellyfish[jaxcosmo]'):jax-cosmobackground, Eisenstein-Hu + Halofit total-matter power (flat, massless neutrinos), and a JAX port of thesymbolic_pofk10^9As -> sigma8fit. A backend-neutral differentiable theory interface (cosmology/jax_theory.py) lets JAX observables stay independent of the selected backend. JAX-native photometric (GCph+WL,LSSsurvey/jaxcosmo_photo.py) and spectroscopic (GCsp,LSSsurvey/jaxcosmo_spectro.py) observables reproduce the standard Limber and P(k, mu) calculations, withfishermatrix.jaxcosmo_derivativesproviders:JaxAutodiffProvidergives exact forward-mode derivatives andJaxFiniteDifferenceProviderapplies the standard finite-difference engine to the same observable, so autodiff and finite differences can be validated against each other and against the legacy pipeline (scripts/validation/compare_jax_*_fishers.py). Both are wired throughFisherMatrix(derivative_provider=...). CMB, clustering/CB tracers and massive neutrinos are explicitly rejected.Use a smooth Halofit root find in the
jaxcosmotheory layer:jax-cosmolocates the nonlinear scale by interpolatingsigma(R) = 1on a fixed 256-node grid, which makes the derivative of the power spectrum jump between nodes and spoils finite differences even at small steps. The replacement integratessigma^2(R)on a fine grid and solves it with a fixed-count Newton iteration, which converges to machine precision. The values stay within 5e-4 ofjax-cosmoat the fiducial point and within 0.6% over the validation parameter box (the difference isjax-cosmo’s own interpolation error in the nonlinear scale), while being differentiable.Review fixes for the
jaxcosmobranch (seedocs/source/jaxcosmo_review.md): correct orientation of the Savitzky-Golay operator in the JAX spectroscopic observable (fiducialln Pagreement with the legacy code improves from 8e-5 to 2e-6); observable cache of the derivative providers keyed on the full analysis configuration;kh_rescaling_bugoptions andAP_effect=Falsehandled like the legacyobserved_Pgg; newNUMERICS.legacy_pk_clampoption reproducing the table-edge clamp of the legacy power spline; tests for the theory layer, option branches and providers.Support NumPy 2: replace the
numpy<2pin withnumpy>=2.1,<2.3(NumPy 1.x installs must upgrade to 2.1 or newer) (2.2.x is the newest series supporting Python 3.10), relock, and compute the legacyround_decimals_upbranch in float64 to keep results identical under NEP 50 promotion rules. Full Fisher backend validation against the NumPy 1 results is run separately.Add
fishconsumer.make_fisher_chain_plotfor paired Fisher/posterior overlays, with marginalization to plotted parameters, matched colors for missing-chain cases, independentshow_fisher/show_chainsswitches, and per-call limits using Gaussian-equivalent weighted posterior quantiles (3 sigma by default).Build sampler analysis and worker contexts with the configured prior parameters, preventing nondefault coordinates such as
10^9Asfrom being dropped.Translate public dimensionless
Asto CLASSA_sand order-one10^9Asto CAMBAs(CLASS/SYREN-NEW already support it), label amplitude coordinates consistently, and preserve small fiducials in Fisher parameter-file exports. EE2 now reads the exact computed CLASS amplitude instead of interpolating primordial-grid values near its hard amplitude bounds.Restore matched CAMB/CLASS nonlinear cb subtraction and the shared default neutrino-density factor, retaining nonlinear-grid hardening. Native CLASS cb remains opt-in; see
docs/source/neutrino_cb_regression.mdfor local evidence.Migrate the documentation to the PyData Sphinx Theme with a card-based landing page, Getting started / User guide / Tutorials / API / Development sections, autosummary-generated per-module API pages, a new
docsextra (uv sync --extra docs), a build-only docs CI job, and warnings-as-errors builds. Fix docstrings that broke the API build.Publish the documentation to the
docs/folder ofgh-pageswith a newdocs.ymlGitHub Actions workflow (on pushes tomainand version tags) and retire Read the Docs (.readthedocs.yamlremoved).Vectorize the photometric Cl pipeline (row-wise
sqrtP_limber, cached kernels and window factors) for up to ~6x faster Fisher matrix computation with the symbolic backend; seedocs/source/photometric_optimization_results.md.Generalize the Nautilus sampler to a registered-likelihood-component architecture, fix spawn-safety for multiprocessing worker pools, and add Slurm launch scripts for HPC runs.
Validate WL/GCsp/joint Nautilus likelihoods against Fisher forecasts; see
docs/source/likelihood_validation.md.Fix a CLASS/HMcode nonlinear power spectrum error at z=6, normalize CAMB input paths, and various spectro/base likelihood and job-handling fixes.
Remove the unused Ray options
parallelandparallel_cpusofFisherMatrixand theray_sessionhelper.Default
survey_name_radio_IMto the shippedSKAO-IM-Redbook, and look up survey specification files inother_survey_specificationswhen they are not found inspecs_dir.Use the standard
Neff = 3.044for CAMB when the fiducial cosmology has noNeff.Warn when the
POLYorSTEMderivative methods are used with non-photometric probes, or4PT_FWDwith CMB probes.Nautilus sampler: do not modify the caller’s config, write the real package version to the metadata, store an evidence of 0.0, warn about priors that are ignored, raise a clear error with fewer than two sampled parameters, add an
overwriteoption to resample an existing run, and exportload_chain_metadata.Parse MontePython parameter files with
ast.literal_evalinstead ofevaland fix theFishConsumerchain-loading docstrings.Point the validation dashboard links to
https://www.santicasas.space/cosmicjellyfish/dashboard/.Add explicit analysis context runtime isolation and refresh the comprehensive guide.
Symbolic backend overhaul to the new syren emulators, pinning the
symbolic-pofkGitHub tarball in CI instead of a local editable path.Expose derivatives on
FisherMatrix, add CLASS EE2 profiles, and harden nonlinear spectra handling.Reorganize
scripts/into category subfolders and notebooks into a numbered workflow (legacy notebooks archived); add backend validation and symbolic provenance docs pages.
v1.3.1#
Add the CAMB/CLASS validation suite, threshold-aware dashboard, and manual GitHub Pages publication workflow.
1.3.0 : Performance optimization in Photo module and benchmarking scripts 1.2.8 : Added compehensive test catalogue. 1.2.7 : Added test for analysis module 1.2.6 : New demo notebook GCsp 1.2.5 : Likelihood modules tested for photo and spectro 1.2.4 : Discontinued support for python3.8. Fixed the style for likelihood scripts. 1.2.3 : Added a new likelihood function for photometric and spectroscopic surveys. 1.2.2 : Galaxy sample split for sources and lenses. Feedback prints more consistent. 1.2.1 : Updating configs of other surveys: SKAO, DESI, LSST to work in new config file structure 1.2.0 : Big update of configuration, specification yamls and nuisance parameter interface. No backwards compatibility of yamls! 1.1.4 : Coverage reports with Codecov 1.1.3 : New split up demonstration notebooks 1.1.2 : Coverage badge 1.1.1 : Resolved gcsp bias bug, new test suite. 1.1.0 : Implemented symbolic as a new boltzmann solver class. Fixes of feedback prints. More docstrings. 1.0.8 : Overview documentation and initial tests 1.0.7 : Added a new installation script to download external data from the github
1.0.6 : Restructured default parameters for EBS and Survey Specifications
1.0.5 : Removed a backwards compatibility issue with older version of numpy. Switched Integration to use scipy now
1.0.4 : Merged changes from the old repo to the release repo. Mainly changes to the plotting routine Added new external file for nonlinear power spectra New options for spectroscopic error. Removed infamous h-bug
1.0.3 : Added documentation for the cosmicjellyfish.fishermatrix submodule
1.0.2 : Added documentation for the cosmicjellyfish.LSSsurvey submodule
1.0.1 : Bugfix for external file reading for release notebooks.
Change is False statements with a normal not to catch False-equivalents.