From ed8329841a64c790677e8bfa42c38f2b6492da3b Mon Sep 17 00:00:00 2001 From: "niko.sarcevic" Date: Sat, 27 Jun 2026 09:24:18 -0400 Subject: [PATCH 1/3] fixed sign convnetion in ccl backend --- .gitignore | 11 ++++++ docs/_build/html/index.html | 10 ----- .../ccl/__pycache__/__init__.cpython-312.pyc | Bin 254 -> 0 bytes .../ccl/__pycache__/builder.cpython-312.pyc | Bin 8154 -> 0 bytes .../__pycache__/halo_model.cpython-312.pyc | Bin 13615 -> 0 bytes .../ccl/__pycache__/la.cpython-312.pyc | Bin 2845 -> 0 bytes .../ccl/__pycache__/nla.cpython-312.pyc | Bin 2857 -> 0 bytes .../ccl/__pycache__/tatt.cpython-312.pyc | Bin 10038 -> 0 bytes src/plima/backends/ccl/la.py | 13 +++++-- src/plima/backends/ccl/nla.py | 35 +++++++++++++----- ...s_ccl_builder.cpython-312-pytest-8.4.2.pyc | Bin 63851 -> 0 bytes ...cl_halo_model.cpython-312-pytest-8.4.2.pyc | Bin 28277 -> 0 bytes ...ckends_ccl_la.cpython-312-pytest-8.4.2.pyc | Bin 21960 -> 0 bytes ...kends_ccl_nla.cpython-312-pytest-8.4.2.pyc | Bin 22007 -> 0 bytes ...ends_ccl_tatt.cpython-312-pytest-8.4.2.pyc | Bin 40283 -> 0 bytes .../test_import.cpython-312-pytest-8.4.2.pyc | Bin 168 -> 0 bytes ...els_discovery.cpython-312-pytest-8.4.2.pyc | Bin 15698 -> 0 bytes ...ls_halo_model.cpython-312-pytest-8.4.2.pyc | Bin 30693 -> 0 bytes ...models_hybrid.cpython-312-pytest-8.4.2.pyc | Bin 175 -> 0 bytes ...est_models_la.cpython-312-pytest-8.4.2.pyc | Bin 45484 -> 0 bytes ...odel_registry.cpython-312-pytest-8.4.2.pyc | Bin 20013 -> 0 bytes ...st_models_nla.cpython-312-pytest-8.4.2.pyc | Bin 34554 -> 0 bytes ...t_models_tatt.cpython-312-pytest-8.4.2.pyc | Bin 18208 -> 0 bytes ...ils_constants.cpython-312-pytest-8.4.2.pyc | Bin 7365 -> 0 bytes ...ls_converters.cpython-312-pytest-8.4.2.pyc | Bin 7457 -> 0 bytes ...t_utils_types.cpython-312-pytest-8.4.2.pyc | Bin 4052 -> 0 bytes ...ls_validators.cpython-312-pytest-8.4.2.pyc | Bin 12346 -> 0 bytes 27 files changed, 47 insertions(+), 22 deletions(-) delete mode 100644 docs/_build/html/index.html delete mode 100644 src/plima/backends/ccl/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/plima/backends/ccl/__pycache__/builder.cpython-312.pyc delete mode 100644 src/plima/backends/ccl/__pycache__/halo_model.cpython-312.pyc delete mode 100644 src/plima/backends/ccl/__pycache__/la.cpython-312.pyc delete mode 100644 src/plima/backends/ccl/__pycache__/nla.cpython-312.pyc delete mode 100644 src/plima/backends/ccl/__pycache__/tatt.cpython-312.pyc delete mode 100644 tests/__pycache__/test_backends_ccl_builder.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_backends_ccl_halo_model.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_backends_ccl_la.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_backends_ccl_nla.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_backends_ccl_tatt.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_import.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_discovery.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_halo_model.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_hybrid.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_la.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_model_registry.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_nla.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_models_tatt.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_utils_constants.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_utils_converters.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_utils_types.cpython-312-pytest-8.4.2.pyc delete mode 100644 tests/__pycache__/test_utils_validators.cpython-312-pytest-8.4.2.pyc diff --git a/.gitignore b/.gitignore index 6d94321..1b5caca 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,10 @@ __pycache__/ .pytest_cache/ .ruff_cache/ .mypy_cache/ +.pyre/ .cache/ .coverage +.coverage.* coverage.xml htmlcov/ @@ -14,6 +16,7 @@ htmlcov/ .venv/ venv/ env/ +ENV/ .tox/ .nox/ @@ -42,6 +45,14 @@ Thumbs.db # IDE files .vscode/ .idea/ +*.iml + +# PyCharm +.idea/ +*.iws +*.ipr +*.iml +.idea_modules/ # Local env files .env diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index 35cea5a..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Redirecting... - - -

Redirecting to main.

