diff --git a/src/main/java/azgracompress/benchmark/Benchmark.java b/src/main/java/azgracompress/benchmark/Benchmark.java index e4ba0f258da6235af7c50178b3b9ea33bd506a2a..6157429e3d39078c088c16540bf7f4b803e66454 100644 --- a/src/main/java/azgracompress/benchmark/Benchmark.java +++ b/src/main/java/azgracompress/benchmark/Benchmark.java @@ -1,6 +1,19 @@ package azgracompress.benchmark; +import azgracompress.U16; import azgracompress.cli.ParsedCliOptions; +import azgracompress.compression.ImageCompressor; +import azgracompress.compression.ImageDecompressor; +import azgracompress.data.ImageU16Dataset; +import azgracompress.io.FileInputData; +import azgracompress.io.RawDataIO; +import azgracompress.io.loader.IPlaneLoader; +import azgracompress.io.loader.PlaneLoaderFactory; +import azgracompress.utilities.TypeConverter; +import azgracompress.utilities.Utils; + +import java.io.File; +import java.io.IOException; public class Benchmark extends BenchmarkBase { @@ -11,90 +24,84 @@ public class Benchmark extends BenchmarkBase { @Override public void startBenchmark() { + assert (options.getInputDataInfo().isPlaneIndexSet()); + ParsedCliOptions compressOps; + ParsedCliOptions decompressOps; + try { + // NOTE: This works, right? + compressOps = (ParsedCliOptions) options.clone(); + decompressOps = (ParsedCliOptions) options.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e.getMessage()); + e.printStackTrace(); + return; + } + // dirCreated is ignored. + boolean dirCreated = new File(options.getOutputFilePath()).mkdirs(); + + final String qcmpFilePath = getFileNamePathIntoOutDir(String.format(COMPRESSED_FILE_TEMPLATE, + options.getInputDataInfo().getPlaneIndex(), + codebookSize)); + + compressOps.setOutputFilePath(qcmpFilePath); + ImageCompressor compressor = new ImageCompressor(compressOps); + if (!compressor.compress()) { + System.err.println("Errors occurred during compression."); + return; + } + + decompressOps.setInputDataInfo(new FileInputData(qcmpFilePath)); + + final String decompressedFile = getFileNamePathIntoOutDir(String.format(QUANTIZED_FILE_TEMPLATE, + options.getInputDataInfo().getPlaneIndex(), + codebookSize)); + + decompressOps.setOutputFilePath(decompressedFile); + ImageDecompressor decompressor = new ImageDecompressor(decompressOps); + + final ImageU16Dataset decompressedDataset = decompressor.decompressInMemory(); + if (decompressedDataset == null) { + System.err.println("Errors occurred during decompression."); + return; + } + + int[] originalData; + try { + final IPlaneLoader loader = PlaneLoaderFactory.getPlaneLoaderForInputFile(options.getInputDataInfo()); + originalData = loader.loadPlaneData(options.getInputDataInfo().getPlaneIndex()); + } catch (Exception e) { + System.err.println("Failed to get plane loader. " + e.getMessage()); + e.printStackTrace(); + return; + } + + final int[] quantizedData = TypeConverter.shortArrayToIntArray(decompressedDataset.getPlaneData(0)); + + final int[] diffArray = Utils.getDifference(originalData, quantizedData); + final double mse = Utils.calculateMse(diffArray); + final double PSNR = Utils.calculatePsnr(mse, U16.Max); + System.out.printf("MSE: %.4f\tPSNR: %.4f(dB)%n", mse, PSNR); + + final int[] absDifferenceData = Utils.asAbsoluteValues(diffArray); + + final String diffFilePath = getFileNamePathIntoOutDir(String.format(DIFFERENCE_FILE_TEMPLATE, + options.getInputDataInfo().getPlaneIndex(), + codebookSize)); + + final String absDiffFilePath = getFileNamePathIntoOutDir(String.format(ABSOLUTE_DIFFERENCE_FILE_TEMPLATE, + options.getInputDataInfo().getPlaneIndex(), + codebookSize)); + + try { + // NOTE(Moravec): Use little endian so that gnuplot can read the array. + RawDataIO.writeBytesToFile(absDiffFilePath, TypeConverter.unsignedShortArrayToByteArray(absDifferenceData, true)); + System.out.println("Saved absolute difference to: " + absDiffFilePath); - // TODO(Moravec): Support PlaneLoader API. -// ParsedCliOptions compressOps; -// ParsedCliOptions decompressOps; -// try { -// compressOps = (ParsedCliOptions) options.clone(); -// decompressOps = (ParsedCliOptions) options.clone(); -// } catch (CloneNotSupportedException e) { -// e.printStackTrace(); -// return; -// } -// -// boolean dirCreated = new File(options.getOutputFilePath()).mkdirs(); -// //"%d_cb%d.raw.qcmp" -// final String qcmpFilePath = getFileNamePathIntoOutDir(String.format(COMPRESSED_FILE_TEMPLATE, -// options.getPlaneIndex(), -// codebookSize)); -// compressOps.setOutputFilePath(qcmpFilePath); -// ImageCompressor compressor = new ImageCompressor(compressOps); -// if (!compressor.compress()) { -// System.err.println("Errors occurred during compression."); -// return; -// } -// -// decompressOps.setInputFileInfo(new InputFileInfo(qcmpFilePath)); -// -// -// final String decompressedFile = getFileNamePathIntoOutDir(String.format(QUANTIZED_FILE_TEMPLATE, -// options.getPlaneIndex(), -// codebookSize)); -// -// decompressOps.setOutputFilePath(decompressedFile); -// ImageDecompressor decompressor = new ImageDecompressor(decompressOps); -// if (!decompressor.decompress()) { -// System.err.println("Errors occurred during decompression."); -// } -// -// final int[] originalData; -// try { -// originalData = RawDataIO.loadImageU16(options.getInputFilePath(), -// options.getImageDimension(), -// options.getPlaneIndex()).getData(); -// } catch (IOException e) { -// e.printStackTrace(); -// return; -// } -// final int[] quantizedData; -// try { -// quantizedData = RawDataIO.loadImageU16(decompressedFile, -// options.getImageDimension().toV2i().toV3i(), 0).getData(); -// } catch (IOException e) { -// e.printStackTrace(); -// return; -// } -// -// final int[] diffArray = Utils.getDifference(originalData, quantizedData); -// final double mse = Utils.calculateMse(diffArray); -// final double PSNR = Utils.calculatePsnr(mse, U16.Max); -// System.out.println(String.format("MSE: %.4f\tPSNR: %.4f(dB)", mse, PSNR)); -// -// final int[] absDifferenceData = Utils.asAbsoluteValues(diffArray); -// -// final String diffFilePath = getFileNamePathIntoOutDir(String.format(DIFFERENCE_FILE_TEMPLATE, -// options.getPlaneIndex(), -// codebookSize)); -// -// final String absDiffFilePath = getFileNamePathIntoOutDir(String.format(ABSOLUTE_DIFFERENCE_FILE_TEMPLATE, -// options.getPlaneIndex(), -// codebookSize)); -// -// ImageU16 img = new ImageU16(rawImageDims.getX(), -// rawImageDims.getY(), -// absDifferenceData); -// try { -// // NOTE(Moravec): Use little endian so that gnuplot can read the array. -// RawDataIO.writeImageU16(absDiffFilePath, img, true); -// System.out.println("Saved absolute difference to: " + absDiffFilePath); -// -// RawDataIO.writeDataI32(diffFilePath, diffArray, true); -// System.out.println("Saved difference to: " + absDiffFilePath); -// } catch (Exception e) { -// e.printStackTrace(); -// System.err.println("Failed to save difference."); -// return; -// } + RawDataIO.writeDataI32(diffFilePath, diffArray, true); + System.out.println("Saved difference to: " + absDiffFilePath); + } catch (IOException e) { + System.err.println("Failed to save difference."); + e.printStackTrace(); + } } } diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java index 7c2eac1bd128c20a4531f81c87e22250ff69ddf4..05611991c4553d2152ded6f5046bd6fe153ccd8e 100644 --- a/src/main/java/azgracompress/compression/ImageDecompressor.java +++ b/src/main/java/azgracompress/compression/ImageDecompressor.java @@ -232,6 +232,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { return true; } + // TODO(Moravec): Return optional to get rid of null check. public ImageU16Dataset decompressInMemory() { try (FileInputStream fileInputStream = new FileInputStream(options.getInputDataInfo().getFilePath()); DataInputStream dataInputStream = new DataInputStream(fileInputStream)) { diff --git a/src/main/java/azgracompress/io/RawDataIO.java b/src/main/java/azgracompress/io/RawDataIO.java index 402df89490ae1281c60b4814598821c3f4684e18..ee7500cfd60604bb959963de6666f59244a3db4b 100644 --- a/src/main/java/azgracompress/io/RawDataIO.java +++ b/src/main/java/azgracompress/io/RawDataIO.java @@ -15,19 +15,15 @@ public class RawDataIO { writeBytesToFile(rawFile, buffer); } - public static boolean writeDataI32(String rawFile, int[] differenceData, final boolean littleEndian) { - + public static void writeDataI32(String rawFile, + int[] differenceData, + final boolean littleEndian) throws IOException { byte[] buffer = TypeConverter.intArrayToByteArray(differenceData, littleEndian); - try { - writeBytesToFile(rawFile, buffer); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - return true; + writeBytesToFile(rawFile, buffer); } - private static void writeBytesToFile(String rawFile, byte[] buffer) throws IOException { + public static void writeBytesToFile(String rawFile, + byte[] buffer) throws IOException { FileOutputStream fileStream = new FileOutputStream(rawFile, false); fileStream.write(buffer, 0, buffer.length); fileStream.flush();