summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-11-03 16:56:45 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2021-11-03 16:56:45 +0100
commit4cc0c0885fd8b5f5e2fde130cfe409bbc9990455 (patch)
tree09e0d16df9c0db8b6bafaf82ee865844b86e5886 /searchlib
parent9d5f4971e89870ec61b1b309287c563ead7d8b75 (diff)
Add a LongValue to preserve integer numbers.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/abi-spec.json24
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/LongValue.java120
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/Value.java6
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/gbdt/GbdtConverterTestCase.java18
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/transform/ConstantDereferencerTestCase.java4
5 files changed, 159 insertions, 13 deletions
diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json
index d0e14a40b9c..cb9bcb0ad4f 100644
--- a/searchlib/abi-spec.json
+++ b/searchlib/abi-spec.json
@@ -580,6 +580,30 @@
],
"fields": []
},
+ "com.yahoo.searchlib.rankingexpression.evaluation.LongValue": {
+ "superClass": "com.yahoo.searchlib.rankingexpression.evaluation.DoubleCompatibleValue",
+ "interfaces": [],
+ "attributes": [
+ "public"
+ ],
+ "methods": [
+ "public void <init>(long)",
+ "public double asDouble()",
+ "public boolean asBoolean()",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value asMutable()",
+ "public java.lang.String toString()",
+ "public boolean equals(java.lang.Object)",
+ "public int hashCode()",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.DoubleValue negate()",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value add(com.yahoo.searchlib.rankingexpression.evaluation.Value)",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value subtract(com.yahoo.searchlib.rankingexpression.evaluation.Value)",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value multiply(com.yahoo.searchlib.rankingexpression.evaluation.Value)",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value divide(com.yahoo.searchlib.rankingexpression.evaluation.Value)",
+ "public com.yahoo.searchlib.rankingexpression.evaluation.Value modulo(com.yahoo.searchlib.rankingexpression.evaluation.Value)",
+ "public bridge synthetic com.yahoo.searchlib.rankingexpression.evaluation.Value negate()"
+ ],
+ "fields": []
+ },
"com.yahoo.searchlib.rankingexpression.evaluation.MapContext": {
"superClass": "com.yahoo.searchlib.rankingexpression.evaluation.Context",
"interfaces": [],
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/LongValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/LongValue.java
new file mode 100644
index 00000000000..21a998d3234
--- /dev/null
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/LongValue.java
@@ -0,0 +1,120 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.searchlib.rankingexpression.evaluation;
+
+/**
+ * A representation for integer numbers
+ *
+ * @author balder
+ */
+public class LongValue extends DoubleCompatibleValue {
+ private final long value;
+
+ public LongValue(long value) {
+ this.value = value;
+ }
+ @Override
+ public double asDouble() {
+ return value;
+ }
+ @Override
+ public boolean asBoolean() {
+ return value != 0;
+ }
+
+ @Override
+ public Value asMutable() {
+ return new LongValue(value);
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this==other) return true;
+ if ( ! (other instanceof Value)) return false;
+ if ( ! ((Value) other).hasDouble()) return false;
+ return new DoubleValue(value).equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ return Long.hashCode(value);
+ }
+
+ @Override
+ public DoubleValue negate() {
+ return new DoubleValue(-value);
+ }
+
+ private UnsupportedOperationException unsupported(String operation, Value value) {
+ return new UnsupportedOperationException("Cannot perform " + operation + " on " + value + " and " + this);
+ }
+
+ /** Returns this or a mutable copy assigned the given value */
+ private DoubleValue mutable(double value) {
+ return new DoubleValue(value);
+ }
+
+ @Override
+ public Value add(Value value) {
+ if (value instanceof TensorValue)
+ return value.add(this);
+
+ try {
+ return mutable(this.value + value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("add",value);
+ }
+ }
+
+ @Override
+ public Value subtract(Value value) {
+ if (value instanceof TensorValue)
+ return value.negate().add(this);
+
+ try {
+ return mutable(this.value - value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("subtract",value);
+ }
+ }
+
+ @Override
+ public Value multiply(Value value) {
+ if (value instanceof TensorValue)
+ return value.multiply(this);
+
+ try {
+ return mutable(this.value * value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("multiply", value);
+ }
+ }
+
+ @Override
+ public Value divide(Value value) {
+ try {
+ return mutable(this.value / value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("divide",value);
+ }
+ }
+
+ @Override
+ public Value modulo(Value value) {
+ try {
+ return mutable(this.value % value.asDouble());
+ }
+ catch (UnsupportedOperationException e) {
+ throw unsupported("modulo",value);
+ }
+ }
+
+}
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 793a0516be3..6490c69894f 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
@@ -116,8 +116,10 @@ public abstract class Value {
return new StringValue(value);
else if (value.startsWith("{"))
return new TensorValue(Tensor.from(value));
- else
- return new DoubleValue(Double.parseDouble(value));
+ else if ((value.indexOf('.') == -1) && (value.indexOf('e') == -1) && (value.indexOf('E') == -1))
+ return new LongValue(Long.parseLong(value));
+ else
+ return new DoubleValue(Double.parseDouble(value));
}
public static Value of(Tensor tensor) {
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/gbdt/GbdtConverterTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/gbdt/GbdtConverterTestCase.java
index 0a0a975778c..fa54af25481 100644
--- a/searchlib/src/test/java/com/yahoo/searchlib/gbdt/GbdtConverterTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/gbdt/GbdtConverterTestCase.java
@@ -84,16 +84,16 @@ public class GbdtConverterTestCase {
@Test
public void testSetTestsWork() throws Exception {
assertConvert("src/test/files/gbdt_set_inclusion_test.xml",
- "if (AGE_GROUP$ in [2.0], if (EDUCATION_LEVEL$ in [0.0], -0.25, 0.125), if (AGE_GROUP$ in [1.0], 0.125, 0.25)) +\n" +
- "if (AGE_GROUP$ in [2.0], if (EDUCATION_LEVEL$ in [0.0], -0.2189117, -0.0), if (EDUCATION_LEVEL$ in [0.0], 0.1094559, 0.2343953)) +\n" +
- "if (AGE_GROUP$ in [2.0], -0.0962185, if (EDUCATION_LEVEL$ in [0.0], if (AGE_GROUP$ in [1.0], 0.0, 0.2055456), 0.205553)) +\n" +
- "if (EDUCATION_LEVEL$ in [0.0], 0.0905977, 0.1812016) +\n" +
- "if (EDUCATION_LEVEL$ in [0.0, 1.0], if (AGE_GROUP$ in [2.0], if (EDUCATION_LEVEL$ in [0.0], -0.191772, -0.0), if (AGE_GROUP$ in [1.0], if (EDUCATION_LEVEL$ in [0.0], 0.0, 0.1608304), 0.1708644)), 0.1923393) +\n" +
- "if (EDUCATION_LEVEL$ in [\"foo\", \"bar\"], if (AGE_GROUP$ in [2.0], if (EDUCATION_LEVEL$ in [\"baz\"], -0.1696624, -0.0), if (AGE_GROUP$ in [1.0], if (EDUCATION_LEVEL$ in [0.0], 0.0, 0.1438091), 0.1521967)), 0.2003772) +\n" +
+ "if (AGE_GROUP$ in [2], if (EDUCATION_LEVEL$ in [0], -0.25, 0.125), if (AGE_GROUP$ in [1], 0.125, 0.25)) +\n" +
+ "if (AGE_GROUP$ in [2], if (EDUCATION_LEVEL$ in [0], -0.2189117, -0.0), if (EDUCATION_LEVEL$ in [0], 0.1094559, 0.2343953)) +\n" +
+ "if (AGE_GROUP$ in [2], -0.0962185, if (EDUCATION_LEVEL$ in [0], if (AGE_GROUP$ in [1], 0.0, 0.2055456), 0.205553)) +\n" +
+ "if (EDUCATION_LEVEL$ in [0], 0.0905977, 0.1812016) +\n" +
+ "if (EDUCATION_LEVEL$ in [0, 1], if (AGE_GROUP$ in [2], if (EDUCATION_LEVEL$ in [0], -0.191772, -0.0), if (AGE_GROUP$ in [1], if (EDUCATION_LEVEL$ in [0], 0.0, 0.1608304), 0.1708644)), 0.1923393) +\n" +
+ "if (EDUCATION_LEVEL$ in [\"foo\", \"bar\"], if (AGE_GROUP$ in [2], if (EDUCATION_LEVEL$ in [\"baz\"], -0.1696624, -0.0), if (AGE_GROUP$ in [1], if (EDUCATION_LEVEL$ in [0], 0.0, 0.1438091), 0.1521967)), 0.2003772) +\n" +
"if (value(0) < 1.0, -0.0108278, 0.0) +\n" +
- "if (EDUCATION_LEVEL$ in [0.0], -0.1500528, if (GENDER$ in [1.0], 0.0652894, 0.1543407)) +\n" +
- "if (AGE_GROUP$ in [1.0], 0.0, 0.1569706) +\n" +
- "if (AGE_GROUP$ in [1.0], 0.0, if (EDUCATION_LEVEL$ in [1.0], 0.0, 0.1405829))\n" +
+ "if (EDUCATION_LEVEL$ in [0], -0.1500528, if (GENDER$ in [1], 0.0652894, 0.1543407)) +\n" +
+ "if (AGE_GROUP$ in [1], 0.0, 0.1569706) +\n" +
+ "if (AGE_GROUP$ in [1], 0.0, if (EDUCATION_LEVEL$ in [1], 0.0, 0.1405829))\n" +
"\n");
}
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/transform/ConstantDereferencerTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/transform/ConstantDereferencerTestCase.java
index c7eab014104..ac148cbedfb 100644
--- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/transform/ConstantDereferencerTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/transform/ConstantDereferencerTestCase.java
@@ -27,8 +27,8 @@ public class ConstantDereferencerTestCase {
constants.put("c", Value.parse("3.5"));
TransformContext context = new TransformContext(constants, new MapTypeContext());
- assertEquals("1.0 + 2.0 + 3.5", c.transform(new RankingExpression("a + b + c"), context).toString());
- assertEquals("myFunction(1.0,2.0)", c.transform(new RankingExpression("myFunction(a, b)"), context).toString());
+ assertEquals("1.0 + 2 + 3.5", c.transform(new RankingExpression("a + b + c"), context).toString());
+ assertEquals("myFunction(1.0,2)", c.transform(new RankingExpression("myFunction(a, b)"), context).toString());
assertEquals("tensor(x[2],y[3])((x + y == 1.0))", c.transform(new RankingExpression("tensor(x[2],y[3])(x+y==a)"), context).toString());
}