diff options
author | Arne Juul <arnej@verizonmedia.com> | 2020-10-13 14:11:28 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2020-10-15 08:18:59 +0000 |
commit | 08393e9e14635f1c6a6c84650c25023a0db7ed0b (patch) | |
tree | 48aae1605140fc6ff7d571084f345d33a3189c62 /searchlib | |
parent | 61eaea251e8cacd320ac10754ffd1513d8638043 (diff) |
handle both engine- and factory-based tensors
* use EngineOrFactory::get() instead of DefaultTensorEngine::ref()
* avoid direct use of DenseTensorView etc where possible
* use eval::Value instead of tensor::Tensor where possible
Diffstat (limited to 'searchlib')
51 files changed, 291 insertions, 353 deletions
diff --git a/searchlib/src/apps/vespa-ranking-expression-analyzer/vespa-ranking-expression-analyzer.cpp b/searchlib/src/apps/vespa-ranking-expression-analyzer/vespa-ranking-expression-analyzer.cpp index ae4b55948dc..51f243e1c37 100644 --- a/searchlib/src/apps/vespa-ranking-expression-analyzer/vespa-ranking-expression-analyzer.cpp +++ b/searchlib/src/apps/vespa-ranking-expression-analyzer/vespa-ranking-expression-analyzer.cpp @@ -9,6 +9,7 @@ #include <vespa/eval/eval/vm_forest.h> #include <vespa/eval/eval/fast_forest.h> #include <vespa/eval/eval/llvm/deinline_forest.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/vespalib/io/mapped_file_input.h> #include <vespa/eval/eval/param_usage.h> @@ -17,7 +18,6 @@ //----------------------------------------------------------------------------- using vespalib::BenchmarkTimer; -using vespalib::tensor::DefaultTensorEngine; using namespace vespalib::eval; using namespace vespalib::eval::nodes; using namespace vespalib::eval::gbdt; @@ -154,7 +154,7 @@ struct FunctionInfo { size_t get_path_len(const TreeList &trees) const { size_t path = 0; for (const Node *tree: trees) { - InterpretedFunction ifun(DefaultTensorEngine::ref(), *tree, NodeTypes()); + InterpretedFunction ifun(EngineOrFactory::get(), *tree, NodeTypes()); InterpretedFunction::Context ctx(ifun); SimpleParams fun_params(params); ifun.eval(ctx, fun_params); diff --git a/searchlib/src/tests/attribute/imported_attribute_vector/imported_attribute_vector_test.cpp b/searchlib/src/tests/attribute/imported_attribute_vector/imported_attribute_vector_test.cpp index 48a06bec9e8..387378659e9 100644 --- a/searchlib/src/tests/attribute/imported_attribute_vector/imported_attribute_vector_test.cpp +++ b/searchlib/src/tests/attribute/imported_attribute_vector/imported_attribute_vector_test.cpp @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/searchcommon/attribute/search_context_params.h> #include <vespa/searchlib/fef/termfieldmatchdata.h> @@ -11,17 +13,15 @@ using search::attribute::IAttributeVector; using search::tensor::ITensorAttribute; using search::tensor::TensorAttribute; +using vespalib::eval::Value; using vespalib::eval::ValueType; using vespalib::eval::TensorSpec; -using vespalib::tensor::Tensor; -using vespalib::tensor::DefaultTensorEngine; +using vespalib::eval::EngineOrFactory; -Tensor::UP createTensor(const TensorSpec &spec) { - auto value = DefaultTensorEngine::ref().from_spec(spec); - Tensor *tensor = dynamic_cast<Tensor*>(value.get()); - ASSERT_TRUE(tensor != nullptr); - value.release(); - return Tensor::UP(tensor); +Value::UP createTensor(const TensorSpec &spec) { + auto value = EngineOrFactory::get().from_spec(spec); + ASSERT_TRUE(value->is_tensor()); + return value; } namespace search::attribute { @@ -501,8 +501,8 @@ TEST("onSerializeForDescendingSort() is forwarded with remapped LID to target ve } struct TensorAttrFixture : Fixture { - std::shared_ptr<Tensor> tensor1; - std::shared_ptr<Tensor> tensor2; + std::shared_ptr<Value> tensor1; + std::shared_ptr<Value> tensor2; TensorAttrFixture(bool dense) : Fixture(), @@ -519,14 +519,14 @@ struct TensorAttrFixture : Fixture { tensor1 = createTensor(TensorSpec("tensor(x{})").add({{"x", "1"}}, 11)); tensor2 = createTensor(TensorSpec("tensor(x{})").add({{"x", "0"}}, 12)); } - const std::vector<ImportedAttributeFixture::LidToLidMapping<std::shared_ptr<Tensor>>> mappings = + const std::vector<ImportedAttributeFixture::LidToLidMapping<std::shared_ptr<Value>>> mappings = { {DocId(2), dummy_gid(3), DocId(3), tensor1 }, {DocId(4), dummy_gid(7), DocId(7), tensor2 } }; - this->template reset_with_tensor_reference_mappings<TensorAttribute, std::shared_ptr<Tensor>>( + this->template reset_with_tensor_reference_mappings<TensorAttribute, std::shared_ptr<Value>>( ValueType::from_spec(dense ? "tensor(x[2])" : "tensor(x{})"), mappings); } - Tensor::UP getTensor(DocId docId) { + Value::UP getTensor(DocId docId) { auto imp_attr = this->get_imported_attr(); const ITensorAttribute *tensorAttr = imp_attr->asTensorAttribute(); ASSERT_TRUE(tensorAttr != nullptr); @@ -536,7 +536,7 @@ struct TensorAttrFixture : Fixture { auto tensor = getTensor(docId); EXPECT_TRUE(!tensor); } - void assertTensor(DocId docId, const Tensor &expTensor) { + void assertTensor(DocId docId, const Value &expTensor) { auto tensor = getTensor(docId); ASSERT_TRUE(!!tensor); EXPECT_EQUAL(expTensor, *tensor); diff --git a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp index 3098232b443..82e1d5c2b48 100644 --- a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp +++ b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp @@ -1,5 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/eval/tensor/dense/dense_tensor_view.h> #include <vespa/searchcommon/attribute/iattributecontext.h> @@ -50,8 +51,9 @@ using search::queryeval::SearchIterator; using std::string; using std::vector; using vespalib::eval::TensorSpec; +using vespalib::eval::EngineOrFactory; +using vespalib::eval::Value; using vespalib::eval::ValueType; -using vespalib::tensor::DefaultTensorEngine; using namespace search::attribute; using namespace search; @@ -356,7 +358,7 @@ expect_nearest_neighbor_blueprint(const vespalib::string& attribute_tensor_type_ auto result = f.create_blueprint(); const auto& nearest = downcast<const NearestNeighborBlueprint>(*result); EXPECT_EQ(attribute_tensor_type_spec, nearest.get_attribute_tensor().getTensorType().to_spec()); - EXPECT_EQ(converted_query_tensor, DefaultTensorEngine::ref().to_spec(nearest.get_query_tensor())); + EXPECT_EQ(converted_query_tensor, EngineOrFactory::get().to_spec(nearest.get_query_tensor())); EXPECT_EQ(7u, nearest.get_target_num_hits()); } diff --git a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp index b4bf571c756..2de95e89da5 100644 --- a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp +++ b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp @@ -1,9 +1,9 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/document/base/exceptions.h> -#include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/dense/dense_tensor.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> #include <vespa/fastos/file.h> #include <vespa/searchlib/attribute/attribute_read_guard.h> #include <vespa/searchlib/attribute/attributeguard.h> @@ -50,36 +50,19 @@ using search::tensor::PrepareResult; using search::tensor::TensorAttribute; using vespalib::eval::TensorSpec; using vespalib::eval::ValueType; -using vespalib::tensor::DefaultTensorEngine; -using vespalib::tensor::DenseTensor; -using vespalib::tensor::DenseTensorView; -using vespalib::tensor::Tensor; +using vespalib::eval::Value; +using vespalib::eval::EngineOrFactory; using DoubleVector = std::vector<double>; using generation_t = vespalib::GenerationHandler::generation_t; -namespace vespalib::tensor { - -static bool operator==(const Tensor &lhs, const Tensor &rhs) -{ - return lhs.equals(rhs); -} - -} - vespalib::string sparseSpec("tensor(x{},y{})"); vespalib::string denseSpec("tensor(x[2],y[3])"); vespalib::string vec_2d_spec("tensor(x[2])"); -Tensor::UP createTensor(const TensorSpec &spec) { - auto value = DefaultTensorEngine::ref().from_spec(spec); - if (value->is_double()) { - return Tensor::UP(new DenseTensor<double>(ValueType::double_type(), {value->as_double()})); - } - Tensor *tensor = dynamic_cast<Tensor*>(value.get()); - ASSERT_TRUE(tensor != nullptr); - value.release(); - return Tensor::UP(tensor); +Value::UP createTensor(const TensorSpec &spec) { + auto value = EngineOrFactory::get().from_spec(spec); + return value; } TensorSpec @@ -418,7 +401,7 @@ struct Fixture { set_tensor_internal(docid, *_tensorAttr->getEmptyTensor()); } - void set_tensor_internal(uint32_t docId, const Tensor &tensor) { + void set_tensor_internal(uint32_t docId, const Value &tensor) { ensureSpace(docId); _tensorAttr->setTensor(docId, tensor); _attr->commit(); @@ -435,14 +418,14 @@ struct Fixture { void assertGetNoTensor(uint32_t docId) { AttributeGuard guard(_attr); - Tensor::UP actTensor = _tensorAttr->getTensor(docId); + Value::UP actTensor = _tensorAttr->getTensor(docId); EXPECT_FALSE(actTensor); } void assertGetTensor(const TensorSpec &expSpec, uint32_t docId) { - Tensor::UP expTensor = createTensor(expSpec); + Value::UP expTensor = createTensor(expSpec); AttributeGuard guard(_attr); - Tensor::UP actTensor = _tensorAttr->getTensor(docId); + Value::UP actTensor = _tensorAttr->getTensor(docId); EXPECT_TRUE(static_cast<bool>(actTensor)); EXPECT_EQUAL(*expTensor, *actTensor); } @@ -655,7 +638,7 @@ void Fixture::testEmptyTensor() { const TensorAttribute &tensorAttr = *_tensorAttr; - Tensor::UP emptyTensor = tensorAttr.getEmptyTensor(); + Value::UP emptyTensor = tensorAttr.getEmptyTensor(); if (_denseTensors) { vespalib::string expSpec = expEmptyDenseTensorSpec(); EXPECT_EQUAL(emptyTensor->type(), ValueType::from_spec(expSpec)); @@ -907,8 +890,6 @@ TEST_F("Nearest neighbor index type is added to attribute file header", DenseTen class NearestNeighborBlueprintFixture : public DenseTensorAttributeMockIndex { public: - using QueryTensor = DenseTensor<double>; - NearestNeighborBlueprintFixture() { set_tensor(1, vec_2d(1, 1)); set_tensor(2, vec_2d(2, 2)); @@ -922,12 +903,9 @@ public: set_tensor(10, vec_2d(0, 0)); } - std::unique_ptr<QueryTensor> createDenseTensor(const TensorSpec &spec) { - auto value = DefaultTensorEngine::ref().from_spec(spec); - QueryTensor *tensor = dynamic_cast<QueryTensor *>(value.get()); - ASSERT_TRUE(tensor != nullptr); - value.release(); - return std::unique_ptr<QueryTensor>(tensor); + std::unique_ptr<Value> createDenseTensor(const TensorSpec &spec) { + auto value = EngineOrFactory::get().from_spec(spec); + return value; } std::unique_ptr<NearestNeighborBlueprint> make_blueprint(double brute_force_limit = 0.05) { diff --git a/searchlib/src/tests/features/constant/constant_test.cpp b/searchlib/src/tests/features/constant/constant_test.cpp index e558839d2cf..e513e20a35c 100644 --- a/searchlib/src/tests/features/constant/constant_test.cpp +++ b/searchlib/src/tests/features/constant/constant_test.cpp @@ -1,14 +1,15 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/vespalib/testkit/test_kit.h> - +#include <iostream> #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/fef/fef.h> #include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/eval/eval/function.h> #include <vespa/eval/eval/tensor_spec.h> -#include <vespa/eval/tensor/tensor.h> -#include <vespa/eval/tensor/default_tensor_engine.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> using search::feature_t; using namespace search::fef; @@ -20,15 +21,13 @@ using vespalib::eval::Value; using vespalib::eval::DoubleValue; using vespalib::eval::TensorSpec; using vespalib::eval::ValueType; -using vespalib::tensor::DefaultTensorEngine; -using vespalib::tensor::Tensor; +using vespalib::eval::EngineOrFactory; namespace { -Tensor::UP make_tensor(const TensorSpec &spec) { - auto tensor = DefaultTensorEngine::ref().from_spec(spec); - return Tensor::UP(dynamic_cast<Tensor*>(tensor.release())); +Value::UP make_tensor(const TensorSpec &spec) { + return EngineOrFactory::get().from_spec(spec); } } @@ -44,12 +43,12 @@ struct ExecFixture setup_search_features(factory); } bool setup() { return test.setup(); } - const Tensor &extractTensor(uint32_t docid) { + const Value &extractTensor(uint32_t docid) { Value::CREF value = test.resolveObjectFeature(docid); ASSERT_TRUE(value.get().is_tensor()); - return static_cast<const Tensor &>(*value.get().as_tensor()); + return value.get(); } - const Tensor &executeTensor(uint32_t docId = 1) { + const Value &executeTensor(uint32_t docId = 1) { return extractTensor(docId); } double extractDouble(uint32_t docid) { @@ -63,7 +62,7 @@ struct ExecFixture void addTensor(const vespalib::string &name, const TensorSpec &spec) { - Tensor::UP tensor = make_tensor(spec); + Value::UP tensor = make_tensor(spec); ValueType type(tensor->type()); test.getIndexEnv().addConstantValue(name, std::move(type), diff --git a/searchlib/src/tests/features/imported_dot_product/imported_dot_product_test.cpp b/searchlib/src/tests/features/imported_dot_product/imported_dot_product_test.cpp index 2f710c5d6e1..3a755704c0d 100644 --- a/searchlib/src/tests/features/imported_dot_product/imported_dot_product_test.cpp +++ b/searchlib/src/tests/features/imported_dot_product/imported_dot_product_test.cpp @@ -6,8 +6,7 @@ #include <vespa/searchlib/fef/test/ftlib.h> #include <vespa/searchlib/fef/test/rankresult.h> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> -#include <vespa/eval/tensor/tensor.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/vespalib/objects/nbostream.h> #include <vespa/eval/tensor/dense/dense_tensor.h> @@ -108,9 +107,9 @@ struct ArrayFixture : FixtureBase { } template <typename ExpectedType> - void check_prepare_state_output(const vespalib::tensor::Tensor & tensor, const ExpectedType & expected) { + void check_prepare_state_output(const vespalib::eval::Value & tensor, const ExpectedType & expected) { vespalib::nbostream os; - vespalib::tensor::TypedBinaryFormat::serialize(os, tensor); + vespalib::eval::EngineOrFactory::get().encode(tensor, os); vespalib::string input_vector(os.data(), os.size()); check_prepare_state_output(".tensor", input_vector, expected); } diff --git a/searchlib/src/tests/features/tensor/tensor_test.cpp b/searchlib/src/tests/features/tensor/tensor_test.cpp index 18efd69d0b9..116b4ed2bb5 100644 --- a/searchlib/src/tests/features/tensor/tensor_test.cpp +++ b/searchlib/src/tests/features/tensor/tensor_test.cpp @@ -11,11 +11,11 @@ #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/tensor/tensor_attribute.h> #include <vespa/searchlib/tensor/direct_tensor_attribute.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/eval/function.h> #include <vespa/eval/eval/tensor_spec.h> -#include <vespa/eval/tensor/tensor.h> -#include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> #include <vespa/eval/tensor/test/test_utils.h> #include <vespa/vespalib/objects/nbostream.h> @@ -28,12 +28,11 @@ using search::AttributeFactory; using search::tensor::TensorAttribute; using search::tensor::DirectTensorAttribute; using search::AttributeVector; +using vespalib::eval::EngineOrFactory; using vespalib::eval::Function; using vespalib::eval::Value; using vespalib::eval::ValueType; using vespalib::eval::TensorSpec; -using vespalib::tensor::DefaultTensorEngine; -using vespalib::tensor::Tensor; using vespalib::tensor::test::makeTensor; using AVC = search::attribute::Config; @@ -46,8 +45,8 @@ using CollectionType = FieldInfo::CollectionType; namespace { -Tensor::UP make_empty(const vespalib::string &type) { - return makeTensor<Tensor>(TensorSpec(type)); +Value::UP make_empty(const vespalib::string &type) { + return EngineOrFactory::get().from_spec(TensorSpec(type)); } } @@ -114,7 +113,7 @@ struct ExecFixture DirectTensorAttribute *directAttr = dynamic_cast<DirectTensorAttribute *>(attrs[1].get()); - auto doc_tensor = makeTensor<Tensor>(TensorSpec("tensor(x{})") + auto doc_tensor = makeTensor<Value>(TensorSpec("tensor(x{})") .add({{"x", "a"}}, 3) .add({{"x", "b"}}, 5) .add({{"x", "c"}}, 7)); @@ -127,10 +126,10 @@ struct ExecFixture } void setQueryTensor(const vespalib::string &tensorName, const vespalib::string &tensorTypeSpec, - std::unique_ptr<Tensor> tensor) + std::unique_ptr<Value> tensor) { vespalib::nbostream stream; - vespalib::tensor::TypedBinaryFormat::serialize(stream, *tensor); + EngineOrFactory::get().encode(*tensor, stream); test.getQueryEnv().getProperties().add(tensorName, vespalib::stringref(stream.peek(), stream.size())); setQueryTensorType(tensorName, tensorTypeSpec); @@ -139,24 +138,24 @@ struct ExecFixture void setupQueryEnvironment() { setQueryTensor("tensorquery", "tensor(q{})", - makeTensor<Tensor>(TensorSpec("tensor(q{})") + makeTensor<Value>(TensorSpec("tensor(q{})") .add({{"q", "d"}}, 11 ) .add({{"q", "e"}}, 13 ) .add({{"q", "f"}}, 17 ))); setQueryTensor("mappedtensorquery", "tensor(x[2])", - makeTensor<Tensor>(TensorSpec("tensor(x{},y{})") + makeTensor<Value>(TensorSpec("tensor(x{},y{})") .add({{"x", "0"},{"y", "0"}}, 11 ) .add({{"x", "0"},{"y", "1"}}, 13 ) .add({{"x", "1"},{"y", "0"}}, 17 ))); setQueryTensorType("null", "tensor(q{})"); } - const Tensor &extractTensor(uint32_t docid) { + const Value &extractTensor(uint32_t docid) { Value::CREF value = test.resolveObjectFeature(docid); ASSERT_TRUE(value.get().is_tensor()); - return static_cast<const Tensor &>(*value.get().as_tensor()); + return value.get(); } - const Tensor &execute(uint32_t docId = 1) { + const Value &execute(uint32_t docId = 1) { return extractTensor(docId); } }; @@ -164,7 +163,7 @@ struct ExecFixture TEST_F("require that tensor attribute can be extracted as tensor in attribute feature", ExecFixture("attribute(tensorattr)")) { - EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(x{})") + EXPECT_EQUAL(*makeTensor<Value>(TensorSpec("tensor(x{})") .add({{"x", "b"}}, 5) .add({{"x", "c"}}, 7) .add({{"x", "a"}}, 3)), f.execute()); @@ -173,7 +172,7 @@ TEST_F("require that tensor attribute can be extracted as tensor in attribute fe TEST_F("require that direct tensor attribute can be extracted in attribute feature", ExecFixture("attribute(directattr)")) { - EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(x{})") + EXPECT_EQUAL(*makeTensor<Value>(TensorSpec("tensor(x{})") .add({{"x", "b"}}, 5) .add({{"x", "c"}}, 7) .add({{"x", "a"}}, 3)), f.execute()); @@ -182,7 +181,7 @@ TEST_F("require that direct tensor attribute can be extracted in attribute featu TEST_F("require that tensor from query can be extracted as tensor in query feature", ExecFixture("query(tensorquery)")) { - EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(q{})") + EXPECT_EQUAL(*makeTensor<Value>(TensorSpec("tensor(q{})") .add({{"q", "f"}}, 17) .add({{"q", "d"}}, 11) .add({{"q", "e"}}, 13)), f.execute()); @@ -218,7 +217,7 @@ TEST_F("require that empty tensor with correct type is returned by direct tensor TEST_F("require that wrong tensor type from query tensor gives empty tensor", ExecFixture("query(mappedtensorquery)")) { - EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(x[2])") + EXPECT_EQUAL(*makeTensor<Value>(TensorSpec("tensor(x[2])") .add({{"x", 0}}, 0) .add({{"x", 1}}, 0)), f.execute()); } diff --git a/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp b/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp index d2fc79f8fa2..6b43f97354f 100644 --- a/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp +++ b/searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp @@ -12,9 +12,10 @@ #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/eval/function.h> -#include <vespa/eval/tensor/tensor.h> -#include <vespa/eval/tensor/default_tensor_engine.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> using search::feature_t; using namespace search::fef; @@ -26,8 +27,7 @@ using search::StringAttribute; using vespalib::eval::Value; using vespalib::eval::Function; using vespalib::eval::TensorSpec; -using vespalib::tensor::DefaultTensorEngine; -using vespalib::tensor::Tensor; +using vespalib::eval::EngineOrFactory; typedef search::attribute::Config AVC; typedef search::attribute::BasicType AVBT; @@ -35,12 +35,12 @@ typedef search::attribute::CollectionType AVCT; typedef search::AttributeVector::SP AttributePtr; typedef FtTestApp FTA; -Tensor::UP make_tensor(const TensorSpec &spec) { - auto tensor = DefaultTensorEngine::ref().from_spec(spec); - return Tensor::UP(dynamic_cast<Tensor*>(tensor.release())); +Value::UP make_tensor(const TensorSpec &spec) { + auto tensor = EngineOrFactory::get().from_spec(spec); + return tensor; } -Tensor::UP make_empty(const vespalib::string &type) { +Value::UP make_empty(const vespalib::string &type) { return make_tensor(TensorSpec(type)); } @@ -121,12 +121,12 @@ struct ExecFixture test.getQueryEnv().getProperties().add("astr_query", "[d e f e]"); test.getQueryEnv().getProperties().add("aint_query", "[11 13 17]"); } - const Tensor &extractTensor(uint32_t docid) { + const Value &extractTensor(uint32_t docid) { Value::CREF value = test.resolveObjectFeature(docid); ASSERT_TRUE(value.get().is_tensor()); - return static_cast<const Tensor &>(*value.get().as_tensor()); + return value.get(); } - const Tensor &execute() { + const Value &execute() { return extractTensor(1); } }; diff --git a/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp b/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp index e0eee954a53..40a5b8a8cc7 100644 --- a/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp +++ b/searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp @@ -12,10 +12,11 @@ #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/eval/function.h> #include <vespa/eval/eval/tensor_spec.h> -#include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/test/value_compare.h> using search::feature_t; using namespace search::fef; @@ -27,8 +28,7 @@ using search::StringAttribute; using vespalib::eval::Value; using vespalib::eval::Function; using vespalib::eval::TensorSpec; -using vespalib::tensor::Tensor; -using vespalib::tensor::DefaultTensorEngine; +using vespalib::eval::EngineOrFactory; typedef search::attribute::Config AVC; typedef search::attribute::BasicType AVBT; @@ -36,12 +36,12 @@ typedef search::attribute::CollectionType AVCT; typedef search::AttributeVector::SP AttributePtr; typedef FtTestApp FTA; -Tensor::UP make_tensor(const TensorSpec &spec) { - auto tensor = DefaultTensorEngine::ref().from_spec(spec); - return Tensor::UP(dynamic_cast<Tensor*>(tensor.release())); +Value::UP make_tensor(const TensorSpec &spec) { + auto tensor = EngineOrFactory::get().from_spec(spec); + return tensor; } -Tensor::UP make_empty(const vespalib::string &type) { +Value::UP make_empty(const vespalib::string &type) { return make_tensor(TensorSpec(type)); } @@ -120,12 +120,12 @@ struct ExecFixture void setupQueryEnvironment() { test.getQueryEnv().getProperties().add("wsquery", "{d:11,e:13,f:17}"); } - const Tensor &extractTensor(uint32_t docid) { + const Value &extractTensor(uint32_t docid) { Value::CREF value = test.resolveObjectFeature(docid); ASSERT_TRUE(value.get().is_tensor()); - return static_cast<const Tensor &>(*value.get().as_tensor()); + return value.get(); } - const Tensor &execute() { + const Value &execute() { return extractTensor(1); } }; diff --git a/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp b/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp index e8c83b8548a..0a28f0a4c17 100644 --- a/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp +++ b/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp @@ -3,9 +3,7 @@ #include <vespa/vespalib/testkit/test_kit.h> #include <vespa/vespalib/util/stringfmt.h> -#include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/dense/dense_tensor.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/searchlib/common/bitvector.h> #include <vespa/searchlib/common/feature.h> #include <vespa/searchlib/fef/matchdata.h> @@ -25,12 +23,11 @@ using search::feature_t; using search::tensor::DenseTensorAttribute; using search::AttributeVector; using search::BitVector; +using vespalib::eval::Value; using vespalib::eval::ValueType; using CellType = vespalib::eval::ValueType::CellType; using vespalib::eval::TensorSpec; -using vespalib::tensor::Tensor; -using vespalib::tensor::DenseTensorView; -using vespalib::tensor::DefaultTensorEngine; +using vespalib::eval::EngineOrFactory; using search::tensor::DistanceFunction; using search::attribute::DistanceMetric; @@ -43,15 +40,13 @@ vespalib::string denseSpecFloat("tensor<float>(x[2])"); DistanceFunction::UP euclid_d = search::tensor::make_distance_function(DistanceMetric::Euclidean, CellType::DOUBLE); DistanceFunction::UP euclid_f = search::tensor::make_distance_function(DistanceMetric::Euclidean, CellType::FLOAT); -std::unique_ptr<DenseTensorView> createTensor(const TensorSpec &spec) { - auto value = DefaultTensorEngine::ref().from_spec(spec); - DenseTensorView *tensor = dynamic_cast<DenseTensorView*>(value.get()); - ASSERT_TRUE(tensor != nullptr); - value.release(); - return std::unique_ptr<DenseTensorView>(tensor); +std::unique_ptr<Value> createTensor(const TensorSpec &spec) { + auto value = EngineOrFactory::get().from_spec(spec); + ASSERT_TRUE(value->is_tensor()); + return value; } -std::unique_ptr<DenseTensorView> createTensor(const vespalib::string& type_spec, double v1, double v2) { +std::unique_ptr<Value> createTensor(const vespalib::string& type_spec, double v1, double v2) { return createTensor(TensorSpec(type_spec).add({{"x", 0}}, v1) .add({{"x", 1}}, v2)); } @@ -106,7 +101,7 @@ struct Fixture } } - void setTensor(uint32_t docId, const Tensor &tensor) { + void setTensor(uint32_t docId, const Value &tensor) { ensureSpace(docId); _tensorAttr->setTensor(docId, tensor); _attr->commit(); @@ -127,7 +122,7 @@ struct Fixture }; template <bool strict> -SimpleResult find_matches(Fixture &env, const DenseTensorView &qtv) { +SimpleResult find_matches(Fixture &env, const Value &qtv) { auto md = MatchData::makeTestInstance(2, 2); auto &tfmd = *(md->resolveTermField(0)); auto &attr = *(env._tensorAttr); @@ -205,7 +200,7 @@ TEST("require that NearestNeighborIterator returns filtered results") { } template <bool strict> -std::vector<feature_t> get_rawscores(Fixture &env, const DenseTensorView &qtv) { +std::vector<feature_t> get_rawscores(Fixture &env, const Value &qtv) { auto md = MatchData::makeTestInstance(2, 2); auto &tfmd = *(md->resolveTermField(0)); auto &attr = *(env._tensorAttr); diff --git a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp index 1d80fec720a..f2470fd0319 100644 --- a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp +++ b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp @@ -3,26 +3,28 @@ LOG_SETUP("dense_tensor_store_test"); #include <vespa/vespalib/testkit/test_kit.h> #include <vespa/searchlib/tensor/dense_tensor_store.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/eval/tensor_spec.h> +#include <vespa/eval/eval/test/value_compare.h> +#include <vespa/eval/eval/value.h> #include <vespa/eval/eval/value_type.h> #include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/tensor/dense/mutable_dense_tensor_view.h> using search::tensor::DenseTensorStore; using vespalib::eval::TensorSpec; +using vespalib::eval::Value; using vespalib::eval::ValueType; +using vespalib::eval::EngineOrFactory; using vespalib::tensor::MutableDenseTensorView; -using vespalib::tensor::Tensor; -using vespalib::tensor::DefaultTensorEngine; using EntryRef = DenseTensorStore::EntryRef; -Tensor::UP +Value::UP makeTensor(const TensorSpec &spec) { - auto tensor = DefaultTensorEngine::ref().from_spec(spec); - return Tensor::UP(dynamic_cast<Tensor *>(tensor.release())); + auto tensor = EngineOrFactory::get().from_spec(spec); + return tensor; } struct Fixture @@ -32,23 +34,23 @@ struct Fixture : store(ValueType::from_spec(tensorType)) {} void assertSetAndGetTensor(const TensorSpec &tensorSpec) { - Tensor::UP expTensor = makeTensor(tensorSpec); + Value::UP expTensor = makeTensor(tensorSpec); EntryRef ref = store.setTensor(*expTensor); - Tensor::UP actTensor = store.getTensor(ref); - EXPECT_EQUAL(expTensor->toSpec(), actTensor->toSpec()); + Value::UP actTensor = store.getTensor(ref); + EXPECT_EQUAL(*expTensor, *actTensor); assertTensorView(ref, *expTensor); } void assertEmptyTensor(const TensorSpec &tensorSpec) { - Tensor::UP expTensor = makeTensor(tensorSpec); + Value::UP expTensor = makeTensor(tensorSpec); EntryRef ref; - Tensor::UP actTensor = store.getTensor(ref); + Value::UP actTensor = store.getTensor(ref); EXPECT_TRUE(actTensor.get() == nullptr); assertTensorView(ref, *expTensor); } - void assertTensorView(EntryRef ref, const Tensor &expTensor) { + void assertTensorView(EntryRef ref, const Value &expTensor) { MutableDenseTensorView actTensor(store.type()); store.getTensor(ref, actTensor); - EXPECT_EQUAL(expTensor.toSpec(), actTensor.toSpec()); + EXPECT_EQUAL(expTensor, actTensor); } }; diff --git a/searchlib/src/tests/tensor/direct_tensor_store/direct_tensor_store_test.cpp b/searchlib/src/tests/tensor/direct_tensor_store/direct_tensor_store_test.cpp index 5a815a96dfb..4eb2c935234 100644 --- a/searchlib/src/tests/tensor/direct_tensor_store/direct_tensor_store_test.cpp +++ b/searchlib/src/tests/tensor/direct_tensor_store/direct_tensor_store_test.cpp @@ -2,30 +2,28 @@ #include <vespa/searchlib/tensor/direct_tensor_store.h> #include <vespa/vespalib/gtest/gtest.h> -#include <vespa/eval/tensor/default_tensor_engine.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> #include <vespa/vespalib/datastore/datastore.hpp> using namespace search::tensor; using vespalib::datastore::EntryRef; +using vespalib::eval::EngineOrFactory; using vespalib::eval::TensorSpec; -using vespalib::tensor::DefaultTensorEngine; -using vespalib::tensor::Tensor; +using vespalib::eval::Value; vespalib::string tensor_spec("tensor(x{})"); -Tensor::UP +Value::UP make_tensor(const TensorSpec& spec) { - auto value = DefaultTensorEngine::ref().from_spec(spec); - auto* tensor = dynamic_cast<Tensor*>(value.get()); - assert(tensor != nullptr); - value.release(); - return Tensor::UP(tensor); + auto value = EngineOrFactory::get().from_spec(spec); + assert(value->is_tensor()); + return value; } -Tensor::UP +Value::UP make_tensor(double value) { return make_tensor(TensorSpec(tensor_spec).add({{"x", "a"}}, value)); @@ -41,7 +39,7 @@ public: store.clearHoldLists(); } - void expect_tensor(const Tensor* exp, EntryRef ref) { + void expect_tensor(const Value* exp, EntryRef ref) { const auto* act = store.get_tensor(ref); ASSERT_TRUE(act); EXPECT_EQ(exp, act); diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp index bc0b5366fac..b8110b4556d 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp @@ -82,7 +82,6 @@ using search::tensor::DenseTensorAttribute; using vespalib::geo::ZCurve; using vespalib::make_string; using vespalib::string; -using vespalib::tensor::DenseTensorView; namespace search { namespace { @@ -724,19 +723,17 @@ public: if (query_tensor.get() == nullptr) { return fail_nearest_neighbor_term(n, "Query tensor was not found in request context"); } - auto* dense_query_tensor = dynamic_cast<DenseTensorView*>(query_tensor.get()); - if (dense_query_tensor == nullptr) { + const auto & qt_type = query_tensor->type(); + if (! qt_type.is_dense()) { return fail_nearest_neighbor_term(n, make_string("Query tensor is not a dense tensor (type=%s)", query_tensor->type().to_spec().c_str())); } - if (!is_compatible_for_nearest_neighbor(dense_attr_tensor->getTensorType(), dense_query_tensor->type())) { + if (!is_compatible_for_nearest_neighbor(dense_attr_tensor->getTensorType(), qt_type)) { return fail_nearest_neighbor_term(n, make_string("Attribute tensor type (%s) and query tensor type (%s) are not compatible", - dense_attr_tensor->getTensorType().to_spec().c_str(), dense_query_tensor->type().to_spec().c_str())); + dense_attr_tensor->getTensorType().to_spec().c_str(), query_tensor->type().to_spec().c_str())); } - std::unique_ptr<DenseTensorView> dense_query_tensor_up(dense_query_tensor); - query_tensor.release(); setResult(std::make_unique<queryeval::NearestNeighborBlueprint>(_field, *dense_attr_tensor, - std::move(dense_query_tensor_up), + std::move(query_tensor), n.get_target_num_hits(), n.get_allow_approximate(), n.get_explore_additional_hits(), diff --git a/searchlib/src/vespa/searchlib/features/constant_tensor_executor.h b/searchlib/src/vespa/searchlib/features/constant_tensor_executor.h index 785eb357795..44e530821a2 100644 --- a/searchlib/src/vespa/searchlib/features/constant_tensor_executor.h +++ b/searchlib/src/vespa/searchlib/features/constant_tensor_executor.h @@ -6,6 +6,7 @@ #include <vespa/eval/eval/tensor_spec.h> #include <vespa/eval/eval/value.h> #include <vespa/eval/eval/value_type.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/vespalib/util/stash.h> @@ -27,11 +28,11 @@ public: void execute(uint32_t) override { outputs().set_object(0, *_tensor); } - static fef::FeatureExecutor &create(std::unique_ptr<vespalib::eval::Tensor> tensor, vespalib::Stash &stash) { + static fef::FeatureExecutor &create(std::unique_ptr<vespalib::eval::Value> tensor, vespalib::Stash &stash) { return stash.create<ConstantTensorExecutor>(std::move(tensor)); } static fef::FeatureExecutor &createEmpty(const vespalib::eval::ValueType &valueType, vespalib::Stash &stash) { - const auto &engine = vespalib::tensor::DefaultTensorEngine::ref(); + const auto engine = vespalib::eval::EngineOrFactory::get(); auto spec = vespalib::eval::TensorSpec(valueType.to_spec()); return stash.create<ConstantTensorExecutor>(engine.from_spec(spec)); } diff --git a/searchlib/src/vespa/searchlib/features/dense_tensor_attribute_executor.cpp b/searchlib/src/vespa/searchlib/features/dense_tensor_attribute_executor.cpp index 3dfba3092cd..8f7d82adadd 100644 --- a/searchlib/src/vespa/searchlib/features/dense_tensor_attribute_executor.cpp +++ b/searchlib/src/vespa/searchlib/features/dense_tensor_attribute_executor.cpp @@ -4,7 +4,6 @@ #include <vespa/searchlib/tensor/i_tensor_attribute.h> using search::tensor::ITensorAttribute; -using vespalib::eval::Tensor; using vespalib::tensor::MutableDenseTensorView; namespace search::features { diff --git a/searchlib/src/vespa/searchlib/features/direct_tensor_attribute_executor.cpp b/searchlib/src/vespa/searchlib/features/direct_tensor_attribute_executor.cpp index 56765bd168f..0463b253740 100644 --- a/searchlib/src/vespa/searchlib/features/direct_tensor_attribute_executor.cpp +++ b/searchlib/src/vespa/searchlib/features/direct_tensor_attribute_executor.cpp @@ -1,7 +1,6 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "direct_tensor_attribute_executor.h" -#include <vespa/eval/tensor/tensor.h> #include <vespa/searchlib/tensor/i_tensor_attribute.h> namespace search::features { diff --git a/searchlib/src/vespa/searchlib/features/onnx_feature.cpp b/searchlib/src/vespa/searchlib/features/onnx_feature.cpp index fca8988ba36..e40b6ebf3e4 100644 --- a/searchlib/src/vespa/searchlib/features/onnx_feature.cpp +++ b/searchlib/src/vespa/searchlib/features/onnx_feature.cpp @@ -21,7 +21,6 @@ using search::fef::ParameterList; using vespalib::Stash; using vespalib::eval::ValueType; using vespalib::make_string_short::fmt; -using vespalib::tensor::DenseTensorView; using vespalib::tensor::MutableDenseTensorView; using vespalib::tensor::Onnx; diff --git a/searchlib/src/vespa/searchlib/features/queryfeature.cpp b/searchlib/src/vespa/searchlib/features/queryfeature.cpp index 12cad613a80..9cded69d5de 100644 --- a/searchlib/src/vespa/searchlib/features/queryfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/queryfeature.cpp @@ -11,8 +11,6 @@ #include <vespa/searchlib/fef/properties.h> #include <vespa/searchlib/fef/feature_type.h> #include <vespa/vespalib/objects/nbostream.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/eval/value_type.h> #include <vespa/vespalib/locale/c.h> #include <cerrno> @@ -121,7 +119,7 @@ createTensorExecutor(const IQueryEnvironment &env, if (prop.found() && !prop.get().empty()) { const vespalib::string &value = prop.get(); vespalib::nbostream stream(value.data(), value.size()); - auto tensor = vespalib::tensor::TypedBinaryFormat::deserialize(stream); + auto tensor = vespalib::eval::EngineOrFactory::get().decode(stream); if (!TensorDataType::isAssignableType(valueType, tensor->type())) { LOG(warning, "Query feature type is '%s' but other tensor type is '%s'", valueType.to_spec().c_str(), tensor->type().to_spec().c_str()); diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp index bf0a731eaef..c8cc573c0d2 100644 --- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp @@ -5,6 +5,7 @@ #include <vespa/searchlib/fef/properties.h> #include <vespa/searchlib/fef/indexproperties.h> #include <vespa/searchlib/features/rankingexpression/feature_name_extractor.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/eval/eval/param_usage.h> @@ -17,6 +18,7 @@ using vespalib::ConstArrayRef; using vespalib::eval::CompileCache; using vespalib::eval::CompiledFunction; using vespalib::eval::DoubleValue; +using vespalib::eval::EngineOrFactory; using vespalib::eval::Function; using vespalib::eval::InterpretedFunction; using vespalib::eval::LazyParams; @@ -25,7 +27,6 @@ using vespalib::eval::PassParams; using vespalib::eval::Value; using vespalib::eval::ValueType; using vespalib::eval::gbdt::FastForest; -using vespalib::tensor::DefaultTensorEngine; namespace search::features { @@ -325,7 +326,8 @@ RankingExpressionBlueprint::setup(const fef::IIndexEnvironment &env, } } } else { - _interpreted_function.reset(new InterpretedFunction(DefaultTensorEngine::ref(), *rank_function, node_types)); + _interpreted_function.reset(new InterpretedFunction(EngineOrFactory::get(), + *rank_function, node_types)); } } FeatureType output_type = do_compile diff --git a/searchlib/src/vespa/searchlib/features/tensor_attribute_executor.h b/searchlib/src/vespa/searchlib/features/tensor_attribute_executor.h index be900e8a3e7..f22922e4d12 100644 --- a/searchlib/src/vespa/searchlib/features/tensor_attribute_executor.h +++ b/searchlib/src/vespa/searchlib/features/tensor_attribute_executor.h @@ -5,8 +5,6 @@ #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/searchlib/fef/featureexecutor.h> #include <vespa/eval/eval/value.h> -#include <vespa/eval/eval/tensor.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/vespalib/stllike/string.h> namespace search::tensor { class ITensorAttribute; } @@ -16,8 +14,8 @@ class TensorAttributeExecutor : public fef::FeatureExecutor { private: const search::tensor::ITensorAttribute& _attribute; - std::unique_ptr<vespalib::eval::Tensor> _emptyTensor; - std::unique_ptr<vespalib::eval::Tensor> _tensor; + std::unique_ptr<vespalib::eval::Value> _emptyTensor; + std::unique_ptr<vespalib::eval::Value> _tensor; public: TensorAttributeExecutor(const search::tensor::ITensorAttribute& attribute); diff --git a/searchlib/src/vespa/searchlib/features/tensor_from_attribute_executor.h b/searchlib/src/vespa/searchlib/features/tensor_from_attribute_executor.h index aae3d773820..a6d3de54d00 100644 --- a/searchlib/src/vespa/searchlib/features/tensor_from_attribute_executor.h +++ b/searchlib/src/vespa/searchlib/features/tensor_from_attribute_executor.h @@ -5,7 +5,6 @@ #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/eval/eval/value.h> #include <vespa/vespalib/stllike/string.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/tensor/sparse/direct_sparse_tensor_builder.h> namespace search::features { @@ -21,7 +20,7 @@ private: const search::attribute::IAttributeVector *_attribute; vespalib::eval::ValueType _type; WeightedBufferType _attrBuffer; - std::unique_ptr<vespalib::tensor::Tensor> _tensor; + std::unique_ptr<vespalib::eval::Value> _tensor; public: TensorFromAttributeExecutor(const search::attribute::IAttributeVector *attribute, diff --git a/searchlib/src/vespa/searchlib/features/tensor_from_weighted_set_feature.cpp b/searchlib/src/vespa/searchlib/features/tensor_from_weighted_set_feature.cpp index 5926c91c7c5..8c290e1f2b0 100644 --- a/searchlib/src/vespa/searchlib/features/tensor_from_weighted_set_feature.cpp +++ b/searchlib/src/vespa/searchlib/features/tensor_from_weighted_set_feature.cpp @@ -12,8 +12,8 @@ #include <vespa/searchcommon/attribute/attributecontent.h> #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/eval/eval/function.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/eval/value_type.h> +#include <vespa/eval/tensor/sparse/direct_sparse_tensor_builder.h> #include <vespa/log/log.h> LOG_SETUP(".features.tensor_from_weighted_set_feature"); diff --git a/searchlib/src/vespa/searchlib/index/docbuilder.cpp b/searchlib/src/vespa/searchlib/index/docbuilder.cpp index b79aa423413..a5557a59464 100644 --- a/searchlib/src/vespa/searchlib/index/docbuilder.cpp +++ b/searchlib/src/vespa/searchlib/index/docbuilder.cpp @@ -6,7 +6,7 @@ #include <vespa/fastlib/text/unicodeutil.h> #include <vespa/vespalib/geo/zcurve.h> #include <vespa/vespalib/text/utf8.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> #include <vespa/vespalib/data/slime/slime.h> using namespace document; @@ -74,7 +74,7 @@ void insertPredicate(const Schema::Field &sfield, void insertTensor(const Schema::Field &schemaField, document::FieldValue *fvalue, - std::unique_ptr<vespalib::tensor::Tensor> val) { + std::unique_ptr<vespalib::eval::Value> val) { if (schemaField.getDataType() == schema::DataType::TENSOR) { *(dynamic_cast<TensorFieldValue *>(fvalue)) = std::move(val); } else { @@ -539,7 +539,7 @@ DocBuilder::AttributeFieldHandle::addPredicate( void DocBuilder::AttributeFieldHandle::addTensor( - std::unique_ptr<vespalib::tensor::Tensor> val) + std::unique_ptr<vespalib::eval::Value> val) { if (_element) { insertTensor(_sfield, _element.get(), std::move(val)); @@ -773,7 +773,7 @@ DocBuilder::addPredicate(std::unique_ptr<vespalib::Slime> val) } DocBuilder & -DocBuilder::addTensor(std::unique_ptr<vespalib::tensor::Tensor> val) +DocBuilder::addTensor(std::unique_ptr<vespalib::eval::Value> val) { assert(_currDoc != nullptr); _currDoc->getFieldHandle()->addTensor(std::move(val)); diff --git a/searchlib/src/vespa/searchlib/index/docbuilder.h b/searchlib/src/vespa/searchlib/index/docbuilder.h index 3aaeb26146b..4b22e35e5c9 100644 --- a/searchlib/src/vespa/searchlib/index/docbuilder.h +++ b/searchlib/src/vespa/searchlib/index/docbuilder.h @@ -13,7 +13,7 @@ #include <vespa/vespalib/util/exception.h> #include <vespa/vespalib/util/stringfmt.h> -namespace vespalib::tensor { class Tensor; } +namespace vespalib::eval { class Value; } namespace search::index { @@ -96,7 +96,7 @@ private: virtual void addPredicate(std::unique_ptr<vespalib::Slime>) { throw Error("Function not supported"); } - virtual void addTensor(std::unique_ptr<vespalib::tensor::Tensor>) { + virtual void addTensor(std::unique_ptr<vespalib::eval::Value>) { throw Error("Function not supported"); } const document::FieldValue::UP & getValue() const { return _value; } @@ -203,7 +203,7 @@ private: void addInt(int64_t val) override; void addFloat(double val) override; void addPredicate(std::unique_ptr<vespalib::Slime> val) override; - void addTensor(std::unique_ptr<vespalib::tensor::Tensor> val) override; + void addTensor(std::unique_ptr<vespalib::eval::Value> val) override; void addPosition(int32_t xpos, int32_t ypos) override; }; @@ -280,7 +280,7 @@ public: DocBuilder & addInt(int64_t val); DocBuilder & addFloat(double val); DocBuilder & addPredicate(std::unique_ptr<vespalib::Slime> val); - DocBuilder & addTensor(std::unique_ptr<vespalib::tensor::Tensor> val); + DocBuilder & addTensor(std::unique_ptr<vespalib::eval::Value> val); DocBuilder &addTokenizedString(const vespalib::string &val); DocBuilder &addUrlTokenizedString(const vespalib::string &val); DocBuilder &addSpan(size_t start, size_t len); diff --git a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h index 94257363c60..96fb2968188 100644 --- a/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h +++ b/searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h @@ -4,6 +4,7 @@ #include <vespa/eval/eval/tensor_spec.h> #include <vespa/eval/eval/value.h> +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/searchcommon/attribute/iattributecontext.h> #include <vespa/searchlib/attribute/attributevector.h> @@ -34,7 +35,7 @@ public: } vespalib::eval::Value::UP get_query_tensor(const vespalib::string& tensor_name) const override { if (_query_tensor && (tensor_name == _query_tensor_name)) { - return vespalib::tensor::DefaultTensorEngine::ref().from_spec(*_query_tensor); + return vespalib::eval::EngineOrFactory::get().from_spec(*_query_tensor); } return vespalib::eval::Value::UP(); } diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.cpp index e99e14c8d6b..d75cda2e513 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.cpp @@ -5,7 +5,6 @@ #include "nearest_neighbor_iterator.h" #include "nns_index_iterator.h" #include <vespa/searchlib/fef/termfieldmatchdataarray.h> -#include <vespa/eval/tensor/dense/dense_tensor_view.h> #include <vespa/eval/tensor/dense/dense_tensor.h> #include <vespa/searchlib/tensor/dense_tensor_attribute.h> #include <vespa/searchlib/tensor/distance_function_factory.h> @@ -13,7 +12,7 @@ LOG_SETUP(".searchlib.queryeval.nearest_neighbor_blueprint"); -using vespalib::tensor::DenseTensorView; +using vespalib::eval::Value; using vespalib::tensor::DenseTensor; namespace search::queryeval { @@ -22,7 +21,7 @@ namespace { template<typename LCT, typename RCT> void -convert_cells(std::unique_ptr<DenseTensorView> &original, vespalib::eval::ValueType want_type) +convert_cells(std::unique_ptr<Value> &original, vespalib::eval::ValueType want_type) { auto old_cells = original->cells().typify<LCT>(); std::vector<RCT> new_cells; @@ -36,11 +35,11 @@ convert_cells(std::unique_ptr<DenseTensorView> &original, vespalib::eval::ValueT template<> void -convert_cells<float,float>(std::unique_ptr<DenseTensorView> &, vespalib::eval::ValueType) {} +convert_cells<float,float>(std::unique_ptr<Value> &, vespalib::eval::ValueType) {} template<> void -convert_cells<double,double>(std::unique_ptr<DenseTensorView> &, vespalib::eval::ValueType) {} +convert_cells<double,double>(std::unique_ptr<Value> &, vespalib::eval::ValueType) {} struct ConvertCellsSelector { @@ -52,7 +51,7 @@ struct ConvertCellsSelector NearestNeighborBlueprint::NearestNeighborBlueprint(const queryeval::FieldSpec& field, const tensor::DenseTensorAttribute& attr_tensor, - std::unique_ptr<vespalib::tensor::DenseTensorView> query_tensor, + std::unique_ptr<Value> query_tensor, uint32_t target_num_hits, bool approximate, uint32_t explore_additional_hits, double brute_force_limit) : ComplexLeafBlueprint(field), _attr_tensor(attr_tensor), @@ -120,7 +119,7 @@ NearestNeighborBlueprint::perform_top_k() { auto nns_index = _attr_tensor.nearest_neighbor_index(); if (_approximate && nns_index) { - auto lhs_type = _query_tensor->fast_type(); + auto lhs_type = _query_tensor->type(); auto rhs_type = _attr_tensor.getTensorType(); // different cell types should be converted already if (lhs_type == rhs_type) { @@ -144,7 +143,7 @@ NearestNeighborBlueprint::createLeafSearch(const search::fef::TermFieldMatchData if (! _found_hits.empty()) { return NnsIndexIterator::create(tfmd, _found_hits, _dist_fun); } - const vespalib::tensor::DenseTensorView &qT = *_query_tensor; + const Value &qT = *_query_tensor; return NearestNeighborIterator::create(strict, tfmd, qT, _attr_tensor, _distance_heap, _global_filter->filter(), _dist_fun); } diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h index 8656e5b4bf2..ebabf3a95eb 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h @@ -6,8 +6,8 @@ #include <vespa/searchlib/tensor/distance_function.h> #include <vespa/searchlib/tensor/nearest_neighbor_index.h> -namespace vespalib::tensor { class DenseTensorView; } namespace search::tensor { class DenseTensorAttribute; } +namespace vespalib::eval { class Value; } namespace search::queryeval { @@ -20,7 +20,7 @@ namespace search::queryeval { class NearestNeighborBlueprint : public ComplexLeafBlueprint { private: const tensor::DenseTensorAttribute& _attr_tensor; - std::unique_ptr<vespalib::tensor::DenseTensorView> _query_tensor; + std::unique_ptr<vespalib::eval::Value> _query_tensor; uint32_t _target_num_hits; bool _approximate; uint32_t _explore_additional_hits; @@ -35,13 +35,13 @@ private: public: NearestNeighborBlueprint(const queryeval::FieldSpec& field, const tensor::DenseTensorAttribute& attr_tensor, - std::unique_ptr<vespalib::tensor::DenseTensorView> query_tensor, + std::unique_ptr<vespalib::eval::Value> query_tensor, uint32_t target_num_hits, bool approximate, uint32_t explore_additional_hits, double brute_force_limit); NearestNeighborBlueprint(const NearestNeighborBlueprint&) = delete; NearestNeighborBlueprint& operator=(const NearestNeighborBlueprint&) = delete; ~NearestNeighborBlueprint(); const tensor::DenseTensorAttribute& get_attribute_tensor() const { return _attr_tensor; } - const vespalib::tensor::DenseTensorView& get_query_tensor() const { return *_query_tensor; } + const vespalib::eval::Value& get_query_tensor() const { return *_query_tensor; } uint32_t get_target_num_hits() const { return _target_num_hits; } void set_global_filter(const GlobalFilter &global_filter) override; bool may_approximate() const { return _approximate; } diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp index 3012de7563b..dd685ce5c43 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp @@ -5,7 +5,6 @@ using search::tensor::DenseTensorAttribute; using vespalib::ConstArrayRef; -using vespalib::tensor::DenseTensorView; using vespalib::tensor::MutableDenseTensorView; using vespalib::eval::TypedCells; @@ -41,7 +40,7 @@ public: _fieldTensor(params().tensorAttribute.getTensorType()), _lastScore(0.0) { - assert(is_compatible(_fieldTensor.fast_type(), params().queryTensor.fast_type())); + assert(is_compatible(_fieldTensor.fast_type(), params().queryTensor.type())); } ~NearestNeighborImpl(); @@ -95,7 +94,7 @@ template <bool has_filter> std::unique_ptr<NearestNeighborIterator> resolve_strict(bool strict, const NearestNeighborIterator::Params ¶ms) { - CellType lct = params.queryTensor.fast_type().cell_type(); + CellType lct = params.queryTensor.type().cell_type(); CellType rct = params.tensorAttribute.getTensorType().cell_type(); if (lct != rct) abort(); if (strict) { @@ -113,7 +112,7 @@ std::unique_ptr<NearestNeighborIterator> NearestNeighborIterator::create( bool strict, fef::TermFieldMatchData &tfmd, - const vespalib::tensor::DenseTensorView &queryTensor, + const vespalib::eval::Value &queryTensor, const search::tensor::DenseTensorAttribute &tensorAttribute, NearestNeighborDistanceHeap &distanceHeap, const search::BitVector *filter, diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.h index 9cbb1d39a91..9b8ad6295b3 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.h @@ -4,7 +4,7 @@ #include "searchiterator.h" #include "nearest_neighbor_distance_heap.h" -#include <vespa/eval/tensor/dense/dense_tensor_view.h> +#include <vespa/eval/eval/value.h> #include <vespa/eval/tensor/dense/mutable_dense_tensor_view.h> #include <vespa/searchlib/fef/termfieldmatchdata.h> #include <vespa/searchlib/tensor/dense_tensor_attribute.h> @@ -18,18 +18,18 @@ class NearestNeighborIterator : public SearchIterator { public: using DenseTensorAttribute = search::tensor::DenseTensorAttribute; - using DenseTensorView = vespalib::tensor::DenseTensorView; + using Value = vespalib::eval::Value; struct Params { fef::TermFieldMatchData &tfmd; - const DenseTensorView &queryTensor; + const Value &queryTensor; const DenseTensorAttribute &tensorAttribute; NearestNeighborDistanceHeap &distanceHeap; const search::BitVector *filter; const search::tensor::DistanceFunction *distanceFunction; Params(fef::TermFieldMatchData &tfmd_in, - const DenseTensorView &queryTensor_in, + const Value &queryTensor_in, const DenseTensorAttribute &tensorAttribute_in, NearestNeighborDistanceHeap &distanceHeap_in, const search::BitVector *filter_in, @@ -50,7 +50,7 @@ public: static std::unique_ptr<NearestNeighborIterator> create( bool strict, fef::TermFieldMatchData &tfmd, - const vespalib::tensor::DenseTensorView &queryTensor, + const Value &queryTensor, const search::tensor::DenseTensorAttribute &tensorAttribute, NearestNeighborDistanceHeap &distanceHeap, const search::BitVector *filter, diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp index 81c8df982b1..8bd276e7dd9 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp @@ -7,7 +7,6 @@ #include "tensor_attribute.hpp" #include <vespa/eval/tensor/dense/dense_tensor_view.h> #include <vespa/eval/tensor/dense/mutable_dense_tensor_view.h> -#include <vespa/eval/tensor/tensor.h> #include <vespa/fastlib/io/bufferedfile.h> #include <vespa/searchlib/attribute/load_utils.h> #include <vespa/searchlib/attribute/readerbase.h> @@ -17,11 +16,10 @@ LOG_SETUP(".searchlib.tensor.dense_tensor_attribute"); using search::attribute::LoadUtils; +using vespalib::eval::Value; using vespalib::eval::ValueType; using vespalib::slime::ObjectInserter; -using vespalib::tensor::DenseTensorView; using vespalib::tensor::MutableDenseTensorView; -using vespalib::tensor::Tensor; namespace search::tensor { @@ -79,7 +77,7 @@ can_use_index_save_file(const search::attribute::Config &config, const search::a } void -DenseTensorAttribute::internal_set_tensor(DocId docid, const Tensor& tensor) +DenseTensorAttribute::internal_set_tensor(DocId docid, const vespalib::eval::Value& tensor) { checkTensorType(tensor); consider_remove_from_index(docid); @@ -135,7 +133,7 @@ DenseTensorAttribute::clearDoc(DocId docId) } void -DenseTensorAttribute::setTensor(DocId docId, const Tensor &tensor) +DenseTensorAttribute::setTensor(DocId docId, const vespalib::eval::Value &tensor) { internal_set_tensor(docId, tensor); if (_index) { @@ -144,18 +142,16 @@ DenseTensorAttribute::setTensor(DocId docId, const Tensor &tensor) } std::unique_ptr<PrepareResult> -DenseTensorAttribute::prepare_set_tensor(DocId docid, const Tensor& tensor) const +DenseTensorAttribute::prepare_set_tensor(DocId docid, const vespalib::eval::Value& tensor) const { if (_index) { - const auto* view = dynamic_cast<const DenseTensorView*>(&tensor); - assert(view); - return _index->prepare_add_document(docid, view->cells(), getGenerationHandler().takeGuard()); + return _index->prepare_add_document(docid, tensor.cells(), getGenerationHandler().takeGuard()); } return std::unique_ptr<PrepareResult>(); } void -DenseTensorAttribute::complete_set_tensor(DocId docid, const Tensor& tensor, +DenseTensorAttribute::complete_set_tensor(DocId docid, const vespalib::eval::Value& tensor, std::unique_ptr<PrepareResult> prepare_result) { internal_set_tensor(docid, tensor); @@ -164,7 +160,7 @@ DenseTensorAttribute::complete_set_tensor(DocId docid, const Tensor& tensor, } } -std::unique_ptr<Tensor> +std::unique_ptr<vespalib::eval::Value> DenseTensorAttribute::getTensor(DocId docId) const { EntryRef ref; @@ -172,7 +168,7 @@ DenseTensorAttribute::getTensor(DocId docId) const ref = _refVector[docId]; } if (!ref.valid()) { - return std::unique_ptr<Tensor>(); + return std::unique_ptr<vespalib::eval::Value>(); } return _denseTensorStore.getTensor(ref); } diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h index 859ea82cee6..e06bbf331ac 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h @@ -23,7 +23,7 @@ private: DenseTensorStore _denseTensorStore; std::unique_ptr<NearestNeighborIndex> _index; - void internal_set_tensor(DocId docid, const Tensor& tensor); + void internal_set_tensor(DocId docid, const vespalib::eval::Value& tensor); void consider_remove_from_index(DocId docid); vespalib::MemoryUsage memory_usage() const override; @@ -33,10 +33,10 @@ public: virtual ~DenseTensorAttribute(); // Implements AttributeVector and ITensorAttribute uint32_t clearDoc(DocId docId) override; - void setTensor(DocId docId, const Tensor &tensor) override; - std::unique_ptr<PrepareResult> prepare_set_tensor(DocId docid, const Tensor& tensor) const override; - void complete_set_tensor(DocId docid, const Tensor& tensor, std::unique_ptr<PrepareResult> prepare_result) override; - std::unique_ptr<Tensor> getTensor(DocId docId) const override; + void setTensor(DocId docId, const vespalib::eval::Value &tensor) override; + std::unique_ptr<PrepareResult> prepare_set_tensor(DocId docid, const vespalib::eval::Value& tensor) const override; + void complete_set_tensor(DocId docid, const vespalib::eval::Value& tensor, std::unique_ptr<PrepareResult> prepare_result) override; + std::unique_ptr<vespalib::eval::Value> getTensor(DocId docId) const override; void extract_dense_view(DocId docId, vespalib::tensor::MutableDenseTensorView &tensor) const override; bool supports_extract_dense_view() const override { return true; } bool onLoad() override; diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp index e250a19214c..e76cea53c12 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp @@ -1,17 +1,13 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "dense_tensor_store.h" -#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/tensor/dense/dense_tensor_view.h> #include <vespa/eval/tensor/dense/mutable_dense_tensor_view.h> -#include <vespa/eval/tensor/dense/dense_tensor.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> #include <vespa/vespalib/datastore/datastore.hpp> using vespalib::datastore::Handle; -using vespalib::tensor::Tensor; -using vespalib::tensor::DenseTensorView; using vespalib::tensor::MutableDenseTensorView; +using vespalib::eval::Value; using vespalib::eval::ValueType; using CellType = vespalib::eval::ValueType::CellType; @@ -131,14 +127,14 @@ DenseTensorStore::move(EntryRef ref) return newraw.ref; } -std::unique_ptr<Tensor> +std::unique_ptr<Value> DenseTensorStore::getTensor(EntryRef ref) const { if (!ref.valid()) { - return std::unique_ptr<Tensor>(); + return std::unique_ptr<Value>(); } vespalib::eval::TypedCells cells_ref(getRawBuffer(ref), _type.cell_type(), getNumCells()); - return std::make_unique<DenseTensorView>(_type, cells_ref); + return std::make_unique<vespalib::tensor::DenseTensorView>(_type, cells_ref); } void @@ -166,19 +162,19 @@ template <class TensorType> TensorStore::EntryRef DenseTensorStore::setDenseTensor(const TensorType &tensor) { - size_t numCells = tensor.cells().size; - assert(numCells == getNumCells()); assert(tensor.type() == _type); + auto cells = tensor.cells(); + assert(cells.size == getNumCells()); + assert(cells.type == _type.cell_type()); auto raw = allocRawBuffer(); - memcpy(raw.data, tensor.cells().data, getBufSize()); + memcpy(raw.data, cells.data, getBufSize()); return raw.ref; } TensorStore::EntryRef -DenseTensorStore::setTensor(const Tensor &tensor) +DenseTensorStore::setTensor(const vespalib::eval::Value &tensor) { - const DenseTensorView &view(dynamic_cast<const DenseTensorView &>(tensor)); - return setDenseTensor(view); + return setDenseTensor(tensor); } } diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h index 979df1a9a4e..bae2aa9c3a4 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h @@ -7,6 +7,7 @@ #include <vespa/eval/eval/typed_cells.h> namespace vespalib { namespace tensor { class MutableDenseTensorView; }} +namespace vespalib::eval { class Value; } namespace search::tensor { @@ -64,10 +65,10 @@ public: vespalib::datastore::Handle<char> allocRawBuffer(); void holdTensor(EntryRef ref) override; EntryRef move(EntryRef ref) override; - std::unique_ptr<Tensor> getTensor(EntryRef ref) const; + std::unique_ptr<vespalib::eval::Value> getTensor(EntryRef ref) const; void getTensor(EntryRef ref, vespalib::tensor::MutableDenseTensorView &tensor) const; vespalib::eval::TypedCells get_typed_cells(EntryRef ref) const; - EntryRef setTensor(const Tensor &tensor); + EntryRef setTensor(const vespalib::eval::Value &tensor); // The following method is meant to be used only for unit tests. uint32_t getArraySize() const { return _bufferType.getArraySize(); } }; diff --git a/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.cpp index 570be586e88..62beb25be22 100644 --- a/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.cpp +++ b/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.cpp @@ -3,7 +3,8 @@ #include "direct_tensor_attribute.h" #include "direct_tensor_saver.h" -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> #include <vespa/fastlib/io/bufferedfile.h> #include <vespa/searchlib/attribute/readerbase.h> #include <vespa/searchlib/util/fileutil.h> @@ -13,7 +14,7 @@ #include "tensor_deserialize.h" #include "tensor_attribute.hpp" -using vespalib::tensor::Tensor; +using vespalib::eval::EngineOrFactory; namespace search::tensor { @@ -62,7 +63,7 @@ DirectTensorAttribute::onLoad() } void -DirectTensorAttribute::set_tensor(DocId lid, std::unique_ptr<Tensor> tensor) +DirectTensorAttribute::set_tensor(DocId lid, std::unique_ptr<vespalib::eval::Value> tensor) { checkTensorType(*tensor); EntryRef ref = _direct_store.store_tensor(std::move(tensor)); @@ -70,12 +71,12 @@ DirectTensorAttribute::set_tensor(DocId lid, std::unique_ptr<Tensor> tensor) } void -DirectTensorAttribute::setTensor(DocId lid, const Tensor &tensor) +DirectTensorAttribute::setTensor(DocId lid, const vespalib::eval::Value &tensor) { - set_tensor(lid, tensor.clone()); + set_tensor(lid, EngineOrFactory::get().copy(tensor)); } -std::unique_ptr<Tensor> +std::unique_ptr<vespalib::eval::Value> DirectTensorAttribute::getTensor(DocId docId) const { EntryRef ref; @@ -85,14 +86,14 @@ DirectTensorAttribute::getTensor(DocId docId) const if (ref.valid()) { auto ptr = _direct_store.get_tensor(ref); if (ptr) { - return ptr->clone(); + return EngineOrFactory::get().copy(*ptr); } } - std::unique_ptr<Tensor> empty; + std::unique_ptr<vespalib::eval::Value> empty; return empty; } -const Tensor & +const vespalib::eval::Value & DirectTensorAttribute::get_tensor_ref(DocId docId) const { EntryRef ref; diff --git a/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.h index 1429a8b4d5d..ce2bc0de386 100644 --- a/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.h +++ b/searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.h @@ -5,22 +5,25 @@ #include "tensor_attribute.h" #include "direct_tensor_store.h" +namespace vespalib::eval { class Value; } + namespace search::tensor { class DirectTensorAttribute : public TensorAttribute { DirectTensorStore _direct_store; + public: DirectTensorAttribute(vespalib::stringref baseFileName, const Config &cfg); virtual ~DirectTensorAttribute(); - virtual void setTensor(DocId docId, const Tensor &tensor) override; - virtual std::unique_ptr<Tensor> getTensor(DocId docId) const override; + virtual void setTensor(DocId docId, const vespalib::eval::Value &tensor) override; + virtual std::unique_ptr<vespalib::eval::Value> getTensor(DocId docId) const override; virtual bool onLoad() override; virtual std::unique_ptr<AttributeSaver> onInitSave(vespalib::stringref fileName) override; virtual void compactWorst() override; - void set_tensor(DocId docId, std::unique_ptr<Tensor> tensor); - const Tensor &get_tensor_ref(DocId docId) const override; + void set_tensor(DocId docId, std::unique_ptr<vespalib::eval::Value> tensor); + const vespalib::eval::Value &get_tensor_ref(DocId docId) const override; virtual bool supports_get_tensor_ref() const override { return true; } }; diff --git a/searchlib/src/vespa/searchlib/tensor/direct_tensor_saver.cpp b/searchlib/src/vespa/searchlib/tensor/direct_tensor_saver.cpp index 9ab2978722e..e67d5d8202b 100644 --- a/searchlib/src/vespa/searchlib/tensor/direct_tensor_saver.cpp +++ b/searchlib/src/vespa/searchlib/tensor/direct_tensor_saver.cpp @@ -3,15 +3,13 @@ #include "direct_tensor_saver.h" #include "direct_tensor_store.h" +#include <vespa/eval/eval/engine_or_factory.h> #include <vespa/eval/tensor/serialization/typed_binary_format.h> #include <vespa/searchlib/attribute/iattributesavetarget.h> #include <vespa/searchlib/util/bufferwriter.h> #include <vespa/vespalib/objects/nbostream.h> using vespalib::GenerationHandler; -using vespalib::tensor::Tensor; -using vespalib::tensor::TypedBinaryFormat; - namespace search::tensor { @@ -38,10 +36,10 @@ DirectTensorAttributeSaver::onSave(IAttributeSaveTarget &saveTarget) const uint32_t docIdLimit(_refs.size()); vespalib::nbostream stream; for (uint32_t lid = 0; lid < docIdLimit; ++lid) { - const Tensor *tensor = _tensorStore.get_tensor(_refs[lid]); + const vespalib::eval::Value *tensor = _tensorStore.get_tensor(_refs[lid]); if (tensor) { stream.clear(); - TypedBinaryFormat::serialize(stream, *tensor); + vespalib::eval::EngineOrFactory::get().encode(*tensor, stream); uint32_t sz = stream.size(); datWriter->write(&sz, sizeof(sz)); datWriter->write(stream.peek(), stream.size()); diff --git a/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.cpp b/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.cpp index 90be394227c..a74da056d00 100644 --- a/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.cpp +++ b/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.cpp @@ -1,7 +1,7 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "direct_tensor_store.h" -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> #include <vespa/vespalib/datastore/datastore.hpp> using vespalib::datastore::EntryRef; @@ -44,7 +44,7 @@ DirectTensorStore::DirectTensorStore() DirectTensorStore::~DirectTensorStore() = default; -const vespalib::tensor::Tensor* +const vespalib::eval::Value * DirectTensorStore::get_tensor(EntryRef ref) const { if (!ref.valid()) { @@ -56,7 +56,7 @@ DirectTensorStore::get_tensor(EntryRef ref) const } EntryRef -DirectTensorStore::store_tensor(std::unique_ptr<Tensor> tensor) +DirectTensorStore::store_tensor(std::unique_ptr<vespalib::eval::Value> tensor) { assert(tensor); return add_entry(TensorSP(std::move(tensor))); diff --git a/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.h b/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.h index 881506adb48..3955551f0f5 100644 --- a/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.h +++ b/searchlib/src/vespa/searchlib/tensor/direct_tensor_store.h @@ -5,6 +5,8 @@ #include "tensor_store.h" #include <memory> +namespace vespalib::eval { class Value; } + namespace search::tensor { /** @@ -16,7 +18,7 @@ class DirectTensorStore : public TensorStore { private: // Note: Must use SP (instead of UP) because of fallbackCopy() and initializeReservedElements() in BufferType, // and implementation of move(). - using TensorSP = std::shared_ptr<Tensor>; + using TensorSP = std::shared_ptr<vespalib::eval::Value>; using TensorStoreType = vespalib::datastore::DataStore<TensorSP>; class TensorBufferType : public vespalib::datastore::BufferType<TensorSP> { @@ -38,8 +40,8 @@ public: ~DirectTensorStore() override; using RefType = TensorStoreType::RefType; - const Tensor* get_tensor(EntryRef ref) const; - EntryRef store_tensor(std::unique_ptr<Tensor> tensor); + const vespalib::eval::Value * get_tensor(EntryRef ref) const; + EntryRef store_tensor(std::unique_ptr<vespalib::eval::Value> tensor); void holdTensor(EntryRef ref) override; EntryRef move(EntryRef ref) override; diff --git a/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h index 12b6857d122..f107f6bd781 100644 --- a/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h +++ b/searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h @@ -6,9 +6,8 @@ namespace vespalib::tensor { class MutableDenseTensorView; -class Tensor; } -namespace vespalib::eval { class ValueType; } +namespace vespalib::eval { class ValueType; class Value; } namespace vespalib::slime { struct Inserter; } namespace search::tensor { @@ -19,13 +18,11 @@ namespace search::tensor { class ITensorAttribute { public: - using Tensor = vespalib::tensor::Tensor; - virtual ~ITensorAttribute() {} - virtual std::unique_ptr<Tensor> getTensor(uint32_t docId) const = 0; - virtual std::unique_ptr<Tensor> getEmptyTensor() const = 0; + virtual std::unique_ptr<vespalib::eval::Value> getTensor(uint32_t docId) const = 0; + virtual std::unique_ptr<vespalib::eval::Value> getEmptyTensor() const = 0; virtual void extract_dense_view(uint32_t docid, vespalib::tensor::MutableDenseTensorView& tensor) const = 0; - virtual const Tensor& get_tensor_ref(uint32_t docid) const = 0; + virtual const vespalib::eval::Value& get_tensor_ref(uint32_t docid) const = 0; virtual bool supports_extract_dense_view() const = 0; virtual bool supports_get_tensor_ref() const = 0; diff --git a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector.cpp b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector.cpp index 0b13c999984..6d724d254b8 100644 --- a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector.cpp +++ b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector.cpp @@ -2,12 +2,10 @@ #include "imported_tensor_attribute_vector.h" #include "imported_tensor_attribute_vector_read_guard.h" -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> namespace search::tensor { -using vespalib::tensor::Tensor; - ImportedTensorAttributeVector::ImportedTensorAttributeVector(vespalib::stringref name, std::shared_ptr<ReferenceAttribute> reference_attribute, std::shared_ptr<IDocumentMetaStoreContext> document_meta_store, diff --git a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp index 2e396145138..1e376faa4d3 100644 --- a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp +++ b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp @@ -2,12 +2,10 @@ #include "imported_tensor_attribute_vector_read_guard.h" #include <vespa/searchlib/attribute/attributevector.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> namespace search::tensor { -using vespalib::tensor::Tensor; - namespace { const ITensorAttribute & @@ -38,13 +36,13 @@ ImportedTensorAttributeVectorReadGuard::asTensorAttribute() const return this; } -std::unique_ptr<Tensor> +std::unique_ptr<vespalib::eval::Value> ImportedTensorAttributeVectorReadGuard::getTensor(uint32_t docId) const { return _target_tensor_attribute.getTensor(getTargetLid(docId)); } -std::unique_ptr<Tensor> +std::unique_ptr<vespalib::eval::Value> ImportedTensorAttributeVectorReadGuard::getEmptyTensor() const { return _target_tensor_attribute.getEmptyTensor(); @@ -56,7 +54,7 @@ ImportedTensorAttributeVectorReadGuard::extract_dense_view(uint32_t docid, vespa _target_tensor_attribute.extract_dense_view(getTargetLid(docid), tensor); } -const Tensor& +const vespalib::eval::Value& ImportedTensorAttributeVectorReadGuard::get_tensor_ref(uint32_t docid) const { return _target_tensor_attribute.get_tensor_ref(getTargetLid(docid)); diff --git a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h index e873da510d9..3abac4e532e 100644 --- a/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h +++ b/searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h @@ -30,10 +30,10 @@ public: const ITensorAttribute *asTensorAttribute() const override; - std::unique_ptr<Tensor> getTensor(uint32_t docId) const override; - std::unique_ptr<Tensor> getEmptyTensor() const override; + std::unique_ptr<vespalib::eval::Value> getTensor(uint32_t docId) const override; + std::unique_ptr<vespalib::eval::Value> getEmptyTensor() const override; void extract_dense_view(uint32_t docid, vespalib::tensor::MutableDenseTensorView& tensor) const override; - const Tensor& get_tensor_ref(uint32_t docid) const override; + const vespalib::eval::Value& get_tensor_ref(uint32_t docid) const override; bool supports_extract_dense_view() const override { return _target_tensor_attribute.supports_extract_dense_view(); } bool supports_get_tensor_ref() const override { return _target_tensor_attribute.supports_get_tensor_ref(); } vespalib::eval::ValueType getTensorType() const override; diff --git a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.cpp index 3c0e9b38687..fc63969e548 100644 --- a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.cpp +++ b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.cpp @@ -4,14 +4,14 @@ #include "serialized_tensor_attribute.h" #include "serialized_tensor_attribute_saver.h" #include "tensor_attribute.hpp" -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> #include <vespa/fastlib/io/bufferedfile.h> #include <vespa/searchlib/attribute/readerbase.h> #include <vespa/searchlib/util/fileutil.h> #include <vespa/vespalib/util/rcuvector.hpp> +using vespalib::eval::Value; using vespalib::eval::ValueType; -using vespalib::tensor::Tensor; namespace search::tensor { @@ -34,7 +34,7 @@ SerializedTensorAttribute::~SerializedTensorAttribute() } void -SerializedTensorAttribute::setTensor(DocId docId, const Tensor &tensor) +SerializedTensorAttribute::setTensor(DocId docId, const vespalib::eval::Value &tensor) { checkTensorType(tensor); EntryRef ref = _serializedTensorStore.setTensor(tensor); @@ -42,7 +42,7 @@ SerializedTensorAttribute::setTensor(DocId docId, const Tensor &tensor) } -std::unique_ptr<Tensor> +std::unique_ptr<Value> SerializedTensorAttribute::getTensor(DocId docId) const { EntryRef ref; @@ -50,7 +50,7 @@ SerializedTensorAttribute::getTensor(DocId docId) const ref = _refVector[docId]; } if (!ref.valid()) { - return std::unique_ptr<Tensor>(); + return std::unique_ptr<Value>(); } return _serializedTensorStore.getTensor(ref); } diff --git a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.h index 7b385359337..fea11e3b0c4 100644 --- a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.h +++ b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.h @@ -15,8 +15,8 @@ class SerializedTensorAttribute : public TensorAttribute { public: SerializedTensorAttribute(vespalib::stringref baseFileName, const Config &cfg); virtual ~SerializedTensorAttribute(); - virtual void setTensor(DocId docId, const Tensor &tensor) override; - virtual std::unique_ptr<Tensor> getTensor(DocId docId) const override; + virtual void setTensor(DocId docId, const vespalib::eval::Value &tensor) override; + virtual std::unique_ptr<vespalib::eval::Value> getTensor(DocId docId) const override; virtual bool onLoad() override; virtual std::unique_ptr<AttributeSaver> onInitSave(vespalib::stringref fileName) override; virtual void compactWorst() override; diff --git a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.cpp b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.cpp index 77903291e13..4215df9e270 100644 --- a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.cpp +++ b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.cpp @@ -2,16 +2,15 @@ #include "serialized_tensor_store.h" #include "tensor_deserialize.h" -#include <vespa/eval/tensor/tensor.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> #include <vespa/vespalib/datastore/datastore.hpp> #include <vespa/vespalib/objects/nbostream.h> #include <vespa/vespalib/util/stringfmt.h> #include <vespa/vespalib/util/macro.h> using vespalib::datastore::Handle; -using vespalib::tensor::Tensor; -using vespalib::tensor::TypedBinaryFormat; +using vespalib::eval::Value; namespace search::tensor { @@ -87,21 +86,21 @@ SerializedTensorStore::move(EntryRef ref) return newraw.ref; } -std::unique_ptr<Tensor> +std::unique_ptr<Value> SerializedTensorStore::getTensor(EntryRef ref) const { auto raw = getRawBuffer(ref); if (raw.second == 0u) { - return std::unique_ptr<Tensor>(); + return std::unique_ptr<Value>(); } return deserialize_tensor(raw.first, raw.second); } TensorStore::EntryRef -SerializedTensorStore::setTensor(const Tensor &tensor) +SerializedTensorStore::setTensor(const vespalib::eval::Value &tensor) { vespalib::nbostream stream; - TypedBinaryFormat::serialize(stream, tensor); + vespalib::eval::EngineOrFactory::get().encode(tensor, stream); auto raw = allocRawBuffer(stream.size()); memcpy(raw.data, stream.peek(), stream.size()); return raw.ref; diff --git a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.h b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.h index 7c0a8e5ed16..ce2bbdde18d 100644 --- a/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.h +++ b/searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.h @@ -4,6 +4,8 @@ #include "tensor_store.h" +namespace vespalib::eval { class Value; } + namespace search::tensor { /** @@ -33,9 +35,9 @@ public: virtual EntryRef move(EntryRef ref) override; - std::unique_ptr<Tensor> getTensor(EntryRef ref) const; + std::unique_ptr<vespalib::eval::Value> getTensor(EntryRef ref) const; - EntryRef setTensor(const Tensor &tensor); + EntryRef setTensor(const vespalib::eval::Value &tensor); }; } diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp index a0185b7f7c1..39e35af3174 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp +++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp @@ -3,23 +3,20 @@ #include "tensor_attribute.h" #include <vespa/document/base/exceptions.h> #include <vespa/document/datatype/tensor_data_type.h> -#include <vespa/eval/eval/simple_tensor.h> -#include <vespa/eval/tensor/dense/typed_dense_tensor_builder.h> -#include <vespa/eval/tensor/sparse/direct_sparse_tensor_builder.h> -#include <vespa/eval/tensor/wrapped_simple_tensor.h> #include <vespa/searchlib/util/state_explorer_utils.h> #include <vespa/vespalib/data/slime/cursor.h> #include <vespa/vespalib/data/slime/inserter.h> #include <vespa/vespalib/util/rcuvector.hpp> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/tensor_spec.h> +#include <vespa/eval/eval/value.h> using document::TensorDataType; using document::WrongTensorTypeException; -using vespalib::eval::SimpleTensor; +using vespalib::eval::EngineOrFactory; +using vespalib::eval::TensorSpec; +using vespalib::eval::Value; using vespalib::eval::ValueType; -using vespalib::tensor::DirectSparseTensorBuilder; -using vespalib::tensor::Tensor; -using vespalib::tensor::TypedDenseTensorBuilder; -using vespalib::tensor::WrappedSimpleTensor; using search::StateExplorerUtils; namespace search::tensor { @@ -31,26 +28,12 @@ constexpr uint32_t TENSOR_ATTRIBUTE_VERSION = 0; // minimum dead bytes in tensor attribute before consider compaction constexpr size_t DEAD_SLACK = 0x10000u; -struct CallMakeEmptyTensor { - template <typename CT> - static Tensor::UP invoke(const ValueType &type) { - if (type.is_dense()) { - TypedDenseTensorBuilder<CT> builder(type); - return builder.build(); - } - if (type.is_sparse()) { - DirectSparseTensorBuilder<CT> builder(type); - return builder.build(); - } - return std::make_unique<WrappedSimpleTensor>(std::make_unique<SimpleTensor>(type, SimpleTensor::Cells())); - } -}; - -Tensor::UP +Value::UP createEmptyTensor(const ValueType &type) { - using MyTypify = vespalib::eval::TypifyCellType; - return vespalib::typify_invoke<1,MyTypify,CallMakeEmptyTensor>(type.cell_type(), type); + auto engine = EngineOrFactory::get(); + TensorSpec empty_spec(type.to_spec()); + return engine.from_spec(empty_spec); } vespalib::string makeWrongTensorTypeMsg(const ValueType &fieldTensorType, const ValueType &tensorType) @@ -154,7 +137,7 @@ TensorAttribute::addDoc(DocId &docId) } void -TensorAttribute::checkTensorType(const Tensor &tensor) +TensorAttribute::checkTensorType(const vespalib::eval::Value &tensor) { const ValueType &fieldTensorType = getConfig().tensorType(); const ValueType &tensorType = tensor.type(); @@ -197,10 +180,10 @@ TensorAttribute::populate_state(vespalib::slime::Cursor& object) const object.setObject("tensor_store").setObject("memory_usage")); } -Tensor::UP +vespalib::eval::Value::UP TensorAttribute::getEmptyTensor() const { - return _emptyTensor->clone(); + return EngineOrFactory::get().copy(*_emptyTensor); } void @@ -211,7 +194,7 @@ TensorAttribute::extract_dense_view(uint32_t docid, vespalib::tensor::MutableDen notImplemented(); } -const Tensor& +const vespalib::eval::Value& TensorAttribute::get_tensor_ref(uint32_t docid) const { (void) docid; @@ -271,7 +254,7 @@ TensorAttribute::getRefCopy() const } std::unique_ptr<PrepareResult> -TensorAttribute::prepare_set_tensor(DocId docid, const Tensor& tensor) const +TensorAttribute::prepare_set_tensor(DocId docid, const vespalib::eval::Value& tensor) const { (void) docid; (void) tensor; @@ -279,7 +262,7 @@ TensorAttribute::prepare_set_tensor(DocId docid, const Tensor& tensor) const } void -TensorAttribute::complete_set_tensor(DocId docid, const Tensor& tensor, +TensorAttribute::complete_set_tensor(DocId docid, const vespalib::eval::Value& tensor, std::unique_ptr<PrepareResult> prepare_result) { (void) docid; diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h index 9627ea5b4aa..24b88e3a7e0 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h +++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h @@ -8,6 +8,8 @@ #include <vespa/searchlib/attribute/not_implemented_attribute.h> #include <vespa/vespalib/util/rcuvector.h> +namespace vespalib::eval { class Value; } + namespace search::tensor { /** @@ -21,12 +23,12 @@ protected: RefVector _refVector; // docId -> ref in data store for serialized tensor TensorStore &_tensorStore; // data store for serialized tensors - std::unique_ptr<Tensor> _emptyTensor; + std::unique_ptr<vespalib::eval::Value> _emptyTensor; uint64_t _compactGeneration; // Generation when last compact occurred template <typename RefType> void doCompactWorst(); - void checkTensorType(const Tensor &tensor); + void checkTensorType(const vespalib::eval::Value &tensor); void setTensorRef(DocId docId, EntryRef ref); virtual vespalib::MemoryUsage memory_usage() const; void populate_state(vespalib::slime::Cursor& object) const; @@ -44,9 +46,9 @@ public: void removeOldGenerations(generation_t firstUsed) override; void onGenerationChange(generation_t generation) override; bool addDoc(DocId &docId) override; - std::unique_ptr<Tensor> getEmptyTensor() const override; + std::unique_ptr<vespalib::eval::Value> getEmptyTensor() const override; void extract_dense_view(uint32_t docid, vespalib::tensor::MutableDenseTensorView& tensor) const override; - const Tensor& get_tensor_ref(uint32_t docid) const override; + const vespalib::eval::Value& get_tensor_ref(uint32_t docid) const override; bool supports_extract_dense_view() const override { return false; } bool supports_get_tensor_ref() const override { return false; } vespalib::eval::ValueType getTensorType() const override; @@ -55,7 +57,7 @@ public: void onShrinkLidSpace() override; uint32_t getVersion() const override; RefCopyVector getRefCopy() const; - virtual void setTensor(DocId docId, const Tensor &tensor) = 0; + virtual void setTensor(DocId docId, const vespalib::eval::Value &tensor) = 0; /** * Performs the prepare step in a two-phase operation to set a tensor for a document. @@ -63,7 +65,7 @@ public: * This function can be called by any thread. * It should return the result of the costly and non-modifying part of such operation. */ - virtual std::unique_ptr<PrepareResult> prepare_set_tensor(DocId docid, const Tensor& tensor) const; + virtual std::unique_ptr<PrepareResult> prepare_set_tensor(DocId docid, const vespalib::eval::Value& tensor) const; /** * Performs the complete step in a two-phase operation to set a tensor for a document. @@ -71,7 +73,7 @@ public: * This function is only called by the attribute writer thread. * It uses the result from the prepare step to do the modifying changes. */ - virtual void complete_set_tensor(DocId docid, const Tensor& tensor, std::unique_ptr<PrepareResult> prepare_result); + virtual void complete_set_tensor(DocId docid, const vespalib::eval::Value& tensor, std::unique_ptr<PrepareResult> prepare_result); virtual void compactWorst() = 0; }; diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.cpp index 7998fba5941..83988a3af11 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.cpp +++ b/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.cpp @@ -1,20 +1,20 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/document/util/serializableexceptions.h> -#include <vespa/eval/tensor/serialization/typed_binary_format.h> -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/engine_or_factory.h> +#include <vespa/eval/eval/value.h> #include <vespa/vespalib/objects/nbostream.h> using document::DeserializeException; -using vespalib::tensor::Tensor; -using vespalib::tensor::TypedBinaryFormat; +using vespalib::eval::EngineOrFactory; +using vespalib::eval::Value; namespace search::tensor { -std::unique_ptr<Tensor> deserialize_tensor(const void *data, size_t size) +std::unique_ptr<Value> deserialize_tensor(const void *data, size_t size) { vespalib::nbostream wrapStream(data, size); - auto tensor = TypedBinaryFormat::deserialize(wrapStream); + auto tensor = EngineOrFactory::get().decode(wrapStream); if (wrapStream.size() != 0) { throw DeserializeException("Leftover bytes deserializing tensor attribute value.", VESPA_STRLOC); } diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.h b/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.h index f1dfa1ca173..18e166543d6 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.h +++ b/searchlib/src/vespa/searchlib/tensor/tensor_deserialize.h @@ -1,10 +1,10 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/eval/tensor/tensor.h> +#include <vespa/eval/eval/value.h> namespace search::tensor { -extern std::unique_ptr<vespalib::tensor::Tensor> +extern std::unique_ptr<vespalib::eval::Value> deserialize_tensor(const void *data, size_t size); } // namespace diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_store.h b/searchlib/src/vespa/searchlib/tensor/tensor_store.h index 88946086bea..967b6fd62e2 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_store.h +++ b/searchlib/src/vespa/searchlib/tensor/tensor_store.h @@ -6,7 +6,7 @@ #include <vespa/vespalib/datastore/datastore.h> #include <vespa/vespalib/util/generationhandler.h> -namespace vespalib { namespace tensor { class Tensor; } } +namespace vespalib::eval { class Value; } namespace search { @@ -24,7 +24,6 @@ class TensorStore public: using EntryRef = vespalib::datastore::EntryRef; typedef vespalib::GenerationHandler::generation_t generation_t; - using Tensor = vespalib::tensor::Tensor; protected: vespalib::datastore::DataStoreBase &_store; |