private void UpdateSimpleSeries() { var maxOffset = 32; var epsilon = (int)numEpsilon.Value; mSimpleCompressedData.Clear(); mSimpleWaveData.Clear(); mSimpleWaveDecomposer.Decompose(mData, mSimpleCompressedData, mSimpleWaveData, epsilon, maxOffset); mSimpleCompressed.Points.Clear(); mSimpleCompressed.Points.AddRange(mSimpleCompressedData); var minDistance = int.MaxValue; var maxDistance = int.MinValue; var averageDistance = 0d; var previousX = mSimpleCompressed.Points.First().X; GC.Collect(); var distanceDict = Enumerable.Range(1, maxOffset).ToDictionary(t => t, t => 0); var errorDict = new SortedDictionary<int, int>(); foreach (var point in mSimpleWaveData) { if (errorDict.ContainsKey((int)point.Y)) errorDict[(int)point.Y] = errorDict[(int)point.Y] + 1; else errorDict[(int)point.Y] = 1; } foreach (var point in mSimpleCompressed.Points.Skip(1)) { var distance = (int)point.X - (int)previousX; distanceDict[distance] = distanceDict[distance] + 1; maxDistance = Math.Max(maxDistance, distance); minDistance = Math.Min(minDistance, distance); previousX = point.X; averageDistance += distance; } averageDistance = averageDistance / (mSimpleCompressed.Points.Count - 1); mSimpleWave.Points.Clear(); mSimpleWave.Points.AddRange(mSimpleWaveData); GC.Collect(); mSimpleGridDistribution.Points.Clear(); mSimpleGridDistribution.Points.AddRange(distanceDict.Select(t => new DataPoint(t.Key, t.Value))); GC.Collect(); mSimpleResidualDistribution.Points.Clear(); mSimpleResidualDistribution.Points.AddRange(errorDict.Where(t => t.Value != 0).Select(t => new DataPoint(t.Key, t.Value))); GC.Collect(); mSimpleWaveLayout.Refresh(); var residualMax = mSimpleWave.Points.Max(t => Math.Abs(t.Y)); var bitsPerResidual = (int)Math.Ceiling(Math.Log(2 * residualMax, 2)); var array = mSimpleWave.Points.Select(t => (int)t.Y).ToArray(); var huffmanCompressionInfo = CodingTable.EncodeLengthInfo(errorDict); var compressionResidualSize = mSimpleWave.Points.Count * bitsPerResidual; var compressionHuffmanResidualSize = CodingTable.CalculateSize(errorDict, huffmanCompressionInfo); var bitsPerOffset = (int)Math.Ceiling(Math.Log(maxOffset)); var compressionSize = (compressionHuffmanResidualSize < compressionResidualSize ? compressionHuffmanResidualSize : compressionResidualSize) + mSimpleCompressed.Points.Count * (16 + bitsPerOffset); var actualSize = mSimpleOriginal.Points.Count * 16; var compressionInfo = new CompressionInfo(); compressionInfo.OriginalNodeCount = mSimpleOriginal.Points.Count; compressionInfo.CompressedNodeCount = mSimpleCompressed.Points.Count; compressionInfo.ResidualNodeCount = mSimpleWave.Points.Count; compressionInfo.ResidualAbsoluteMax = mSimpleWave.Points.Max(t => Math.Abs(t.Y)); compressionInfo.EstimatedCompressedSize = compressionSize; compressionInfo.EstimatedCompression = (double)compressionSize / actualSize; compressionInfoGrid.SelectedObject = compressionInfo; }
private void UpdateCombSeries() { mCombCompressedData.Clear(); mCombWaveData.Clear(); mCombWaveDecomposer.Decompose(mData, mCombCompressedData, mCombWaveData, (double)numEpsilon.Value); mCombCompressed.Points.Clear(); mCombCompressed.Points.AddRange(mCombCompressedData); mCombWave.Points.Clear(); mCombWave.Points.AddRange(mCombWaveData); plotCombWave.Refresh(); var compressionInfo = new CompressionInfo(); compressionInfo.OriginalNodeCount = mCombOriginal.Points.Count; compressionInfo.CompressedNodeCount = mCombCompressed.Points.Count; compressionInfo.ResidualNodeCount = mCombWave.Points.Count; compressionInfo.ResidualAbsoluteMax = mCombWave.Points.Max(t => Math.Abs(t.Y)); compressionInfoGrid.SelectedObject = compressionInfo; }