aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/main/java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-03-01 10:39:52 +0100
committerJon Bratseth <bratseth@gmail.com>2022-03-01 10:39:52 +0100
commit05ab2e976349eb3016fa91020e161a8782bf00a5 (patch)
treed570863bbd636ddf908bf1d875efd21e5cbf9056 /searchlib/src/main/java
parent0e1e603359c9018cea86d1716903c3ce365e529e (diff)
Compute hash without serializing to string
Diffstat (limited to 'searchlib/src/main/java')
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java1
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java6
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java6
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java18
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java4
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java40
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java14
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java19
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java3
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java6
17 files changed, 105 insertions, 40 deletions
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java
index 6490c69894f..207603c5038 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java
@@ -97,6 +97,7 @@ public abstract class Value {
@Override
public abstract boolean equals(Object other);
+ /** Returns a hash which only depends on the content of this value. */
@Override
public abstract int hashCode();
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java
index 13db51c1363..c8b20e774b5 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTForestNode.java
@@ -11,7 +11,9 @@ import com.yahoo.searchlib.rankingexpression.rule.SerializationContext;
import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.evaluation.TypeContext;
+import java.util.Arrays;
import java.util.Deque;
+import java.util.Objects;
/**
* An optimized version of a sum of consecutive decision trees.
@@ -42,8 +44,12 @@ public class GBDTForestNode extends ExpressionNode {
}
/** Returns (optimized sum of condition trees) */
+ @Override
public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) {
return string.append("(optimized sum of condition trees of size ").append(values.length*8).append(" bytes)");
}
+ @Override
+ public int hashCode() { return Objects.hash("gbdtForest", Arrays.hashCode(values)); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java
index 6c6166c2869..949e1f026f7 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/gbdtoptimization/GBDTNode.java
@@ -11,7 +11,9 @@ import com.yahoo.searchlib.rankingexpression.rule.SerializationContext;
import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.evaluation.TypeContext;
+import java.util.Arrays;
import java.util.Deque;
+import java.util.Objects;
/**
* An optimized version of a decision tree.
@@ -105,4 +107,8 @@ public final class GBDTNode extends ExpressionNode {
public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) {
return string.append("(optimized condition tree)");
}
+
+ @Override
+ public int hashCode() { return Objects.hash("gbdtNode", Arrays.hashCode(values)); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java
index 55fe66be69e..580f42e67cb 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ArithmeticNode.java
@@ -13,6 +13,7 @@ import java.util.ArrayList;
import java.util.Deque;
import java.util.Iterator;
import java.util.List;
+import java.util.Objects;
/**
* A binary mathematical operation
@@ -115,6 +116,16 @@ public final class ArithmeticNode extends CompositeNode {
lhs.value = rhs.op.evaluate(lhs.value, rhs.value);
}
+ @Override
+ public CompositeNode setChildren(List<ExpressionNode> newChildren) {
+ if (children.size() != newChildren.size())
+ throw new IllegalArgumentException("Expected " + children.size() + " children but got " + newChildren.size());
+ return new ArithmeticNode(newChildren, operators);
+ }
+
+ @Override
+ public int hashCode() { return Objects.hash(children, operators); }
+
public static ArithmeticNode resolve(ExpressionNode left, ArithmeticOperator op, ExpressionNode right) {
if ( ! (left instanceof ArithmeticNode)) return new ArithmeticNode(left, op, right);
@@ -140,12 +151,5 @@ public final class ArithmeticNode extends CompositeNode {
}
}
- @Override
- public CompositeNode setChildren(List<ExpressionNode> newChildren) {
- if (children.size() != newChildren.size())
- throw new IllegalArgumentException("Expected " + children.size() + " children but got " + newChildren.size());
- return new ArithmeticNode(newChildren, operators);
- }
-
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java
index 600d3b8d408..e726a351f74 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ComparisonNode.java
@@ -9,6 +9,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* A node which returns the outcome of a comparison.
@@ -62,4 +63,7 @@ public class ComparisonNode extends BooleanNode {
return new ComparisonNode(children.get(0), operator, children.get(1));
}
+ @Override
+ public int hashCode() { return Objects.hash(operator, conditions); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
index ffbeec37c78..46e833197f9 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ConstantNode.java
@@ -8,6 +8,7 @@ import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Deque;
+import java.util.Objects;
/**
* A node which holds a constant (frozen) value.
@@ -55,4 +56,7 @@ public final class ConstantNode extends ExpressionNode {
return value;
}
+ @Override
+ public int hashCode() { return Objects.hash("constantNode", value); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
index 9d389a4f6e9..64a1f42a7ba 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
@@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* This class represents another expression enclosed in braces.
@@ -60,4 +61,7 @@ public final class EmbracedNode extends CompositeNode {
return new EmbracedNode(newChildren.get(0));
}
+ @Override
+ public int hashCode() { return Objects.hash("embraced", value); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java
index 8e00be3f056..51067930dd0 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/ExpressionNode.java
@@ -18,31 +18,13 @@ import java.util.Deque;
*/
public abstract class ExpressionNode implements Serializable {
- @Override
- public int hashCode() {
- return toString().hashCode();
- }
-
- @Override
- public final boolean equals(Object obj) {
- return obj instanceof ExpressionNode && toString().equals(obj.toString());
- }
-
- @Override
- public final String toString() {
- return toString(new SerializationContext()).toString();
- }
- public final StringBuilder toString(SerializationContext context) {
- return toString(new StringBuilder(), context, null, null);
- }
-
/**
- * Returns a script instance of this based on the supplied script functions.
+ * Returns this in serialized form.
*
* @param builder the StringBuilder that will be appended to
* @param context the serialization context
* @param path the call path to this, used for cycle detection, or null if this is a root
- * @param parent the parent node of this, or null if it a root
+ * @param parent the parent node of this, or null if it is a root
* @return the main script, referring to script instances.
*/
public abstract StringBuilder toString(StringBuilder builder, SerializationContext context, Deque<String> path, CompositeNode parent);
@@ -63,4 +45,22 @@ public abstract class ExpressionNode implements Serializable {
*/
public abstract Value evaluate(Context context);
+ public final StringBuilder toString(SerializationContext context) {
+ return toString(new StringBuilder(), context, null, null);
+ }
+
+ @Override
+ public final boolean equals(Object obj) {
+ return obj instanceof ExpressionNode && toString().equals(obj.toString());
+ }
+
+ /** Returns a hashcode computed from the data in this */
+ @Override
+ public abstract int hashCode();
+
+ @Override
+ public final String toString() {
+ return toString(new SerializationContext()).toString();
+ }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java
index d32cfb51f95..5e8bfc245a7 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionNode.java
@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* Invocation of a native function.
@@ -108,4 +109,7 @@ public final class FunctionNode extends CompositeNode {
return new FunctionNode(function, children.get(0), children.get(1));
}
+ @Override
+ public int hashCode() { return Objects.hash("functionNode", function, arguments); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java
index 7ff3a71d036..8d858341976 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/GeneratorLambdaFunctionNode.java
@@ -11,6 +11,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* A tensor generating function, whose arguments are determined by a tensor type
@@ -31,6 +32,11 @@ public class GeneratorLambdaFunctionNode extends CompositeNode {
this.generator = generator;
}
+ /** Returns this as an operator which converts a list of integers into a double. */
+ public LongListToDoubleLambda asLongListToDoubleOperator() {
+ return new LongListToDoubleLambda();
+ }
+
@Override
public List<ExpressionNode> children() {
return Collections.singletonList(generator);
@@ -57,12 +63,8 @@ public class GeneratorLambdaFunctionNode extends CompositeNode {
return generator.evaluate(context);
}
- /**
- * Returns this as an operator which converts a list of integers into a double
- */
- public LongListToDoubleLambda asLongListToDoubleOperator() {
- return new LongListToDoubleLambda();
- }
+ @Override
+ public int hashCode() { return Objects.hash("generator", type, generator); }
private class LongListToDoubleLambda implements java.util.function.Function<List<Long>, Double> {
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java
index 02d437e83bf..6f46222c1d8 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/IfNode.java
@@ -9,6 +9,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* A conditional branch of a ranking expression.
@@ -17,8 +18,9 @@ import java.util.List;
* @author bratseth
*/
public final class IfNode extends CompositeNode {
- /** [condition, trueExpression, falseExpression]*/
- private final List<ExpressionNode> asList;
+
+ /** [condition, trueExpression, falseExpression] */
+ private final List<ExpressionNode> arguments;
private final Double trueProbability;
public IfNode(ExpressionNode condition, ExpressionNode trueExpression, ExpressionNode falseExpression) {
@@ -39,19 +41,19 @@ public final class IfNode extends CompositeNode {
if (trueProbability != null && ( trueProbability < 0.0 || trueProbability > 1.0) )
throw new IllegalArgumentException("trueProbability must be a between 0.0 and 1.0, not " + trueProbability);
this.trueProbability = trueProbability;
- this.asList = List.of(condition, trueExpression, falseExpression);
+ this.arguments = List.of(condition, trueExpression, falseExpression);
}
@Override
public List<ExpressionNode> children() {
- return asList;
+ return arguments;
}
- public ExpressionNode getCondition() { return asList.get(0); }
+ public ExpressionNode getCondition() { return arguments.get(0); }
- public ExpressionNode getTrueExpression() { return asList.get(1); }
+ public ExpressionNode getTrueExpression() { return arguments.get(1); }
- public ExpressionNode getFalseExpression() { return asList.get(2); }
+ public ExpressionNode getFalseExpression() { return arguments.get(2); }
/** The average probability that the condition of this node will evaluate to true, or null if not known */
public Double getTrueProbability() { return trueProbability; }
@@ -95,4 +97,7 @@ public final class IfNode extends CompositeNode {
return new IfNode(children.get(0), children.get(1), children.get(2));
}
+ @Override
+ public int hashCode() { return Objects.hash("if", arguments, trueProbability); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java
index a2b86360923..9f07f146264 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/LambdaFunctionNode.java
@@ -13,6 +13,7 @@ import java.util.Collections;
import java.util.Deque;
import java.util.HashSet;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.DoubleBinaryOperator;
@@ -162,6 +163,8 @@ public class LambdaFunctionNode extends CompositeNode {
return Set.of();
}
+ @Override
+ public int hashCode() { return Objects.hash("lambdaFunction", arguments, functionExpression); }
private class DoubleUnaryLambda implements DoubleUnaryOperator {
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java
index 34c8664c0cf..fec643e81df 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NameNode.java
@@ -8,6 +8,7 @@ import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Deque;
+import java.util.Objects;
/**
* An opaque name in a ranking expression. This is used to represent names passed to the context
@@ -41,4 +42,7 @@ public final class NameNode extends ExpressionNode {
throw new RuntimeException("Name nodes should never be evaluated");
}
+ @Override
+ public int hashCode() { return Objects.hash("name", name); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java
index 9516f38a155..8d2cf7b6387 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NegativeNode.java
@@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* A node which flips the sign of the value produced from the nested expression
@@ -54,4 +55,7 @@ public class NegativeNode extends CompositeNode {
return new NegativeNode(children.get(0));
}
+ @Override
+ public int hashCode() { return Objects.hash("negative", value); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java
index 8b5ae256038..ac3566c26af 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/NotNode.java
@@ -10,6 +10,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
/**
* A node which flips the logical value produced from the nested expression.
@@ -55,5 +56,8 @@ public class NotNode extends BooleanNode {
return new NotNode(children.get(0));
}
+ @Override
+ public int hashCode() { return Objects.hash("not", value); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java
index 31f3013b756..5da2fbfe624 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SetMembershipNode.java
@@ -14,6 +14,7 @@ import com.yahoo.tensor.evaluation.TypeContext;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
+import java.util.Objects;
import java.util.function.Predicate;
/**
@@ -100,4 +101,7 @@ public class SetMembershipNode extends BooleanNode {
return new SetMembershipNode(children.get(0), children.subList(1, children.size()));
}
+ @Override
+ public int hashCode() { return Objects.hash("setMembership", testValue, setValues); }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java
index ce5832027b7..7b68ad7e2af 100644
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/TensorFunctionNode.java
@@ -144,6 +144,9 @@ public class TensorFunctionNode extends CompositeNode {
return new ExpressionScalarFunction(node);
}
+ @Override
+ public int hashCode() { return function.hashCode(); }
+
private static class ExpressionScalarFunction implements ScalarFunction<Reference> {
private final ExpressionNode expression;
@@ -251,6 +254,9 @@ public class TensorFunctionNode extends CompositeNode {
}
@Override
+ public int hashCode() { return expression.hashCode(); }
+
+ @Override
public String toString(ToStringContext<Reference> c) {
ToStringContext<Reference> outermost = c;
while (outermost.parent() != null)