summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-02-04 13:22:07 +0000
committerArne Juul <arnej@verizonmedia.com>2021-02-04 13:48:13 +0000
commitea0834364360155fbd2606c4b550138cccaf1a86 (patch)
treeea86befffccfba7a3471a2061f2a35c4396f201b /eval
parente113b62ff818d6530b11f6c3164f32456f2b9fbf (diff)
add unit test for SparseMergeFunction
Diffstat (limited to 'eval')
-rw-r--r--eval/CMakeLists.txt1
-rw-r--r--eval/src/tests/instruction/sparse_merge_function/CMakeLists.txt9
-rw-r--r--eval/src/tests/instruction/sparse_merge_function/sparse_merge_function_test.cpp82
3 files changed, 92 insertions, 0 deletions
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 <vespa/eval/eval/fast_value.h>
+#include <vespa/eval/eval/simple_value.h>
+#include <vespa/eval/instruction/sparse_merge_function.h>
+#include <vespa/eval/eval/test/eval_fixture.h>
+#include <vespa/eval/eval/test/gen_spec.h>
+#include <vespa/vespalib/gtest/gtest.h>
+
+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<SparseMergeFunction>().size(), 1u);
+ EXPECT_EQ(test_fixture.find_all<SparseMergeFunction>().size(), 1u);
+ EXPECT_EQ(slow_fixture.find_all<SparseMergeFunction>().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<SparseMergeFunction>().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()