// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- #include // [[Rcpp::depends(RcppEigen)]] typedef Eigen::MappedSparseMatrix MSpMat; typedef Eigen::SparseMatrix SpMat; typedef Eigen::SimplicialLDLT SpChol; typedef Eigen::MatrixXd Mat; typedef Eigen::VectorXd Vec; typedef Eigen::Map MMat; typedef Eigen::Map MVec; typedef Eigen::VectorXi iVec; typedef Eigen::Map MiVec; typedef Eigen::CholmodDecomposition ChmDecomp; using Rcpp::as; using Rcpp::wrap; using Rcpp::Environment; // [[Rcpp::export]] ChmDecomp update_predD(Environment rho) { // Calls to rho.get can be preceded by calls to rho.exists to make sure the name is available MSpMat Zt(as(rho.get("Zt"))); MSpMat Lambdat(as(rho.get("Lambdat"))); MiVec Lind(as(rho.get("Lind"))); MVec theta(as(rho.get("theta"))); if (Lind.size() != Lambdat.nonZeros()) throw std::invalid_argument("dimension mismatch"); int *lipt = Lind.data(); double *LamX = Lambdat.valuePtr(), *thpt = theta.data(); for (int i = 0; i < Lind.size(); ++i) { LamX[i] = thpt[lipt[i] - 1]; } SpMat LamtZt(Lambdat * Zt); SpMat LamtZtZLam(LamtZt * LamtZt.adjoint()); rho.assign("ZtZ",wrap(LamtZtZLam)); return ChmDecomp(LamtZtZLam);// ChmDecomp L = as(rho.get("L")); }