aboutsummaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com>2021-08-25 10:29:07 +0200
committerGitHub <noreply@github.com>2021-08-25 10:29:07 +0200
commitcdf4bbf395ee8775ce029e01910d26e2a4aee8e2 (patch)
tree073aff3521732ac24b30a2eb935632216dac79cc /eval
parent25a715b5479f1a8d001dbc2e6d4993652f82ba67 (diff)
parentfbf0652e9e85e79eefb738149d48b94ce9f3909f (diff)
Merge pull request #18844 from vespa-engine/havardpe/tensor-as-expression
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);