diff options
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java b/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java index ec3020a1a4e..f44b3ce13b7 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/MappedTensor.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap; import java.util.Iterator; import java.util.Map; +import java.util.function.DoubleBinaryOperator; /** * A sparse implementation of a tensor backed by a Map of cells to values. @@ -51,6 +52,25 @@ public class MappedTensor implements Tensor { } @Override + public Tensor merge(DoubleBinaryOperator op, Map<TensorAddress, Double> addCells) { + + // currently, underlying implementation disallows multiple entries with the same key + + Tensor.Builder builder = Tensor.Builder.of(type()); + for (Map.Entry<TensorAddress, Double> cell : cells.entrySet()) { + TensorAddress address = cell.getKey(); + double value = cell.getValue(); + builder.cell(address, addCells.containsKey(address) ? op.applyAsDouble(value, addCells.get(address)) : value); + } + for (Map.Entry<TensorAddress, Double> addCell : addCells.entrySet()) { + if ( ! cells.containsKey(addCell.getKey())) { + builder.cell(addCell.getKey(), addCell.getValue()); + } + } + return builder.build(); + } + + @Override public int hashCode() { return cells.hashCode(); } @Override |