/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include // reference implementations void fvec_inner_products_ny_ref( float* ip, const float* x, const float* y, size_t d, size_t ny) { for (size_t i = 0; i < ny; i++) { ip[i] = faiss::fvec_inner_product(x, y, d); y += d; } } void fvec_L2sqr_ny_ref( float* dis, const float* x, const float* y, size_t d, size_t ny) { for (size_t i = 0; i < ny; i++) { dis[i] = faiss::fvec_L2sqr(x, y, d); y += d; } } // test templated versions of fvec_L2sqr_ny TEST(TEST_FVEC_L2SQR_NY, D2) { // we're using int values in order to get 100% accurate // results with floats. std::default_random_engine rng(123); std::uniform_int_distribution u(0, 32); for (const auto dim : {2, 4, 8, 12}) { std::vector x(dim, 0); for (size_t i = 0; i < x.size(); i++) { x[i] = u(rng); } for (const auto nrows : {1, 2, 5, 10, 15, 20, 25}) { std::vector y(nrows * dim); for (size_t i = 0; i < y.size(); i++) { y[i] = u(rng); } std::vector distances(nrows, 0); faiss::fvec_L2sqr_ny( distances.data(), x.data(), y.data(), dim, nrows); std::vector distances_ref(nrows, 0); fvec_L2sqr_ny_ref( distances_ref.data(), x.data(), y.data(), dim, nrows); ASSERT_EQ(distances, distances_ref) << "Mismatching results for dim = " << dim << ", nrows = " << nrows; } } } // fvec_inner_products_ny TEST(TEST_FVEC_INNER_PRODUCTS_NY, D2) { // we're using int values in order to get 100% accurate // results with floats. std::default_random_engine rng(123); std::uniform_int_distribution u(0, 32); for (const auto dim : {2, 4, 8, 12}) { std::vector x(dim, 0); for (size_t i = 0; i < x.size(); i++) { x[i] = u(rng); } for (const auto nrows : {1, 2, 5, 10, 15, 20, 25}) { std::vector y(nrows * dim); for (size_t i = 0; i < y.size(); i++) { y[i] = u(rng); } std::vector distances(nrows, 0); faiss::fvec_inner_products_ny( distances.data(), x.data(), y.data(), dim, nrows); std::vector distances_ref(nrows, 0); fvec_inner_products_ny_ref( distances_ref.data(), x.data(), y.data(), dim, nrows); ASSERT_EQ(distances, distances_ref) << "Mismatching results for dim = " << dim << ", nrows = " << nrows; } } }