1 classdef Combined < Greedy.Interface
2 % combines two or more instances of a Greedy.Interface
class by executing
5 properties (SetAccess =
private, Dependent)
11 properties (Access = private)
21 % constructor storing the Greedy.
Interface instances to be combined.
24 % varargin: a list of greedy algorithm instances of type Greedy.
Interface
25 cbg.container = varargin;
26 idm = cell(1, length(varargin));
28 idm{i} = varargin{i}.
id;
31 cbg.generated_basis_type;
34 function generated_type =
get.generated_basis_type(
this)
35 if all(cellfun(@(x) isequal(x.generated_basis_type,
'ei'),
this.container))
36 generated_type = 'ei';
37 elseif all(cellfun(@(x) isequal(x.generated_basis_type, 'rb'), this.container))
38 generated_type = 'rb';
39 elseif length(this.container) == 2 ...
40 && isequal(get_generated_basis_type(this.container{1}),
'ei') ...
41 && isequal(this.container{2}.generated_basis_type,
'rb')
42 generated_type =
'eirb';
44 error(
'Unsupported combination of basis generation algorithms! You can combine only EI or only RB generations, or _one_ EI with _one_ RB');
48 %
function [max_errs, max_err_seq, max_mu_index] = error_indicators(
this, detailed_data, parameter_set, reuse_reduced_data)
50 % reuse_reduced_data =
false;
55 %
if isequal(generated_type,
'eirb')
56 % [max_errs, max_err_seq, max_mu_index] = error_indicators(this.container{2}, detailed_data, parameter_set, reuse_reduced_data);
57 % elseif isequal(generated_type,
'ei')
58 % max_errs = DataTree.IdMapNode(this.idmap);
59 % max_err_seqs = DataTree.IdMapNode(this.idmap);
60 % max_mu_index = DataTree.IdMapNode(this.idmap);
61 % parameters = DataTree.IdMapNode(this.idmap, parameter_set);
63 %
for i = 1:length(this.idmap)
64 % [me, mes, mu] = error_indicators(this.container{i},
get(detailed_data, i), ...
66 %
set(max_errs, i, me);
67 %
set(max_err_seqs, i, mes);
68 %
set(max_mu_index, i, mu);
74 function id =
get.id(
this)
78 function prepare(
this, rmodel, model_data)
79 for i=1:length(this.container)
80 prepare(this.container{i}, rmodel, model_data);
84 function detailed_data = init_basis(
this, rmodel, model_data)
85 %
function detailed_data = init_basis(
this, rmodel, model_data)
91 % rmodel: of type Greedy.User.IReducedModel
92 if isequal(this.generated_basis_type,
'eirb')
93 detailed_data = Greedy.DataTree.Detailed.IdMapNode({
'ei',
'rb'});
94 set(detailed_data, 1, init_basis(this.container{1}, rmodel, model_data));
95 ddrb = init_basis(this.container{2}, rmodel, model_data);
97 tree_descr = get_leaf_description(ddrb);
98 for leaf_descr = tree_descr
99 dd_rb_leaf =
get(ddrb, leaf_descr.basepath);
101 dd_podei_leaf = Greedy.DataTree.Detailed.PODEILeafNode(model_data,
false);
102 % dd_podei_leaf.fields = dd_rb_leaf.fields;
103 % dd_podei_leaf.stop_flags = dd_rb_leaf.stop_flags;
104 % dd_rb_leaf.fields = [];
105 % dd_rb_leaf.stop_flags = [];
107 dd_podei_leaf.rb = dd_rb_leaf;
108 % TODO: extract the subtree that fits to the rb_leaf...?
109 dd_podei_leaf.ei =
get(detailed_data, 1);
110 if ~isempty(leaf_descr.basepath)
111 set(ddrb, leaf_descr.basepath, dd_podei_leaf);
113 ddrb = dd_podei_leaf;
117 set(detailed_data, 2, ddrb);
119 elseif isequal(this.generated_basis_type, 'ei')
120 % index_map = cellfun(@(x) x.detailed_extension.
id, this.container, 'UniformOutput', false);
121 detailed_data = Greedy.DataTree.Detailed.IdMapNode(this.idmap);
122 else % generate several rb spaces subsequently
123 error('It is not supported yet to generate several RB spaces subsequently.');
125 for i=1:length(this.container)
126 set(detailed_data, i, init_basis(this.container{i}, rmodel, model_data));
130 function detailed_data = basis_extension(
this, rmodel, detailed_data, checkpoint)
131 %
function detailed_data = basis_extension(
this, rmodel, detailed_data, checkpoint)
137 % rmodel: of type Greedy.User.IReducedModel
138 % detailed_data: of type Greedy.User.IDetailedData
139 idname = DataTree.IdMapNode.name_from_idmap(this.idmap);
141 checkpoint = Greedy.Checkpoint;
143 if isequal(this.generated_basis_type,
'eirb')
144 if ~get(checkpoint, 'ei_computed', false)
145 set(detailed_data, 1,...
146 basis_extension(this.container{1}, rmodel, ...
147 get(detailed_data,1), checkpoint.child(1) )...
150 checkpoint = checkpoint.store(rmodel, detailed_data, idname,
struct(
'ei_computed',
true));
152 set(detailed_data, 2,...
153 basis_extension(this.container{2}, rmodel, ...
154 get(detailed_data,2), checkpoint.child(2) )...
157 ei_start =
get(checkpoint,
'ei_ei_start', 1);
158 for i=ei_start:length(this.container)
159 set(detailed_data, i, ...
160 basis_extension(this.container{i}, rmodel, ...
161 get(detailed_data,i), checkpoint.child(i) )...
163 checkpoint = checkpoint.store(rmodel, detailed_data, idname,
struct(
'ei_ei_start', i+1));
168 function rb_basis_gen = get_rb_basis_generator(
this)
169 %
function rb_basis_gen = get_rb_basis_generator(
this)
170 % returns the snapshot generator
for the reduced basis construction
174 if isequal(this.generated_basis_type,
'eirb')
175 rb_basis_gen = this.container{2};
181 function rb_basis_gen = get_ei_basis_generator(
this)
182 %
function rb_basis_gen = get_ei_basis_generator(
this)
183 % returns the snapshot generator
for the reduced basis construction
187 if isequal(this.generated_basis_type,
'eirb')
188 rb_basis_gen = this.container{1};