@gmod/cram 3.0.6 → 3.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/cram-bundle.js +1 -1
  2. package/dist/cramFile/codecs/byteArrayStop.d.ts +2 -2
  3. package/dist/cramFile/file.js +8 -10
  4. package/dist/cramFile/file.js.map +1 -1
  5. package/dist/cramFile/util.js.map +1 -1
  6. package/dist/htscodecs/arith_gen.d.ts +26 -0
  7. package/dist/htscodecs/arith_gen.js +558 -0
  8. package/dist/htscodecs/arith_gen.js.map +1 -0
  9. package/dist/htscodecs/arith_sh.d.ts +16 -0
  10. package/dist/htscodecs/arith_sh.js +128 -0
  11. package/dist/htscodecs/arith_sh.js.map +1 -0
  12. package/dist/htscodecs/byte_model.d.ts +11 -0
  13. package/dist/htscodecs/byte_model.js +113 -0
  14. package/dist/htscodecs/byte_model.js.map +1 -0
  15. package/dist/htscodecs/fqzcomp.d.ts +2 -0
  16. package/dist/htscodecs/fqzcomp.js +744 -0
  17. package/dist/htscodecs/fqzcomp.js.map +1 -0
  18. package/dist/htscodecs/index.d.ts +5 -0
  19. package/dist/htscodecs/index.js +70 -0
  20. package/dist/htscodecs/index.js.map +1 -0
  21. package/dist/htscodecs/iostream.d.ts +26 -0
  22. package/dist/htscodecs/iostream.js +242 -0
  23. package/dist/htscodecs/iostream.js.map +1 -0
  24. package/dist/htscodecs/main_arith_gen.d.ts +1 -0
  25. package/dist/htscodecs/main_arith_gen.js +86 -0
  26. package/dist/htscodecs/main_arith_gen.js.map +1 -0
  27. package/dist/htscodecs/main_fqzcomp.d.ts +1 -0
  28. package/dist/htscodecs/main_fqzcomp.js +112 -0
  29. package/dist/htscodecs/main_fqzcomp.js.map +1 -0
  30. package/dist/htscodecs/main_rans.d.ts +1 -0
  31. package/dist/htscodecs/main_rans.js +83 -0
  32. package/dist/htscodecs/main_rans.js.map +1 -0
  33. package/dist/htscodecs/main_rans4x16.d.ts +1 -0
  34. package/dist/htscodecs/main_rans4x16.js +82 -0
  35. package/dist/htscodecs/main_rans4x16.js.map +1 -0
  36. package/dist/htscodecs/main_tok3.d.ts +1 -0
  37. package/dist/htscodecs/main_tok3.js +84 -0
  38. package/dist/htscodecs/main_tok3.js.map +1 -0
  39. package/dist/htscodecs/rans.d.ts +2 -0
  40. package/dist/htscodecs/rans.js +480 -0
  41. package/dist/htscodecs/rans.js.map +1 -0
  42. package/dist/htscodecs/rans4x16.d.ts +2 -0
  43. package/dist/htscodecs/rans4x16.js +896 -0
  44. package/dist/htscodecs/rans4x16.js.map +1 -0
  45. package/dist/htscodecs/tok3.d.ts +2 -0
  46. package/dist/htscodecs/tok3.js +347 -0
  47. package/dist/htscodecs/tok3.js.map +1 -0
  48. package/esm/cramFile/codecs/byteArrayStop.d.ts +2 -2
  49. package/esm/cramFile/file.js +8 -10
  50. package/esm/cramFile/file.js.map +1 -1
  51. package/esm/cramFile/util.js.map +1 -1
  52. package/esm/htscodecs/arith_gen.d.ts +26 -0
  53. package/esm/htscodecs/arith_gen.js +558 -0
  54. package/esm/htscodecs/arith_gen.js.map +1 -0
  55. package/esm/htscodecs/arith_sh.d.ts +16 -0
  56. package/esm/htscodecs/arith_sh.js +128 -0
  57. package/esm/htscodecs/arith_sh.js.map +1 -0
  58. package/esm/htscodecs/byte_model.d.ts +11 -0
  59. package/esm/htscodecs/byte_model.js +113 -0
  60. package/esm/htscodecs/byte_model.js.map +1 -0
  61. package/esm/htscodecs/fqzcomp.d.ts +2 -0
  62. package/esm/htscodecs/fqzcomp.js +744 -0
  63. package/esm/htscodecs/fqzcomp.js.map +1 -0
  64. package/esm/htscodecs/index.d.ts +5 -0
  65. package/esm/htscodecs/index.js +70 -0
  66. package/esm/htscodecs/index.js.map +1 -0
  67. package/esm/htscodecs/iostream.d.ts +26 -0
  68. package/esm/htscodecs/iostream.js +242 -0
  69. package/esm/htscodecs/iostream.js.map +1 -0
  70. package/esm/htscodecs/main_arith_gen.d.ts +1 -0
  71. package/esm/htscodecs/main_arith_gen.js +86 -0
  72. package/esm/htscodecs/main_arith_gen.js.map +1 -0
  73. package/esm/htscodecs/main_fqzcomp.d.ts +1 -0
  74. package/esm/htscodecs/main_fqzcomp.js +112 -0
  75. package/esm/htscodecs/main_fqzcomp.js.map +1 -0
  76. package/esm/htscodecs/main_rans.d.ts +1 -0
  77. package/esm/htscodecs/main_rans.js +83 -0
  78. package/esm/htscodecs/main_rans.js.map +1 -0
  79. package/esm/htscodecs/main_rans4x16.d.ts +1 -0
  80. package/esm/htscodecs/main_rans4x16.js +82 -0
  81. package/esm/htscodecs/main_rans4x16.js.map +1 -0
  82. package/esm/htscodecs/main_tok3.d.ts +1 -0
  83. package/esm/htscodecs/main_tok3.js +84 -0
  84. package/esm/htscodecs/main_tok3.js.map +1 -0
  85. package/esm/htscodecs/rans.d.ts +2 -0
  86. package/esm/htscodecs/rans.js +480 -0
  87. package/esm/htscodecs/rans.js.map +1 -0
  88. package/esm/htscodecs/rans4x16.d.ts +2 -0
  89. package/esm/htscodecs/rans4x16.js +896 -0
  90. package/esm/htscodecs/rans4x16.js.map +1 -0
  91. package/esm/htscodecs/tok3.d.ts +2 -0
  92. package/esm/htscodecs/tok3.js +347 -0
  93. package/esm/htscodecs/tok3.js.map +1 -0
  94. package/package.json +1 -2
  95. package/src/cramFile/file.ts +8 -10
  96. package/src/cramFile/util.ts +0 -1
  97. package/src/htscodecs/Makefile +142 -0
  98. package/src/htscodecs/README.md +64 -0
  99. package/src/htscodecs/arith_gen.js +607 -0
  100. package/src/htscodecs/arith_sh.js +138 -0
  101. package/src/htscodecs/byte_model.js +126 -0
  102. package/src/htscodecs/fqzcomp.js +834 -0
  103. package/src/htscodecs/index.js +79 -0
  104. package/src/htscodecs/iostream.js +256 -0
  105. package/src/htscodecs/main_arith_gen.js +96 -0
  106. package/src/htscodecs/main_fqzcomp.js +113 -0
  107. package/src/htscodecs/main_rans.js +88 -0
  108. package/src/htscodecs/main_rans4x16.js +87 -0
  109. package/src/htscodecs/main_tok3.js +86 -0
  110. package/src/htscodecs/rans.js +545 -0
  111. package/src/htscodecs/rans4x16.js +1003 -0
  112. package/src/htscodecs/tok3.js +396 -0
  113. package/src/typings/htscodecs.d.ts +0 -6
