diff options
author | Håvard Pettersen <havardpe@oath.com> | 2019-06-03 14:08:50 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2019-06-03 14:08:50 +0000 |
commit | 65d5f8aeffe8749a3cf97a079566c26ac9e0fb4a (patch) | |
tree | 2c0c891df52d987d31a710d85cf9e21395587f88 /eval | |
parent | 2a400f7c0ce2f686d28215a00bb16d54e5f25437 (diff) |
remove DefaultTensor type wrapper
also remove TensorBuilder interface and use SparseTensorBuilder
directly
Diffstat (limited to 'eval')
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 { |