diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-09-28 19:43:55 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-09-28 19:43:55 +0200 |
commit | 9f152d2147a7839dccd707aae0887e1309e8ae82 (patch) | |
tree | f12d456bcfa2a5ecd69089bcce305236565ab033 | |
parent | 2c0bc69f71a422a6ac10d34b7d965d0dd835a6cc (diff) |
Support map shorthands in both directions
2 files changed, 69 insertions, 16 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java index 186208e036f..2405d1bd528 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java @@ -33,82 +33,130 @@ public abstract class DoubleCompatibleValue extends Value { @Override public Value or(Value value) { - return new BooleanValue(asBoolean() || value.asBoolean()); + if (value instanceof TensorValue tensor) + return tensor.or(this); + else + return new BooleanValue(asBoolean() || value.asBoolean()); } @Override public Value and(Value value) { - return new BooleanValue(asBoolean() && value.asBoolean()); + if (value instanceof TensorValue tensor) + return tensor.and(this); + else + return new BooleanValue(asBoolean() && value.asBoolean()); } @Override public Value largerOrEqual(Value value) { - return new BooleanValue(this.asDouble() >= value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.largerOrEqual(this); + else + return new BooleanValue(this.asDouble() >= value.asDouble()); } @Override public Value larger(Value value) { - return new BooleanValue(this.asDouble() > value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.larger(this); + else + return new BooleanValue(this.asDouble() > value.asDouble()); } @Override public Value smallerOrEqual(Value value) { - return new BooleanValue(this.asDouble() <= value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.smallerOrEqual(this); + else + return new BooleanValue(this.asDouble() <= value.asDouble()); } @Override public Value smaller(Value value) { - return new BooleanValue(this.asDouble() < value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.smaller(this); + else + return new BooleanValue(this.asDouble() < value.asDouble()); } @Override public Value approxEqual(Value value) { - return new BooleanValue(approxEqual(this.asDouble(), value.asDouble())); + if (value instanceof TensorValue tensor) + return tensor.approxEqual(this); + else + return new BooleanValue(approxEqual(this.asDouble(), value.asDouble())); } @Override public Value notEqual(Value value) { - return new BooleanValue(this.asDouble() != value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.notEqual(this); + else + return new BooleanValue(this.asDouble() != value.asDouble()); } @Override public Value equal(Value value) { - return new BooleanValue(this.asDouble() == value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.equal(this); + else + return new BooleanValue(this.asDouble() == value.asDouble()); } @Override public Value add(Value value) { - return new DoubleValue(asDouble() + value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.add(this); + else + return new DoubleValue(asDouble() + value.asDouble()); } @Override public Value subtract(Value value) { - return new DoubleValue(asDouble() - value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.subtract(this); + else + return new DoubleValue(asDouble() - value.asDouble()); } @Override public Value multiply(Value value) { - return new DoubleValue(asDouble() * value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.multiply(this); + else + return new DoubleValue(asDouble() * value.asDouble()); } @Override public Value divide(Value value) { - return new DoubleValue(asDouble() / value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.divide(this); + else + return new DoubleValue(asDouble() / value.asDouble()); } @Override public Value modulo(Value value) { - return new DoubleValue(asDouble() % value.asDouble()); + if (value instanceof TensorValue tensor) + return tensor.modulo(this); + else + return new DoubleValue(asDouble() % value.asDouble()); } @Override public Value power(Value value) { - return new DoubleValue(Function.pow.evaluate(asDouble(), value.asDouble())); + if (value instanceof TensorValue tensor) + return tensor.power(this); + else + return new DoubleValue(Function.pow.evaluate(asDouble(), value.asDouble())); } @Override public Value function(Function function, Value value) { - return new DoubleValue(function.evaluate(asDouble(),value.asDouble())); + if (value instanceof TensorValue tensor) + return tensor.function(function, this); + else + return new DoubleValue(function.evaluate(asDouble(), value.asDouble())); } static boolean approxEqual(double x, double y) { diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java index 2986c8b8808..acab7bb38c6 100644 --- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java +++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java @@ -186,6 +186,11 @@ public class EvaluationTestCase { "map(tensor0, f(x) (log10(x)))", "{ {d1:0}:10, {d1:1}:100, {d1:2}:1000 }"); tester.assertEvaluates("{ {d1:0}:4, {d1:1}:9, {d1:2 }:16 }", "map(tensor0, f(x) (x * x))", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }"); + // -- tensor map shorthands + tester.assertEvaluates("{ {d1:0}:0, {d1:1}:1, {d1:2 }:0 }", + "tensor0 == 3", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }"); + tester.assertEvaluates("{ {d1:0}:0, {d1:1}:1, {d1:2 }:0 }", + "3 == tensor0", "{ {d1:0}:2, {d1:1}:3, {d1:2}:4 }"); // -- tensor map composites tester.assertEvaluates("{ {d1:0}:1, {d1:1}:2, {d1:2 }:3 }", "log10(tensor0)", "{ {d1:0}:10, {d1:1}:100, {d1:2}:1000 }"); |