@@ -0,0 +1,1003 @@
1
+ /*
2
+ * Copyright (c) 2019,2020 Genome Research Ltd.
3
+ * Author(s): James Bonfield
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ *
8
+ * 1. Redistributions of source code must retain the above copyright notice,
9
+ * this list of conditions and the following disclaimer.
10
+ *
11
+ * 2. Redistributions in binary form must reproduce the above
12
+ * copyright notice, this list of conditions and the following
13
+ * disclaimer in the documentation and/or other materials provided
14
+ * with the distribution.
15
+ *
16
+ * 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
17
+ * Institute nor the names of its contributors may be used to endorse
18
+ * or promote products derived from this software without specific
19
+ * prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS
22
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH
25
+ * LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ */
33
+
34
+ const IOStream = require('./iostream')
35
+
36
+ //----------------------------------------------------------------------
37
+ // rANS primitives itself
38
+ //
39
+ // RansGet* is decoder side
40
+
41
+ function RansGetCumulativeFreq(R, bits) {
42
+ return R & ((1 << bits) - 1)
43
+ }
44
+
45
+ function RansGetSymbolFromFreq(C, f) {
46
+ // NOTE: Inefficient.
47
+ // In practice we would implement this via a precomputed
48
+ // lookup table C2S[f]; see RansBuildC2S below.
49
+ var s = 0
50
+ while (f >= C[s + 1]) s++
51
+
52
+ //console.error(f, C, s)
53
+
54
+ return s
55
+ }
56
+
57
+ function RansBuildC2S(C, bits) {
58
+ var max = 1 << bits
59
+ var C2S = new Array(max)
60
+ var s = 0
61
+ for (var f = 0; f < max; f++) {
62
+ while (f >= C[s + 1]) s++
63
+ C2S[f] = s
64
+ }
65
+ return C2S
66
+ }
67
+
68
+ function RansAdvanceStep(R, c, f, bits) {
69
+ return f * (R >> bits) + (R & ((1 << bits) - 1)) - c
70
+ }
71
+
72
+ function RansRenorm(src, R) {
73
+ if (R < 1 << 15) R = (R << 16) + src.ReadUint16()
74
+
75
+ return R
76
+ }
77
+
78
+ // RanEnc* is for encoder
79
+ function RansEncInit() {
80
+ return 1 << 15
81
+ }
82
+
83
+ function RansEncFlush(R, dst) {
84
+ dst.WriteByteNeg((R >> 24) & 0xff)
85
+ dst.WriteByteNeg((R >> 16) & 0xff)
86
+ dst.WriteByteNeg((R >> 8) & 0xff)
87
+ dst.WriteByteNeg((R >> 0) & 0xff)
88
+ }
89
+
90
+ function RansEncRenorm(R, dst, freq, scale_bits) {
91
+ //var R_max = (((1 << 15) >> scale_bits) << 16) * freq;
92
+ var R_max = (1 << (31 - scale_bits)) * freq
93
+
94
+ while (R >= R_max) {
95
+ dst.WriteByteNeg((R >> 8) & 0xff)
96
+ dst.WriteByteNeg(R & 0xff)
97
+ R >>= 16
98
+ }
99
+ return R
100
+ }
101
+
102
+ // Puts a symbol with frequency freq, cumulative freq start
103
+ // and total freq 1<<scale_bits.
104
+ //
105
+ // Note with static probabilities, /freq and %freq could be
106
+ // precomputed via multiplies and shifts.
107
+ function RansEncPut(R, dst, start, freq, scale_bits) {
108
+ var scale = 1 << scale_bits
109
+ R = RansEncRenorm(R, dst, freq, scale_bits)
110
+ R = (Math.floor(R / freq) << scale_bits) + (R % freq) + start
111
+ return R
112
+ }
113
+
114
+ //----------------------------------------------------------------------
115
+ // Run length encoding
116
+ function EncodeRLE(src, N) {
117
+ // Step 1: find which symbols benefit from RLE
118
+ var L = new Array(256)
119
+ for (var i = 0; i < 256; i++) L[i] = 0
120
+
121
+ var last = -1
122
+ for (var i = 0; i < src.length; i++) {
123
+ L[src[i]] += src[i] == last ? 1 : -1
124
+ last = src[i]
125
+ }
126
+
127
+ var nrle = 0
128
+ for (var i = 0; i < 256; i++) if (L[i] > 0) nrle++
129
+
130
+ if (!nrle) {
131
+ // Format cannot cope with zero RLE symbols, so pick one!
132
+ nrle = 1
133
+ L[0] = 1
134
+ }
135
+
136
+ // Start meta-data as list of symbols to RLE
137
+ var meta = new IOStream('', 0, nrle + 1 + src.length)
138
+ meta.WriteByte(nrle)
139
+ for (var i = 0; i < 256; i++) if (L[i] > 0) meta.WriteByte(i)
140
+
141
+ // Step 2: Now apply RLE itself
142
+ var data = new Buffer.allocUnsafe(src.length)
143
+ var dpos = 0
144
+ for (var i = 0; i < src.length; i++) {
145
+ data[dpos++] = src[i]
146
+ if (L[src[i]] > 0) {
147
+ last = src[i]
148
+ var run = 0
149
+ while (i + run + 1 < src.length && src[i + run + 1] == last) run++
150
+ meta.WriteUint7(run)
151
+ i += run
152
+ }
153
+ }
154
+
155
+ // Compress the meta-data
156
+ var cmeta = RansEncode0(meta.buf.slice(0, meta.pos), N)
157
+ var hdr = new IOStream('', 0, 16)
158
+ hdr.WriteUint7(meta.pos * 2) // Uncompressed meta-data length + compressed-bit-flag(0)
159
+ hdr.WriteUint7(dpos) // Length of RLE encoded data
160
+ hdr.WriteUint7(cmeta.length) // Compressed meta-data length
161
+ var meta = Buffer.concat([hdr.buf.slice(0, hdr.pos), cmeta])
162
+
163
+ return [meta, data.slice(0, dpos)]
164
+ }
165
+
166
+ function DecodeRLEMeta(src, N) {
167
+ var u_meta_len = src.ReadUint7()
168
+ var rle_len = src.ReadUint7()
169
+
170
+ // Decode RLE lengths
171
+ if (u_meta_len & 1) {
172
+ var rle_meta = src.ReadData((u_meta_len - 1) / 2)
173
+ } else {
174
+ var comp_meta_len = src.ReadUint7()
175
+ var rle_meta = src.ReadData(comp_meta_len)
176
+ rle_meta = RansDecode0(new IOStream(rle_meta), u_meta_len / 2, N)
177
+ }
178
+
179
+ // Decode list of symbols for which RLE lengths are applied
180
+ var rle_meta = new IOStream(rle_meta)
181
+ var L = new Array(256)
182
+ var n = rle_meta.ReadByte()
183
+ if (n == 0) n = 256
184
+ for (var i = 0; i < n; i++) L[rle_meta.ReadByte()] = 1
185
+
186
+ return [L, rle_meta, rle_len]
187
+ }
188
+
189
+ function DecodeRLE(buf, L, rle_meta, len) {
190
+ var src = new IOStream(buf)
191
+
192
+ var out = new Buffer.allocUnsafe(len)
193
+
194
+ // Expand up buf+meta to out; i = buf index, j = out index
195
+ var j = 0
196
+ for (var i = 0; j < len; i++) {
197
+ var sym = buf[i]
198
+ if (L[sym]) {
199
+ var run = rle_meta.ReadUint7()
200
+ for (var r = 0; r <= run; r++) out[j++] = sym
201
+ } else {
202
+ out[j++] = sym
203
+ }
204
+ }
205
+
206
+ return out
207
+ }
208
+
209
+ //----------------------------------------------------------------------
210
+ // Bit packing
211
+
212
+ function EncodePack(src) {
213
+ // Step 1: identify number of distinct symbols
214
+ var F = new Array(256)
215
+ for (var i = 0; i < 256; i++) F[i] = 0
216
+
217
+ for (var i = 0; i < src.length; i++) F[src[i]]++
218
+
219
+ var P = new Array(256)
220
+ var nsym = 0
221
+ for (var i = 0; i < 256; i++) if (F[i] > 0) P[i] = nsym++
222
+
223
+ if (nsym > 16) {
224
+ //console.error("Too many symbols to pack:",nsym)
225
+ return
226
+ }
227
+
228
+ // Pack data
229
+ if (nsym <= 1) {
230
+ // Constant
231
+ var data = new Buffer.allocUnsafe(0)
232
+ } else if (nsym <= 2) {
233
+ // 1 bit per value
234
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 8))
235
+ var j = -1
236
+ for (i = 0; i < src.length; i++) {
237
+ if (i % 8 == 0) data[++j] = 0
238
+ data[j] += P[src[i]] << i % 8
239
+ }
240
+ } else if (nsym <= 4) {
241
+ // 2 bits per value
242
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 4))
243
+ var j = -1
244
+ for (i = 0; i < src.length; i++) {
245
+ if (i % 4 == 0) data[++j] = 0
246
+ data[j] += P[src[i]] << ((i % 4) * 2)
247
+ }
248
+ } else {
249
+ // 4 bits per value
250
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 2))
251
+ var j = -1
252
+ for (i = 0; i < src.length; i++) {
253
+ if (i % 2 == 0) data[++j] = 0
254
+ data[j] += P[src[i]] << ((i % 2) * 4)
255
+ }
256
+ }
257
+
258
+ // Produce pack meta-data
259
+ var meta = new IOStream('', 0, nsym + 5)
260
+ meta.WriteByte(nsym)
261
+ var j = 0
262
+ for (var i = 0; i < 256; i++) {
263
+ if (F[i] > 0) {
264
+ F[i] = j++
265
+ meta.WriteByte(i)
266
+ }
267
+ }
268
+ meta.WriteUint7(data.length)
269
+
270
+ return [meta.buf.slice(0, meta.pos), data]
271
+ }
272
+
273
+ // Pack meta data is the number and value of distinct symbols plus
274
+ // the length of the packed byte stream.
275
+ function DecodePackMeta(src) {
276
+ var nsym = src.ReadByte()
277
+ var P = new Array(nsym)
278
+
279
+ for (var i = 0; i < nsym; i++) P[i] = src.ReadByte()
280
+
281
+ var len = src.ReadUint7()
282
+
283
+ return [P, nsym, len]
284
+ }
285
+
286
+ // Extract bits from src producing output of length len.
287
+ // Nsym is number of distinct symbols used.
288
+ function DecodePack(data, P, nsym, len) {
289
+ var out = new Buffer.allocUnsafe(len)
290
+ var j = 0
291
+
292
+ // Constant value
293
+ if (nsym <= 1) {
294
+ for (var i = 0; i < len; i++) out[i] = P[0]
295
+ }
296
+
297
+ // 1 bit per value
298
+ else if (nsym <= 2) {
299
+ for (i = 0; i < len; i++) {
300
+ if (i % 8 == 0) var v = data[j++]
301
+
302
+ out[i] = P[v & 1]
303
+ v >>= 1
304
+ }
305
+ }
306
+
307
+ // 2 bits per value
308
+ else if (nsym <= 4) {
309
+ for (i = 0; i < len; i++) {
310
+ if (i % 4 == 0) var v = data[j++]
311
+
312
+ out[i] = P[v & 3]
313
+ v >>= 2
314
+ }
315
+ }
316
+
317
+ // 4 bits per value
318
+ else if (nsym <= 16) {
319
+ for (i = 0; i < len; i++) {
320
+ if (i % 2 == 0) var v = data[j++]
321
+
322
+ out[i] = P[v & 15]
323
+ v >>= 4
324
+ }
325
+ }
326
+
327
+ return out
328
+ }
329
+
330
+ //----------------------------------------------------------------------
331
+ // 4 way interleaving.
332
+ // This is simply 4 rANS streams interleaved to form bytes 0,4,8...,
333
+ // 1,5,9..., 2,6,10... and 3,7,11...
334
+ //
335
+ // It works well when the distributions differ for each of the 4 bytes,
336
+ // for example when compressing a series of 32-bit integers.
337
+ //
338
+ // Maybe make this more general purpose of X* where we specify the stripe
339
+ // size instead of fixing it at 4?
340
+ function RansEncodeStripe(hdr, src, N) {
341
+ if (N == 0) N = 4 // old default
342
+
343
+ // Split into multiple streams
344
+ var part = new Array(N)
345
+ var ulen = new Array(N)
346
+ for (var s = 0; s < N; s++) {
347
+ ulen[s] = Math.floor(src.length / N) + (src.length % N > s)
348
+ part[s] = new Array(ulen[s])
349
+ }
350
+
351
+ for (var x = 0, i = 0; i < src.length; i += N, x++) {
352
+ for (var j = 0; j < N; j++) if (x < part[j].length) part[j][x] = src[i + j]
353
+ }
354
+
355
+ // Compress each part
356
+ var comp = new Array(N)
357
+ var total = 0
358
+ for (var s = 0; s < N; s++) {
359
+ // Example: try O0 and O1 and choose best
360
+ var comp0 = encode(part[s], 0)
361
+ var comp1 = encode(part[s], 1)
362
+ comp[s] = comp1.length < comp0.length ? comp1 : comp0
363
+ total += comp[s].length
364
+ }
365
+
366
+ // Serialise
367
+ var out = new IOStream('', 0, total + 5 * N + 1)
368
+ out.WriteByte(N)
369
+ for (var s = 0; s < N; s++) out.WriteUint7(comp[s].length)
370
+
371
+ for (var s = 0; s < N; s++) out.WriteData(comp[s], comp[s].length)
372
+
373
+ return out.buf.slice(0, out.buf.pos)
374
+ }
375
+
376
+ function RansDecodeStripe(src, len) {
377
+ var N = src.ReadByte()
378
+
379
+ // Retrieve lengths
380
+ var clen = new Array(N)
381
+ var ulen = new Array(N)
382
+ for (var j = 0; j < N; j++) clen[j] = src.ReadUint7()
383
+
384
+ // Decode streams
385
+ var T = new Array(N)
386
+ for (var j = 0; j < N; j++) {
387
+ ulen[j] = Math.floor(len / N) + (len % N > j)
388
+ T[j] = RansDecodeStream(src, ulen[j])
389
+ }
390
+
391
+ // Transpose
392
+ var out = new Buffer.allocUnsafe(len)
393
+ for (var j = 0; j < N; j++) {
394
+ for (var i = 0; i < ulen[j]; i++) {
395
+ out[i * N + j] = T[j][i]
396
+ }
397
+ }
398
+
399
+ return out
400
+ }
401
+
402
+ //----------------------------------------------------------------------
403
+ // Main rANS entry function: decodes a compressed src and
404
+ // returns the uncompressed buffer.
405
+ function decode(src) {
406
+ var stream = new IOStream(src)
407
+ return RansDecodeStream(stream, 0)
408
+ }
409
+
410
+ function RansDecodeStream(stream, n_out) {
411
+ var format = stream.ReadByte()
412
+ var order = format & 1
413
+ var x32 = format & 4
414
+ var stripe = format & 8
415
+ var nosz = format & 16
416
+ var cat = format & 32
417
+ var rle = format & 64
418
+ var pack = format & 128
419
+
420
+ var Nway = x32 ? 32 : 4
421
+
422
+ if (!nosz) n_out = stream.ReadUint7()
423
+
424
+ // N-way interleaving
425
+ if (stripe) return RansDecodeStripe(stream, n_out)
426
+
427
+ // Bit packing
428
+ if (pack) {
429
+ var pack_len = n_out
430
+ var [P, nsym, n_out] = DecodePackMeta(stream)
431
+ }
432
+
433
+ // Run length encoding
434
+ if (rle) {
435
+ var rle_len = n_out
436
+ var [L, rle_meta, n_out] = DecodeRLEMeta(stream, Nway)
437
+ }
438
+
439
+ // Uncompress data (all, packed or run literals)
440
+ if (cat) var buf = stream.ReadData(n_out)
441
+ else if (order == 0) var buf = RansDecode0(stream, n_out, Nway)
442
+ else var buf = RansDecode1(stream, n_out, Nway)
443
+
444
+ // Apply expansion transforms
445
+ if (rle) buf = DecodeRLE(buf, L, rle_meta, rle_len)
446
+
447
+ if (pack) buf = DecodePack(buf, P, nsym, pack_len)
448
+
449
+ return buf
450
+ }
451
+
452
+ function encode(src, format) {
453
+ var hdr = new IOStream('', 0, 10)
454
+ hdr.WriteByte(format)
455
+
456
+ var order = format & 1
457
+ var x32 = format & 4
458
+ var stripe = format & 8
459
+ var nosz = format & 16
460
+ var cat = format & 32
461
+ var rle = format & 64
462
+ var pack = format & 128
463
+
464
+ var Nway = x32 ? 32 : 4 // interleaving amount
465
+ var N = format >> 8 // stripe size
466
+
467
+ if (!nosz) hdr.WriteUint7(src.length)
468
+
469
+ if (stripe)
470
+ return Buffer.concat([
471
+ hdr.buf.slice(0, hdr.pos),
472
+ RansEncodeStripe(hdr, src, N),
473
+ ])
474
+
475
+ var pack_meta = new Buffer.alloc(0)
476
+ if (pack) [pack_meta, src] = EncodePack(src)
477
+
478
+ var rle_meta = new Buffer.alloc(0)
479
+ if (rle) [rle_meta, src] = EncodeRLE(src, Nway)
480
+
481
+ if (src.length < 4 && order == 1) {
482
+ // Protect against short order-1 data due to RLE/Pack
483
+ order = 0
484
+ hdr.buf[0] &= ~1
485
+ }
486
+
487
+ if (cat) var comp = src
488
+ else if (order == 0) var comp = RansEncode0(src, Nway)
489
+ else var comp = RansEncode1(src, Nway)
490
+
491
+ return Buffer.concat([hdr.buf.slice(0, hdr.pos), pack_meta, rle_meta, comp])
492
+ }
493
+
494
+ //----------------------------------------------------------------------
495
+ // Order-0 decoder
496
+
497
+ function ReadAlphabet(src) {
498
+ var A = new Array(256)
499
+ for (var i = 0; i < 256; i++) A[i] = 0
500
+
501
+ var rle = 0
502
+ var sym = src.ReadByte()
503
+ var last_sym = sym
504
+
505
+ do {
506
+ A[sym] = 1
507
+ if (rle > 0) {
508
+ rle--
509
+ sym++
510
+ } else {
511
+ sym = src.ReadByte()
512
+ if (sym == last_sym + 1) rle = src.ReadByte()
513
+ }
514
+ last_sym = sym
515
+ } while (sym != 0)
516
+
517
+ return A
518
+ }
519
+
520
+ // Decode a single table of order-0 frequences,
521
+ // filling out the F and C arrays.
522
+ function ReadFrequencies0(src, F, C) {
523
+ // Initialise; not in the specification - implicit?
524
+ for (var i = 0; i < 256; i++) F[i] = 0
525
+
526
+ // Fetch alphabet
527
+ var A = ReadAlphabet(src)
528
+
529
+ // Fetch frequencies for the symbols listed in our alphabet
530
+ for (var i = 0; i < 256; i++) {
531
+ if (A[i] > 0) F[i] = src.ReadUint7()
532
+ }
533
+
534
+ NormaliseFrequencies0_Shift(F, 12)
535
+
536
+ // Compute C[] from F[]
537
+ C[0] = 0
538
+ for (var i = 0; i <= 255; i++) C[i + 1] = C[i] + F[i]
539
+ }
540
+
541
+ function RansDecode0(src, nbytes, N) {
542
+ // Decode frequencies
543
+ var F = new Array(256)
544
+ var C = new Array(256)
545
+ ReadFrequencies0(src, F, C)
546
+
547
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
548
+ var C2S = RansBuildC2S(C, 12)
549
+
550
+ // Initialise rANS state
551
+ var R = new Array(N)
552
+ for (var i = 0; i < N; i++) R[i] = src.ReadUint32()
553
+
554
+ // Main decode loop
555
+ var output = new Buffer.allocUnsafe(nbytes)
556
+ for (var i = 0; i < nbytes; i++) {
557
+ var ix = i & (N - 1) // equiv to i%N as N is power of 2
558
+ var f = RansGetCumulativeFreq(R[ix], 12)
559
+ var s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
560
+
561
+ output[i] = s
562
+ R[ix] = RansAdvanceStep(R[ix], C[s], F[s], 12)
563
+ R[ix] = RansRenorm(src, R[ix])
564
+ }
565
+
566
+ // Main decode loop
567
+ return output
568
+ }
569
+
570
+ //----------------------------------------------------------------------
571
+ // Order-0 encoder
572
+
573
+ function BuildFrequencies0(src, F) {
574
+ for (var i = 0; i < 256; i++) F[i] = 0
575
+
576
+ for (var i = 0; i < src.length; i++) F[src[i]]++
577
+ }
578
+
579
+ function NormaliseFrequencies0(F, bits) {
580
+ // Compute total
581
+ var tot = 0
582
+ for (var i = 0; i < 256; i++) tot += F[i]
583
+
584
+ // Scale total of frequencies to max
585
+ const max = 1 << bits
586
+ var scale = max / tot
587
+ do {
588
+ var max_val = 0
589
+ var max_idx = 0
590
+ var renorm = 0
591
+ tot = 0
592
+ for (var i = 0; i < 256; i++) {
593
+ if (F[i] == 0) continue
594
+
595
+ if (max_val < F[i]) {
596
+ max_val = F[i]
597
+ max_idx = i
598
+ }
599
+
600
+ F[i] = Math.floor(F[i] * scale)
601
+ if (F[i] == 0) F[i] = 1
602
+
603
+ tot += F[i]
604
+ }
605
+
606
+ // Adjust new tot to ensure it matches.
607
+ if (tot < max) {
608
+ // Too low, boost the most common symbol
609
+ F[max_idx] += max - tot
610
+ } else if (tot - max < F[max_idx] / 2 && F[max_idx] > 2) {
611
+ // Too high, reduce the common symbol
612
+ F[max_idx] -= tot - max
613
+ } else if (tot != max) {
614
+ // Much too high, fudge scale and try again.
615
+ scale = max / tot
616
+ renorm = 1
617
+ }
618
+ } while (renorm)
619
+ }
620
+
621
+ function NormaliseFrequencies0_Shift(F, bits) {
622
+ // Compute total and number of bits to shift by
623
+ var tot = 0
624
+ for (var i = 0; i < 256; i++) tot += F[i]
625
+
626
+ if (tot == 0 || tot == 1 << bits) return
627
+
628
+ var shift = 0
629
+ while (tot < 1 << bits) {
630
+ tot *= 2
631
+ shift++
632
+ }
633
+
634
+ // Scale total of frequencies to (1<<bits)
635
+ for (var i = 0; i < 256; i++) F[i] <<= shift
636
+ }
637
+
638
+ function WriteAlphabet(out, F) {
639
+ var rle = 0
640
+ for (var i = 0; i < 256; i++) {
641
+ if (!F[i]) continue
642
+
643
+ if (rle > 0) rle--
644
+ else {
645
+ out.WriteByte(i)
646
+
647
+ if (i > 0 && F[i - 1] > 0) {
648
+ // We've encoded two symbol frequencies in a row.
649
+ // How many more are there? Store that count so
650
+ // we can avoid writing consecutive symbols.
651
+ for (rle = i + 1; rle < 256 && F[rle]; rle++);
652
+ rle -= i + 1
653
+
654
+ out.WriteByte(rle)
655
+ }
656
+ }
657
+ }
658
+ out.WriteByte(0)
659
+ }
660
+
661
+ function WriteFrequencies0(out, F) {
662
+ WriteAlphabet(out, F)
663
+
664
+ for (var i = 0; i < 256; i++) {
665
+ if (F[i]) out.WriteUint7(F[i])
666
+ }
667
+ }
668
+
669
+ function RansEncode0(src, N) {
670
+ const nbytes = src.length
671
+ var output = new IOStream('', 0, 257 * 3 + 9)
672
+
673
+ // Compute frequencies
674
+ var F = new Array(256)
675
+ BuildFrequencies0(src, F)
676
+ var bit_size = Math.ceil(Math.log2(nbytes))
677
+ if (bit_size > 12) bit_size = 12
678
+ NormaliseFrequencies0(F, bit_size)
679
+ WriteFrequencies0(output, F)
680
+ NormaliseFrequencies0(F, 12)
681
+
682
+ // Compute cumulative frequencies
683
+ var C = new Array(256)
684
+ C[0] = 0
685
+ for (var i = 1; i < 256; i++) C[i] = C[i - 1] + F[i - 1]
686
+
687
+ // Initialise rANS state
688
+ var R = new Array(N)
689
+ for (var i = 0; i < N; i++) R[i] = RansEncInit()
690
+
691
+ // Allow expansion room if trying to compress random data.
692
+ var rans_out = new IOStream(
693
+ '',
694
+ (nbytes * 1.05 + 100) >> 0,
695
+ (nbytes * 1.05 + 100) >> 0,
696
+ )
697
+
698
+ // Main encode loop
699
+ for (var i = nbytes - 1; i >= 0; i--)
700
+ R[i % N] = RansEncPut(R[i % N], rans_out, C[src[i]], F[src[i]], 12)
701
+
702
+ for (var i = N - 1; i >= 0; i--) RansEncFlush(R[i], rans_out)
703
+
704
+ // Stitch blocks together into final output buffer
705
+ //console.error("pos=",rans_out.pos, " len=",rans_out.length)
706
+ //console.error(rans_out.buf.slice(rans_out.pos, rans_out.length))
707
+ return Buffer.concat(
708
+ [
709
+ output.buf.slice(0, output.pos),
710
+ rans_out.buf.slice(rans_out.pos, rans_out.length),
711
+ ],
712
+ output.pos + rans_out.length - rans_out.pos,
713
+ )
714
+ }
715
+
716
+ //----------------------------------------------------------------------
717
+ // Order-1 decoder
718
+
719
+ // Decode a table of order-1 frequences,
720
+ // filling out the F and C arrays.
721
+ function ReadFrequencies1(src, F, C, shift) {
722
+ // Initialise; not in the specification - implicit?
723
+ for (var i = 0; i < 256; i++) {
724
+ F[i] = new Array(256)
725
+ C[i] = new Array(256)
726
+ for (var j = 0; j < 256; j++) F[i][j] = 0
727
+ }
728
+
729
+ // Fetch alphabet
730
+ var A = ReadAlphabet(src)
731
+
732
+ // Read F[]
733
+ for (var i = 0; i < 256; i++) {
734
+ if (!A[i]) continue
735
+
736
+ var run = 0
737
+ for (var j = 0; j < 256; j++) {
738
+ if (!A[j]) continue
739
+
740
+ if (run > 0) {
741
+ run--
742
+ } else {
743
+ F[i][j] = src.ReadUint7()
744
+ if (F[i][j] == 0) run = src.ReadByte()
745
+ }
746
+ }
747
+
748
+ NormaliseFrequencies0_Shift(F[i], shift)
749
+
750
+ // Compute C[] from F[]
751
+ C[i][0] = 0
752
+ for (var j = 0; j < 256; j++) C[i][j + 1] = C[i][j] + F[i][j]
753
+ }
754
+ }
755
+
756
+ function RansDecode1(src, nbytes, N) {
757
+ // FIXME: this bit is missing from the RansDecode0 pseudocode.
758
+
759
+ var comp = src.ReadByte()
760
+ var shift = comp >> 4
761
+
762
+ var freq_src = src
763
+ if (comp & 1) {
764
+ var ulen = src.ReadUint7()
765
+ var clen = src.ReadUint7()
766
+ var comp = new IOStream(src.ReadData(clen))
767
+ var freq_src = new IOStream(RansDecode0(comp, ulen, 4))
768
+ }
769
+
770
+ // Decode frequencies
771
+ var F = new Array(256)
772
+ var C = new Array(256)
773
+ ReadFrequencies1(freq_src, F, C, shift)
774
+
775
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
776
+ var C2S = new Array(256)
777
+ for (var i = 0; i < 256; i++)
778
+ // Could do only for symbols in alphabet?
779
+ C2S[i] = RansBuildC2S(C[i], shift)
780
+
781
+ // Initialise rANS state
782
+ var R = new Array(N)
783
+ var L = new Array(N)
784
+ for (var j = 0; j < N; j++) {
785
+ R[j] = src.ReadUint32()
786
+ L[j] = 0
787
+ }
788
+
789
+ // Main decode loop
790
+ var output = new Buffer.allocUnsafe(nbytes)
791
+ var nbytesx = Math.floor(nbytes / N)
792
+ for (var i = 0; i < nbytesx; i++) {
793
+ for (var j = 0; j < N; j++) {
794
+ var f = RansGetCumulativeFreq(R[j], shift)
795
+
796
+ //var s = RansGetSymbolFromFreq(C[L[j]], f);
797
+ var s = C2S[L[j]][f] // Precomputed version of above
798
+
799
+ output[i + j * nbytesx] = s
800
+ R[j] = RansAdvanceStep(R[j], C[L[j]][s], F[L[j]][s], shift)
801
+ R[j] = RansRenorm(src, R[j])
802
+ L[j] = s
803
+ }
804
+ }
805
+
806
+ // Now deal with the remainder if buffer size is not a multiple of N,
807
+ // using the last rANS state exclusively. (It'd have been nice to have
808
+ // designed this to just act as if we kept going with a bail out.)
809
+ i = N * i
810
+ while (i < nbytes) {
811
+ var f = RansGetCumulativeFreq(R[N - 1], shift)
812
+ var s = RansGetSymbolFromFreq(C[L[N - 1]], f)
813
+ output[i++] = s
814
+ R[N - 1] = RansAdvanceStep(R[N - 1], C[L[N - 1]][s], F[L[N - 1]][s], shift)
815
+ R[N - 1] = RansRenorm(src, R[N - 1])
816
+ L[N - 1] = s
817
+ }
818
+
819
+ return output
820
+ }
821
+
822
+ //----------------------------------------------------------------------
823
+ // Order-1 encoder
824
+
825
+ function BuildFrequencies1(src, F, F0, N) {
826
+ for (var i = 0; i < 256; i++) {
827
+ F0[i] = 0
828
+ for (var j = 0; j < 256; j++) F[i][j] = 0
829
+ }
830
+
831
+ var last = 0
832
+ for (var i = 0; i < src.length; i++) {
833
+ F0[last]++
834
+ F[last][src[i]]++
835
+ last = src[i]
836
+ }
837
+ F0[last]++
838
+
839
+ // Also accept we'll be starting at N points, not just byte 0
840
+ for (var i = 1; i < N; i++) F[0][src[i * Math.floor(src.length / N)]]++
841
+ F0[0] += N - 1
842
+ }
843
+
844
+ function NormaliseFrequencies1(F, F0, shift) {
845
+ for (var i = 0; i < 256; i++) {
846
+ if (!F0[i]) continue
847
+
848
+ var bit_size = Math.ceil(Math.log2(F0[i]))
849
+ if (bit_size > shift) bit_size = shift
850
+
851
+ NormaliseFrequencies0(F[i], bit_size)
852
+ }
853
+ }
854
+
855
+ function NormaliseFrequencies1_Shift(F, F0, shift) {
856
+ for (var i = 0; i < 256; i++)
857
+ if (F0[i]) NormaliseFrequencies0_Shift(F[i], shift)
858
+ }
859
+
860
+ function WriteFrequencies1(out, F, F0) {
861
+ WriteAlphabet(out, F0)
862
+
863
+ for (var i = 0; i < 256; i++) {
864
+ if (!F0[i]) continue
865
+
866
+ var run = 0
867
+ for (var j = 0; j < 256; j++) {
868
+ if (!F0[j]) continue
869
+
870
+ if (run) {
871
+ run--
872
+ } else {
873
+ out.WriteUint7(F[i][j])
874
+
875
+ if (!F[i][j]) {
876
+ // Count how many more zero-freqs we have
877
+ for (var k = j + 1; k < 256; k++) {
878
+ if (!F0[k]) continue
879
+
880
+ if (F[i][k] == 0) run++
881
+ else break
882
+ }
883
+ out.WriteByte(run)
884
+ }
885
+ }
886
+ }
887
+ }
888
+ }
889
+
890
+ function RansEncode1(src, N) {
891
+ const nbytes = src.length
892
+ var output = new IOStream('', 0, 257 * 257 * 3 + 9)
893
+
894
+ // Compute frequencies
895
+ var F0 = new Array(256)
896
+ var F = new Array(256)
897
+ var C = new Array(256)
898
+ for (var i = 0; i < 256; i++) {
899
+ F[i] = new Array(256)
900
+ C[i] = new Array(256)
901
+ }
902
+
903
+ // Frequency precision
904
+ var shift = 12
905
+
906
+ BuildFrequencies1(src, F, F0, N)
907
+ NormaliseFrequencies1(F, F0, shift)
908
+
909
+ // Store frequencies, possibly compressed
910
+ var freq = new IOStream('', 0, 257 * 257 * 3 + 9)
911
+
912
+ WriteFrequencies1(freq, F, F0)
913
+
914
+ var cfreq = RansEncode0(freq.buf.slice(0, freq.pos), 4)
915
+ if (cfreq.length < freq.pos) {
916
+ output.WriteByte(1 | (shift << 4))
917
+ output.WriteUint7(freq.pos)
918
+ output.WriteUint7(cfreq.length)
919
+ output.WriteData(cfreq, cfreq.length)
920
+ } else {
921
+ output.WriteByte(0 | (shift << 4))
922
+ output.WriteData(freq.buf, freq.pos)
923
+ }
924
+
925
+ // Normalise and compute cumulative frequencies
926
+ NormaliseFrequencies1_Shift(F, F0, shift)
927
+ for (var i = 0; i < 256; i++) {
928
+ if (!F0[i]) continue
929
+
930
+ C[i][0] = 0
931
+ for (var j = 1; j < 256; j++) C[i][j] = C[i][j - 1] + F[i][j - 1]
932
+ }
933
+
934
+ // Initialise rANS state
935
+ var R = new Array(N)
936
+ var L = new Array(N)
937
+ for (var j = 0; j < N; j++) {
938
+ R[j] = RansEncInit()
939
+ L[j] = 0
940
+ }
941
+ var rans_out = new IOStream(
942
+ '',
943
+ (nbytes * 1.05 + 100) >> 0,
944
+ (nbytes * 1.05 + 100) >> 0,
945
+ )
946
+
947
+ // We have N rans codecs running in parallel on its own 1/Nth of buffer
948
+ var nbytesx = Math.floor(nbytes / N)
949
+ var idx = new Array(N)
950
+ var last = new Array(N)
951
+ for (var j = 0; j < N; j++) {
952
+ idx[j] = (j + 1) * nbytesx - 2
953
+ last[j] = src[idx[j] + 1]
954
+ }
955
+
956
+ // Deal with the remainder if not a multiple of N
957
+ last[N - 1] = src[nbytes - 1]
958
+ for (var i = nbytes - 2; i > N * nbytesx - 2; i--) {
959
+ R[N - 1] = RansEncPut(
960
+ R[N - 1],
961
+ rans_out,
962
+ C[src[i]][last[N - 1]],
963
+ F[src[i]][last[N - 1]],
964
+ shift,
965
+ )
966
+ last[N - 1] = src[i]
967
+ }
968
+
969
+ // Main encode loop
970
+ var s = new Array(N)
971
+ while (idx[0] >= 0) {
972
+ // Separate loop as a speed optimisation
973
+ for (var j = N - 1; j >= 0; j--) s[j] = src[idx[j]]
974
+ for (var j = N - 1; j >= 0; j--) {
975
+ R[j] = RansEncPut(
976
+ R[j],
977
+ rans_out,
978
+ C[s[j]][last[j]],
979
+ F[s[j]][last[j]],
980
+ shift,
981
+ )
982
+ last[j] = s[j]
983
+ idx[j]--
984
+ }
985
+ }
986
+
987
+ for (var j = N - 1; j >= 0; j--) {
988
+ R[j] = RansEncPut(R[j], rans_out, C[0][last[j]], F[0][last[j]], shift)
989
+ }
990
+
991
+ for (var i = N - 1; i >= 0; i--) RansEncFlush(R[i], rans_out)
992
+
993
+ // Stitch blocks together into final output buffer
994
+ return Buffer.concat(
995
+ [
996
+ output.buf.slice(0, output.pos),
997
+ rans_out.buf.slice(rans_out.pos, rans_out.length),
998
+ ],
999
+ output.pos + rans_out.length - rans_out.pos,
1000
+ )
1001
+ }
1002
+
1003
+ module.exports = { decode, encode }