示例#1
0
        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;
        }
示例#2
0
        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;
        }