diff options
author | Tor Egge <Tor.Egge@yahoo-inc.com> | 2016-10-10 13:46:43 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahoo-inc.com> | 2016-10-10 13:46:43 +0000 |
commit | b8adfd0e81908054dacba530ad7f8e2af6e7bab7 (patch) | |
tree | f2662d7234f12896d299fc46f42c23cb5b5b623d /vespalib/src | |
parent | 21dcccb1ca7fa81b64a1f1fd78ca7af11cbd0884 (diff) |
Copy relevant tests from tensor operation tests (sparse tensors) to tensor
conformance test.
Don't treat empty label string specially when making tensor spec from
sparse tensor.
Diffstat (limited to 'vespalib/src')
3 files changed, 179 insertions, 5 deletions
diff --git a/vespalib/src/tests/tensor/sparse_tensor_builder/sparse_tensor_builder_test.cpp b/vespalib/src/tests/tensor/sparse_tensor_builder/sparse_tensor_builder_test.cpp index 39e82abec7d..0d157012a90 100644 --- a/vespalib/src/tests/tensor/sparse_tensor_builder/sparse_tensor_builder_test.cpp +++ b/vespalib/src/tests/tensor/sparse_tensor_builder/sparse_tensor_builder_test.cpp @@ -66,8 +66,8 @@ TEST("require that tensor can be converted to tensor spec") { Tensor::UP tensor = buildTensor(); TensorSpec expSpec("tensor(a{},b{},c{},d{})"); - expSpec.add({{"a", "1"}, {"b", "2"}}, 10). - add({{"c", "3"}, {"d", "4"}}, 20); + expSpec.add({{"a", "1"}, {"b", "2"}, {"c", ""}, {"d", ""}}, 10). + add({{"a", ""},{"b",""},{"c", "3"}, {"d", "4"}}, 20); TensorSpec actSpec = tensor->toSpec(); EXPECT_EQUAL(expSpec, actSpec); } diff --git a/vespalib/src/vespa/vespalib/eval/test/tensor_conformance.cpp b/vespalib/src/vespa/vespalib/eval/test/tensor_conformance.cpp index 00aee32b99a..3b0a0359b43 100644 --- a/vespalib/src/vespa/vespalib/eval/test/tensor_conformance.cpp +++ b/vespalib/src/vespa/vespalib/eval/test/tensor_conformance.cpp @@ -231,6 +231,16 @@ TensorSpec spec() { return spec(Layout({})); } +TensorSpec spec(const vespalib::string &type, + const std::vector<std::pair<TensorSpec::Address, TensorSpec::Value>> &cells) { + TensorSpec spec("tensor(" + type + ")"); + + for (const auto &cell : cells) { + spec.add(cell.first, cell.second); + } + return spec; +} + // abstract evaluation wrapper struct Eval { // typed result wrapper @@ -711,6 +721,171 @@ struct TestContext { //------------------------------------------------------------------------- + void test_apply_op(const Eval &eval, + const TensorSpec &expect, + const TensorSpec &lhs, + const TensorSpec &rhs) { + EXPECT_EQUAL(safe(eval).eval(engine, lhs, rhs).tensor(), expect); + } + + void test_fixed_sparse_cases_apply_op(const Eval &eval, + const BinaryOperation &op) + { + TEST_DO(test_apply_op(eval, + spec("x{}", {}), + spec("x{}", { { {{"x","1"}}, 3 } }), + spec("x{}", { { {{"x","2"}}, 5 } }))); + TEST_DO(test_apply_op(eval, + spec("x{}", { { {{"x","1"}}, op.eval(3,5) } }), + spec("x{}", { { {{"x","1"}}, 3 } }), + spec("x{}", { { {{"x","1"}}, 5 } }))); + TEST_DO(test_apply_op(eval, + spec("x{}", { { {{"x","1"}}, op.eval(3,-5) } }), + spec("x{}", { { {{"x","1"}}, 3 } }), + spec("x{}", { { {{"x","1"}}, -5 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","-"},{"y","2"},{"z","-"}}, + op.eval(5,7) }, + { {{"x","1"},{"y","-"},{"z","3"}}, + op.eval(3,11) } }), + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, 5 }, + { {{"x","1"},{"y","-"}}, 3 } }), + spec("y{},z{}", + { { {{"y","-"},{"z","3"}}, 11 }, + { {{"y","2"},{"z","-"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","-"},{"y","2"},{"z","-"}}, + op.eval(7,5) }, + { {{"x","1"},{"y","-"},{"z","3"}}, + op.eval(11,3) } }), + spec("y{},z{}", + { { {{"y","-"},{"z","3"}}, 11 }, + { {{"y","2"},{"z","-"}}, 7 } }), + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, 5 }, + { {{"x","1"},{"y","-"}}, 3 } }))); + TEST_DO(test_apply_op(eval, + spec("y{},z{}", + { { {{"y","2"},{"z","-"}}, + op.eval(5,7) } }), + spec("y{}", { { {{"y","2"}}, 5 } }), + spec("y{},z{}", + { { {{"y","-"},{"z","3"}}, 11 }, + { {{"y","2"},{"z","-"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("y{},z{}", + { { {{"y","2"},{"z","-"}}, + op.eval(7,5) } }), + spec("y{},z{}", + { { {{"y","-"},{"z","3"}}, 11 }, + { {{"y","2"},{"z","-"}}, 7 } }), + spec("y{}", { { {{"y","2"}}, 5 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, + op.eval(5,7) } }), + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, 5 }, + { {{"x","1"},{"y","-"}}, 3 } }), + spec("y{}", { { {{"y","2"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, + op.eval(7,5) } }), + spec("y{}", { { {{"y","2"}}, 7 } }), + spec("x{},y{}", + { { {{"x","-"},{"y","2"}}, 5 }, + { {{"x","1"},{"y","-"}}, 3 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},z{}", + { { {{"x","1"},{"z","3"}}, + op.eval(3,11) } }), + spec("x{}", { { {{"x","1"}}, 3 } }), + spec("z{}", { { {{"z","3"}}, 11 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},z{}", + { { {{"x","1"},{"z","3"}}, + op.eval(11,3) } }), + spec("z{}",{ { {{"z","3"}}, 11 } }), + spec("x{}",{ { {{"x","1"}}, 3 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{}", + { { {{"x","1"},{"y","1"}}, + op.eval(3,5) }, + { {{"x","2"},{"y","1"}}, + op.eval(7,5) } }), + spec("x{}", + { { {{"x","1"}}, 3 }, + { {{"x","2"}}, 7 } }), + spec("y{}", + { { {{"y","1"}}, 5 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","1"},{"y","1"},{"z","1"}}, + op.eval(1,7) }, + { {{"x","1"},{"y","1"},{"z","2"}}, + op.eval(1,13) }, + { {{"x","1"},{"y","2"},{"z","1"}}, + op.eval(5,11) }, + { {{"x","2"},{"y","1"},{"z","1"}}, + op.eval(3,7) }, + { {{"x","2"},{"y","1"},{"z","2"}}, + op.eval(3,13) } }), + spec("x{},y{}", + { { {{"x","1"},{"y","1"}}, 1 }, + { {{"x","1"},{"y","2"}}, 5 }, + { {{"x","2"},{"y","1"}}, 3 } }), + spec("y{},z{}", + { { {{"y","1"},{"z","1"}}, 7 }, + { {{"y","1"},{"z","2"}}, 13 }, + { {{"y","2"},{"z","1"}}, 11 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","1"},{"y","1"},{"z","1"}}, + op.eval(1,7) } }), + spec("x{},y{}", + { { {{"x","1"},{"y","-"}}, 5 }, + { {{"x","1"},{"y","1"}}, 1 } }), + spec("y{},z{}", + { { {{"y","1"},{"z","1"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","1"},{"y","-"},{"z","1"}}, + op.eval(5,11) }, + { {{"x","1"},{"y","1"},{"z","1"}}, + op.eval(1,7) } }), + spec("x{},y{}", + { { {{"x","1"},{"y","-"}}, 5 }, + { {{"x","1"},{"y","1"}}, 1 } }), + spec("y{},z{}", + { { {{"y","-"},{"z","1"}}, 11 }, + { {{"y","1"},{"z","1"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","1"},{"y","1"},{"z","1"}}, + op.eval(1,7) } }), + spec("x{},y{}", + { { {{"x","-"},{"y","-"}}, 5 }, + { {{"x","1"},{"y","1"}}, 1 } }), + spec("y{},z{}", + { { {{"y","1"},{"z","1"}}, 7 } }))); + TEST_DO(test_apply_op(eval, + spec("x{},y{},z{}", + { { {{"x","-"},{"y","-"},{"z", "-"}}, + op.eval(5,11) }, + { {{"x","1"},{"y","1"},{"z","1"}}, + op.eval(1,7) } }), + spec("x{},y{}", + { { {{"x","-"},{"y","-"}}, 5 }, + { {{"x","1"},{"y","1"}}, 1 } }), + spec("y{},z{}", + { { {{"y","-"},{"z","-"}}, 11 }, + { {{"y","1"},{"z","1"}}, 7 } }))); + } + void test_apply_op(const Eval &eval, const BinaryOperation &op, const Sequence &seq) { std::vector<Layout> layouts = { {}, {}, @@ -743,6 +918,7 @@ struct TestContext { TensorSpec expect = ImmediateApply(op).eval(ref_engine, lhs_input, rhs_input).tensor(); EXPECT_EQUAL(safe(eval).eval(engine, lhs_input, rhs_input).tensor(), expect); } + TEST_DO(test_fixed_sparse_cases_apply_op(eval, op)); } void test_apply_op(const vespalib::string &expr, const BinaryOperation &op, const Sequence &seq) { diff --git a/vespalib/src/vespa/vespalib/tensor/sparse/sparse_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/sparse/sparse_tensor.cpp index 5e7ec5b1db3..024d63572c6 100644 --- a/vespalib/src/vespa/vespalib/tensor/sparse/sparse_tensor.cpp +++ b/vespalib/src/vespa/vespalib/tensor/sparse/sparse_tensor.cpp @@ -223,9 +223,7 @@ buildAddress(const SparseTensor::Dimensions &dimensions, { for (const auto &dimension : dimensions) { auto label = decoder.decodeLabel(); - if (!label.empty()) { - address.emplace(std::make_pair(dimension, TensorSpec::Label(label))); - } + address.emplace(std::make_pair(dimension, TensorSpec::Label(label))); } assert(!decoder.valid()); } |