IRootLab
An Open-Source MATLAB toolbox for vibrational biospectroscopy
reptt_blockcube.m
Go to the documentation of this file.
1 %> @brief REpeated Train-Test - Block Cube
2 %>
3 %> If @ref sgs is passes, it is used to guide splitting the dataset. Otherwise, it will be expected that the
4 %> reptt_sgs::data property has at least two elements (the first will be used for training and the other for test).
6  properties
7  %> SGS. If not supplied, the @ref data property will be expected to
8  %> have at least two elements. Another option is to use obsidxs
9  %> instead
10  sgs;
11 
12  %> Alternative to SGS
13  obsidxs;
14 
15  %> =0. Whether to run in parallel mode!
16  flag_parallel = 0;
17  end;
18 
19  properties(SetAccess=protected)
20  no_datasets;
21  end;
22 
23  methods
24  function o = reptt_blockcube()
25  o.classtitle = 'Block Cube';
26  o.flag_ui = 1;
27  o.flag_multiin = 1;
28  end;
29  end;
30 
31  methods(Access=protected)
32  %> Goes somewhere
33  function log = do_use(o, data)
34  log = log_cube();
35  o = o.boot_postpr(); % from reptt
36 
37  flag_obsidxs = 1;
38  if ~isempty(o.sgs)
39  obsidxs_ = o.sgs.get_obsidxs(data);
40  nds = size(obsidxs_, 1);
41  elseif ~isempty(o.obsidxs)
42  obsidxs_ = o.obsidxs;
43  nds = size(obsidxs_, 1);
44  else
45  nds = 1;
46  flag_obsidxs = 0;
47  if numel(data) < 2
48  irerror('reptt_blockcube needs 2 input datasets (train, use) when sgs and obsidxs are both empty!');
49  end;
50  end;
51 % o.no_datasets = nds;
52 
53  log = log.allocate_logs(o.log_mold, o.block_mold, nds);
54 
55  [ni, nj, nk, nl] = size(log.logs);
56  ntotal = nds*ni*nj*nk;
57 
58  log.blocks = cell(ni, nj, nk);
59 
60  if ~o.flag_parallel
61 
62  %---
63  %--- Serial version
64  %---
65 
66  ipro = progress2_open('REPTT_BLOCKCUBE', [], 0, ntotal);
67  ids_save = -1;
68  for i = 1:ntotal
69  % base decomposition of i
70  ik = mod(i-1, nk)+1;
71  inext = floor((i-1)/nk)+1;
72  ij = mod(inext-1, nj)+1;
73  inext = floor((inext-1)/nj)+1;
74  ii = mod(inext-1, ni)+1;
75  inext = floor((inext-1)/ni)+1;
76  ids = mod(inext-1, nds)+1;
77 
78  if flag_obsidxs
79  if ids ~= ids_save
80  datasets = data.split_map(obsidxs_(ids, :));
81  ids_save = ids;
82  end;
83 
84  else
85  datasets = data;
86  end;
87 
88  if ~isempty(o.block_mold{ii, ij, ik})
89 
90  bl = o.block_mold{ii, ij, ik}.boot();
91  bl = bl.train(datasets(1));
92  est = bl.use(datasets(2));
93 
94  if ~isempty(o.postpr_est)
95  est = o.postpr_est.use(est);
96  end;
97 
98  if ~isempty(o.postpr_test)
99  ds_test = o.postpr_test.use(datasets(2));
100  else
101  ds_test = datasets(2);
102  end;
103 
104  pars = struct('est', {est}, 'ds_test', {ds_test}, 'clssr', {bl});
105  for il = 1:nl
106  log.logs{ii, ij, ik, il} = log.logs{ii, ij, ik, il}.record(pars);
107  end;
108  log.blocks{ii, ij, ik, ids} = bl; % records the trained block
109  else
110  end;
111 
112 
113  ipro = progress2_change(ipro, [], [], i);
114  end;
115  progress2_close(ipro);
116 
117  else
118  %|||
119  %||| Parallel version
120  %|||
121 
122  nijk = ni*nj*nk;
123 
124  v_logs = cell(1, nijk); %, nl);
125 
126  parallel_open();
127 
128  parfor i = 1:nijk
129  och = o; %#ok<NASGU>
130 
131  % base decomposition of i
132  ik = mod(i-1, nk)+1;
133  inext = floor((i-1)/nk)+1;
134  ij = mod(inext-1, nj)+1;
135  inext = floor((inext-1)/nj)+1;
136  ii = mod(inext-1, ni)+1;
137 
138  for ids = 1:nds
139  if flag_obsidxs
140  datasets = data.split_map(obsidxs_(ids, :)); %#ok<PFBNS>
141  else
142  datasets = o_data;
143  end;
144 
145  if ~isempty(o.block_mold{ii, ij, ik})
146 
147  bl = o.block_mold{ii, ij, ik}.boot();
148  bl = bl.train(datasets(1));
149  est = bl.use(datasets(2));
150 
151  if ~isempty(o.postpr_est)
152  est = o.postpr_est.use(est);
153  end;
154 
155  if ~isempty(o.postpr_test)
156  ds_test = o.postpr_test.use(datasets(2));
157  else
158  ds_test = datasets(2);
159  end;
160 
161  pars = struct('est', {est}, 'ds_test', {ds_test}, 'clssr', {bl});
162  for il = 1:nl
163  if ids == 1
164  v_logs{i}{il} = log.logs{ii, ij, ik, il}; %#ok<PFBNS>
165  end;
166  v_logs{i}{il} = v_logs{i}{il}.record(pars);
167  end;
168  v_blocks{i}{ids} = bl;
169  end;
170  end;
171  end;
172 
173  parallel_close();
174 
175  for i = 1:nijk
176  % base decomposition of i
177  ik = mod(i-1, nk)+1;
178  inext = floor((i-1)/nk)+1;
179  ij = mod(inext-1, nj)+1;
180  inext = floor((inext-1)/nj)+1;
181  ii = mod(inext-1, ni)+1;
182 
183  for il = 1:nl
184  log.logs{ii, ij, ik, il} = v_logs{i}{il};
185  end;
186  for ids = 1:nds
187  log.blocks{ii, ij, ik, ids} = v_blocks{i}{ids}; % records the trained block
188  end;
189  end;
190  end;
191  end;
192  end;
193 end
194 
Base Sub-dataset Generation Specification (SGS) class.
Definition: sgs.m:6
function progress2_change(in prgrss, in title, in perc, in i, in n)
function parallel_close()
function progress2_open(in title, in perc, in i, in n)
Log generated by a reptt_blockcube.
Definition: log_cube.m:9
function irerror(in s)
Base Block class.
Definition: block.m:2
function progress2_close(in prgrss)
REPeated Train-Test.
Definition: reptt.m:8
function parallel_open(in no_labs)
REpeated Train-Test - Block Cube.