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(); }
Common_type<Value_type<M1>, Value_type<M2> > dot_product (const M1 &a, const M2 &b) { static_assert (a.order == 1, ""); static_assert (b.order == 1, ""); assert (a.size () == b.size ()); return inner_product (a.begin (), a.end (), b.begin (), size_t (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)); } } }
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 expectNear(const M1 & A, const M2 & B, T tolerance, std::string const & message = "") { EXPECT_EQ((size_t)A.rows(),(size_t)B.rows()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; EXPECT_EQ((size_t)A.cols(),(size_t)B.cols()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; for(int r = 0; r < A.rows(); r++) { for(int c = 0; c < A.cols(); c++) { EXPECT_NEAR(A(r,c),B(r,c),tolerance) << message << "\nTolerance comparison failed at (" << r << "," << c << ")\n" << "\nMatrix A:\n" << A << "\nand matrix B\n" << B; } } }
void assertEqual(const M1 & A, const M2 & B, std::string const & message = "") { ASSERT_EQ((size_t)A.rows(),(size_t)B.rows()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; ASSERT_EQ((size_t)A.cols(),(size_t)B.cols()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; for(int r = 0; r < A.rows(); r++) { for(int c = 0; c < A.cols(); c++) { ASSERT_EQ(A(r,c),B(r,c)) << message << "\nEquality comparison failed at (" << r << "," << c << ")\n" << "\nMatrix A:\n" << A << "\nand matrix B\n" << B; } } }
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()); }
bool compare_result(const M1& sm, const M2& m) { if(sm.size() != m.size()) return false; if(sm.line() != m.line()) return false; for(unsigned int i = 0; i < sm.size(); ++i) { if(sm.position(i) != m.position(i)) return false; if(sm.length(i) != m.length(i)) return false; } return true; }
void check_LU_res(const M1 & m, const M2& lu) { GeneralMatrix l(m.M(), m.N()); GeneralMatrix u(m.M(), m.N()); for(int i = 0; i < lu.M(); i++) { for(int j = 0; j< lu.N(); j++) { if(i>j) { l(i, j) = lu(i, j); u(i, j) = 0; } else if(i == j) { l(i, j) = 1; u(i, j) = lu(i, j); } else { l(i, j) = 0; u(i, j) = lu(i, j); } } } bool equal = true; GeneralMatrix m1(m.M(), m.N()); mul(l, u, m1); for(int i = 0; i<m.M(); i++) for(int j = 0; j< m.N(); j++) { if(std::abs(m1(i, j) - m(i, j) ) / m(i, j) > 0.1) { equal = false; } } if(!check_Matrix(m1,m)) { std::cout<<"wrong answer!"<<std::endl; } else { std::cout<<"right answer, wahahahaha!"<<std::endl; } }
void assertNear(const M1 & A, const M2 & B, T tolerance, std::string const & message = "") { // Note: If these assertions fail, they only abort this subroutine. // see: http://code.google.com/p/googletest/wiki/AdvancedGuide#Using_Assertions_in_Sub-routines // \todo better handling of this ASSERT_EQ((size_t)A.rows(),(size_t)B.rows()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; ASSERT_EQ((size_t)A.cols(),(size_t)B.cols()) << message << "\nMatrix A:\n" << A << "\nand matrix B\n" << B << "\nare not the same\n"; for(int r = 0; r < A.rows(); r++) { for(int c = 0; c < A.cols(); c++) { ASSERT_NEAR(A(r,c),B(r,c),tolerance) << message << "\nTolerance comparison failed at (" << r << "," << c << ")\n" << "\nMatrix A:\n" << A << "\nand matrix B\n" << B; } } }
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::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 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::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); }
static constexpr auto equal_impl(M1 m1, M2 m2) { return m1.nrows() == m2.nrows() && m1.ncolumns() == m2.ncolumns() && all_of(zip_with(_==_, m1.rows_, m2.rows_)); }