summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorLester Solbakken <lesters@oath.com>2021-06-21 12:21:19 +0200
committerLester Solbakken <lesters@oath.com>2021-06-21 12:21:19 +0200
commit626870d56dcd8b4b199a643f29880b948641da8e (patch)
treee94997b49bc9dcab66209260b16b712120ddb7eb /searchlib
parent642cdd49f80c8d3f1f590c1c59ec4e6f1d699bf3 (diff)
Add bit ranking function in Java
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/abi-spec.json4
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/evaluation/TensorValue.java1
-rw-r--r--searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/Function.java4
-rwxr-xr-xsearchlib/src/main/javacc/RankingExpressionParser.jj4
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java18
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();