@gmod/cram 3.0.6 → 4.0.0

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 (248) hide show
  1. package/dist/craiIndex.js +70 -87
  2. package/dist/craiIndex.js.map +1 -1
  3. package/dist/cram-bundle.js +1 -1
  4. package/dist/cramFile/codecs/_base.d.ts +1 -1
  5. package/dist/cramFile/codecs/beta.d.ts +2 -2
  6. package/dist/cramFile/codecs/beta.js +1 -1
  7. package/dist/cramFile/codecs/beta.js.map +1 -1
  8. package/dist/cramFile/codecs/byteArrayLength.d.ts +2 -2
  9. package/dist/cramFile/codecs/byteArrayStop.d.ts +4 -4
  10. package/dist/cramFile/codecs/byteArrayStop.js +1 -1
  11. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -1
  12. package/dist/cramFile/codecs/external.d.ts +1 -1
  13. package/dist/cramFile/codecs/external.js +1 -1
  14. package/dist/cramFile/codecs/external.js.map +1 -1
  15. package/dist/cramFile/codecs/gamma.d.ts +1 -1
  16. package/dist/cramFile/codecs/gamma.js +1 -1
  17. package/dist/cramFile/codecs/gamma.js.map +1 -1
  18. package/dist/cramFile/codecs/getBits.d.ts +1 -1
  19. package/dist/cramFile/codecs/getBits.js.map +1 -1
  20. package/dist/cramFile/codecs/huffman.d.ts +1 -1
  21. package/dist/cramFile/codecs/huffman.js +1 -1
  22. package/dist/cramFile/codecs/huffman.js.map +1 -1
  23. package/dist/cramFile/codecs/index.d.ts +1 -1
  24. package/dist/cramFile/codecs/index.js +5 -5
  25. package/dist/cramFile/codecs/index.js.map +1 -1
  26. package/dist/cramFile/codecs/subexp.d.ts +2 -2
  27. package/dist/cramFile/codecs/subexp.js +1 -1
  28. package/dist/cramFile/codecs/subexp.js.map +1 -1
  29. package/dist/cramFile/container/compressionScheme.d.ts +2 -2
  30. package/dist/cramFile/container/compressionScheme.js +1 -1
  31. package/dist/cramFile/container/compressionScheme.js.map +1 -1
  32. package/dist/cramFile/container/index.d.ts +1 -2
  33. package/dist/cramFile/container/index.js +62 -79
  34. package/dist/cramFile/container/index.js.map +1 -1
  35. package/dist/cramFile/file.d.ts +9 -13
  36. package/dist/cramFile/file.js +218 -249
  37. package/dist/cramFile/file.js.map +1 -1
  38. package/dist/cramFile/record.js +2 -2
  39. package/dist/cramFile/record.js.map +1 -1
  40. package/dist/cramFile/sectionParsers.d.ts +16 -16
  41. package/dist/cramFile/sectionParsers.js +12 -9
  42. package/dist/cramFile/sectionParsers.js.map +1 -1
  43. package/dist/cramFile/slice/decodeRecord.d.ts +3 -3
  44. package/dist/cramFile/slice/decodeRecord.js +11 -11
  45. package/dist/cramFile/slice/decodeRecord.js.map +1 -1
  46. package/dist/cramFile/slice/index.d.ts +2 -2
  47. package/dist/cramFile/slice/index.js +241 -262
  48. package/dist/cramFile/slice/index.js.map +1 -1
  49. package/dist/cramFile/util.d.ts +4 -2
  50. package/dist/cramFile/util.js +29 -6
  51. package/dist/cramFile/util.js.map +1 -1
  52. package/dist/htscodecs/arith_gen.d.ts +18 -0
  53. package/dist/htscodecs/arith_gen.js +318 -0
  54. package/dist/htscodecs/arith_gen.js.map +1 -0
  55. package/dist/htscodecs/arith_sh.d.ts +16 -0
  56. package/dist/htscodecs/arith_sh.js +128 -0
  57. package/dist/htscodecs/arith_sh.js.map +1 -0
  58. package/dist/htscodecs/byte_model.d.ts +11 -0
  59. package/dist/htscodecs/byte_model.js +113 -0
  60. package/dist/htscodecs/byte_model.js.map +1 -0
  61. package/dist/htscodecs/fqzcomp.d.ts +1 -0
  62. package/dist/htscodecs/fqzcomp.js +325 -0
  63. package/dist/htscodecs/fqzcomp.js.map +1 -0
  64. package/dist/htscodecs/index.d.ts +5 -0
  65. package/dist/htscodecs/index.js +70 -0
  66. package/dist/htscodecs/index.js.map +1 -0
  67. package/dist/htscodecs/iostream.d.ts +27 -0
  68. package/dist/htscodecs/iostream.js +243 -0
  69. package/dist/htscodecs/iostream.js.map +1 -0
  70. package/dist/htscodecs/rans.d.ts +1 -0
  71. package/dist/htscodecs/rans.js +213 -0
  72. package/dist/htscodecs/rans.js.map +1 -0
  73. package/dist/htscodecs/rans4x16.d.ts +1 -0
  74. package/dist/htscodecs/rans4x16.js +405 -0
  75. package/dist/htscodecs/rans4x16.js.map +1 -0
  76. package/dist/htscodecs/tok3.d.ts +2 -0
  77. package/dist/htscodecs/tok3.js +363 -0
  78. package/dist/htscodecs/tok3.js.map +1 -0
  79. package/dist/index.d.ts +1 -1
  80. package/dist/index.js +2 -2
  81. package/dist/index.js.map +1 -1
  82. package/dist/indexedCramFile.d.ts +4 -4
  83. package/dist/indexedCramFile.js +97 -108
  84. package/dist/indexedCramFile.js.map +1 -1
  85. package/dist/io/index.d.ts +2 -2
  86. package/dist/io/index.js +6 -6
  87. package/dist/io/index.js.map +1 -1
  88. package/dist/rans/constants.d.ts +1 -1
  89. package/dist/rans/constants.js +1 -1
  90. package/dist/rans/constants.js.map +1 -1
  91. package/dist/rans/d04.js.map +1 -1
  92. package/dist/rans/decoding.js.map +1 -1
  93. package/dist/rans/frequencies.js.map +1 -1
  94. package/dist/rans/index.js +5 -5
  95. package/dist/rans/index.js.map +1 -1
  96. package/dist/unzip.d.ts +1 -1
  97. package/dist/unzip.js +5 -3
  98. package/dist/unzip.js.map +1 -1
  99. package/esm/craiIndex.js +10 -12
  100. package/esm/craiIndex.js.map +1 -1
  101. package/esm/cramFile/codecs/_base.d.ts +1 -1
  102. package/esm/cramFile/codecs/beta.d.ts +2 -2
  103. package/esm/cramFile/codecs/beta.js +1 -1
  104. package/esm/cramFile/codecs/beta.js.map +1 -1
  105. package/esm/cramFile/codecs/byteArrayLength.d.ts +2 -2
  106. package/esm/cramFile/codecs/byteArrayStop.d.ts +4 -4
  107. package/esm/cramFile/codecs/byteArrayStop.js +1 -1
  108. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -1
  109. package/esm/cramFile/codecs/external.d.ts +1 -1
  110. package/esm/cramFile/codecs/external.js +1 -1
  111. package/esm/cramFile/codecs/external.js.map +1 -1
  112. package/esm/cramFile/codecs/gamma.d.ts +1 -1
  113. package/esm/cramFile/codecs/gamma.js +1 -1
  114. package/esm/cramFile/codecs/gamma.js.map +1 -1
  115. package/esm/cramFile/codecs/getBits.d.ts +1 -1
  116. package/esm/cramFile/codecs/getBits.js.map +1 -1
  117. package/esm/cramFile/codecs/huffman.d.ts +1 -1
  118. package/esm/cramFile/codecs/huffman.js +1 -1
  119. package/esm/cramFile/codecs/huffman.js.map +1 -1
  120. package/esm/cramFile/codecs/index.d.ts +1 -1
  121. package/esm/cramFile/codecs/index.js +5 -5
  122. package/esm/cramFile/codecs/index.js.map +1 -1
  123. package/esm/cramFile/codecs/subexp.d.ts +2 -2
  124. package/esm/cramFile/codecs/subexp.js +1 -1
  125. package/esm/cramFile/codecs/subexp.js.map +1 -1
  126. package/esm/cramFile/container/compressionScheme.d.ts +2 -2
  127. package/esm/cramFile/container/compressionScheme.js +1 -1
  128. package/esm/cramFile/container/compressionScheme.js.map +1 -1
  129. package/esm/cramFile/container/index.d.ts +1 -2
  130. package/esm/cramFile/container/index.js +4 -7
  131. package/esm/cramFile/container/index.js.map +1 -1
  132. package/esm/cramFile/file.d.ts +9 -13
  133. package/esm/cramFile/file.js +54 -61
  134. package/esm/cramFile/file.js.map +1 -1
  135. package/esm/cramFile/record.js +2 -2
  136. package/esm/cramFile/record.js.map +1 -1
  137. package/esm/cramFile/sectionParsers.d.ts +16 -16
  138. package/esm/cramFile/sectionParsers.js +7 -7
  139. package/esm/cramFile/sectionParsers.js.map +1 -1
  140. package/esm/cramFile/slice/decodeRecord.d.ts +3 -3
  141. package/esm/cramFile/slice/decodeRecord.js +11 -11
  142. package/esm/cramFile/slice/decodeRecord.js.map +1 -1
  143. package/esm/cramFile/slice/index.d.ts +2 -2
  144. package/esm/cramFile/slice/index.js +7 -6
  145. package/esm/cramFile/slice/index.js.map +1 -1
  146. package/esm/cramFile/util.d.ts +4 -2
  147. package/esm/cramFile/util.js +19 -2
  148. package/esm/cramFile/util.js.map +1 -1
  149. package/esm/htscodecs/arith_gen.d.ts +18 -0
  150. package/esm/htscodecs/arith_gen.js +318 -0
  151. package/esm/htscodecs/arith_gen.js.map +1 -0
  152. package/esm/htscodecs/arith_sh.d.ts +16 -0
  153. package/esm/htscodecs/arith_sh.js +128 -0
  154. package/esm/htscodecs/arith_sh.js.map +1 -0
  155. package/esm/htscodecs/byte_model.d.ts +11 -0
  156. package/esm/htscodecs/byte_model.js +113 -0
  157. package/esm/htscodecs/byte_model.js.map +1 -0
  158. package/esm/htscodecs/fqzcomp.d.ts +1 -0
  159. package/esm/htscodecs/fqzcomp.js +325 -0
  160. package/esm/htscodecs/fqzcomp.js.map +1 -0
  161. package/esm/htscodecs/index.d.ts +5 -0
  162. package/esm/htscodecs/index.js +70 -0
  163. package/esm/htscodecs/index.js.map +1 -0
  164. package/esm/htscodecs/iostream.d.ts +27 -0
  165. package/esm/htscodecs/iostream.js +243 -0
  166. package/esm/htscodecs/iostream.js.map +1 -0
  167. package/esm/htscodecs/rans.d.ts +1 -0
  168. package/esm/htscodecs/rans.js +213 -0
  169. package/esm/htscodecs/rans.js.map +1 -0
  170. package/esm/htscodecs/rans4x16.d.ts +1 -0
  171. package/esm/htscodecs/rans4x16.js +405 -0
  172. package/esm/htscodecs/rans4x16.js.map +1 -0
  173. package/esm/htscodecs/tok3.d.ts +2 -0
  174. package/esm/htscodecs/tok3.js +363 -0
  175. package/esm/htscodecs/tok3.js.map +1 -0
  176. package/esm/index.d.ts +1 -1
  177. package/esm/index.js +1 -1
  178. package/esm/index.js.map +1 -1
  179. package/esm/indexedCramFile.d.ts +4 -4
  180. package/esm/indexedCramFile.js +10 -10
  181. package/esm/indexedCramFile.js.map +1 -1
  182. package/esm/io/index.d.ts +2 -2
  183. package/esm/io/index.js +1 -1
  184. package/esm/io/index.js.map +1 -1
  185. package/esm/rans/constants.d.ts +1 -1
  186. package/esm/rans/constants.js +1 -1
  187. package/esm/rans/constants.js.map +1 -1
  188. package/esm/rans/d04.js.map +1 -1
  189. package/esm/rans/decoding.js.map +1 -1
  190. package/esm/rans/frequencies.js.map +1 -1
  191. package/esm/rans/index.js +5 -5
  192. package/esm/rans/index.js.map +1 -1
  193. package/esm/unzip.d.ts +1 -1
  194. package/esm/unzip.js +4 -1
  195. package/esm/unzip.js.map +1 -1
  196. package/package.json +7 -10
  197. package/src/craiIndex.ts +17 -16
  198. package/src/cramFile/codecs/_base.ts +1 -1
  199. package/src/cramFile/codecs/beta.ts +3 -3
  200. package/src/cramFile/codecs/byteArrayLength.ts +1 -1
  201. package/src/cramFile/codecs/byteArrayStop.ts +3 -4
  202. package/src/cramFile/codecs/external.ts +3 -3
  203. package/src/cramFile/codecs/gamma.ts +2 -2
  204. package/src/cramFile/codecs/getBits.ts +1 -1
  205. package/src/cramFile/codecs/huffman.ts +2 -3
  206. package/src/cramFile/codecs/index.ts +7 -8
  207. package/src/cramFile/codecs/subexp.ts +3 -3
  208. package/src/cramFile/container/compressionScheme.ts +3 -3
  209. package/src/cramFile/container/index.ts +7 -10
  210. package/src/cramFile/file.ts +78 -86
  211. package/src/cramFile/record.ts +3 -3
  212. package/src/cramFile/sectionParsers.ts +27 -22
  213. package/src/cramFile/slice/decodeRecord.ts +17 -17
  214. package/src/cramFile/slice/index.ts +8 -9
  215. package/src/cramFile/util.ts +24 -6
  216. package/src/htscodecs/arith_gen.js +344 -0
  217. package/src/htscodecs/arith_sh.js +138 -0
  218. package/src/htscodecs/byte_model.js +126 -0
  219. package/src/htscodecs/fqzcomp.js +360 -0
  220. package/src/htscodecs/index.js +77 -0
  221. package/src/htscodecs/iostream.js +257 -0
  222. package/src/htscodecs/rans.js +233 -0
  223. package/src/htscodecs/rans4x16.js +452 -0
  224. package/src/htscodecs/tok3.js +413 -0
  225. package/src/index.ts +1 -1
  226. package/src/indexedCramFile.ts +6 -5
  227. package/src/io/index.ts +5 -4
  228. package/src/rans/constants.ts +1 -1
  229. package/src/rans/d04.ts +0 -1
  230. package/src/rans/decoding.ts +0 -1
  231. package/src/rans/frequencies.ts +0 -1
  232. package/src/rans/index.ts +5 -7
  233. package/src/unzip.ts +5 -1
  234. package/dist/cramFile/filehandle.d.ts +0 -1
  235. package/dist/cramFile/filehandle.js +0 -3
  236. package/dist/cramFile/filehandle.js.map +0 -1
  237. package/dist/unzip-pako.d.ts +0 -2
  238. package/dist/unzip-pako.js +0 -9
  239. package/dist/unzip-pako.js.map +0 -1
  240. package/esm/cramFile/filehandle.d.ts +0 -1
  241. package/esm/cramFile/filehandle.js +0 -2
  242. package/esm/cramFile/filehandle.js.map +0 -1
  243. package/esm/unzip-pako.d.ts +0 -2
  244. package/esm/unzip-pako.js +0 -6
  245. package/esm/unzip-pako.js.map +0 -1
  246. package/src/cramFile/filehandle.ts +0 -1
  247. package/src/typings/htscodecs.d.ts +0 -6
  248. package/src/unzip-pako.ts +0 -6
