summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-10-13 14:11:28 +0000
committerArne Juul <arnej@verizonmedia.com>2020-10-15 08:18:59 +0000
commit08393e9e14635f1c6a6c84650c25023a0db7ed0b (patch)
tree48aae1605140fc6ff7d571084f345d33a3189c62 /searchlib
parent61eaea251e8cacd320ac10754ffd1513d8638043 (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')
-rw-r--r--searchlib/src/apps/vespa-ranking-expression-analyzer/vespa-ranking-expression-analyzer.cpp4
-rw-r--r--searchlib/src/tests/attribute/imported_attribute_vector/imported_attribute_vector_test.cpp30
-rw-r--r--searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp6
-rw-r--r--searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp54
-rw-r--r--searchlib/src/tests/features/constant/constant_test.cpp23
-rw-r--r--searchlib/src/tests/features/imported_dot_product/imported_dot_product_test.cpp7
-rw-r--r--searchlib/src/tests/features/tensor/tensor_test.cpp37
-rw-r--r--searchlib/src/tests/features/tensor_from_labels/tensor_from_labels_test.cpp22
-rw-r--r--searchlib/src/tests/features/tensor_from_weighted_set/tensor_from_weighted_set_test.cpp22
-rw-r--r--searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp27
-rw-r--r--searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp28
-rw-r--r--searchlib/src/tests/tensor/direct_tensor_store/direct_tensor_store_test.cpp22
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/features/constant_tensor_executor.h5
-rw-r--r--searchlib/src/vespa/searchlib/features/dense_tensor_attribute_executor.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/features/direct_tensor_attribute_executor.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/features/onnx_feature.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/features/queryfeature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/features/tensor_attribute_executor.h6
-rw-r--r--searchlib/src/vespa/searchlib/features/tensor_from_attribute_executor.h3
-rw-r--r--searchlib/src/vespa/searchlib/features/tensor_from_weighted_set_feature.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/index/docbuilder.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/index/docbuilder.h8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/fake_requestcontext.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.h10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp20
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp24
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h5
-rw-r--r--searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.cpp19
-rw-r--r--searchlib/src/vespa/searchlib/tensor/direct_tensor_attribute.h11
-rw-r--r--searchlib/src/vespa/searchlib/tensor/direct_tensor_saver.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/tensor/direct_tensor_store.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/tensor/direct_tensor_store.h8
-rw-r--r--searchlib/src/vespa/searchlib/tensor/i_tensor_attribute.h11
-rw-r--r--searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/imported_tensor_attribute_vector_read_guard.h6
-rw-r--r--searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/serialized_tensor_attribute.h4
-rw-r--r--searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/tensor/serialized_tensor_store.h6
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp49
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.h16
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_deserialize.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_deserialize.h4
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_store.h3
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 &params)
{
- 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;