diff --git a/src/main/java/cz/it4i/qcmp/cli/functions/DebugFunction.java b/src/main/java/cz/it4i/qcmp/cli/functions/DebugFunction.java index 52e558dac285418b185d6ff126eac2a8dce2b260..b2a325e6395ce7004d5d7274eea951870376fc73 100644 --- a/src/main/java/cz/it4i/qcmp/cli/functions/DebugFunction.java +++ b/src/main/java/cz/it4i/qcmp/cli/functions/DebugFunction.java @@ -1,15 +1,21 @@ package cz.it4i.qcmp.cli.functions; +import cz.it4i.qcmp.cache.QuantizationCacheManager; +import cz.it4i.qcmp.cache.VQCacheFile; import cz.it4i.qcmp.cli.CompressionOptionsCLIParser; import cz.it4i.qcmp.cli.CustomFunctionBase; -import cz.it4i.qcmp.data.HyperStackDimensions; -import cz.it4i.qcmp.io.RawDataIO; -import cz.it4i.qcmp.io.loader.IPlaneLoader; -import cz.it4i.qcmp.io.loader.PlaneLoaderFactory; +import cz.it4i.qcmp.huffman.Huffman; +import cz.it4i.qcmp.huffman.HuffmanNode; +import cz.it4i.qcmp.io.InBitStream; +import cz.it4i.qcmp.io.OutBitStream; +import cz.it4i.qcmp.quantization.vector.VQCodebook; import cz.it4i.qcmp.utilities.Utils; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +@SuppressWarnings("ConstantConditions") public class DebugFunction extends CustomFunctionBase { /** * Base constructor with parsed CLI options. @@ -22,27 +28,38 @@ public class DebugFunction extends CustomFunctionBase { @Override public boolean run() { - final IPlaneLoader loader; - try { - loader = PlaneLoaderFactory.getPlaneLoaderForInputFile(options.getInputDataInfo()); - } catch (final Exception e) { - e.printStackTrace(); - return false; - } - final HyperStackDimensions dims = options.getInputDataInfo().getDimensions(); - final int planeSize = Utils.multiplyExact(dims.getWidth(), dims.getHeight()); - final int sliceSize = Utils.multiplyExact(planeSize, dims.getNumberOfTimepoints()); - try { + final VQCodebook codebook = ((VQCacheFile) QuantizationCacheManager.readCacheFile("D:\\tmp\\codebook.qvc")).getCodebook(); - for (int t = 12; t < 15; t++) { + final int[] symbols = new int[codebook.getCodebookSize()]; + for (int i = 0; i < codebook.getCodebookSize(); i++) { + symbols[i] = i; + } - RawDataIO.write(String.format("slice_t%d.raw", t), loader.loadAllPlanesU16Data(t), false); - } + final Huffman huffman = new Huffman(symbols, codebook.getVectorFrequencies()); + huffman.buildHuffmanTree(); + + final int bitsPerSymbol = (int) Utils.log2(codebook.getCodebookSize()); + try (final OutBitStream bitStream = new OutBitStream(new FileOutputStream("D:\\tmp\\huffman_tree.data", false), + bitsPerSymbol, + 64)) { + huffman.saveHuffmanTree(bitStream); } catch (final IOException e) { e.printStackTrace(); } + + HuffmanNode readRoot = null; + try (final InBitStream inBitStream = new InBitStream(new FileInputStream("D:\\tmp\\huffman_tree.data"), bitsPerSymbol, 256)) { + readRoot = Huffman.readHuffmanTree(inBitStream); + } catch (final IOException ex) { + ex.printStackTrace(); + } + + final boolean equal = huffman.getRoot().treeEqual(readRoot); + + System.out.println(readRoot != null); + return true; } }