From 965a96d30aa606b70ce37767f7922cd8809b0ba3 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Sun, 21 Jan 2024 13:48:31 +0100 Subject: Cache size of intersected sets, as they are recomputed every time. --- vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java index 1ded16636d3..7a336233de0 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java @@ -114,7 +114,7 @@ public class Join extends PrimitiveTensorFunction aIterator = a.valueIterator(); Iterator bIterator = b.valueIterator(); IndexedTensor.Builder builder = IndexedTensor.Builder.of(type, new DimensionSizes.Builder(1).set(0, joinedRank).build()); @@ -170,7 +170,7 @@ public class Join extends PrimitiveTensorFunction superspace, long superspaceSize, boolean reversedArgumentOrder, IndexedTensor.Builder builder, DoubleBinaryOperator combinator) { - long joinedLength = Math.min(subspaceSize, superspaceSize); + int joinedLength = (int)Math.min(subspaceSize, superspaceSize); if (reversedArgumentOrder) { for (int i = 0; i < joinedLength; i++) { Tensor.Cell supercell = superspace.next(); @@ -252,6 +252,7 @@ public class Join extends PrimitiveTensorFunction sharedDimensions = Sets.intersection(a.type().dimensionNames(), b.type().dimensionNames()); + int sharedDimensionSize = sharedDimensions.size(); // Expensive to compute size after intersection Set dimensionsOnlyInA = Sets.difference(a.type().dimensionNames(), b.type().dimensionNames()); DimensionSizes aIterateSize = joinedSizeOf(a.type(), joinedType, joinedSize); @@ -263,7 +264,7 @@ public class Join extends PrimitiveTensorFunction extends PrimitiveTensorFunction retainDimensions) { - PartialAddress.Builder builder = new PartialAddress.Builder(retainDimensions.size()); + private static PartialAddress partialAddress(TensorType addressType, TensorAddress address, + Set retainDimensions, int sharedDimensionSize) { + PartialAddress.Builder builder = new PartialAddress.Builder(sharedDimensionSize); for (int i = 0; i < addressType.dimensions().size(); i++) if (retainDimensions.contains(addressType.dimensions().get(i).name())) builder.add(addressType.dimensions().get(i).name(), address.numericLabel(i)); -- cgit v1.2.3 From f5803f3537919f7a81be9095cc4eec8a830e3ae4 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Sun, 21 Jan 2024 13:58:39 +0100 Subject: - Use get(key) instead of containsKey to avoid extra lookup. - Enough to use only array[long] and convert directly. No need to create temporary TensorAddress. --- .../main/java/com/yahoo/tensor/MixedTensor.java | 40 ++++++++-------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java index 30dd1d6dc29..55fb4af551e 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/MixedTensor.java @@ -3,6 +3,7 @@ package com.yahoo.tensor; import com.google.common.collect.ImmutableMap; +import com.yahoo.tensor.impl.NumericTensorAddress; import com.yahoo.tensor.impl.StringTensorAddress; import java.util.ArrayList; @@ -326,10 +327,12 @@ public class MixedTensor implements Tensor { } private double[] denseSubspace(TensorAddress sparseAddress) { - if (!denseSubspaceMap.containsKey(sparseAddress)) { - denseSubspaceMap.put(sparseAddress, new double[(int)denseSubspaceSize()]); + double [] values = denseSubspaceMap.get(sparseAddress); + if (values == null) { + values = new double[(int)denseSubspaceSize()]; + denseSubspaceMap.put(sparseAddress, values); } - return denseSubspaceMap.get(sparseAddress); + return values; } public IndexedTensor.DirectIndexBuilder denseSubspaceBuilder(TensorAddress sparseAddress) { @@ -520,7 +523,7 @@ public class MixedTensor implements Tensor { return builder.build(); } - private TensorAddress denseOffsetToAddress(long denseOffset) { + private long[] denseOffsetToAddress(long denseOffset) { if (denseOffset < 0 || denseOffset > denseSubspaceSize) { throw new IllegalArgumentException("Offset out of bounds"); } @@ -538,17 +541,17 @@ public class MixedTensor implements Tensor { labels[i] = restSize / innerSize; restSize %= innerSize; } - return TensorAddress.of(labels); + return labels; } TensorAddress fullAddressOf(TensorAddress sparsePart, long denseOffset) { - TensorAddress densePart = denseOffsetToAddress(denseOffset); + long [] densePart = denseOffsetToAddress(denseOffset); String[] labels = new String[type.dimensions().size()]; int mappedIndex = 0; int indexedIndex = 0; for (TensorType.Dimension d : type.dimensions()) { if (d.isIndexed()) { - labels[mappedIndex + indexedIndex] = densePart.label(indexedIndex); + labels[mappedIndex + indexedIndex] = NumericTensorAddress.asString(densePart[indexedIndex]); indexedIndex++; } else { labels[mappedIndex + indexedIndex] = sparsePart.label(mappedIndex); @@ -607,8 +610,7 @@ public class MixedTensor implements Tensor { b.append(", "); // start brackets - for (int i = 0; i < indexes.nextDimensionsAtStart(); i++) - b.append("["); + b.append("[".repeat(Math.max(0, indexes.nextDimensionsAtStart()))); // value switch (type.valueType()) { @@ -621,8 +623,7 @@ public class MixedTensor implements Tensor { } // end bracket - for (int i = 0; i < indexes.nextDimensionsAtEnd(); i++) - b.append("]"); + b.append("]".repeat(Math.max(0, indexes.nextDimensionsAtEnd()))); } return index; } @@ -656,27 +657,16 @@ public class MixedTensor implements Tensor { } } - private static class DenseSubspaceBuilder implements IndexedTensor.DirectIndexBuilder { - - private final TensorType type; - private final double[] values; - - public DenseSubspaceBuilder(TensorType type, double[] values) { - this.type = type; - this.values = values; - } - - @Override - public TensorType type() { return type; } + private record DenseSubspaceBuilder(TensorType type, double[] values) implements IndexedTensor.DirectIndexBuilder { @Override public void cellByDirectIndex(long index, double value) { - values[(int)index] = value; + values[(int) index] = value; } @Override public void cellByDirectIndex(long index, float value) { - values[(int)index] = value; + values[(int) index] = value; } } -- cgit v1.2.3