Coverage for nilearn/decoding/tests/_testing.py: 0%

33 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-16 12:32 +0200

1"""Test utilities for decoding module.""" 

2 

3import numpy as np 

4from scipy import linalg 

5from scipy.ndimage import gaussian_filter 

6 

7 

8def create_graph_net_simulation_data( 

9 snr=1.0, 

10 n_samples=200, 

11 size=8, 

12 n_points=10, 

13 random_state=42, 

14 task="regression", 

15 smooth_X=1, 

16): 

17 """Generate graph net simulation data.""" 

18 generator = np.random.default_rng(random_state) 

19 # Coefs 

20 w = np.zeros((size, size, size)) 

21 for _ in range(n_points): 

22 point = ( 

23 generator.integers(0, size), 

24 generator.integers(0, size), 

25 generator.integers(0, size), 

26 ) 

27 w[point] = 1.0 

28 mask = np.ones((size, size, size), dtype=bool) 

29 w = gaussian_filter(w, sigma=1) 

30 w = w[mask] 

31 

32 # Generate smooth background noise 

33 XX = generator.standard_normal((n_samples, size, size, size)) 

34 noise = [] 

35 for i in range(n_samples): 

36 Xi = gaussian_filter(XX[i, :, :, :], smooth_X) 

37 Xi = Xi[mask] 

38 noise.append(Xi) 

39 noise = np.array(noise) 

40 

41 # Generate the signal y 

42 if task == "regression": 

43 y = generator.standard_normal(n_samples) 

44 elif task == "classification": 

45 y = np.ones(n_samples) 

46 y[::2] = -1 

47 X = np.dot(y[:, np.newaxis], w[np.newaxis]) 

48 norm_noise = linalg.norm(X, 2) / np.exp(snr / 20.0) 

49 noise_coef = norm_noise / linalg.norm(noise, 2) 

50 noise *= noise_coef 

51 snr = 20 * np.log(linalg.norm(X, 2) / linalg.norm(noise, 2)) 

52 

53 # Mixing of signal + noise and splitting into train/test 

54 X += noise 

55 X -= X.mean(axis=-1)[:, np.newaxis] 

56 X /= X.std(axis=-1)[:, np.newaxis] 

57 

58 return X, y, w, mask