root/library/bdm/estim/arx_straux.cpp @ 684

Revision 684, 27.5 kB (checked in by sarka, 15 years ago)

function straux1 converted from straux1.m

Line 
1
2
3#include <limits>
4#include "arx.h"
5
6
7#include <fstream>
8#include<iostream>
9#include<iomanip>
10
11namespace bdm {
12
13 
14
15       
16/*     
17struct str_aux {
18        vec d0;
19        double nu0;
20        mat L0;
21        mat L;
22        vec d;
23        double nu;
24        ivec strL;                 // Current structure of L and d
25        ivec strRgr;               // Structure elements currently inside regressor (after regressand)
26        ivec strMis;               // structure elements, that are currently outside regressor (before regressand)
27        int posit1;                // regressand position
28        int nbits;                                 // number of bits available in double
29        bvec bitstr;
30        double loglik;          // loglikelihood
31  };
32 
33 */
34
35 
36 /* bvec str_bitset( bvec in,ivec ns,int nbits){
37      //int index, bitindex,n;
38          bvec out = in;
39          int n;
40         
41         for (int i = 0; i < ns.length(); i++){
42          n = ns(i);
43          out(n-2) = 1;
44          cout << out;
45         
46         }
47       
48        return out;
49 
50  }*/
51 
52 
53  void str_bitset( bvec &out,ivec ns,int nbits){
54     for (int i = 0; i < ns.length(); i++){
55          out(ns(i)-2) = 1;
56         }
57}
58
59
60
61
62
63
64double seloglik1(str_aux in){
65// This is the loglikelihood (non-constant part) - this should be used in
66// frequent computation
67   int len = length(in.d);
68   int p1  = in.posit1 - 1;
69   
70   double i1 = -0.5*in.nu *log(in.d(p1)) -0.5*sum(log(in.d.right(len - p1 -1)));
71   double i0 = -0.5*in.nu0*log(in.d0(p1)) -0.5*sum(log(in.d0.right(len - p1 -1)));   
72   return i1-i0;
73 //DEBUGGing print:
74 //fprintf('SELOGLIK1: str=%s loglik=%g\n', strPrintstr(in), l);*/
75 
76  }
77
78
79void sedydr(mat &r,mat &f,double &Dr,double &Df,int R/*,int jl,int jh ,mat &rout, mat &fout, double &Drout, double &Dfoutint &kr*/){
80/*SEDYDR dyadic reduction, performs transformation of sum of 2 dyads
81%
82% [rout, fout, Drout, Dfout, kr] = sedydr(r,f,Dr,Df,R,jl,jh);
83% [rout, fout, Drout, Dfout] = sedydr(r,f,Dr,Df,R);
84%
85% Description: dyadic reduction, performs transformation of sum of
86%  2 dyads r*Dr*r'+ f*Df*f' so that the element of r pointed by R is zeroed
87%
88%     r    : column vector of reduced dyad
89%     f    : column vector of reducing dyad
90%     Dr   : scalar with weight of reduced dyad
91%     Df   : scalar with weight of reducing dyad
92%     R    : scalar number giving 1 based index to the element of r,
93%            which is to be reduced to
94%            zero; the corresponding element of f is assumed to be 1.
95%     jl   : lower index of the range within which the dyads are
96%            modified (can be omitted, then everything is updated)
97%     jh   : upper index of the range within which the dyads are
98%            modified (can be omitted then everything is updated)
99%     rout,fout,Drout,dfout : resulting two dyads
100%     kr   : coefficient used in the transformation of r
101%            rnew = r + kr*f
102%
103% Description: dyadic reduction, performs transformation of sum of
104%            2 dyads r*Dr*r'+ f*Df*f' so that the element of r indexed by R is zeroed
105% Remark1: Constant mzero means machine zero and should be modified
106%           according to the precision of particular machine
107% Remark2: jl and jh are, in fact, obsolete. It takes longer time to
108%           compute them compared to plain version. The reason is that we
109%           are doing vector operations in m-file. Other reason is that
110%           we need to copy whole vector anyway. It can save half of time for
111%           c-file, if you use it correctly. (please do tests)
112%
113% Note: naming:
114%       se = structure estimation
115%       dydr = dyadic reduction
116%
117% Original Fortran design: V. Peterka 17-7-89
118% Modified for c-language: probably R. Kulhavy
119% Modified for m-language: L. Tesar 2/2003
120% Updated: Feb 2003
121% Project: post-ProDaCTool
122% Reference: none*/
123   
124/*if nargin<6;
125   update_whole=1;
126else
127   update_whole=0;
128end;*/
129 
130double mzero = 1e-32;
131 
132if (Dr<mzero){
133   Dr=0;
134}
135 
136double r0   = r(R,0);
137double kD   = Df;
138double kr   = r0 * Dr;
139
140
141Df   = kD + r0 * kr;
142 
143if (Df > mzero){
144    kD = kD / Df;
145    kr = kr / Df;
146}else{
147    kD = 1;
148    kr = 0;
149}
150 
151Dr = Dr * kD;
152 
153// Try to uncomment marked stuff (*) if in numerical problems, but I don't
154// think it can make any difference for normal healthy floating-point unit
155//if update_whole;
156   r = r - r0*f;
157//   rout(R) = 0;   // * could be needed for some nonsense cases(or numeric reasons?), normally not
158   f = f + kr*r;
159//   fout(R) = 1;   // * could be needed for some nonsense cases(or numeric reasons?), normally not
160/*else; 
161   rout = r;
162   fout = f;
163   rout(jl:jh) = r(jl:jh) - r0 * f(jl:jh);
164   rout(R) = 0;   
165   fout(jl:jh) = f(jl:jh) + kr * rout(jl:jh);
166end;*/
167  }
168
169
170 
171 /*mat*/ void seswapudl(mat &L, vec &d , int i/*, vec &dout*/){
172/*%SESWAPUDL swaps information matrix in decomposition V=L^T diag(d) L
173%
174%   [Lout, dout] = seswapudl(L,d,i);
175%
176% L : lower triangular matrix with 1's on diagonal of the decomposistion
177% d : diagonal vector of diagonal matrix of the decomposition
178% i : index of line to be swapped with the next one
179% Lout : output lower triangular matrix
180% dout : output diagional vector of diagonal matrix D
181%
182% Description:
183%  Lout' * diag(dout) * Lout = P(i,i+1) * L' * diag(d) * L * P(i,i+1);
184%
185%  Where permutation matrix P(i,j) permutates columns if applied from the
186%  right and line if applied from the left.
187%   
188% Note: naming:
189%       se = structure estimation
190%       lite = light, simple
191%       udl = U*D*L, or more precisely, L'*D*L, also called as ld
192%   
193% Design  : L. Tesar
194% Updated : Feb 2003
195% Project : post-ProDaCTool
196% Reference: sedydr*/
197 
198int j = i+1;
199 
200double pomd = d(i);
201d(i) = d(j);
202d(j) = pomd;
203 
204/*vec pomL   = L.get_row(i);
205L.set_row(i, L.get_row(j));   
206L.set_row(j,pomL);*/
207 
208L.swap_rows(i,j);
209L.swap_cols(i,j);
210
211/*pomL   = L.get_col(i);
212L.set_col(i, L.get_col(j));
213L.set_col(j,pomL);*/
214 
215//% We must be working with LINES of matrix L !
216 
217
218
219mat r = L.get_row(i);
220r = r.transpose();
221r = r.transpose();
222//????????????????
223mat f = L.get_row(j);
224f = f.transpose();
225f = f.transpose();
226
227
228
229
230double Dr = d(i);
231double Df = d(j);
232 
233sedydr(r, f, Dr, Df, j);
234 
235
236
237double r0 = r(i,0);
238Dr = Dr*r0*r0;
239= r/r0;
240
241
242
243mat pom_mat = r.transpose();
244L.set_row(i, pom_mat.get_row(0)); 
245pom_mat = f.transpose();
246L.set_row(j, pom_mat.get_row(0)); 
247
248d(i)   = Dr;
249d(j)   = Df;
250 
251L(i,i) = 1;
252L(j,j) = 1;
253 
254 
255  }
256 
257
258 void str_bitres(bvec &out,ivec ns,int nbits){
259   
260       
261        for (int i = 0; i < ns.length(); i++){
262          out(ns(i)-2) = 0;
263   }
264     
265 
266  }
267 
268str_aux sestrremove(str_aux in,ivec removed_elements){
269//% Removes elements from regressor
270   int n_strL = length(in.strL);
271    str_aux out = in;
272   for (int i = 0; i < removed_elements.length();i++){
273           
274          int f = removed_elements(i);
275          int posit1 = (find(out.strL==1))(0); 
276      int positf = (find(out.strL==f))(0);
277          int pom_strL;
278          for (int g = positf-1; g >posit1 -1; g--) {   
279             //% BEGIN: We are swapping g and g+1 NOW!!!!
280         seswapudl(out.L, out.d, g);
281         seswapudl(out.L0, out.d0, g);
282       
283                 pom_strL = out.strL(g);
284                 out.strL(g)= out.strL(g+1);
285                 out.strL(g+1) = pom_strL;
286                         
287                 //% END
288              }
289   }
290   out.posit1 = (find(out.strL==1))(0)+1;
291   out.strRgr = out.strL.right(n_strL - out.posit1);
292   out.strMis = out.strL.left(out.posit1-1);
293   str_bitres(out.bitstr,removed_elements,out.nbits);
294   out.loglik = seloglik1(out);
295 
296  return out;
297  }
298 
299
300  ivec setdiff(ivec a, ivec b){
301    ivec pos;
302         
303        for (int i = 0; i < b.length(); i++){
304        pos = find(a==b(i));
305                for (int j = 0; j < pos.length(); j++){
306        a.del(pos(j)-j);
307                }
308        }
309  return a;
310  }
311
312
313 
314/*
315 
316  Array<str_aux> add_new(Array<str_aux> global_best,str_aux newone,int nbest){
317// Eventually add to global best, but do not go over nbest values
318// Also avoids repeating things, which makes this function awfully slow
319         
320          Array<str_aux> global_best_out;
321          if (global_best.length() >= nbest){
322      //logliks = [global_best.loglik];
323     
324          vec logliks(1);
325          logliks(0) =  global_best(0).loglik;
326          for (int j = 1; j < global_best.length(); j++)
327          logliks = concat(logliks, global_best(j).loglik);
328         
329          int i, addit;
330          double loglik = min(logliks, i);
331      global_best_out = global_best;
332          if (loglik < newone.loglik){
333         //         if ~any(logliks == new.loglik);
334          addit=1;
335                 
336                 
337         
338                  if (newone.bitstr.length() == 1) {
339          for (int j = 0; j < global_best.length(); j++){
340                  for(int i = 0; i < global_best(j).bitstr.length(); i++){
341
342                          if (newone.bitstr(0) == global_best(j).bitstr(i)){
343               addit = 0;
344               break;
345                          }
346                          }   
347          }   
348                  }
349                 if (addit){
350            global_best_out(i) = newone;
351            // DEBUGging print:
352            // fprintf('ADDED structure, add_new: %s, loglik=%g\n', strPrintstr(new), new.loglik);
353             }       
354         } 
355}
356   else
357       global_best_out = concat(global_best, newone);
358
359  return global_best_out;
360 
361  }
362 
363*/
364   
365void add_new(Array<str_aux> &global_best,str_aux newone,int nbest){
366// Eventually add to global best, but do not go over nbest values
367// Also avoids repeating things, which makes this function awfully slow
368         
369          int  addit, i = 0;
370if (global_best.length() >= nbest){
371      //logliks = [global_best.loglik];
372     
373         
374          for (int j = 1; j < global_best.length(); j++){
375                          if (global_best(j).loglik < global_best(i).loglik) {
376                                   i = j;
377                          }
378                  }
379         
380          if (global_best(i).loglik < newone.loglik){
381         //         if ~any(logliks == new.loglik);
382          addit=1;
383                 
384                 
385         //????????????????????????????????????????????
386        if (newone.bitstr.length() == 1) {
387          for (int j = 0; j < global_best.length(); j++){
388                  for(int i = 0; i < global_best(j).bitstr.length(); i++){
389
390                          if (newone.bitstr(0) == global_best(j).bitstr(i)){
391               addit = 0;
392               break;
393                          }
394                }   
395          }   
396        }
397                 
398                 
399                //????????????????????????????????????????????????? 
400                 
401                  if (addit){
402            global_best(i) = newone;
403            // DEBUGging print:
404            // fprintf('ADDED structure, add_new: %s, loglik=%g\n', strPrintstr(new), new.loglik);
405                  }       
406         } 
407}
408   else
409       global_best = concat(global_best, newone);
410
411}
412   
413 
414 
415 
416 
417 
418  str_aux sestrinsert(str_aux in,ivec inserted_elements){
419// Moves elements into regressor
420   int n_strL = in.strL.length();
421   str_aux out = in;
422   for (int j = 0;j < inserted_elements.length(); j++){
423      int f = inserted_elements(j);
424      int posit1 = (find(out.strL==1))(0);
425      int positf = (find(out.strL==f))(0);
426          for (int g = positf; g <= posit1-1; g++ ){
427                 
428          // BEGIN: We are swapping g and g+1 NOW!!!!
429          seswapudl(out.L,  out.d,  g);
430          seswapudl(out.L0, out.d0, g);
431         
432         
433                  int pom_strL = out.strL(g);
434                 out.strL(g)= out.strL(g+1);
435                 out.strL(g+1) = pom_strL;
436                 
437                  // END
438          }
439   }         
440
441    out.posit1 = (find(out.strL==1))(0)+1;
442   out.strRgr = out.strL.right(n_strL - out.posit1);
443   out.strMis = out.strL.left(out.posit1-1);
444   str_bitset(out.bitstr,inserted_elements,out.nbits);
445   
446   out.loglik = seloglik1(out);
447   
448   
449   
450   return out;
451 
452  }
453 
454  double seloglik2(str_aux in){
455// This is the loglikelihood (constant part) - this should be added to
456// everything at the end. It needs some computation, so it is useless to
457// make it for all the stuff
458   double logpi = log(pi);
459 
460   double i1 = lgamma(in.nu /2) - 0.5*in.nu *logpi;
461   double i0 = lgamma(in.nu0/2) - 0.5*in.nu0*logpi;
462   return i1-i0;
463  }
464
465 
466
467 
468  ivec straux1(ldmat Ld, double nu, ldmat Ld0, double nu0, ivec belief, int nbest, int max_nrep, double lambda, int order_k, Array<str_aux> &rgrsout/*, stat &statistics*/){
469// see utia_legacy/ticket_12/ implementation and str_test.m
470
471const mat &L = Ld._L();
472const vec &d = Ld._D();
473
474const mat &L0 = Ld0._L();
475const vec &d0 = Ld0._D();
476
477int n_data = d.length();
478
479ivec belief_out = find(belief==4)+2; // we are avoiding to put this into regressor
480ivec belief_in  = find(belief==1)+2; // we are instantly keeping this in regressor
481
482
483str_aux full;
484
485full.d0  = d0;
486full.nu0 = nu0;
487full.L0  = L0;
488full.L   = L;
489full.d   = d;
490
491
492
493/*full.d0  = "0.012360650875200       0.975779169502626        1.209840558439000";
494         
495full.L0  = "1.0000         0         0;"
496           "0.999427690134298    1.0000         0;"
497           "0.546994424043659   0.534335486953833    1.0000";
498
499
500full.L   = "1.0000         0         0;"
501           "0.364376353850780    1.0000         0;"
502           "1.222141096674815   1.286534510946323    1.0000";
503
504full.d   =  "0.001610356837691          3.497566869589465       3.236640487818002";
505*/
506
507fstream F;
508
509
510
511
512F.open("soubor3.txt", ios::in);
513F << setiosflags(ios::scientific);
514F << setprecision(16);
515F.flags(0x1);
516
517
518for (int i = 0; i < n_data ; i++){
519F >> full.d0(i);
520}
521
522
523
524for (int i =0; i < n_data; i++){
525        for (int j = 0 ; j < n_data  ; j++){
526F >> full.L0(j,i);
527}
528}
529
530for (int i = 0; i < n_data ; i++){
531F >> full.d(i);
532}
533
534
535for (int i =0; i < n_data; i++){
536        for (int j = 0 ; j < n_data  ; j++){
537F >> full.L(j,i);
538}
539}
540
541
542full.nu0 = nu0;
543full.nu  = nu;
544full.strL = linspace(1,n_data);
545full.strRgr = linspace(2,n_data);
546full.strMis = ivec(0);                     
547full.posit1 = 1;
548full.bitstr.set_size(n_data-1);
549full.bitstr.clear();
550str_bitset(full.bitstr,full.strRgr,full.nbits);
551//full.nbits  = std::numeric_lim its<double>::digits-1;  // number of bits available in double
552/*bvec in(n_data-1);
553in.clear();
554full.bitstr = str_bitset(in,full.strRgr,full.nbits);*/
555
556
557
558
559full.loglik = seloglik1(full);       // % loglikelihood
560   
561
562
563
564
565//% construct full and empty structure
566full = sestrremove(full,belief_out);
567str_aux empty = sestrremove(full,setdiff(full.strRgr,belief_in));
568 
569//% stopping rule calculation:
570
571
572
573
574bmat local_max(0,0);
575int to, muto = 0;
576 
577//% statistics:
578//double cputime0 = cputime; ??????????????????????????????????????????????????????????????
579//if nargout>=3;
580   
581 CPU_Timer timer;
582 timer.start(); 
583 
584   ivec mutos(max_nrep+2);
585   vec maxmutos(max_nrep+2);
586   mutos.zeros();
587   maxmutos.zeros();
588
589
590//end;
591//% ----------------------
592 
593//% For stopping-rule calculation
594//%so       = 2^(n_data -1-length(belief_in)- length(belief_out)); % do we use this ?
595//% ----------------------
596 
597ivec all_str = linspace(1,n_data);
598 
599Array<str_aux> global_best(1);
600global_best(0) = full;
601
602
603//% MAIN LOOP is here.
604
605str_aux   best;
606for (int n_start = -1; n_start <= max_nrep; n_start++){
607   str_aux  last,best;
608   
609   to = n_start+2;
610   
611   if (n_start == -1){
612      //% start from the full structure
613      last = full;
614   }
615   else {if (n_start == 0)
616      //% start from the empty structure
617      last = empty;     
618       
619      else{
620      //% start from random structure   
621                 
622                ivec last_str = find(to_bvec<int>(::concat<int>(0,floor_i(2*randu(n_data-1)))));// this creates random vector consisting of indexes, and sorted
623                last = sestrremove(full,setdiff(all_str,::concat<int>(::concat<int>(1 ,last_str), empty.strRgr)));
624     
625          }
626   }
627   //% DEBUGging print:
628   //%fprintf('STRUCTURE generated            in loop %2i was %s\n', n_start, strPrintstr(last));
629   
630   //% The loop is repeated until likelihood stops growing (break condition
631   //% used at the end;
632 
633   
634   while (1){
635      //% This structure is going to hold the best elements
636      best = last;
637      //% Nesting by removing elements (enpoorment)
638      ivec  removed_items = setdiff(last.strRgr,belief_in);
639         
640ivec removed_item;
641          str_aux newone;
642         
643          for (int i = 0; i < removed_items.length(); i++){
644        removed_item = vec_1(removed_items(i));
645            newone = sestrremove(last,removed_item);//?????????????????????????????
646                if (nbest>1){
647          add_new(global_best,newone,nbest);
648                }
649                if (newone.loglik>best.loglik){
650           best = newone;
651                }
652          }
653      //% Nesting by adding elements (enrichment)
654      ivec added_items = setdiff(last.strMis,belief_out);
655          ivec added_item;
656         
657          for (int j = 0; j < added_items.length(); j++){
658        added_item = vec_1(added_items(j));
659            newone = sestrinsert(last,added_item);
660                if (nbest>1){
661           add_new(global_best,newone,nbest);
662                }
663                if (newone.loglik>best.loglik){
664           best = newone;
665                }
666     }
667
668   
669
670   
671
672      //% Break condition if likelihood does not change.
673      if (best.loglik <= last.loglik)
674          break;
675      else
676          //% Making best structure last structure.
677          last = best;
678     
679   
680   }
681 
682
683 
684
685
686   // % DEBUGging print:
687   //%fprintf('STRUCTURE found (local maxima) in loop %2i was %s randun_seed=%11lu randun_counter=%4lu\n', n_start, strPrintstr(best), randn('seed'), RANDUN_COUNTER);
688   
689   //% Collecting of the best structure in case we don't need the second parameter
690   if (nbest<=1){
691           if (best.loglik > global_best(0).loglik){
692         global_best = best;
693   }
694   }
695 
696   //% uniqueness of the structure found
697   int append = 1;
698   
699
700   for(int j = 0; j  < local_max.rows() ; j++){
701           if (best.bitstr == local_max.get_row(j)){
702         append = 0;
703                 break;
704           }
705   }
706
707   
708   if (append){
709      local_max.append_row(best.bitstr);
710      muto = muto + 1;
711   } 
712   
713   //% stopping rule:
714   double maxmuto = (to-order_k-1)/lambda-to+1;
715   if (to>2){
716           if (maxmuto>=muto){
717          //% fprintf('*');
718          break;
719           }
720   }     
721 
722   // do statistics if necessary:
723   //if (nargout>=3){
724      mutos(to-1)    = muto;
725      maxmutos(to-1) = maxmuto;
726   //}
727}
728 
729//% Aftermath: The best structure was in: global_best
730 
731//% Updating loglikelihoods: we have to add the constant stuff
732
733
734
735for (int f=0 ; f <global_best.length(); f++){
736   global_best(f).loglik = global_best(f).loglik + seloglik2(global_best(f));
737}
738 
739/*for f=1:length(global_best);
740   global_best(f).loglik = global_best(f).loglik + seloglik2(global_best(f));
741end;*/
742
743
744//% Making first output parameter:
745
746int max_i = 0;
747for (int j = 1; j < global_best.length(); j++)
748  if  (global_best(max_i).loglik < (global_best(j).loglik)) max_i = j;
749
750best = global_best(max_i);
751cout << endl << endl << endl << endl << best.strRgr;
752cout << endl << endl << endl << endl << best.strRgr; 
753//% Making the second output parameter
754
755vec logliks(global_best.length());
756for (int j = 0; j < logliks.length(); j++)
757 logliks(j) = global_best(j).loglik;
758
759ivec i = sort_index(logliks);
760rgrsout.set_length(global_best.length());
761
762for (int j = global_best.length() - 1; j >= 0; j--)
763rgrsout(j) = global_best(i(j));
764 
765//if (nargout>=3);
766   
767   
768str_statistics statistics;
769
770   statistics.allstrs = 2^(n_data -1-length(belief_in) - length(belief_out));
771   statistics.nrand   = to-2;
772   statistics.unique  = muto;
773   statistics.to  = to;
774   statistics.cputime_seconds = timer.get_time();
775   statistics.itemspeed       = statistics.to / statistics.cputime_seconds;
776   statistics.muto = muto;
777   statistics.mutos = mutos;
778   statistics.maxmutos = maxmutos;
779//end;
780
781return best.strRgr;
782
783} 
784
785#ifdef LADIM
786//% randun seed stuff:
787//%randn('seed',SEED);
788 
789//% --------------------- END of MAIN program --------------------
790 
791% This is needed for bitstr manipulations
792/*function out = str_bitset(in,ns,nbits)
793   out = in;
794   for n = ns;
795      index = 1+floor((n-2)/nbits);
796      bitindex = 1+rem(n-2,nbits);
797      out(index) = bitset(out(index),bitindex);
798   end; 
799function out = str_bitres(in,ns,nbits)
800   out = in;
801   for n = ns;
802      index = 1+floor((n-2)/nbits);
803      bitindex = 1+rem(n-2,nbits);
804      mask = bitset(0,bitindex);
805      out(index) = bitxor(bitor(out(index),mask),mask);
806   end;*/
807 
808function out = strPrintstr(in)
809   out = '0';
810   nbits = in.nbits;
811   for f = 2:length(in.d0);
812      index = 1+floor((f-2)/nbits);
813      bitindex = 1+rem(f-2,nbits);
814      if bitget(in.bitstr(index),bitindex);
815          out(f) = '1';
816      else;
817          out(f) = '0';
818      end;
819   end;
820 
821/*function global_best_out = add_new(global_best,new,nbest)
822% Eventually add to global best, but do not go over nbest values
823% Also avoids repeating things, which makes this function awfully slow
824   if length(global_best)>=nbest;
825      logliks = [global_best.loglik];
826      [loglik i] = min(logliks);
827      global_best_out = global_best;
828      if loglik<new.loglik;
829         %         if ~any(logliks == new.loglik);
830         addit=1;
831         for f = [global_best.bitstr];
832            if f == new.bitstr;
833               addit = 0;
834               break;
835            end;
836         end;         
837         if addit;
838            global_best_out(i) = new;
839            % DEBUGging print:
840            % fprintf('ADDED structure, add_new: %s, loglik=%g\n', strPrintstr(new), new.loglik);
841         end;         
842      end;
843   else;
844      global_best_out = [global_best new];
845   end;*/
846 
847/*function out = sestrremove(in,removed_elements);
848% Removes elements from regressor
849   n_strL = length(in.strL);
850   out = in;
851   for f=removed_elements;
852      posit1 = find(out.strL==1);
853      positf = find(out.strL==f);
854      for g=(positf-1):-1:posit1;
855         % BEGIN: We are swapping g and g+1 NOW!!!!
856         [out.L, out.d]   = seswapudl(out.L, out.d, g);
857         [out.L0, out.d0]   = seswapudl(out.L0, out.d0, g);
858         out.strL([g g+1]) = [out.strL(g+1) out.strL(g)];
859         % END
860      end;
861   end;
862   out.posit1 = find(out.strL==1);
863   out.strRgr = out.strL((out.posit1+1):n_strL);
864   out.strMis = out.strL(1:(out.posit1-1));
865   out.bitstr = str_bitres(out.bitstr,removed_elements,out.nbits);
866   out.loglik = seloglik1(out);*/
867   
868/*function out = sestrinsert(in,inserted_elements);
869% Moves elements into regressor
870   n_strL = length(in.strL);
871   out = in;
872   for f=inserted_elements;
873      posit1 = find(out.strL==1);
874      positf = find(out.strL==f);
875      for g=positf:(posit1-1);
876          % BEGIN: We are swapping g and g+1 NOW!!!!
877          [out.L,  out.d]   = seswapudl(out.L,  out.d,  g);
878          [out.L0, out.d0]  = seswapudl(out.L0, out.d0, g);
879          out.strL([g g+1]) = [out.strL(g+1) out.strL(g)];
880          % END
881      end;
882   end;         
883   out.posit1 = find(out.strL==1);
884   out.strRgr = out.strL((out.posit1+1):n_strL);
885   out.strMis = out.strL(1:(out.posit1-1));
886   out.bitstr = str_bitset(out.bitstr,inserted_elements,out.nbits);
887   out.loglik = seloglik1(out);*/
888 
889%
890% seloglik_real = seloglik1 + seloglik2
891%
892 
893/*function l = seloglik1(in)
894% This is the loglikelihood (non-constant part) - this should be used in
895% frequent computation
896   len = length(in.d);
897   p1  = in.posit1;
898     
899   i1 = -0.5*in.nu *log(in.d (p1)) -0.5*sum(log(in.d ((p1+1):len)));
900   i0 = -0.5*in.nu0*log(in.d0(p1)) -0.5*sum(log(in.d0((p1+1):len)));   
901   l  = i1-i0;
902   
903   % DEBUGGing print:
904   % fprintf('SELOGLIK1: str=%s loglik=%g\n', strPrintstr(in), l);*/
905 
906 
907function l = seloglik2(in)
908% This is the loglikelihood (constant part) - this should be added to
909% everything at the end. It needs some computation, so it is useless to
910% make it for all the stuff
911   logpi = log(pi);
912 
913   i1 = gammaln(in.nu /2) - 0.5*in.nu *logpi;
914   i0 = gammaln(in.nu0/2) - 0.5*in.nu0*logpi;
915   l  = i1-i0;
916 
917 
918/*function [Lout, dout] = seswapudl(L,d,i);
919%SESWAPUDL swaps information matrix in decomposition V=L^T diag(d) L
920%
921%  [Lout, dout] = seswapudl(L,d,i);
922%
923% L : lower triangular matrix with 1's on diagonal of the decomposistion
924% d : diagonal vector of diagonal matrix of the decomposition
925% i : index of line to be swapped with the next one
926% Lout : output lower triangular matrix
927% dout : output diagional vector of diagonal matrix D
928%
929% Description:
930%  Lout' * diag(dout) * Lout = P(i,i+1) * L' * diag(d) * L * P(i,i+1);
931%
932%  Where permutation matrix P(i,j) permutates columns if applied from the
933%  right and line if applied from the left.
934%   
935% Note: naming:
936%       se = structure estimation
937%       lite = light, simple
938%       udl = U*D*L, or more precisely, L'*D*L, also called as ld
939%   
940% Design  : L. Tesar
941% Updated : Feb 2003
942% Project : post-ProDaCTool
943% Reference: sedydr
944   
945j = i+1;
946 
947pomd = d(i);
948d(i) = d(j);
949d(j) = pomd;
950 
951pomL   = L(i,:);
952L(i,:) = L(j,:);
953L(j,:) = pomL;
954 
955pomL   = L(:,i);
956L(:,i) = L(:,j);
957L(:,j) = pomL;
958 
959% We must be working with LINES of matrix L !
960 
961r  = L(i,:)';
962f  = L(j,:)';
963Dr = d(i);
964Df = d(j);
965 
966[r, f, Dr, Df] = sedydr(r, f, Dr, Df, j);
967 
968r0 = r(i);
969Dr = Dr*r0*r0;
970r  = r/r0;
971 
972L(i,:) = r';
973L(j,:) = f';
974d(i)   = Dr;
975d(j)   = Df;
976 
977L(i,i) = 1;
978L(j,j) = 1;
979 
980Lout = L;
981dout = d;*/
982 
983/*function [rout, fout, Drout, Dfout, kr] = sedydr(r,f,Dr,Df,R,jl,jh);
984%SEDYDR dyadic reduction, performs transformation of sum of 2 dyads
985%
986% [rout, fout, Drout, Dfout, kr] = sedydr(r,f,Dr,Df,R,jl,jh);
987% [rout, fout, Drout, Dfout] = sedydr(r,f,Dr,Df,R);
988%
989% Description: dyadic reduction, performs transformation of sum of
990%  2 dyads r*Dr*r'+ f*Df*f' so that the element of r pointed by R is zeroed
991%
992%     r    : column vector of reduced dyad
993%     f    : column vector of reducing dyad
994%     Dr   : scalar with weight of reduced dyad
995%     Df   : scalar with weight of reducing dyad
996%     R    : scalar number giving 1 based index to the element of r,
997%            which is to be reduced to
998%            zero; the corresponding element of f is assumed to be 1.
999%     jl   : lower index of the range within which the dyads are
1000%            modified (can be omitted, then everything is updated)
1001%     jh   : upper index of the range within which the dyads are
1002%            modified (can be omitted then everything is updated)
1003%     rout,fout,Drout,dfout : resulting two dyads
1004%     kr   : coefficient used in the transformation of r
1005%            rnew = r + kr*f
1006%
1007% Description: dyadic reduction, performs transformation of sum of
1008%            2 dyads r*Dr*r'+ f*Df*f' so that the element of r indexed by R is zeroed
1009% Remark1: Constant mzero means machine zero and should be modified
1010%           according to the precision of particular machine
1011% Remark2: jl and jh are, in fact, obsolete. It takes longer time to
1012%           compute them compared to plain version. The reason is that we
1013%           are doing vector operations in m-file. Other reason is that
1014%           we need to copy whole vector anyway. It can save half of time for
1015%           c-file, if you use it correctly. (please do tests)
1016%
1017% Note: naming:
1018%       se = structure estimation
1019%       dydr = dyadic reduction
1020%
1021% Original Fortran design: V. Peterka 17-7-89
1022% Modified for c-language: probably R. Kulhavy
1023% Modified for m-language: L. Tesar 2/2003
1024% Updated: Feb 2003
1025% Project: post-ProDaCTool
1026% Reference: none
1027   
1028if nargin<6;
1029   update_whole=1;
1030else
1031   update_whole=0;
1032end;
1033 
1034mzero = 1e-32;
1035 
1036if Dr<mzero;
1037   Dr=0;
1038end;
1039 
1040r0   = r(R);
1041kD   = Df;
1042kr   = r0 * Dr;
1043Dfout   = kD + r0 * kr;
1044 
1045if Dfout > mzero;
1046    kD = kD / Dfout;
1047    kr = kr / Dfout;
1048else;
1049    kD = 1;
1050    kr = 0;
1051end;
1052 
1053Drout = Dr * kD;
1054 
1055% Try to uncomment marked stuff (*) if in numerical problems, but I don't
1056% think it can make any difference for normal healthy floating-point unit
1057if update_whole;
1058   rout = r - r0*f;
1059%   rout(R) = 0;   % * could be needed for some nonsense cases(or numeric reasons?), normally not
1060   fout = f + kr*rout;
1061%   fout(R) = 1;   % * could be needed for some nonsense cases(or numeric reasons?), normally not
1062else; 
1063   rout = r;
1064   fout = f;
1065   rout(jl:jh) = r(jl:jh) - r0 * f(jl:jh);
1066   rout(R) = 0;   
1067   fout(jl:jh) = f(jl:jh) + kr * rout(jl:jh);
1068end;*/
1069 
1070 
1071 
1072#endif
1073 
1074 
1075}
Note: See TracBrowser for help on using the browser.