summaryrefslogtreecommitdiffstats
path: root/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java')
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/DoubleCompatibleValue.java131
1 files changed, 109 insertions, 22 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 afd263f1553..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
@@ -2,7 +2,6 @@
package com.yahoo.searchlib.rankingexpression.evaluation;
import com.yahoo.searchlib.rankingexpression.rule.Function;
-import com.yahoo.searchlib.rankingexpression.rule.TruthOperator;
import com.yahoo.tensor.Tensor;
import com.yahoo.tensor.TensorType;
@@ -28,58 +27,146 @@ public abstract class DoubleCompatibleValue extends Value {
public Value negate() { return new DoubleValue(-asDouble()); }
@Override
- public Value add(Value value) {
- return new DoubleValue(asDouble() + value.asDouble());
+ public Value not() {
+ return new BooleanValue(!asBoolean());
}
@Override
- public Value subtract(Value value) {
- return new DoubleValue(asDouble() - value.asDouble());
+ public Value or(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.or(this);
+ else
+ return new BooleanValue(asBoolean() || value.asBoolean());
}
@Override
- public Value multiply(Value value) {
- return new DoubleValue(asDouble() * value.asDouble());
+ public Value and(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.and(this);
+ else
+ return new BooleanValue(asBoolean() && value.asBoolean());
}
@Override
- public Value divide(Value value) {
- return new DoubleValue(asDouble() / value.asDouble());
+ public Value largerOrEqual(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.largerOrEqual(this);
+ else
+ return new BooleanValue(this.asDouble() >= value.asDouble());
}
@Override
- public Value modulo(Value value) {
- return new DoubleValue(asDouble() % value.asDouble());
+ public Value larger(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.larger(this);
+ else
+ return new BooleanValue(this.asDouble() > value.asDouble());
}
@Override
- public Value and(Value value) {
- return new BooleanValue(asBoolean() && value.asBoolean());
+ public Value smallerOrEqual(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.smallerOrEqual(this);
+ else
+ return new BooleanValue(this.asDouble() <= value.asDouble());
}
@Override
- public Value or(Value value) {
- return new BooleanValue(asBoolean() || value.asBoolean());
+ public Value smaller(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.smaller(this);
+ else
+ return new BooleanValue(this.asDouble() < value.asDouble());
}
@Override
- public Value not() {
- return new BooleanValue(!asBoolean());
+ public Value approxEqual(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.approxEqual(this);
+ else
+ return new BooleanValue(approxEqual(this.asDouble(), value.asDouble()));
}
@Override
- public Value power(Value value) {
- return new DoubleValue(Function.pow.evaluate(asDouble(), value.asDouble()));
+ public Value notEqual(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.notEqual(this);
+ else
+ return new BooleanValue(this.asDouble() != value.asDouble());
+ }
+
+ @Override
+ public Value equal(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.equal(this);
+ else
+ return new BooleanValue(this.asDouble() == value.asDouble());
+ }
+
+ @Override
+ public Value add(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.add(this);
+ else
+ return new DoubleValue(asDouble() + value.asDouble());
+ }
+
+ @Override
+ public Value subtract(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.subtract(this);
+ else
+ return new DoubleValue(asDouble() - value.asDouble());
+ }
+
+ @Override
+ public Value multiply(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.multiply(this);
+ else
+ return new DoubleValue(asDouble() * value.asDouble());
+ }
+
+ @Override
+ public Value divide(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.divide(this);
+ else
+ return new DoubleValue(asDouble() / value.asDouble());
+ }
+
+ @Override
+ public Value modulo(Value value) {
+ if (value instanceof TensorValue tensor)
+ return tensor.modulo(this);
+ else
+ return new DoubleValue(asDouble() % value.asDouble());
}
@Override
- public Value compare(TruthOperator operator, Value value) {
- return new BooleanValue(operator.evaluate(asDouble(), value.asDouble()));
+ public Value power(Value value) {
+ 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) {
+ if (y < -1.0 || y > 1.0) {
+ x = Math.nextAfter(x/y, 1.0);
+ y = 1.0;
+ } else {
+ x = Math.nextAfter(x, y);
+ }
+ return x == y;
}
}