diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-01-24 01:33:20 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2024-01-25 20:17:49 +0100 |
commit | a1e14c645d88fecfab1abb0072e0abc26677e752 (patch) | |
tree | 9d22ff810f3694912005ddc455ca3425699b2fe7 /vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java | |
parent | d9fb5104948ad6b8758e5a902af3fad0f9e506ce (diff) |
Make tensor addresses integer based instead of as strings.
Positive numbers are direct indexes, while strings that does not represent numbers are enumerated
and represented with negative integers.
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java | 43 |
1 files changed, 6 insertions, 37 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java index 95d1d70118a..d4469f447cb 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java @@ -4,8 +4,6 @@ package com.yahoo.tensor; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.yahoo.tensor.impl.NumericTensorAddress; -import com.yahoo.tensor.impl.StringTensorAddress; import java.util.ArrayList; import java.util.Arrays; @@ -111,7 +109,7 @@ public class MixedTensor implements Tensor { return new Iterator<>() { final Iterator<DenseSubspace> blockIterator = index.denseSubspaces.iterator(); DenseSubspace currBlock = null; - final long[] labels = new long[index.indexedDimensions.size()]; + final int[] labels = new int[index.indexedDimensions.size()]; int currOffset = index.denseSubspaceSize; int prevOffset = -1; @Override @@ -127,7 +125,7 @@ public class MixedTensor implements Tensor { if (currOffset != prevOffset) { // Optimization for index.denseSubspaceSize == 1 index.denseOffsetToAddress(currOffset, labels); } - TensorAddress fullAddr = index.fullAddressOf(currBlock.sparseAddress, labels); + TensorAddress fullAddr = currBlock.sparseAddress.fullAddressOf(index.type.dimensions(), labels); prevOffset = currOffset; double value = currBlock.cells[currOffset++]; return new Cell(fullAddr, value); @@ -321,7 +319,7 @@ public class MixedTensor implements Tensor { @Override public Tensor.Builder cell(TensorAddress address, double value) { - TensorAddress sparsePart = index.sparsePartialAddress(address); + TensorAddress sparsePart = address.sparsePartialAddress(index.sparseType, index.type.dimensions()); int denseOffset = index.denseOffsetOf(address); double[] denseSubspace = denseSubspace(sparsePart); denseSubspace[denseOffset] = value; @@ -475,7 +473,7 @@ public class MixedTensor implements Tensor { } private DenseSubspace blockOf(TensorAddress address) { - TensorAddress sparsePart = sparsePartialAddress(address); + TensorAddress sparsePart = address.sparsePartialAddress(sparseType, type.dimensions()); Integer blockNum = sparseMap.get(sparsePart); if (blockNum == null || blockNum >= denseSubspaces.size()) { return null; @@ -502,19 +500,7 @@ public class MixedTensor implements Tensor { return denseSubspaceSize; } - private TensorAddress sparsePartialAddress(TensorAddress address) { - if (type.dimensions().size() != address.size()) - throw new IllegalArgumentException("Tensor type of " + this + " is not the same size as " + address); - TensorAddress.Builder builder = new TensorAddress.Builder(sparseType); - for (int i = 0; i < type.dimensions().size(); ++i) { - TensorType.Dimension dimension = type.dimensions().get(i); - if ( ! dimension.isIndexed()) - builder.add(dimension.name(), address.label(i)); - } - return builder.build(); - } - - private void denseOffsetToAddress(long denseOffset, long [] labels) { + private void denseOffsetToAddress(long denseOffset, int [] labels) { if (denseOffset < 0 || denseOffset > denseSubspaceSize) { throw new IllegalArgumentException("Offset out of bounds"); } @@ -524,28 +510,11 @@ public class MixedTensor implements Tensor { for (int i = 0; i < labels.length; ++i) { innerSize /= indexedDimensionsSize[i]; - labels[i] = restSize / innerSize; + labels[i] = (int) (restSize / innerSize); restSize %= innerSize; } } - private TensorAddress fullAddressOf(TensorAddress sparsePart, long [] densePart) { - String[] labels = new String[type.dimensions().size()]; - int mappedIndex = 0; - int indexedIndex = 0; - for (int i = 0; i < type.dimensions().size(); i++) { - TensorType.Dimension d = type.dimensions().get(i); - if (d.isIndexed()) { - labels[i] = NumericTensorAddress.asString(densePart[indexedIndex]); - indexedIndex++; - } else { - labels[i] = sparsePart.label(mappedIndex); - mappedIndex++; - } - } - return StringTensorAddress.unsafeOf(labels); - } - @Override public String toString() { return "index into " + type; |