summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorLester Solbakken <lesters@oath.com>2021-04-28 12:02:12 +0200
committerLester Solbakken <lesters@oath.com>2021-04-28 12:02:12 +0200
commitb5c513e94d636fdd0943127dd84b086de37f375d (patch)
tree24756117fa84e47b9d388dd52ee6668523460892 /vespajlib
parent4fbd27dddde4aff5de1be48f79057b6357bed123 (diff)
Don't expose initial aggregator values when reducing empty tensors
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java4
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java10
2 files changed, 12 insertions, 2 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java
index 86f23487efb..879daefaf72 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java
@@ -114,7 +114,9 @@ public class Reduce<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMET
// Special case: Reduce all
if (dimensions.isEmpty() || dimensions.size() == argument.type().dimensions().size())
- if (argument.type().dimensions().size() == 1 && argument instanceof IndexedTensor)
+ if (argument.isEmpty())
+ return Tensor.from(0.0);
+ else if (argument.type().dimensions().size() == 1 && argument instanceof IndexedTensor)
return reduceIndexedVector((IndexedTensor)argument, aggregator);
else
return reduceAllGeneral(argument, aggregator);
diff --git a/vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java
index 21fed1745b9..7d052467f64 100644
--- a/vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java
@@ -16,7 +16,6 @@ public class ReduceTestCase {
@Test
public void testReduce() {
- assertNan(Tensor.from("tensor(x{})", "{}").median());
assertEquals(1.0, Tensor.from("tensor(x[1])", "[1]").median().asDouble(), delta);
assertEquals(1.5, Tensor.from("tensor(x[2])", "[1, 2]").median().asDouble(), delta);
assertEquals(3.0, Tensor.from("tensor(x[7])", "[3, 1, 1, 1, 4, 4, 4]").median().asDouble(), delta);
@@ -28,6 +27,15 @@ public class ReduceTestCase {
assertNan(Tensor.Builder.of("tensor(x[1])").cell(Double.NaN, 0).build().median());
}
+ @Test
+ public void testEmptyReduce() {
+ assertEquals(0.0, Tensor.from("tensor(x[3],y{})", "{}").avg().asDouble(), delta);
+ assertEquals(0.0, Tensor.from("tensor(x[3],y{})", "{}").max().asDouble(), delta);
+ assertEquals(0.0, Tensor.from("tensor(x[3],y{})", "{}").median().asDouble(), delta);
+ assertEquals(0.0, Tensor.from("tensor(x[3],y{})", "{}").min().asDouble(), delta);
+ assertEquals(0.0, Tensor.from("tensor(x[3],y{})", "{}").prod().asDouble(), delta);
+ }
+
private void assertNan(Tensor tensor) {
assertTrue(tensor + " is NaN", Double.isNaN(tensor.asDouble()));
}