Skip to content

FSL 6.0.7.19, 4th November 2025

ciftilib 1.6.0 -> 1.7.0

  • MNT: Bump ABI 1.7 The libxmlpp changes are not ABI-compatible, due to the removal of glibmm/etc. On macOS, executables must directly link against the ciftilib dependencies, even though they are not used directly. So this means that e.g. flameo was complaining about not being able to find libglibmm.so.

Detailed history

  • fix typo in comment
  • protect against nan/inf in nifti scl_* fields
  • copy/paste typo in error message
  • improve IO error checking
  • MNT: Various modernising changes, applied to FSL v1.6.0 CiftiLib build from FSL 6.0.6.3 through 6.0.7.18: - Compile with C++17 - Build against libxml-4.0 - boost::filesystem function name changes - Use std::mutex rather than Glib::mutex
  • MNT: Update Cmake config to libxml++-5.0. Remove glibmm
  • MNT: Replace use of glib functions with std/boost functions (std library not good at locale conversion)
  • BF: Was creating locale obj incorreclty
  • MNT: Revert to ABI 1.6, so we don't need to change pins/rebuild other packages. Adjust example/CMakeLists.txt so examples can be installed as executables
  • MNT: Bump ABI 1.7 - the libxmlpp changes are _not_ ABI-compatible, due to the removal of glibmm/etc (on macOS, executables directly link against the ciftilib dependencies)

fsleyes 1.14.2 -> 1.16.2

  • BF: Fix Tools menu item bug Whenever a view panel is added or removed, the FSLeyesFrame re-creates the Tools menu items, and any associated Action instances. The frame was destroying plugin-provided view panel actions, such as the Seed correlation action, with the effect that, when new a view was added (or one removed), these menu items would break.

The FSLeyesFrame does not destroy Action items that are associated with the view, as they may be bound to instance methods (e.g. OrthoPanel.screenshot).

As the plugin-povided view panel actions are created and exclusively owned by ViewPanel instances, I am going to consider them as equivalent to actions provided by instance methods. So they are now marked as being "instanced-owned", and the FSLeyesFrame will not destroy them when the Tools menu is re-created. - MNT: Need to tell setuptools-scm that we use release branches - CI: Fix execution of check version script - CI: Add output to check version script - DOC: Clarify wxpython/GLX situation

Detailed history

  • BF: Prevent FSLeyesFrame from destroying ViewPanel-owned plugin actions
  • TEST: Regression test
  • MNT: Need to tell setuptools-scm that we use release branches
  • CI: Fix execution of check version script
  • CI: Add output to check version script
  • DOC: tweaks to install docs
  • DOC: Various fixes, make sure sphinx reads version correctly
  • CI: Fix zenodo submission
  • CI: Use fsleyes docker image to reduce download
  • DOC: Changelog fix
  • DOC: Clarify wxpython/GLX situation
  • CI: Hopefully fix zenodo submission

fsleyes-plugin-mrs 0.1.2 -> 0.1.4

  • Refactored code and added tests
  • Code refactoring to split classes into thematic files
  • Added unit tests for each class
  • Updated gitlab-ci to run tests on: a) Python 3.12 for every commit, b) Python 3.9 - 3.13 for merge requests
  • Updated Python requirement on setup.py to >=3.9
  • Bugfix on toggling the Ortho panel when loading MRSI results
  • CI build and deployment
  • Added version.py that controls version number and compares against gitlab tag
  • Added test stage for build_pypi_dist script. The script also runs a test if fsleyes screen matches benchmark for docker.
  • Added pypi build stage in CI, if tag matches version.py number
  • Added pypi deploy stage in CI that triggers manually
  • Removed manual_build_instructions.md file
  • New features: Link Phase, Link Apod, Link Proj Updates in Views:
  • Added "link Phase" widget that links zeroth and first order phase correction across spectra/overlays
  • Added "link Apodization" widget that links apodization across spectra/overlays
  • Adapted "plot real/imag/magn/phas" widgets to automatically plot projections across spectra/overlays ("link Proj")
  • Updated default background and grid colours

Updates in Controls: - Redesign of MRS Control Panel to accommodate View's Updates - Added "Overlay List" toggle on MRS Toolbar

