function test_suite=test_find_local_extrema
% tests for cosmo_find_local_extrema
%
% # For CoSMoMVPA's copyright information and license terms, #
% # see the COPYING file distributed with CoSMoMVPA. #
try % assignment of 'localfunctions' is necessary in Matlab >= 2016
test_functions=localfunctions();
catch % no problem; early Matlab versions can use initTestSuite fine
end
initTestSuite
function test_find_local_maxima_basics
% generate tiny dataset with 6 voxels
ds=cosmo_synthetic_dataset('ntargets',1,'nchunks',1);
nh=cosmo_spherical_neighborhood(ds,'radius',1,'progress',false);
% find local maxima within neighborhood of 1 voxel radius
[feature_ids,scores]=cosmo_find_local_extrema(ds,nh);
assertEqual(feature_ids,[1 5 3]);
assertElementsAlmostEqual(scores,[2.0317 1.1908 -1.4437],...
'absolute',1e-4);
% only return two feature ids
[feature_ids,scores]=cosmo_find_local_extrema(ds,nh,'count',2);
assertEqual(feature_ids,[1 5]);
assertElementsAlmostEqual(scores,[2.0317 1.1908],...
'absolute',1e-4);
% use another fitness function, namely local minima
[feature_ids,scores]=cosmo_find_local_extrema(ds,nh,'fitness',@min);
assertEqual(feature_ids,[3 4]);
assertElementsAlmostEqual(scores,[-1.4437 -0.5177 ],...
'absolute',1e-4);
nh=cosmo_spherical_neighborhood(ds,'radius',2,'progress',false);
[feature_ids,scores]=cosmo_find_local_extrema(ds,nh);
assertEqual(feature_ids,[1 6]);
assertElementsAlmostEqual(scores,[2.0317 -1.3265],...
'absolute',1e-4);
nh=cosmo_spherical_neighborhood(ds,'radius',1,'progress',false);
ds.samples(:)=NaN;
[feature_ids,scores]=cosmo_find_local_extrema(ds,nh);
assertEqual(feature_ids,zeros(1,0));
assertElementsAlmostEqual(scores,zeros(1,0));
function test_find_local_maxima_exceptions
ds=cosmo_synthetic_dataset('ntargets',1,'nchunks',1);
nh=cosmo_spherical_neighborhood(ds,'radius',1,'progress',false);
aet=@(varargin)assertExceptionThrown(@()...
cosmo_find_local_extrema(varargin{:}),'');
aet(cosmo_stack({ds,ds}),nh)
ds.fa.i=ds.fa.i(end:-1:1);
aet(ds,nh)
ds.fa.i=ds.fa.i(end:-1:1);
nh.a=struct();
ds.samples=1;
aet(ds,nh);