Note
Go to the end to download the full example code or to run this example in your browser via Binder
Voxel-Based Morphometry on Oasis dataset#
This example uses Voxel-Based Morphometry (VBM) to study the relationship between aging and gray matter density.
The data come from the OASIS project. If you use it, you need to agree with the data usage agreement available on the website.
It has been run through a standard VBM pipeline (using SPM8 and NewSegment) to create VBM maps, which we study here.
Predictive modeling analysis: VBM bio-markers of aging?#
We run a standard SVM-ANOVA nilearn pipeline to predict age from the VBM data. We use only 100 subjects from the OASIS dataset to limit the memory usage.
Note that for an actual predictive modeling study of aging, the study should be ran on the full set of subjects. Also, all parameters should be set by cross-validation. This includes the smoothing applied to the data and the number of features selected by the ANOVA step. Indeed, even these data-preparation parameter impact significantly the prediction score.
Also, parameters such as the smoothing should be applied to the data and the number of features selected by the ANOVA step should be set by nested cross-validation, as they impact significantly the prediction score.
Brain mapping with mass univariate#
SVM weights are very noisy, partly because heavy smoothing is detrimental for the prediction here. A standard analysis using mass-univariate GLM (here permuted to have exact correction for multiple comparisons) gives a much clearer view of the important regions.
Note
If you are using Nilearn with a version older than 0.9.0
,
then you should either upgrade your version or import maskers
from the input_data
module instead of the maskers
module.
That is, you should manually replace in the following example all occurrences of:
from nilearn.maskers import NiftiMasker
with:
from nilearn.input_data import NiftiMasker
import matplotlib.pyplot as plt
import numpy as np
from nilearn import datasets
from nilearn.image import get_data
from nilearn.maskers import NiftiMasker
n_subjects = 100 # more subjects requires more memory
Load Oasis dataset#
oasis_dataset = datasets.fetch_oasis_vbm(
n_subjects=n_subjects, legacy_format=False
)
gray_matter_map_filenames = oasis_dataset.gray_matter_maps
age = oasis_dataset.ext_vars["age"].values
# Split data into training set and test set
from sklearn.model_selection import train_test_split
gm_imgs_train, gm_imgs_test, age_train, age_test = train_test_split(
gray_matter_map_filenames, age, train_size=0.6, random_state=0
)
# print basic information on the dataset
print(
"First gray-matter anatomy image (3D) is located at: "
f"{oasis_dataset.gray_matter_maps[0]}"
)
print(
"First white-matter anatomy image (3D) is located at: "
f"{oasis_dataset.white_matter_maps[0]}"
)
First gray-matter anatomy image (3D) is located at: /home/runner/work/nilearn/nilearn/nilearn_data/oasis1/OAS1_0001_MR1/mwrc1OAS1_0001_MR1_mpr_anon_fslswapdim_bet.nii.gz
First white-matter anatomy image (3D) is located at: /home/runner/work/nilearn/nilearn/nilearn_data/oasis1/OAS1_0001_MR1/mwrc2OAS1_0001_MR1_mpr_anon_fslswapdim_bet.nii.gz
Preprocess data#
nifti_masker = NiftiMasker(
standardize=False, smoothing_fwhm=2, memory="nilearn_cache"
) # cache options
gm_maps_masked = nifti_masker.fit_transform(gm_imgs_train)
# The features with too low between-subject variance are removed using
# :class:`sklearn.feature_selection.VarianceThreshold`.
from sklearn.feature_selection import VarianceThreshold
variance_threshold = VarianceThreshold(threshold=0.01)
variance_threshold.fit_transform(gm_maps_masked)
# Then we convert the data back to the mask image in order to use it for
# decoding process
mask = nifti_masker.inverse_transform(variance_threshold.get_support())
Prediction pipeline with ANOVA and SVR using
nilearn.decoding.DecoderRegressor
Object
# In nilearn we can benefit from the built-in DecoderRegressor object to
# do ANOVA with SVR instead of manually defining the whole pipeline.
# This estimator also uses Cross Validation to select best models and ensemble
# them. Furthermore, you can pass n_jobs=<some_high_value> to the
# DecoderRegressor class to take advantage of a multi-core system.
# To save time (because these are anat images with many voxels), we include
# only the 1-percent voxels most correlated with the age variable to fit. We
# also want to set mask hyperparameter to be the mask we just obtained above.
from nilearn.decoding import DecoderRegressor
decoder = DecoderRegressor(
estimator="svr",
mask=mask,
scoring="neg_mean_absolute_error",
screening_percentile=1,
n_jobs=1,
standardize="zscore_sample",
)
# Fit and predict with the decoder
decoder.fit(gm_imgs_train, age_train)
# Sort test data for better visualization (trend, etc.)
perm = np.argsort(age_test)[::-1]
age_test = age_test[perm]
gm_imgs_test = np.array(gm_imgs_test)[perm]
age_pred = decoder.predict(gm_imgs_test)
prediction_score = -np.mean(decoder.cv_scores_["beta"])
print("=== DECODER ===")
print(f"explained variance for the cross-validation: {prediction_score:f}")
print()
=== DECODER ===
explained variance for the cross-validation: 10.670599
Visualization#
weight_img = decoder.coef_img_["beta"]
# Create the figure
from nilearn.plotting import plot_stat_map, show
bg_filename = gray_matter_map_filenames[0]
z_slice = 0
display = plot_stat_map(
weight_img, bg_img=bg_filename, display_mode="z", cut_coords=[z_slice]
)
display.title("SVM weights")
show()

