rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
TrainingSetAdaptation.m
1 classdef TrainingSetAdaptation < Greedy.MetaInterface
2  % greedy basis generation extension which adaptively refines the trainings
3  % parameter set.
4  %
5  % @todo add reference to adaptive paper.
6 
7  properties (Constant)
8 
9  % cell array of field names to be copied to the detailed data node instance
10  % during init_basis() call
11  info_fields = { 'max_refinement_steps', 'max_refinement_level', ...
12  'refinement_mode', 'refinement_theta', 'element_indicator_mode', ...
13  'element_indicator_s_max', 'force_stop_at_max_refinement_level' };
14  end
15 
16  properties
17 
18  % maximum number of refinement steps before the algorithm stops.
19  %
20  % If this level is reached, the algorithm terminates and returns the
21  % generated reduced basis spaces.
22  max_refinement_steps = inf;
23 
24  % maximum number of refinement levels in the refineable trainings parameter
25  % set
26  %
27  % If this level is reached, the algorithm terminates and returns the
28  % generated reduced basis spaces.
29  max_refinement_level = 5;
30 
31  % string specifying the method type for the adaptation of the parameter
32  % sampling.
33  %
34  % Possible values are:
35  % - 'uniform': the parameter sampling is refined uniformly
36  % - 'adaptive': the parameter sampling is refined adaptively, such that
37  % only regions of the parameter space with high estimated
38  % errors are refined.
39  refinement_mode = 'uniform'; % 'uniform' or 'adaptive'
40 
41  % ratio of elements which are refined during an adaptive refinement step
42  %
43  % This value `\theta` is multiplied by the number of leaf elements in the
44  % current parameter grid in order to compute the number grid cells to be
45  % refined.
46  refinement_theta = 0.5;
47 
48  % string specifying the indicator for the training set nodes.
49  %
50  % Possible values:
51  % - 'nodes_cogs'
52  % - 'nodes'
53  % - 'nodes_skippedrefs'
54  % - 'nodes_cogs_skippedrefs'
55  element_indicator_mode = 'nodes_cogs';
56 
57  % specifies maximum number of skipped refinements in case of
58  % '*_skippedrefs' indicator modes.
59  element_indicator_s_max = 100;
60 
61  % boolean flag indicating whether at the maximum refinement level the
62  % algorithm shall stop.
63  %
64  % If this is set to false, no further refinement is done at the last level,
65  % but the reduced basis spaces are generated, anyways.
66  force_stop_at_max_refinement_level = true;
67  end
68 
69  methods
70  function psa = TrainingSetAdaptation(child)
71  % function psa = TrainingSetAdaptation(child)
72  % constructor extending a Greedy algorithm object
73  %
74  % Parameters:
75  % child: the greedy algorithm of type Greedy.Interface to be extended
76  % by training set adaptation.
77  assert(isa(child, 'Greedy.Interface'));
78  psa = psa@Greedy.MetaInterface(child);
79  end
80 
81  function detailed_data = init_basis(this, rmodel, model_data)
82  % function detailed_data = init_basis(this, rmodel, model_data)
83  % @copybrief Greedy.Interface.init_basis()
84  %
85  % @copydoc Greedy.Interface.init_basis()
86  %
87  % Parameters:
88  % rmodel: of type Greedy.User.IReducedModel
89  detailed_data = init_basis(this.child, rmodel, model_data);
90 
91  if isstruct(model_data)
92  detailed_data = Greedy.DataTree.Detailed.InfoNode(detailed_data, 'paramspace_adapt');
93  set_fields(detailed_data, this, Greedy.TrainingSetAdaptation.info_fields);
94  end
95  end
96 
97  function detailed_data = basis_extension(this, rmodel, detailed_data, checkpoint)
98  % function detailed_data_tree = basis_extension(this, rmodel, detailed_data_tree, checkpoint)
99  % @copybrief GreedyInterfacebasis_extension()
100  %
101  % @copydoc GreedyInterfacebasis_extension()
102  %
103  % Parameters:
104  % rmodel: of type Greedy.User.IReducedModel
105  % detailed_data: of type Greedy.User.IDetailedData
106  %
107  % copied from basisgen_refined written by
108  % \author Bernard Haasdonk
109 
110  if nargin == 3 || isempty(checkpoint)
111  checkpoint = Greedy.Checkpoint;
112  end
113 
114  basetoc = get(checkpoint, 'parameter_toc', 0);
115 
116  alltimer = tic;
117 
118  while true
119  base_detailed_data = get(detailed_data, 1);
120  base_detailed_data = basis_extension(this.child, rmodel, base_detailed_data, checkpoint.child(1));
121 
122  dd_leaf = get_active_leaf(base_detailed_data, rmodel);
123  refinement_step = get_field(dd_leaf, 'refinement_step', 0);
124 
125  if stopped_on_any_child(base_detailed_data, 'stopped_on_timeout')
126  set_field(detailed_data, 'elapsed_time', toc(alltimer) + basetoc);
127  return;
128  end
130  if ~stopped_on_active_child(base_detailed_data, 'stopped_on_max_val_train_ratio', rmodel)
131  detailed_data.stop_flags = union(detailed_data.stop_flags, base_detailed_data.stop_flags);
132  break;
133  end
134 
135  if refinement_step >= get_field(detailed_data, 'max_refinement_steps')
136  set_stop_flag(dd_leaf, 'stopped_on_max_refinement_level');
137  break;
138  end
139 
140  M_train = get_field(dd_leaf, 'M_train');
141  if isempty(M_train) || ~isa(M_train, 'ParameterSampling.IRefineable')
142  break;
143  end
145  levels = get_refinement_levels(M_train);
146  maxlev = max(levels);
147  if maxlev == get_field(detailed_data, 'max_refinement_level') - 1 ...
148  && ~get_field(detailed_data, 'force_stop_at_max_refinement_level')
149 
150  set_field(dd_leaf, 'stop_max_val_train_ratio', 1e6);
151 
152  end
153 
154  % if refinement is still possible and required val-train ratio is not assured
155  % refine the parameter space regardless of stopped_on_epsilon flag.
156  r_values = get_field(dd_leaf, 'r_value_sequence');
157  if maxlev < get_field(detailed_data, 'max_refinement_level') ...
158  && r_values(end) > get_field(dd_leaf, 'stop_max_val_train_ratio')
159 
160  set_stop_flag(dd_leaf, 'stopped_on_epsilon', false);
161  end
162 
163  if maxlev >= get_field(detailed_data, 'max_refinement_level')
164  set_stop_flag(dd_leaf, 'stopped_on_max_refinement_level');
165  break;
166  end
167 
168  disp('detected grid refinement necessary!!');
169  disp(['max val train ratio was: ', num2str(r_values(end))]);
170  nleafelements = size(M_train);
171 
172  snapshot(dd_leaf, 'ParamSpaceAdapt', 'Parameter space adaptation', ...
173  ['Refinement step no. ', num2str(refinement_step)]);
175  switch get_field(detailed_data, 'refinement_mode')
176  case 'uniform'
177  set_field(dd_leaf, 'M_train', refine(M_train));
178  case 'adaptive'
179 
180  eta = refinement_element_indicators( this, rmodel, detailed_data, ...
181  dd_leaf );
182 
183  [dummy, ind] = sort(-eta);
184  nmax = ceil(nleafelements * get_field(detailed_data, 'refinement_theta'));
185 
186  set_field(dd_leaf, 'M_train', refine(M_train, ind(1:nmax)));
187  end
188 
189  set_stop_flag(dd_leaf, 'stopped_on_max_val_train_ratio', false);
190 
191  refinement_step = refinement_step + 1;
192  set_field(dd_leaf, 'refinement_step', refinement_step);
193  checkpoint = checkpoint.store(rmodel, detailed_data, 'refinement', ...
194  struct('parameter_toc', toc(alltimer) + basetoc));
195  end
196  set_field(detailed_data, 'elapsed_time', toc(alltimer) + basetoc);
197  end
198 
199  function eta = refinement_element_indicators( this, rmodel, detailed_data, dd_leaf )
200  % function eta = refinement_element_indicators( this, rmodel, detailed_data, dd_leaf )
201  % evaluates the refinement indicators
202  %
203  % Parameters:
204  % rmodel: of type Greedy.User.IReducedModel
205  % detailed_data: of type Greedy.User.IDetailedData
206  % dd_leaf: Detailed data node of type Greedy.DataTree.Detailed.ILeafNode
207  % which is currently extended leaf in the detailed data tree.
208  Delta_train = get_field(dd_leaf, 'M_last_errors');
209  MMesh = get_field(dd_leaf, 'M_train');
210  base_detailed_data = get(detailed_data, 1);
211 
212  if isempty(Delta_train)
213  Delta_train = error_indicators(this.child, rmodel, base_detailed_data, MMesh.sample);
214  end
215 
216  if isequal(get_field(detailed_data, 'element_indicator_mode'), 'nodes_cogs') ...
217  || isequal(get_field(detailed_data, 'element_indicator_mode'), 'nodes_cogs_skippedrefs')
218 
219  % determine all cog vertex estimators
220  M_cog = cogs(MMesh);
221  Delta_cog = error_indicators(this.child, rmodel, base_detailed_data, M_cog, true);
222  set_field(dd_leaf, 'Delta_cog', Delta_cog);
223  end
224 
225  Max_Delta_vertex = elementwise_maximum_of_vertex_values(MMesh, Delta_train);
226 
227  switch get_field(detailed_data, 'element_indicator_mode')
228  case 'nodes_cogs'
229  % eta(i) = max_{mu in (V(e) and cog(e))} Delta (Phi_t, mu)
230  eta = max( Delta_cog(:), Max_Delta_vertex(:) );
231  case 'nodes'
232  % eta(i) = max_{mu in (V(e))} Delta (Phi_t, mu)
233  eta = Max_Delta_vertex(:);
234  case 'nodes_skippedrefs'
235  % eta(i) = max_{mu in (V(e))} Delta (Phi_t, mu) +
236  % s(i)/s_max * epsilon
237  % determine number of skipped refinements of all leaf elements
238  s = skipped_refinements(MMesh);
239  eta = Max_Delta_vertex(:) + ...
240  max(Max_Delta_vertex) / ...
241  get_field(detailed_data, 'element_indicator_s_max') * ...
242  s(:);
243  case 'nodes_cogs_skippedrefs'
244  % eta(i) = max_{mu in (V(e) and cogs)} Delta (Phi_t, mu) +
245  % s(i)/s_max * epsilon
246  % determine number of skipped refinements of all leaf elements
247  s = skipped_refinements(MMesh);
248  eta = max(Delta_cog(:),Max_Delta_vertex(:)) + ...
249  max(Max_Delta_vertex) / ...
250  get_field(detailed_data, 'element_indicator_s_max') * ...
251  s(:);
252  otherwise
253  error('element_indicator_mode in grid-refinement unknown');
254  end;
255  end
256 
257  end
258 
259 end
Interface class for all kind of reduced basis generation algorithms
Definition: Interface.m:18
Helper class used to store and restore data tree objects at specified checkpoints.
Definition: Checkpoint.m:18
virtual function Greedy.DataTree.Detailed.INode detailed_data = init_basis(IReducedModel rmodel,ModelData model_data)
construction of an initial reduced basis
Parameter sampling sets.
Definition: Interface.m:1
Definition: leaf.m:17
Interface classes to be implemented by the Greedy.Algorithm user.
This is the interface for a reduced model providing methods to compute low dimensional reduced simula...
Definition: IReducedModel.m:17
greedy basis generation extension which adaptively refines the trainings parameter set...
Customizable implementation of an abstract greedy algorithm.
Definition: DuneRBLeafNode.m:1
interface specialization for a reduced model that can be used with the Greedy algorithm for basis gen...
Definition: IReducedModel.m:19
Interface class for the generation and storage of reduced basis spaces as described in Module (M2)...
Definition: IDetailedData.m:17