diff options
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.java | 131 |
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; } } |