summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2019-06-03 14:08:50 +0000
committerHåvard Pettersen <havardpe@oath.com>2019-06-03 14:08:50 +0000
commit65d5f8aeffe8749a3cf97a079566c26ac9e0fb4a (patch)
tree2c0c891df52d987d31a710d85cf9e21395587f88 /eval
parent2a400f7c0ce2f686d28215a00bb16d54e5f25437 (diff)
remove DefaultTensor type wrapper
also remove TensorBuilder interface and use SparseTensorBuilder directly
Diffstat (limited to 'eval')
-rw-r--r--eval/src/tests/tensor/tensor_performance/tensor_performance_test.cpp44
-rw-r--r--eval/src/vespa/eval/tensor/default_tensor.h15
-rw-r--r--eval/src/vespa/eval/tensor/default_tensor_engine.cpp6
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_tensor_builder.h4
-rw-r--r--eval/src/vespa/eval/tensor/serialization/sparse_binary_format.cpp6
-rw-r--r--eval/src/vespa/eval/tensor/serialization/sparse_binary_format.h4
-rw-r--r--eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.cpp9
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.h16
-rw-r--r--eval/src/vespa/eval/tensor/tensor_builder.h32
-rw-r--r--eval/src/vespa/eval/tensor/tensor_mapper.cpp3
11 files changed, 49 insertions, 94 deletions
diff --git a/eval/src/tests/tensor/tensor_performance/tensor_performance_test.cpp b/eval/src/tests/tensor/tensor_performance/tensor_performance_test.cpp
index 689a908f3f8..774f8200c01 100644
--- a/eval/src/tests/tensor/tensor_performance/tensor_performance_test.cpp
+++ b/eval/src/tests/tensor/tensor_performance/tensor_performance_test.cpp
@@ -8,7 +8,7 @@
#include <vespa/eval/tensor/sparse/sparse_tensor_builder.h>
#include <vespa/eval/tensor/dense/dense_tensor_builder.h>
#include <vespa/eval/tensor/tensor.h>
-#include <vespa/eval/tensor/tensor_builder.h>
+#include <vespa/eval/tensor/sparse/sparse_tensor_builder.h>
#include <vespa/vespalib/util/benchmark_timer.h>
#include <vespa/eval/tensor/default_tensor_engine.h>
@@ -137,17 +137,19 @@ TEST("SMOKETEST - require that matrix product benchmark expression produces expe
//-----------------------------------------------------------------------------
-struct DummyBuilder : TensorBuilder {
- Dimension define_dimension(const vespalib::string &) override { return 0; }
- TensorBuilder &add_label(Dimension, const vespalib::string &) override { return *this; }
- TensorBuilder &add_cell(double) override { return *this; }
- tensor::Tensor::UP build() override { return tensor::Tensor::UP(); }
+struct DummySparseBuilder
+{
+ using Dimension = SparseTensorBuilder::Dimension;
+ Dimension define_dimension(const vespalib::string &) { return 0; }
+ DummySparseBuilder &add_label(Dimension, const vespalib::string &) { return *this; }
+ DummySparseBuilder &add_cell(double) { return *this; }
+ tensor::Tensor::UP build() { return tensor::Tensor::UP(); }
};
struct DummyDenseTensorBuilder
{
- using Dimension = TensorBuilder::Dimension;
+ using Dimension = SparseTensorBuilder::Dimension;
Dimension defineDimension(const vespalib::string &, size_t) { return 0; }
DummyDenseTensorBuilder &addLabel(Dimension, size_t) { return *this; }
DummyDenseTensorBuilder &addCell(double) { return *this; }
@@ -163,9 +165,10 @@ struct DimensionSpec {
};
struct StringBinding {
- TensorBuilder::Dimension dimension;
+ SparseTensorBuilder::Dimension dimension;
vespalib::string label;
- StringBinding(TensorBuilder &builder, const DimensionSpec &dimension_in)
+ template <typename Builder>
+ StringBinding(Builder &builder, const DimensionSpec &dimension_in)
: dimension(builder.define_dimension(dimension_in.name)),
label()
{
@@ -173,16 +176,18 @@ struct StringBinding {
void set_label(size_t id) {
label = vespalib::make_string("%zu", id);
}
- static void add_cell(TensorBuilder &builder, double value) {
+ template <typename Builder>
+ static void add_cell(Builder &builder, double value) {
builder.add_cell(value);
}
- void add_label(TensorBuilder &builder) const {
+ template <typename Builder>
+ void add_label(Builder &builder) const {
builder.add_label(dimension, label);
}
};
struct NumberBinding {
- TensorBuilder::Dimension dimension;
+ SparseTensorBuilder::Dimension dimension;
size_t label;
template <typename Builder>
NumberBinding(Builder &builder, const DimensionSpec &dimension_in)
@@ -226,12 +231,12 @@ void build_tensor(Builder &builder, const std::vector<DimensionSpec> &dimensions
}
}
-template <typename Builder, typename IBuilder, typename Binding>
+template <typename Builder, typename Binding>
tensor::Tensor::UP make_tensor_impl(const std::vector<DimensionSpec> &dimensions) {
Builder builder;
std::vector<Binding> bindings;
bindings.reserve(dimensions.size());
- build_tensor<IBuilder, Binding>(builder, dimensions, bindings);
+ build_tensor<Builder, Binding>(builder, dimensions, bindings);
return builder.build();
}
@@ -258,17 +263,14 @@ const char *name(BuilderType type) {
tensor::Tensor::UP make_tensor(BuilderType type, const std::vector<DimensionSpec> &dimensions) {
switch (type) {
case BuilderType::DUMMY:
- return make_tensor_impl<DummyBuilder, TensorBuilder, StringBinding>
+ return make_tensor_impl<DummySparseBuilder, StringBinding>
(dimensions);
case BuilderType::SPARSE:
- return make_tensor_impl<SparseTensorBuilder, TensorBuilder,
- StringBinding>(dimensions);
+ return make_tensor_impl<SparseTensorBuilder, StringBinding>(dimensions);
case BuilderType::NUMBERDUMMY:
- return make_tensor_impl<DummyDenseTensorBuilder,
- DummyDenseTensorBuilder, NumberBinding>(dimensions);
+ return make_tensor_impl<DummyDenseTensorBuilder, NumberBinding>(dimensions);
case BuilderType::DENSE:
- return make_tensor_impl<DenseTensorBuilder, DenseTensorBuilder,
- NumberBinding>(dimensions);
+ return make_tensor_impl<DenseTensorBuilder, NumberBinding>(dimensions);
}
abort();
}
diff --git a/eval/src/vespa/eval/tensor/default_tensor.h b/eval/src/vespa/eval/tensor/default_tensor.h
deleted file mode 100644
index 456d3333295..00000000000
--- a/eval/src/vespa/eval/tensor/default_tensor.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#pragma once
-
-#include "sparse/sparse_tensor.h"
-#include "sparse/sparse_tensor_builder.h"
-
-namespace vespalib::tensor {
-
-struct DefaultTensor {
- using type = SparseTensor;
- using builder = SparseTensorBuilder;
-};
-
-}
diff --git a/eval/src/vespa/eval/tensor/default_tensor_engine.cpp b/eval/src/vespa/eval/tensor/default_tensor_engine.cpp
index c92d63851b5..b39fd5e02fb 100644
--- a/eval/src/vespa/eval/tensor/default_tensor_engine.cpp
+++ b/eval/src/vespa/eval/tensor/default_tensor_engine.cpp
@@ -2,9 +2,9 @@
#include "default_tensor_engine.h"
#include "tensor.h"
-#include "default_tensor.h"
#include "wrapped_simple_tensor.h"
#include "serialization/typed_binary_format.h"
+#include "sparse/sparse_tensor_builder.h"
#include "dense/dense_tensor.h"
#include "dense/dense_tensor_builder.h"
#include "dense/dense_dot_product_function.h"
@@ -142,8 +142,8 @@ DefaultTensorEngine::from_spec(const TensorSpec &spec) const
}
return builder.build();
} else if (type.is_sparse()) {
- DefaultTensor::builder builder;
- std::map<vespalib::string,DefaultTensor::builder::Dimension> dimension_map;
+ SparseTensorBuilder builder;
+ std::map<vespalib::string,SparseTensorBuilder::Dimension> dimension_map;
for (const auto &dimension: type.dimensions()) {
dimension_map[dimension.name] = builder.define_dimension(dimension.name);
}
diff --git a/eval/src/vespa/eval/tensor/dense/dense_tensor_builder.h b/eval/src/vespa/eval/tensor/dense/dense_tensor_builder.h
index 05cd88b1319..377cf7bbb8e 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_tensor_builder.h
+++ b/eval/src/vespa/eval/tensor/dense/dense_tensor_builder.h
@@ -4,7 +4,7 @@
#include "dense_tensor.h"
#include <vespa/vespalib/stllike/hash_map.h>
-#include <vespa/eval/tensor/tensor_builder.h>
+#include <vespa/eval/tensor/sparse/sparse_tensor_builder.h>
namespace vespalib::tensor {
@@ -14,7 +14,7 @@ namespace vespalib::tensor {
class DenseTensorBuilder
{
public:
- using Dimension = TensorBuilder::Dimension;
+ using Dimension = SparseTensorBuilder::Dimension;
private:
vespalib::hash_map<vespalib::string, size_t> _dimensionsEnum;
std::vector<eval::ValueType::Dimension> _dimensions;
diff --git a/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.cpp b/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.cpp
index 79d1aaa83a8..88f441176d5 100644
--- a/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.cpp
+++ b/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.cpp
@@ -3,7 +3,7 @@
#include "sparse_binary_format.h"
#include <vespa/eval/tensor/types.h>
#include <vespa/eval/tensor/tensor.h>
-#include <vespa/eval/tensor/tensor_builder.h>
+#include <vespa/eval/tensor/sparse/sparse_tensor_builder.h>
#include <vespa/eval/tensor/tensor_visitor.h>
#include <vespa/vespalib/objects/nbostream.h>
#include <sstream>
@@ -92,11 +92,11 @@ SparseBinaryFormat::serialize(nbostream &stream, const Tensor &tensor)
void
-SparseBinaryFormat::deserialize(nbostream &stream, TensorBuilder &builder)
+SparseBinaryFormat::deserialize(nbostream &stream, SparseTensorBuilder &builder)
{
vespalib::string str;
size_t dimensionsSize = stream.getInt1_4Bytes();
- std::vector<TensorBuilder::Dimension> dimensions;
+ std::vector<SparseTensorBuilder::Dimension> dimensions;
while (dimensions.size() < dimensionsSize) {
stream.readSmallString(str);
dimensions.emplace_back(builder.define_dimension(str));
diff --git a/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.h b/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.h
index 89f6947ad43..1c0171a2b98 100644
--- a/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.h
+++ b/eval/src/vespa/eval/tensor/serialization/sparse_binary_format.h
@@ -7,7 +7,7 @@ namespace vespalib { class nbostream; }
namespace vespalib::tensor {
class Tensor;
-class TensorBuilder;
+class SparseTensorBuilder;
/**
* Class for serializing a tensor.
@@ -16,7 +16,7 @@ class SparseBinaryFormat
{
public:
static void serialize(nbostream &stream, const Tensor &tensor);
- static void deserialize(nbostream &stream, TensorBuilder &builder);
+ static void deserialize(nbostream &stream, SparseTensorBuilder &builder);
};
}
diff --git a/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp b/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp
index 7be4db46372..d452203fe3f 100644
--- a/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp
+++ b/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp
@@ -4,7 +4,7 @@
#include "sparse_binary_format.h"
#include "dense_binary_format.h"
#include <vespa/vespalib/objects/nbostream.h>
-#include <vespa/eval/tensor/default_tensor.h>
+#include <vespa/eval/tensor/sparse/sparse_tensor_builder.h>
#include <vespa/eval/tensor/tensor.h>
#include <vespa/eval/tensor/dense/dense_tensor.h>
#include <vespa/eval/eval/simple_tensor.h>
@@ -84,7 +84,7 @@ TypedBinaryFormat::deserialize(nbostream &stream)
auto read_pos = stream.rp();
auto formatId = stream.getInt1_4Bytes();
if (formatId == SPARSE_BINARY_FORMAT_TYPE) {
- DefaultTensor::builder builder;
+ SparseTensorBuilder builder;
SparseBinaryFormat::deserialize(stream, builder);
return builder.build();
}
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.cpp b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.cpp
index 9c3b13f6260..87e5b4c1941 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.cpp
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.cpp
@@ -6,8 +6,7 @@
namespace vespalib::tensor {
SparseTensorBuilder::SparseTensorBuilder()
- : TensorBuilder(),
- _addressBuilder(),
+ : _addressBuilder(),
_normalizedAddressBuilder(),
_cells(),
_stash(SparseTensor::STASH_CHUNK_SIZE),
@@ -37,7 +36,7 @@ SparseTensorBuilder::makeType()
}
-TensorBuilder::Dimension
+SparseTensorBuilder::Dimension
SparseTensorBuilder::define_dimension(const vespalib::string &dimension)
{
auto it = _dimensionsEnum.find(dimension);
@@ -55,7 +54,7 @@ SparseTensorBuilder::define_dimension(const vespalib::string &dimension)
return res;
}
-TensorBuilder &
+SparseTensorBuilder &
SparseTensorBuilder::add_label(Dimension dimension,
const vespalib::string &label)
{
@@ -64,7 +63,7 @@ SparseTensorBuilder::add_label(Dimension dimension,
return *this;
}
-TensorBuilder &
+SparseTensorBuilder &
SparseTensorBuilder::add_cell(double value)
{
if (!_type_made) {
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.h b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.h
index ea5f607ff7e..daf8d797a91 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.h
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_builder.h
@@ -5,7 +5,6 @@
#include "sparse_tensor.h"
#include "sparse_tensor_address_builder.h"
#include "sparse_tensor_unsorted_address_builder.h"
-#include <vespa/eval/tensor/tensor_builder.h>
#include <vespa/eval/tensor/tensor_address.h>
#include <vespa/vespalib/stllike/hash_map.h>
#include <vespa/vespalib/util/stash.h>
@@ -15,8 +14,11 @@ namespace vespalib::tensor {
/**
* A builder of sparse tensors.
*/
-class SparseTensorBuilder : public TensorBuilder
+class SparseTensorBuilder
{
+public:
+ using Dimension = uint32_t;
+private:
SparseTensorUnsortedAddressBuilder _addressBuilder; // unsorted dimensions
SparseTensorAddressBuilder _normalizedAddressBuilder; // sorted dimensions
SparseTensor::Cells _cells;
@@ -29,12 +31,12 @@ class SparseTensorBuilder : public TensorBuilder
void makeType();
public:
SparseTensorBuilder();
- ~SparseTensorBuilder() override;
+ ~SparseTensorBuilder();
- Dimension define_dimension(const vespalib::string &dimension) override;
- TensorBuilder & add_label(Dimension dimension, const vespalib::string &label) override;
- TensorBuilder &add_cell(double value) override;
- Tensor::UP build() override;
+ Dimension define_dimension(const vespalib::string &dimension);
+ SparseTensorBuilder & add_label(Dimension dimension, const vespalib::string &label);
+ SparseTensorBuilder &add_cell(double value);
+ Tensor::UP build();
};
}
diff --git a/eval/src/vespa/eval/tensor/tensor_builder.h b/eval/src/vespa/eval/tensor/tensor_builder.h
deleted file mode 100644
index 30eef5f9c54..00000000000
--- a/eval/src/vespa/eval/tensor/tensor_builder.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#pragma once
-
-#include <vespa/vespalib/stllike/string.h>
-
-namespace vespalib::tensor {
-
-class Tensor;
-
-/**
- * An interfrace for builder of tensors (sparse multi-dimensional array).
- *
- * A sparse tensor is a set of cells containing scalar values. Each
- * cell is identified by its address, which consists of a set of
- * dimension -> label pairs, where both dimension and label is a
- * string on the form of an identifier or integer.
- */
-class TensorBuilder
-{
-public:
- using Dimension = uint32_t;
- virtual ~TensorBuilder() { }
-
- virtual Dimension define_dimension(const vespalib::string &dimension) = 0;
- virtual TensorBuilder &
- add_label(Dimension dimension, const vespalib::string &label) = 0;
- virtual TensorBuilder &add_cell(double value) = 0;
- virtual std::unique_ptr<Tensor> build() = 0;
-};
-
-}
diff --git a/eval/src/vespa/eval/tensor/tensor_mapper.cpp b/eval/src/vespa/eval/tensor/tensor_mapper.cpp
index e6358675cea..c7bd8173d51 100644
--- a/eval/src/vespa/eval/tensor/tensor_mapper.cpp
+++ b/eval/src/vespa/eval/tensor/tensor_mapper.cpp
@@ -4,7 +4,6 @@
#include "tensor.h"
#include "tensor_visitor.h"
#include "tensor_address_element_iterator.h"
-#include "default_tensor.h"
#include "wrapped_simple_tensor.h"
#include <vespa/eval/tensor/sparse/direct_sparse_tensor_builder.h>
#include <vespa/eval/tensor/dense/dense_tensor.h>
@@ -259,7 +258,7 @@ std::unique_ptr<Tensor>
TensorMapper::map(const Tensor &tensor) const
{
if (_type.is_sparse()) {
- return mapToSparse<DefaultTensor::type>(tensor, _type);
+ return mapToSparse<SparseTensor>(tensor, _type);
} else if (_type.is_dense()) {
return mapToDense(tensor, _type);
} else {