void VarproFunction::computeGradFromYr( const gsl_vector* yr, const gsl_matrix *Rorig, const gsl_matrix *perm, gsl_matrix *gradR ) { gsl_matrix_const_view yr_matr = gsl_matrix_const_view_vector(yr, getN(), getD()); myDeriv->calcYtDgammaY(myTmpGradR, Rorig, &yr_matr.matrix); gsl_blas_dgemm(CblasTrans, CblasNoTrans, 2.0, myMatr, &yr_matr.matrix, -1.0, myTmpGradR); if (myPhi != NULL) { gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, myPhi, myTmpGradR, 0.0, myTmpGradR2); } else { gsl_matrix_memcpy(myTmpGradR2, myTmpGradR); } if (perm != NULL) { if (perm->size1 == getNrow()) { gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, perm, myTmpGradR2, 0.0, gradR); } else { gsl_vector vecTmpGradR2 = gsl_vector_view_array(myTmpGradR2->data, myTmpGradR2->size1 * myTmpGradR2->size2).vector, vecGradR = gsl_vector_view_array(gradR->data, gradR->size1 * gradR->size2).vector; gsl_blas_dgemv(CblasTrans, 1.0, perm, &vecTmpGradR2, 0.0, &vecGradR); } } else { gsl_matrix_memcpy(gradR, myTmpGradR2); } }
double mcmclib_iwishart_lpdf_compute(void* in_p, const gsl_vector* x) { mcmclib_iwishart_lpdf* p = (mcmclib_iwishart_lpdf*) in_p; const size_t n = p->Psi->size1; gsl_matrix_const_view X_v = gsl_matrix_const_view_vector(x, n, n); const gsl_matrix* X = &(X_v.matrix); gsl_matrix* X1 = p->X1; gsl_matrix_memcpy(X1, X); if(mcmclib_cholesky_decomp(X1) != GSL_SUCCESS) return log(0.0); double Xdet2 = 0.0; for(size_t i=0; i<n; i++) Xdet2 += log(gsl_matrix_get(X1, i, i)); gsl_linalg_cholesky_invert(X1); gsl_matrix* PsiX = p->PsiX; gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, p->Psi, X1, 0.0, PsiX); return p->PsiDet - ((double) p->m + (double) n + 1.0) * Xdet2 -0.5 * trace(PsiX); }
void HLayeredBlWStructure::multByGtUnweighted( gsl_vector* p, const gsl_matrix *Rt, const gsl_vector *y, double alpha, double beta, bool skipFixedBlocks ) { size_t l, k, sum_np = 0, sum_nl = 0, D = Rt->size2; gsl_matrix Y = gsl_matrix_const_view_vector(y,getN(), D).matrix, RtSub; gsl_vector Y_row, psub; for (l = 0; l < getQ(); sum_np += getLayerNp(l), sum_nl += getLayerLag(l), ++l) { RtSub = gsl_matrix_const_submatrix(Rt, sum_nl, 0, getLayerLag(l), D).matrix; if (!(skipFixedBlocks && isLayerExact(l))) { for (k = 0; k < getN(); k++) { psub = gsl_vector_subvector(p, k + sum_np, getLayerLag(l)).vector; Y_row = gsl_matrix_row(&Y, k).vector; gsl_blas_dgemv(CblasNoTrans, alpha, &RtSub, &Y_row, beta, &psub); } } } }