Updates in Profiles: - Update MRSViewProfile to work with relative positional and phase correction changes - First order phase correction is now relative to dataseries's spectral frequency - Bug fix on mouse position to match screen's DPI scaling - Removed 'all' option from MRSViewProfile

Updates in Series: - Parent class changed to VoxelPowerSpectrumSeries - Added 'apodize' function applied when pulling voxel data - Changed first order phase correction to milliseconds

Updates in Tests: - Added MRSI test data - Wrote tests for "link Phase", "link Apod" and "link Proj" features - Wrote tests for default prop values and background/grid colours - Wrote tests for MRS Control Panel widgets - Wrote tests for 'apodize' function - Removed tests for 'defaultLayout' - Doc: 0.1.3_changes Update documentation with the changes introduced in 0.1.3 - Improved MRSI results versatility * Added FileTree functionality for defining MRSI results structure * Added colourscheme.json functionality for defining the colours to be displayed in MRSView for spectra and Ortho Panel for overlays * Wrote FileTree and Colourscheme rules for developers * Improved handling of Ortho Panels if multiple MRSI results are loaded * Renamed functions and titles to be generic for any MRS software used * Wrote unit and integration tests for tools.py * Updated documentation

Detailed history

  • Refactored code and added tests
  • CI build and deployment
  • New features: Link Phase, Link Apod, Link Proj
  • updated version and changelog for 0.1.3 release + changed doc building for releases only
  • bug fix on build_pypi_dist
  • further improvements on build pypi dist with fsleyes cleanup
  • Update doc for v0.1.3
  • Improved MRSI results versatility

fslpy 3.22.0 -> 3.24.0

  • MNT: Minor adjustment to hold function There is no need for the hold function to submit itself with a jobtime - it will sit in the queue until the held job completes, then will run more or less instantly.
  • BF: Fixes to gps wrapper The gps command accepts an output file prefix, not a full file name. It can also accept more than one value for the --ndir option.

It turns out that the gps command-line help was also incorrect - this has been fixed.

setuptools-scm is now used for automatic version number management. - BF: Bugfix in fslstats wrapper The fslstats wrapper was alreaday handling missing values, but only for single-dimensional output. It now handles missing values for multi-dimensional outputs. - CI: Change docker image for pypi build job - CI: Adjust pypi build job

Detailed history

  • MNT: No need to specify jobtime for the hold job, as it will sit in the queue until the held job completes, then will run essentially instantly
  • BF: gps command accepts an out file prefix, not full file name. And can also accept more than one value for --ndir
  • MNT: Switch to setuptools-scm for automatic version number management
  • DOC: Update contributing guide
  • TEST: Failing fslstats unit test
  • BF: Handle missing values in fslstats output in multi-dimensional output
  • DOC: Update release management procedure
  • DOC: Mention setuptools-scm
  • CI: Run version check as part of pypi build job
  • CI: Change docker image for pypi build job
  • CI: Adjust pypi build job

fsl-add_module 0.5.1 -> 0.6.0

This MR also fixes an issue where the presence of a file or directory with the same name as an official manifest (e.g. ~/fslcourse) would cause fsl_add_module to try to load it as the manifest.

Detailed history

  • BF: Don't try to load e.g. ./fslcourse as a manifest
  • MNT: Use setuptools-scm for version number management
  • RF,MNT: Change default behaviour to not delete archive dir - this is what happens with --force. Add new --remove flag which does cause dir to be deleted. Use importlib to retrieve version number
  • TEST: Update unit tests for new expected user input (prompt to remove archive dir)
  • TEST: Tests for removing archive dir
  • CI: Drop py38/py39, add py312, py313
  • BF: Copy-paste error, wrong package name

fsl-base 2504.3 -> 2508.1

  • ENH: Add support for linux/aarch64; simplify fslversion The fslversion script had some flaky logic to try and parse the commands in the conda environment revision history, so it could print e.g. "Install FSL 6.0.7.18". This has been removed, and now the raw commands are printed (the only sanitisation step being replacing the full /path/to/fsl/ with literal $FSLDIR).
  • TEST: Adjustment to unit tests pyfeeds now runs tests from a copy, not from within the source directory. However, it sets a PYFEEDS_FEEDSRUN_PATH environment variable which allows us to get the original feedsRun location (and thus refer to other source files relative to that location).
  • TEST: More fixes to unit tests

