rbmatlab 0.10.01
|
00001 classdef Combined < Greedy.Interface 00002 % combines two or more instances of a Greedy.Interface class by executing 00003 % them subsequently. 00004 00005 properties (SetAccess = private, Dependent) 00006 generated_basis_type; 00007 00008 id; 00009 end 00010 00011 properties (Access = private) 00012 container; 00013 00014 idmap; 00015 end 00016 00017 methods 00018 00019 function cbg = Combined(varargin) 00020 % function cbg = Combined(varargin) 00021 % constructor storing the Greedy.Interface instances to be combined. 00022 % 00023 % Parameters: 00024 % varargin: a list of greedy algorithm instances of type Greedy.Interface 00025 cbg.container = varargin; 00026 idm = cell(1, length(varargin)); 00027 for i = 1:length(idm) 00028 idm{i} = varargin{i}.id; 00029 end 00030 cbg.idmap = idm; 00031 cbg.generated_basis_type; 00032 end 00033 00034 function generated_type = get.generated_basis_type(this) 00035 if all(cellfun(@(x) isequal(x.generated_basis_type, 'ei'), this.container)) 00036 generated_type = 'ei'; 00037 elseif all(cellfun(@(x) isequal(x.generated_basis_type, 'rb'), this.container)) 00038 generated_type = 'rb'; 00039 elseif length(this.container) == 2 ... 00040 && isequal(get_generated_basis_type(this.container{1}), 'ei') ... 00041 && isequal(this.container{2}.generated_basis_type, 'rb') 00042 generated_type = 'eirb'; 00043 else 00044 error('Unsupported combination of basis generation algorithms! You can combine only EI or only RB generations, or _one_ EI with _one_ RB'); 00045 end 00046 end 00047 00048 % function [max_errs, max_err_seq, max_mu_index] = error_indicators(this, detailed_data, parameter_set, reuse_reduced_data) 00049 % if nargin < 4 00050 % reuse_reduced_data = false; 00051 % end 00052 % if nargin < 3 00053 % parameter_set = []; 00054 % end 00055 % if isequal(generated_type, 'eirb') 00056 % [max_errs, max_err_seq, max_mu_index] = error_indicators(this.container{2}, detailed_data, parameter_set, reuse_reduced_data); 00057 % elseif isequal(generated_type, 'ei') 00058 % max_errs = DataTree.IdMapNode(this.idmap); 00059 % max_err_seqs = DataTree.IdMapNode(this.idmap); 00060 % max_mu_index = DataTree.IdMapNode(this.idmap); 00061 % parameters = DataTree.IdMapNode(this.idmap, parameter_set); 00062 % 00063 % for i = 1:length(this.idmap) 00064 % [me, mes, mu] = error_indicators(this.container{i}, get(detailed_data, i), ... 00065 % get(parameters,i)); 00066 % set(max_errs, i, me); 00067 % set(max_err_seqs, i, mes); 00068 % set(max_mu_index, i, mu); 00069 % end 00070 % 00071 % end 00072 % end 00073 00074 function id = get.id(this) 00075 id = this.idmap; 00076 end 00077 00078 function prepare(this, rmodel, model_data) 00079 for i=1:length(this.container) 00080 prepare(this.container{i}, rmodel, model_data); 00081 end 00082 end 00083 00084 function detailed_data = init_basis(this, rmodel, model_data) 00085 % function detailed_data = init_basis(this, rmodel, model_data) 00086 % @copybrief Greedy.Interface.init_basis() 00087 % 00088 % @copydoc Greedy.Interface.init_basis() 00089 % 00090 % Parameters: 00091 % rmodel: of type Greedy.User.IReducedModel 00092 if isequal(this.generated_basis_type, 'eirb') 00093 detailed_data = Greedy.DataTree.Detailed.IdMapNode({'ei', 'rb'}); 00094 set(detailed_data, 1, init_basis(this.container{1}, rmodel, model_data)); 00095 ddrb = init_basis(this.container{2}, rmodel, model_data); 00096 00097 tree_descr = get_leaf_description(ddrb); 00098 for leaf_descr = tree_descr 00099 dd_rb_leaf = get(ddrb, leaf_descr.basepath); 00100 00101 dd_podei_leaf = Greedy.DataTree.Detailed.PODEILeafNode(model_data, false); 00102 % dd_podei_leaf.fields = dd_rb_leaf.fields; 00103 % dd_podei_leaf.stop_flags = dd_rb_leaf.stop_flags; 00104 % dd_rb_leaf.fields = []; 00105 % dd_rb_leaf.stop_flags = []; 00106 00107 dd_podei_leaf.rb = dd_rb_leaf; 00108 % TODO: extract the subtree that fits to the rb_leaf...? 00109 dd_podei_leaf.ei = get(detailed_data, 1); 00110 if ~isempty(leaf_descr.basepath) 00111 set(ddrb, leaf_descr.basepath, dd_podei_leaf); 00112 else 00113 ddrb = dd_podei_leaf; 00114 end 00115 end 00116 00117 set(detailed_data, 2, ddrb); 00118 return; 00119 elseif isequal(this.generated_basis_type, 'ei') 00120 % index_map = cellfun(@(x) x.detailed_extension.id, this.container, 'UniformOutput', false); 00121 detailed_data = Greedy.DataTree.Detailed.IdMapNode(this.idmap); 00122 else % generate several rb spaces subsequently 00123 error('It is not supported yet to generate several RB spaces subsequently.'); 00124 end 00125 for i=1:length(this.container) 00126 set(detailed_data, i, init_basis(this.container{i}, rmodel, model_data)); 00127 end 00128 end 00129 00130 function detailed_data = basis_extension(this, rmodel, detailed_data, checkpoint) 00131 % function detailed_data = basis_extension(this, rmodel, detailed_data, checkpoint) 00132 % @copybrief Greedy.Interface.basis_extension() 00133 % 00134 % @copydetails Greedy.Interface.basis_extension() 00135 % 00136 % Parameters: 00137 % rmodel: of type Greedy.User.IReducedModel 00138 % detailed_data: of type Greedy.User.IDetailedData 00139 idname = DataTree.IdMapNode.name_from_idmap(this.idmap); 00140 if nargin == 2 00141 checkpoint = Greedy.Checkpoint; 00142 end 00143 if isequal(this.generated_basis_type, 'eirb') 00144 if ~get(checkpoint, 'ei_computed', false) 00145 set(detailed_data, 1,... 00146 basis_extension(this.container{1}, rmodel, ... 00147 get(detailed_data,1), checkpoint.child(1) )... 00148 ); 00149 end 00150 checkpoint = checkpoint.store(rmodel, detailed_data, idname, struct('ei_computed', true)); 00151 00152 set(detailed_data, 2,... 00153 basis_extension(this.container{2}, rmodel, ... 00154 get(detailed_data,2), checkpoint.child(2) )... 00155 ); 00156 else 00157 ei_start = get(checkpoint, 'ei_ei_start', 1); 00158 for i=ei_start:length(this.container) 00159 set(detailed_data, i, ... 00160 basis_extension(this.container{i}, rmodel, ... 00161 get(detailed_data,i), checkpoint.child(i) )... 00162 ); 00163 checkpoint = checkpoint.store(rmodel, detailed_data, idname, struct('ei_ei_start', i+1)); 00164 end 00165 end 00166 end 00167 00168 function rb_basis_gen = get_rb_basis_generator(this) 00169 % function rb_basis_gen = get_rb_basis_generator(this) 00170 % returns the snapshot generator for the reduced basis construction 00171 % 00172 % Return values: 00173 % rb_basis_gen: snapshot generator of type SnapshotsGenerator.Cached 00174 if isequal(this.generated_basis_type, 'eirb') 00175 rb_basis_gen = this.container{2}; 00176 else 00177 rb_basis_gen = []; 00178 end 00179 end 00180 00181 function rb_basis_gen = get_ei_basis_generator(this) 00182 % function rb_basis_gen = get_ei_basis_generator(this) 00183 % returns the snapshot generator for the reduced basis construction 00184 % 00185 % Return values: 00186 % rb_basis_gen: snapshot generator of type SnapshotsGenerator.Cached 00187 if isequal(this.generated_basis_type, 'eirb') 00188 rb_basis_gen = this.container{1}; 00189 else 00190 rb_basis_gen = []; 00191 end 00192 end 00193 end 00194 end 00195