@@ -0,0 +1,233 @@
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) {
42
+ return R & 0xfff
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
+ return s
53
+ }
54
+
55
+ function RansBuildC2S(C) {
56
+ var C2S = new Array(0x1000)
57
+ var s = 0
58
+ for (var f = 0; f < 0x1000; f++) {
59
+ while (f >= C[s + 1]) s++
60
+ C2S[f] = s
61
+ }
62
+ return C2S
63
+ }
64
+
65
+ function RansAdvanceStep(R, c, f) {
66
+ return f * (R >> 12) + (R & 0xfff) - c
67
+ }
68
+
69
+ function RansRenorm(src, R) {
70
+ while (R < 1 << 23) R = (R << 8) + src.ReadByte()
71
+
72
+ return R
73
+ }
74
+ //----------------------------------------------------------------------
75
+ // Main rANS entry function: decodes a compressed src and
76
+ // returns the uncompressed buffer.
77
+ function decode(src) {
78
+ var stream = new IOStream(src)
79
+ var order = stream.ReadByte()
80
+ var n_in = stream.ReadUint32()
81
+ var n_out = stream.ReadUint32()
82
+
83
+ if (order == 0) {
84
+ return RansDecode0(stream, n_out)
85
+ } else {
86
+ return RansDecode1(stream, n_out)
87
+ }
88
+ }
89
+
90
+ //----------------------------------------------------------------------
91
+ // Order-0 decoder
92
+
93
+ // Decode a single table of order-0 frequences,
94
+ // filling out the F and C arrays.
95
+ function ReadFrequencies0(src, F, C) {
96
+ // Initialise; not in the specification - implicit?
97
+ for (var i = 0; i < 256; i++) F[i] = 0
98
+
99
+ var sym = src.ReadByte()
100
+ var last_sym = sym
101
+ var rle = 0
102
+
103
+ // Read F[]
104
+ do {
105
+ var f = src.ReadITF8()
106
+ F[sym] = f
107
+ if (rle > 0) {
108
+ rle--
109
+ sym++
110
+ } else {
111
+ sym = src.ReadByte()
112
+ if (sym == last_sym + 1) rle = src.ReadByte()
113
+ }
114
+ last_sym = sym
115
+ } while (sym != 0)
116
+
117
+ // Compute C[] from F[]
118
+ C[0] = 0
119
+ for (var i = 0; i <= 255; i++) C[i + 1] = C[i] + F[i]
120
+ }
121
+
122
+ function RansDecode0(src, nbytes) {
123
+ // Decode frequencies
124
+ var F = new Array(256)
125
+ var C = new Array(256)
126
+ ReadFrequencies0(src, F, C)
127
+
128
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
129
+ var C2S = RansBuildC2S(C)
130
+
131
+ // Initialise rANS state
132
+ var R = new Array(4)
133
+ for (var i = 0; i < 4; i++) R[i] = src.ReadUint32()
134
+
135
+ // Main decode loop
136
+ var output = new Uint8Array(nbytes)
137
+ for (var i = 0; i < nbytes; i++) {
138
+ var i4 = i % 4
139
+ var f = RansGetCumulativeFreq(R[i4])
140
+ var s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
141
+
142
+ output[i] = s
143
+ R[i4] = RansAdvanceStep(R[i4], C[s], F[s])
144
+ R[i4] = RansRenorm(src, R[i4])
145
+ }
146
+
147
+ return output
148
+ }
149
+
150
+ //----------------------------------------------------------------------
151
+ // Order-1 decoder
152
+
153
+ // Decode a table of order-1 frequences,
154
+ // filling out the F and C arrays.
155
+ function ReadFrequencies1(src, F, C) {
156
+ // Initialise; not in the specification - implicit?
157
+ for (var i = 0; i < 256; i++) {
158
+ F[i] = new Array(256)
159
+ C[i] = new Array(256)
160
+ for (var j = 0; j < 256; j++) F[i][j] = 0
161
+ }
162
+
163
+ var sym = src.ReadByte()
164
+ var last_sym = sym
165
+ var rle = 0
166
+
167
+ // Read F[]
168
+ do {
169
+ ReadFrequencies0(src, F[sym], C[sym])
170
+
171
+ if (rle > 0) {
172
+ rle--
173
+ sym++
174
+ } else {
175
+ sym = src.ReadByte()
176
+ if (sym == last_sym + 1) rle = src.ReadByte()
177
+ }
178
+ last_sym = sym
179
+ } while (sym != 0)
180
+ }
181
+
182
+ function RansDecode1(src, nbytes) {
183
+ // Decode frequencies
184
+ var F = new Array(256)
185
+ var C = new Array(256)
186
+ ReadFrequencies1(src, F, C)
187
+
188
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
189
+ var C2S = new Array(256)
190
+ for (var i = 0; i < 256; i++) C2S[i] = RansBuildC2S(C[i])
191
+
192
+ // Initialise rANS state
193
+ var R = new Array(4)
194
+ var L = new Array(4)
195
+ for (var j = 0; j < 4; j++) {
196
+ R[j] = src.ReadUint32()
197
+ L[j] = 0
198
+ }
199
+
200
+ // Main decode loop
201
+ var output = new Uint8Array(nbytes)
202
+ var nbytes4 = Math.floor(nbytes / 4)
203
+ for (var i = 0; i < nbytes4; i++) {
204
+ for (var j = 0; j < 4; j++) {
205
+ var f = RansGetCumulativeFreq(R[j])
206
+
207
+ //var s = RansGetSymbolFromFreq(C[L[j]], f);
208
+ var s = C2S[L[j]][f] // Precomputed version of above
209
+
210
+ output[i + j * nbytes4] = s
211
+ R[j] = RansAdvanceStep(R[j], C[L[j]][s], F[L[j]][s])
212
+ R[j] = RansRenorm(src, R[j])
213
+ L[j] = s
214
+ }
215
+ }
216
+
217
+ // Now deal with the remainder if buffer size is not a multiple of 4,
218
+ // using rANS state 3 exclusively. (It'd have been nice to have
219
+ // designed this to just act as if we kept going with a bail out.)
220
+ i = 4 * i
221
+ while (i < nbytes) {
222
+ var f = RansGetCumulativeFreq(R[3])
223
+ var s = RansGetSymbolFromFreq(C[L[3]], f)
224
+ output[i++] = s
225
+ R[3] = RansAdvanceStep(R[3], C[L[3]][s], F[L[3]][s])
226
+ R[3] = RansRenorm(src, R[3])
227
+ L[3] = s
228
+ }
229
+
230
+ return output
231
+ }
232
+
233
+ module.exports = { decode }
@@ -0,0 +1,452 @@
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
+ function DecodeRLEMeta(src, N) {
79
+ var u_meta_len = src.ReadUint7()
80
+ var rle_len = src.ReadUint7()
81
+
82
+ // Decode RLE lengths
83
+ if (u_meta_len & 1) {
84
+ var rle_meta = src.ReadData((u_meta_len - 1) / 2)
85
+ } else {
86
+ var comp_meta_len = src.ReadUint7()
87
+ var rle_meta = src.ReadData(comp_meta_len)
88
+ rle_meta = RansDecode0(new IOStream(rle_meta), u_meta_len / 2, N)
89
+ }
90
+
91
+ // Decode list of symbols for which RLE lengths are applied
92
+ var rle_meta = new IOStream(rle_meta)
93
+ var L = new Array(256)
94
+ var n = rle_meta.ReadByte()
95
+ if (n == 0) n = 256
96
+ for (var i = 0; i < n; i++) L[rle_meta.ReadByte()] = 1
97
+
98
+ return [L, rle_meta, rle_len]
99
+ }
100
+
101
+ function DecodeRLE(buf, L, rle_meta, len) {
102
+ var src = new IOStream(buf)
103
+
104
+ var out = new Uint8Array(len)
105
+
106
+ // Expand up buf+meta to out; i = buf index, j = out index
107
+ var j = 0
108
+ for (var i = 0; j < len; i++) {
109
+ var sym = buf[i]
110
+ if (L[sym]) {
111
+ var run = rle_meta.ReadUint7()
112
+ for (var r = 0; r <= run; r++) out[j++] = sym
113
+ } else {
114
+ out[j++] = sym
115
+ }
116
+ }
117
+
118
+ return out
119
+ }
120
+
121
+ // Pack meta data is the number and value of distinct symbols plus
122
+ // the length of the packed byte stream.
123
+ function DecodePackMeta(src) {
124
+ var nsym = src.ReadByte()
125
+ var P = new Array(nsym)
126
+
127
+ for (var i = 0; i < nsym; i++) P[i] = src.ReadByte()
128
+
129
+ var len = src.ReadUint7()
130
+
131
+ return [P, nsym, len]
132
+ }
133
+
134
+ // Extract bits from src producing output of length len.
135
+ // Nsym is number of distinct symbols used.
136
+ function DecodePack(data, P, nsym, len) {
137
+ var out = new Uint8Array(len)
138
+ var j = 0
139
+
140
+ // Constant value
141
+ if (nsym <= 1) {
142
+ for (var i = 0; i < len; i++) out[i] = P[0]
143
+ }
144
+
145
+ // 1 bit per value
146
+ else if (nsym <= 2) {
147
+ for (i = 0; i < len; i++) {
148
+ if (i % 8 == 0) var v = data[j++]
149
+
150
+ out[i] = P[v & 1]
151
+ v >>= 1
152
+ }
153
+ }
154
+
155
+ // 2 bits per value
156
+ else if (nsym <= 4) {
157
+ for (i = 0; i < len; i++) {
158
+ if (i % 4 == 0) var v = data[j++]
159
+
160
+ out[i] = P[v & 3]
161
+ v >>= 2
162
+ }
163
+ }
164
+
165
+ // 4 bits per value
166
+ else if (nsym <= 16) {
167
+ for (i = 0; i < len; i++) {
168
+ if (i % 2 == 0) var v = data[j++]
169
+
170
+ out[i] = P[v & 15]
171
+ v >>= 4
172
+ }
173
+ }
174
+
175
+ return out
176
+ }
177
+
178
+ function RansDecodeStripe(src, len) {
179
+ var N = src.ReadByte()
180
+
181
+ // Retrieve lengths
182
+ var clen = new Array(N)
183
+ var ulen = new Array(N)
184
+ for (var j = 0; j < N; j++) clen[j] = src.ReadUint7()
185
+
186
+ // Decode streams
187
+ var T = new Array(N)
188
+ for (var j = 0; j < N; j++) {
189
+ ulen[j] = Math.floor(len / N) + (len % N > j)
190
+ T[j] = RansDecodeStream(src, ulen[j])
191
+ }
192
+
193
+ // Transpose
194
+ var out = new Uint8Array(len)
195
+ for (var j = 0; j < N; j++) {
196
+ for (var i = 0; i < ulen[j]; i++) {
197
+ out[i * N + j] = T[j][i]
198
+ }
199
+ }
200
+
201
+ return out
202
+ }
203
+
204
+ //----------------------------------------------------------------------
205
+ // Main rANS entry function: decodes a compressed src and
206
+ // returns the uncompressed buffer.
207
+ function decode(src) {
208
+ var stream = new IOStream(src)
209
+ return RansDecodeStream(stream, 0)
210
+ }
211
+
212
+ function RansDecodeStream(stream, n_out) {
213
+ var format = stream.ReadByte()
214
+ var order = format & 1
215
+ var x32 = format & 4
216
+ var stripe = format & 8
217
+ var nosz = format & 16
218
+ var cat = format & 32
219
+ var rle = format & 64
220
+ var pack = format & 128
221
+
222
+ var Nway = x32 ? 32 : 4
223
+
224
+ if (!nosz) n_out = stream.ReadUint7()
225
+
226
+ // N-way interleaving
227
+ if (stripe) return RansDecodeStripe(stream, n_out)
228
+
229
+ // Bit packing
230
+ if (pack) {
231
+ var pack_len = n_out
232
+ var [P, nsym, n_out] = DecodePackMeta(stream)
233
+ }
234
+
235
+ // Run length encoding
236
+ if (rle) {
237
+ var rle_len = n_out
238
+ var [L, rle_meta, n_out] = DecodeRLEMeta(stream, Nway)
239
+ }
240
+
241
+ // Uncompress data (all, packed or run literals)
242
+ if (cat) var buf = stream.ReadData(n_out)
243
+ else if (order == 0) var buf = RansDecode0(stream, n_out, Nway)
244
+ else var buf = RansDecode1(stream, n_out, Nway)
245
+
246
+ // Apply expansion transforms
247
+ if (rle) buf = DecodeRLE(buf, L, rle_meta, rle_len)
248
+
249
+ if (pack) buf = DecodePack(buf, P, nsym, pack_len)
250
+
251
+ return buf
252
+ }
253
+
254
+ //----------------------------------------------------------------------
255
+ // Order-0 decoder
256
+
257
+ function ReadAlphabet(src) {
258
+ var A = new Array(256)
259
+ for (var i = 0; i < 256; i++) A[i] = 0
260
+
261
+ var rle = 0
262
+ var sym = src.ReadByte()
263
+ var last_sym = sym
264
+
265
+ do {
266
+ A[sym] = 1
267
+ if (rle > 0) {
268
+ rle--
269
+ sym++
270
+ } else {
271
+ sym = src.ReadByte()
272
+ if (sym == last_sym + 1) rle = src.ReadByte()
273
+ }
274
+ last_sym = sym
275
+ } while (sym != 0)
276
+
277
+ return A
278
+ }
279
+
280
+ // Decode a single table of order-0 frequences,
281
+ // filling out the F and C arrays.
282
+ function ReadFrequencies0(src, F, C) {
283
+ // Initialise; not in the specification - implicit?
284
+ for (var i = 0; i < 256; i++) F[i] = 0
285
+
286
+ // Fetch alphabet
287
+ var A = ReadAlphabet(src)
288
+
289
+ // Fetch frequencies for the symbols listed in our alphabet
290
+ for (var i = 0; i < 256; i++) {
291
+ if (A[i] > 0) F[i] = src.ReadUint7()
292
+ }
293
+
294
+ NormaliseFrequencies0_Shift(F, 12)
295
+
296
+ // Compute C[] from F[]
297
+ C[0] = 0
298
+ for (var i = 0; i <= 255; i++) C[i + 1] = C[i] + F[i]
299
+ }
300
+
301
+ function RansDecode0(src, nbytes, N) {
302
+ // Decode frequencies
303
+ var F = new Array(256)
304
+ var C = new Array(256)
305
+ ReadFrequencies0(src, F, C)
306
+
307
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
308
+ var C2S = RansBuildC2S(C, 12)
309
+
310
+ // Initialise rANS state
311
+ var R = new Array(N)
312
+ for (var i = 0; i < N; i++) R[i] = src.ReadUint32()
313
+
314
+ // Main decode loop
315
+ var output = new Uint8Array(nbytes)
316
+ for (var i = 0; i < nbytes; i++) {
317
+ var ix = i & (N - 1) // equiv to i%N as N is power of 2
318
+ var f = RansGetCumulativeFreq(R[ix], 12)
319
+ var s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
320
+
321
+ output[i] = s
322
+ R[ix] = RansAdvanceStep(R[ix], C[s], F[s], 12)
323
+ R[ix] = RansRenorm(src, R[ix])
324
+ }
325
+
326
+ // Main decode loop
327
+ return output
328
+ }
329
+
330
+ function NormaliseFrequencies0_Shift(F, bits) {
331
+ // Compute total and number of bits to shift by
332
+ var tot = 0
333
+ for (var i = 0; i < 256; i++) tot += F[i]
334
+
335
+ if (tot == 0 || tot == 1 << bits) return
336
+
337
+ var shift = 0
338
+ while (tot < 1 << bits) {
339
+ tot *= 2
340
+ shift++
341
+ }
342
+
343
+ // Scale total of frequencies to (1<<bits)
344
+ for (var i = 0; i < 256; i++) F[i] <<= shift
345
+ }
346
+ //----------------------------------------------------------------------
347
+ // Order-1 decoder
348
+
349
+ // Decode a table of order-1 frequences,
350
+ // filling out the F and C arrays.
351
+ function ReadFrequencies1(src, F, C, shift) {
352
+ // Initialise; not in the specification - implicit?
353
+ for (var i = 0; i < 256; i++) {
354
+ F[i] = new Array(256)
355
+ C[i] = new Array(256)
356
+ for (var j = 0; j < 256; j++) F[i][j] = 0
357
+ }
358
+
359
+ // Fetch alphabet
360
+ var A = ReadAlphabet(src)
361
+
362
+ // Read F[]
363
+ for (var i = 0; i < 256; i++) {
364
+ if (!A[i]) continue
365
+
366
+ var run = 0
367
+ for (var j = 0; j < 256; j++) {
368
+ if (!A[j]) continue
369
+
370
+ if (run > 0) {
371
+ run--
372
+ } else {
373
+ F[i][j] = src.ReadUint7()
374
+ if (F[i][j] == 0) run = src.ReadByte()
375
+ }
376
+ }
377
+
378
+ NormaliseFrequencies0_Shift(F[i], shift)
379
+
380
+ // Compute C[] from F[]
381
+ C[i][0] = 0
382
+ for (var j = 0; j < 256; j++) C[i][j + 1] = C[i][j] + F[i][j]
383
+ }
384
+ }
385
+
386
+ function RansDecode1(src, nbytes, N) {
387
+ // FIXME: this bit is missing from the RansDecode0 pseudocode.
388
+
389
+ var comp = src.ReadByte()
390
+ var shift = comp >> 4
391
+
392
+ var freq_src = src
393
+ if (comp & 1) {
394
+ var ulen = src.ReadUint7()
395
+ var clen = src.ReadUint7()
396
+ var comp = new IOStream(src.ReadData(clen))
397
+ var freq_src = new IOStream(RansDecode0(comp, ulen, 4))
398
+ }
399
+
400
+ // Decode frequencies
401
+ var F = new Array(256)
402
+ var C = new Array(256)
403
+ ReadFrequencies1(freq_src, F, C, shift)
404
+
405
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
406
+ var C2S = new Array(256)
407
+ for (var i = 0; i < 256; i++)
408
+ // Could do only for symbols in alphabet?
409
+ C2S[i] = RansBuildC2S(C[i], shift)
410
+
411
+ // Initialise rANS state
412
+ var R = new Array(N)
413
+ var L = new Array(N)
414
+ for (var j = 0; j < N; j++) {
415
+ R[j] = src.ReadUint32()
416
+ L[j] = 0
417
+ }
418
+
419
+ // Main decode loop
420
+ var output = new Uint8Array(nbytes)
421
+ var nbytesx = Math.floor(nbytes / N)
422
+ for (var i = 0; i < nbytesx; i++) {
423
+ for (var j = 0; j < N; j++) {
424
+ var f = RansGetCumulativeFreq(R[j], shift)
425
+
426
+ //var s = RansGetSymbolFromFreq(C[L[j]], f);
427
+ var s = C2S[L[j]][f] // Precomputed version of above
428
+
429
+ output[i + j * nbytesx] = s
430
+ R[j] = RansAdvanceStep(R[j], C[L[j]][s], F[L[j]][s], shift)
431
+ R[j] = RansRenorm(src, R[j])
432
+ L[j] = s
433
+ }
434
+ }
435
+
436
+ // Now deal with the remainder if buffer size is not a multiple of N,
437
+ // using the last rANS state exclusively. (It'd have been nice to have
438
+ // designed this to just act as if we kept going with a bail out.)
439
+ i = N * i
440
+ while (i < nbytes) {
441
+ var f = RansGetCumulativeFreq(R[N - 1], shift)
442
+ var s = RansGetSymbolFromFreq(C[L[N - 1]], f)
443
+ output[i++] = s
444
+ R[N - 1] = RansAdvanceStep(R[N - 1], C[L[N - 1]][s], F[L[N - 1]][s], shift)
445
+ R[N - 1] = RansRenorm(src, R[N - 1])
446
+ L[N - 1] = s
447
+ }
448
+
449
+ return output
450
+ }
451
+
452
+ module.exports = { decode }