function test_suite = test_flatten()
% tests for cosmo_flatten
%
% # 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_flatten_and_unflatten()
combis = cosmo_cartprod({1:2, 0:2, 1:2});
for k = 1:size(combis, 1)
args = num2cell(combis(k, :));
run_helper_test_flatten(args{:});
end
function run_helper_test_flatten(nsamples, nfdim, dim)
aet_fl = @(varargin) assertExceptionThrown(@() ...
cosmo_flatten(varargin{:}), '');
aet_unfl = @(varargin) assertExceptionThrown(@() ...
cosmo_unflatten(varargin{:}), '');
ndata = nsamples * 30;
orig_labels = {'i', 'j', 'k'};
orig_values = {[1:2; 3 4], [1:3; 3:-1:1], {'a', 'b', 'c', 'd', 'e'}};
use_vector_values = nfdim <= 1;
transpose_vectors = nfdim == 0;
if use_vector_values
% select first row only
orig_values = cellfun(@(x)x(1, :), orig_values, ...
'UniformOutput', false);
end
transpose_count = transpose_vectors + 0;
switch dim
case 1
data_shape = [2 3 5 nsamples];
transpose_count = transpose_count + 1;
a_dim = 'sa';
attr_dim = 'sdim';
case 2
data_shape = [nsamples 2 3 5];
a_dim = 'fa';
attr_dim = 'fdim';
end
if use_vector_values && transpose_vectors
opt = struct();
wrong_opt = struct();
wrong_opt.matrix_labels = {'i', 'j'};
elseif use_vector_values
opt = struct();
wrong_opt = 'this will raise an error because it is not a struct';
else
opt = struct();
opt.matrix_labels = {'i', 'j'};
wrong_opt = struct();
end
if mod(dim, 2) == 1
tr = @transpose;
else
tr = @(x)x;
end
if mod(transpose_count, 2) == 1
tr_values = @transpose;
else
tr_values = @(x)x;
end
orig_values_tr = cellfun(tr_values, orig_values, 'UniformOutput', false);
data = reshape(1:ndata, data_shape);
ds = cosmo_flatten(data, orig_labels, orig_values_tr, dim, opt);
aet_fl(data, orig_labels, orig_values_tr, dim, wrong_opt);
assertEqual(ds.samples(:), (1:ndata)');
assertEqual(ds.(a_dim).i, tr(repmat([1 2], 1, 15)));
assertEqual(ds.(a_dim).j, tr(repmat([1 1 2 2 3 3], 1, 5)));
assertEqual(ds.(a_dim).k, tr(kron(1:5, ones(1, 6))));
aet_fl(data, orig_labels, cellfun(@(x)x(1:2), orig_values, ...
'UniformOutput', false));
expected_values = cellfun(tr, orig_values, 'UniformOutput', false);
expected_labels = cellfun(tr, orig_labels, 'UniformOutput', false);
assertEqual(ds.a.(attr_dim).values, expected_values);
assertEqual(ds.a.(attr_dim).labels, expected_labels);
% test unflatten
if transpose_vectors
ds.a.(attr_dim).values = cellfun(@transpose, ...
ds.a.(attr_dim).values, ...
'UniformOutput', false);
end
[data2, labels, values] = cosmo_unflatten(ds, dim, opt);
aet_unfl(ds, dim, wrong_opt);
assertEqual(data, data2);
assertEqual(labels, expected_labels);
assertEqual(values, expected_values);
aet_unfl(ds, 3 - dim);
% test exceptions
aet = @(varargin)assertExceptionThrown(@() ...
cosmo_unflatten(varargin{:}), '');
ds2 = cosmo_stack({ds, ds}, dim);
aet(ds2, dim);
ds_bad = ds;
ds_bad.a.(attr_dim).values = ds_bad.a.(attr_dim).values(1:(end - 1));
aet(ds_bad, dim, opt);
% illegal dim argument
aet(ds, 3);
aet(ds, [1 1] * dim, opt);
function test_unflatten_exceptions()
aet = @(varargin)assertExceptionThrown(@() ...
cosmo_unflatten(varargin{:}), '');
ds = cosmo_synthetic_dataset();
cosmo_unflatten(ds); % should be ok
bad_ds = ds;
bad_ds.foo = 2;
aet(bad_ds);