diff options
author | Lester Solbakken <lesters@oath.com> | 2021-04-28 12:02:12 +0200 |
---|---|---|
committer | Lester Solbakken <lesters@oath.com> | 2021-04-28 12:02:12 +0200 |
commit | b5c513e94d636fdd0943127dd84b086de37f375d (patch) | |
tree | 24756117fa84e47b9d388dd52ee6668523460892 | |
parent | 4fbd27dddde4aff5de1be48f79057b6357bed123 (diff) |
Don't expose initial aggregator values when reducing empty tensors
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java | 4 | ||||
-rw-r--r-- | vespajlib/src/test/java/com/yahoo/tensor/functions/ReduceTestCase.java | 10 |
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())); } |