diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-11-03 16:56:45 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-11-03 16:56:45 +0100 |
commit | 4cc0c0885fd8b5f5e2fde130cfe409bbc9990455 (patch) | |
tree | 09e0d16df9c0db8b6bafaf82ee865844b86e5886 /searchlib | |
parent | 9d5f4971e89870ec61b1b309287c563ead7d8b75 (diff) |
Add a LongValue to preserve integer numbers.
Diffstat (limited to 'searchlib')
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()); } |