Detailed history

  • MNT: Add aarch64 identifier
  • MNT: Simplify fslversion - don't bother trying to sanitise/simplify env revision history, just replace /path/to/fsldir/ with "$FSLDIR"
  • ENH: Print list of installed extras when --extra provided
  • TEST: pyfeeds now runs tests from a copy, not within source directory. Use pyfeeds env var to get path to original feedsRun location
  • TEST: THISDIR was being set to feedsRun path, not its containing directory

fsl-bet2 2111.8 -> 2111.9

Detailed history

  • ENH: Alternate mask, mesh generation mode

fsl-eddy_qc v1.3.0 -> v1.4.1

Detailed history

  • RF: Adjust eddy_quad so it reads eddy --b_range option if present, and falls back to 100
  • MNT: Use setuptools-scm for version control
  • MNT: Remove unused import (which has also been removed from pypdf)
  • MNT: Remove spurious entry from pyproject.toml

fsl-film 2111.1 -> 2111.2

Detailed history

  • ENH: Handle zero-data as long as no smoothing occurs
  • DBG: Unmasking
  • DBG: Beta candidate
  • BF: Typo
  • BF: Another typo

fsl-gps 2211.1 -> 2509.0

Detailed history

  • BF: Fix help text

fsl-installer 3.16.8 -> 3.17.0

Detailed history

  • ENH: Detect linux/aarch64
  • CI: Update runner tags
  • TEST: MAke tests platform agnostic

fsl-miscmaths 2412.4 -> 2412.6

Input image: input

Constant extrapolation (focus on the coronal view): constant

CorrectConstant extrapolation: correct_constant - TEST: Allow splinterpolator tests to run against either in-source or installed version.

Detailed history

  • MNT: Add gitattributes file so that LFS works properly. This should have been included when the test data was first added
  • ENH,RF: Add new "CorrectConstant" extrapolation type, which initialises coefficient field with correct boundary condition
  • TEST: Re-arrange tests, make easier to extend. Add "sphere" tests, haven't added data yet
  • TEST: Update benchmarks, add new sphere dataset
  • TEST: Allow tests to run either in-source or against installed version. The __has_include macro should work with both g++ and clang

fsl_mrs 2.4.3 -> 2.4.10

  • Doc: Fitting models
  • Updated documentation and doc strings around fitting models.
  • Added --inversion_model option to fsl_dynmrs to allow modelling of inverted peaks.
  • Added documentation page about spatial information with how to create a SVS mask in T1 space.
  • [ENH] Dask and verbosity
  • fsl_mrs_sim now uses Dask for parallel processing.
  • Can suppress verbose output when simulating.
  • ENH: Xnuc simulation
  • The basis set simulator can now be passed a "Nucleus" field to enable simulation of 2H, 13C and 31P nuclei.
  • MM seeds passed to fsl_mrs_sim will have central frequencies and dwell times lightly modified to match other simulated bases
  • Automatic conjugation for basis_tools add_set
  • ENH: Add nucleus awareness to basis tools.
  • Added nucleus awareness to Basis class. This will apply the correct ppm reference shift each nucleus in basis_tools vis. Previously 1H (and 4.65 ppm shift) was assumed.
  • When converting basis sets from LCModel format (.basis) using basis_tools convert the user can now specify --nucleus.
  • Bf: Fix variable dyn grads Fixed a bug in the dynamic fitting module (fsl_dynmrs) where the calculation of analytical gradients was incorrect for variable parameters.

Tests added to check against numerical gradients. - ENH: LCM preproc - Improved data scaling approach for dynamically fitted MRSI data. Closer match to single voxel approach. - (Python API Only) Implemented LCModel's Phasta and cross-correlation processing for frequency and phase alignment. - Adjusted 2H water shift constant to 4.8 ppm - BF: detect_conjugation Fixed bug in detect_conjugation, missing divide by length after original refactor

