diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-04-26 14:48:50 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-04-26 14:48:50 +0200 |
commit | f0f7f4962e6339ad2b4fbd293e89df86a6ec7a0a (patch) | |
tree | 577ba74ca8917cd5fa16eb950be363bf0771a61f /vespajlib | |
parent | ae5d5e058f1bb2fd197886ac374ce807065fdb77 (diff) |
Decode directly as float
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/serialization/DenseBinaryFormat.java | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/serialization/DenseBinaryFormat.java b/vespajlib/src/main/java/com/yahoo/tensor/serialization/DenseBinaryFormat.java index 5072484567d..ec8c7de1e72 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/serialization/DenseBinaryFormat.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/serialization/DenseBinaryFormat.java @@ -51,15 +51,22 @@ public class DenseBinaryFormat implements BinaryFormat { private void encodeCells(GrowableByteBuffer buffer, Tensor tensor) { switch (serializationValueType) { - case DOUBLE: encodeCells(tensor, buffer::putDouble); break; - case FLOAT: encodeCells(tensor, (i) -> buffer.putFloat(i.floatValue())); break; + case DOUBLE: encodeDoubleCells(tensor, buffer); break; + case FLOAT: encodeFloatCells(tensor, buffer); break; } } - private void encodeCells(Tensor tensor, Consumer<Double> consumer) { + private void encodeDoubleCells(Tensor tensor, GrowableByteBuffer buffer) { Iterator<Double> i = tensor.valueIterator(); while (i.hasNext()) { - consumer.accept(i.next()); + buffer.putDouble(i.next()); + } + } + + private void encodeFloatCells(Tensor tensor, GrowableByteBuffer buffer) { + Iterator<Double> i = tensor.valueIterator(); // TODO: floatValueIterator + while (i.hasNext()) { + buffer.putFloat(i.next().floatValue()); } } @@ -106,14 +113,19 @@ public class DenseBinaryFormat implements BinaryFormat { private void decodeCells(DimensionSizes sizes, GrowableByteBuffer buffer, IndexedTensor.BoundBuilder builder) { switch (serializationValueType) { - case DOUBLE: decodeCells(sizes, builder, buffer::getDouble); break; - case FLOAT: decodeCells(sizes, builder, () -> (double)buffer.getFloat()); break; + case DOUBLE: decodeDoubleCells(sizes, builder, buffer); break; + case FLOAT: decodeFloatCells(sizes, builder, buffer); break; } } - private void decodeCells(DimensionSizes sizes, IndexedTensor.BoundBuilder builder, Supplier<Double> supplier) { + private void decodeDoubleCells(DimensionSizes sizes, IndexedTensor.BoundBuilder builder, GrowableByteBuffer buffer) { + for (long i = 0; i < sizes.totalSize(); i++) + builder.cellByDirectIndex(i, buffer.getDouble()); + } + + private void decodeFloatCells(DimensionSizes sizes, IndexedTensor.BoundBuilder builder, GrowableByteBuffer buffer) { for (long i = 0; i < sizes.totalSize(); i++) - builder.cellByDirectIndex(i, supplier.get()); + builder.cellByDirectIndex(i, buffer.getFloat()); } } |