dvar_vector eigenvalues(const dvar_matrix& m) { if (m.rowsize()!=m.colsize()) { cerr << "Error -- non square matrix passed to " "dvector eigen(const dvar_matrix& m)\n"; ad_exit(1); } dvar_matrix m1=symmetrize(m); int n=m1.rowsize(); m1.colshift(1); // set minimum column and row indices to 1 m1.rowshift(1); dvar_vector diag(1,n); dvar_vector off_diag(1,n); tri_dag(m1,diag,off_diag); // eigenvalues are returned in diag get_eigen(diag,off_diag,m1); // eigenvalues are returned in columns of z return diag; }
dvariable mult_likelihood(const dmatrix &o, const dvar_matrix &p, dvar_matrix &nu, const dvariable &log_vn) { // kludge to ensure observed and predicted matrixes are the same size if(o.colsize()!=p.colsize() || o.rowsize()!=p.rowsize()) { cerr<<"Error in multivariate_t_likelihood, observed and predicted matrixes" " are not the same size\n"; ad_exit(1); } dvariable vn = mfexp(log_vn); dvariable ff = 0.0; int r1 = o.rowmin(); int r2 = o.rowmax(); int c1 = o.colmin(); int c2 = o.colmax(); for(int i = r1; i <= r2; i++ ) { dvar_vector sobs = vn * o(i)/sum(o(i)); //scale observed numbers by effective sample size. ff -= gammln(vn); for(int j = c1; j <= c2; j++ ) { if( value(sobs(j)) > 0.0 ) ff += gammln(sobs(j)); } ff -= sobs * log(TINY + p(i)); dvar_vector o1=o(i)/sum(o(i)); dvar_vector p1=p(i)/sum(p(i)); nu(i) = elem_div(o1-p1,sqrt(elem_prod(p1,1.-p1)/vn)); } // exit(1); return ff; }