Detailed history

  • Doc: Fitting models
  • [ENH] Dask and verbosity
  • ENH: Xnuc simulation
  • ENH: Add nucleus awareness to basis tools.
  • Bf: Fix variable dyn grads
  • ENH: LCM preproc
  • BF: detect_conjugation

fsl-newmesh 2111.2 -> 2111.3

Detailed history

  • MNT: Remove dependence on boost

fsl-ptx2 2111.5 -> 2111.8

  • Change integer data types used for indexing large arrays Change use of int to store data array sizes / indexes to size_t. This avoids problems on GPUs with large amounts of memory where the sizes of arrays can exceed the storage range for an int.
  • ENH: New fsl_streamlines tool This MR adds a new fsl_streamlines command, which can be used to generate a streamline tractogram from probtrackx2/xtract outputs. The fsl_streamlines tool requires probtrackx2 to be run with the --opathdir option, which generates a fdt_paths_localdir.nii.gz file containing per-voxel average tract orientations.

The tool was originally written by Saad Jbabdi, and cleaned up/refactored by Martin Craig and Paul McCarthy. - RF: Ensure that streamlines have length at least 2 The --min-steps option is now restricted so that it cannot be less than 2. - BF,RF: Fix bug when using --jitter and --seeds-per-voxel; adjust --save-overlay option. This MR fixes a bug which would occur when using --jitter and --seeds-per-voxel N with N greater than 1, and would result in an IndexError.

The --save-overlay option (-so for short) has also been adjusted - previously it was configured with nargs='*', so would consume any number of values, e.g.:

fsl_streamlines -so a b c ...

However, the main input argument is configured similarly, with nargs='+', which restricts how --save-overlay can be specified.

To work around this conflict, --save-overlay has been adjusted so that it only accepts one value, but can be specified more than once, e.g.:

fsl_streamlines -so a -so b -so c ...
- ENH,BF: New fsl_streamlines --seed-mask option, and bug fix New --seed-mask option to fsl_streamlines, allowing seeds to be defined with a mask.

Fixed a bug which would cause an error when seeding from a voxel with null/zero orientation.

Change streamlining behaviour so that if only one of forward- or backward-tracking produces a streamline, the streamline is kept. The previous behaviour would discard a streamline if either forward- or backward-tracking did not produce anything. - BF: Limit maximum RAM allocation size and change datatypes to avoid memory overflow This change limits the maximum GPU RAM allocation size used by probtrackx2_gpu, and changes some datatypes to avoid overflows. The maximum memory used is clamped at 32GiB.

This fix was contributed by Chris Rorden

Detailed history

  • TEST: Basic streamline tests
  • MNT: Makefile rule for installing fsl_streamlines
  • MNT: Remove .gitignore
  • RF: Ensure that streamlines have length at least 2.
  • RF: Change --save-overlay to accept one image, but also so it can be used multiple times. Otherwise nargs='*' conflicts with input (nargs='+')
  • BF: Offsets array pre-allocation was not taking into account jitter/seeds_per_voxel
  • DOC: Note in --save-overlay help
  • TEST: Smoke tests for -j -spv and -so
  • Change integer data types used for indexing large arrays Avoids problems on GPUs with large amounts of memory
  • Make indexing consistent between gpu and cpu versions
  • MNT: Add __main__ module for convenience
  • RF: Keep streamlines where either forward or backward tracking produced something
  • BF,RF: Incorrectly returning tuple of Nones - original code was returning streamline+sampled densities, but was refactored to just return streamline. Return None instead of empty streamlines
  • ENH: New --seed-mask option, allowing seeds to be specified with a mask image
  • MNT: Report number of streamlines, and if no streamlines generated
  • TEST: Test --seed-mask option
  • TEST: Test seeding from a voxel without orientation
  • RF: Don't apply density threshold to seed mask, as it doesn't make sense in my opinion. Easy for user to create whatever binary mask they need.
  • MNT: Clarify help text
  • BF: Limit maximum RAM allocation size and change datatypes to avoid overflows. Authored by Chris Rorden

