diff options
author | Lester Solbakken <lesters@oath.com> | 2021-06-21 12:21:19 +0200 |
---|---|---|
committer | Lester Solbakken <lesters@oath.com> | 2021-06-21 12:21:19 +0200 |
commit | 626870d56dcd8b4b199a643f29880b948641da8e (patch) | |
tree | e94997b49bc9dcab66209260b16b712120ddb7eb /searchlib | |
parent | 642cdd49f80c8d3f1f590c1c59ec4e6f1d699bf3 (diff) |
Add bit ranking function in Java
Diffstat (limited to 'searchlib')
5 files changed, 28 insertions, 3 deletions
diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json index 5035a5f583f..65151dd6ff0 100644 --- a/searchlib/abi-spec.json +++ b/searchlib/abi-spec.json @@ -1033,6 +1033,7 @@ "public static final int FMOD", "public static final int LDEXP", "public static final int POW", + "public static final int BIT", "public static final int MAP", "public static final int REDUCE", "public static final int JOIN", @@ -1387,7 +1388,8 @@ "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function ldexp", "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function max", "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function min", - "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function pow" + "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function pow", + "public static final enum com.yahoo.searchlib.rankingexpression.rule.Function bit" ] }, "com.yahoo.searchlib.rankingexpression.rule.FunctionNode": { diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java index b109e6503e3..e41732f9d16 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java @@ -156,6 +156,7 @@ public class TensorValue extends Value { case pow: return value.pow(argument); case fmod: return value.fmod(argument); case ldexp: return value.ldexp(argument); + case bit: return value.bit(argument); default: throw new UnsupportedOperationException("Cannot combine two tensors using " + function); } } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/Function.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/Function.java index 99afb3b38d0..ad04832053f 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/Function.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/Function.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.searchlib.rankingexpression.rule; +import com.yahoo.tensor.Tensor; import com.yahoo.tensor.functions.ScalarFunctions; import java.io.Serializable; @@ -45,7 +46,8 @@ public enum Function implements Serializable { ldexp(2) { public double evaluate(double x, double y) { return x*pow(2,(int)y); } }, max(2) { public double evaluate(double x, double y) { return max(x,y); } }, min(2) { public double evaluate(double x, double y) { return min(x,y); } }, - pow(2) { public double evaluate(double x, double y) { return pow(x,y); } }; + pow(2) { public double evaluate(double x, double y) { return pow(x,y); } }, + bit(2) { public double evaluate(double x, double y) { return ((int)y < 8 && (int)y >= 8 && ((int)x & (1 << (int)y)) != 0) ? 1.0 : 0.0; } }; private final int arity; diff --git a/searchlib/src/main/javacc/RankingExpressionParser.jj b/searchlib/src/main/javacc/RankingExpressionParser.jj index 7506fe250fc..99eff010628 100755 --- a/searchlib/src/main/javacc/RankingExpressionParser.jj +++ b/searchlib/src/main/javacc/RankingExpressionParser.jj @@ -123,6 +123,7 @@ TOKEN : // MAX // MIN <POW: "pow"> | + <BIT: "bit"> | <MAP: "map"> | <REDUCE: "reduce"> | @@ -733,7 +734,8 @@ Function binaryFunctionName() : { } <LDEXP> { return Function.ldexp; } | <MAX> { return Function.max; } | <MIN> { return Function.min; } | - <POW> { return Function.pow; } + <POW> { return Function.pow; } | + <BIT> { return Function.bit; } } List<ExpressionNode> expressionList() : diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java index d6302d7026e..4a3c4b248be 100644 --- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java +++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java @@ -403,6 +403,24 @@ public class EvaluationTestCase { } @Test + public void testBitExtraction() { + EvaluationTester tester = new EvaluationTester(); + tester.assertEvaluates(1.0, "bit(-43,7)"); + tester.assertEvaluates(1.0, "bit(-43,6)"); + tester.assertEvaluates(0.0, "bit(-43,5)"); + tester.assertEvaluates(1.0, "bit(-43,4)"); + tester.assertEvaluates(0.0, "bit(-43,3)"); + tester.assertEvaluates(1.0, "bit(-43,2)"); + tester.assertEvaluates(0.0, "bit(-43,1)"); + tester.assertEvaluates(1.0, "bit(-43,0)"); + tester.assertEvaluates( + "tensor<int8>(x[40]):[1,1,0,1,0,1,0,1, 0,0,0,0,0,0,0,0, 0,1,0,1,0,1,0,1, 0,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0]", + "tensor<int8>(x[40])(bit(tensor0{y:x / 8}, 7 - x % 8))", + "tensor<int8>(y[5]):[-43,0,85,127,-128]" + ); + } + + @Test public void testCellTypeCasting() { EvaluationTester tester = new EvaluationTester(); |