Spaces:
Sleeping
Sleeping
| import { | |
| deltaDecode, | |
| deltaEncode, | |
| quantize, | |
| runLengthDecode, | |
| runLengthEncode, | |
| unquantize, | |
| } from './compression'; | |
| describe('compression', () => { | |
| test('quantize (approximately) roundtrips', () => { | |
| const precisions = [-1, 0, 1, 4, 8]; | |
| const datasets = [ | |
| // Random samples from [-2^32, 2^32] | |
| [ | |
| -2331813745.435792, 4165391630.4586916, 2508162414.104561, -3815881222.355323, | |
| 3182227671.241928, -2091141304.634983, -3454731809.638463, 1539778764.4030657, | |
| 3723556916.971266, 4014694279.989772, 1165331218.5641785, -4209073662.9696226, | |
| -3837962324.440032, 2145014827.7712336, -631662265.4694176, 4116219084.927844, | |
| ], | |
| // [-2^16, 2^16] | |
| [ | |
| -29109.399926296363, 24836.163035466132, 59528.43800645282, 5706.0239888604265, | |
| 61844.35496542655, -46030.9434605508, 10288.243500897894, -48623.38350764701, | |
| -62182.09862667126, 20639.535833017246, -7691.974206406943, -44505.52704528734, | |
| -28755.644095767944, 38244.45061335398, -14135.607864461621, -14792.956311113172, | |
| ], | |
| // [-2^8, 2^8] | |
| [ | |
| -67.02672070745166, -117.41024397385388, -243.41065459675673, 160.3825635900851, | |
| 191.79026087008378, 89.76668679513216, -10.719096486254784, 205.25021491717217, | |
| -68.83096015839055, 44.321620651742364, -203.44266714551503, -19.734642986127426, | |
| 159.0214530150044, 72.07459707399431, -242.49909539291787, -246.50759645751867, | |
| ], | |
| // [-2^4, 2^4] | |
| [ | |
| 14.993015665565746, -14.206729228453774, -1.503306544783097, -8.618521795982875, | |
| 15.14825900944064, -0.7561338814569538, -4.372631369200661, -14.296889398516797, | |
| -0.7673738652041102, 5.880288329769968, -0.12246711347653516, 2.6074790469727773, | |
| -1.0378494460674226, -5.395209965702431, -0.9218194118035932, -1.8677599340100492, | |
| ], | |
| ]; | |
| for (const values of datasets) { | |
| for (const precision of precisions) { | |
| const maxError = Math.max(1 / (1 << precision), 1e-8); | |
| const roundTripped = unquantize(quantize(values, precision), precision); | |
| expect(values.length).toEqual(roundTripped.length); | |
| for (let i = 0; i < values.length; i++) { | |
| const value = values[i]; | |
| const roundtrippedValue = roundTripped[i]; | |
| expect(Math.abs(value - roundtrippedValue)).toBeLessThanOrEqual(maxError); | |
| } | |
| } | |
| } | |
| }); | |
| test('delta encode roundtrips', () => { | |
| const data = [ | |
| 41476, -13450, -59451, -65102, -32493, -39078, -53884, 40784, 32081, -40422, 43421, 17184, | |
| 23042, 27548, -61705, -45215, -39037, 61611, -43945, 28001, -64417, -54192, -56325, 24401, | |
| 17735, 37464, -39842, 54964, 14469, -47248, -39450, | |
| ]; | |
| const roundtripped = deltaDecode(deltaEncode(data)); | |
| expect(data).toEqual(roundtripped); | |
| }); | |
| test('run length encode roundtrips', () => { | |
| const datasets = [ | |
| // No repetitions. | |
| [ | |
| 41476, -13450, -59451, -65102, -32493, -39078, -53884, 40784, 32081, -40422, 43421, 17184, | |
| 23042, 27548, -61705, -45215, -39037, 61611, -43945, 28001, -64417, -54192, -56325, 24401, | |
| 17735, 37464, -39842, 54964, 14469, -47248, -39450, | |
| ], | |
| // All repetitions. | |
| [10, 10, 10, 10, 10, 10], | |
| // Just one value. | |
| [11], | |
| // Repetitions in the middle of unique values. | |
| [1, 2, 3, 4, 4, 4, 4, 5, 6, 7], | |
| ]; | |
| for (const data of datasets) { | |
| const roundtripped = runLengthDecode(runLengthEncode(data)); | |
| expect(data).toEqual(roundtripped); | |
| } | |
| }); | |
| }); | |