/* FIXME: Create a more general version of this operation */ SEXP dsCMatrix_to_dgTMatrix(SEXP x) { cholmod_sparse *A = as_cholmod_sparse(x); cholmod_sparse *Afull = cholmod_copy(A, /*stype*/ 0, /*mode*/ 1, &c); cholmod_triplet *At = cholmod_sparse_to_triplet(Afull, &c); if (!A->stype) error("Non-symmetric matrix passed to dsCMatrix_to_dgTMatrix"); Free(A); cholmod_free_sparse(&Afull, &c); return chm_triplet_to_SEXP(At, 1, /*uploT*/ 0, "", GET_SLOT(x, Matrix_DimNamesSym)); }
SEXP Csparse_to_Tsparse(SEXP x, SEXP tri) { CHM_SP chxs = AS_CHM_SP__(x); CHM_TR chxt = cholmod_sparse_to_triplet(chxs, &c); int tr = asLogical(tri); int Rkind = (chxs->xtype != CHOLMOD_PATTERN) ? Real_kind(x) : 0; R_CheckStack(); return chm_triplet_to_SEXP(chxt, 1, tr ? ((*uplo_P(x) == 'U') ? 1 : -1) : 0, Rkind, tr ? diag_P(x) : "", GET_SLOT(x, Matrix_DimNamesSym)); }
double GaussianProcessInterpolationRestraintSparse::unprotected_evaluate( DerivativeAccumulator *accum) const { //check if the functions have changed const_cast<GaussianProcessInterpolationRestraintSparse*>(this)-> update_mean_and_covariance(); double ene = mvn_->evaluate(); if (accum) { cholmod_dense *dmv = mvn_->evaluate_derivative_FM(); if (dmv->xtype != CHOLMOD_REAL) IMP_THROW("matrix type is not real, update code here first", ModelException); double *dmvx=(double*) dmv->x; //derivatives for mean particles for (size_t i=0; i<M_; i++) { DerivativeAccumulator a(*accum, dmvx[i]); gpi_->mean_function_->add_to_derivatives(gpi_->x_[i], a); } cholmod_free_dense(&dmv, c_); //derivatives for covariance particles cholmod_sparse *tmp(mvn_->evaluate_derivative_Sigma()); cholmod_triplet *dmvS = cholmod_sparse_to_triplet(tmp, c_); cholmod_free_sparse(&tmp, c_); if ((dmvS->itype != CHOLMOD_INT) && (dmvS->xtype != CHOLMOD_REAL)) IMP_THROW("matrix type is not real or coefficients are not int!", ModelException); int *dmvi=(int*) dmvS->i; int *dmvj=(int*) dmvS->j; dmvx=(double*) dmvS->x; for (size_t p=0; p<dmvS->nzmax; ++p) { int i=dmvi[p]; int j=dmvj[p]; double val=dmvx[p]; DerivativeAccumulator a(*accum, val); gpi_->covariance_function_->add_to_derivatives( gpi_->x_[i],gpi_->x_[j], a); } cholmod_free_triplet(&dmvS,c_); } return ene; }