From 7e537335741ae2f2be8c50fe1cc03ca2988797fd Mon Sep 17 00:00:00 2001 From: Scott Staniewicz Date: Mon, 1 Dec 2025 13:27:39 -0500 Subject: [PATCH 1/3] Convert pickled `RegularGridInterpolator` objects to numpy saved files Closes #2 --- src/whirlwind/_cost.py | 21 +++++++++++++----- ...0-spline.pkl => carballo-pdf-0-spline.npz} | Bin 30837 -> 31998 bytes ...1-spline.pkl => carballo-pdf-1-spline.npz} | Bin 30837 -> 31998 bytes 3 files changed, 16 insertions(+), 5 deletions(-) rename src/whirlwind/{carballo-pdf-0-spline.pkl => carballo-pdf-0-spline.npz} (92%) rename src/whirlwind/{carballo-pdf-1-spline.pkl => carballo-pdf-1-spline.npz} (93%) diff --git a/src/whirlwind/_cost.py b/src/whirlwind/_cost.py index c583087..bb66d4b 100644 --- a/src/whirlwind/_cost.py +++ b/src/whirlwind/_cost.py @@ -1,8 +1,9 @@ import importlib.resources -import pickle +from pathlib import Path import numpy as np import scipy.ndimage +from scipy.interpolate import RegularGridInterpolator __all__ = [ "calc_smooth_phase_gradients", @@ -29,14 +30,24 @@ def calc_smooth_phase_gradients(igram): return phase_dy_smooth, phase_dx_smooth +def _load_rgi(path: Path | str) -> RegularGridInterpolator: + """Reconstruct RegularGridInterpolator from saved data.""" + data = np.load(path, allow_pickle=True) + return RegularGridInterpolator( + points=tuple(data['grid']), + values=data['values'], + method=str(data['method']), + bounds_error=bool(data['bounds_error']), + fill_value=float(data['fill_value']) if data['fill_value'] is not None else None, + ) + + def load_carballo_pdf_splines(): """ """ files = importlib.resources.files(__package__) - with files.joinpath("carballo-pdf-0-spline.pkl").open("rb") as f: - spline_pdf0 = pickle.load(f) - with files.joinpath("carballo-pdf-1-spline.pkl").open("rb") as f: - spline_pdf1 = pickle.load(f) + spline_pdf0 = _load_rgi(files.joinpath("carballo-pdf-0-spline.npz")) + spline_pdf1 = _load_rgi(files.joinpath("carballo-pdf-1-spline.npz")) return spline_pdf0, spline_pdf1 diff --git a/src/whirlwind/carballo-pdf-0-spline.pkl b/src/whirlwind/carballo-pdf-0-spline.npz similarity index 92% rename from src/whirlwind/carballo-pdf-0-spline.pkl rename to src/whirlwind/carballo-pdf-0-spline.npz index 49f48d84c67a2fc0d263c1278db50f1f2abb6171..4cccfd2d527652bc94132819224c2d9abea23c55 100644 GIT binary patch delta 1479 zcmezRf$`r@#`*wnW)@ur2vB5LBe!AWe<B?;*7+CR3Kl& zSVvPwp;kdb!5@gp1Y8X)Q#UX{+|(nMSDIT;sTV)7+|`e{bxHr3*<>K;cZ_sC8;xZibe)g2CFv%P%k?~DWkVMki)a_ zvnYN^&wQQvxojYNq)5RG`Uvr~%yhg{>48z+AupE=$ZQO)Z86@s3i6cVINu zAht=fATErZ40RL?!5A9YBnLFtW(8)8QnWPET(ti#vKMkwOEU7|sbmJk2MjP8yB9*u zi1Gr&-Ss598%YCK4$wiFK%57}sX&|v#6>`i8ZRQU|Chi#B>;?nj}LK{D$OGoJ^el=R)(uPV>;YFi-FSJ&~4~lM@e4VK5(bKs>+z zqp|t`J%QEZ%Eja+D}+zEAny4AOk#{oy3D8r5vZU6;d&0Jt3gx)BZ!2ROX%7_*$b3; zKp1K^NI6hfDbOH9W<%EpO4Fbe3&N=SGAkMC84yVvT_Y&nfRY0U3ji?;G%(s$F`%R( uP!yo+21OVsDnOVIrWHs7Jz32Fk3N~wRETC)Hjo-tAXET`!U>=f1_l61@m)Uv delta 318 zcmZ{gzfQw25Qh^88A!#Sfxv>gFtke~wk|9TR47|tz$EdJ7&&%i$A}K7FrcWCm#W9a zWAt5k4i+R>5LS^`5VxJa-|su=zCQi;H-GjJJm1`T>#?yeSTjwSXhAiSXDuW|l??6S z1WLm*HCBvX{!*!MiNi;{$AJxNXe&w4hMWn=6xv=cji8!YRUmJ~E!SIt@nV7+cKk_BG?2tcy6Fef&Ji GB?;*7+CR3Kl& zSVvPwp;kdb!5@gp1Y8X)Q#UX{+|(nMSDIT;sTV)7+|`e{bxHr3*<>K;cZ_sC8;xZibe)g2CFv%P%k?~DWkVMki)a_ zvnYN^&wQQvxojYNq)5RG`Uvr~#ao|93JhfVqGHT$Y$qnpzAC;vJL(2HC{wy|1W`gN&pxyN%^IDDaG-rMMe2V z^|0t^1Zo2T7>(6$HA#jf_zlUWIGH&8&xPiRo#vr)VV>XvdLk_|Cnp}9!eBn=fOvob zMq~8>dIGD*m5a$uRtTSRLEQ5Ln8X;FbeT~LB2YmC!u1?bSA(bqMi2=rm(aC=vKJ`x zfH2f-kaD1|QlLSI%!aNHl%_!`7KBmtWmYoOGa!;Ux<*jC0VM|z764)xXkfIhVn9hn upeR7s4T>;ORDduaOe>HEda{}U9(^*UsSwSqY#=qPK&Su=g%dy}3=9B;5MCJo delta 318 zcmZ{gzfQw25Qh^88A!#Sfxv>gFtke~wk|9TR47|tz$EdJ7&&%i$A}K7FrcWCm#W9a zWAt5k4i+R>5LS^`5VxJa-|su=zCQi;H-GjJJm1`T>#?yeSTjwSXhAiSXDuW|l??6S z1WLm*HCBvX{!*!MiNi;{$AJxNXe&w4hMWn=6xv=cji8!YRUmJ~E!SIt@nV7+cKk_BG?2tcy6Fef&Ji G Date: Wed, 17 Dec 2025 16:20:24 -0500 Subject: [PATCH 2/3] fix importlib resource cleanup, no need for `pickle=True` --- src/whirlwind/_cost.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/whirlwind/_cost.py b/src/whirlwind/_cost.py index bb66d4b..a1c8e41 100644 --- a/src/whirlwind/_cost.py +++ b/src/whirlwind/_cost.py @@ -32,22 +32,24 @@ def calc_smooth_phase_gradients(igram): def _load_rgi(path: Path | str) -> RegularGridInterpolator: """Reconstruct RegularGridInterpolator from saved data.""" - data = np.load(path, allow_pickle=True) + data = np.load(path, allow_pickle=False) return RegularGridInterpolator( - points=tuple(data['grid']), - values=data['values'], - method=str(data['method']), - bounds_error=bool(data['bounds_error']), - fill_value=float(data['fill_value']) if data['fill_value'] is not None else None, + points=tuple(data["grid"]), + values=data["values"], + method=str(data["method"]), + bounds_error=bool(data["bounds_error"]), + fill_value=float(data["fill_value"]) + if data["fill_value"] is not None + else None, ) def load_carballo_pdf_splines(): """ """ - files = importlib.resources.files(__package__) - - spline_pdf0 = _load_rgi(files.joinpath("carballo-pdf-0-spline.npz")) - spline_pdf1 = _load_rgi(files.joinpath("carballo-pdf-1-spline.npz")) + with importlib.resources.path(__package__, "carballo-pdf-0-spline.npz") as p: + spline_pdf0 = _load_rgi(p) + with importlib.resources.path(__package__, "carballo-pdf-1-spline.npz") as p: + spline_pdf1 = _load_rgi(p) return spline_pdf0, spline_pdf1 From b8a4537ec9cec1bf97c96b2f504479f06be5ed1c Mon Sep 17 00:00:00 2001 From: Scott Staniewicz Date: Sat, 24 Jan 2026 14:31:36 -0500 Subject: [PATCH 3/3] Fix saving tuple or arrays to avoid pickle and ruff --- src/whirlwind/_cost.py | 8 ++++---- src/whirlwind/carballo-pdf-0-spline.npz | Bin 31998 -> 32215 bytes src/whirlwind/carballo-pdf-1-spline.npz | Bin 31998 -> 32215 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/whirlwind/_cost.py b/src/whirlwind/_cost.py index a1c8e41..28017df 100644 --- a/src/whirlwind/_cost.py +++ b/src/whirlwind/_cost.py @@ -33,14 +33,14 @@ def calc_smooth_phase_gradients(igram): def _load_rgi(path: Path | str) -> RegularGridInterpolator: """Reconstruct RegularGridInterpolator from saved data.""" data = np.load(path, allow_pickle=False) + grid = (data["grid_0"], data["grid_1"], data["grid_2"]) + fill_value = float(data["fill_value"]) if data["fill_value"] is not None else None return RegularGridInterpolator( - points=tuple(data["grid"]), + points=grid, values=data["values"], method=str(data["method"]), bounds_error=bool(data["bounds_error"]), - fill_value=float(data["fill_value"]) - if data["fill_value"] is not None - else None, + fill_value=fill_value, ) diff --git a/src/whirlwind/carballo-pdf-0-spline.npz b/src/whirlwind/carballo-pdf-0-spline.npz index 4cccfd2d527652bc94132819224c2d9abea23c55..b057a8572dc9e11564087e27d3059bf859491d81 100644 GIT binary patch delta 466 zcmezOlkxg*Mza8KW)@ur2vB6`RQT-k9}2h_L>SVGGE?FW^zsTS85sl^Di|T^Di|lv zuaud5oLP%SQ%9k8^1&)=My|;nj6Y0KP20GC<~j`13}L3-fZBRv^1Mn}pkeClhK4#Y z^Cs`FW}m!-DG1HP9?fU^7$zDKZ=w`)(B@L+$;>!|qN>f3e4e(}V1L}{!VtJ*x1(ka7$@xX8dby=JC7FpuMTwPDdU)cC zQj_!Zic5-0lS`&dp3=h#Ryn1IJud~KWbzbmhSn+0j7d}4rvy#W@MiR8Zk>|B+{2nu zQdy7+(!%6#F{QHuBFo&vSTn`XFUZdeKn_n2 zQyPkX8=!tO*{ar@(ROlC Ytt}(NSVGGE?FW^zsTS85sl^Di|T^Di|lv zuaud5oLP%SQ%9k8^1&)=My|;nj6Y0KP20GC<~j`13}L3-fZBRv^1Mn}pkeClhK4#Y z^Cs`FW}m!-DG1HP9?fU^7$zDKZ=w`)(B@L+$;>!|qN>f3e4e(}V1L}{!VtJ*x1(ka7$@xX8dby=JC7FpuMTwPDdU)cC zQj_!Zic5-0lS`&dp3=h#Ryn1IJud~KWbzbmhSn+0j7d}4rvy#W@MiR8Zk>|B+{2nu zQdy7+(!%6#F{QHuBFo&vSTn`XFUZdeKn_n2 zQyPkX8=!tO*{ar@(ROlC Ytt}(N