el_sem_naive::el_sem_naive(SEXP weights_r, SEXP y_r, SEXP omega_r, SEXP b_r , SEXP dual_r, int meanEst) { mat y = as<arma::mat>(y_r); n_ = y.n_cols; v_ = y.n_rows; counter_ = 0; conv_crit_ = 1.0; //find appropriate spots to put in b_weights_r and omega_weights so that we can build sigma uvec b_spots = find(as<arma::mat>(b_r)); uvec omega_spots = arma::find(trimatl(as<arma::mat>(omega_r))); vec weights = as<arma::vec>(weights_r); mat omega_weights(v_, v_, fill::zeros); mat b_weights(v_, v_, fill::zeros); vec means = vec(v_, fill::zeros); //non-zero means if(meanEst){ means = as<arma::vec>(weights_r).head(v_); b_weights.elem(b_spots) = as<arma::vec>(weights_r).subvec(v_, v_ + b_spots.n_elem - 1); omega_weights.elem(omega_spots) = weights.subvec(v_ + b_spots.n_elem, v_ + b_spots.n_elem + omega_spots.n_elem - 1); omega_weights = symmatl(omega_weights); } else { b_weights.elem(b_spots) = weights.subvec(0, b_spots.n_elem - 1); omega_weights.elem(omega_spots) = weights.subvec(b_spots.n_elem, b_spots.n_elem + omega_spots.n_elem - 1); omega_weights = symmatl(omega_weights); } sigma_ = solve( (eye(v_, v_) - b_weights), solve( eye(v_, v_) - b_weights, omega_weights).t()); dual_ = as<arma::vec>(dual_r); // constraints_ = mat(v_ + (v_ *(v_ + 1) )/ 2, n_); constraints_.rows(0, v_ - 1) = (eye(v_, v_) - b_weights) * y; if(meanEst) { constraints_.rows(0, v_ - 1).each_col() -= means; } int i,j,k; k = v_; for(i = 0; i < v_; i++) { for(j = 0; j <= i; j++ ) { constraints_.row(k) = (y.row(i) % y.row(j)) - sigma_(i,j); k++; } } d_ = (constraints_.t() * dual_) + 1.0; }
inline bool glue_solve_tri::apply(Mat<eT>& out, const Base<eT,T1>& A_expr, const Base<eT,T2>& B_expr, const uword flags) { arma_extra_debug_sigprint(); const bool fast = bool(flags & solve_opts::flag_fast ); const bool equilibrate = bool(flags & solve_opts::flag_equilibrate); const bool no_approx = bool(flags & solve_opts::flag_no_approx ); const bool triu = bool(flags & solve_opts::flag_triu ); const bool tril = bool(flags & solve_opts::flag_tril ); arma_extra_debug_print("glue_solve_tri::apply(): enabled flags:"); if(fast ) { arma_extra_debug_print("fast"); } if(equilibrate) { arma_extra_debug_print("equilibrate"); } if(no_approx ) { arma_extra_debug_print("no_approx"); } if(triu ) { arma_extra_debug_print("triu"); } if(tril ) { arma_extra_debug_print("tril"); } bool status = false; if(equilibrate) { arma_debug_warn("solve(): option 'equilibrate' ignored for triangular matrices"); } const unwrap_check<T1> U(A_expr.get_ref(), out); const Mat<eT>& A = U.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); const uword layout = (triu) ? uword(0) : uword(1); status = auxlib::solve_tri(out, A, B_expr.get_ref(), layout); // A is not modified if( (status == false) && (no_approx == false) ) { arma_extra_debug_print("glue_solve_tri::apply(): solving rank deficient system"); arma_debug_warn("solve(): system seems singular; attempting approx solution"); Mat<eT> triA = (triu) ? trimatu( A_expr.get_ref() ) : trimatl( A_expr.get_ref() ); status = auxlib::solve_approx_svd(out, triA, B_expr.get_ref()); // triA is overwritten } if(status == false) { out.reset(); } return status; }
int MCMCPkPg::sampleZ( PkPgModel& model, PkPgResult& Result ){ //zeros<mat>( model.N, model.Q ); // temporaly sample Z_ig - mu_ig mat RO = Result.Rho * Result.Otheta; mat RORt = RO * Result.Rho.t(); mat SZi = Result.Osnp + RORt; mat cZU = chol( SZi ); //std::cout <<"g0"<<std::endl; uvec aidx( 1 ); umat bidx_temp( model.Q, 1 ); for( size_t g = 0; g < model.Q; g++ ){ bidx_temp( g, 0 ) = g; } mat clogt = ( Result.logTheta- Result.XBetaPk ); mat tempMz0 = Result.Osnp * Result.XBetaPg.t() + RO *clogt.t(); mat v0 = solve( trimatl( trans( cZU ) ), tempMz0 ); mat mz0 = trans(solve( trimatu( cZU ), v0 ) ); //std::cout <<"g"<<std::endl; for( size_t i = 0; i < model.N; i++ ){ vec z = Result.Z.row(i).t(); for( size_t j = 0; j < model.Q; j++ ){ //std::cout <<"g2"<<std::endl; // mat tempMz = Result.Osnp * Result.XBetaPg.row(i).t() + RO *clogt.row(i).t() ; // mat v = solve( trimatl( trans( cZU ) ), tempMz ); // vec mz = solve( trimatu( cZU ), v ) ; vec mz = mz0.row(i).t(); aidx( 0 ) = j; //mz.print("mz"); //std::cout <<"g1"<<std::endl; umat bidxt = bidx_temp; //std::cout <<"g2"<<std::endl; bidxt.shed_row( j ); //std::cout <<"g3"<<std::endl; uvec bidx = bidxt.col( 0 );//conv_to< uvec >::from( bidxt); //std::cout <<"g4"<<std::endl; double sdz1 =pow( SZi( j, j ), - 0.5 ); // std::cout <<"g5"<<std::endl; double mzc1 = as_scalar( SZi.submat(aidx,bidx)*(z.elem(bidx)-mz.elem(bidx))); double mzc = mzc1/SZi( j, j ); /// std::cout <<"g6"<<std::endl; z( j ) = ZgivenW( model.W( i, j ),mzc, sdz1 ); // std::cout <<"mz( i, j )"<<mz( j )<<std::endl; // std::cout <<"z( i, j )"<<z( i, j )<<std::endl; // std::cout <<"g3"<<std::endl; Result.Z( i, j ) = z( j ) ; // std::cout <<"g10"<<std::endl; } } // for( size_t i = 0; i < model.N; i++ ){ // int Qidx = model.Q - 1; // double sdz1 = cZU( Qidx, Qidx );//1.0 / cZU( Qidx, Qidx ); // double mzc1 = mz( i, Qidx);//double mzc1 = mz( i, Qidx ); // z( i, Qidx ) = ZgivenW(model.W( i, Qidx ),mzc1, sdz1 ); // for( int g = ( model.Q - 1 ); g >= 0 ; g-- ){ // double mzc = 0;//double mzc = mz( i, g ); // for( size_t j = g + 1; j < model.Q ; j++ ){ // //mzc -= ( z( i, j ) - mz( i, j ) ) * cZU( g, j )/cZU( g, g ); // mzc -= ( z( i, j ) - mz( i, j ) ) * cZU( g, j );//cZU( g, g ) // } // j // double sdz = cZU( g, g ) ;//1.0 / cZU( g, g ) ; // z( i, g ) = ZgivenW( model.W( i, g ), mzc, sdz ) + mz( i, g ); // Result.Z( i, g ) = z( i, g ) ; // }//g // }//i Result.ZtZ = Result.Z.t() * Result.Z; // update ZtZ also Result.ZRho= Result.Z * Result.Rho; return 0; }