Ejemplo n.º 1
0
void checkDenseMatrixEqual(M1 const& m1, M2 const& m2){
	BOOST_REQUIRE_EQUAL(m1.size1(),m2.size1());
	BOOST_REQUIRE_EQUAL(m1.size2(),m2.size2());
	//indexed access
	for(std::size_t i = 0; i != m2.size1(); ++i){
		for(std::size_t j = 0; j != m2.size2(); ++j){
			BOOST_CHECK_EQUAL(m1(i,j),m2(i,j));
		}
	}
	//iterator access rows
	for(std::size_t i = 0; i != m2.size1(); ++i){
		typedef typename M1::const_row_iterator Iter;
		BOOST_REQUIRE_EQUAL(m1.row_end(i)-m1.row_begin(i), m1.size2());
		std::size_t k = 0;
		for(Iter it = m1.row_begin(i); it != m1.row_end(i); ++it,++k){
			BOOST_CHECK_EQUAL(k,it.index());
			BOOST_CHECK_EQUAL(*it,m2(i,k));
		}
		//test that the actual iterated length equals the number of elements
		BOOST_CHECK_EQUAL(k, m1.size2());
	}
	//iterator access columns
	for(std::size_t i = 0; i != m2.size2(); ++i){
		typedef typename M1::const_column_iterator Iter;
		BOOST_REQUIRE_EQUAL(m1.column_end(i)-m1.column_begin(i), m1.size1());
		std::size_t k = 0;
		for(Iter it = m1.column_begin(i); it != m1.column_end(i); ++it,++k){
			BOOST_CHECK_EQUAL(k,it.index());
			BOOST_CHECK_EQUAL(*it,m2(k,i));
		}
		//test that the actual iterated length equals the number of elements
		BOOST_CHECK_EQUAL(k, m1.size1());
	}
}
Ejemplo n.º 2
0
void checkMatrixEqual(M1 const& m1, M2 const& m2){
	BOOST_REQUIRE_EQUAL(m1.size1(),m2.size1());
	BOOST_REQUIRE_EQUAL(m1.size2(),m2.size2());
	for(std::size_t i = 0; i != m2.size1(); ++i){
		for(std::size_t j = 0; j != m2.size2(); ++j){
			BOOST_CHECK_EQUAL(m1(i,j),m2(i,j));
		}
	}
}
Ejemplo n.º 3
0
void bi::standardise(const ExpGaussianPdf<V1,M1>& p, M2 X) {
  /* pre-condition */
  BI_ASSERT(p.size() == X.size2());

  typename sim_temp_vector<M2>::type mu(X.size2());

  log_columns(X, p.getLogs());
  mean(X, mu);
  sub_rows(X, mu);
  trsm(1.0, p.std(), X, 'R', 'U');
  add_rows(X, mu);
  sub_rows(X, p.mean());
  exp_columns(X, p.getLogs());
}
Ejemplo n.º 4
0
void bi::cov(const ExpGaussianPdf<V1, M1>& q, M2 Sigma) {
  /* pre-condition */
  BI_ASSERT(Sigma.size1() == q.size());
  BI_ASSERT(Sigma.size2() == q.size());

  Sigma = q.cov();
}
Ejemplo n.º 5
0
void bi::distance(const M1 X, const real h, M2 D) {
  /* pre-conditions */
  BI_ASSERT(D.size1() == D.size2());
  BI_ASSERT(D.size1() == X.size1());
  BI_ASSERT(!M2::on_device);

  typedef typename M1::value_type T1;

  FastGaussianKernel K(X.size2(), h);
  typename temp_host_vector<T1>::type d(X.size2());
  int i, j;
  for (j = 0; j < D.size2(); ++j) {
    for (i = 0; i <= j; ++i) {
      d = row(X, i);
      axpy(-1.0, row(X, j), d);
      D(i, j) = K(dot(d));
    }
  }
}
Ejemplo n.º 6
0
void bi::cov(const M1 X, const V1 mu, M2 Sigma) {
  /* pre-conditions */
  BI_ASSERT(X.size2() == mu.size());
  BI_ASSERT(Sigma.size1() == mu.size() && Sigma.size2() == mu.size());

  const int N = X.size1();
  typename sim_temp_matrix<M2>::type Y(X.size1(), X.size2());
  Y = X;
  sub_rows(Y, mu);
  syrk(1.0/(N - 1.0), Y, 0.0, Sigma, 'U', 'T');
}
Ejemplo n.º 7
0
void bi::cross(const M1 X, const M2 Y, const V1 muX, const V2 muY,
    M3 SigmaXY) {
  /* pre-conditions */
  BI_ASSERT(X.size2() == muX.size());
  BI_ASSERT(Y.size2() == muY.size());
  BI_ASSERT(X.size1() == Y.size1());
  BI_ASSERT(SigmaXY.size1() == muX.size() && SigmaXY.size2() == muY.size());

  const int N = X.size1();

  gemm(1.0/(N - 1.0), X, Y, 0.0, SigmaXY, 'T', 'N');
  ger(-N/(N - 1.0), muX, muY, SigmaXY);
}
Ejemplo n.º 8
0
void bi::cov(const M1 X, const V1 w, const V2 mu, M2 Sigma) {
  /* pre-conditions */
  BI_ASSERT(X.size2() == mu.size());
  BI_ASSERT(X.size1() == w.size());
  BI_ASSERT(Sigma.size1() == mu.size() && Sigma.size2() == mu.size());

  typedef typename V1::value_type T;
  typename sim_temp_matrix<M2>::type Y(X.size1(), X.size2());
  typename sim_temp_matrix<M2>::type Z(X.size1(), X.size2());
  typename sim_temp_vector<V2>::type v(w.size());

  T Wt = sum_reduce(w);
  Y = X;
  sub_rows(Y, mu);
  sqrt_elements(w, v);
  gdmm(1.0, v, Y, 0.0, Z);
  syrk(1.0/Wt, Z, 0.0, Sigma, 'U', 'T');
  // alternative weight: 1.0/(Wt - W2t/Wt)
}
Ejemplo n.º 9
0
void bi::cross(const M1 X, const M2 Y, const V1 w, const V2 muX,
    const V3 muY, M3 SigmaXY) {
  /* pre-conditions */
  BI_ASSERT(X.size2() == muX.size());
  BI_ASSERT(Y.size2() == muY.size());
  BI_ASSERT(X.size1() == Y.size1());
  BI_ASSERT(X.size1() == w.size());
  BI_ASSERT(Y.size1() == w.size());
  BI_ASSERT(SigmaXY.size1() == muX.size() && SigmaXY.size2() == muY.size());

  typedef typename V1::value_type T;
  typename sim_temp_matrix<M3>::type Z(X.size1(), X.size2());

  T Wt = sum_reduce(w);
  T Wt2 = std::pow(Wt, 2);
  T W2t = sumsq_reduce(w);

  gdmm(1.0, w, X, 0.0, Z);
  gemm(1.0/Wt, Z, Y, 0.0, SigmaXY, 'T', 'N');
  ger(-1.0, muX, muY, SigmaXY);
  matrix_scal(1.0/(1.0 - W2t/Wt2), SigmaXY);
}