Esempio n. 1
0
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;
  }
Esempio n. 3
0
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;
}