예제 #1
0
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);
  }
}
예제 #2
0
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);
}
예제 #3
0
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); 
      }
    } 
  }
}