summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne H Juul <arnej27959@users.noreply.github.com>2018-02-05 15:21:16 +0100
committerGitHub <noreply@github.com>2018-02-05 15:21:16 +0100
commit24094168ea91eb1663d9fe2f40b8ba62b552ce19 (patch)
tree601ac69ba9dc9277b87130182dfd9b9c6703d402
parent5dc8e1d4537f454be5e4a4edbb2a4925f11a9bc2 (diff)
parent0053375eecf11d35bf8aeccd7ecbd28a4adf9292 (diff)
Merge pull request #4917 from vespa-engine/havardpe/allow-serializing-dense-tensor-views
allow serializing dense tensor views
-rw-r--r--eval/src/apps/tensor_conformance/generate.cpp2
-rw-r--r--eval/src/apps/tensor_conformance/test_spec.json3
-rw-r--r--eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp4
-rw-r--r--eval/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp11
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_tensor.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_tensor.h3
-rw-r--r--eval/src/vespa/eval/tensor/serialization/dense_binary_format.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/serialization/dense_binary_format.h3
-rw-r--r--eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp2
9 files changed, 23 insertions, 13 deletions
diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp
index f70c472cbcd..f3a99f8a36c 100644
--- a/eval/src/apps/tensor_conformance/generate.cpp
+++ b/eval/src/apps/tensor_conformance/generate.cpp
@@ -193,6 +193,8 @@ void generate_tensor_concat(TestBuilder &dst) {
spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0})));
dst.add("concat(a,b,x)", {{"a", spec(y(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0})));
+ dst.add("concat(concat(a,b,x),concat(c,d,x),y)", {{"a", spec(1.0)}, {"b", spec(2.0)}, {"c", spec(3.0)}, {"d", spec(4.0)}},
+ spec({x(2), y(2)}, Seq({1.0, 3.0, 2.0, 4.0})));
}
//-----------------------------------------------------------------------------
diff --git a/eval/src/apps/tensor_conformance/test_spec.json b/eval/src/apps/tensor_conformance/test_spec.json
index 513d5e8e902..335c4bcb939 100644
--- a/eval/src/apps/tensor_conformance/test_spec.json
+++ b/eval/src/apps/tensor_conformance/test_spec.json
@@ -1235,6 +1235,7 @@
{"expression":"concat(a,b,x)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101780240140000000000004018000000000000"},"result":{"expect":"0x02020178040179023FF00000000000004000000000000000400800000000000040100000000000004014000000000000401400000000000040180000000000004018000000000000"}}
{"expression":"concat(a,b,x)","inputs":{"a":"0x0201017A033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x0203017802017902017A033FF0000000000000400000000000000040080000000000003FF000000000000040000000000000004008000000000000401000000000000040100000000000004010000000000000401400000000000040140000000000004014000000000000"}}
{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}}
+{"expression":"concat(concat(a,b,x),concat(c,d,x),y)","inputs":{"a":"0x02003FF0000000000000","b":"0x02004000000000000000","c":"0x02004008000000000000","d":"0x02004010000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400800000000000040000000000000004010000000000000"}}
{"expression":"rename(a,x,y)","inputs":{"a":"0x02010178053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"},"result":{"expect":"0x02010179053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}}
{"expression":"rename(a,y,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017805017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"}}
{"expression":"rename(a,z,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x02020178050179053FF000000000000040180000000000004026000000000000403000000000000040350000000000004000000000000000401C00000000000040280000000000004031000000000000403600000000000040080000000000004020000000000000402A0000000000004032000000000000403700000000000040100000000000004022000000000000402C0000000000004033000000000000403800000000000040140000000000004024000000000000402E00000000000040340000000000004039000000000000"}}
@@ -1244,4 +1245,4 @@
{"expression":"tensor(x[10])(x+1)","inputs":{},"result":{"expect":"0x020101780A3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402000000000000040220000000000004024000000000000"}}
{"expression":"tensor(x[5],y[4])(x*4+(y+1))","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000"}}
{"expression":"tensor(x[5],y[4])(x==y)","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000"}}
-{"num_tests":1246}
+{"num_tests":1247}
diff --git a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
index abf51d57b9a..71bbacc7806 100644
--- a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
+++ b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp
@@ -31,10 +31,10 @@ makeTensor(size_t numCells, double cellBias)
double
calcDotProduct(const DenseTensor &lhs, const DenseTensor &rhs)
{
- size_t numCells = std::min(lhs.cells().size(), rhs.cells().size());
+ size_t numCells = std::min(lhs.cellsRef().size(), rhs.cellsRef().size());
double result = 0;
for (size_t i = 0; i < numCells; ++i) {
- result += (lhs.cells()[i] * rhs.cells()[i]);
+ result += (lhs.cellsRef()[i] * rhs.cellsRef()[i]);
}
return result;
}
diff --git a/eval/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp b/eval/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp
index 61efdbe6d22..ae6166f9d24 100644
--- a/eval/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp
+++ b/eval/src/tests/tensor/dense_tensor_builder/dense_tensor_builder_test.cpp
@@ -10,6 +10,15 @@ using vespalib::IllegalArgumentException;
using Builder = DenseTensorBuilder;
using vespalib::eval::TensorSpec;
using vespalib::eval::ValueType;
+using vespalib::ConstArrayRef;
+
+template <typename T> std::vector<T> make_vector(const ConstArrayRef<T> &ref) {
+ std::vector<T> vec;
+ for (const T &t: ref) {
+ vec.push_back(t);
+ }
+ return vec;
+}
void
assertTensor(const std::vector<ValueType::Dimension> &expDims,
@@ -18,7 +27,7 @@ assertTensor(const std::vector<ValueType::Dimension> &expDims,
{
const DenseTensor &realTensor = dynamic_cast<const DenseTensor &>(tensor);
EXPECT_EQUAL(ValueType::tensor_type(expDims), realTensor.type());
- EXPECT_EQUAL(expCells, realTensor.cells());
+ EXPECT_EQUAL(expCells, make_vector(realTensor.cellsRef()));
}
void
diff --git a/eval/src/vespa/eval/tensor/dense/dense_tensor.cpp b/eval/src/vespa/eval/tensor/dense/dense_tensor.cpp
index 9693e89bb75..e775385b623 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_tensor.cpp
+++ b/eval/src/vespa/eval/tensor/dense/dense_tensor.cpp
@@ -25,12 +25,12 @@ void
checkCellsSize(const DenseTensor &arg)
{
auto cellsSize = calcCellsSize(arg.fast_type());
- if (arg.cells().size() != cellsSize) {
+ if (arg.cellsRef().size() != cellsSize) {
throw IllegalStateException(make_string("Wrong cell size, "
"expected=%zu, "
"actual=%zu",
cellsSize,
- arg.cells().size()));
+ arg.cellsRef().size()));
}
}
diff --git a/eval/src/vespa/eval/tensor/dense/dense_tensor.h b/eval/src/vespa/eval/tensor/dense/dense_tensor.h
index c45d3c7ccb6..0da5f570674 100644
--- a/eval/src/vespa/eval/tensor/dense/dense_tensor.h
+++ b/eval/src/vespa/eval/tensor/dense/dense_tensor.h
@@ -19,7 +19,6 @@ class DenseTensor : public DenseTensorView
public:
typedef std::unique_ptr<DenseTensor> UP;
using Cells = std::vector<double>;
- using CellsIterator = DenseTensorCellsIterator;
private:
eval::ValueType _type;
@@ -32,8 +31,6 @@ public:
DenseTensor(const eval::ValueType &type_in, Cells &&cells_in);
DenseTensor(eval::ValueType &&type_in, Cells &&cells_in);
bool operator==(const DenseTensor &rhs) const;
- const Cells &cells() const { return _cells; }
-
};
}
diff --git a/eval/src/vespa/eval/tensor/serialization/dense_binary_format.cpp b/eval/src/vespa/eval/tensor/serialization/dense_binary_format.cpp
index a2d600aa0c9..feb811a92de 100644
--- a/eval/src/vespa/eval/tensor/serialization/dense_binary_format.cpp
+++ b/eval/src/vespa/eval/tensor/serialization/dense_binary_format.cpp
@@ -22,7 +22,7 @@ makeValueType(std::vector<eval::ValueType::Dimension> &&dimensions) {
}
void
-DenseBinaryFormat::serialize(nbostream &stream, const DenseTensor &tensor)
+DenseBinaryFormat::serialize(nbostream &stream, const DenseTensorView &tensor)
{
stream.putInt1_4Bytes(tensor.fast_type().dimensions().size());
size_t cellsSize = 1;
@@ -31,7 +31,7 @@ DenseBinaryFormat::serialize(nbostream &stream, const DenseTensor &tensor)
stream.putInt1_4Bytes(dimension.size);
cellsSize *= dimension.size;
}
- const DenseTensor::Cells &cells = tensor.cells();
+ DenseTensorView::CellsRef cells = tensor.cellsRef();
assert(cells.size() == cellsSize);
for (const auto &value : cells) {
stream << value;
diff --git a/eval/src/vespa/eval/tensor/serialization/dense_binary_format.h b/eval/src/vespa/eval/tensor/serialization/dense_binary_format.h
index 13efc945880..8019648ffcb 100644
--- a/eval/src/vespa/eval/tensor/serialization/dense_binary_format.h
+++ b/eval/src/vespa/eval/tensor/serialization/dense_binary_format.h
@@ -10,6 +10,7 @@ class nbostream;
namespace tensor {
class DenseTensor;
+class DenseTensorView;
/**
* Class for serializing a dense tensor.
@@ -17,7 +18,7 @@ class DenseTensor;
class DenseBinaryFormat
{
public:
- static void serialize(nbostream &stream, const DenseTensor &tensor);
+ static void serialize(nbostream &stream, const DenseTensorView &tensor);
static std::unique_ptr<DenseTensor> deserialize(nbostream &stream);
};
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 c242f44df94..5db4f0aeb12 100644
--- a/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp
+++ b/eval/src/vespa/eval/tensor/serialization/typed_binary_format.cpp
@@ -19,7 +19,7 @@ namespace tensor {
void
TypedBinaryFormat::serialize(nbostream &stream, const Tensor &tensor)
{
- if (auto denseTensor = dynamic_cast<const DenseTensor *>(&tensor)) {
+ if (auto denseTensor = dynamic_cast<const DenseTensorView *>(&tensor)) {
stream.putInt1_4Bytes(DENSE_BINARY_FORMAT_TYPE);
DenseBinaryFormat::serialize(stream, *denseTensor);
} else if (auto wrapped = dynamic_cast<const WrappedSimpleTensor *>(&tensor)) {