From ea0834364360155fbd2606c4b550138cccaf1a86 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Thu, 4 Feb 2021 13:22:07 +0000 Subject: add unit test for SparseMergeFunction --- eval/CMakeLists.txt | 1 + .../sparse_merge_function/CMakeLists.txt | 9 +++ .../sparse_merge_function_test.cpp | 82 ++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 eval/src/tests/instruction/sparse_merge_function/CMakeLists.txt create mode 100644 eval/src/tests/instruction/sparse_merge_function/sparse_merge_function_test.cpp (limited to 'eval') diff --git a/eval/CMakeLists.txt b/eval/CMakeLists.txt index 23127cc12b5..0cba519bf88 100644 --- a/eval/CMakeLists.txt +++ b/eval/CMakeLists.txt @@ -66,6 +66,7 @@ vespa_define_module( src/tests/instruction/pow_as_map_optimizer src/tests/instruction/remove_trivial_dimension_optimizer src/tests/instruction/sparse_dot_product_function + src/tests/instruction/sparse_merge_function src/tests/instruction/sum_max_dot_product_function src/tests/instruction/vector_from_doubles_function src/tests/streamed/value diff --git a/eval/src/tests/instruction/sparse_merge_function/CMakeLists.txt b/eval/src/tests/instruction/sparse_merge_function/CMakeLists.txt new file mode 100644 index 00000000000..f905bdd8c1b --- /dev/null +++ b/eval/src/tests/instruction/sparse_merge_function/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(eval_sparse_merge_function_test_app TEST + SOURCES + sparse_merge_function_test.cpp + DEPENDS + vespaeval + GTest::GTest +) +vespa_add_test(NAME eval_sparse_merge_function_test_app COMMAND eval_sparse_merge_function_test_app) diff --git a/eval/src/tests/instruction/sparse_merge_function/sparse_merge_function_test.cpp b/eval/src/tests/instruction/sparse_merge_function/sparse_merge_function_test.cpp new file mode 100644 index 00000000000..5b72ccdba44 --- /dev/null +++ b/eval/src/tests/instruction/sparse_merge_function/sparse_merge_function_test.cpp @@ -0,0 +1,82 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include +#include +#include +#include +#include +#include + +using namespace vespalib::eval; +using namespace vespalib::eval::test; + +const ValueBuilderFactory &prod_factory = FastValueBuilderFactory::get(); +const ValueBuilderFactory &test_factory = SimpleValueBuilderFactory::get(); + +//----------------------------------------------------------------------------- + +EvalFixture::ParamRepo make_params() { + return EvalFixture::ParamRepo() + .add("scalar1", GenSpec().gen()) + .add("scalar2", GenSpec().seq_bias(2.0).gen()) + .add_variants("v1_x", GenSpec().map("x", 32, 1).seq_bias(3.0)) + .add_variants("v2_x", GenSpec().map("x", 16, 2).seq_bias(7.0)) + .add_variants("v3_xz", GenSpec().map("x", 16, 2).idx("z", 1).seq_bias(7.0)) + .add("dense", GenSpec().idx("x", 10).gen()) + .add("m1_xy", GenSpec().map("x", 32, 1).map("y", 16, 2).seq_bias(3.0).gen()) + .add("m2_xy", GenSpec().map("x", 16, 2).map("y", 32, 1).seq_bias(7.0).gen()) + .add("mixed", GenSpec().map("x", 8, 1).idx("y", 5).gen()); +} +EvalFixture::ParamRepo param_repo = make_params(); + +void assert_optimized(const vespalib::string &expr) { + EvalFixture fast_fixture(prod_factory, expr, param_repo, true); + EvalFixture test_fixture(test_factory, expr, param_repo, true); + EvalFixture slow_fixture(prod_factory, expr, param_repo, false); + EXPECT_EQ(fast_fixture.result(), EvalFixture::ref(expr, param_repo)); + EXPECT_EQ(test_fixture.result(), EvalFixture::ref(expr, param_repo)); + EXPECT_EQ(slow_fixture.result(), EvalFixture::ref(expr, param_repo)); + EXPECT_EQ(fast_fixture.find_all().size(), 1u); + EXPECT_EQ(test_fixture.find_all().size(), 1u); + EXPECT_EQ(slow_fixture.find_all().size(), 0u); +} + +void assert_not_optimized(const vespalib::string &expr) { + EvalFixture fast_fixture(prod_factory, expr, param_repo, true); + EXPECT_EQ(fast_fixture.result(), EvalFixture::ref(expr, param_repo)); + EXPECT_EQ(fast_fixture.find_all().size(), 0u); +} + +//----------------------------------------------------------------------------- + +TEST(SparseMerge, expression_can_be_optimized) +{ + assert_optimized("merge(v1_x,v2_x,f(x,y)(x+y))"); + assert_optimized("merge(v1_x,v2_x,f(x,y)(max(x,y)))"); + assert_optimized("merge(v1_x,v2_x,f(x,y)(x+y+1))"); + assert_optimized("merge(v1_x_f,v2_x_f,f(x,y)(x+y))"); + assert_optimized("merge(v3_xz,v3_xz,f(x,y)(x+y))"); +} + +TEST(SparseMerge, multi_dimensional_expression_can_be_optimized) +{ + assert_optimized("merge(m1_xy,m2_xy,f(x,y)(x+y))"); + assert_optimized("merge(m1_xy,m2_xy,f(x,y)(x*y))"); +} + +TEST(SparseMerge, similar_expressions_are_not_optimized) +{ + assert_not_optimized("merge(scalar1,scalar2,f(x,y)(x+y))"); + assert_not_optimized("merge(dense,dense,f(x,y)(x+y))"); + assert_not_optimized("merge(mixed,mixed,f(x,y)(x+y))"); +} + +TEST(SparseMerge, mixed_cell_types_are_not_optimized) +{ + assert_not_optimized("merge(v1_x,v2_x_f,f(x,y)(x+y))"); + assert_not_optimized("merge(v1_x_f,v2_x,f(x,y)(x+y))"); +} + +//----------------------------------------------------------------------------- + +GTEST_MAIN_RUN_ALL_TESTS() -- cgit v1.2.3