aboutsummaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2021-08-24 14:16:47 +0000
committerHåvard Pettersen <havardpe@oath.com>2021-08-24 14:16:47 +0000
commitfbf0652e9e85e79eefb738149d48b94ce9f3909f (patch)
tree2b3b6672f176e8358519cd34fa7b4d789c611a02 /eval
parentf706101a1260e2a61bdedbe530d812457c6a55b1 (diff)
enable making an expression from a tensor spec
Diffstat (limited to 'eval')
-rw-r--r--eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp11
-rw-r--r--eval/src/vespa/eval/eval/tensor_spec.cpp14
-rw-r--r--eval/src/vespa/eval/eval/tensor_spec.h1
3 files changed, 26 insertions, 0 deletions
diff --git a/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp b/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp
index aa62e52f6f4..7c48606d6dd 100644
--- a/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp
+++ b/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp
@@ -19,6 +19,17 @@ TEST("require that a tensor spec can be converted to and from slime") {
EXPECT_EQUAL(TensorSpec::from_slime(slime.get()), spec);
}
+TEST("require that a tensor spec can be converted to and from an expression") {
+ TensorSpec spec("tensor<float>(x[2],y{})");
+ spec.add({{"x", 0}, {"y", "xxx"}}, 1.0)
+ .add({{"x", 0}, {"y", "yyy"}}, 2.0)
+ .add({{"x", 1}, {"y", "xxx"}}, 3.0)
+ .add({{"x", 1}, {"y", "yyy"}}, 4.0);
+ vespalib::string expr = spec.to_expr();
+ fprintf(stderr, "expr: \n%s\n", expr.c_str());
+ EXPECT_EQUAL(TensorSpec::from_expr(expr), spec);
+}
+
TEST("require that tensor specs can be diffed") {
TensorSpec expect("tensor(x[2],y{})");
expect.add({{"x", 0}, {"y", "xxx"}}, 1.5)
diff --git a/eval/src/vespa/eval/eval/tensor_spec.cpp b/eval/src/vespa/eval/eval/tensor_spec.cpp
index 684242fc485..5e833710e8c 100644
--- a/eval/src/vespa/eval/eval/tensor_spec.cpp
+++ b/eval/src/vespa/eval/eval/tensor_spec.cpp
@@ -284,6 +284,20 @@ TensorSpec::to_slime(slime::Cursor &tensor) const
}
}
+vespalib::string
+TensorSpec::to_expr() const
+{
+ vespalib::string out = _type;
+ out.append(":{");
+ CommaTracker cell_list;
+ for (const auto &cell: _cells) {
+ cell_list.maybe_add_comma(out);
+ out.append(make_string("%s:%g", as_string(cell.first).c_str(), cell.second.value));
+ }
+ out.append("}");
+ return out;
+}
+
TensorSpec
TensorSpec::from_slime(const slime::Inspector &tensor)
{
diff --git a/eval/src/vespa/eval/eval/tensor_spec.h b/eval/src/vespa/eval/eval/tensor_spec.h
index eab4c4ff49d..29e8a978c12 100644
--- a/eval/src/vespa/eval/eval/tensor_spec.h
+++ b/eval/src/vespa/eval/eval/tensor_spec.h
@@ -75,6 +75,7 @@ public:
vespalib::string to_string() const;
TensorSpec normalize() const;
void to_slime(slime::Cursor &tensor) const;
+ vespalib::string to_expr() const;
static TensorSpec from_slime(const slime::Inspector &tensor);
static TensorSpec from_value(const eval::Value &value);
static TensorSpec from_expr(const vespalib::string &expr);