rbmatlab 0.10.01
rbasis/basisgen/+Greedy/Combined.m
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 
All Classes Namespaces Files Functions Variables