package org.nd4j.compression.impl;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.Pointer;
import org.nd4j.linalg.api.buffer.DataBuffer;
import org.nd4j.linalg.compression.CompressedDataBuffer;
import org.nd4j.linalg.compression.CompressionDescriptor;
import org.nd4j.linalg.compression.CompressionType;
import org.nd4j.linalg.factory.Nd4j;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* @author raver119@gmail.com
*/
public class Gzip extends AbstractCompressor {
/**
* This method returns compression descriptor. It should be unique for any compressor implementation
*
* @return
*/
@Override
public String getDescriptor() {
return "GZIP";
}
/**
* This method returns compression type provided by specific NDArrayCompressor implementation
*
* @return
*/
@Override
public CompressionType getCompressionType() {
return CompressionType.LOSSLESS;
}
@Override
public DataBuffer decompress(DataBuffer buffer) {
try {
CompressedDataBuffer compressed = (CompressedDataBuffer) buffer;
CompressionDescriptor descriptor = compressed.getCompressionDescriptor();
BytePointer pointer = (BytePointer) compressed.addressPointer();
ByteArrayInputStream bis = new ByteArrayInputStream(pointer.getStringBytes());
GZIPInputStream gzip = new GZIPInputStream(bis);
DataInputStream dis = new DataInputStream(gzip);
DataBuffer bufferRestored = Nd4j.createBuffer(descriptor.getNumberOfElements());
bufferRestored.read(dis);
return bufferRestored;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public DataBuffer compress(DataBuffer buffer) {
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(stream);
DataOutputStream dos = new DataOutputStream(gzip);
buffer.write(dos);
dos.flush();
dos.close();
byte[] bytes = stream.toByteArray();
// logger.info("Bytes: {}", Arrays.toString(bytes));
BytePointer pointer = new BytePointer(bytes);
CompressionDescriptor descriptor = new CompressionDescriptor(buffer, this);
descriptor.setCompressedLength(bytes.length);
CompressedDataBuffer result = new CompressedDataBuffer(pointer, descriptor);
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected CompressedDataBuffer compressPointer(DataBuffer.TypeEx srcType, Pointer srcPointer, int length,
int elementSize) {
throw new UnsupportedOperationException("Not implemented yet");
}
}