diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-05-09 12:37:14 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-05-09 12:37:14 +0200 |
commit | 8ac835c8d45b538c36be97ca3de545aa73c9d29d (patch) | |
tree | c0b511602ba1de4dda2f28307860226ab9093b23 /vespajlib | |
parent | 032aaa3611dd82bd9eaf2366c54babb47f81a9aa (diff) |
Output input default values in rank properties
Diffstat (limited to 'vespajlib')
6 files changed, 80 insertions, 44 deletions
diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json index 5e6168e71f7..f7be61946ba 100644 --- a/vespajlib/abi-spec.json +++ b/vespajlib/abi-spec.json @@ -906,7 +906,8 @@ "public java.util.Map cells()", "public com.yahoo.tensor.Tensor remove(java.util.Set)", "public java.lang.String toString()", - "public java.lang.String toShortString()", + "public java.lang.String toString(boolean, boolean)", + "public java.lang.String toAbbreviatedString()", "public boolean equals(java.lang.Object)", "public bridge synthetic com.yahoo.tensor.Tensor withType(com.yahoo.tensor.TensorType)" ], @@ -957,7 +958,8 @@ "public com.yahoo.tensor.Tensor remove(java.util.Set)", "public int hashCode()", "public java.lang.String toString()", - "public java.lang.String toShortString()", + "public java.lang.String toString(boolean, boolean)", + "public java.lang.String toAbbreviatedString()", "public boolean equals(java.lang.Object)" ], "fields": [] @@ -1049,7 +1051,8 @@ "public com.yahoo.tensor.Tensor remove(java.util.Set)", "public int hashCode()", "public java.lang.String toString()", - "public java.lang.String toShortString()", + "public java.lang.String toString(boolean, boolean)", + "public java.lang.String toAbbreviatedString()", "public boolean equals(java.lang.Object)", "public long denseSubspaceSize()", "public static com.yahoo.tensor.TensorType createPartialType(com.yahoo.tensor.TensorType$Value, java.util.List)" @@ -1237,9 +1240,11 @@ "public java.util.List largest()", "public java.util.List smallest()", "public abstract java.lang.String toString()", - "public abstract java.lang.String toShortString()", - "public static java.lang.String toStandardString(com.yahoo.tensor.Tensor, long)", - "public static java.lang.String contentToString(com.yahoo.tensor.Tensor, long)", + "public abstract java.lang.String toString(boolean, boolean)", + "public abstract java.lang.String toAbbreviatedString()", + "public java.lang.String toShortString()", + "public static java.lang.String toStandardString(com.yahoo.tensor.Tensor, boolean, boolean, long)", + "public static java.lang.String valueToString(com.yahoo.tensor.Tensor, boolean, long)", "public abstract boolean equals(java.lang.Object)", "public abstract int hashCode()", "public static boolean equals(com.yahoo.tensor.Tensor, com.yahoo.tensor.Tensor)", diff --git a/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java index 76629a20b2f..c4316eb334a 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java @@ -219,21 +219,26 @@ public abstract class IndexedTensor implements Tensor { } @Override - public String toString() { return toString(Long.MAX_VALUE); } + public String toString() { return toString(true, true); } @Override - public String toShortString() { - return toString(Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + public String toString(boolean withType, boolean shortForms) { + return toString(withType, shortForms, Long.MAX_VALUE); } - private String toString(long maxCells) { - if (type.rank() == 0) return Tensor.toStandardString(this, maxCells); - if (type.dimensions().stream().anyMatch(d -> d.size().isEmpty())) - return Tensor.toStandardString(this, maxCells); + @Override + public String toAbbreviatedString() { + return toString(true, true, Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + } - Indexes indexes = Indexes.of(dimensionSizes); + private String toString(boolean withType, boolean shortForms, long maxCells) { + if (! shortForms || type.rank() == 0 || type.dimensions().stream().anyMatch(d -> d.size().isEmpty())) + return Tensor.toStandardString(this, withType, shortForms, maxCells); - StringBuilder b = new StringBuilder(type.toString()).append(":"); + Indexes indexes = Indexes.of(dimensionSizes); + StringBuilder b = new StringBuilder(); + if (withType) + b.append(type).append(":"); indexedBlockToString(this, indexes, maxCells, b); return b.toString(); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java index ad945ed18bf..946d8fe0f4a 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java @@ -72,11 +72,18 @@ public class MappedTensor implements Tensor { public int hashCode() { return cells.hashCode(); } @Override - public String toString() { return Tensor.toStandardString(this, Long.MAX_VALUE); } + public String toString() { return toString(true, true); } @Override - public String toShortString() { - return Tensor.toStandardString(this, Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + public String toString(boolean withType, boolean shortForms) { return toString(withType, shortForms, Long.MAX_VALUE); } + + @Override + public String toAbbreviatedString() { + return toString(true, true, Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + } + + private String toString(boolean withType, boolean shortForms, long maxCells) { + return Tensor.toStandardString(this, withType, shortForms, maxCells); } @Override diff --git a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java index 56bd94a86e9..d2fed9b96f9 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java @@ -145,23 +145,27 @@ public class MixedTensor implements Tensor { @Override public String toString() { - return toString(Long.MAX_VALUE); + return toString(true, true); } @Override - public String toShortString() { - return toString(Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + public String toString(boolean withType, boolean shortForms) { + return toString(withType, shortForms, Long.MAX_VALUE); } - private String toString(long maxCells) { - if (type.rank() == 0) - return Tensor.toStandardString(this, maxCells); - if (type.rank() > 1 && type.dimensions().stream().filter(d -> d.isIndexed()).anyMatch(d -> d.size().isEmpty())) - return Tensor.toStandardString(this, maxCells); - if (type.dimensions().stream().filter(d -> d.isMapped()).count() > 1) - return Tensor.toStandardString(this, maxCells); + @Override + public String toAbbreviatedString() { + return toString(true, true, Math.max(2, 10 / (type().dimensions().stream().filter(d -> d.isMapped()).count() + 1))); + } + + private String toString(boolean withType, boolean shortForms, long maxCells) { + if (! shortForms + || type.rank() == 0 + || type.rank() > 1 && type.dimensions().stream().filter(d -> d.isIndexed()).anyMatch(d -> d.size().isEmpty()) + || type.dimensions().stream().filter(d -> d.isMapped()).count() > 1) + return Tensor.toStandardString(this, withType, shortForms, maxCells); - return type + ":" + index.contentToString(this, maxCells); + return (withType ? type + ":" : "") + index.contentToString(this, maxCells); } @Override diff --git a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java index 94b00e7e277..8a84e97fe05 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java @@ -32,7 +32,6 @@ import java.util.Set; import java.util.function.DoubleBinaryOperator; import java.util.function.DoubleUnaryOperator; import java.util.function.Function; -import java.util.stream.Collectors; import static com.yahoo.tensor.functions.ScalarFunctions.Hamming; @@ -316,8 +315,22 @@ public interface Tensor { @Override String toString(); + /** + * Returns this tensor on the + * <a href="https://docs.vespa.ai/en/reference/tensor.html#tensor-literal-form">tensor literal form</a>. + * + * @param withType whether to prefix the value by the type of this + * @param shortForms whether to use short forms where applicable, or always using the verbose form + */ + String toString(boolean withType, boolean shortForms); + /** Returns an abbreviated string representation of this tensor suitable for human-readable messages */ - String toShortString(); + String toAbbreviatedString(); + + // TODO: Remove on Vespa 8 + /** @deprecated use toAbbreviatedString */ + @Deprecated + default String toShortString() { return toAbbreviatedString(); } /** * Call this from toString in implementations to return this tensor on the @@ -325,15 +338,16 @@ public interface Tensor { * (toString cannot be a default method because default methods cannot override super methods). * * @param tensor the tensor to return the standard string format of + * @param withType whether the type should be prepended to the content * @param maxCells the max number of cells to output, after which just , "..." is output to represent the rest * of the cells * @return the tensor on the standard string format */ - static String toStandardString(Tensor tensor, long maxCells) { - return tensor.type() + ":" + contentToString(tensor, maxCells); + static String toStandardString(Tensor tensor, boolean withType, boolean shortForms, long maxCells) { + return (withType ? tensor.type() + ":" : "") + valueToString(tensor, shortForms, maxCells); } - static String contentToString(Tensor tensor, long maxCells) { + static String valueToString(Tensor tensor, boolean shortForms, long maxCells) { var cellEntries = new ArrayList<>(tensor.cells().entrySet()); cellEntries.sort(Map.Entry.comparingByKey()); if (tensor.type().dimensions().isEmpty()) { @@ -345,7 +359,7 @@ public interface Tensor { for (; i < cellEntries.size() && i < maxCells; i++) { if (i > 0) b.append(", "); - b.append(cellToString(cellEntries.get(i), tensor.type())); + b.append(cellToString(cellEntries.get(i), tensor.type(), shortForms)); } if (i == maxCells && i < tensor.size()) b.append(", ..."); @@ -353,8 +367,9 @@ public interface Tensor { return b.toString(); } - private static String cellToString(Map.Entry<TensorAddress, Double> cell, TensorType type) { - return (type.rank() > 1 ? cell.getKey().toString(type) : TensorAddress.labelToString(cell.getKey().label(0))) + + private static String cellToString(Map.Entry<TensorAddress, Double> cell, TensorType type, boolean shortForms) { + return (shortForms && type.rank() == 1 ? TensorAddress.labelToString(cell.getKey().label(0)) + : cell.getKey().toString(type) ) + ":" + cell.getValue(); } diff --git a/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java index 2067d7a8492..920f8512c53 100644 --- a/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java +++ b/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java @@ -65,24 +65,24 @@ public class TensorTestCase { @Test public void testToShortString() { assertEquals("tensor(x[10]):[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]", - Tensor.from("tensor(x[10]):[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]").toShortString()); + Tensor.from("tensor(x[10]):[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]").toAbbreviatedString()); assertEquals("tensor(x[14]):[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, ...]", - Tensor.from("tensor(x[14]):[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]").toShortString()); + Tensor.from("tensor(x[14]):[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]").toAbbreviatedString()); assertEquals("tensor(d1{},d2{}):{{d1:l1,d2:l1}:6.0, {d1:l1,d2:l2}:6.0, {d1:l1,d2:l3}:6.0, ...}", Tensor.from("{{d1:l1,d2:l1}:6, {d2:l2,d1:l1}:6, {d2:l3,d1:l1}:6, {d2:l4,d1:l1}:6, {d2:l5,d1:l1}:6," + " {d2:l6,d1:l1}:6, {d2:l7,d1:l1}:6, {d2:l8,d1:l1}:6, {d2:l9,d1:l1}:6, {d2:l2,d1:l2}:6," + - " {d2:l2,d1:l3}:6, {d2:l2,d1:l4}:6}").toShortString()); + " {d2:l2,d1:l3}:6, {d2:l2,d1:l4}:6}").toAbbreviatedString()); assertEquals("tensor(m{},x[3]):{k1:[0.0, 1.0, 2.0], k2:[0.0, 1.0, ...}", - Tensor.from("tensor(m{},x[3]):{k1:[0,1,2], k2:[0,1,2], k3:[0,1,2], k4:[0,1,2]}").toShortString()); + Tensor.from("tensor(m{},x[3]):{k1:[0,1,2], k2:[0,1,2], k3:[0,1,2], k4:[0,1,2]}").toAbbreviatedString()); assertEquals("tensor(m{},x[3]):{k1:[0.0, 1.0, 2.0], k2:[0.0, 1.0, ...}", - Tensor.from("tensor(m{},x[3]):{k1:[0,1,2], k2:[0,1,2], k3:[0,1,2], k4:[0,1,2]}").toShortString()); + Tensor.from("tensor(m{},x[3]):{k1:[0,1,2], k2:[0,1,2], k3:[0,1,2], k4:[0,1,2]}").toAbbreviatedString()); assertEquals("tensor(m{},n{},x[3]):{{m:k1,n:k1,x:0}:0.0, {m:k1,n:k1,x:1}:1.0, {m:k1,n:k1,x:2}:2.0, ...}", Tensor.from("tensor(m{},n{},x[3]):" + "{{m:k1,n:k1,x:0}:0, {m:k1,n:k1,x:1}:1, {m:k1,n:k1,x:2}:2, " + " {m:k2,n:k1,x:0}:0, {m:k2,n:k1,x:1}:1, {m:k2,n:k1,x:2}:2, " + - " {m:k3,n:k1,x:0}:0, {m:k3,n:k1,x:1}:1, {m:k3,n:k1,x:2}:2}").toShortString()); + " {m:k3,n:k1,x:0}:0, {m:k3,n:k1,x:1}:1, {m:k3,n:k1,x:2}:2}").toAbbreviatedString()); assertEquals("tensor(m{},x[2],y[2]):{k1:[[0.0, 1.0], [2.0, 3.0]], k2:[[0.0, ...}", - Tensor.from("tensor(m{},x[2],y[2]):{k1:[[0,1],[2,3]], k2:[[0,1],[2,3]], k3:[[0,1],[2,3]]}").toShortString()); + Tensor.from("tensor(m{},x[2],y[2]):{k1:[[0,1],[2,3]], k2:[[0,1],[2,3]], k3:[[0,1],[2,3]]}").toAbbreviatedString()); } @Test |