aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-05-09 12:37:14 +0200
committerJon Bratseth <bratseth@gmail.com>2022-05-09 12:37:14 +0200
commit8ac835c8d45b538c36be97ca3de545aa73c9d29d (patch)
treec0b511602ba1de4dda2f28307860226ab9093b23 /vespajlib
parent032aaa3611dd82bd9eaf2366c54babb47f81a9aa (diff)
Output input default values in rank properties
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/abi-spec.json17
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/IndexedTensor.java23
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java13
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java26
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/Tensor.java31
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java14
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