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

Revision 661, 27.7 kB (checked in by smidl, 15 years ago)

doc

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
53void 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;
126        else
127           update_whole=0;
128        end;*/
129
130        double mzero = 1e-32;
131
132        if ( Dr < mzero ) {
133                Dr = 0;
134        }
135
136        double r0   = r ( R, 0 );
137        double kD   = Df;
138        double kr   = r0 * Dr;
139
140
141        Df   = kD + r0 * kr;
142
143        if ( Df > mzero ) {
144                kD = kD / Df;
145                kr = kr / Df;
146        } else {
147                kD = 1;
148                kr = 0;
149        }
150
151        Dr = 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);
166        end;*/
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
198        int j = i + 1;
199
200        double pomd = d ( i );
201        d ( i ) = d ( j );
202        d ( j ) = pomd;
203
204        /*vec pomL   = L.get_row(i);
205        L.set_row(i, L.get_row(j));
206        L.set_row(j,pomL);*/
207
208        L.swap_rows ( i, j );
209        L.swap_cols ( i, j );
210
211        /*pomL   = L.get_col(i);
212        L.set_col(i, L.get_col(j));
213        L.set_col(j,pomL);*/
214
215//% We must be working with LINES of matrix L !
216
217
218
219        mat r = L.get_row ( i );
220        r = r.transpose();
221        r = r.transpose();
222//????????????????
223        mat f = L.get_row ( j );
224        f = f.transpose();
225        f = f.transpose();
226
227
228
229
230        double Dr = d ( i );
231        double Df = d ( j );
232
233        sedydr ( r, f, Dr, Df, j );
234
235
236
237        double r0 = r ( i, 0 );
238        Dr = Dr * r0 * r0;
239        r  = r / r0;
240
241
242
243        mat pom_mat = r.transpose();
244        L.set_row ( i, pom_mat.get_row ( 0 ) );
245        pom_mat = f.transpose();
246        L.set_row ( j, pom_mat.get_row ( 0 ) );
247
248        d ( i )   = Dr;
249        d ( j )   = Df;
250
251        L ( i, i ) = 1;
252        L ( j, j ) = 1;
253
254
255}
256
257
258void 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
300ivec 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;
370        if ( 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        } else
408                global_best = concat ( global_best, newone );
409
410}
411
412
413
414
415
416
417str_aux sestrinsert ( str_aux in, ivec inserted_elements ) {
418// Moves elements into regressor
419        int n_strL = in.strL.length();
420        str_aux out = in;
421        for ( int j = 0; j < inserted_elements.length(); j++ ) {
422                int f = inserted_elements ( j );
423                int posit1 = ( find ( out.strL == 1 ) ) ( 0 );
424                int positf = ( find ( out.strL == f ) ) ( 0 );
425                for ( int g = positf; g <= posit1 - 1; g++ ) {
426
427                        // BEGIN: We are swapping g and g+1 NOW!!!!
428                        seswapudl ( out.L,  out.d,  g );
429                        seswapudl ( out.L0, out.d0, g );
430
431
432                        int pom_strL = out.strL ( g );
433                        out.strL ( g ) = out.strL ( g + 1 );
434                        out.strL ( g + 1 ) = pom_strL;
435
436                        // END
437                }
438        }
439
440        out.posit1 = ( find ( out.strL == 1 ) ) ( 0 ) + 1;
441        out.strRgr = out.strL.right ( n_strL - out.posit1 );
442        out.strMis = out.strL.left ( out.posit1 - 1 );
443        str_bitset ( out.bitstr, inserted_elements, out.nbits );
444
445        out.loglik = seloglik1 ( out );
446
447
448
449        return out;
450
451}
452
453double seloglik2 ( str_aux in ) {
454// This is the loglikelihood (constant part) - this should be added to
455// everything at the end. It needs some computation, so it is useless to
456// make it for all the stuff
457        double logpi = log ( pi );
458
459        double i1 = lgamma ( in.nu / 2 ) - 0.5 * in.nu * logpi;
460        double i0 = lgamma ( in.nu0 / 2 ) - 0.5 * in.nu0 * logpi;
461        return i1 - i0;
462}
463
464
465
466
467ivec 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*/ ) {
468// see utia_legacy/ticket_12/ implementation and str_test.m
469
470        const mat &L = Ld._L();
471        const vec &d = Ld._D();
472
473        const mat &L0 = Ld0._L();
474        const vec &d0 = Ld0._D();
475
476        int n_data = d.length();
477
478        ivec belief_out = find ( belief == 4 ) + 2; // we are avoiding to put this into regressor
479        ivec belief_in  = find ( belief == 1 ) + 2; // we are instantly keeping this in regressor
480
481
482        str_aux full;
483
484        full.d0  = d0;
485        full.nu0 = nu0;
486        full.L0  = L0;
487        full.L   = L;
488        full.d   = d;
489
490
491
492        /*full.d0  = "0.012360650875200       0.975779169502626        1.209840558439000";
493
494        full.L0  = "1.0000         0         0;"
495                   "0.999427690134298    1.0000         0;"
496                   "0.546994424043659   0.534335486953833    1.0000";
497
498
499        full.L   = "1.0000         0         0;"
500                   "0.364376353850780    1.0000         0;"
501                   "1.222141096674815   1.286534510946323    1.0000";
502
503        full.d   =  "0.001610356837691          3.497566869589465       3.236640487818002";
504        */
505
506        fstream F;
507
508
509
510
511        F.open ( "soubor3.txt", ios::in );
512        F << setiosflags ( ios::scientific );
513        F << setprecision ( 16 );
514//      F.flags ( 0x1 );
515
516
517        for ( int i = 0; i < n_data ; i++ ) {
518                F >> full.d0 ( i );
519        }
520
521
522
523        for ( int i = 0; i < n_data; i++ ) {
524                for ( int j = 0 ; j < n_data  ; j++ ) {
525                        F >> full.L0 ( j, i );
526                }
527        }
528
529        for ( int i = 0; i < n_data ; i++ ) {
530                F >> full.d ( i );
531        }
532
533
534        for ( int i = 0; i < n_data; i++ ) {
535                for ( int j = 0 ; j < n_data  ; j++ ) {
536                        F >> full.L ( j, i );
537                }
538        }
539
540
541        full.nu0 = nu0;
542        full.nu  = nu;
543        full.strL = linspace ( 1, n_data );
544        full.strRgr = linspace ( 2, n_data );
545        full.strMis = ivec ( 0 );
546        full.posit1 = 1;
547        full.bitstr.set_size ( n_data - 1 );
548        full.bitstr.clear();
549        str_bitset ( full.bitstr, full.strRgr, full.nbits );
550//full.nbits  = std::numeric_lim its<double>::digits-1;  // number of bits available in double
551        /*bvec in(n_data-1);
552        in.clear();
553        full.bitstr = str_bitset(in,full.strRgr,full.nbits);*/
554
555
556
557
558        full.loglik = seloglik1 ( full );    // % loglikelihood
559
560
561
562
563
564//% construct full and empty structure
565        full = sestrremove ( full, belief_out );
566        str_aux empty = sestrremove ( full, setdiff ( full.strRgr, belief_in ) );
567
568//% stopping rule calculation:
569
570
571
572
573        bmat local_max ( 0, 0 );
574        int to, muto = 0;
575
576//% statistics:
577//double cputime0 = cputime;
578//if nargout>=3;
579
580        CPU_Timer timer;
581        timer.start();
582
583        ivec mutos ( max_nrep + 2 );
584        vec maxmutos ( max_nrep + 2 );
585        mutos.zeros();
586        maxmutos.zeros();
587
588
589//end;
590//% ----------------------
591
592//% For stopping-rule calculation
593//%so       = 2^(n_data -1-length(belief_in)- length(belief_out)); % do we use this ?
594//% ----------------------
595
596        ivec all_str = linspace ( 1, n_data );
597
598        Array<str_aux> global_best ( 1 );
599        global_best ( 0 ) = full;
600
601
602//% MAIN LOOP is here.
603
604        str_aux   best;
605        for ( int n_start = -1; n_start <= max_nrep; n_start++ ) {
606                str_aux  last, best;
607
608                to = n_start + 2;
609
610                if ( n_start == -1 ) {
611                        //% start from the full structure
612                        last = full;
613                } else {
614                        if ( n_start == 0 )
615                                //% start from the empty structure
616                                last = empty;
617
618                        else {
619                                //% start from random structure
620
621                                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
622                                last = sestrremove ( full, setdiff ( all_str, ::concat<int> ( ::concat<int> ( 1 , last_str ), empty.strRgr ) ) );
623
624                        }
625                }
626                //% DEBUGging print:
627                //%fprintf('STRUCTURE generated            in loop %2i was %s\n', n_start, strPrintstr(last));
628
629                //% The loop is repeated until likelihood stops growing (break condition
630                //% used at the end;
631
632
633                while ( 1 ) {
634                        //% This structure is going to hold the best elements
635                        best = last;
636                        //% Nesting by removing elements (enpoorment)
637                        ivec  removed_items = setdiff ( last.strRgr, belief_in );
638
639                        ivec removed_item;
640                        str_aux newone;
641
642                        for ( int i = 0; i < removed_items.length(); i++ ) {
643                                removed_item = vec_1 ( removed_items ( i ) );
644                                newone = sestrremove ( last, removed_item );
645                                if ( nbest > 1 ) {
646                                        add_new ( global_best, newone, nbest );
647                                }
648                                if ( newone.loglik > best.loglik ) {
649                                        best = newone;
650                                }
651                        }
652                        //% Nesting by adding elements (enrichment)
653                        ivec added_items = setdiff ( last.strMis, belief_out );
654                        ivec added_item;
655
656                        for ( int j = 0; j < added_items.length(); j++ ) {
657                                added_item = vec_1 ( added_items ( j ) );
658                                newone = sestrinsert ( last, added_item );
659                                if ( nbest > 1 ) {
660                                        add_new ( global_best, newone, nbest );
661                                }
662                                if ( newone.loglik > best.loglik ) {
663                                        best = newone;
664                                }
665                        }
666
667
668
669
670
671                        //% Break condition if likelihood does not change.
672                        if ( best.loglik <= last.loglik )
673                                break;
674                        else
675                                //% Making best structure last structure.
676                                last = best;
677
678
679                }
680
681
682
683
684
685                // % DEBUGging print:
686                //%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);
687
688                //% Collecting of the best structure in case we don't need the second parameter
689                if ( nbest <= 1 ) {
690                        if ( best.loglik > global_best ( 0 ).loglik ) {
691                                global_best = best;
692                        }
693                }
694
695                //% uniqueness of the structure found
696                int append = 1;
697
698
699                for ( int j = 0; j  < local_max.rows() ; j++ ) {
700                        if ( best.bitstr == local_max.get_row ( j ) ) {
701                                append = 0;
702                                break;
703                        }
704                }
705
706
707                if ( append ) {
708                        local_max.append_row ( best.bitstr );
709                        muto = muto + 1;
710                }
711
712                //% stopping rule:
713                double maxmuto = ( to - order_k - 1 ) / lambda - to + 1;
714                if ( to > 2 ) {
715                        if ( maxmuto >= muto ) {
716                                //% fprintf('*');
717                                break;
718                        }
719                }
720
721                // do statistics if necessary:
722                //if (nargout>=3){
723                mutos ( to - 1 )    = muto;
724                maxmutos ( to - 1 ) = maxmuto;
725                //}
726        }
727
728//% Aftermath: The best structure was in: global_best
729
730//% Updating loglikelihoods: we have to add the constant stuff
731
732
733
734        for ( int f = 0 ; f < global_best.length(); f++ ) {
735                global_best ( f ).loglik = global_best ( f ).loglik + seloglik2 ( global_best ( f ) );
736        }
737
738        /*for f=1:length(global_best);
739           global_best(f).loglik = global_best(f).loglik + seloglik2(global_best(f));
740        end;*/
741
742
743//% Making first output parameter:
744
745        int max_i = 0;
746        for ( int j = 1; j < global_best.length(); j++ )
747                if ( global_best ( max_i ).loglik < ( global_best ( j ).loglik ) ) max_i = j;
748
749        best = global_best ( max_i );
750
751//% Making the second output parameter
752
753        vec logliks ( global_best.length() );
754        for ( int j = 0; j < logliks.length(); j++ )
755                logliks ( j ) = global_best ( j ).loglik;
756
757        ivec i = sort_index ( logliks );
758        rgrsout.set_length ( global_best.length() );
759
760        for ( int j = global_best.length() - 1; j >= 0; j-- )
761                rgrsout ( j ) = global_best ( i ( j ) );
762
763//if (nargout>=3);
764
765
766        str_statistics statistics;
767
768        statistics.allstrs = 2 ^ ( n_data - 1 - length ( belief_in ) - length ( belief_out ) );
769        statistics.nrand   = to - 2;
770        statistics.unique  = muto;
771        statistics.to  = to;
772        statistics.cputime_seconds = timer.get_time();
773        statistics.itemspeed       = statistics.to / statistics.cputime_seconds;
774        statistics.muto = muto;
775        statistics.mutos = mutos;
776        statistics.maxmutos = maxmutos;
777//end;
778
779        return best.strRgr;
780
781}
782
783#ifdef LADIM
784//% randun seed stuff:
785//%randn('seed',SEED);
786
787//% --------------------- END of MAIN program --------------------
788
789% This is needed for bitstr manipulations
790/*function out = str_bitset(in,ns,nbits)
791   out = in;
792   for n = ns;
793      index = 1+floor((n-2)/nbits);
794      bitindex = 1+rem(n-2,nbits);
795      out(index) = bitset(out(index),bitindex);
796   end;
797function out = str_bitres(in,ns,nbits)
798   out = in;
799   for n = ns;
800      index = 1+floor((n-2)/nbits);
801      bitindex = 1+rem(n-2,nbits);
802      mask = bitset(0,bitindex);
803      out(index) = bitxor(bitor(out(index),mask),mask);
804   end;*/
805
806function out = strPrintstr ( in )
807                       out = '0';
808nbits = in.nbits;
809for f = 2:
810        length ( in.d0 );
811index = 1 + floor ( ( f - 2 ) / nbits );
812bitindex = 1 + rem ( f - 2, nbits );
813if bitget ( in.bitstr ( index ), bitindex );
814out ( f ) = '1';
815else;
816out ( f ) = '0';
817end;
818end;
819
820/*function global_best_out = add_new(global_best,new,nbest)
821% Eventually add to global best, but do not go over nbest values
822% Also avoids repeating things, which makes this function awfully slow
823   if length(global_best)>=nbest;
824      logliks = [global_best.loglik];
825      [loglik i] = min(logliks);
826      global_best_out = global_best;
827      if loglik<new.loglik;
828         %         if ~any(logliks == new.loglik);
829         addit=1;
830         for f = [global_best.bitstr];
831            if f == new.bitstr;
832               addit = 0;
833               break;
834            end;
835         end;
836         if addit;
837            global_best_out(i) = new;
838            % DEBUGging print:
839            % fprintf('ADDED structure, add_new: %s, loglik=%g\n', strPrintstr(new), new.loglik);
840         end;
841      end;
842   else;
843      global_best_out = [global_best new];
844   end;*/
845
846/*function out = sestrremove(in,removed_elements);
847% Removes elements from regressor
848   n_strL = length(in.strL);
849   out = in;
850   for f=removed_elements;
851      posit1 = find(out.strL==1);
852      positf = find(out.strL==f);
853      for g=(positf-1):-1:posit1;
854         % BEGIN: We are swapping g and g+1 NOW!!!!
855         [out.L, out.d]   = seswapudl(out.L, out.d, g);
856         [out.L0, out.d0]   = seswapudl(out.L0, out.d0, g);
857         out.strL([g g+1]) = [out.strL(g+1) out.strL(g)];
858         % END
859      end;
860   end;
861   out.posit1 = find(out.strL==1);
862   out.strRgr = out.strL((out.posit1+1):n_strL);
863   out.strMis = out.strL(1:(out.posit1-1));
864   out.bitstr = str_bitres(out.bitstr,removed_elements,out.nbits);
865   out.loglik = seloglik1(out);*/
866
867/*function out = sestrinsert(in,inserted_elements);
868% Moves elements into regressor
869   n_strL = length(in.strL);
870   out = in;
871   for f=inserted_elements;
872      posit1 = find(out.strL==1);
873      positf = find(out.strL==f);
874      for g=positf:(posit1-1);
875          % BEGIN: We are swapping g and g+1 NOW!!!!
876          [out.L,  out.d]   = seswapudl(out.L,  out.d,  g);
877          [out.L0, out.d0]  = seswapudl(out.L0, out.d0, g);
878          out.strL([g g+1]) = [out.strL(g+1) out.strL(g)];
879          % END
880      end;
881   end;
882   out.posit1 = find(out.strL==1);
883   out.strRgr = out.strL((out.posit1+1):n_strL);
884   out.strMis = out.strL(1:(out.posit1-1));
885   out.bitstr = str_bitset(out.bitstr,inserted_elements,out.nbits);
886   out.loglik = seloglik1(out);*/
887
888%
889% seloglik_real = seloglik1 + seloglik2
890                  %
891
892                  /*function l = seloglik1(in)
893                  % This is the loglikelihood (non-constant part) - this should be used in
894                  % frequent computation
895                     len = length(in.d);
896                     p1  = in.posit1;
897
898                     i1 = -0.5*in.nu *log(in.d (p1)) -0.5*sum(log(in.d ((p1+1):len)));
899                     i0 = -0.5*in.nu0*log(in.d0(p1)) -0.5*sum(log(in.d0((p1+1):len)));
900                     l  = i1-i0;
901
902                     % DEBUGGing print:
903                     % fprintf('SELOGLIK1: str=%s loglik=%g\n', strPrintstr(in), l);*/
904
905
906                  function l = seloglik2 ( in )
907                               % This is the loglikelihood ( constant part ) - this should be added to
908                               % everything at the end. It needs some computation, so it is useless to
909                               % make it for all the stuff
910                               logpi = log ( pi );
911
912i1 = gammaln ( in.nu / 2 ) - 0.5*in.nu *logpi;
913i0 = gammaln ( in.nu0 / 2 ) - 0.5*in.nu0*logpi;
914= i1 - i0;
915
916
917/*function [Lout, dout] = seswapudl(L,d,i);
918%SESWAPUDL swaps information matrix in decomposition V=L^T diag(d) L
919%
920%  [Lout, dout] = seswapudl(L,d,i);
921%
922% L : lower triangular matrix with 1's on diagonal of the decomposistion
923% d : diagonal vector of diagonal matrix of the decomposition
924% i : index of line to be swapped with the next one
925% Lout : output lower triangular matrix
926% dout : output diagional vector of diagonal matrix D
927%
928% Description:
929%  Lout' * diag(dout) * Lout = P(i,i+1) * L' * diag(d) * L * P(i,i+1);
930%
931%  Where permutation matrix P(i,j) permutates columns if applied from the
932%  right and line if applied from the left.
933%
934% Note: naming:
935%       se = structure estimation
936%       lite = light, simple
937%       udl = U*D*L, or more precisely, L'*D*L, also called as ld
938%
939% Design  : L. Tesar
940% Updated : Feb 2003
941% Project : post-ProDaCTool
942% Reference: sedydr
943
944j = i+1;
945
946pomd = d(i);
947d(i) = d(j);
948d(j) = pomd;
949
950pomL   = L(i,:);
951L(i,:) = L(j,:);
952L(j,:) = pomL;
953
954pomL   = L(:,i);
955L(:,i) = L(:,j);
956L(:,j) = pomL;
957
958% We must be working with LINES of matrix L !
959
960r  = L(i,:)';
961f  = L(j,:)';
962Dr = d(i);
963Df = d(j);
964
965[r, f, Dr, Df] = sedydr(r, f, Dr, Df, j);
966
967r0 = r(i);
968Dr = Dr*r0*r0;
969r  = r/r0;
970
971L(i,:) = r';
972L(j,:) = f';
973d(i)   = Dr;
974d(j)   = Df;
975
976L(i,i) = 1;
977L(j,j) = 1;
978
979Lout = L;
980dout = d;*/
981
982/*function [rout, fout, Drout, Dfout, kr] = sedydr(r,f,Dr,Df,R,jl,jh);
983%SEDYDR dyadic reduction, performs transformation of sum of 2 dyads
984%
985% [rout, fout, Drout, Dfout, kr] = sedydr(r,f,Dr,Df,R,jl,jh);
986% [rout, fout, Drout, Dfout] = sedydr(r,f,Dr,Df,R);
987%
988% Description: dyadic reduction, performs transformation of sum of
989%  2 dyads r*Dr*r'+ f*Df*f' so that the element of r pointed by R is zeroed
990%
991%     r    : column vector of reduced dyad
992%     f    : column vector of reducing dyad
993%     Dr   : scalar with weight of reduced dyad
994%     Df   : scalar with weight of reducing dyad
995%     R    : scalar number giving 1 based index to the element of r,
996%            which is to be reduced to
997%            zero; the corresponding element of f is assumed to be 1.
998%     jl   : lower index of the range within which the dyads are
999%            modified (can be omitted, then everything is updated)
1000%     jh   : upper index of the range within which the dyads are
1001%            modified (can be omitted then everything is updated)
1002%     rout,fout,Drout,dfout : resulting two dyads
1003%     kr   : coefficient used in the transformation of r
1004%            rnew = r + kr*f
1005%
1006% Description: dyadic reduction, performs transformation of sum of
1007%            2 dyads r*Dr*r'+ f*Df*f' so that the element of r indexed by R is zeroed
1008% Remark1: Constant mzero means machine zero and should be modified
1009%           according to the precision of particular machine
1010% Remark2: jl and jh are, in fact, obsolete. It takes longer time to
1011%           compute them compared to plain version. The reason is that we
1012%           are doing vector operations in m-file. Other reason is that
1013%           we need to copy whole vector anyway. It can save half of time for
1014%           c-file, if you use it correctly. (please do tests)
1015%
1016% Note: naming:
1017%       se = structure estimation
1018%       dydr = dyadic reduction
1019%
1020% Original Fortran design: V. Peterka 17-7-89
1021% Modified for c-language: probably R. Kulhavy
1022% Modified for m-language: L. Tesar 2/2003
1023% Updated: Feb 2003
1024% Project: post-ProDaCTool
1025% Reference: none
1026
1027if nargin<6;
1028   update_whole=1;
1029else
1030   update_whole=0;
1031end;
1032
1033mzero = 1e-32;
1034
1035if Dr<mzero;
1036   Dr=0;
1037end;
1038
1039r0   = r(R);
1040kD   = Df;
1041kr   = r0 * Dr;
1042Dfout   = kD + r0 * kr;
1043
1044if Dfout > mzero;
1045    kD = kD / Dfout;
1046    kr = kr / Dfout;
1047else;
1048    kD = 1;
1049    kr = 0;
1050end;
1051
1052Drout = Dr * kD;
1053
1054% Try to uncomment marked stuff (*) if in numerical problems, but I don't
1055% think it can make any difference for normal healthy floating-point unit
1056if update_whole;
1057   rout = r - r0*f;
1058%   rout(R) = 0;   % * could be needed for some nonsense cases(or numeric reasons?), normally not
1059   fout = f + kr*rout;
1060%   fout(R) = 1;   % * could be needed for some nonsense cases(or numeric reasons?), normally not
1061else;
1062   rout = r;
1063   fout = f;
1064   rout(jl:jh) = r(jl:jh) - r0 * f(jl:jh);
1065   rout(R) = 0;
1066   fout(jl:jh) = f(jl:jh) + kr * rout(jl:jh);
1067end;*/
1068
1069
1070
1071#endif
1072
1073
1074}
Note: See TracBrowser for help on using the browser.