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()); } }
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)); } } }
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()); }
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(); }
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)); } } }
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'); }
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); }
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) }
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); }