Skip to content

Commit 628aa8f

Browse files
authored
Merge pull request #83 from jhlegarreta/UseNumpyRng
ENH: Prefer using NumPy's random number generator
2 parents 237a9cb + 9263143 commit 628aa8f

File tree

9 files changed

+33
-24
lines changed

9 files changed

+33
-24
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies = [
2323
"dipy>=1.5.0",
2424
"joblib",
2525
"nipype>= 1.5.1,<2.0",
26-
"nitransforms>=21.0.0,<24",
26+
"nitransforms>=22.0.0,<24",
2727
"nireports",
2828
"numpy>=1.21.3",
2929
"nest-asyncio>=1.5.1",

src/nifreeze/model/gpr.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from __future__ import annotations
2626

2727
from numbers import Integral, Real
28-
from typing import Callable, ClassVar, Literal, Mapping, Optional, Sequence, Union
28+
from typing import Callable, Literal, Mapping, Optional, Sequence, Union
2929

3030
import numpy as np
3131
import numpy.typing as npt
@@ -156,14 +156,14 @@ class DiffusionGPR(GaussianProcessRegressor):
156156

157157
optimizer: Optional[Union[StrOptions, Callable, None]] = None
158158

159-
_parameter_constraints: ClassVar[dict] = {
159+
_parameter_constraints = {
160160
"kernel": [None, Kernel],
161-
"alpha": [Interval(Real, 0, None, closed="left"), np.ndarray],
162-
"optimizer": [StrOptions(SUPPORTED_OPTIMIZERS), callable, None],
163-
"n_restarts_optimizer": [Interval(Integral, 0, None, closed="left")],
161+
"alpha": [Interval(Real, 0, None, closed="left"), np.ndarray], # type: ignore
162+
"optimizer": [StrOptions(SUPPORTED_OPTIMIZERS), callable, None], # type: ignore
163+
"n_restarts_optimizer": [Interval(Integral, 0, None, closed="left")], # type: ignore
164164
"copy_X_train": ["boolean"],
165165
"normalize_y": ["boolean"],
166-
"n_targets": [Interval(Integral, 1, None, closed="left"), None],
166+
"n_targets": [Interval(Integral, 1, None, closed="left"), None], # type: ignore
167167
"random_state": ["random_state"],
168168
}
169169

src/nifreeze/testing/simulations.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import nibabel as nb
2828
import numpy as np
2929
from dipy.core.geometry import sphere2cart
30-
from dipy.core.gradients import gradient_table
30+
from dipy.core.gradients import GradientTable, gradient_table
3131
from dipy.core.sphere import HemiSphere, Sphere, disperse_charges
3232
from dipy.sims.voxel import all_tensor_evecs, multi_tensor, single_tensor
3333

@@ -148,7 +148,7 @@ def create_diffusion_encoding_gradient_dirs(
148148

149149
def create_single_shell_gradient_table(
150150
hsph_dirs: int, bval_shell: float, iterations: int = 5000
151-
) -> gradient_table:
151+
) -> GradientTable:
152152
"""
153153
Create a single-shell gradient table.
154154
@@ -163,7 +163,7 @@ def create_single_shell_gradient_table(
163163
164164
Returns
165165
-------
166-
:obj:`~dipy.core.gradients.gradient_table`
166+
:obj:`~dipy.core.gradients.GradientTable`
167167
The gradient table for the single-shell.
168168
169169
"""
@@ -182,7 +182,7 @@ def create_single_shell_gradient_table(
182182

183183

184184
def get_query_vectors(
185-
gtab: gradient_table, train_mask: np.ndarray
185+
gtab: GradientTable, train_mask: np.ndarray
186186
) -> tuple[np.ndarray, np.ndarray]:
187187
"""
188188
Get the diffusion-encoding gradient vectors for estimation from the gradient table.
@@ -193,7 +193,7 @@ def get_query_vectors(
193193
194194
Parameters
195195
----------
196-
gtab : :obj:`~dipy.core.gradients.gradient_table`
196+
gtab : :obj:`~dipy.core.gradients.GradientTable`
197197
Gradient table.
198198
train_mask : :obj:`~numpy.ndarray`
199199
Mask for selecting training vectors.

test/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,9 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
159159
"Warnings as errors: Activated.\n"
160160
f"{len(have_warnings)} warnings were raised and treated as errors.\n"
161161
)
162+
163+
164+
@pytest.fixture(autouse=True)
165+
def random_number_generator(request):
166+
"""Automatically set a fixed-seed random number generator for all tests."""
167+
request.node.rng = np.random.default_rng(1234)

test/test_data_base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@
3333

3434

3535
@pytest.fixture
36-
def random_dataset() -> BaseDataset:
36+
def random_dataset(request) -> BaseDataset:
3737
"""Create a BaseDataset with random data for testing."""
38-
data = np.random.rand(32, 32, 32, 5).astype(np.float32)
38+
39+
rng = request.node.rng
40+
data = rng.random((32, 32, 32, 5)).astype(np.float32)
3941
affine = np.eye(4, dtype=np.float32)
4042
return BaseDataset(dataobj=data, affine=affine)
4143

test/test_data_dmri.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
from nifreeze.data.dmri import find_shelling_scheme, load
3030

3131

32-
def _create_dwi_random_dataobj():
33-
rng = np.random.default_rng(1234)
32+
def _create_dwi_random_dataobj(request):
33+
rng = request.node.rng
3434

3535
n_gradients = 10
3636
b0s = 1
@@ -134,7 +134,7 @@ def test_load(datadir, tmp_path):
134134
assert np.allclose(dwi_h5.gradients, dwi_from_nifti2.gradients)
135135

136136

137-
def test_equality_operator(tmp_path):
137+
def test_equality_operator(tmp_path, request):
138138
# Create some random data
139139
(
140140
dwi_dataobj,
@@ -143,7 +143,7 @@ def test_equality_operator(tmp_path):
143143
b0_dataobj,
144144
gradients,
145145
b0_thres,
146-
) = _create_dwi_random_dataobj()
146+
) = _create_dwi_random_dataobj(request)
147147

148148
dwi, brainmask, b0 = _create_dwi_random_data(
149149
dwi_dataobj,

test/test_data_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from nifreeze.data.utils import apply_affines
66

77

8-
def test_apply_affines():
9-
rng = np.random.default_rng(1234)
8+
def test_apply_affines(request):
9+
rng = request.node.rng
1010

1111
# Create synthetic dataset
1212
nii_data = rng.random((10, 10, 10, 10))

test/test_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@
3636

3737

3838
@pytest.mark.parametrize("use_mask", (False, True))
39-
def test_trivial_model(use_mask):
39+
def test_trivial_model(request, use_mask):
4040
"""Check the implementation of the trivial B0 model."""
4141

42-
rng = np.random.default_rng(1234)
42+
rng = request.node.rng
4343

4444
# Should not allow initialization without an oracle
4545
with pytest.raises(TypeError):

test/test_splitting.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from nifreeze.data.splitting import lovo_split
2929

3030

31-
def test_lovo_split(datadir):
31+
def test_lovo_split(request, datadir):
3232
"""
3333
Test the lovo_split function.
3434
@@ -46,7 +46,8 @@ def test_lovo_split(datadir):
4646
data.gradients[:] = 0
4747

4848
# Select a random index
49-
index = np.random.randint(len(data))
49+
rng = request.node.rng
50+
index = rng.integers(len(data))
5051

5152
# Set 1 in dataobj and gradients of the dwi object at this specific index
5253
data.dataobj[..., index] = 1

0 commit comments

Comments
 (0)