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 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::var(const M1 X, const V1 mu, V2 sigma) { /* pre-conditions */ BI_ASSERT(X.size2() == mu.size()); BI_ASSERT(sigma.size() == mu.size()); const int N = X.size1(); typename sim_temp_matrix<M1>::type Z(X.size2(), X.size1()); Z = X; sub_rows(Z, mu); dot_columns(Z, sigma); scal(1.0/(N - 1.0), sigma); }
typename viennacl::enable_if< viennacl::is_any_dense_nonstructured_matrix<M1>::value && viennacl::is_any_dense_nonstructured_vector<V1>::value >::type inplace_solve(const M1 & mat, V1 & vec, SOLVERTAG) { assert( (mat.size1() == vec.size()) && bool("Size check failed in inplace_solve(): size1(A) != size(b)")); assert( (mat.size2() == vec.size()) && bool("Size check failed in inplace_solve(): size2(A) != size(b)")); switch (viennacl::traits::handle(mat).get_active_handle_id()) { case viennacl::MAIN_MEMORY: viennacl::linalg::host_based::inplace_solve(mat, vec, SOLVERTAG()); break; #ifdef VIENNACL_WITH_OPENCL case viennacl::OPENCL_MEMORY: viennacl::linalg::opencl::inplace_solve(mat, vec, SOLVERTAG()); break; #endif #ifdef VIENNACL_WITH_CUDA case viennacl::CUDA_MEMORY: viennacl::linalg::cuda::inplace_solve(mat, vec, SOLVERTAG()); break; #endif default: throw "not implemented"; } }
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::mean(const M1 X, V1 mu) { /* pre-condition */ BI_ASSERT(X.size2() == mu.size()); const int N = X.size1(); typename sim_temp_vector<V1>::type w(N); set_elements(w, 1.0); gemv(1.0/N, X, w, 0.0, mu, 'T'); }
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::mean(const M1 X, const V1 w, V2 mu) { /* pre-conditions */ BI_ASSERT(X.size2() == mu.size()); BI_ASSERT(X.size1() == w.size()); typedef typename V1::value_type T; T Wt = sum_reduce(w); gemv(1.0/Wt, X, w, 0.0, mu, 'T'); }
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::var(const M1 X, const V1 w, const V2 mu, V3 sigma) { /* pre-conditions */ BI_ASSERT(X.size2() == mu.size()); BI_ASSERT(X.size1() == w.size()); BI_ASSERT(sigma.size() == mu.size()); typedef typename V1::value_type T1; typename sim_temp_matrix<M1>::type Z(X.size1(), X.size2()); typename sim_temp_matrix<M1>::type Y(X.size1(), X.size2()); typename sim_temp_vector<V2>::type v(w.size()); T1 Wt = sum_reduce(w); Z = X; sub_rows(Z, mu); sqrt_elements(w, v); gdmm(1.0, v, Z, 0.0, Y); dot_columns(Y, sigma); divscal_elements(sigma, Wt, sigma); // alternative weight: 1.0/(Wt - W2t/Wt) }
void bi::cov(const GammaPdf& q, M1 Sigma) { /* pre-condition */ BI_ASSERT(Sigma.size1() == q.size()); BI_ASSERT(Sigma.size2() == q.size()); real alpha = q.shape(); real beta = q.scale(); real sigma = alpha*std::pow(beta, 2); Sigma.clear(); set_elements(diagonal(Sigma), sigma); }
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); }
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 InverseGammaPdf& q, M1 Sigma) { /* pre-condition */ BI_ASSERT(Sigma.size1() == q.size()); BI_ASSERT(Sigma.size2() == q.size()); BI_ASSERT(q.shape() > 2.0); real alpha = q.shape(); real beta = q.scale(); real sigma = std::pow(beta, 2)/(std::pow(alpha - 1.0, 2)*(alpha - 2.0)); Sigma.clear(); set_elements(diagonal(Sigma), sigma); }
void bi::cov(const UniformPdf<V1>& q, M1 Sigma) { /* pre-condition */ BI_ASSERT(Sigma.size1() == q.size()); BI_ASSERT(Sigma.size2() == q.size()); temp_host_vector<real>::type diff(q.size()); diff = q.upper(); sub_elements(diff, q.lower(), diff); sq_elements(diff, diff); Sigma.clear(); axpy(1.0/12.0, diff, diagonal(Sigma)); }