rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
hp_elliptic.m
1 function hp_model = hp_elliptic( hp_model,model_data )
2 %function hp_model = hp_elliptic( hp_model,model_data )
3 %
4 % compute a h-refinment and rb generation for elliptic problems
5 
6  % Generierung des Trainingssets
7  rand('state',hp_model.base_model.RB_train_rand_seed);
8  %neue Eigenschaft model.training (benötigt für
9  %Basisgenerierungsprogramm)
10  hp_model.base_model.training = [];
11  hp_model.base_model.training = rand_uniform(hp_model.base_model.RB_train_size,...
12  hp_model.base_model.mu_ranges);
13 
14 
15 
16  % Erstes eintrag im Baum manuell erstellen
17  hp_model.tree = leaf();
18  hp_model.tree.anchor = [1;1]; %!!! nicht immer gültig
19  hp_model.tree.model =hp_model.base_model;
20  hp_model.tree.training = hp_model.base_model.training;
21 
22 
23  littletree = hp_model.tree.anchor;
24 
25  hp_model.tree = hRB(hp_model.tree);
26 
27  % Rekursive funktion zum HP_Baum Aufbau
28  % struktur der Anker im Baum werden in littletree (global!)
29  % mitgeschrieben um die Funktion part_of_domain zu ermöglichen
30  % Diese ist Teil der Traingssetverfeinerung
31 
32  function tree_out = hRB(tree_in)
33 
34  % start with greedy und basisgenerierung
35  tree_in.model.training = [tree_in.anchor,tree_in.model.training];
36  tree_in.detailed_data = gen_detailed_data(tree_in.model, model_data);
37 
38 
39  % Wegen error < errtol
40  if tree_in.detailed_data.RB_info.stopped_on_Nmax == 0
41  % error<errtol dann Passt alles
42 
43  % Basis und parameter speichern
44  tree_in.parameters = tree_in.detailed_data.RB_info.mu_sequence(:,2:end);
45  tree_in.reduced_data = gen_reduced_data(hp_model.base_model,tree_in.detailed_data);
46  tree_out = tree_in;
47  % Basisgenerierung für Gebiet Abgeschlossen
48  disp('--NO SPLIT--');
49 
50  else
51  % Falls error>errortol -> splitten!
52  disp('--SPLIT--');
53 
54  % Erzeuge neue Blätter
55  child_right = leaf();
56  child_left = leaf();
57  % Vererbung von Eigeschaften
58  child_right.model = tree_in.model;
59  child_left.model = tree_in.model;
60 
61 
62  % Linker Zweig Erbt den Anker vom Elternzweig
63  child_left.anchor = tree_in.anchor;
64  % Rechte Zweig enthält den ersten neuen greedygefundenen Parameter
65  for i=3:child_left.model.RB_train_size
66  if ~isequal(child_left.anchor,tree_in.detailed_data.RB_info.mu_sequence(:,i))
67  child_right.anchor = tree_in.detailed_data.RB_info.mu_sequence(:,i);
68  break;
69  end
70  end;
71 
72  % Anker als ersten (wichtig) Eintrag in das neue Trainingsset
73  % einfügen
74  child_right.model.training = child_right.anchor;
75  child_left.model.training = child_left.anchor;
76 
77 
78 
79 
80  % Aufteilen des Elterntrainigsset auf die Kinder
81  % hier kommt die d-Funktion zum einsatz
82  leng = length(tree_in.model.training(1,:));
83 
84  for i = 1:leng
85  if ~isequal(tree_in.model.training(:,i),child_right.anchor) && ~isequal(tree_in.model.training(:,i),child_left.anchor)
86  distance_l=hp_model.distance_function(child_left.model,child_left.anchor,tree_in.model.training(:,i));
87  distance_r=hp_model.distance_function(child_right.model,child_right.anchor,tree_in.model.training(:,i)) ;
88  % Aufteilen
89  if distance_l<distance_r
90  child_left.model.training = [child_left.model.training, tree_in.model.training(:,i)];
91  else
92  child_right.model.training = [child_right.model.training, tree_in.model.training(:,i)];
93  end;
94  end;
95  end;
96 
97  % Protrkolliert die Änderungen in dem kleinen Baum mit.
98  littletree=change_littletree(littletree,tree_in.anchor,child_right.anchor);
99 
100  % Trainingsset verfeinern
101  % mittels accept-reject Monte Carlo
102 
103  %LEFT!
104  %boundarybox erstellen:
105  switch hp_model.trainingset_generation_mode
106  case 'boundary_box'
107  %boundarybox erstellen:
108  param_min = min(child_left.model.training');
109  param_max = max(child_left.model.training');
110  l = max(param_max-param_min);
111  t = size(child_left.model.training);
112  if isempty(l) || min(l) == 0 || t(2) <= 1
113  box_ranges = child_left.model.mu_ranges;
114  else
115 
116  param_max=param_max+max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
117  param_min=param_min-max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
118  box_ranges = cell2mat(child_left.model.mu_ranges')';
119 
120  %Box:
121  param_min = max([param_min;box_ranges(1,:)]);
122  param_max = min([param_max;box_ranges(2,:)]);
123 
124  box_ranges = mat2cell([param_min;param_max]',ones(1,length(param_min)));
125  end;
126 
127 
128  case 'mu_ranges'
129  box_ranges = child_left.model.mu_ranges;
130  otherwise
131  box_ranges = child_left.model.mu_ranges;
132  end;
133 
134 
135 
136  while length(child_left.model.training) < child_left.model.RB_train_size
137 
138  parameter = rand_uniform(1,box_ranges);
139  if part_of_domain(littletree,child_left.anchor,parameter,child_left.model)==1
140  child_left.model.training = [child_left.model.training,parameter ];
141  end;
142 
143  end;
144 
145  %RIGHT!
146  %boundarybox erstellen:
147  switch hp_model.trainingset_generation_mode
148  case 'boundary_box'
149  %boundarybox erstellen:
150  param_min = min(child_right.model.training');
151  param_max = max(child_right.model.training');
152  l = max(param_max-param_min);
153  t=size(child_right.model.training);
154  if isempty(l) || min(l) == 0 || t(2) <= 1
155  box_ranges = child_right.model.mu_ranges;
156  else
157 
158  param_max=param_max+max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
159  param_min=param_min-max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
160  box_ranges = cell2mat(child_right.model.mu_ranges')';
161 
162  %Box:
163  param_min = max([param_min;box_ranges(1,:)]);
164  param_max = min([param_max;box_ranges(2,:)]);
165 
166  box_ranges = mat2cell([param_min;param_max]',ones(1,length(param_min)));
167 
168  end;
169 
170 
171 
172  case 'mu_ranges'
173  box_ranges = child_left.model.mu_ranges;
174  otherwise
175  box_ranges = child_left.model.mu_ranges;
176 
177  end;
178 
179 
180 
181  while length(child_right.model.training) < child_right.model.RB_train_size
182 
183  parameter = rand_uniform(1,box_ranges);
184  if part_of_domain(littletree,child_right.anchor,parameter,child_right.model)==1
185  child_right.model.training = [child_right.model.training,parameter ];
186  end;
187 
188  end;
189 
190 
191 
192  % Alter Algorithmus zur generierung des Traingssets
193  % Sehr schnell aber nicht optimal in der gleichverteilung
194 
195  % Traingsset verfeinern durch zufälige Punkte im Dreieck aus
196  % zufälligen Eckpunkten
197  % Nicht Optimal!!!
198 %
199 % size_left = length(child_left.model.training(1,:));
200 % size_right = length(child_right.model.training(1,:));
201 % for i=1:(child_left.model.RB_train_size-size_left)
202 % % Zufällige Eckpunkte
203 % rand1 = randi(size_left+i-1,1);
204 % rand2 = randi(size_left+i-1,1);
205 % rand3 = randi(size_left+i-1,1);
206 %
207 % rand4 = rand(1);
208 % rand5 = rand(1)*(1-rand4);
209 % % Neuer Punkt
210 % newpoint = child_left.model.training(:,rand1) + rand4*(child_left.model.training(:,rand2)-child_left.model.training(:,rand1))+rand5*(child_left.model.training(:,rand3)-child_left.model.training(:,rand1));
211 % child_left.model.training = [child_left.model.training,newpoint ];
212 % end;
213 %
214 % for i=1:(child_right.model.RB_train_size-size_right)
215 % % Zufällige Eckpunkte
216 % rand1 = randi(size_right+i-1,1);
217 % rand2 = randi(size_right+i-1,1);
218 % rand3 = randi(size_right+i-1,1);
219 %
220 % rand4 = rand(1);
221 % rand5 = rand(1)*(1-rand4);
222 % % Neuer Punkt
223 % newpoint = child_right.model.training(:,rand1) + rand4*(child_right.model.training(:,rand2)-child_right.model.training(:,rand1))+rand5*(child_right.model.training(:,rand3)-child_right.model.training(:,rand1));
224 % child_right.model.training = [child_right.model.training,newpoint ];
225 % end;
226 
227  child_left.training = child_left.model.training;
228  child_right.training = child_right.model.training;
229 
230  % Rekrusiver Aufruf der neuen Einträge
231  % mit Cells wird ein Baum erzeugt.
232  tree_out={hRB(child_left),hRB(child_right)};
233  end;
234  end
235 
236 
237  %Aktuallisiert die Änderungen bei dem Baume mit der Ankerstruktur
238  function tree_out = change_littletree(tree_in,para_expand,para_add)
239  t= iscell(tree_in);
240  if t==1
241  tree_in{1} = change_littletree(tree_in{1},para_expand,para_add);
242  tree_in{2} = change_littletree(tree_in{2},para_expand,para_add);
243  tree_out = tree_in;
244  else
245  if isequal(tree_in,para_expand)
246  tree_out = {tree_in,para_add};
247  else
248  tree_out = tree_in;
249  end;
250 
251 
252  end;
253  end
254 
255  function is = part_of_domain(ltree, anchor,param,model)
256  test = iscell(ltree);
257  %Navigation
258  if test ==1
259  % Representanten bestimmen
260  first_l=littletree_first(ltree{1});
261  first_r=littletree_first(ltree{2});
262  % Mit d-Funktion naviagtion durchführen
263  distance_l = model.distance_function(model,first_l,param);%norm(first_l-param,2);
264  distance_r = model.distance_function(model, first_r,param);%norm(first_r-param,2);
265  % Unterbaum finden und Rekursiv vortfahren
266  if distance_l<distance_r
267  is = part_of_domain(ltree{1}, anchor,param,model);
268  else
269  is = part_of_domain(ltree{2}, anchor,param,model);
270  end;
271  else
272  % im passenden Gebiet angekommen - RB Simulation durchführen
273 
274  if isequal(ltree,anchor)
275  is = 1;
276  else
277  is = 0;
278  end;
279  end;
280 
281 
282  end
283 
284  function value= littletree_first (test)
285  t= iscell(test);
286  if t==1
287  value=littletree_first(test{1});
288  else
289  value=test;
290  end;
291 
292  end
293 
294 
295 
296 
297 
298 
299 end
300