From 9e6de79c122ba4c5d654006553a2ddbc9c0edb30 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:03 +0200 Subject: [PATCH 01/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_bssfp.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_bssfp.py b/src/torchsim/_functional/_bssfp.py index 7e3cf754..de0c4d15 100644 --- a/src/torchsim/_functional/_bssfp.py +++ b/src/torchsim/_functional/_bssfp.py @@ -2,6 +2,8 @@ __all__ = ["bssfp_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -15,15 +17,16 @@ def bssfp_sim( TR: float, T1: float | npt.ArrayLike, T2: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, phase_inc: float = 180.0, B0: float | npt.ArrayLike = 0.0, chemshift: float | npt.ArrayLike = 0.0, M0: float | npt.ArrayLike = 1.0, - device: str | torch.device = None, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ - SPoiled Gradient Recalled echo simulator wrapper. + Balanced steady-state free-precession simulator wrapper. Parameters ---------- @@ -49,6 +52,10 @@ def bssfp_sim( Chemical shift in Hz, default is ``0.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -76,4 +83,5 @@ def bssfp_sim( TR=TR, TE=TE, phase_inc=phase_inc, + **values, ) From 6a473f821306421bc60382df977d7e06a97f99aa Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:06 +0200 Subject: [PATCH 02/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_spgr.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/torchsim/_functional/_spgr.py b/src/torchsim/_functional/_spgr.py index 95b9b291..15c6febe 100644 --- a/src/torchsim/_functional/_spgr.py +++ b/src/torchsim/_functional/_spgr.py @@ -2,6 +2,8 @@ __all__ = ["spgr_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -15,11 +17,12 @@ def spgr_sim( TR: float, T1: float | npt.ArrayLike, T2star: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, B0: float | npt.ArrayLike = 0.0, chemshift: float | npt.ArrayLike = 0.0, M0: float | npt.ArrayLike = 1.0, - device: str | torch.device = None, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ SPoiled Gradient Recalled echo simulator wrapper. @@ -45,6 +48,10 @@ def spgr_sim( Chemical shift in Hz, default is ``0.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -71,4 +78,5 @@ def spgr_sim( flip=flip, TR=TR, TE=TE, + **values, ) From 95521ee5814a2dde16ac487e83a0a2b9e3c6dcdf Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:09 +0200 Subject: [PATCH 03/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_fse.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/torchsim/_functional/_fse.py b/src/torchsim/_functional/_fse.py index 2ca9ee69..d4751649 100644 --- a/src/torchsim/_functional/_fse.py +++ b/src/torchsim/_functional/_fse.py @@ -2,6 +2,8 @@ __all__ = ["fse_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -18,11 +20,12 @@ def fse_sim( TR: float | npt.ArrayLike = 1e6, exc_flip: float = 90.0, exc_phase: float = 90.0, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, B1: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, states: int = 10, - device: str | torch.device = None, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ Fast Spin Echo simulator wrapper. @@ -35,7 +38,7 @@ def fse_sim( Echo spacing in milliseconds. phases : float | npt.ArrayLike, optional Refocusing flip angle phases in degrees. - The default is ``90.0``. + The default is ``0.0``. TR : float | npt.ArrayLike, optional Repetition time in milliseconds. The default is ``1e6``. @@ -44,7 +47,7 @@ def fse_sim( The default is ``90.0``. exc_phase : float, optional Excitation flip angle phase in degrees. - The default is ``0.0``. + The default is ``90.0``. T1 : float | npt.ArrayLike Longitudinal relaxation time in milliseconds. T2 : float | npt.ArrayLike @@ -64,6 +67,12 @@ def fse_sim( states : int, optional Number of EPG states to be retained. The default is ``10``. + phases : float or array-like, optional + Sequence phase schedule in degrees. The default is ``0.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -93,4 +102,5 @@ def fse_sim( exc_flip=exc_flip, exc_phase=exc_phase, states=states, + **values, ) From ca7aec33965e684dc342c4e13930c7c9bd173055 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:12 +0200 Subject: [PATCH 04/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_mprage.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/torchsim/_functional/_mprage.py b/src/torchsim/_functional/_mprage.py index b29db986..b110c4c4 100644 --- a/src/torchsim/_functional/_mprage.py +++ b/src/torchsim/_functional/_mprage.py @@ -2,6 +2,8 @@ __all__ = ["mprage_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -15,10 +17,12 @@ def mprage_sim( TRspgr: float, nshots: int | npt.ArrayLike, T1: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, inv_efficiency: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, - device: str | torch.device = None, + phases: float | npt.ArrayLike = 0.0, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ MPRAGE simulator wrapper. @@ -49,6 +53,12 @@ def mprage_sim( TI : float | npt.ArrayLike, optional Inversion time in milliseconds. The default is ``0.0``. + phases : float or array-like, optional + Sequence phase schedule in degrees. The default is ``0.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -74,4 +84,6 @@ def mprage_sim( flip=flip, TRspgr=TRspgr, nshots=nshots, + phases=phases, + **values, ) From cc51fe57dfd3f2bd0753d7c2efce4734e05be2df Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:15 +0200 Subject: [PATCH 05/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_mp2rage.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/torchsim/_functional/_mp2rage.py b/src/torchsim/_functional/_mp2rage.py index 11b41094..c33c0230 100644 --- a/src/torchsim/_functional/_mp2rage.py +++ b/src/torchsim/_functional/_mp2rage.py @@ -2,6 +2,8 @@ __all__ = ["mp2rage_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -16,10 +18,12 @@ def mp2rage_sim( TRmp2rage: float, nshots: int | npt.ArrayLike, T1: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, inv_efficiency: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, - device: str | torch.device = None, + phases: float | npt.ArrayLike = 0.0, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ MP2RAGE simulator wrapper. @@ -52,6 +56,12 @@ def mp2rage_sim( TI : float | npt.ArrayLike, optional Inversion time in milliseconds. The default is ``0.0``. + phases : float or array-like, optional + Sequence phase schedule in degrees. The default is ``0.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -78,4 +88,6 @@ def mp2rage_sim( TRspgr=TRspgr, TRmp2rage=TRmp2rage, nshots=nshots, + phases=phases, + **values, ) From 0cb901f88be4307af93d2f561baf2fd48a973092 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:18 +0200 Subject: [PATCH 06/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_mpnrage.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/torchsim/_functional/_mpnrage.py b/src/torchsim/_functional/_mpnrage.py index 1c04e6cb..9bb4ddf2 100644 --- a/src/torchsim/_functional/_mpnrage.py +++ b/src/torchsim/_functional/_mpnrage.py @@ -2,6 +2,8 @@ __all__ = ["mpnrage_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -14,12 +16,14 @@ def mpnrage_sim( flip: npt.ArrayLike, TR: float | npt.ArrayLike, T1: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, B1: float | npt.ArrayLike = 1.0, inv_efficiency: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, TI: float = 0.0, - device: str | torch.device = None, + phases: float | npt.ArrayLike = 0.0, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ MPnRAGE simulator wrapper. @@ -46,6 +50,12 @@ def mpnrage_sim( TI : float | npt.ArrayLike, optional Inversion time in milliseconds. The default is ``0.0``. + phases : float or array-like, optional + Sequence phase schedule in degrees. The default is ``0.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -72,4 +82,6 @@ def mpnrage_sim( flip=flip, TR=TR, TI=TI, + phases=phases, + **values, ) From 432d59486def4bbfa4fdd8127447900ade99f7d2 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:22 +0200 Subject: [PATCH 07/25] api: bring functional wrappers up to Simulator --- src/torchsim/_functional/_mrf.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_mrf.py b/src/torchsim/_functional/_mrf.py index f7fb4f23..1b116333 100644 --- a/src/torchsim/_functional/_mrf.py +++ b/src/torchsim/_functional/_mrf.py @@ -2,6 +2,8 @@ __all__ = ["mrf_sim"] +from typing import Any + import numpy.typing as npt import torch @@ -14,14 +16,16 @@ def mrf_sim( TR: float | npt.ArrayLike, T1: float | npt.ArrayLike, T2: float | npt.ArrayLike, - diff: str | tuple[str] = None, + diff: str | tuple[str, ...] | None = None, B1: float | npt.ArrayLike = 1.0, inv_efficiency: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, TI: float = 0.0, + phases: float | npt.ArrayLike = 0.0, states: int = 10, nreps: int = 1, - device: str | torch.device = None, + device: str | torch.device | None = None, + **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ SSFP MR Fingerprinting simulator wrapper. @@ -54,6 +58,12 @@ def mrf_sim( nreps : int, optional Number of simulation repetitions. The default is ``1``. + phases : float or array-like, optional + Sequence phase schedule in degrees. The default is ``0.0``. + **values : optional + Additional tissue, protocol or run settings accepted by the corresponding + ``Simulator`` class. Explicit wrapper arguments remain available for + backwards compatibility. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). @@ -80,6 +90,7 @@ def mrf_sim( flip=flip, TR=TR, TI=TI, + phases=phases, states=states, - repetitions=nreps, + **{"repetitions": nreps, **values}, ) From 1730a258aceee29da7cb597e3b34b3a8766f7da1 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:47 +0200 Subject: [PATCH 08/25] api: correct FSE wrapper documentation --- src/torchsim/_functional/_fse.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/torchsim/_functional/_fse.py b/src/torchsim/_functional/_fse.py index d4751649..62bad0ab 100644 --- a/src/torchsim/_functional/_fse.py +++ b/src/torchsim/_functional/_fse.py @@ -57,18 +57,11 @@ def fse_sim( The default is ``None`` (no differentation). B1 : float | npt.ArrayLike, optional Flip angle scaling map, default is ``1.0``. - inv_efficiency : float | npt.ArrayLike, optional - Inversion efficiency map, default is ``1.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. - TI : float | npt.ArrayLike, optional - Inversion time in milliseconds. - The default is ``0.0``. states : int, optional Number of EPG states to be retained. The default is ``10``. - phases : float or array-like, optional - Sequence phase schedule in degrees. The default is ``0.0``. **values : optional Additional tissue, protocol or run settings accepted by the corresponding ``Simulator`` class. Explicit wrapper arguments remain available for From dfe920889eed3feb45a5830d4fb44a1ddf92109e Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:50 +0200 Subject: [PATCH 09/25] api: correct prepared-GRE wrapper documentation --- src/torchsim/_functional/_mprage.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/torchsim/_functional/_mprage.py b/src/torchsim/_functional/_mprage.py index b110c4c4..4095f2f8 100644 --- a/src/torchsim/_functional/_mprage.py +++ b/src/torchsim/_functional/_mprage.py @@ -50,9 +50,6 @@ def mprage_sim( Inversion efficiency map, default is ``1.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. - TI : float | npt.ArrayLike, optional - Inversion time in milliseconds. - The default is ``0.0``. phases : float or array-like, optional Sequence phase schedule in degrees. The default is ``0.0``. **values : optional From 669ff138bae2641ebf1d8ac11dcd821281655e49 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:53 +0200 Subject: [PATCH 10/25] api: correct prepared-GRE wrapper documentation From 477b514942736becd2bab4d7ea3a95c2f05211bc Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:56 +0200 Subject: [PATCH 11/25] api: fix functional wrapper docstrings --- src/torchsim/_functional/_bssfp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torchsim/_functional/_bssfp.py b/src/torchsim/_functional/_bssfp.py index de0c4d15..26cf66f4 100644 --- a/src/torchsim/_functional/_bssfp.py +++ b/src/torchsim/_functional/_bssfp.py @@ -48,7 +48,7 @@ def bssfp_sim( The default is ``180.0`` B0 : float | npt.ArrayLike, optional Frequency offset map in Hz, default is ``0.0.`` - chemshift : float | npt.ArrayLik, optional + chemshift : float | npt.ArrayLike, optional Chemical shift in Hz, default is ``0.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. From c36e25609a62a4ce9101b3d6897bd8f43d635289 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:38:58 +0200 Subject: [PATCH 12/25] api: fix functional wrapper docstrings --- src/torchsim/_functional/_spgr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torchsim/_functional/_spgr.py b/src/torchsim/_functional/_spgr.py index 15c6febe..6b052505 100644 --- a/src/torchsim/_functional/_spgr.py +++ b/src/torchsim/_functional/_spgr.py @@ -44,7 +44,7 @@ def spgr_sim( The default is ``None`` (no differentation). B0 : float | npt.ArrayLike, optional Frequency offset map in Hz, default is ``0.0.`` - chemshift : float | npt.ArrayLik, optional + chemshift : float | npt.ArrayLike, optional Chemical shift in Hz, default is ``0.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. From 0f622f7a93b0e355095a9ba49fe1bbcb972cbf0c Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:39:18 +0200 Subject: [PATCH 13/25] test: cover functional wrapper protocol parity --- tests/functionals/test_mrf_func.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/functionals/test_mrf_func.py b/tests/functionals/test_mrf_func.py index 0e8b1978..b73d6788 100644 --- a/tests/functionals/test_mrf_func.py +++ b/tests/functionals/test_mrf_func.py @@ -41,3 +41,21 @@ def test_scalar_gradient(flip): def test_multiple_gradient(flip): _, grad = mrf_sim(flip, TR=10.0, T1=(200, 500, 1000.0), T2=100.0, diff=("T1", "T2")) assert grad.shape == (3, 2, 100) + +def test_current_simulator_protocol_arguments_pass_through(flip): + """The convenience call accepts protocol fields added to MRFSimulator.""" + from torchsim.simulators import MRFSimulator + + phases = np.linspace(0.0, 117.0, flip.size, dtype=np.float32) + got = mrf_sim( + flip, + TR=10.0, + T1=1000.0, + T2=100.0, + phases=phases, + B0=23.0, + ) + expected = MRFSimulator(flip=flip, TR=10.0, phases=phases).simulate( + T1=1000.0, T2=100.0, B0=23.0 + ) + np.testing.assert_allclose(got, expected) From 62e87a674c33cb7b4ed29fee990ab0664e0e70be Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:39:22 +0200 Subject: [PATCH 14/25] test: cover functional wrapper physics parity --- tests/functionals/test_fse_func.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/functionals/test_fse_func.py b/tests/functionals/test_fse_func.py index 1e4af953..2c621600 100644 --- a/tests/functionals/test_fse_func.py +++ b/tests/functionals/test_fse_func.py @@ -41,3 +41,24 @@ def test_scalar_gradient(flip): def test_multiple_gradient(flip): _, grad = fse_sim(flip, ESP=1.0, T1=(200, 500, 1000.0), T2=100.0, diff=("T1", "T2")) assert grad.shape == (3, 2, 100) + +def test_current_simulator_physics_passes_through(flip): + """The convenience call does not hide physics the Simulator accepts.""" + from torchsim.simulators import FSESimulator + + got = fse_sim( + flip, + ESP=5.0, + T1=1000.0, + T2=100.0, + B0=17.0, + crusher_dephasing_rad=2 * np.pi, + voxel_size_m=1e-3, + ) + expected = FSESimulator( + flip=flip, + ESP=5.0, + crusher_dephasing_rad=2 * np.pi, + voxel_size_m=1e-3, + ).simulate(T1=1000.0, T2=100.0, B0=17.0) + np.testing.assert_allclose(got, expected) From 587de427aa828b6098fa3492ebafc58d50d78bed Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:39:57 +0200 Subject: [PATCH 15/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_bssfp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_bssfp.py b/src/torchsim/_functional/_bssfp.py index 26cf66f4..277b657e 100644 --- a/src/torchsim/_functional/_bssfp.py +++ b/src/torchsim/_functional/_bssfp.py @@ -53,9 +53,9 @@ def bssfp_sim( M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From c93dd21bd4f87c7ed64acfc9d859dc939c0e7e6c Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:11 +0200 Subject: [PATCH 16/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_spgr.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_spgr.py b/src/torchsim/_functional/_spgr.py index 6b052505..91d25435 100644 --- a/src/torchsim/_functional/_spgr.py +++ b/src/torchsim/_functional/_spgr.py @@ -49,9 +49,9 @@ def spgr_sim( M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From 2e0a9db8c7faaba1f66c42a27b8b949e6cc481a6 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:13 +0200 Subject: [PATCH 17/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_fse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_fse.py b/src/torchsim/_functional/_fse.py index 62bad0ab..9e565a3d 100644 --- a/src/torchsim/_functional/_fse.py +++ b/src/torchsim/_functional/_fse.py @@ -63,9 +63,9 @@ def fse_sim( Number of EPG states to be retained. The default is ``10``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From 440267c0cb584480697a7a36311f10d78d3decb6 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:17 +0200 Subject: [PATCH 18/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_mprage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_mprage.py b/src/torchsim/_functional/_mprage.py index 4095f2f8..01126b74 100644 --- a/src/torchsim/_functional/_mprage.py +++ b/src/torchsim/_functional/_mprage.py @@ -53,9 +53,9 @@ def mprage_sim( phases : float or array-like, optional Sequence phase schedule in degrees. The default is ``0.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From 7f66477cdf3994cb77ad085cfbee66fbcd2960ed Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:20 +0200 Subject: [PATCH 19/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_mp2rage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_mp2rage.py b/src/torchsim/_functional/_mp2rage.py index c33c0230..f77a1077 100644 --- a/src/torchsim/_functional/_mp2rage.py +++ b/src/torchsim/_functional/_mp2rage.py @@ -59,9 +59,9 @@ def mp2rage_sim( phases : float or array-like, optional Sequence phase schedule in degrees. The default is ``0.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From 41e3118f42d37a5b556cb81dda998f86d0d6ea83 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:23 +0200 Subject: [PATCH 20/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_mpnrage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_mpnrage.py b/src/torchsim/_functional/_mpnrage.py index 9bb4ddf2..2d9a33c8 100644 --- a/src/torchsim/_functional/_mpnrage.py +++ b/src/torchsim/_functional/_mpnrage.py @@ -53,9 +53,9 @@ def mpnrage_sim( phases : float or array-like, optional Sequence phase schedule in degrees. The default is ``0.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From f1c135cf8a07aece99fa98c03a8c88af40254b4c Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:26 +0200 Subject: [PATCH 21/25] api: clarify functional pass-through scope --- src/torchsim/_functional/_mrf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/torchsim/_functional/_mrf.py b/src/torchsim/_functional/_mrf.py index 1b116333..97979448 100644 --- a/src/torchsim/_functional/_mrf.py +++ b/src/torchsim/_functional/_mrf.py @@ -61,9 +61,9 @@ def mrf_sim( phases : float or array-like, optional Sequence phase schedule in degrees. The default is ``0.0``. **values : optional - Additional tissue, protocol or run settings accepted by the corresponding - ``Simulator`` class. Explicit wrapper arguments remain available for - backwards compatibility. + Additional call-time tissue, protocol or run settings accepted by + ``Simulator.simulate``. Settings fixed only at simulator construction + remain class-interface features. device : str | torch.device, optional Computational device for simulation. The default is ``None`` (infer from input). From 53979235793ad6571db970d29849c234070049cf Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:40:29 +0200 Subject: [PATCH 22/25] test: keep wrapper parity to call-time settings --- tests/functionals/test_fse_func.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/functionals/test_fse_func.py b/tests/functionals/test_fse_func.py index 2c621600..200cf727 100644 --- a/tests/functionals/test_fse_func.py +++ b/tests/functionals/test_fse_func.py @@ -52,13 +52,9 @@ def test_current_simulator_physics_passes_through(flip): T1=1000.0, T2=100.0, B0=17.0, - crusher_dephasing_rad=2 * np.pi, - voxel_size_m=1e-3, ) expected = FSESimulator( flip=flip, ESP=5.0, - crusher_dephasing_rad=2 * np.pi, - voxel_size_m=1e-3, ).simulate(T1=1000.0, T2=100.0, B0=17.0) np.testing.assert_allclose(got, expected) From 502263ce19e1bafdcd3999b67ff01b18a55a1139 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:45:07 +0200 Subject: [PATCH 23/25] style: apply pre-commit formatting --- tests/functionals/test_fse_func.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/functionals/test_fse_func.py b/tests/functionals/test_fse_func.py index 200cf727..82c1e4de 100644 --- a/tests/functionals/test_fse_func.py +++ b/tests/functionals/test_fse_func.py @@ -42,6 +42,7 @@ def test_multiple_gradient(flip): _, grad = fse_sim(flip, ESP=1.0, T1=(200, 500, 1000.0), T2=100.0, diff=("T1", "T2")) assert grad.shape == (3, 2, 100) + def test_current_simulator_physics_passes_through(flip): """The convenience call does not hide physics the Simulator accepts.""" from torchsim.simulators import FSESimulator From aed068fc26a2a47a25108a3e230a264e515cdb29 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:45:10 +0200 Subject: [PATCH 24/25] style: apply pre-commit formatting --- tests/functionals/test_mrf_func.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/functionals/test_mrf_func.py b/tests/functionals/test_mrf_func.py index b73d6788..1af564bc 100644 --- a/tests/functionals/test_mrf_func.py +++ b/tests/functionals/test_mrf_func.py @@ -42,6 +42,7 @@ def test_multiple_gradient(flip): _, grad = mrf_sim(flip, TR=10.0, T1=(200, 500, 1000.0), T2=100.0, diff=("T1", "T2")) assert grad.shape == (3, 2, 100) + def test_current_simulator_protocol_arguments_pass_through(flip): """The convenience call accepts protocol fields added to MRFSimulator.""" from torchsim.simulators import MRFSimulator From 5f71f3593d69567f1e67ad923012d827750170e8 Mon Sep 17 00:00:00 2001 From: Matteo Cencini <83717049+mcencini@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:00:13 +0200 Subject: [PATCH 25/25] fix: keep MP2RAGE wrapper to supported closed-form arguments --- src/torchsim/_functional/_mp2rage.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/torchsim/_functional/_mp2rage.py b/src/torchsim/_functional/_mp2rage.py index f77a1077..76d18311 100644 --- a/src/torchsim/_functional/_mp2rage.py +++ b/src/torchsim/_functional/_mp2rage.py @@ -21,7 +21,6 @@ def mp2rage_sim( diff: str | tuple[str, ...] | None = None, inv_efficiency: float | npt.ArrayLike = 1.0, M0: float | npt.ArrayLike = 1.0, - phases: float | npt.ArrayLike = 0.0, device: str | torch.device | None = None, **values: Any, ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: @@ -53,11 +52,6 @@ def mp2rage_sim( Inversion efficiency map, default is ``1.0``. M0 : float or array-like, optional Proton density scaling factor, default is ``1.0``. - TI : float | npt.ArrayLike, optional - Inversion time in milliseconds. - The default is ``0.0``. - phases : float or array-like, optional - Sequence phase schedule in degrees. The default is ``0.0``. **values : optional Additional call-time tissue, protocol or run settings accepted by ``Simulator.simulate``. Settings fixed only at simulator construction @@ -88,6 +82,5 @@ def mp2rage_sim( TRspgr=TRspgr, TRmp2rage=TRmp2rage, nshots=nshots, - phases=phases, **values, )