Show
Ignore:
Timestamp:
07/02/09 22:16:05 (15 years ago)
Author:
smidl
Message:

Change in epdf: evallog returns -inf for points out of support. Merger is aware of it now.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/stat/merger.cpp

    r399 r404  
    55namespace bdm 
    66{ 
    7         vec merger_base::merge_points ( mat &lW ) 
    8         { 
     7        vec merger_base::merge_points ( mat &lW ) { 
    98                int nu=lW.rows(); 
    10                 switch ( METHOD ) 
    11                 { 
     9                vec result; 
     10                ivec indW; 
     11                bool infexist; 
     12                switch ( METHOD ) { 
    1213                        case ARITHMETIC: 
    13                                 return log ( sum ( exp ( lW ) ) ); //ugly! 
     14                                result= log ( sum ( exp ( lW ) ) ); //ugly! 
    1415                                break; 
    1516                        case GEOMETRIC: 
    16                                 return sum ( lW ) /nu; 
     17                                result= sum ( lW ) /nu; 
    1718                                break; 
    1819                        case LOGNORMAL: 
    19                                 vec mu = sum ( lW ) /nu; //mean of logs 
    20                                 // vec lam = sum ( pow ( lW,2 ) )-nu*pow ( mu,2 ); ======= numerically unsafe! 
    21                                 vec lam = sum ( pow ( lW-outer_product ( ones ( lW.rows() ),mu ),2 ) ); 
     20                                vec sumlW=sum ( lW ) ; 
     21                                indW=find((sumlW<inf) & (sumlW>-inf)); 
     22                                infexist=(indW.size()<lW.cols()); 
     23                                vec mu; 
     24                                vec lam; 
     25                                if (infexist){ 
     26                                        mu = sumlW(indW) /nu; //mean of logs 
     27                                        //  
     28                                        mat validlW=lW.get_cols(indW); 
     29                                        lam = sum ( pow ( validlW-outer_product ( ones ( validlW.rows() ),mu ),2 ) ); 
     30                                } 
     31                                else { 
     32                                        mu = sum ( lW ) /nu; //mean of logs 
     33                                        lam = sum ( pow ( lW-outer_product ( ones ( lW.rows() ),mu ),2 ) ); 
     34                                } 
     35                                // 
    2236                                double coef=0.0; 
    2337                                vec sq2bl=sqrt ( 2*beta*lam ); //this term is everywhere 
    24                                 switch ( nu ) 
    25                                 { 
     38                                switch ( nu ) { 
    2639                                        case 2: 
    2740                                                coef= ( 1-0.5*sqrt ( ( 4.0*beta-3.0 ) /beta ) ); 
    28                                                 return  coef*sq2bl + mu ; 
     41                                                result =coef*sq2bl + mu ; 
    2942                                                break; 
    30                                         case 3://Ratio of Bessel 
    31                                                 coef = sqrt ( ( 3*beta-2 ) /3*beta ); 
    32                                                 return log ( besselk ( 0,sq2bl*coef ) ) - log ( besselk ( 0,sq2bl ) ) +  mu; 
    33                                                 break; 
    34                                         case 4: 
    35                                                 break; 
    36                                         default: // Approximate conditional density 
     43                                        // case 4: == can be done similar to case 2 - is it worth it??? 
     44                                        default: // see accompanying document merge_lognorm_derivation.lyx 
     45                                                coef = sqrt(1-(nu+1)/(2*beta*nu)); 
     46                                                result =log(besselk((nu-3)/2, sq2bl*coef))-log(besselk((nu-3)/2, sq2bl)) + mu; 
    3747                                                break; 
    3848                                } 
    3949                                break; 
    4050                } 
    41                 return vec ( 0 ); 
     51                if (infexist){ 
     52                        vec tmp =-inf*ones(lW.cols()); 
     53                        set_subvector(tmp, indW, result); 
     54                        return tmp; 
     55                } 
     56                else {return result;} 
    4257        } 
    4358