Visualize the quality of predictions#
plt.figure(figsize=(6, 4.5))
plt.suptitle(f"Decoder: Mean Absolute Error {prediction_score:.2f} years")
linewidth = 3
plt.plot(age_test, label="True age", linewidth=linewidth)
plt.plot(age_pred, "--", c="g", label="Predicted age", linewidth=linewidth)
plt.ylabel("age")
plt.xlabel("subject")
plt.legend(loc="best")
plt.figure(figsize=(6, 4.5))
plt.plot(
age_test - age_pred, label="True age - predicted age", linewidth=linewidth
)
plt.xlabel("subject")
plt.legend(loc="best")
<matplotlib.legend.Legend object at 0x7fb9c058db20>
Inference with massively univariate model#
print("Massively univariate model")
gm_maps_masked = NiftiMasker().fit_transform(gray_matter_map_filenames)
data = variance_threshold.fit_transform(gm_maps_masked)
# Statistical inference
from nilearn.mass_univariate import permuted_ols
# This can be changed to use more CPUs.
neg_log_pvals, t_scores_original_data, _ = permuted_ols(
age,
data, # + intercept as a covariate by default
n_perm=2000, # 1,000 in the interest of time; 10000 would be better
verbose=1, # display progress bar
n_jobs=1,
)
signed_neg_log_pvals = neg_log_pvals * np.sign(t_scores_original_data)
signed_neg_log_pvals_unmasked = nifti_masker.inverse_transform(
variance_threshold.inverse_transform(signed_neg_log_pvals)
)
# Show results
threshold = -np.log10(0.1) # 10% corrected
fig = plt.figure(figsize=(5.5, 7.5), facecolor="k")
display = plot_stat_map(
signed_neg_log_pvals_unmasked,
bg_img=bg_filename,
threshold=threshold,
cmap=plt.cm.RdBu_r,
display_mode="z",
cut_coords=[z_slice],
figure=fig,
)
title = (
"Negative $\\log_{10}$ p-values" "\n(Non-parametric + max-type correction)"
)
display.title(title)
n_detections = (get_data(signed_neg_log_pvals_unmasked) > threshold).sum()
print(f"\n{int(n_detections)} detections")
show()

