function test_suite = test_interval_neighborhood()
% tests for cosmo_interval_neighborhood
%
% # 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_interval_neighborhood_basis()
ds_full=cosmo_synthetic_dataset('type','meeg','size','big');
ds_full=cosmo_slice(ds_full,ds_full.fa.chan<3,2);
ds_full=cosmo_dim_prune(ds_full);
sliceargs={1:7,[1 4 7],[2 6]};
radii=[0 1 2];
for k=1:numel(sliceargs)
slicearg=sliceargs{k};
narg=numel(slicearg);
ds=cosmo_slice(ds_full,cosmo_match(ds_full.fa.time,slicearg),2);
ds=cosmo_dim_prune(ds);
nf=size(ds.samples,2);
ds=cosmo_slice(ds,randperm(nf),2);
for j=1:numel(radii)
ds=cosmo_slice(ds,randperm(nf),2);
fa_time=ds.fa.time;
radius=radii(j);
nh=cosmo_interval_neighborhood(ds,'time','radius',radius);
assert(numel(nh.neighbors)==narg);
assertEqual(nh.fa.time,1:narg);
assertEqual(nh.a.fdim.values,...
{ds_full.a.fdim.values{2}(slicearg)});
assertEqual(nh.origin.a.fdim,ds.a.fdim);
assertEqual(nh.origin.fa,ds.fa);
for m=1:narg
msk=m-radius<=fa_time & ...
fa_time <= m+radius;
assertEqual(find(msk),nh.neighbors{m});
end
% should properly deal with permutations
ds2=cosmo_slice(ds,randperm(nf),2);
ds2.a.fdim.values=cellfun(@transpose,ds2.a.fdim.values,...
'UniformOutput',false)';
nh2=cosmo_interval_neighborhood(ds2,'time','radius',radius);
assertEqual(nh.fa,nh2.fa);
assertEqual(nh.a,nh2.a);
mp=cosmo_align(ds.fa,ds2.fa);
for m=1:numel(nh.neighbors)
assertEqual(sort(mp(nh2.neighbors{m})),nh.neighbors{m});
end
end
end
% test exceptionsclc
aet=@(x,i)assertExceptionThrown(@()...
cosmo_interval_neighborhood(x{:}),i);
aet({ds},'');
aet({ds,'time'},'');
aet({ds,'x',2},'');
aet({ds,'time',-1},'');
aet({ds,'time',[2 3]},'');
aet({ds,'time','radius'},'');
aet({ds,'time','radius',-1},'');
function test_interval_neighborhood_sa()
ds=cosmo_synthetic_dataset('type','meeg');
ds_tr=cosmo_dim_transpose(ds,'time');
ds_tr=cosmo_slice(ds_tr,randperm(12));
for radius=0:1
nbrhood=cosmo_interval_neighborhood(ds_tr,'time','radius',radius);
unq_time=unique(ds_tr.sa.time);
for k=1:numel(unq_time)
msk=abs(ds_tr.sa.time-unq_time(k))<=radius;
assertEqual(nbrhood.neighbors{k},find(msk)');
end
end
function test_interval_neighborhood_fa()
ds=cosmo_synthetic_dataset('type','meeg','size','big');
nf=size(ds.samples,2);
rp=randperm(nf);
dsp=cosmo_slice(ds,rp,2);
for radius=0:10
nhp=cosmo_interval_neighborhood(dsp,'time','radius',radius);
assertEqual(nhp.a.fdim.values{1},ds.a.fdim.values{2});
for k=1:numel(nhp.neighbors)
idx=find(abs(nhp.fa.time(k)-dsp.fa.time)<=radius);
assertEqual(nhp.neighbors{k},idx);
end
end
function test_sparse_interval_neighborhood
ds=cosmo_synthetic_dataset('size','big');
% make some holes
ds=cosmo_slice(ds,ds.fa.i>=4 & ds.fa.i<=16,2);
ds=cosmo_slice(ds,mod(ds.fa.i,3)<=1,2);
for radius=0:5
nh=cosmo_interval_neighborhood(ds,'i','radius',radius);
n_nbrs=numel(nh.neighbors);
assert(n_nbrs==numel(ds.a.fdim.values{1}));
for j=1:n_nbrs
nbrs=nh.neighbors{j};
idx=find(j-radius <= ds.fa.i & ds.fa.i <= j+radius);
assertEqual(nbrs(:),idx(:),sprintf(['not equal with '...
'radius=%d, index=%d'],...
radius,j))
end
end