fsl-pyfeeds 0.15.0 -> 1.1.0

  • ENH: Allow tests to be run on cluster via fsl_sub This MR makes several changes to the behaviour of pyfeeds, and adds the capability to submit tests to a HPC cluster via fsl_sub. This can be achieved with the new --fslsub option. There is also a new --fslsubOptions option which allows additional per-test submission options to be specified (e.g. jobram=4, coprocessor=cuda, etc). These can be added to a pyfeeds configuration file under a [fslsubOptions] section, e.g.:
[fslsubOptions]
*eddy* = coprocessor=cuda
*feat* = jobram=4 jobtime=120

Note that when using pyfeeds run --fslsub on the FMRIB cluster, you must specify a --sandboxDir location which is on the shared file system, i.e. which is accessible to both the submission node and cluster nodes.

This MR also fixes a race condition which can occur when running nested tests in parallel. For example, with the following test structure:

test1/feedsRun
test1/test2/feedsRun

The output directory structure will also be nested, i.e.:

test1/feedsRun.log
test1/test2/feedsRun.log

If these tests are run in parallel, test2 may be executed before test1, meaning that the test1/test2/ directory may already exist.

A number of other changes have been made:

  • Changes the method used to run tests in parallel from a ThreadPool to a multiprocessing.Pool - this is so that evaluation of test outputs can be run in parallel. A ThreadPool is still used when using the new --fslsub option.
  • The final pyfeeds results table now distinguishes between tests which fail due to a non-zero exit code (reported as Errored), and tests which fail due to their outputs not matching their benchmark data (reported as Failed).
  • If pyfeeds is called with the --overwrite flag, the test sandbox directory already exists, it is deleted.
  • Migrates the packaging configuration from using setup.py to pyproject.toml.
  • Changes the version number management strategy to use setuptools-scm.
  • ENH: Expose original path to feedsRun script via PYFEEDS_FEEDSRUN_PATH environment variable When pyfeeds runs a feedsRun script, it executes a copy of the script and the contents of its containing directory. This is to ensure that the feedsRun script does not inadvertently write any temporary/intermediate files to the original test directory. Some test scripts may however need access to other "in-source" resources, e.g. when executed from a checkout of the project source code. These scripts can use the PYFEEDS_FEEDSRUN_PATH environment variable to locate such resources.

Detailed history

  • RF: CLI option to specify host IP address, as guessing the correct IP is difficult
  • MNT: Pin fslpy
  • RF: Copy test directory to sandbox and run it from there - this eliminates the possibility of test scripts writing files to test directory, which happens e.g. with fsl_sub .o/.e files
  • RF: Delete sandbox directory if it exists and --overwrite is active
  • RF: Allow logcfg to be None, for unit tests
  • MNT: Adjust logging - messages may arrive out of order
  • TEST: Basic integration tests
  • RF,BF: Test script exit code was being eaten by submission script when using --fslsub. Adjust test evaluation to distinguish between benchmark data evaluation failure, and test script errorring
  • TEST: Adjust unit tests for new evaluateTest output
  • RF: Cannot distinguish between self-eval tests which "error" vs those which "fail"
  • DOC: Updates to doc files
  • ENH: Expose original path to feedsRun script via PYFEEDS_FEEDSRUN_PATH environment variable
  • DOC: Describe PYFEEDS_FEEDSRUN_PATH
  • DOC: Finish off docs

fsl-pyfix 0.9.0 -> 0.10.0

This new option (-o or --only) can be used like so:

fix -a labels.txt melodic.ica>          # clean both NIfTI and CIfTI data if present
fix -a labels.txt melodic.ica> -o nifti # only clean NIfTI data (filtered_func_data.nii.gz)
fix -a labels.txt melodic.ica> -o cifti # only clean CIfTI data (Atlas.dtseries.nii)

Detailed history

  • ENH: New option to clean only nifti or cifti files
  • MNT: Use setuptools-scm for version number management
  • TETS: Test for new --only option