Massively univariate model
Job #1, processed 0/2000 permutations (0.00%, 189.06831741333008 seconds remaining)
Job #1, processed 10/2000 permutations (0.50%, 31.458319664001465 seconds remaining)
Job #1, processed 20/2000 permutations (1.00%, 28.979854345321655 seconds remaining)
Job #1, processed 30/2000 permutations (1.50%, 28.203433036804203 seconds remaining)
Job #1, processed 40/2000 permutations (2.00%, 28.38170099258423 seconds remaining)
Job #1, processed 50/2000 permutations (2.50%, 27.996213912963867 seconds remaining)
Job #1, processed 60/2000 permutations (3.00%, 27.594839016596477 seconds remaining)
Job #1, processed 70/2000 permutations (3.50%, 27.37896844318935 seconds remaining)
Job #1, processed 80/2000 permutations (4.00%, 27.062490463256836 seconds remaining)
Job #1, processed 90/2000 permutations (4.50%, 26.759945419099594 seconds remaining)
Job #1, processed 100/2000 permutations (5.00%, 26.541017293930054 seconds remaining)
Job #1, processed 110/2000 permutations (5.50%, 26.543276374990292 seconds remaining)
Job #1, processed 120/2000 permutations (6.00%, 26.301093339920044 seconds remaining)
Job #1, processed 130/2000 permutations (6.50%, 26.107247792757477 seconds remaining)
Job #1, processed 140/2000 permutations (7.00%, 25.889243602752686 seconds remaining)
Job #1, processed 150/2000 permutations (7.50%, 25.69018856684367 seconds remaining)
Job #1, processed 160/2000 permutations (8.00%, 25.515984177589417 seconds remaining)
Job #1, processed 170/2000 permutations (8.50%, 25.347646194345813 seconds remaining)
Job #1, processed 180/2000 permutations (9.00%, 25.17226004600525 seconds remaining)
Job #1, processed 190/2000 permutations (9.50%, 25.14274723906266 seconds remaining)
Job #1, processed 200/2000 permutations (10.00%, 25.00219202041626 seconds remaining)
Job #1, processed 210/2000 permutations (10.50%, 24.884996641249884 seconds remaining)
Job #1, processed 220/2000 permutations (11.00%, 24.718414545059208 seconds remaining)
Job #1, processed 230/2000 permutations (11.50%, 24.54258802662725 seconds remaining)
Job #1, processed 240/2000 permutations (12.00%, 24.383938630421955 seconds remaining)
Job #1, processed 250/2000 permutations (12.50%, 24.228596925735474 seconds remaining)
Job #1, processed 260/2000 permutations (13.00%, 24.196556843244114 seconds remaining)
Job #1, processed 270/2000 permutations (13.50%, 24.053920366145945 seconds remaining)
Job #1, processed 280/2000 permutations (14.00%, 23.902242524283274 seconds remaining)
Job #1, processed 290/2000 permutations (14.50%, 23.74331316454657 seconds remaining)
Job #1, processed 300/2000 permutations (15.00%, 23.595420598983765 seconds remaining)
Job #1, processed 310/2000 permutations (15.50%, 23.436745259069625 seconds remaining)
Job #1, processed 320/2000 permutations (16.00%, 23.29135376214981 seconds remaining)
Job #1, processed 330/2000 permutations (16.50%, 23.136402108452536 seconds remaining)
Job #1, processed 340/2000 permutations (17.00%, 23.04867890301873 seconds remaining)
Job #1, processed 350/2000 permutations (17.50%, 22.8984180859157 seconds remaining)
Job #1, processed 360/2000 permutations (18.00%, 22.746207263734604 seconds remaining)
Job #1, processed 370/2000 permutations (18.50%, 22.62499383333567 seconds remaining)
Job #1, processed 380/2000 permutations (19.00%, 22.481182637967564 seconds remaining)
Job #1, processed 390/2000 permutations (19.50%, 22.34058116032527 seconds remaining)
Job #1, processed 400/2000 permutations (20.00%, 22.19178295135498 seconds remaining)
Job #1, processed 410/2000 permutations (20.50%, 22.098393097156432 seconds remaining)
Job #1, processed 420/2000 permutations (21.00%, 21.9487528914497 seconds remaining)
Job #1, processed 430/2000 permutations (21.50%, 21.80733264324277 seconds remaining)
Job #1, processed 440/2000 permutations (22.00%, 21.65827638452703 seconds remaining)
Job #1, processed 450/2000 permutations (22.50%, 21.506127145555286 seconds remaining)
Job #1, processed 460/2000 permutations (23.00%, 21.358649512995846 seconds remaining)
Job #1, processed 470/2000 permutations (23.50%, 21.20824626658825 seconds remaining)
Job #1, processed 480/2000 permutations (24.00%, 21.101903478304543 seconds remaining)
Job #1, processed 490/2000 permutations (24.50%, 20.949704651929896 seconds remaining)
Job #1, processed 500/2000 permutations (25.00%, 20.801024436950684 seconds remaining)
Job #1, processed 510/2000 permutations (25.50%, 20.66691004061231 seconds remaining)
Job #1, processed 520/2000 permutations (26.00%, 20.51732895924495 seconds remaining)
Job #1, processed 530/2000 permutations (26.50%, 20.373003541298633 seconds remaining)
Job #1, processed 540/2000 permutations (27.00%, 20.227478610144722 seconds remaining)
Job #1, processed 550/2000 permutations (27.50%, 20.079225388440218 seconds remaining)
Job #1, processed 560/2000 permutations (28.00%, 19.97026675088065 seconds remaining)
Job #1, processed 570/2000 permutations (28.50%, 19.825233806643567 seconds remaining)
Job #1, processed 580/2000 permutations (29.00%, 19.67817402708119 seconds remaining)
Job #1, processed 590/2000 permutations (29.50%, 19.537475666757356 seconds remaining)
Job #1, processed 600/2000 permutations (30.00%, 19.407889684041344 seconds remaining)
Job #1, processed 610/2000 permutations (30.50%, 19.338485186217262 seconds remaining)
Job #1, processed 620/2000 permutations (31.00%, 19.48354791825817 seconds remaining)
Job #1, processed 630/2000 permutations (31.50%, 19.411681481770106 seconds remaining)
Job #1, processed 640/2000 permutations (32.00%, 19.325208723545074 seconds remaining)
Job #1, processed 650/2000 permutations (32.50%, 19.168976013477035 seconds remaining)
Job #1, processed 660/2000 permutations (33.00%, 19.015716885075424 seconds remaining)
Job #1, processed 670/2000 permutations (33.50%, 18.860335869575614 seconds remaining)
Job #1, processed 680/2000 permutations (34.00%, 18.705687256420358 seconds remaining)
Job #1, processed 690/2000 permutations (34.50%, 18.579413414001465 seconds remaining)
Job #1, processed 700/2000 permutations (35.00%, 18.427574191774642 seconds remaining)
Job #1, processed 710/2000 permutations (35.50%, 18.27634731480773 seconds remaining)
Job #1, processed 720/2000 permutations (36.00%, 18.123347388373478 seconds remaining)
Job #1, processed 730/2000 permutations (36.50%, 17.972845943006753 seconds remaining)
Job #1, processed 740/2000 permutations (37.00%, 17.822854969952555 seconds remaining)
Job #1, processed 750/2000 permutations (37.50%, 17.690920035044353 seconds remaining)
Job #1, processed 760/2000 permutations (38.00%, 17.564348597275583 seconds remaining)
Job #1, processed 770/2000 permutations (38.50%, 17.422407881006016 seconds remaining)
Job #1, processed 780/2000 permutations (39.00%, 17.27254680486826 seconds remaining)
Job #1, processed 790/2000 permutations (39.50%, 17.12121287780472 seconds remaining)
Job #1, processed 800/2000 permutations (40.00%, 16.97208559513092 seconds remaining)
Job #1, processed 810/2000 permutations (40.50%, 16.82522784339057 seconds remaining)
Job #1, processed 820/2000 permutations (41.00%, 16.675452459149245 seconds remaining)
Job #1, processed 830/2000 permutations (41.50%, 16.52595071045749 seconds remaining)
Job #1, processed 840/2000 permutations (42.00%, 16.40272457259042 seconds remaining)
Job #1, processed 850/2000 permutations (42.50%, 16.25340492585126 seconds remaining)
Job #1, processed 860/2000 permutations (43.00%, 16.10425219424935 seconds remaining)
Job #1, processed 870/2000 permutations (43.50%, 15.957539136382357 seconds remaining)
Job #1, processed 880/2000 permutations (44.00%, 15.81119814786044 seconds remaining)
Job #1, processed 890/2000 permutations (44.50%, 15.668833807613073 seconds remaining)
Job #1, processed 900/2000 permutations (45.00%, 15.52339808146159 seconds remaining)
Job #1, processed 910/2000 permutations (45.50%, 15.39665122608562 seconds remaining)
Job #1, processed 920/2000 permutations (46.00%, 15.248977630034739 seconds remaining)
Job #1, processed 930/2000 permutations (46.50%, 15.104561749325004 seconds remaining)
Job #1, processed 940/2000 permutations (47.00%, 14.957074616817717 seconds remaining)
Job #1, processed 950/2000 permutations (47.50%, 14.809820463782865 seconds remaining)
Job #1, processed 960/2000 permutations (48.00%, 14.661285678545633 seconds remaining)
Job #1, processed 970/2000 permutations (48.50%, 14.516942542852815 seconds remaining)
Job #1, processed 980/2000 permutations (49.00%, 14.383854257817172 seconds remaining)
Job #1, processed 990/2000 permutations (49.50%, 14.237894730134443 seconds remaining)
Job #1, processed 1000/2000 permutations (50.00%, 14.091278553009033 seconds remaining)
Job #1, processed 1010/2000 permutations (50.50%, 13.946635241555695 seconds remaining)
Job #1, processed 1020/2000 permutations (51.00%, 13.80184191348506 seconds remaining)
Job #1, processed 1030/2000 permutations (51.50%, 13.655781905627945 seconds remaining)
Job #1, processed 1040/2000 permutations (52.00%, 13.511666371272161 seconds remaining)
Job #1, processed 1050/2000 permutations (52.50%, 13.371587106159755 seconds remaining)
Job #1, processed 1060/2000 permutations (53.00%, 13.240824330527827 seconds remaining)
Job #1, processed 1070/2000 permutations (53.50%, 13.096409790983824 seconds remaining)
Job #1, processed 1080/2000 permutations (54.00%, 12.956882185406155 seconds remaining)
Job #1, processed 1090/2000 permutations (54.50%, 12.812340530780476 seconds remaining)
Job #1, processed 1100/2000 permutations (55.00%, 12.671237988905474 seconds remaining)
Job #1, processed 1110/2000 permutations (55.50%, 12.530623571292775 seconds remaining)
Job #1, processed 1120/2000 permutations (56.00%, 12.389934982572283 seconds remaining)
Job #1, processed 1130/2000 permutations (56.50%, 12.260461617360072 seconds remaining)
Job #1, processed 1140/2000 permutations (57.00%, 12.11627867765594 seconds remaining)
Job #1, processed 1150/2000 permutations (57.50%, 11.97389298936595 seconds remaining)
Job #1, processed 1160/2000 permutations (58.00%, 11.831477288542123 seconds remaining)
Job #1, processed 1170/2000 permutations (58.50%, 11.688353948104076 seconds remaining)
Job #1, processed 1180/2000 permutations (59.00%, 11.544821569475078 seconds remaining)
Job #1, processed 1190/2000 permutations (59.50%, 11.40181178605857 seconds remaining)
Job #1, processed 1200/2000 permutations (60.00%, 11.268632094065348 seconds remaining)
Job #1, processed 1210/2000 permutations (60.50%, 11.124179207589016 seconds remaining)
Job #1, processed 1220/2000 permutations (61.00%, 10.981504557562657 seconds remaining)
Job #1, processed 1230/2000 permutations (61.50%, 10.838392624040928 seconds remaining)
Job #1, processed 1240/2000 permutations (62.00%, 10.694240862323392 seconds remaining)
Job #1, processed 1250/2000 permutations (62.50%, 10.551662492752074 seconds remaining)
Job #1, processed 1260/2000 permutations (63.00%, 10.40788211519756 seconds remaining)
Job #1, processed 1270/2000 permutations (63.50%, 10.264532350179717 seconds remaining)
Job #1, processed 1280/2000 permutations (64.00%, 10.129707545042038 seconds remaining)
Job #1, processed 1290/2000 permutations (64.50%, 9.986904447392899 seconds remaining)
Job #1, processed 1300/2000 permutations (65.00%, 9.843859379108135 seconds remaining)
Job #1, processed 1310/2000 permutations (65.50%, 9.701006478025713 seconds remaining)
Job #1, processed 1320/2000 permutations (66.00%, 9.55779691175981 seconds remaining)
Job #1, processed 1330/2000 permutations (66.50%, 9.414995591443285 seconds remaining)
Job #1, processed 1340/2000 permutations (67.00%, 9.273018740895969 seconds remaining)
Job #1, processed 1350/2000 permutations (67.50%, 9.137232833438448 seconds remaining)
Job #1, processed 1360/2000 permutations (68.00%, 8.996920529533835 seconds remaining)
Job #1, processed 1370/2000 permutations (68.50%, 8.853649278626825 seconds remaining)
Job #1, processed 1380/2000 permutations (69.00%, 8.711381196975708 seconds remaining)
Job #1, processed 1390/2000 permutations (69.50%, 8.569838115637252 seconds remaining)
Job #1, processed 1400/2000 permutations (70.00%, 8.427456378936768 seconds remaining)
Job #1, processed 1410/2000 permutations (70.50%, 8.286088737190193 seconds remaining)
Job #1, processed 1420/2000 permutations (71.00%, 8.149848286534699 seconds remaining)
Job #1, processed 1430/2000 permutations (71.50%, 8.009856247401737 seconds remaining)
Job #1, processed 1440/2000 permutations (72.00%, 7.8691253662109375 seconds remaining)
Job #1, processed 1450/2000 permutations (72.50%, 7.728487434058353 seconds remaining)
Job #1, processed 1460/2000 permutations (73.00%, 7.587513665630392 seconds remaining)
Job #1, processed 1470/2000 permutations (73.50%, 7.4457875027948495 seconds remaining)
Job #1, processed 1480/2000 permutations (74.00%, 7.305391724045212 seconds remaining)
Job #1, processed 1490/2000 permutations (74.50%, 7.164160506037258 seconds remaining)
Job #1, processed 1500/2000 permutations (75.00%, 7.02764884630839 seconds remaining)
Job #1, processed 1510/2000 permutations (75.50%, 6.886001201654901 seconds remaining)
Job #1, processed 1520/2000 permutations (76.00%, 6.744681207757247 seconds remaining)
Job #1, processed 1530/2000 permutations (76.50%, 6.603233998117884 seconds remaining)
Job #1, processed 1540/2000 permutations (77.00%, 6.4618889139844224 seconds remaining)
Job #1, processed 1550/2000 permutations (77.50%, 6.320344240434709 seconds remaining)
Job #1, processed 1560/2000 permutations (78.00%, 6.180274388728997 seconds remaining)
Job #1, processed 1570/2000 permutations (78.50%, 6.043856014871293 seconds remaining)
Job #1, processed 1580/2000 permutations (79.00%, 5.903796482689772 seconds remaining)
Job #1, processed 1590/2000 permutations (79.50%, 5.762595560565685 seconds remaining)
Job #1, processed 1600/2000 permutations (80.00%, 5.621801495552063 seconds remaining)
Job #1, processed 1610/2000 permutations (80.50%, 5.480538430421249 seconds remaining)
Job #1, processed 1620/2000 permutations (81.00%, 5.33949922632288 seconds remaining)
Job #1, processed 1630/2000 permutations (81.50%, 5.198650286972888 seconds remaining)
Job #1, processed 1640/2000 permutations (82.00%, 5.061023712158203 seconds remaining)
Job #1, processed 1650/2000 permutations (82.50%, 4.920590682463213 seconds remaining)
Job #1, processed 1660/2000 permutations (83.00%, 4.779492022043251 seconds remaining)
Job #1, processed 1670/2000 permutations (83.50%, 4.638286327887438 seconds remaining)
Job #1, processed 1680/2000 permutations (84.00%, 4.497458140055338 seconds remaining)
Job #1, processed 1690/2000 permutations (84.50%, 4.356408157292202 seconds remaining)
Job #1, processed 1700/2000 permutations (85.00%, 4.2158424854278564 seconds remaining)
Job #1, processed 1710/2000 permutations (85.50%, 4.082813594773499 seconds remaining)
Job #1, processed 1720/2000 permutations (86.00%, 3.941640110903008 seconds remaining)
Job #1, processed 1730/2000 permutations (86.50%, 3.800528336122546 seconds remaining)
Job #1, processed 1740/2000 permutations (87.00%, 3.6592216162846007 seconds remaining)
Job #1, processed 1750/2000 permutations (87.50%, 3.5178701877593994 seconds remaining)
Job #1, processed 1760/2000 permutations (88.00%, 3.376392375339161 seconds remaining)
Job #1, processed 1770/2000 permutations (88.50%, 3.2355045652658925 seconds remaining)
Job #1, processed 1780/2000 permutations (89.00%, 3.0945447964614696 seconds remaining)
Job #1, processed 1790/2000 permutations (89.50%, 2.9553051913916732 seconds remaining)
Job #1, processed 1800/2000 permutations (90.00%, 2.81422479947408 seconds remaining)
Job #1, processed 1810/2000 permutations (90.50%, 2.673009215138894 seconds remaining)
Job #1, processed 1820/2000 permutations (91.00%, 2.53183188019218 seconds remaining)
Job #1, processed 1830/2000 permutations (91.50%, 2.390651378475252 seconds remaining)
Job #1, processed 1840/2000 permutations (92.00%, 2.249707450037417 seconds remaining)
Job #1, processed 1850/2000 permutations (92.50%, 2.108726011740195 seconds remaining)
Job #1, processed 1860/2000 permutations (93.00%, 1.970524000865157 seconds remaining)
Job #1, processed 1870/2000 permutations (93.50%, 1.8295991407996193 seconds remaining)
Job #1, processed 1880/2000 permutations (94.00%, 1.6886003220334964 seconds remaining)
Job #1, processed 1890/2000 permutations (94.50%, 1.5476297966386905 seconds remaining)
Job #1, processed 1900/2000 permutations (95.00%, 1.4067508170479222 seconds remaining)
Job #1, processed 1910/2000 permutations (95.50%, 1.2659806244036291 seconds remaining)
Job #1, processed 1920/2000 permutations (96.00%, 1.1251655916372933 seconds remaining)
Job #1, processed 1930/2000 permutations (96.50%, 0.9847721967054771 seconds remaining)
Job #1, processed 1940/2000 permutations (97.00%, 0.8439879663211783 seconds remaining)
Job #1, processed 1950/2000 permutations (97.50%, 0.7032505243252485 seconds remaining)
Job #1, processed 1960/2000 permutations (98.00%, 0.5625111375536237 seconds remaining)
Job #1, processed 1970/2000 permutations (98.50%, 0.4218068546450078 seconds remaining)
Job #1, processed 1980/2000 permutations (99.00%, 0.28117719322744045 seconds remaining)
Job #1, processed 1990/2000 permutations (99.50%, 0.14057365134732808 seconds remaining)
1959 detections
Total running time of the script: (1 minutes 15.862 seconds)
Estimated memory usage: 1922 MB