function test_suite = test_squareform
% tests for cosmo_squareform
%
% # 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_squareform_()
vec=1:6;
mx=[0 1 2 3; 1 0 4 5; 2 4 0 6; 3 5 6 0];
sf=@cosmo_squareform;
% numeric input
assertElementsAlmostEqual(sf(vec),mx);
assertElementsAlmostEqual(sf(vec,'tomatrix'),mx);
assertElementsAlmostEqual(sf(mx),vec);
assertElementsAlmostEqual(sf(mx,'tovector'),vec);
% logical input
vec2=logical(vec);
mx2=logical(mx);
assertEqual(sf(vec2),mx2);
assertEqual(sf(vec2,'tomatrix'),mx2);
assertEqual(sf(mx2),vec2);
assertEqual(sf(mx2,'tovector'),vec2);
% exceptions
assertExceptionThrown(@() sf(vec,'foo'),'');
assertExceptionThrown(@() sf(mx,'foo'),'');
assertExceptionThrown(@() sf(vec,struct()),...
'');
assertExceptionThrown(@() sf(struct()),'');
assertExceptionThrown(@() sf(struct(),'tovector'),'');
assertExceptionThrown(@() sf(struct(),'tomatrix'),'');
assertExceptionThrown(@() sf(zeros(2,3),'tovector'),'');
assertExceptionThrown(@() sf(zeros(2),'tomatrix'),'');
assertExceptionThrown(@() sf(zeros([2,2,2])),'');
assertExceptionThrown(@() sf(zeros([2,2,2]),'tovector'),'');
assertExceptionThrown(@() sf(zeros([2,2,2]),'tomatrix'),'');
assertExceptionThrown(@() sf([vec 1]),'');
assertExceptionThrown(@() sf([vec 1],'tomatrix'),'');
assertExceptionThrown(@() sf(cell(0,0),'tomatrix'),'');
assertExceptionThrown(@() sf(cell(0,0),'tovector'),'');
assertExceptionThrown(@() sf(cell(0,0),''),'');
assertExceptionThrown(@() sf(eye(4)+mx),'');
assertExceptionThrown(@() sf(eye(4)+mx,'tovector'),'');
mx(2,1)=3;
assertExceptionThrown(@() sf(mx,'tovector'),'');
function test_squareform_matlab_agreement()
if cosmo_wtf('is_octave') || ~cosmo_check_external('@stats',false)
cosmo_notify_test_skipped('Matlab''s squareform is not available');
return
end
for side=1:10
n=side*(side-1)/2;
data=rand(n,1);
helper_assert_squareform_equal_to_matlab(data);
helper_assert_squareform_equal_to_matlab(data,'tomatrix');
helper_assert_squareform_equal_to_matlab(data','tomatrix');
mx=squareform(data);
helper_assert_squareform_equal_to_matlab(mx);
helper_assert_squareform_equal_to_matlab(mx,'tovector');
end
function helper_assert_squareform_equal_to_matlab(varargin)
assertEqual(squareform(varargin{:}),cosmo_squareform(varargin{:}));
function test_squareform_random_data_without_nans()
helper_test_squareform_with_random_data(false);
function test_squareform_random_data_with_nans()
helper_test_squareform_with_random_data(true);
function helper_test_squareform_with_random_data(has_nan)
for side=1:10
data=randn(side);
data=data+data';
data=data-diag(diag(data));
if has_nan
if side==1
continue;
end
data(side,1)=NaN;
data(1,side)=NaN;
end
data_sq=cosmo_squareform(data,'tovector');
nelem=numel(data_sq);
assertEqual(nelem,side*(side-1)/2);
counter=0;
for col=1:(side-1)
for row=(col+1):side
counter=counter+1;
assertEqual(data(row,col),data_sq(counter));
end
end
data_back=cosmo_squareform(data_sq,'tomatrix');
if side==1
assert(isempty(data_back));
else
assertEqual(data,data_back);
end
end