fsl-sub 2.8.4 -> 2.10.0

  • NSLOTS Docs Update documentation for FSLSUB_NSLOTS variable. Update installation instructions.
  • fsl_sub 2.10.0 with improvements to parallelism within the shell plugin
  • Shell plugin now uses all threads allocated to parent job when job submitted within a cluster submitted job
  • Thread control environment variables are set within shell runner tasks
  • Allow -s option to control threads in shell runner array tasks
  • Ensure automatic parallelism in shell runner when called by Python API
  • Add additional debug output
  • Fix debugging via environment variable
  • Fix deeply nested fsl_sub calls

Detailed history

  • Add missing tag to style stage
  • Add example modulecmd for Lmod
  • Improve documentation and testing of --extra argument
  • Update copyright notice
  • Add ability to switch off auto-queue selection and limits Fix loading of coprocessor module Switch to pytest for new test functionality Add new utils: truthy - could the value be interpreted as true? command_exists - moved out of __init__.py make_logdir - moved out of __init__.py Switch to importlib.resources.files to find config files Add getoption helper to resolve command line and environment variables Move coprocessor configuration out of __init__ into coprocessors Remove duplicate code setting number of threads Add warning that CUDA queue/partition targetted but no coprocessor requested Add new project tests Rename main test file to ensure pytest finds it Add tests fo command_exists
  • Python 3.8 lacks 'files' method in importlib.resources Add support for Py3.13
  • Refactor Plugin tests to fix failures with pytest and Python 3.10+
  • Further refactoring of module test for python 3.11+ - no longer mock it, create a fake module instead
  • Remove global statement to avoid flake8 failure
  • Enable testing of doctests
  • Add queue option to force even numbers of threads on SMT SLURM systems
  • Reduce SMT handling code complexity
  • Add NSLOTS environment variable to shell plugin
  • Add in missing env-var to expected output
  • Add missing NSLOTS environment variable to shell plugin
  • Bump version number
  • Update documentation for FSLSUB_NSLOTS variable. Update installation instructions
  • fsl_sub 2.10.0 with improvements to parallelism within the shell plugin

fsl-sub-plugin-sge 1.5.4 -> 1.5.5

Detailed history

  • Add python 3.12 support
  • DOC: Emphasise that package names use hyphens and not underscores
  • Add option and environment variable to allow fsl_sub to submit jobs when already running within a cluster job This is of most use when using with Open OnDemand batch connect desktops which are typically queued jobs.
  • Tidy up README.md

fsl-sub-plugin-slurm 1.6.7 -> 1.6.8

Detailed history

  • As we use cpus-per-task|gpus-per-task SLURM_NTASKS/NPROCS is meaningless as it will always be 1. Change this to point at SLURM_CPUS_PER_TASK which should reflect reality
  • Update changes

fsl-utils 2412.1 -> 2412.6

  • ENH: New set_default_num_threads function, and ThreadScope class This MR adds two new features to the threading module:

  • A new NoOfThreads::set_default_num_threads function, intended to be called from application main() routines, for applications which allow the user to set the number of threads from the command-line. This function will set the default number of threads used by NoOfThreads instance, and hence the parfor/apply functions. If this function is never called, the default number of threads is dictated by the FSL_NUM_THREADS environment variable, or defaults to 1 (single-threaded) if that variable is not set. These changes have only involved changes to static fields of the NoOfThreads class, and so should preserve ABI compatibility with the last release (however new projects will need to be re-compiled against this new vesrion to advantage of the new feature).

  • A new ThreadScope class which allows the default number of threads used by NoOfThreads/parfor/apply to be temporarily changed in a local scope. This can be used by applications to temporarily disable/adjust parallelism - for example, if a routine is being run in parallel, it can use a ThreadScope to ensure that no nested paralellism takes place. The ThreadScope class is intended to be used like so:

    // Input values
    std::vector<int> values = {1, 2, 3, 4, 5};
    
    // Function which performs a
    // calculation on one value
    auto do_calc = [&](int i) {
    
      // Ensure that calls within this scope
      // only use one thread.
      ThreadScope ts(1);
    
      // Call functions which may otherwise
      // have parallelised their work
      ...
    };
    
    // Call do_calc on each value in parallel
    Utilities::parfor(do_calc, values.begin(), values.end());
    

