diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-11-08 14:33:17 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-11-08 14:33:17 +0100 |
commit | df287b9364b8088192146df70f5f4814ff6c94c1 (patch) | |
tree | 8ee439c76b6640ce22f121790d10895dd8bdf30c /vespajlib | |
parent | 5ccaab5e304bbedc2589610f12ea9fc83d1522ab (diff) |
Always serialize dynamic tensors in verbose form
Diffstat (limited to 'vespajlib')
5 files changed, 38 insertions, 4 deletions
diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json index 6a93a17a8c1..8b87c5dc79f 100644 --- a/vespajlib/abi-spec.json +++ b/vespajlib/abi-spec.json @@ -707,6 +707,7 @@ "final" ], "methods": [ + "public static com.yahoo.tensor.DimensionSizes of(com.yahoo.tensor.TensorType)", "public long size(int)", "public int dimensions()", "public long totalSize()", @@ -820,7 +821,9 @@ "abstract" ], "methods": [ + "public static com.yahoo.tensor.IndexedTensor$Indexes of(com.yahoo.tensor.TensorType)", "public static com.yahoo.tensor.IndexedTensor$Indexes of(com.yahoo.tensor.DimensionSizes)", + "public com.yahoo.tensor.TensorAddress toAddress()", "public long[] indexesCopy()", "public long[] indexesForReading()", "public java.util.List toList()", diff --git a/vespajlib/src/main/java/com/yahoo/tensor/DimensionSizes.java b/vespajlib/src/main/java/com/yahoo/tensor/DimensionSizes.java index c0d817459d0..d81c02fb75f 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/DimensionSizes.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/DimensionSizes.java @@ -18,6 +18,21 @@ public final class DimensionSizes { } /** + * Create sizes from a type containing bound indexed dimensions only. + * + * @throws IllegalStateException if the type contains dimensions which are not bound and indexed + */ + public static DimensionSizes of(TensorType type) { + Builder b = new Builder(type.rank()); + for (int i = 0; i < type.rank(); i++) { + if ( type.dimensions().get(i).type() != TensorType.Dimension.Type.indexedBound) + throw new IllegalArgumentException(type + " contains dimensions without a size"); + b.set(i, type.dimensions().get(i).size().get()); + } + return b.build(); + } + + /** * Returns the length of this in the nth dimension * * @throws IllegalArgumentException if the index is larger than the number of dimensions in this tensor minus one diff --git a/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java index 15476567fb2..176ddfefc13 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java @@ -758,6 +758,15 @@ public abstract class IndexedTensor implements Tensor { protected final long[] indexes; + /** + * Create indexes from a type containing bound indexed dimensions only. + * + * @throws IllegalStateException if the type contains dimensions which are not bound and indexed + */ + public static Indexes of(TensorType type) { + return of(DimensionSizes.of(type)); + } + public static Indexes of(DimensionSizes sizes) { return of(sizes, sizes); } @@ -824,7 +833,7 @@ public abstract class IndexedTensor implements Tensor { } /** Returns the address of the current position of these indexes */ - private TensorAddress toAddress() { + public TensorAddress toAddress() { return TensorAddress.of(indexes); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/DynamicTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/DynamicTensor.java index 9ce2496c65b..1154f962a6f 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/functions/DynamicTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/DynamicTensor.java @@ -129,14 +129,16 @@ public abstract class DynamicTensor extends PrimitiveTensorFunction { return "{" + cells.get(0) + "}"; } - StringBuilder b = new StringBuilder("["); + IndexedTensor.Indexes indexes = IndexedTensor.Indexes.of(type()); + StringBuilder b = new StringBuilder("{"); for (var cell : cells) { - b.append(cell); + indexes.next(); + b.append(indexes.toAddress().toString(type())).append(":").append(cell); b.append(","); } if (b.length() > 1) b.setLength(b.length() - 1); - b.append("]"); + b.append("}"); return b.toString(); } diff --git a/vespajlib/src/test/java/com/yahoo/tensor/functions/DynamicTensorTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/functions/DynamicTensorTestCase.java index 82652fb0e5d..474e6200676 100644 --- a/vespajlib/src/test/java/com/yahoo/tensor/functions/DynamicTensorTestCase.java +++ b/vespajlib/src/test/java/com/yahoo/tensor/functions/DynamicTensorTestCase.java @@ -24,12 +24,14 @@ public class DynamicTensorTestCase { DynamicTensor t1 = DynamicTensor.from(dense, List.of(new Constant(1), new Constant(2), new Constant(3))); assertEquals(Tensor.from(dense, "[1, 2, 3]"), t1.evaluate()); + assertEquals("tensor(x[3]):{{x:0}:1.0,{x:1}:2.0,{x:2}:3.0}", t1.toString()); TensorType sparse = TensorType.fromSpec("tensor(x{})"); DynamicTensor t2 = DynamicTensor.from(sparse, Collections.singletonMap(new TensorAddress.Builder(sparse).add("x", "a").build(), new Constant(5))); assertEquals(Tensor.from(sparse, "{{x:a}:5}"), t2.evaluate()); + assertEquals("tensor(x{}):{{x:a}:5.0}", t2.toString()); } private static class Constant implements Function<EvaluationContext<?>, Double> { @@ -41,6 +43,9 @@ public class DynamicTensorTestCase { @Override public Double apply(EvaluationContext<?> evaluationContext) { return value; } + @Override + public String toString() { return String.valueOf(value); } + } } |