- - \ No newline at end of file diff --git a/src/plima/backends/ccl/__pycache__/__init__.cpython-312.pyc b/src/plima/backends/ccl/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0a5b4085607cc6c12cb2cd5a41d59378dbd429a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmXv}J5B>J5VZk?6;kftHbpWeiWG%JNrMy+ij;=NT4tSOSg*bEY>MR~oPo1&gKfD0 zQo2;w((;;lubB7w9uDtBM7F+vU&Q;9#6M(D&RHa%q7bj5m7}YV>1wr6Z#kC673yeg zZ33&k59(#}__S2ynm~>TRc`6vD&rbe`NCM9Jdb2|t99W~>o0Lm{+Au>I2wSX(!<*0 zDLpW34VygR5zuqxtv|Hmk{YNjRXK3Lp7k{t5G`m;jvB2eb=zgLn0c~h9tJTbP2n`- N_gYHXiHC3##UI!GNq+zU diff --git a/src/plima/backends/ccl/__pycache__/builder.cpython-312.pyc b/src/plima/backends/ccl/__pycache__/builder.cpython-312.pyc deleted file mode 100644 index 99c7902f5bbad158a431716dd7f0398d64eaa328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 zcmcgxU2Ggja_-rk{hj?Ix%}5s!yl1aO1HH93&}d$lqEW}DV-zHzIgAP(Qs!-t~k5P z^vqJX#PUMK7r;OcfnNdX*@no2>U?~AveeeL?cFW`l)LHdF{_!>rA3NQFo?!svhzEyS`h zMhA^}A(2fmI%ISey0hJk4jVm%WH!lY$>=TgW%~;K*?v}!7z2gD?4Uqah!*`jAv>gp zwAdgBoE_FhEzYPT9`X*+62Bl?mma?3<=SLZ+L+e;3o$za?;dy`)yB0Xyk%`d>xK7d zh;;sG$Fx3ZAM0#w)wD^iAHI*bS~@9hN*jRh6P>M{HSM@I2t3C+TRUsOGXy-7ovocU z;28#Paw% zbLG6D=~P}WQTgq+7vy}=qWPkk&&jHhUnv&!q9re>xi!70$)%-hdd@O4;qc;W-joX^ zt!(J>IxTJFHQkg;MW~dQ4Co8JXhmKx!DwvcC7dN+T#?^jn7=sNnk3ws1V+;hvmpnY zLwDKPCzbX*5rlyP_ z{=zJi;1ayuY09Q97ga02p);iCXXPc3PPWSH28tM7oLyXGeO6VY#5>8rgxzvw(<&8M zxA)gxJTIH;un<&rQG&J8bE;{fKskU>Hdjk!Lz9=NTFkA&x-h(`Zk1_K*Fa4a2=v)d zjk4a*3V;mfR`uK(j>04cVG&0y52IT~B@_MzcV1d>B(+#9S)fU&XhJpkwrUvalA!|~ zGQnt6m`G219q(+h;sh4*mQGc}2`yIEb?tmUXCdD#rD|m%zlNPg3+kG#+^b;3>3aJrdMG2uZdCVJZANPL}{kdC;%_M(>dWN0_QmqQF2 zkL${W{UvC*L3EN8z%_foK?_;0<^c!j#f{7;u}S%wl%G)n;0rP;1XP$&5>SyQ6-BBN zOUIcAo71=mpp^=nsc98U6=o&q1JE+LTgW(G*m6#oFA3U%lgz2bQZb)X4Hq-k>R(n1 zc>`A4^%b-WW^_dCx7o)m{3l=xCuJx;maFn5@D)zLUB&NW8p!h#n23LO0`96i!Gdn7 znrf++(mp4sC^(g(IAH~+2Hyj8L{a{vtQzi@fTC!n95lxjrOikcQoy>7$(q0Axje`u15By%iO#2vwPP_@5#?07BxV}bNs&F8k zSaVL!5pX$7)J?{xu>>u~*2bhS0T)_{c^Qgr@~H2`t#|kOUfcfB{r>b`|B0HId>H7f z4NdO`rtSDhEjaRU{H1&2r+3Fs|I7I6yTPNM#&!a>G_pm?Z5tj<#2^nAz_(KEc{LFDE(69&ZNfW!$#69W6u5{wo+jmE6(uqCk?A^<|(pxq0t*2o^+hs7l z48-9Ue$9mf7@E(Ppb1rB1A*~uo_2w`zN&-%U~W%aWkVNP&E@oU%Y6`EsEy_$m0cO=TwDZPZ*Yv%vS9ZHz z*?#w-6#HztCLO7{E-crs3QjAb_rl2zSDl7D;MJ=TMDuE5Rn&Z+do};(L0IX)=BrH?ZCVh)s#H5HX53J!i*pdHbVJZ+f)~MH(~V7>5NpF�fRky&YukiQ*Qd=)37K7Duqa1*b=`kg-5$ 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 aAccr!ErwJahm0-2df}oE+JT}g@qYkk4^nOb diff --git a/src/plima/backends/ccl/__pycache__/la.cpython-312.pyc b/src/plima/backends/ccl/__pycache__/la.cpython-312.pyc deleted file mode 100644 index 7f685376466777fbe1b7f244c9a80859986bf417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2845 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 diff --git a/src/plima/backends/ccl/__pycache__/tatt.cpython-312.pyc b/src/plima/backends/ccl/__pycache__/tatt.cpython-312.pyc deleted file mode 100644 index 19f4fe073ec5eda1bfe9847aed7a6d74e67012a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 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 diff --git a/src/plima/backends/ccl/la.py b/src/plima/backends/ccl/la.py index 59ddf14..dec34af 100644 --- a/src/plima/backends/ccl/la.py +++ b/src/plima/backends/ccl/la.py @@ -50,12 +50,15 @@ def make_ccl_la_ia_bias( validate_greater_than(z_array, threshold=-1.0, name="z") if amplitude is None: - ia_bias = la_amplitude(z_array, a_ia=a_ia) + physical_amplitude = la_amplitude(z_array, a_ia=a_ia) else: amplitude_array = as_finite_float_array(amplitude, name="amplitude") try: - ia_bias = np.broadcast_to(amplitude_array, z_array.shape).astype( + physical_amplitude = np.broadcast_to( + amplitude_array, + z_array.shape, + ).astype( np.float64, copy=True, ) @@ -66,4 +69,8 @@ def make_ccl_la_ia_bias( ) raise ValueError(msg) from error - return z_array.astype(np.float64, copy=True), ia_bias.astype(np.float64, copy=True) + ia_bias = -physical_amplitude + + return z_array.astype(np.float64, copy=True), ia_bias.astype( + np.float64, copy=True + ) diff --git a/src/plima/backends/ccl/nla.py b/src/plima/backends/ccl/nla.py index 79d3b4a..17a73b3 100644 --- a/src/plima/backends/ccl/nla.py +++ b/src/plima/backends/ccl/nla.py @@ -3,8 +3,10 @@ This module connects PLIMA NLA amplitude models to the IA bias tuple expected by CCL weak lensing tracers. -The NLA amplitude model lives in ``plima.models.nla``. This file only prepares -the ``(z, ia_bias)`` tuple used by CCL. +The backend independent NLA model uses a positive physical ``A_IA`` and applies +the physical NLA response sign internally. CCL weak lensing tracers use the +opposite sign convention for the IA bias tuple, so this backend flips the sign +before returning ``(z, ia_bias)``. """ from __future__ import annotations @@ -29,14 +31,22 @@ def make_ccl_nla_ia_bias( ) -> tuple[FloatArray, FloatArray]: """Return a CCL IA bias tuple for NLA. + This backend follows the PLIMA user-facing convention that positive + ``A_IA`` corresponds to a positive physical NLA amplitude. The sign needed + by CCL weak lensing tracers is applied internally, so the returned + ``ia_bias`` is ``-amplitude``. + Args: z: Redshift values where the IA bias should be sampled. - amplitude: Optional precomputed NLA amplitude evaluated at ``z``. If - ``None``, the amplitude is computed from ``nla_amplitude``. - a_ia: NLA amplitude normalization used when ``amplitude`` is ``None``. + amplitude: Optional precomputed positive physical NLA amplitude + evaluated at ``z``. If ``None``, the amplitude is computed from + ``nla_amplitude``. + a_ia: Positive physical NLA amplitude normalization used when + ``amplitude`` is ``None``. Returns: - Redshift values and IA bias values sampled on the same grid. + Redshift values and CCL sign convention IA bias values sampled on the + same grid. Raises: ValueError: If redshifts are not finite, redshifts are outside the @@ -50,12 +60,15 @@ def make_ccl_nla_ia_bias( validate_greater_than(z_array, threshold=-1.0, name="z") if amplitude is None: - ia_bias = nla_amplitude(z_array, a_ia=a_ia) + physical_amplitude = nla_amplitude(z_array, a_ia=a_ia) else: amplitude_array = as_finite_float_array(amplitude, name="amplitude") try: - ia_bias = np.broadcast_to(amplitude_array, z_array.shape).astype( + physical_amplitude = np.broadcast_to( + amplitude_array, + z_array.shape, + ).astype( np.float64, copy=True, ) @@ -66,4 +79,8 @@ def make_ccl_nla_ia_bias( ) raise ValueError(msg) from error - return z_array.astype(np.float64, copy=True), ia_bias.astype(np.float64, copy=True) + ia_bias = -physical_amplitude + + return z_array.astype(np.float64, copy=True), ia_bias.astype( + np.float64, copy=True + ) diff --git a/tests/__pycache__/test_backends_ccl_builder.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_backends_ccl_builder.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 66faa5b0d0459422502f17b9e8596182f4c7c707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63851 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 NZ|{hDSFxe<{{baMt*-z8 diff --git a/tests/__pycache__/test_backends_ccl_halo_model.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_backends_ccl_halo_model.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index b9bad7752ec626dc9b3950d1f6e5363eaf0f4d21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28277 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 diff --git a/tests/__pycache__/test_backends_ccl_la.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_backends_ccl_la.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 3e2578b471b671f3567682ffae057a65ad427925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21960 zcmeHPZ*UvOb-x1+|M^dpC{xrwP?9Afp6KO&4!=LY?X z@~&biXB0yM7jcgCk8?a%nnXfzIt1ygWtEOaL9T#1~C(krnuF^IKH%UJ7~R=Bpt z2)v=4X@fWjaXZ8zh&vz-L%a;)2*jOcY;-fPh>S-QlID~V^(kg_bQ@30*oeXT?J~`& zVc#{C(F@+$$N6P^|98d|dGE0QnvdmatTkHR(5^WJoatV|Q@1v(d)s|KHQsrDPu<{7 z@28F^?9W(dw7Z^u)e@e*ahrDxt4&*X*&=viMn{7d>vYw*2jq1*$m?o|S3tZ5;x35S zLc9{`L&a%NR1U)I`-*UvkT5n6OjSGn@^sHuFbJa6K@!=o1UcRQ7~(nc_^(wX_L@5BhhJb) zEBd}N>1kPXo494dqfLrp3T!Gpf)m=H#r5XA+Tfw|D9xm2B9>?^9QrmLJT44POF8Jk8T~G*qyMVf8h}Eqj97jPgs41Juz-ZC*w!isr{S_2#0Gg za1CX0y1jpIbg~*KBy)MY>dTH#YgIqwfx&JJ_F}OAUYl-NCb4M&2NM>aJUCDdIrCAX zgS10Es{x%5eS+Y~SPkK%m(C7X+u5y2J(Edga+X<*4COO0o2Ad1)c~z%HRRN!8a*~X zf%heKQeBoz!7WK*j+0bwY+NU1wFNFG2lMF+WNcM~nH+Ff)$XJ$~GS7`0brqAYfp2(&0V`kR2cD`U*rcP2L zJ5xDpESJd*PwY6Gws%sPu#*A@8YVenaG*fn_(YXm@W2Pjyk%NRNA{9J(g-5K82l^? zK*9y(lW_Fy@SEYkU0)9OUg-a%YwOizHzq zwub++EX@)koPo3ZSgI_^3i1jbM$n7}=j9EI1kTd78cs+;UUy=hZy$a0=uK_&<>T+2 zymS(Xi$_Z*XJVUgYxqCQ(kvmu88~}@rOJ}5Ag|zI1kG4*UOvu9;4HywbIK3|oSuVs zugn8)*i|TaQ=mnb4BnbSJ)aBescxuORBND~Zyr=yEY$OTNvP)sAme~kRhiHdfkMCc zFpBaV*W=^F#GxQRZ~Tm(A2G9WD?bih#x(i}R({$~5SsFF^_WA1k4>x9i0BUk(*Zhe z5u8rxs6|#Gh4bLFMz$cm4+AkISlC|Jp~(&)s(a{I)vyD)s_W{62jNZ}Uglncptci! z)Y18F_?_?%)|WdH7oKBXGF|C9w&*T-H8QL1COaYPd2$wl6I9Mtz!SLT3|8{BupfZG zEtU?W_{25GDCSmk6crotXU8axdo_ol$`zVy^ZO`AZBmZUtDK@T>amoV^cmWuzvwIa z=@LLIYSus7t-Ru+*y=S0fPW2^071ORwFGbjS&xOoyd{9le??8^kc9r^^l1QblG9^Z zAvr0KUYJ(^z9xA}uou4Urw}_p0e8Rw+(8@r2R&RldBMgYe-0iyfZGRv8{fJ5du
    )38R;Lv|m* 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 mq7uD=%3B;Zx%nxjIjMFL diff --git a/tests/__pycache__/test_models_discovery.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_discovery.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 3dfde296ff0f0b0f3b640c57b594f1f4c126f9ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15698 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 BvR(iH diff --git a/tests/__pycache__/test_models_halo_model.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_halo_model.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 30c5cbae977682555ce989c20259fe66f824f087..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30693 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 diff --git a/tests/__pycache__/test_models_hybrid.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_hybrid.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 22225c8f3b185dbeee20b2601d8d7fb097a6d51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmX@j%ge<81d0ZFSs?l`h(HIQS%4zb87dhx8U0o=6fpsLpFwJV`RRuirxq3K=VfN+ z>$~J9m*%GCl@#j-r52|q7A0rsC+8RE=I7+6SL$YGmguJ^=42-7m!uX0m4L|j-29Z( roZ|S5%A}&q6upAVTO2k(q0*dGyCPPg@r*!R3}Sp_W@Kb6Vg|AR&4euo diff --git a/tests/__pycache__/test_models_la.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_la.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 8ac1035f63f85f2c62796478a28740d2fa70657f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45484 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ðljv9)`~%lD!(%-g-X0c-6?SDt-rGFW#j zSogIZlQoMbtLr8MRlh2C90HIJtdZL}!s2pDo!uWkp7wuDCpdd^)NK3*JEARp|aO|?GEMJ32 zp_xo5i~JWjYgCneccUsir}FoZ=A)!2q@7GrMAKP{nwT$){np~vD*KyNj@HHbI`U7e zA~`h2ibU6vBz;FCjt_hc;A;%iltt7g?@_hDYZLh|i7ixs=DSe<735{KO$@hV3vc7;6SIqk?g_sQg{-iy9-0(+-R50|nECWH4RWXrs)S z6T9NOU~X_}Ip^DD0v-SyTybm74J}(W!5V;kt?;49#XGBOT?LNk@@vb zeRqYHvhH?Q>b%C$W{G+|ns%Cf;%eA!NVi&xsk_6Tv^(u#tGK*rFII680AfcsHK+v# z%r#yZZM+o6FuTB)TC53nn{-vF&ZUDHZS?eK?S8^&qf3TZ^gN=QGnnaPc3FM&wXEcv z))}sEl2iSuYM=>5n^|))JqB`KHhUc1)DkOKjW)hmMa-Y}sjIlkQY*E`Vn}I~7N)!D zGA*B)iv{2T7;W76d7%Z)?lro!#$m62i)nbi*8JRX?U}Wv@`2Tws*<(FsI?|qqt{18 z^;_(*1udyEJl~L3HoANNv}7<44i2>%THB)sL(jx%i~^|qsPW@j+N?_2%wJp0EOz#k ze;=7=W0UG4@J@a+|G-ywA+U`E7^43ixXvH{S32HrR_!uBYgTvu|C=8G#!=nF1`ZSt zw)Ko8`ksjlDPCgFAZL*w-G;-Lm4`@vIT6x$Zw+ z@Z~C*daH`#nKSsh)ZH6$%9$ZYS#0?Fr1n4~(J#g2XlI-cim z#i~DA_lPzPvWmKEA3Yx3nc!*?O%j7dW1ij`=(q{rSq2-$pKRnI^vG<(X#BaUAe%n zoV2UZ)-?F>rwPO-ux9@5)pT1EK{mh~>(t`_T*V<~{xWz2tlnEHo3*h|f6ogqz= zoa#?i12X_$v*vhu4CLH1dmQYXk9v;|v8KhvKB%NGp%<{%kdg@iP7464rKo;TNnb*5 z0v6a3db99+t@*j(+B0iS#RID~{*txEsI?|qlLx+L)fQb6TH-f6U$b}NzG(?t(_$Pk zn-P2!tfx1QnyH`iV9<(2+Syta_47#_XpsJv{`I7Q0WA?wx_d7W>PL?- zvca}GS4}f>T(!Tql&(;rjT)M#eMIvK+=}6AM~mP!S-8*MtAixkLS!$9_SMV+6kj+B zp*;uIj*HNZBTF;Zk|yP%Pa!O=O)}I^Gb)5<9zK-`*$6!w*2A| zQ2ciwGS9_ByHiO>7RMZm#%QZAxoFU*7ayYvv7JN<%ZGoLO8pF=kJ$hsOwhcj%$tb9 zqB0~SXK}0Fppt3?GyM%>wY^qS)4xc?N~!u``*$3zmItAf@+K_LWaBA(fymr4mtrd8 z_L(tA zVO!dkJf{!FcdPG+NDT}|3T)`cVMExoMYo|F;+S+m(_%0`Cg~GM%{~RK<%-$b)kX~; zEHfR!(3(bc_jF0Ks~c^R81lbh8-f&#)1WhIS1r+!4wDV31&nvjc}z4#>CmCM=nRn+ z8eegUc|LxUFdB%?$z422@5fJao}Q%d<0m;!PZCpv_0GI*Ucor7GbKz{18nql)S9#z zwBM{AEn^eN%Z+jM`ZQKiay?mRxQ^8%jq#-MyQxQj{Y=?$mtVw z{quH*;@Ovchtpz^p(GX%6U!@ORfdV>rPgO=6U(V(po!(qVHaA5ne|5)eC|MhMBI;* z{siYuf5h`ES%0R*fc^yUx&C-((H~*jy950ZaX(V}Q$26`Bc5N$`ZFyC^r!ls>yK|1 z{UO^8JMKV#MBI;*{?yEy{)p#Svi?kq0sX1D*ZMQ)4%ZH?GMWsru)7b-s*@pXx`3W@ zCzg_8Rza*mu_dBmt77Zw4O@q*Rl9#PRjg;EfaMJsn%7pf?$c^FTIttkwPKLe1 zp{^tg-5yTLG^IeMnY;z_C-?{1sq4sQON1+AYVu_=mB>v*wh`G(WDAk4M79%on24S% znH2e#Rmoz4WiFF&6kkjKV1(aYqtUaOdpi1LOgGtT^lazLV0Ke-yNEnOWX5GMOZbQZ zo)IgK2#N!1+_mD6e}>3^LMDYPzm52K@nlJL!8!FaT*L_y&e2mZHiJ3a zd?AtbVYe*$zrp?7BWRAqxo=Eo$EEe7r+DafiYCN4gQPFuldO~~B5ABqXhK>)S+h7R zH6Sma9`n_M!>ztnk@Yp)l<5D48o+&m<|qdDjp^*T)Idc<@vgIYLY^~7{k00tB9_J) zg(jp1mY*h(pC;sIJOtWwQ=f z@J6u-scEtXPo@!hdUDLS1YFj)@*&74F}o-oN)FdjCH4{>wh1_g}8wf5k`f{$u`Or@q!rpJzVY<@Z>Y`?7RK(i{?yH)Kf>^F2l^x8ex&qg(Y)!8czz}8&$JlOpGEgv ze-_W8Kf>^F2l^x8ex&rLe%|y)Jin6lXIc#CPyM~tADF3@3_WCGrV2$9T~T}ky3krB z-vA5=+ZA7XUvDxM?M+1zQN;&aljc_f>h6F@ptH9pjvd%(mZ{OUwTGLYV2#4}K7N9e z@+y!#n-&?MRwMA3e2XGWiZsM7q)l?uuB!Q!y27i%ro*S+$^V^Fa41p_MRL)ntrXn#XW`oH%xIAp|Oe;BZuDhRgG?aVb5(^+ykVyPRbJJ{FsVZ6kPvGI4Z!wDr65?sV zhRHl8So9#BAUh;g(f8I;epSU?x!3zj`^Cv!a(=! z&u4x6Z%XukLk-|QL30#^`^I#39Ktm)h*8ArETV|O86^Mh&vO>hG}b6IA?=^6*^rg? zQI0l@`8I;h`ZkU?f$qC0(fM}Fwf`i|d}=>LWqz|80+L=eS&dY~(j z!be5e5QkD1=^v!Ztbq?%pytOuL(kwFS8>H7f)tk;#_D0kks9oeC)q|dilcX+r+<(y ztk_5C`}?s+NVI_uPBh>XiEIdl)#_x=dq_*Tq{@G-*QLuHda*#MOKgi8Q4iPy{&k^}8B3~wQmdJ}lzDnd}B3~o&XGH#-$ajc*kH}vU`D-F?5&0339}~$E87J~H zBGgh8&d_#0f@gpYNcYMvv?2JnB!2~R+ita5e_{#$on^(lv}@CZW%*AnRsYRW{(;^{c)&ua{t<4`G-N&uJv=E(I5wx!U zU_*s9NdDl|iZUdJl)O{*j9Y>nv{(b6YwXtD6#W!SgmPoIei9Uyet+q5B*pam{{dEC B_l^Jn diff --git a/tests/__pycache__/test_models_model_registry.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_model_registry.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index c2ad8dd3b2df26004298b9642f21a3e90120bb4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20013 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 diff --git a/tests/__pycache__/test_models_nla.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_nla.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index d049c26d4f7359911d5926a176e4bda1dcb8532d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34554 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 C+kSii diff --git a/tests/__pycache__/test_models_tatt.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_models_tatt.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 20e0ecfb89971c9e0d0dc40def3c7a1ba78cd35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18208 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 E3kmESO#lD@ diff --git a/tests/__pycache__/test_utils_converters.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_utils_converters.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 7f0a8f13206598dc9300a64990154693f570445f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7457 zcmeHMTWl298J^jhS?|T`webamu`>h%UchT?Fqjl#NJxq(ag|b{;wT!1o$-2?*$Zc8 zjlH!cCqjxXrE*$TVvF*C`V@=yp)XbY#Bpu878nm*saFn_|1Q-W55UHK!+FgF;58D$h!@o8+v zH|k@t&1u{yPirCLPrz8FZZu#&366&7lkjL5YF?|)L`EZ-hS3Ii-mVDO`OzrUeyAIv zu7kQs4X3-Emsjfa-b&kPDFG#zWR(#7!fGhpnz?R~d0y8$Ss%NncX9?Xx(Q zZA$%h{LW3q*-lhNA5V=Ll97}2gsiF3n4Bj9af30y^sJJ$)#CKAPJ$8soV{)H%rJ)FJe_9TQFhZc ze4aIYhO-2d_Pb5Dk+z+}9e~C(JMD9fhGjsIe6jcYREEa5Y>3Whinjc8(a4EZ7NRAY z_#*ezSBXO@XKxQ509-?z;f|dS5nmCD(U4mndY^tfBXP zPt{eKB*yy^IX#opa>=RQD=DLoT16kV6G|m&AX3FZ;`u4F8=t#MUTY50gsc@*oos~- zK;U8Y6F_E}CxOsHU_S7Zm&$>iv!|X!cHffAk)GK%pG2D$Cg&&bwfB^xvDq_U@cs|a zzJK;1-?hYdl_qXYKHv|ozyi$IwGckuIrRsS&L`O!7JeY}sZcCj6-6;% z%A{iVscgPrh$&r^6A3jBp)5|rBte}lGK=i0@5G5kw%EJ7CqFe1(?dVB8{!EOTL)u$ zTpyS7YG_70VGRw&bb_*hP{{!Uk^v-xs|{8#r4x_FbR0Z75{uA~OE7p5)G28KVhVIs zGjuXPMdP1L%q9u;u0bTslSD3)mx*fD!(-`kA*DgE)=j^b0}kD6m-O*mK~pHJl+<#U zWlhS;8PyC*x;&=h3TDG88rdP=zCj42)n*AYbw)NMi0PV~rI~oqPrt+r<7=$V_j@~s zy`4i=$6Doxw=<+;288qg<+*}_r6h6;X1xr*l^+3tpa4-kQI70`D843a>-YKnkHSq0 z$LEjV9?pMMqbyX1` zI6`H4v6A z0{lWazYdqh$qrOpCz9<*I)IFjH?a98kQY*yjkV6gywf-r34~QkU8VE4x=Y_FH}}-g zSgECClsjEf4~hO051Lz*_yD{9>i?s z18)L;Zoys9$a51Kn<1@@?|o_^E$4(W!y4}EYMu7d?itBt!@C{EgV202uISZ(lfFfg zD`XYXAgR2a-gN-zcs$V!`Ld?QV}g|i5c4Dt(NZ3^oF@cBBQgKloX^8>CGp366wguD z(($b8Ao8siLc`bN+ui#X@-{Gy!%rUs;-1X!HSI444$x!y{XMV#=4yG*sdD7C^~n6{ z13tF?DE`e+(vZhZs@!99McHBCvtfFcq&iB12%-Fam}d2AWl=rR(B>WjL0Qz{Fb-BJ zt7DC_yxv951NT*&VJpl*V}s@9BQ&?8!lui6&Xpr?tykFe1OD)Oh2iF?SA7HxuUD-@ zT)<_OTK6Z4PvJcGTC7pIZNU@Lno{$Q6guZ}^`ExXgwt&#cLh=XQo-5_6km z9iHRXZ3+bUI8m>WlmT}$?vPn$k5NQp3fV#?KV`*r%(-S;?f*@&%$Q0PZ_ntRD!oH7 z`HW1im|?gwf=eI>??u(*vU1ksQrR(jHTgrId36gLr(;60pm zj}tha$teX*eU)H}zyrS?0lLhwEc<)r;Gdb7pEAsKrp#>l0~7g*=UCrLeI47s(n5*A zb}ctDzQBha?{_?8+n3n(M|}8kFf!+VWRd#0%L`-kV{?&5!Kx-%n3$iKOU^Ychy8+o zMF{$QU$$^;&q^z_mT7B~*R(x`6@?dn&2o#t9(vTabD4wsu@L-HfZBd7wi^BHzLhP0 Qc5r2j!1h0D1VY925B?PL7ytkO diff --git a/tests/__pycache__/test_utils_types.cpython-312-pytest-8.4.2.pyc b/tests/__pycache__/test_utils_types.cpython-312-pytest-8.4.2.pyc deleted file mode 100644 index 1d6cd2b1ee43c3ebe8c346148e0e27ab27acb230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4052 zcmeGfU27aw^v>)gyV=dAP12;@H0qFA?bz(5rr8R`h@l@Sw4tbdnU~3AXOiw_K9+lD zwHp!;DLzP_d=aD%6)F5G}zLRZ&1ZV`Wr{_dRxR4S04| z&G8Y*>a+7|-Y%#GPWM>-c2O;cS_A4K(CW1g+k@($J){nCe%2bckEloN5p~2KRY&ck z>QUhL8@XGOdJOtL=u6P&p&x_30R8cHMk%hIyzbOJ*)y5PMJlfe~}Z4KdkXx#iSwa=&;@r@C!=CcRj%d9~m;1DJ&l z&Ku5Fz_az@F)uuILK;%cjFA#x>%{Ag7;9wZ6mWz!fqm`uMcf9z(})Us17w!q_R_jb z;{9+9BjXh#`NlwmCH?&n{gALyYMsN0M1&>t--j>5M$;NY0WS>?YB*q7sa3k@tdVGT zL%Jib!g;KVMvu|ECe{T`WxSDSjnqt|5ijZ2GSN&?|A}B^Zwl+eI%#K>-0JiP+^oDC zx+f>sF6&lZXC{+%dA?;|Ys*V$5wecfQrQq5i?g#E!s^h;Q_c1ng~_wCGNNY{M)8(5 zL_Y%q2+lqp&>1tS#|5eiLuPee>8Cjm^hKxXXZhUcX1J=Kf4kX6OV@Pj4{9|qU5%Pe zT668DPEEfbhPB03-SX-V^Ls59B$$6pV>jHEWpGh#*>V?kOLM?B{XUK9OD4|X56tn6 zfaPAI)TREg2EJtLo@U-`TDrp>W<&A|xI(b!=``_rKmadd~fKRv9HEDrO8cc^7i@7(qyMFxhvssCu9Uv3_HjU zsO0g7*^cy)i3^6Z^dQ znK59W7bolW$CJiL5|1LU05487xFqc#)o}h9tKukk` zz+>8|?elj^0TIIvasz5R zLF3^qX(CdA;Rua~0Raj6DlFIC%RYaqmw929BV(`zoT?F?1Pn zS5PU*c2I%^E<&-wpctSi`X@bt05dx#NQ_5*hIy1?#0;dK(+Q{y8gW(%EWN~&NxTuw zfSN7LCucw!y(r2j<0tN2crbkToz8f9Q!3w{-5f7>3gul1e>))~pkmlTc0g?>=tHRt zy0K7DKxs| zjD4{@S*KgBi1!x7P{=NcMz^Z+fCk3$XX~UaJc{`ukNHWBh&2LlshQBko@iZb#9UY- zV%$&Hi2I%ZDGRspX&__0hEI)3+P?8v57>8s;y3e}k8**3ZQ6VX+EVyB2~B$%7QuWF zoA%3h-+%DhU9B@--IS_m+SN{>x+~#tCu9Uv3_HjUsO7K)KAsme_o9#_58 z^jg&MrFqvem2p3-X@*X~C&qWn2&uxB53u@p>P=-RqTA}7gwC+JY z8?*du$m5yOKU8xq%j6F;R?!!0!SV7K(hCJ8y!v<;@q3(>-E32QD){{z#|I=1qlE@l z`QU-)WpGbCb@R*OAq&e;iiwh90HJu)8-#y+5OH#E!j-fv^DR0DL*Ueeod@uHMi7MW v$mw6m#IJF3r+Fz|y#Q_^SN)q$%-)?H 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 From 8f935703a4f5b3358b7876e29029f276213d3643 Mon Sep 17 00:00:00 2001 From: "niko.sarcevic" Date: Sat, 27 Jun 2026 09:24:42 -0400 Subject: [PATCH 2/3] updated tests for ccl backend sign convention --- tests/test_backends_ccl_builder.py | 108 +++++++++++++++++++------- tests/test_backends_ccl_halo_model.py | 13 ++-- tests/test_backends_ccl_la.py | 30 ++++--- tests/test_backends_ccl_nla.py | 34 ++++---- tests/test_models_discovery.py | 14 +++- tests/test_models_halo_model.py | 4 +- tests/test_models_la.py | 20 +++-- tests/test_models_nla.py | 21 ++++- tests/test_models_tatt.py | 8 +- 9 files changed, 177 insertions(+), 75 deletions(-) diff --git a/tests/test_backends_ccl_builder.py b/tests/test_backends_ccl_builder.py index 8f233e9..c3c3e76 100644 --- a/tests/test_backends_ccl_builder.py +++ b/tests/test_backends_ccl_builder.py @@ -52,7 +52,9 @@ def test_canonical_model_name_resolves_alias(monkeypatch) -> None: def test_canonical_model_name_returns_unknown_name(monkeypatch) -> None: """Tests that unknown names are returned normalized.""" - monkeypatch.setattr(builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)}) + monkeypatch.setattr( + builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)} + ) assert builder._canonical_model_name("missing") == "missing" @@ -78,7 +80,9 @@ def test_evaluate_amplitude_model_passes_z_when_supported() -> None: """Tests that amplitude models with z receive redshift values.""" z = np.array([0.0, 0.5, 1.0]) - amplitude = builder._evaluate_amplitude_model(_amplitude_with_z, z, a_ia=3.0) + amplitude = builder._evaluate_amplitude_model( + _amplitude_with_z, z, a_ia=3.0 + ) np.testing.assert_allclose(amplitude, np.full_like(z, 3.0)) @@ -156,7 +160,9 @@ def fake_make_ccl_la_ia_bias(z_arg, *, amplitude): np.testing.assert_allclose(amplitude, np.full_like(z, 5.0)) return ("la_z", "la_bias") - monkeypatch.setattr(builder, "make_ccl_la_ia_bias", fake_make_ccl_la_ia_bias) + monkeypatch.setattr( + builder, "make_ccl_la_ia_bias", fake_make_ccl_la_ia_bias + ) result = builder._build_la_model( cosmo=object(), @@ -170,7 +176,9 @@ def fake_make_ccl_la_ia_bias(z_arg, *, amplitude): assert result["family"] == "la" assert result["mode"] == "native_bias" assert result["ia_bias"] == ("la_z", "la_bias") - np.testing.assert_allclose(result["metadata"]["amplitude"], np.full_like(z, 5.0)) + np.testing.assert_allclose( + result["metadata"]["amplitude"], np.full_like(z, 5.0) + ) def test_build_nla_model_delegates_to_nla_bias_builder(monkeypatch) -> None: @@ -183,7 +191,9 @@ def fake_make_ccl_nla_ia_bias(z_arg, *, amplitude): np.testing.assert_allclose(amplitude, np.full_like(z, 6.0)) return ("nla_z", "nla_bias") - monkeypatch.setattr(builder, "make_ccl_nla_ia_bias", fake_make_ccl_nla_ia_bias) + monkeypatch.setattr( + builder, "make_ccl_nla_ia_bias", fake_make_ccl_nla_ia_bias + ) result = builder._build_nla_model( cosmo=object(), @@ -197,10 +207,14 @@ def fake_make_ccl_nla_ia_bias(z_arg, *, amplitude): assert result["family"] == "nla" assert result["mode"] == "native_bias" assert result["ia_bias"] == ("nla_z", "nla_bias") - np.testing.assert_allclose(result["metadata"]["amplitude"], np.full_like(z, 6.0)) + np.testing.assert_allclose( + result["metadata"]["amplitude"], np.full_like(z, 6.0) + ) -def test_build_tatt_model_delegates_to_tatt_spectra_builder(monkeypatch) -> None: +def test_build_tatt_model_delegates_to_tatt_spectra_builder( + monkeypatch, +) -> None: """Tests that TATT models delegate to the TATT spectra builder.""" cosmo = object() z = np.array([0.0, 0.5]) @@ -235,7 +249,9 @@ def fake_make_ccl_tatt_power_spectra(cosmo_arg, z_arg, **kwargs): assert result["metadata"]["raw_backend_result"] == raw_result -def test_build_halo_model_delegates_to_halo_spectra_builder(monkeypatch) -> None: +def test_build_halo_model_delegates_to_halo_spectra_builder( + monkeypatch, +) -> None: """Tests that halo model IA delegates to the halo spectra builder.""" cosmo = object() z = np.array([0.0, 0.5]) @@ -258,7 +274,9 @@ def fake_make_ccl_halo_model_power_spectra(cosmo_arg, z_arg, **kwargs): cosmo=cosmo, model_name="halo_model", canonical_model_name="halo_model", - model_function=_set_module(_amplitude_with_z, "plima.models.halo_model"), + model_function=_set_module( + _amplitude_with_z, "plima.models.halo_model" + ), z=z, a1h=0.01, ) @@ -338,7 +356,9 @@ def fake_family_builder(**kwargs): assert calls[0]["amplitude"] == 1.0 -def test_build_ccl_ia_model_resolves_alias_to_canonical_name(monkeypatch) -> None: +def test_build_ccl_ia_model_resolves_alias_to_canonical_name( + monkeypatch, +) -> None: """Tests that aliases are recorded with their canonical model name.""" z = np.array([0.0, 0.5]) model_function = _set_module(_amplitude_with_z, "plima.models.nla") @@ -356,8 +376,12 @@ def fake_family_builder(**kwargs): } monkeypatch.setattr(builder, "get_model", lambda name: model_function) - monkeypatch.setattr(builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)}) - monkeypatch.setitem(builder._CCL_FAMILY_BUILDERS, "nla", fake_family_builder) + monkeypatch.setattr( + builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)} + ) + monkeypatch.setitem( + builder._CCL_FAMILY_BUILDERS, "nla", fake_family_builder + ) result = builder.build_ccl_ia_model(object(), "NLA_LF", z) @@ -371,11 +395,15 @@ def test_build_ccl_ia_model_raises_for_unknown_family(monkeypatch) -> None: monkeypatch.setattr(builder, "get_model", lambda name: model_function) monkeypatch.setattr(builder, "list_model_aliases", lambda: {"unknown": ()}) - with pytest.raises(ValueError, match="Model family 'unknown' has no CCL builder."): + with pytest.raises( + ValueError, match="Model family 'unknown' has no CCL builder." + ): builder.build_ccl_ia_model(object(), "unknown", np.array([0.0, 0.5])) -def test_build_ccl_ia_model_propagates_missing_model_error(monkeypatch) -> None: +def test_build_ccl_ia_model_propagates_missing_model_error( + monkeypatch, +) -> None: """Tests that missing registry entries keep the registry KeyError.""" def fake_get_model(name: str): @@ -396,14 +424,18 @@ def test_normalize_model_name_rejects_non_string() -> None: def test_canonical_model_name_strips_and_lowers_alias(monkeypatch) -> None: """Tests that canonical model lookup normalizes aliases.""" - monkeypatch.setattr(builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)}) + monkeypatch.setattr( + builder, "list_model_aliases", lambda: {"nla": ("nla_lf",)} + ) assert builder._canonical_model_name(" NLA_LF ") == "nla" def test_model_family_handles_nested_module_family() -> None: """Tests that model family uses the final module component.""" - model_function = _set_module(_amplitude_with_z, "some.package.plima.models.nla") + model_function = _set_module( + _amplitude_with_z, "some.package.plima.models.nla" + ) assert builder._model_family(model_function) == "nla" @@ -433,7 +465,9 @@ def test_evaluate_amplitude_model_forwards_kwargs_when_z_supported() -> None: def model(z, *, scale: float, offset: float): return scale * np.asarray(z) + offset - amplitude = builder._evaluate_amplitude_model(model, z, scale=2.0, offset=1.0) + amplitude = builder._evaluate_amplitude_model( + model, z, scale=2.0, offset=1.0 + ) np.testing.assert_allclose(amplitude, np.array([1.0, 2.0])) @@ -444,7 +478,9 @@ def test_evaluate_amplitude_model_forwards_kwargs_when_z_unsupported() -> None: def model(*, scale: float, offset: float): return scale + offset - amplitude = builder._evaluate_amplitude_model(model, np.array([0.0]), scale=2.0, offset=1.0) + amplitude = builder._evaluate_amplitude_model( + model, np.array([0.0]), scale=2.0, offset=1.0 + ) assert amplitude == 3.0 @@ -480,7 +516,9 @@ def test_pk2d_model_preserves_raw_backend_result_identity() -> None: assert result["metadata"]["raw_backend_result"] is raw_backend_result -def test_build_la_model_omits_cosmo_for_native_bias_builder(monkeypatch) -> None: +def test_build_la_model_omits_cosmo_for_native_bias_builder( + monkeypatch, +) -> None: """Tests that LA native bias construction does not pass cosmology.""" z = np.array([0.0, 0.5]) model_function = _set_module(_amplitude_with_z, "plima.models.la") @@ -491,7 +529,9 @@ def fake_make_ccl_la_ia_bias(*args, **kwargs): assert set(kwargs) == {"amplitude"} return ("z", "bias") - monkeypatch.setattr(builder, "make_ccl_la_ia_bias", fake_make_ccl_la_ia_bias) + monkeypatch.setattr( + builder, "make_ccl_la_ia_bias", fake_make_ccl_la_ia_bias + ) result = builder._build_la_model( cosmo=object(), @@ -504,7 +544,9 @@ def fake_make_ccl_la_ia_bias(*args, **kwargs): assert result["mode"] == "native_bias" -def test_build_nla_model_omits_cosmo_for_native_bias_builder(monkeypatch) -> None: +def test_build_nla_model_omits_cosmo_for_native_bias_builder( + monkeypatch, +) -> None: """Tests that NLA native bias construction does not pass cosmology.""" z = np.array([0.0, 0.5]) model_function = _set_module(_amplitude_with_z, "plima.models.nla") @@ -515,7 +557,9 @@ def fake_make_ccl_nla_ia_bias(*args, **kwargs): assert set(kwargs) == {"amplitude"} return ("z", "bias") - monkeypatch.setattr(builder, "make_ccl_nla_ia_bias", fake_make_ccl_nla_ia_bias) + monkeypatch.setattr( + builder, "make_ccl_nla_ia_bias", fake_make_ccl_nla_ia_bias + ) result = builder._build_nla_model( cosmo=object(), @@ -569,14 +613,18 @@ def test_build_halo_model_ignores_model_function(monkeypatch) -> None: cosmo=cosmo, model_name="halo_model", canonical_model_name="halo_model", - model_function=_set_module(_amplitude_without_z, "plima.models.halo_model"), + model_function=_set_module( + _amplitude_without_z, "plima.models.halo_model" + ), z=z, ) assert result["spectra"] == spectra -def test_build_ccl_ia_model_uses_family_not_canonical_name(monkeypatch) -> None: +def test_build_ccl_ia_model_uses_family_not_canonical_name( + monkeypatch, +) -> None: """Tests that dispatch follows the model function family.""" z = np.array([0.0, 0.5]) model_function = _set_module(_amplitude_with_z, "plima.models.nla") @@ -594,8 +642,12 @@ def fake_family_builder(**kwargs): } monkeypatch.setattr(builder, "get_model", lambda name: model_function) - monkeypatch.setattr(builder, "list_model_aliases", lambda: {"some_alias": ()}) - monkeypatch.setitem(builder._CCL_FAMILY_BUILDERS, "nla", fake_family_builder) + monkeypatch.setattr( + builder, "list_model_aliases", lambda: {"some_alias": ()} + ) + monkeypatch.setitem( + builder._CCL_FAMILY_BUILDERS, "nla", fake_family_builder + ) result = builder.build_ccl_ia_model(object(), "some_alias", z) @@ -623,7 +675,9 @@ def fake_family_builder(**kwargs): monkeypatch.setattr(builder, "get_model", lambda name: model_function) monkeypatch.setattr(builder, "list_model_aliases", lambda: {"la": ()}) - monkeypatch.setitem(builder._CCL_FAMILY_BUILDERS, "la", fake_family_builder) + monkeypatch.setitem( + builder._CCL_FAMILY_BUILDERS, "la", fake_family_builder + ) builder.build_ccl_ia_model( object(), diff --git a/tests/test_backends_ccl_halo_model.py b/tests/test_backends_ccl_halo_model.py index da59e09..6f1075b 100644 --- a/tests/test_backends_ccl_halo_model.py +++ b/tests/test_backends_ccl_halo_model.py @@ -85,10 +85,7 @@ def test_halo_model_nla_prefactor_matches_expected_formula( ) expected = ( - a_ia - * c1_rho_critical - * cosmo["Omega_m"] - / cosmo.growth_factor(a) + a_ia * c1_rho_critical * cosmo["Omega_m"] / cosmo.growth_factor(a) ) np.testing.assert_allclose(prefactor, expected) @@ -150,7 +147,9 @@ def test_power_grid_accepts_transposed_shape( a: np.ndarray, ) -> None: """Tests that power grid validation transposes CCL style grids.""" - values = np.arange(k.size * a.size, dtype=np.float64).reshape(k.size, a.size) + values = np.arange(k.size * a.size, dtype=np.float64).reshape( + k.size, a.size + ) grid = _power_grid(values, k=k, a=a, name="values") @@ -358,7 +357,9 @@ def test_evaluate_pk2d_grid_rejects_nonfinite_values( """Tests that Pk2D grid evaluation rejects nonfinite values.""" class BadPk2D: - def __call__(self, k_eval: np.ndarray, a_eval: np.ndarray) -> np.ndarray: + def __call__( + self, k_eval: np.ndarray, a_eval: np.ndarray + ) -> np.ndarray: values = np.ones((a_eval.size, k_eval.size)) values[0, 0] = np.nan return values diff --git a/tests/test_backends_ccl_la.py b/tests/test_backends_ccl_la.py index 2f78803..939cece 100644 --- a/tests/test_backends_ccl_la.py +++ b/tests/test_backends_ccl_la.py @@ -15,7 +15,7 @@ def test_make_ccl_la_ia_bias_uses_default_amplitude() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, a_ia=2.5) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.full_like(z, 2.5)) + np.testing.assert_allclose(ia_bias, np.full_like(z, -2.5)) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -28,7 +28,7 @@ def test_make_ccl_la_ia_bias_uses_precomputed_amplitude() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, amplitude) + np.testing.assert_allclose(ia_bias, -amplitude) def test_make_ccl_la_ia_bias_accepts_scalar_amplitude_for_scalar_z() -> None: @@ -36,7 +36,7 @@ def test_make_ccl_la_ia_bias_accepts_scalar_amplitude_for_scalar_z() -> None: z_out, ia_bias = make_ccl_la_ia_bias(0.5, amplitude=2.0) np.testing.assert_allclose(z_out, np.array([0.5])) - np.testing.assert_allclose(ia_bias, np.array([2.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0])) assert z_out.shape == (1,) assert ia_bias.shape == (1,) @@ -48,7 +48,7 @@ def test_make_ccl_la_ia_bias_accepts_scalar_amplitude_for_array_z() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=2.0) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.array([2.0, 2.0, 2.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0, -2.0, -2.0])) def test_make_ccl_la_ia_bias_rejects_amplitude_shape_mismatch() -> None: @@ -91,7 +91,9 @@ def test_make_ccl_la_ia_bias_rejects_nonfinite_amplitude( """Tests that LA IA bias rejects nonfinite amplitude values.""" z = np.array([0.0, 0.5]) - with pytest.raises(ValueError, match="amplitude must contain only finite values."): + with pytest.raises( + ValueError, match="amplitude must contain only finite values." + ): make_ccl_la_ia_bias(z, amplitude=amplitude) @@ -103,7 +105,9 @@ def test_make_ccl_la_ia_bias_rejects_nonfinite_amplitude( np.array([0.0, -1.0]), ], ) -def test_make_ccl_la_ia_bias_rejects_invalid_redshift_domain(z: np.ndarray) -> None: +def test_make_ccl_la_ia_bias_rejects_invalid_redshift_domain( + z: np.ndarray, +) -> None: """Tests that LA IA bias rejects redshift values less than or equal to minus one.""" with pytest.raises( ValueError, @@ -120,7 +124,7 @@ def test_make_ccl_la_ia_bias_preserves_redshift_and_amplitude_order() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, amplitude) + np.testing.assert_allclose(ia_bias, -amplitude) def test_make_ccl_la_ia_bias_returns_copies_as_float_arrays() -> None: @@ -131,7 +135,7 @@ def test_make_ccl_la_ia_bias_returns_copies_as_float_arrays() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, np.array([1.0, 0.0])) - np.testing.assert_allclose(ia_bias, np.array([2.0, 1.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0, -1.0])) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -144,7 +148,7 @@ def test_make_ccl_la_ia_bias_accepts_list_redshift_and_amplitude() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, np.array(z)) - np.testing.assert_allclose(ia_bias, np.array(amplitude)) + np.testing.assert_allclose(ia_bias, -np.array(amplitude)) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -180,7 +184,7 @@ def test_make_ccl_la_ia_bias_returns_independent_arrays() -> None: amplitude[0] = 99.0 np.testing.assert_allclose(z_out, np.array([0.0, 0.5, 1.0])) - np.testing.assert_allclose(ia_bias, np.array([1.0, 2.0, 3.0])) + np.testing.assert_allclose(ia_bias, np.array([-1.0, -2.0, -3.0])) def test_make_ccl_la_ia_bias_rejects_empty_redshift() -> None: @@ -189,7 +193,9 @@ def test_make_ccl_la_ia_bias_rejects_empty_redshift() -> None: make_ccl_la_ia_bias(np.array([])) -def test_make_ccl_la_ia_bias_rejects_empty_amplitude_for_nonempty_redshift() -> None: +def test_make_ccl_la_ia_bias_rejects_empty_amplitude_for_nonempty_redshift() -> ( + None +): """Tests that LA IA bias rejects empty amplitudes for nonempty redshift arrays.""" z = np.array([0.0, 0.5]) @@ -208,4 +214,4 @@ def test_make_ccl_la_ia_bias_accepts_length_one_amplitude_array() -> None: z_out, ia_bias = make_ccl_la_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.full_like(z, 2.0)) + np.testing.assert_allclose(ia_bias, np.full_like(z, -2.0)) diff --git a/tests/test_backends_ccl_nla.py b/tests/test_backends_ccl_nla.py index 26afee5..fc0fca3 100644 --- a/tests/test_backends_ccl_nla.py +++ b/tests/test_backends_ccl_nla.py @@ -15,7 +15,7 @@ def test_make_ccl_nla_ia_bias_uses_default_amplitude() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, a_ia=2.5) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.full_like(z, 2.5)) + np.testing.assert_allclose(ia_bias, np.full_like(z, -2.5)) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -28,7 +28,7 @@ def test_make_ccl_nla_ia_bias_uses_precomputed_amplitude() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, amplitude) + np.testing.assert_allclose(ia_bias, -amplitude) def test_make_ccl_nla_ia_bias_accepts_scalar_amplitude_for_scalar_z() -> None: @@ -36,7 +36,7 @@ def test_make_ccl_nla_ia_bias_accepts_scalar_amplitude_for_scalar_z() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(0.5, amplitude=2.0) np.testing.assert_allclose(z_out, np.array([0.5])) - np.testing.assert_allclose(ia_bias, np.array([2.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0])) assert z_out.shape == (1,) assert ia_bias.shape == (1,) @@ -48,7 +48,7 @@ def test_make_ccl_nla_ia_bias_accepts_scalar_amplitude_for_array_z() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=2.0) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.array([2.0, 2.0, 2.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0, -2.0, -2.0])) def test_make_ccl_nla_ia_bias_rejects_amplitude_shape_mismatch() -> None: @@ -71,7 +71,9 @@ def test_make_ccl_nla_ia_bias_rejects_amplitude_shape_mismatch() -> None: np.array([0.0, -np.inf]), ], ) -def test_make_ccl_nla_ia_bias_rejects_nonfinite_redshift(z: np.ndarray) -> None: +def test_make_ccl_nla_ia_bias_rejects_nonfinite_redshift( + z: np.ndarray, +) -> None: """Tests that NLA IA bias rejects nonfinite redshift values.""" with pytest.raises(ValueError, match="z must contain only finite values."): make_ccl_nla_ia_bias(z) @@ -91,7 +93,9 @@ def test_make_ccl_nla_ia_bias_rejects_nonfinite_amplitude( """Tests that NLA IA bias rejects nonfinite amplitude values.""" z = np.array([0.0, 0.5]) - with pytest.raises(ValueError, match="amplitude must contain only finite values."): + with pytest.raises( + ValueError, match="amplitude must contain only finite values." + ): make_ccl_nla_ia_bias(z, amplitude=amplitude) @@ -103,7 +107,9 @@ def test_make_ccl_nla_ia_bias_rejects_nonfinite_amplitude( np.array([0.0, -1.0]), ], ) -def test_make_ccl_nla_ia_bias_rejects_invalid_redshift_domain(z: np.ndarray) -> None: +def test_make_ccl_nla_ia_bias_rejects_invalid_redshift_domain( + z: np.ndarray, +) -> None: """Tests that NLA IA bias rejects redshift values less than or equal to minus one.""" with pytest.raises( ValueError, @@ -120,7 +126,7 @@ def test_make_ccl_nla_ia_bias_preserves_redshift_and_amplitude_order() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, amplitude) + np.testing.assert_allclose(ia_bias, -amplitude) def test_make_ccl_nla_ia_bias_returns_copies_as_float_arrays() -> None: @@ -131,7 +137,7 @@ def test_make_ccl_nla_ia_bias_returns_copies_as_float_arrays() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, np.array([1.0, 0.0])) - np.testing.assert_allclose(ia_bias, np.array([2.0, 1.0])) + np.testing.assert_allclose(ia_bias, np.array([-2.0, -1.0])) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -144,7 +150,7 @@ def test_make_ccl_nla_ia_bias_accepts_list_redshift_and_amplitude() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, np.array(z)) - np.testing.assert_allclose(ia_bias, np.array(amplitude)) + np.testing.assert_allclose(ia_bias, -np.array(amplitude)) assert z_out.dtype == np.float64 assert ia_bias.dtype == np.float64 @@ -180,7 +186,7 @@ def test_make_ccl_nla_ia_bias_returns_independent_arrays() -> None: amplitude[0] = 99.0 np.testing.assert_allclose(z_out, np.array([0.0, 0.5, 1.0])) - np.testing.assert_allclose(ia_bias, np.array([1.0, 2.0, 3.0])) + np.testing.assert_allclose(ia_bias, np.array([-1.0, -2.0, -3.0])) def test_make_ccl_nla_ia_bias_rejects_empty_redshift() -> None: @@ -189,7 +195,9 @@ def test_make_ccl_nla_ia_bias_rejects_empty_redshift() -> None: make_ccl_nla_ia_bias(np.array([])) -def test_make_ccl_nla_ia_bias_rejects_empty_amplitude_for_nonempty_redshift() -> None: +def test_make_ccl_nla_ia_bias_rejects_empty_amplitude_for_nonempty_redshift() -> ( + None +): """Tests that NLA IA bias rejects empty amplitudes for nonempty redshift arrays.""" z = np.array([0.0, 0.5]) @@ -208,4 +216,4 @@ def test_make_ccl_nla_ia_bias_accepts_length_one_amplitude_array() -> None: z_out, ia_bias = make_ccl_nla_ia_bias(z, amplitude=amplitude) np.testing.assert_allclose(z_out, z) - np.testing.assert_allclose(ia_bias, np.full_like(z, 2.0)) + np.testing.assert_allclose(ia_bias, np.full_like(z, -2.0)) diff --git a/tests/test_models_discovery.py b/tests/test_models_discovery.py index 53066ad..2247611 100644 --- a/tests/test_models_discovery.py +++ b/tests/test_models_discovery.py @@ -31,13 +31,18 @@ def fake_import_module(module_name: str): return SimpleNamespace() monkeypatch.setattr(_discovery.pkgutil, "iter_modules", fake_iter_modules) - monkeypatch.setattr(_discovery.importlib, "import_module", fake_import_module) + monkeypatch.setattr( + _discovery.importlib, "import_module", fake_import_module + ) _discovery.import_model_modules() assert imported_modules == [] -def test_import_model_modules_skips_registry_and_helper_modules(monkeypatch) -> None: + +def test_import_model_modules_skips_registry_and_helper_modules( + monkeypatch, +) -> None: """Tests that registry and helper modules are not imported.""" module_names = [ "_discovery", @@ -54,7 +59,9 @@ def fake_import_module(module_name: str): return SimpleNamespace() monkeypatch.setattr(_discovery.pkgutil, "iter_modules", fake_iter_modules) - monkeypatch.setattr(_discovery.importlib, "import_module", fake_import_module) + monkeypatch.setattr( + _discovery.importlib, "import_module", fake_import_module + ) _discovery.import_model_modules() @@ -166,4 +173,3 @@ def test_real_discovery_retrieves_halo_model() -> None: np.testing.assert_allclose(parameters["b"], [-2.0, -2.0, -2.0]) np.testing.assert_allclose(parameters["k_1h"], [1.5, 1.5, 1.5]) np.testing.assert_allclose(parameters["k_2h"], [0.2, 0.2, 0.2]) - diff --git a/tests/test_models_halo_model.py b/tests/test_models_halo_model.py index c52593b..b72a8dd 100644 --- a/tests/test_models_halo_model.py +++ b/tests/test_models_halo_model.py @@ -219,7 +219,9 @@ def test_halo_model_ia_parameters_accepts_negative_amplitudes() -> None: np.testing.assert_allclose(parameters["b"], np.full_like(z, -1.7)) -def test_halo_model_ia_parameters_transition_scales_follow_input_shape() -> None: +def test_halo_model_ia_parameters_transition_scales_follow_input_shape() -> ( + None +): """Tests that halo model IA transition scales follow the redshift shape.""" z = np.array( [ diff --git a/tests/test_models_la.py b/tests/test_models_la.py index 9acfebd..b9c3715 100644 --- a/tests/test_models_la.py +++ b/tests/test_models_la.py @@ -91,7 +91,9 @@ def test_la_mass_amplitude_matches_mass_scaling() -> None: beta=beta, ) - expected = a_ia * red_fraction * (halo_mass / DEFAULT_PIVOT_HALO_MASS) ** beta + expected = ( + a_ia * red_fraction * (halo_mass / DEFAULT_PIVOT_HALO_MASS) ** beta + ) np.testing.assert_allclose(amplitude, expected) assert amplitude.dtype == np.float64 @@ -100,7 +102,9 @@ def test_la_mass_amplitude_matches_mass_scaling() -> None: def test_la_mass_amplitude_accepts_broadcastable_inputs() -> None: """Tests that mass dependent LA amplitude accepts broadcastable inputs.""" - halo_mass = np.array([DEFAULT_PIVOT_HALO_MASS, 2.0 * DEFAULT_PIVOT_HALO_MASS]) + halo_mass = np.array( + [DEFAULT_PIVOT_HALO_MASS, 2.0 * DEFAULT_PIVOT_HALO_MASS] + ) amplitude = la_mass_amplitude( a_ia=2.0, @@ -307,7 +311,9 @@ def red_fraction( return 1.2 -def test_red_fraction_from_luminosity_functions_rejects_invalid_fraction() -> None: +def test_red_fraction_from_luminosity_functions_rejects_invalid_fraction() -> ( + None +): """Tests that red fraction helper rejects invalid returned fractions.""" red_lf = SimpleNamespace(fractions=InvalidFakeFractions()) @@ -322,7 +328,9 @@ def test_red_fraction_from_luminosity_functions_rejects_invalid_fraction() -> No ) -def test_red_fraction_from_luminosity_functions_rejects_invalid_limits() -> None: +def test_red_fraction_from_luminosity_functions_rejects_invalid_limits() -> ( + None +): """Tests that red fraction helper rejects invalid magnitude limits.""" red_lf = SimpleNamespace(fractions=FakeFractions()) @@ -411,7 +419,9 @@ def test_lf_la_amplitude_rejects_invalid_redshift() -> None: def test_lf_la_amplitude_rejects_invalid_red_fraction() -> None: """Tests that LF weighted LA amplitude rejects invalid red fractions.""" with pytest.raises(ValueError): - lf_la_amplitude([0.0, 0.5], [1.0, 1.0], a_ia=1.0, red_fraction=[0.5, -0.1]) + lf_la_amplitude( + [0.0, 0.5], [1.0, 1.0], a_ia=1.0, red_fraction=[0.5, -0.1] + ) def test_lf_la_amplitude_rejects_invalid_low_z_pivot() -> None: diff --git a/tests/test_models_nla.py b/tests/test_models_nla.py index bc3b993..4975228 100644 --- a/tests/test_models_nla.py +++ b/tests/test_models_nla.py @@ -130,8 +130,18 @@ def test_nla_mass_scalar() -> None: @pytest.mark.parametrize( ("red_fraction", "halo_mass", "pivot_halo_mass", "match"), [ - ([-0.1, 0.5], [1.0e13, 2.0e13], DEFAULT_PIVOT_HALO_MASS, "red_fraction"), - ([0.1, 1.2], [1.0e13, 2.0e13], DEFAULT_PIVOT_HALO_MASS, "red_fraction"), + ( + [-0.1, 0.5], + [1.0e13, 2.0e13], + DEFAULT_PIVOT_HALO_MASS, + "red_fraction", + ), + ( + [0.1, 1.2], + [1.0e13, 2.0e13], + DEFAULT_PIVOT_HALO_MASS, + "red_fraction", + ), ([0.1, 0.5], [0.0, 2.0e13], DEFAULT_PIVOT_HALO_MASS, "halo_mass"), ([0.1, 0.5], [1.0e13, 2.0e13], 0.0, "pivot_halo_mass"), ], @@ -490,7 +500,12 @@ def test_registry_aliases() -> None: assert aliases["nla"] == ("constant_nla", "nla_constant") assert aliases["nla_z"] == ("z_nla", "redshift_nla", "nla_redshift") - assert aliases["nla_m"] == ("m_nla", "mass_nla", "nla_mass", "halo_mass_nla") + assert aliases["nla_m"] == ( + "m_nla", + "mass_nla", + "nla_mass", + "halo_mass_nla", + ) assert aliases["nla_lf"] == ( "lf_nla", "luminosity_nla", diff --git a/tests/test_models_tatt.py b/tests/test_models_tatt.py index 42c31fd..d0df1c8 100644 --- a/tests/test_models_tatt.py +++ b/tests/test_models_tatt.py @@ -150,9 +150,7 @@ def test_tatt_normalized_coefficients_applies_amplitudes() -> None: expected_c1 = -a1_z * c1_rho_critical * omega_m / growth_factor expected_c2 = a2_z * 5.0 * c1_rho_critical * omega_m / growth_factor**2 - expected_cdelta = ( - -a1delta_z * c1_rho_critical * omega_m / growth_factor - ) + expected_cdelta = -a1delta_z * c1_rho_critical * omega_m / growth_factor np.testing.assert_allclose(coefficients["c1"], expected_c1) np.testing.assert_allclose(coefficients["c2"], expected_c2) @@ -189,7 +187,9 @@ def test_tatt_normalized_coefficients_supports_omega_m_squared_c2() -> None: np.testing.assert_allclose(coefficients["c2"], expected_c2) -def test_tatt_normalized_coefficients_rejects_growth_factor_shape_mismatch() -> None: +def test_tatt_normalized_coefficients_rejects_growth_factor_shape_mismatch() -> ( + None +): """Tests that normalized TATT coefficients reject growth factor shape mismatch.""" z = np.array([0.0, 0.5]) growth_factor = np.array([1.0, 0.8, 0.6]) From 1eb71826723996cc5b395c908ec3214d5704c8bd Mon Sep 17 00:00:00 2001 From: "niko.sarcevic" Date: Sat, 27 Jun 2026 09:31:35 -0400 Subject: [PATCH 3/3] Run matching tox environment in CI --- .github/workflows/ci.yml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3fb1bd..ae2715a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,9 +32,21 @@ jobs: needs: linting runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: - os: [ubuntu-latest] - python-version: ["3.10", "3.11", "3.12", "3.13"] + include: + - os: ubuntu-latest + python-version: "3.10" + tox-env: py310 + - os: ubuntu-latest + python-version: "3.11" + tox-env: py311 + - os: ubuntu-latest + python-version: "3.12" + tox-env: py312 + - os: ubuntu-latest + python-version: "3.13" + tox-env: py313 steps: - uses: actions/checkout@v4 @@ -49,7 +61,7 @@ jobs: run: uv sync --extra dev - name: Run tests - run: uv run tox -m test + run: uv run tox -e ${{ matrix.tox-env }} finalise: runs-on: ubuntu-latest