This MR also contains a bug fix to the parfor and apply functions which was causing compilation failure on attempts to pass more than one input iterator of a different type. - BF: Protect concurrent writes to _active_scopes I'm sure I read somewhere that the unordered_map supported this, but I was wrong, at least on macOS. - BF: Need to #include <mutex.h> on linux Also tighten the mutex scope - we only need to protect writes to the std::unordered_map. - MNT: Fix build string - use git describe to get fsl-utils version instead of $FSLDIR/etc/fslversion - ENH: Allow number of threads to be set Allow fsl_init_blas_threading to specify the number of blas threads allowed, e.g. for scoped enablement of matrix parallelisation. Library version not updated to avoid an FBR ( currently no other client projects ) - ENH: Add support for MKL library Add support for controlling MKL threads

Detailed history

  • ENH: New fsl_set_num_threads function which can be used to programmatically set the default value used by NoOfThreads instances.
  • ENH: New ThreadScope class, which allows the number of threads encoded by NoOfThreads instances to be changed within a particlar scope
  • TEST: Tests for NoOfThreads, ThreadScope, and parfor/apply functions
  • BF: Missing template type in call to _call, resulting in compilation failure if the first two inputs were of different types
  • TEST: Regression test for parfor/apply type bug
  • RF: Store stack of nthreads values for each thread instead of a single value
  • TEST: Test nested ThreadScope
  • RF: Make naming less confusing - fsl_num_threads maps to FSL_NUM_THREADS env var. Applications can call set_default_num_threads to override FSL_NUM_THREADS
  • BF: Protect concurrent access to _active_scopes. I'm sure I read somewhere that the unordered_map supported this, but I was wrong, at least on macOS.
  • BF: Need to include <mutex.h> on linux. Tighten mutex scope - only need to protect writes to the unordered_map
  • MNT: Fix build string - use git describe to get fsl-utils version
  • ENH: Allow number of threads to be set
  • ENH: Also set threads for MKL
  • ENH: Use C function not FORTRAN

fsl-mmorf v0.4.2 -> v1.0.0

  • ENH: MMORF on the CPU MMORF can now be compiled and executed on systems without a GPU. The CPU version can run in parallel on multiple CPU cores by specifying the --num_threads option, or by setting the FSL_NUM_THREADS environment variable. The CPU version can run on both Linux (Intel) and macOS (Intel and Apple Silicon).

This work was split over several stages, each outlined in the following merge requests (newest first): - MNT: Use new CLI11 2.5 option to support multiple vector-of-vector options in config files. - RF: Fix GPU performance regression - ENH: CPU implementation of CostFxnKernels - ENH: CPU Implementation of CostFxnTensorL2WarpFieldSymmetricMaskedExcluded class - ENH: CPU implementation of CostFxnLogJacobianSingularValues class - ENH: CPU implementation of CostFxnBendingEnergy class - ENH: CPU implementation of SparseDiagonalMatrixTiled class - ENH: CPU implementation of WarpFieldBSpline class - ENH: CPU implementation of VolumeBSpline class

Detailed history

  • MNT: Use new cli11 2.5 option to support multiple vector-of-vector options in config files.
  • RF: Refactor mmorf.cpp - put all CLI options and parsing/validation logic into a container class, defined in new MMORFOptions module. This is to allow unit testing of cli/config file parsing.
  • BF: Typos, make sure vectors are sized before int->bool conversion
  • MNT: Option to skip validation, for testing
  • RF: Change loadOptions to accept a vector<string>
  • MNT: Don't cache environment variables, so we can test env var parsing
  • TEST: Rename TempDir to InTempDir
  • RF: Move getEnvironmentVariables to Config module for reuse.
  • TEST: Class for temporarily setting/overriding environment variables
  • TEST: Unit tests for MMORFOptions
  • TEST: Another MMORFOptions test case
  • DOC: Update readme - desribe CPU version, remove singularity section
  • MNT: Remove obsolete tensor_average executable
  • DOC: Mention coverage reporting
  • RF: Make sure num_threads defaults to 0, so FSL_NUM_THREADS will be used if set. Adjust Config class so that the TestConfig can reset it (but can't be done in application code)
  • TEST: Test num_threads behaviour