gpu-sankhya 0.2.0 → 0.3.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.
- package/README.md +81 -37
- package/dist/charset.d.ts +1 -1
- package/dist/index.d.ts +16 -2
- package/dist/index.js +8 -5
- package/dist/types.d.ts +119 -1
- package/dist/weights.d.ts +15 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# gpu-sankhya
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/gpu-sankhya)
|
|
4
|
-
[](https://www.npmjs.com/package/gpu-sankhya?activeTab=code)
|
|
5
5
|
[](./LICENSE)
|
|
6
6
|
[](https://athrvk.github.io/gpu-sankhya/)
|
|
7
7
|
|
|
@@ -21,9 +21,10 @@ never predicts the value directly, so the arithmetic can't drift from the
|
|
|
21
21
|
grammar (prefix semantics, additive descending units, multiplicative
|
|
22
22
|
ascending units like `das hazaar crore` = 10,000 × 1 crore = 1e11, etc).
|
|
23
23
|
|
|
24
|
-
Ships with a small (
|
|
25
|
-
in the package — `import { parse }
|
|
26
|
-
network fetch. Zero runtime
|
|
24
|
+
Ships with a small (47.2 KB gzipped, 80.8 KB raw `dist/index.js`)
|
|
25
|
+
int8-quantized default model inlined in the package — `import { parse }
|
|
26
|
+
from "gpu-sankhya"` works with no network fetch. Zero runtime
|
|
27
|
+
dependencies.
|
|
27
28
|
|
|
28
29
|
Model training lives in `python/` (a separate, actively-trained
|
|
29
30
|
component); this package is the runtime that loads its exported weights.
|
|
@@ -129,6 +130,19 @@ interface Sankhya {
|
|
|
129
130
|
actually obtained. Result is cached, so repeated calls only probe once.
|
|
130
131
|
`parseBatch`'s `"auto"` backend uses this (not `isWebGPUAvailable()`)
|
|
131
132
|
to decide whether to try the GPU path.
|
|
133
|
+
- **`inspect(text) => Inspection`** — synchronous CPU inspection of the
|
|
134
|
+
raw model output before decode/repair: `{ text, chars: [{ch, bio,
|
|
135
|
+
bioProb, cls, clsId}], spans, ms }`, one entry per character with its
|
|
136
|
+
argmax BIO tag, BIO softmax probability, and predicted class. Useful
|
|
137
|
+
for debugging misclassifications or building a "what did the model
|
|
138
|
+
actually see" view (this is what powers the demo's per-character
|
|
139
|
+
panel); `parse()`'s decoded spans are the thing to use for normal
|
|
140
|
+
consumption.
|
|
141
|
+
- **`modelInfo() => ModelInfo`** — info about the currently loaded
|
|
142
|
+
default model: `{ version, params, channels, embedDim, vocab, classes,
|
|
143
|
+
layers: [{k, dilation, residual}] }`.
|
|
144
|
+
- **`CLASSES`** — the exported array of semantic token class names (the
|
|
145
|
+
same strings that appear in `Sankhya.classes` and `Inspection.chars[].cls`).
|
|
132
146
|
- **`normalizeText(text) => string`** — the exact normalization
|
|
133
147
|
`parse`/`parseBatch` apply before char-encoding (Unicode NFC, then
|
|
134
148
|
Devanagari digits U+0966-U+096F mapped 1:1 to ASCII `"0"`-`"9"`, then
|
|
@@ -156,44 +170,69 @@ interface Sankhya {
|
|
|
156
170
|
|
|
157
171
|
### Why CPU by default
|
|
158
172
|
|
|
159
|
-
One inference is small —
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
+
One inference is small — a 5-layer, 48-channel dilated/residual char
|
|
174
|
+
CNN, 39,579 parameters — and `parse()` runs in about 3.6 ms p50 (60-char
|
|
175
|
+
input) in plain JS; `parseBatch` on CPU averages about 4.0 ms/string over
|
|
176
|
+
500 strings. A WebGPU dispatch has fixed overhead of a few milliseconds
|
|
177
|
+
(device/pipeline setup, buffer upload, queue submit, readback), which
|
|
178
|
+
dwarfs that per-string cost. So the GPU only pays off once you're
|
|
179
|
+
amortizing that overhead over a batch — hundreds of strings at once —
|
|
180
|
+
which is exactly what `parseBatch` does with `backend: "auto"`/`"webgpu"`;
|
|
181
|
+
`parse()` stays CPU-only and synchronous on purpose.
|
|
182
|
+
|
|
183
|
+
The WebGPU path's plain (non-residual) conv layers have been verified on
|
|
184
|
+
a real GPU in desktop Chrome, matching the CPU backend span-for-span on
|
|
185
|
+
the demo page's batch benchmark. The current shipped model (arch `v2`)
|
|
186
|
+
adds a residual connection (`y = relu(conv(x)) + x`) on four of its five
|
|
187
|
+
layers; the WGSL shader's residual path is covered by unit tests that
|
|
188
|
+
check its structure but has not yet been re-verified against a real GPU
|
|
189
|
+
adapter in a browser — run the demo's batch benchmark yourself and check
|
|
190
|
+
for a 0 mismatch count before relying on it. The demo's benchmark re-runs
|
|
191
|
+
the CPU/WebGPU comparison on every click, so any regression shows up as a
|
|
192
|
+
mismatch count rather than a silent wrong answer.
|
|
173
193
|
|
|
174
194
|
## Accuracy
|
|
175
195
|
|
|
176
|
-
The bundled default model:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
196
|
+
The bundled default model (arch `v2`): 39,579 parameters, 5 conv layers
|
|
197
|
+
over 16-dim char embeddings — a plain kernel-5 layer, then four residual
|
|
198
|
+
kernel-3 layers with dilations 1/2/4/8 (`y = relu(conv(x)) + x`), 48
|
|
199
|
+
channels, ±17-character receptive field — over a 114-character vocab
|
|
200
|
+
(union of the `hi_latn` and `hi_deva` packs), 120 output classes. Trained
|
|
201
|
+
20 epochs on 200,000 synthetic examples generated from both language
|
|
202
|
+
packs' grammars, mixed 0.55/0.45 with a 10% cross-pack share, plus
|
|
203
|
+
out-of-vocab "unk noise" augmentation so the model has actually seen
|
|
204
|
+
`<unk>` characters (emoji, CJK, Cyrillic, other symbols) during training
|
|
205
|
+
(see `python/README.md`). An older `v1` preset (the previously shipped
|
|
206
|
+
4-layer, non-residual, 32-channel stack) is still loadable by both the
|
|
207
|
+
Python and JS runtimes for anyone using older exported weights.
|
|
182
208
|
|
|
183
209
|
On synthetic validation data (drawn from the same generator/templates as
|
|
184
|
-
training): 0.
|
|
210
|
+
training): 0.932 value accuracy. This number is optimistic — it's testing
|
|
185
211
|
the model on its own distribution.
|
|
186
212
|
|
|
187
213
|
On two hand-written gold sets, written independently of the generator —
|
|
188
|
-
`python/tests/gold.jsonl` (romanised Hindi,
|
|
189
|
-
`python/tests/gold_deva.jsonl` (Devanagari Hindi,
|
|
214
|
+
`python/tests/gold.jsonl` (romanised Hindi, 184 sentences / 168 spans)
|
|
215
|
+
and `python/tests/gold_deva.jsonl` (Devanagari Hindi, 169 sentences / 141
|
|
190
216
|
spans) — evaluated against the shipped int8-quantized weights:
|
|
191
217
|
|
|
192
218
|
| gold set | examples | spans | value accuracy | span precision | span recall | span F1 |
|
|
193
219
|
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
|
194
|
-
| gold.jsonl (romanised) |
|
|
195
|
-
| gold_deva.jsonl (Devanagari) |
|
|
196
|
-
| combined |
|
|
220
|
+
| gold.jsonl (romanised) | 184 | 168 | 0.9515 | 0.8971 | 0.9515 | 0.9235 |
|
|
221
|
+
| gold_deva.jsonl (Devanagari) | 169 | 141 | 0.9861 | 0.9662 | 0.9931 | 0.9795 |
|
|
222
|
+
| combined | 353 | 309 | 0.9676 | 0.9288 | 0.9709 | 0.9494 |
|
|
223
|
+
|
|
224
|
+
Negatives (zero-gold-span examples, 55 total): 4 false positives (7.3%).
|
|
225
|
+
Per-category value accuracy: digits 0.977, words 0.964, prefix 0.948,
|
|
226
|
+
range 0.917, currency 0.979, multi_unit 1.0, symbol_unit 1.0,
|
|
227
|
+
mixed_script 1.0, long 0.75.
|
|
228
|
+
|
|
229
|
+
Compared to the previously shipped `v1` model (0.9441 / 0.9645 / 0.9536
|
|
230
|
+
combined value acc, F1 0.9510, 2/55 negatives false positives): this
|
|
231
|
+
model gains about 1.4 points of value accuracy and is materially more
|
|
232
|
+
robust to input containing characters outside its training vocabulary,
|
|
233
|
+
at the cost of slightly lower span precision — it produces a few more
|
|
234
|
+
spurious spans on unfamiliar words. That's a known, measured trade-off,
|
|
235
|
+
not an oversight.
|
|
197
236
|
|
|
198
237
|
**The gold numbers are the ones to trust.** Known miss categories, in rough
|
|
199
238
|
order of frequency:
|
|
@@ -215,7 +254,7 @@ from `python/` (see `python/README.md`).
|
|
|
215
254
|
Devanagari digits U+0966-U+096F mapped to ASCII `"0"`-`"9"`, then
|
|
216
255
|
lowercased — byte-identical to the Python reference) and char-encoded
|
|
217
256
|
against the model's vocab (unknown chars map to `<unk>`).
|
|
218
|
-
2. A
|
|
257
|
+
2. A dilated/residual conv1d stack (see Accuracy above) produces, per
|
|
219
258
|
character, a 3-way BIO logit (O/B/I) and a class logit over the
|
|
220
259
|
semantic token vocabulary (prefix words, cardinals, units, digits,
|
|
221
260
|
separators, misc).
|
|
@@ -250,9 +289,9 @@ Raw per-character BIO/class predictions are cleaned up before evaluation:
|
|
|
250
289
|
on the resulting token sequence.
|
|
251
290
|
|
|
252
291
|
One more detail that matters more than it looks like it should: the
|
|
253
|
-
runtime right-pads the character-id array with
|
|
292
|
+
runtime right-pads the character-id array with 24 pad tokens before
|
|
254
293
|
running the forward pass (mirroring `python/sankhya/np_infer.py`'s
|
|
255
|
-
`pad_ids`/`PAD_TAIL=
|
|
294
|
+
`pad_ids`/`PAD_TAIL=24`), because training always right-pads every
|
|
256
295
|
example to the model's max length the same way. Running a short, tightly
|
|
257
296
|
cropped input (e.g. the bare 4 characters of `"2.5L"`) without that
|
|
258
297
|
padding measurably corrupts predictions — the model was never trained on
|
|
@@ -296,7 +335,10 @@ outputs are discarded; only the real characters' predictions are used.
|
|
|
296
335
|
(`test/fixtures/parity.jsonl`, `decoded.jsonl` — see
|
|
297
336
|
`python/README.md`'s "Ship to the npm package" section).
|
|
298
337
|
- `bench/` — `parse()`/`parseBatch()` latency benchmarks.
|
|
299
|
-
- `demo/` —
|
|
338
|
+
- `demo/` — an interactive demo: live parse as you type, a per-character
|
|
339
|
+
model-internals view (`inspect()`), batch benchmark controls (CPU vs
|
|
340
|
+
WebGPU), a raw-JSON view of results, a theme toggle, and shareable
|
|
341
|
+
state via URL hash.
|
|
300
342
|
- `python/sankhya/` — `classes.py` (shared class vocabulary), `core.py`
|
|
301
343
|
(the deterministic arithmetic core), `langs/` (language packs, e.g.
|
|
302
344
|
`hi_latn.py`), `noise_latn.py` (typo/spelling-variance injection),
|
|
@@ -337,9 +379,11 @@ npm run bench # parse() and parseBatch() latency
|
|
|
337
379
|
npm run size # gzipped dist/index.js size
|
|
338
380
|
```
|
|
339
381
|
|
|
340
|
-
See `demo/index.html` for
|
|
341
|
-
|
|
342
|
-
|
|
382
|
+
See `demo/index.html` for the full interactive demo (live parse,
|
|
383
|
+
per-character model view, benchmark controls, JSON view, theme toggle,
|
|
384
|
+
shareable hash) — it imports `dist/index.js` directly (no build step
|
|
385
|
+
needed beyond `npm run build`). Live at
|
|
386
|
+
https://athrvk.github.io/gpu-sankhya/.
|
|
343
387
|
|
|
344
388
|
## Releasing
|
|
345
389
|
|
package/dist/charset.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const MAX_LEN = 128;
|
|
2
2
|
export declare const WINDOW_OVERLAP = 16;
|
|
3
|
-
export declare const PAD_TAIL =
|
|
3
|
+
export declare const PAD_TAIL = 24;
|
|
4
4
|
/** Total (padded) inference length for a window/text of `realLen` real
|
|
5
5
|
* characters: realLen + at least PAD_TAIL pad chars, rounded up to a
|
|
6
6
|
* multiple of 8. */
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Sankhya, ParseOptions, WeightsJson } from "./types.js";
|
|
2
|
-
export type { Sankhya, ParseOptions } from "./types.js";
|
|
1
|
+
import type { Sankhya, ParseOptions, WeightsJson, Inspection, ModelInfo } from "./types.js";
|
|
2
|
+
export type { Sankhya, ParseOptions, CharTag, Inspection, ModelInfo } from "./types.js";
|
|
3
3
|
export { isWebGPUAvailable, probeWebGPU } from "./infer-webgpu.js";
|
|
4
4
|
export { normalizeText } from "./charset.js";
|
|
5
|
+
export { CLASSES } from "./classes.js";
|
|
5
6
|
export interface CreateParserOptions {
|
|
6
7
|
weights?: WeightsJson;
|
|
7
8
|
backend?: "cpu" | "webgpu" | "auto";
|
|
@@ -31,6 +32,15 @@ export declare class Parser {
|
|
|
31
32
|
* actual text -- the padded tail's logits are only used to give the real
|
|
32
33
|
* tokens correct right-context during the conv stack, never decoded. */
|
|
33
34
|
private decodeForward;
|
|
35
|
+
/** Synchronous CPU inspection: raw argmax BIO/class tags for every
|
|
36
|
+
* character of the normalized text (before decode repair), plus the same
|
|
37
|
+
* spans `parse()` would return. Uses the same window/padding logic as
|
|
38
|
+
* parse(): for texts longer than MAX_LEN, each character is filled from
|
|
39
|
+
* the first window that covers it. */
|
|
40
|
+
inspect(text: string): Inspection;
|
|
41
|
+
/** Static info about the loaded model: architecture, parameter count and
|
|
42
|
+
* vocab/class sizes. */
|
|
43
|
+
modelInfo(): ModelInfo;
|
|
34
44
|
/** Batched parse. Uses WebGPU when requested/available and the batch is
|
|
35
45
|
* large enough to be worthwhile; falls back to CPU otherwise. */
|
|
36
46
|
parseBatch(texts: string[], opts?: ParseOptions): Promise<Sankhya[][]>;
|
|
@@ -42,4 +52,8 @@ export declare function parse(text: string, opts?: ParseOptions): Sankhya[];
|
|
|
42
52
|
* when `opts.backend === "auto"` and WebGPU is available and the batch is
|
|
43
53
|
* large (>=32); otherwise runs on CPU. Defaults to CPU. */
|
|
44
54
|
export declare function parseBatch(texts: string[], opts?: ParseOptions): Promise<Sankhya[][]>;
|
|
55
|
+
/** Inspect a single string on the default parser -- see Parser.inspect(). */
|
|
56
|
+
export declare function inspect(text: string): Inspection;
|
|
57
|
+
/** Info about the default parser's loaded model -- see Parser.modelInfo(). */
|
|
58
|
+
export declare function modelInfo(): ModelInfo;
|
|
45
59
|
export declare function createParser(opts?: CreateParserOptions): Parser;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function pA(A){return A.quantized!==void 0}function LA(A){let e=atob(A),n=new Int8Array(e.length);for(let r=0;r<e.length;r++)n[r]=e.charCodeAt(r)<<24>>24;return n}function nA(A){let e=LA(A.data_b64),n=new Float32Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]*A.scale;return{shape:A.shape,data:n}}function rA(A){return{shape:A.shape,data:Float32Array.from(A.data)}}function tA(A){let e=A.layers??3,n=A.dilation??2,r=["conv1","conv2","conv3",...e===4?["conv4"]:[]];if(pA(A)){let s={layers:e,dilation:n,charset:A.charset,classes:A.classes,embed:nA(A.embed),conv1:void 0,conv2:void 0,conv3:void 0,bio:void 0,cls:void 0};for(let o of[...r,"bio","cls"]){let a=A[o];s[o]={w:nA(a.w),b:Float32Array.from(a.b)}}return s}let f=A,t={layers:e,dilation:n,charset:f.charset,classes:f.classes,embed:rA(f.embed),conv1:void 0,conv2:void 0,conv3:void 0,bio:void 0,cls:void 0};for(let s of[...r,"bio","cls"]){let o=f[s];t[s]={w:rA(o.w),b:Float32Array.from(o.b.data)}}return t}function HA(A){return Math.ceil(A/8)*8}function F(A){return HA(A+16)}var M=F(128),MA=/[०-९]/g;function x(A){return A.normalize("NFC").replace(MA,e=>String(e.charCodeAt(0)-2406)).toLowerCase()}function sA(A){let e=new Map;for(let n=0;n<A.length;n++)e.set(A[n],n);return e}function T(A,e,n,r){let f=e.get("<unk>")??1,t=e.get("<pad>")??0,s=r??A.length,o=n?n.subarray(0,s):new Int32Array(s);for(let a=0;a<A.length;a++)o[a]=e.get(A[a])??f;for(let a=A.length;a<s;a++)o[a]=t;return o}function oA(A){if(A<=128)return[{offset:0,length:A}];let e=[],n=112,r=0;for(;r<A;){let f=Math.min(128,A-r);if(e.push({offset:r,length:f}),r+f>=A)break;r+=n}return e}var U=class{buffers;padded;bioBuf;clsBuf;constructor(e){let n=[e.conv1,e.conv2,e.conv3,...e.layers===4&&e.conv4?[e.conv4]:[]],r=Math.max(e.embed.shape[1],...n.map(t=>t.w.shape[0]));this.buffers=[new Float32Array(r*M),new Float32Array(r*M)];let f=8;this.padded=new Float32Array(r*(M+2*f)),this.bioBuf=new Float32Array(e.bio.w.shape[0]*M),this.clsBuf=new Float32Array(e.cls.w.shape[0]*M)}buf(e){return this.buffers[e%2]}paddedBuf(){return this.padded}};function O(A,e,n,r,f,t,s,o){let[a,u,c]=r.w.shape;if(u!==e)throw new Error(`channel mismatch: expected ${e}, got ${u}`);let v=r.w.data,B=r.b,g=n+2*f;for(let D=0;D<e;D++)o.fill(0,D*g,D*g+f),o.set(A.subarray(D*n,D*n+n),D*g+f),o.fill(0,D*g+f+n,D*g+g);for(let D=0;D<a;D++){let i=D*n,l=B[D],I=D*e*c;if(c===3){for(let P=0;P<n;P++)s[i+P]=l;for(let P=0;P<e;P++){let h=P*g,d=I+P*3,p=v[d],b=v[d+1],C=v[d+2];for(let w=0;w<n;w++){let Q=h+w;s[i+w]+=p*o[Q]+b*o[Q+t]+C*o[Q+2*t]}}}else if(c===5){for(let P=0;P<n;P++)s[i+P]=l;for(let P=0;P<e;P++){let h=P*g,d=I+P*5,p=v[d],b=v[d+1],C=v[d+2],w=v[d+3],Q=v[d+4];for(let H=0;H<n;H++){let L=h+H;s[i+H]+=p*o[L]+b*o[L+1]+C*o[L+2]+w*o[L+3]+Q*o[L+4]}}}else{for(let P=0;P<n;P++)s[i+P]=l;for(let P=0;P<e;P++){let h=P*g,d=I+P*c;for(let p=0;p<c;p++){let b=v[d+p],C=p*t,w=h+C;for(let Q=0;Q<n;Q++)s[i+Q]+=b*o[w+Q]}}}for(let P=0;P<n;P++){let h=s[i+P];s[i+P]=h>0?h:0}}return a}function fA(A,e,n,r,f){let[t,s]=r.w.shape;if(s!==e)throw new Error(`head channel mismatch: expected ${e}, got ${s}`);let o=r.w.data,a=r.b,u=e-e%4;for(let c=0;c<n;c++){let v=c*t;for(let B=0;B<t;B++){let g=a[B],D=B*e,i=0;for(;i<u;i+=4)g+=o[D+i]*A[i*n+c]+o[D+i+1]*A[(i+1)*n+c]+o[D+i+2]*A[(i+2)*n+c]+o[D+i+3]*A[(i+3)*n+c];for(;i<e;i++)g+=o[D+i]*A[i*n+c];f[v+B]=g}}return t}function S(A,e,n){let r=e.length,f=A.embed,t=f.shape[1],s=n.buf(0);for(let g=0;g<r;g++){let i=e[g]*t;for(let l=0;l<t;l++)s[l*r+g]=f.data[i+l]}let o=t,a=n.paddedBuf(),u=n.buf(1);o=O(s,o,r,A.conv1,1,1,u,a),s=u,u=n.buf(2),o=O(s,o,r,A.conv2,2,1,u,a),s=u;let c=A.dilation,v=Math.floor(c*2/2);if(u=n.buf(3),o=O(s,o,r,A.conv3,v,c,u,a),s=u,A.layers===4&&A.conv4){let D=Math.floor(4);u=n.buf(4),o=O(s,o,r,A.conv4,D,4,u,a),s=u}fA(s,o,r,A.bio,n.bioBuf);let B=fA(s,o,r,A.cls,n.clsBuf);return{bioLogits:n.bioBuf,clsLogits:n.clsBuf,length:r,nCls:B}}function aA(A,e,n,r){let f=-1/0;for(let s=0;s<n;s++)f=Math.max(f,A[e+s]);let t=0;for(let s=0;s<n;s++){let o=Math.exp(A[e+s]-f);r[s]=o,t+=o}for(let s=0;s<n;s++)r[s]/=t;return r}function J(A,e,n){let r=0,f=-1/0;for(let t=0;t<n;t++){let s=A[e+t];s>f&&(f=s,r=t)}return r}var RA=["PFX_PAAV","PFX_AADHA","PFX_PAUNE","PFX_SAVA","PFX_DEDH","PFX_DHAI","PFX_SAADHE"],yA=Array.from({length:99},(A,e)=>`CARD_${e+1}`),FA=["UNIT_SAU","UNIT_HAZAAR","UNIT_LAKH","UNIT_MILLION","UNIT_CRORE","UNIT_BILLION","UNIT_ARAB","UNIT_KHARAB"],mA=["O","SEP","RANGE","DIGITS","DOT","COMMA"],R=["O",...mA.filter(A=>A!=="O"),...RA,...yA,...FA],y=Object.fromEntries(R.map((A,e)=>[A,e])),uA={UNIT_SAU:100,UNIT_HAZAAR:1e3,UNIT_LAKH:1e5,UNIT_MILLION:1e6,UNIT_CRORE:1e7,UNIT_BILLION:1e9,UNIT_ARAB:1e9,UNIT_KHARAB:1e11},K={UNIT_SAU:"sau",UNIT_HAZAAR:"hazaar",UNIT_LAKH:"lakh",UNIT_MILLION:"million",UNIT_CRORE:"crore",UNIT_BILLION:"billion",UNIT_ARAB:"arab",UNIT_KHARAB:"kharab"},W={PFX_PAAV:{standalone:.25,op:null},PFX_AADHA:{standalone:.5,op:null},PFX_PAUNE:{standalone:.75,op:"sub25",min_n:2},PFX_SAVA:{standalone:1.25,op:"add25",min_n:2},PFX_DEDH:{standalone:1.5,op:null},PFX_DHAI:{standalone:2.5,op:null},PFX_SAADHE:{standalone:.5,op:"add5",min_n:3}};function cA(A){return A in W}function gA(A){return A.startsWith("CARD_")}function BA(A){return A in uA}function iA(A){return parseInt(A.split("_",2)[1],10)}function G(A){return uA[A]}var PA=new Set(["SEP","RANGE","DOT","COMMA"]),TA=["PFX_","CARD_","UNIT_"],OA=["PFX_","CARD_","UNIT_"];function UA(A){return TA.some(e=>A.startsWith(e))||A==="DIGITS"}function GA(A){return OA.some(e=>A.startsWith(e))}var kA=y.O,k=y.SEP,V=y.RANGE,zA=y.DIGITS,NA=y.DOT,XA=y.COMMA,_A=/\p{L}|\p{M}/u;function vA(A){return _A.test(A)?"letter":/[0-9]/.test(A)?"digit":/\s/.test(A)?"space":"punct"}function YA(A){let e=[],n=0,r=A.length;for(;n<r;){let f=vA(A[n]),t=n+1;for(;t<r&&vA(A[t])===f;)t++;e.push({type:f,start:n,end:t}),n=t}return e}function jA(A,e,n){let r=new Map;for(let u=e;u<n;u++){let c=A[u];GA(R[c])&&r.set(c,(r.get(c)??0)+1)}if(r.size===0)return kA;let f=-1;for(let u of r.values())u>f&&(f=u);let t=[...r.entries()].filter(([,u])=>u===f).map(([u])=>u);if(t.length===1)return t[0];let s=-1,o=1/0,a=t[0];for(let u of t){let c=0,v=0,B=1/0;for(let g=e;g<n;g++)A[g]===u?(B===1/0&&(B=g),c++,c>v&&(v=c)):c=0;(v>s||v===s&&B<o)&&(s=v,o=B,a=u)}return a}function SA(A,e,n){let r=[],f=e;for(;f<n;){let o=f+1;for(;o<n&&A[o]===A[f];)o++;r.push({start:f,end:o,cls:A[f]}),f=o}let t=jA(A,e,n),s=[];for(let o=0;o<r.length;o++){let a=r[o];if(a.end-a.start>=3){s.push([a.start,a.end,a.cls]);continue}let c=o>0?r[o-1]:null,v=o<r.length-1?r[o+1]:null,B=c!==null&&c.end-c.start>=3,g=v!==null&&v.end-v.start>=3,D;if(B&&g){let i=c.end-c.start;D=v.end-v.start>i?v.cls:c.cls}else B?D=c.cls:g?D=v.cls:D=t;s.push([a.start,a.end,D])}return s}function JA(A,e){let n=A.length,r=new Array(n),f=YA(A);for(let t=0;t<f.length;t++){let s=f[t],{type:o,start:a,end:u}=s;if(o==="digit"){for(let g=a;g<u;g++)r[g]=zA;continue}if(o==="space"){let g=!1;for(let i=a;i<u;i++)if(e[i]===V){g=!0;break}let D=g?V:k;for(let i=a;i<u;i++)r[i]=D;continue}if(o==="letter"){for(let[g,D,i]of SA(e,a,u))for(let l=g;l<D;l++)r[l]=i;continue}let c=t>0?f[t-1].type:null,v=t<f.length-1?f[t+1].type:null,B=k;if(u-a===1){let g=A[a];(g==="."||g===",")&&c==="digit"&&v==="digit"?B=g==="."?NA:XA:(g==="-"||g==="\u2013"||g==="/")&&c==="digit"&&v==="digit"?B=V:B=k}for(let g=a;g<u;g++)r[g]=B}return r}function KA(A,e){let n=Array.from({length:e},(r,f)=>A[f]);for(let r=1;r<e-1;r++)A[r]===0&&(A[r-1]===1||A[r-1]===2)&&A[r+1]===2&&(n[r]=2);return n}function DA(A){return A!==void 0&&A>="0"&&A<="9"}function WA(A,e,n){if(n<=e||!DA(A[n-1]))return n;let r=n;for(;r<A.length&&DA(A[r]);)r++;return r}function CA(A,e,n,r){let f=A.length,t=KA(e,f),s=[],o=null;for(let u=0;u<f;u++){let c=t[u];c===1?(o!==null&&s.push([o,u]),o=u):c===2||o!==null&&(s.push([o,u]),o=null)}o!==null&&s.push([o,f]);for(let u=0;u<s.length;u++)s[u]=[s[u][0],WA(A,s[u][0],s[u][1])];let a=[];for(let[u,c]of s){let v=A.slice(u,c),B=Array.from({length:c-u},(b,C)=>n[u+C]),g=JA(v,B),D=u,i=[];for(let b=u+1;b<=c;b++)(b===c||g[b-u]!==g[D-u])&&(i.push([g[D-u],D,b]),D=b);let l=0,I=i.length;for(;l<I&&PA.has(R[i[l][0]]);)l++;for(;I>l&&PA.has(R[i[I-1][0]]);)I--;let P=i.slice(l,I);if(P.length===0)continue;let h=P[0][1],d=P[P.length-1][2];if(!P.some(([b])=>UA(R[b])))continue;let p=null;if(r){let b=[];for(let C=h;C<d;C++)b.push(Math.max(...r[C]));if(p=b.length?b.reduce((C,w)=>C+w,0)/b.length:0,p<.5)continue}a.push({start:h,end:d,text:A.slice(h,d),tokens:P.map(([b,C,w])=>[b,A.slice(C,w)]),confidence:p})}return a}function VA(A){let e=[],n="",r=!1,f=()=>{if(r){let t=n.replace(/,/g,""),s=parseFloat(t);e.push(["NUM",Number.isNaN(s)?0:s])}n="",r=!1};for(let[t,s]of A)t!=="SEP"&&(t==="DIGITS"||t==="DOT"||t==="COMMA"?(n+=s,r=!0):(f(),e.push([t,s])));return f(),e}function qA(A,e){if(e!==null){let n=W[e];if(n===void 0)return A!==null?A:1;if(A!==null&&n.op){if(n.op==="sub25")return A-.25;if(n.op==="add25")return A+.25;if(n.op==="add5")return A+.5}return n.standalone}return A!==null?A:1}function ZA(A){let e=VA(A),n=0,r=null,f=null,t=null,s=null;function o(a){let u=qA(t,s);if(a===null)n+=u*1;else{let c=G(a);r!==null&&c>r?n=n*c:n=n+u*c,r=c,(f===null||c>G(f))&&(f=a)}t=null,s=null}for(let[a,u]of e)if(a==="NUM")t!==null&&o(null),t=u;else if(gA(a)){t!==null&&o(null);try{t=iA(a)}catch{}}else if(cA(a))s!==null&&o(null),s=a;else if(BA(a))o(a);else continue;return(t!==null||s!==null)&&o(null),[n,f]}function z(A){let e=Math.round(A),n=Math.max(1e-6,Math.abs(A)*1e-9);return Math.abs(A-e)<n?e:Math.round(A*1e6)/1e6}function $A(A){let e=[],n=0;for(;n<A.length;){let[r,f]=A[n];if(r.startsWith("PFX_")){let t=f,s=n+1;for(;;){let o=s;if(o<A.length&&A[o][0]==="SEP"&&o++,o<A.length&&A[o][0]===r){for(let a=s;a<=o;a++)t+=A[a][1];s=o+1;continue}break}e.push([r,t]),n=s}else e.push(A[n]),n++}return e}function wA(A){try{let e=A.map(B=>B[0]),n=$A(A),r=[[]];for(let[B,g]of n){if(B==="RANGE"){r.length<2&&r.push([]);continue}r[r.length-1].push([B,g])}let f=r.filter(B=>B.length>0).map(B=>ZA(B));if(f.length===0)return{value:0,range:null,unit:null,classes:e,currency:null};if(f.length===1){let[B,g]=f[0];return{value:z(B),range:null,unit:g?K[g]??null:null,classes:e,currency:null}}let[t,s]=f[0],[o,a]=f[1],u;s===null&&a!==null?(t=t*G(a),u=a):u=s!==null?s:a;let[c,v]=t<=o?[t,o]:[o,t];return{value:z(c),range:[z(c),z(v)],unit:u?K[u]??null:null,classes:e,currency:null}}catch{return{value:0,range:null,unit:null,classes:A.map(e=>e[0]),currency:null}}}function lA(...A){let e=(r,f)=>f.length-r.length,n=r=>[...new Set(r.flat())].sort(e);return{currency_markers_before:n(A.map(r=>r.currency_markers_before??[])),currency_words_after:n(A.map(r=>r.currency_words_after??[]))}}function QA(A,e,n,r){let f=A.slice(Math.max(0,e-4),e),t=A.slice(n,n+6),o=f.replace(/\s+$/,"").toLowerCase(),a=[...r.currency_markers_before??[]].sort((B,g)=>g.length-B.length);for(let B of a){let g=B.replace(/\.+$/,"").toLowerCase();if(o.endsWith(B.toLowerCase())||o.endsWith(g))return"INR"}let c=t.replace(/^\s+/,"").toLowerCase(),v=[...r.currency_words_after??[]].sort((B,g)=>g.length-B.length);for(let B of v){let g=B.toLowerCase();if(c.startsWith(g))return"INR"}return null}var bA={currency_markers_before:["\u20B9","Rs","Rs.","rs","INR","Re"],currency_words_after:["rupaye","rupay","rupees","rupiya","rupya","/-"]};var EA={currency_markers_before:["\u20B9","\u0930\u0941","\u0930\u0941.","Rs","Rs.","INR"],currency_words_after:["\u0930\u0941\u092A\u092F\u0947","\u0930\u0941\u092A\u090F","\u0930\u0942\u092A\u092F\u0947","\u0930\u0941\u092A\u092F\u093E","/-"]};var Ae=`
|
|
1
|
+
function LA(A){return A.version===2&&Array.isArray(A.conv)}function dA(A){return A.quantized!==void 0}function FA(A){let B=atob(A),n=new Int8Array(B.length);for(let e=0;e<B.length;e++)n[e]=B.charCodeAt(e)<<24>>24;return n}function T(A){let B=FA(A.data_b64),n=new Float32Array(B.length);for(let e=0;e<B.length;e++)n[e]=B[e]*A.scale;return{shape:A.shape,data:n}}function U(A){return{shape:A.shape,data:Float32Array.from(A.data)}}function tA(A,B){return A*(B-1)/2}function Y(A){return{w:U(A.w),b:Float32Array.from(A.b.data)}}function m(A){return{w:T(A.w),b:Float32Array.from(A.b)}}function gA(A){let B=dA(A);if(LA(A)){let g=A.conv.map(f=>{let w=tA(f.dilation,f.k);if(B){let P=f;return{k:f.k,dilation:f.dilation,residual:f.residual,padding:w,w:T(P.w),b:Float32Array.from(P.b)}}let s=f;return{k:f.k,dilation:f.dilation,residual:f.residual,padding:w,w:U(s.w),b:Float32Array.from(s.b.data)}});return{version:2,charset:A.charset,classes:A.classes,embed:B?T(A.embed):U(A.embed),conv:g,bio:B?m(A.bio):Y(A.bio),cls:B?m(A.cls):Y(A.cls)}}let n=A.layers??3,e=A.dilation??2,t=[{name:"conv1",k:3,dilation:1},{name:"conv2",k:5,dilation:1},{name:"conv3",k:3,dilation:e}];n===4&&t.push({name:"conv4",k:3,dilation:4});let r=t.map(g=>{let f=tA(g.dilation,g.k);if(B){let u=A[g.name];if(!u)throw new Error(`missing ${g.name} in weights JSON`);return{k:g.k,dilation:g.dilation,residual:!1,padding:f,w:T(u.w),b:Float32Array.from(u.b)}}let s=A[g.name];if(!s)throw new Error(`missing ${g.name} in weights JSON`);return{k:g.k,dilation:g.dilation,residual:!1,padding:f,w:U(s.w),b:Float32Array.from(s.b.data)}});return{version:A.version??1,charset:A.charset,classes:A.classes,embed:B?T(A.embed):U(A.embed),conv:r,bio:B?m(A.bio):Y(A.bio),cls:B?m(A.cls):Y(A.cls)}}function MA(A){return Math.ceil(A/8)*8}function x(A){return MA(A+24)}var R=x(128),RA=/[०-९]/g;function k(A){return A.normalize("NFC").replace(RA,B=>String(B.charCodeAt(0)-2406)).toLowerCase()}function sA(A){let B=new Map;for(let n=0;n<A.length;n++)B.set(A[n],n);return B}function p(A,B,n,e){let t=B.get("<unk>")??1,r=B.get("<pad>")??0,g=e??A.length,f=n?n.subarray(0,g):new Int32Array(g);for(let w=0;w<A.length;w++)f[w]=B.get(A[w])??t;for(let w=A.length;w<g;w++)f[w]=r;return f}function Z(A){if(A<=128)return[{offset:0,length:A}];let B=[],n=112,e=0;for(;e<A;){let t=Math.min(128,A-e);if(B.push({offset:e,length:t}),e+t>=A)break;e+=n}return B}var X=class{buffers;padded;bioBuf;clsBuf;constructor(B){let n=B.conv,e=Math.max(B.embed.shape[1],...n.map(r=>r.w.shape[0]));this.buffers=[new Float32Array(e*R),new Float32Array(e*R)];let t=n.length?Math.max(...n.map(r=>r.padding)):0;this.padded=new Float32Array(e*(R+2*t)),this.bioBuf=new Float32Array(B.bio.w.shape[0]*R),this.clsBuf=new Float32Array(B.cls.w.shape[0]*R)}buf(B){return this.buffers[B%2]}paddedBuf(){return this.padded}};function OA(A,B,n,e,t,r){let[g,f,w]=e.w.shape;if(f!==B)throw new Error(`channel mismatch: expected ${B}, got ${f}`);let s=e.w.data,P=e.b,u=e.padding,o=e.dilation,C=n+2*u;for(let D=0;D<B;D++)r.fill(0,D*C,D*C+u),r.set(A.subarray(D*n,D*n+n),D*C+u),r.fill(0,D*C+u+n,D*C+C);for(let D=0;D<g;D++){let Q=D*n,i=P[D],I=D*B*w;if(w===3){for(let v=0;v<n;v++)t[Q+v]=i;for(let v=0;v<B;v++){let h=v*C,b=I+v*3,L=s[b],H=s[b+1],E=s[b+2];for(let c=0;c<n;c++){let a=h+c;t[Q+c]+=L*r[a]+H*r[a+o]+E*r[a+2*o]}}}else if(w===5){for(let v=0;v<n;v++)t[Q+v]=i;for(let v=0;v<B;v++){let h=v*C,b=I+v*5,L=s[b],H=s[b+1],E=s[b+2],c=s[b+3],a=s[b+4];for(let d=0;d<n;d++){let F=h+d;t[Q+d]+=L*r[F]+H*r[F+1]+E*r[F+2]+c*r[F+3]+a*r[F+4]}}}else{for(let v=0;v<n;v++)t[Q+v]=i;for(let v=0;v<B;v++){let h=v*C,b=I+v*w;for(let L=0;L<w;L++){let H=s[b+L],E=L*o,c=h+E;for(let a=0;a<n;a++)t[Q+a]+=H*r[c+a]}}}if(e.residual)for(let v=0;v<n;v++){let h=t[Q+v];t[Q+v]=(h>0?h:0)+A[Q+v]}else for(let v=0;v<n;v++){let h=t[Q+v];t[Q+v]=h>0?h:0}}return g}function wA(A,B,n,e,t){let[r,g]=e.w.shape;if(g!==B)throw new Error(`head channel mismatch: expected ${B}, got ${g}`);let f=e.w.data,w=e.b,s=B-B%4;for(let P=0;P<n;P++){let u=P*r;for(let o=0;o<r;o++){let C=w[o],D=o*B,Q=0;for(;Q<s;Q+=4)C+=f[D+Q]*A[Q*n+P]+f[D+Q+1]*A[(Q+1)*n+P]+f[D+Q+2]*A[(Q+2)*n+P]+f[D+Q+3]*A[(Q+3)*n+P];for(;Q<B;Q++)C+=f[D+Q]*A[Q*n+P];t[u+o]=C}}return r}function j(A,B,n){let e=B.length,t=A.embed,r=t.shape[1],g=n.buf(0);for(let u=0;u<e;u++){let C=B[u]*r;for(let D=0;D<r;D++)g[D*e+u]=t.data[C+D]}let f=r,w=n.paddedBuf(),s=1;for(let u of A.conv){let o=n.buf(s);f=OA(g,f,e,u,o,w),g=o,s++}wA(g,f,e,A.bio,n.bioBuf);let P=wA(g,f,e,A.cls,n.clsBuf);return{bioLogits:n.bioBuf,clsLogits:n.clsBuf,length:e,nCls:P}}function $(A,B,n,e){let t=-1/0;for(let g=0;g<n;g++)t=Math.max(t,A[B+g]);let r=0;for(let g=0;g<n;g++){let f=Math.exp(A[B+g]-t);e[g]=f,r+=f}for(let g=0;g<n;g++)e[g]/=r;return e}function G(A,B,n){let e=0,t=-1/0;for(let r=0;r<n;r++){let g=A[B+r];g>t&&(t=g,e=r)}return e}var xA=["PFX_PAAV","PFX_AADHA","PFX_PAUNE","PFX_SAVA","PFX_DEDH","PFX_DHAI","PFX_SAADHE"],zA=Array.from({length:99},(A,B)=>`CARD_${B+1}`),TA=["UNIT_SAU","UNIT_HAZAAR","UNIT_LAKH","UNIT_MILLION","UNIT_CRORE","UNIT_BILLION","UNIT_ARAB","UNIT_KHARAB"],UA=["O","SEP","RANGE","DIGITS","DOT","COMMA"],M=["O",...UA.filter(A=>A!=="O"),...xA,...zA,...TA],O=Object.fromEntries(M.map((A,B)=>[A,B])),PA={UNIT_SAU:100,UNIT_HAZAAR:1e3,UNIT_LAKH:1e5,UNIT_MILLION:1e6,UNIT_CRORE:1e7,UNIT_BILLION:1e9,UNIT_ARAB:1e9,UNIT_KHARAB:1e11},AA={UNIT_SAU:"sau",UNIT_HAZAAR:"hazaar",UNIT_LAKH:"lakh",UNIT_MILLION:"million",UNIT_CRORE:"crore",UNIT_BILLION:"billion",UNIT_ARAB:"arab",UNIT_KHARAB:"kharab"},BA={PFX_PAAV:{standalone:.25,op:null},PFX_AADHA:{standalone:.5,op:null},PFX_PAUNE:{standalone:.75,op:"sub25",min_n:2},PFX_SAVA:{standalone:1.25,op:"add25",min_n:2},PFX_DEDH:{standalone:1.5,op:null},PFX_DHAI:{standalone:2.5,op:null},PFX_SAADHE:{standalone:.5,op:"add5",min_n:3}};function CA(A){return A in BA}function oA(A){return A.startsWith("CARD_")}function vA(A){return A in PA}function DA(A){return parseInt(A.split("_",2)[1],10)}function N(A){return PA[A]}var QA=new Set(["SEP","RANGE","DOT","COMMA"]),pA=["PFX_","CARD_","UNIT_"],GA=["PFX_","CARD_","UNIT_"];function yA(A){return pA.some(B=>A.startsWith(B))||A==="DIGITS"}function YA(A){return GA.some(B=>A.startsWith(B))}var mA=O.O,J=O.SEP,eA=O.RANGE,XA=O.DIGITS,jA=O.DOT,NA=O.COMMA,JA=/\p{L}|\p{M}/u;function uA(A){return JA.test(A)?"letter":/[0-9]/.test(A)?"digit":/\s/.test(A)?"space":"punct"}function SA(A){let B=[],n=0,e=A.length;for(;n<e;){let t=uA(A[n]),r=n+1;for(;r<e&&uA(A[r])===t;)r++;B.push({type:t,start:n,end:r}),n=r}return B}function KA(A,B,n){let e=new Map;for(let s=B;s<n;s++){let P=A[s];YA(M[P])&&e.set(P,(e.get(P)??0)+1)}if(e.size===0)return mA;let t=-1;for(let s of e.values())s>t&&(t=s);let r=[...e.entries()].filter(([,s])=>s===t).map(([s])=>s);if(r.length===1)return r[0];let g=-1,f=1/0,w=r[0];for(let s of r){let P=0,u=0,o=1/0;for(let C=B;C<n;C++)A[C]===s?(o===1/0&&(o=C),P++,P>u&&(u=P)):P=0;(u>g||u===g&&o<f)&&(g=u,f=o,w=s)}return w}function _A(A,B,n){let e=[],t=B;for(;t<n;){let f=t+1;for(;f<n&&A[f]===A[t];)f++;e.push({start:t,end:f,cls:A[t]}),t=f}let r=KA(A,B,n),g=[];for(let f=0;f<e.length;f++){let w=e[f];if(w.end-w.start>=3){g.push([w.start,w.end,w.cls]);continue}let P=f>0?e[f-1]:null,u=f<e.length-1?e[f+1]:null,o=P!==null&&P.end-P.start>=3,C=u!==null&&u.end-u.start>=3,D;if(o&&C){let Q=P.end-P.start;D=u.end-u.start>Q?u.cls:P.cls}else o?D=P.cls:C?D=u.cls:D=r;g.push([w.start,w.end,D])}return g}function WA(A,B){let n=A.length,e=new Array(n),t=SA(A);for(let r=0;r<t.length;r++){let g=t[r],{type:f,start:w,end:s}=g;if(f==="digit"){for(let C=w;C<s;C++)e[C]=XA;continue}if(f==="space"){let C=!1;for(let Q=w;Q<s;Q++)if(B[Q]===eA){C=!0;break}let D=C?eA:J;for(let Q=w;Q<s;Q++)e[Q]=D;continue}if(f==="letter"){for(let[C,D,Q]of _A(B,w,s))for(let i=C;i<D;i++)e[i]=Q;continue}let P=r>0?t[r-1].type:null,u=r<t.length-1?t[r+1].type:null,o=J;if(s-w===1){let C=A[w];(C==="."||C===",")&&P==="digit"&&u==="digit"?o=C==="."?jA:NA:(C==="-"||C==="\u2013"||C==="/")&&P==="digit"&&u==="digit"?o=eA:o=J}for(let C=w;C<s;C++)e[C]=o}return e}function VA(A,B){let n=Array.from({length:B},(e,t)=>A[t]);for(let e=1;e<B-1;e++)A[e]===0&&(A[e-1]===1||A[e-1]===2)&&A[e+1]===2&&(n[e]=2);return n}function EA(A){return A!==void 0&&A>="0"&&A<="9"}function qA(A,B,n){if(n<=B||!EA(A[n-1]))return n;let e=n;for(;e<A.length&&EA(A[e]);)e++;return e}function cA(A,B,n,e){let t=A.length,r=VA(B,t),g=[],f=null;for(let s=0;s<t;s++){let P=r[s];P===1?(f!==null&&g.push([f,s]),f=s):P===2||f!==null&&(g.push([f,s]),f=null)}f!==null&&g.push([f,t]);for(let s=0;s<g.length;s++)g[s]=[g[s][0],qA(A,g[s][0],g[s][1])];let w=[];for(let[s,P]of g){let u=A.slice(s,P),o=Array.from({length:P-s},(H,E)=>n[s+E]),C=WA(u,o),D=s,Q=[];for(let H=s+1;H<=P;H++)(H===P||C[H-s]!==C[D-s])&&(Q.push([C[D-s],D,H]),D=H);let i=0,I=Q.length;for(;i<I&&QA.has(M[Q[i][0]]);)i++;for(;I>i&&QA.has(M[Q[I-1][0]]);)I--;let v=Q.slice(i,I);if(v.length===0)continue;let h=v[0][1],b=v[v.length-1][2];if(!v.some(([H])=>yA(M[H])))continue;let L=null;if(e){let H=[];for(let E=h;E<b;E++)H.push(Math.max(...e[E]));if(L=H.length?H.reduce((E,c)=>E+c,0)/H.length:0,L<.5)continue}w.push({start:h,end:b,text:A.slice(h,b),tokens:v.map(([H,E,c])=>[H,A.slice(E,c)]),confidence:L})}return w}function ZA(A){let B=[],n="",e=!1,t=()=>{if(e){let r=n.replace(/,/g,""),g=parseFloat(r);B.push(["NUM",Number.isNaN(g)?0:g])}n="",e=!1};for(let[r,g]of A)r!=="SEP"&&(r==="DIGITS"||r==="DOT"||r==="COMMA"?(n+=g,e=!0):(t(),B.push([r,g])));return t(),B}function $A(A,B){if(B!==null){let n=BA[B];if(n===void 0)return A!==null?A:1;if(A!==null&&n.op){if(n.op==="sub25")return A-.25;if(n.op==="add25")return A+.25;if(n.op==="add5")return A+.5}return n.standalone}return A!==null?A:1}function AB(A){let B=ZA(A),n=0,e=null,t=null,r=null,g=null;function f(w){let s=$A(r,g);if(w===null)n+=s*1;else{let P=N(w);e!==null&&P>e?n=n*P:n=n+s*P,e=P,(t===null||P>N(t))&&(t=w)}r=null,g=null}for(let[w,s]of B)if(w==="NUM")r!==null&&f(null),r=s;else if(oA(w)){r!==null&&f(null);try{r=DA(w)}catch{}}else if(CA(w))g!==null&&f(null),g=w;else if(vA(w))f(w);else continue;return(r!==null||g!==null)&&f(null),[n,t]}function S(A){let B=Math.round(A),n=Math.max(1e-6,Math.abs(A)*1e-9);return Math.abs(A-B)<n?B:Math.round(A*1e6)/1e6}function BB(A){let B=[],n=0;for(;n<A.length;){let[e,t]=A[n];if(e.startsWith("PFX_")){let r=t,g=n+1;for(;;){let f=g;if(f<A.length&&A[f][0]==="SEP"&&f++,f<A.length&&A[f][0]===e){for(let w=g;w<=f;w++)r+=A[w][1];g=f+1;continue}break}B.push([e,r]),n=g}else B.push(A[n]),n++}return B}function aA(A){try{let B=A.map(o=>o[0]),n=BB(A),e=[[]];for(let[o,C]of n){if(o==="RANGE"){e.length<2&&e.push([]);continue}e[e.length-1].push([o,C])}let t=e.filter(o=>o.length>0).map(o=>AB(o));if(t.length===0)return{value:0,range:null,unit:null,classes:B,currency:null};if(t.length===1){let[o,C]=t[0];return{value:S(o),range:null,unit:C?AA[C]??null:null,classes:B,currency:null}}let[r,g]=t[0],[f,w]=t[1],s;g===null&&w!==null?(r=r*N(w),s=w):s=g!==null?g:w;let[P,u]=r<=f?[r,f]:[f,r];return{value:S(P),range:[S(P),S(u)],unit:s?AA[s]??null:null,classes:B,currency:null}}catch{return{value:0,range:null,unit:null,classes:A.map(B=>B[0]),currency:null}}}function iA(...A){let B=(e,t)=>t.length-e.length,n=e=>[...new Set(e.flat())].sort(B);return{currency_markers_before:n(A.map(e=>e.currency_markers_before??[])),currency_words_after:n(A.map(e=>e.currency_words_after??[]))}}function IA(A,B,n,e){let t=A.slice(Math.max(0,B-4),B),r=A.slice(n,n+6),f=t.replace(/\s+$/,"").toLowerCase(),w=[...e.currency_markers_before??[]].sort((o,C)=>C.length-o.length);for(let o of w){let C=o.replace(/\.+$/,"").toLowerCase();if(f.endsWith(o.toLowerCase())||f.endsWith(C))return"INR"}let P=r.replace(/^\s+/,"").toLowerCase(),u=[...e.currency_words_after??[]].sort((o,C)=>C.length-o.length);for(let o of u){let C=o.toLowerCase();if(P.startsWith(C))return"INR"}return null}var HA={currency_markers_before:["\u20B9","Rs","Rs.","rs","INR","Re"],currency_words_after:["rupaye","rupay","rupees","rupiya","rupya","/-"]};var bA={currency_markers_before:["\u20B9","\u0930\u0941","\u0930\u0941.","Rs","Rs.","INR"],currency_words_after:["\u0930\u0941\u092A\u092F\u0947","\u0930\u0941\u092A\u090F","\u0930\u0942\u092A\u092F\u0947","\u0930\u0941\u092A\u092F\u093E","/-"]};var eB=`
|
|
2
2
|
struct Params { batch: u32, length: u32, embedDim: u32, vocab: u32, stride: u32 };
|
|
3
3
|
@group(0) @binding(0) var<uniform> p: Params;
|
|
4
4
|
@group(0) @binding(1) var<storage, read> charIds: array<i32>;
|
|
@@ -17,8 +17,8 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
17
17
|
xOut[(b * p.embedDim + c) * p.length + t] = embed[cid * p.embedDim + c];
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
`,
|
|
21
|
-
struct Params { batch: u32, length: u32, cIn: u32, cOut: u32, k: u32, padding: u32, dilation: u32, relu: u32, stride: u32 };
|
|
20
|
+
`,nB=`
|
|
21
|
+
struct Params { batch: u32, length: u32, cIn: u32, cOut: u32, k: u32, padding: u32, dilation: u32, relu: u32, residual: u32, stride: u32 };
|
|
22
22
|
@group(0) @binding(0) var<uniform> p: Params;
|
|
23
23
|
@group(0) @binding(1) var<storage, read> x: array<f32>; // (batch, cIn, L)
|
|
24
24
|
@group(0) @binding(2) var<storage, read> w: array<f32>; // (cOut, cIn, k)
|
|
@@ -47,9 +47,12 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
if (p.relu != 0u && acc < 0.0) { acc = 0.0; }
|
|
50
|
+
if (p.residual != 0u) {
|
|
51
|
+
acc = acc + x[(b * p.cIn + oc) * p.length + t];
|
|
52
|
+
}
|
|
50
53
|
out[(b * p.cOut + oc) * p.length + t] = acc;
|
|
51
54
|
}
|
|
52
|
-
`,
|
|
55
|
+
`,rB=`
|
|
53
56
|
struct Params { batch: u32, length: u32, cIn: u32, nOut: u32, stride: u32 };
|
|
54
57
|
@group(0) @binding(0) var<uniform> p: Params;
|
|
55
58
|
@group(0) @binding(1) var<storage, read> x: array<f32>; // (batch, cIn, L)
|
|
@@ -73,4 +76,4 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
73
76
|
}
|
|
74
77
|
out[(b * p.length + t) * p.nOut + o] = acc;
|
|
75
78
|
}
|
|
76
|
-
`;function q(){return typeof navigator<"u"&&!!navigator.gpu}var N=null;function Z(){return N||(N=(async()=>{if(!q())return!1;try{return await navigator.gpu.requestAdapter()!==null}catch{return!1}})(),N)}var X=class{weights;state=null;constructor(e){this.weights=e}async init(){if(this.state)return this.state;if(!q())throw new Error("WebGPU is not available in this environment");let e=await navigator.gpu.requestAdapter();if(!e)throw new Error("No WebGPU adapter available");let n=await e.requestDevice(),r=(a,u)=>{let c=n.createBuffer({size:Math.max(4,a.byteLength),usage:u,mappedAtCreation:!0});return new Float32Array(c.getMappedRange()).set(a),c.unmap(),c},f=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,t=this.weights,o=[t.conv1,t.conv2,t.conv3,...t.layers===4&&t.conv4?[t.conv4]:[]].map(a=>({w:r(a.w.data,f),b:r(a.b,f)}));return this.state={device:n,embedModule:n.createShaderModule({code:Ae}),convModule:n.createShaderModule({code:ee}),headModule:n.createShaderModule({code:ne}),embedBuf:r(t.embed.data,f),convBufs:o,bioBuf:{w:r(t.bio.w.data,f),b:r(t.bio.b,f)},clsBuf:{w:r(t.cls.w.data,f),b:r(t.cls.b,f)}},this.state}async run(e,n,r){let f=await this.init(),{device:t}=f,s=this.weights,o=s.embed.shape[1],a=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,u=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,c=t.createBuffer({size:e.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Int32Array(c.getMappedRange()).set(e),c.unmap();let v=C=>{let w=t.createBuffer({size:C.byteLength,usage:u,mappedAtCreation:!0});return new Uint32Array(w.getMappedRange()).set(C),w.unmap(),w},B=t.limits?.maxComputeWorkgroupsPerDimension??65535,g=C=>{let w=Math.max(1,Math.ceil(C/64)),Q=Math.min(w,B),H=Math.ceil(w/Q);return{x:Q,y:H,stride:Q*64}},D=(C,w,Q)=>{let H=t.createBindGroup({layout:C.getBindGroupLayout(0),entries:w}),L=t.createCommandEncoder(),E=L.beginComputePass();E.setPipeline(C),E.setBindGroup(0,H),E.dispatchWorkgroups(Q.x,Q.y),E.end(),t.queue.submit([L.finish()])},i=t.createBuffer({size:n*o*r*4,usage:a});{let C=g(n*r),w=v(new Uint32Array([n,r,o,s.embed.shape[0],C.stride])),Q=t.createComputePipeline({layout:"auto",compute:{module:f.embedModule,entryPoint:"main"}});D(Q,[{binding:0,resource:{buffer:w}},{binding:1,resource:{buffer:c}},{binding:2,resource:{buffer:f.embedBuf}},{binding:3,resource:{buffer:i}}],C)}let l=o,I=[s.conv1,s.conv2,s.conv3,...s.layers===4&&s.conv4?[s.conv4]:[]],P=t.createComputePipeline({layout:"auto",compute:{module:f.convModule,entryPoint:"main"}});for(let C=0;C<I.length;C++){let w=I[C],[Q,,H]=w.w.shape,L=C===2,E=C===3,m=E?4:L?s.dilation:1,j=E?Math.floor(8/2):L?Math.floor(s.dilation*2/2):C===0?1:2,AA=t.createBuffer({size:n*Q*r*4,usage:a}),eA=g(n*Q*r),hA=v(new Uint32Array([n,r,l,Q,H,j,m,1,eA.stride]));D(P,[{binding:0,resource:{buffer:hA}},{binding:1,resource:{buffer:i}},{binding:2,resource:{buffer:f.convBufs[C].w}},{binding:3,resource:{buffer:f.convBufs[C].b}},{binding:4,resource:{buffer:AA}}],eA),i=AA,l=Q}let h=t.createComputePipeline({layout:"auto",compute:{module:f.headModule,entryPoint:"main"}}),d=async(C,w)=>{let Q=t.createBuffer({size:n*r*w*4,usage:a}),H=g(n*r*w),L=v(new Uint32Array([n,r,l,w,H.stride]));D(h,[{binding:0,resource:{buffer:L}},{binding:1,resource:{buffer:i}},{binding:2,resource:{buffer:C.w}},{binding:3,resource:{buffer:C.b}},{binding:4,resource:{buffer:Q}}],H);let E=t.createBuffer({size:n*r*w*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),m=t.createCommandEncoder();m.copyBufferToBuffer(Q,0,E,0,n*r*w*4),t.queue.submit([m.finish()]),await E.mapAsync(GPUMapMode.READ);let j=new Float32Array(E.getMappedRange().slice(0));return E.unmap(),j},p=await d(f.bioBuf,s.bio.w.shape[0]),b=await d(f.clsBuf,s.cls.w.shape[0]);return{bio:p,cls:b}}};var dA={version:1,quantized:"int8_symmetric_per_tensor",layers:4,charset:["<pad>","<unk>"," ","!",'"',"#","%","'","(",")","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":","=","?","@","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","}","~","\u0901","\u0902","\u0903","\u0905","\u0906","\u0907","\u0908","\u0909","\u090A","\u090F","\u0911","\u0913","\u0915","\u0916","\u0917","\u0918","\u091A","\u091B","\u091C","\u091D","\u091F","\u0920","\u0921","\u0922","\u0923","\u0924","\u0925","\u0926","\u0927","\u0928","\u092A","\u092B","\u092C","\u092D","\u092E","\u092F","\u0930","\u0932","\u0935","\u0936","\u0937","\u0938","\u0939","\u093C","\u093E","\u093F","\u0940","\u0941","\u0942","\u0947","\u0948","\u0949","\u094B","\u094C","\u094D","\u20B9"],classes:["O","SEP","RANGE","DIGITS","DOT","COMMA","PFX_PAAV","PFX_AADHA","PFX_PAUNE","PFX_SAVA","PFX_DEDH","PFX_DHAI","PFX_SAADHE","CARD_1","CARD_2","CARD_3","CARD_4","CARD_5","CARD_6","CARD_7","CARD_8","CARD_9","CARD_10","CARD_11","CARD_12","CARD_13","CARD_14","CARD_15","CARD_16","CARD_17","CARD_18","CARD_19","CARD_20","CARD_21","CARD_22","CARD_23","CARD_24","CARD_25","CARD_26","CARD_27","CARD_28","CARD_29","CARD_30","CARD_31","CARD_32","CARD_33","CARD_34","CARD_35","CARD_36","CARD_37","CARD_38","CARD_39","CARD_40","CARD_41","CARD_42","CARD_43","CARD_44","CARD_45","CARD_46","CARD_47","CARD_48","CARD_49","CARD_50","CARD_51","CARD_52","CARD_53","CARD_54","CARD_55","CARD_56","CARD_57","CARD_58","CARD_59","CARD_60","CARD_61","CARD_62","CARD_63","CARD_64","CARD_65","CARD_66","CARD_67","CARD_68","CARD_69","CARD_70","CARD_71","CARD_72","CARD_73","CARD_74","CARD_75","CARD_76","CARD_77","CARD_78","CARD_79","CARD_80","CARD_81","CARD_82","CARD_83","CARD_84","CARD_85","CARD_86","CARD_87","CARD_88","CARD_89","CARD_90","CARD_91","CARD_92","CARD_93","CARD_94","CARD_95","CARD_96","CARD_97","CARD_98","CARD_99","UNIT_SAU","UNIT_HAZAAR","UNIT_LAKH","UNIT_MILLION","UNIT_CRORE","UNIT_BILLION","UNIT_ARAB","UNIT_KHARAB"],embed:{shape:[114,16],scale:.04014205187559128,data_b64:"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"},conv1:{w:{shape:[32,16,3],scale:.006106450688093901,data_b64:"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"},b:[-.19965,.026515,.039484,-.57597,.30337,.26008,-.72519,-.10257,-.036593,.10559,-.040798,-.40242,-.099279,-.26205,-.22973,-.033645,-.49589,.15064,-.063868,.0065203,-.081652,.17027,.32479,.25103,-.074932,-.11914,.18076,.096649,.1548,.55641,-.32066,-.65784]},conv2:{w:{shape:[32,32,5],scale:.01006835512816906,data_b64:"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"},b:[-.48065,-.022214,-.14847,-.22966,-.19974,.52539,.98387,.59457,-.30747,-.076908,-.31714,.15821,.22441,-.237,.45228,-.10562,.186,-.15379,-.050172,.04386,1.1573,-.41681,.083819,-.24151,.28582,.54481,.79565,.068877,.45906,.10032,.17915,.3524]},conv3:{w:{shape:[32,32,3],scale:.012611277401447296,data_b64:"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"},b:[.17254,1.339,.4158,-.093339,.28021,-.046465,1.0513,.44342,1.0128,-.12751,-.87515,.64353,-.07254,1.0127,1.7885,1.6769,-.061762,.39241,-.26252,1.0561,.58258,-.23354,-.4736,.38796,.1319,.20964,.30156,1.8676,1.1334,-.093506,.71542,-.0054363]},conv4:{w:{shape:[32,32,3],scale:.021498816087841988,data_b64:"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"},b:[.039289,.34865,.95042,-.073607,1.4115,1.0756,.013808,.096819,.38295,.10098,-.18916,.169,2.1929,-.081778,.22036,.85779,-.44898,.21736,-.035547,.0096134,.7774,.22917,-.081477,.63055,.34935,1.9674,.54778,-.079256,.60878,.79962,.65425,1.9529]},bio:{w:{shape:[3,32],scale:.00724619859829545,data_b64:"/ugX9iQU9fzH9Qj7//n//VfnHw/rrPH+/xH4Kf72/gEB8RfuB/j8/Q33Bvvw/f71AX8BEgjz9gAE//kSBvn87fH1FwfQ4QX8R/YG+Q3+A/CstQgSJEHpAwcL++sI/PP1"},b:[.50217,-.69358,-.15374]},cls:{w:{shape:[120,32],scale:.010841965675354004,data_b64:"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"},b:[2.0176,.54879,-.74852,.6708,.39783,.50133,-.39469,.011433,.18709,-.17795,-.56959,-.41957,-.10239,-.20379,-.27652,-.23129,-.2993,-.59122,-.43887,-.21854,-.40505,-.32273,-.66862,-.36991,-.22728,-.015756,-.21333,-.54736,-.2546,-.30473,-.096751,-.33585,-.67811,-.60113,-.59227,-.50077,-.28001,-.62547,-.50637,-.69971,-.44887,-.24235,-.039837,-.17403,-.34016,-.16981,.053801,-.647,-.68176,-.50378,-.21779,-.19398,-.12628,-.28109,-.22943,-.36458,-.33458,-.32969,-.33054,-.06685,-.27666,-.30963,-.60442,-.47705,-.39358,-.18506,-.22168,-.31992,-.62064,-.49396,-.49137,-.29887,.056513,.083259,-.32745,-.43175,-.36524,-.56233,-.85284,-.53141,-.19461,-.032125,.18264,-.27448,.048796,-.115,-.469,-.25475,-.062195,-.099279,-.23322,-.62488,-.33195,-.25968,-.32699,-.27145,-.28322,-.063576,-.63915,-.14112,-.089139,-.66531,-.20493,-.27128,-.56956,-.4808,-.48607,-.45462,-.28481,-.36513,-.15753,-.65194,.28306,.072143,.026803,-.24859,.48548,-.0098499,.056588,-.34319]}};var Y=class{weights;charToId;gpu=null;defaultBackend;scratch;idsScratch=new Int32Array(M);bioIdsScratch=new Int32Array(128);clsIdsScratch=new Int32Array(128);bioProbsScratch=Array.from({length:128},()=>new Float32Array(3));constructor(e={}){this.weights=tA(e.weights??dA),this.charToId=sA(this.weights.charset),this.defaultBackend=e.backend??"cpu",this.scratch=new U(this.weights)}parse(e,n={}){let r=e;e=x(e);let f=r.length===e.length,t,s=oA(e.length);if(s.length===1&&s[0].length===e.length){let o=F(e.length),a=T(e,this.charToId,this.idsScratch,o),u=S(this.weights,a,this.scratch);t=this.decodeForward(e,u,0,e.length)}else{let o=[],a=new Set;for(let u of s){let c=e.slice(u.offset,u.offset+u.length),v=F(c.length),B=T(c,this.charToId,this.idsScratch,v),g=S(this.weights,B,this.scratch),D=this.decodeForward(c,g,u.offset,c.length);for(let i of D){let l=`${i.start}:${i.end}`;a.has(l)||(a.add(l),o.push(i))}}o.sort((u,c)=>u.start-c.start),t=o}if(f)for(let o of t)o.span=r.slice(o.start,o.end);return t}decodeForward(e,n,r,f=n.length){let t=f,s=t<=128,o=s?this.bioIdsScratch:new Int32Array(t),a=s?this.clsIdsScratch:new Int32Array(t),u=s?this.bioProbsScratch:Array.from({length:t},()=>new Float32Array(3));for(let B=0;B<t;B++)o[B]=J(n.bioLogits,B*3,3),a[B]=J(n.clsLogits,B*n.nCls,n.nCls),aA(n.bioLogits,B*3,3,u[B]);let c=CA(e,o.subarray(0,t),a.subarray(0,t),u),v=[];for(let B of c){let g=B.tokens.map(([l,I])=>[R[l],I]),D=wA(g),i=QA(e,B.start,B.end,te);v.push({span:B.text,start:B.start+r,end:B.end+r,value:D.value,...D.range?{range:D.range}:{},unit:D.unit??null,currency:i,confidence:B.confidence??0,classes:D.classes})}return v}async parseBatch(e,n={}){let r=n.backend??this.defaultBackend;if(!(r==="webgpu"||r==="auto"&&e.length>=32&&await Z()))return e.map(c=>this.parse(c,{backend:"cpu"}));let t=e,s=e.map(x),o=new Array(e.length),a=[],u=[];for(let c=0;c<s.length;c++)s[c].length<=128?a.push(c):u.push(c);for(let c of u)o[c]=this.parse(t[c],{backend:"cpu"});if(a.length>0){this.gpu||(this.gpu=new X(this.weights));let c=Math.max(...a.map(P=>s[P].length),1),v=F(c),B=a.length,g=new Int32Array(B*v),D=this.charToId.get("<pad>")??0;g.fill(D);for(let P=0;P<B;P++){let h=s[a[P]],d=T(h,this.charToId);g.set(d,P*v)}let{bio:i,cls:l}=await this.gpu.run(g,B,v),I=this.weights.cls.w.shape[0];for(let P=0;P<B;P++){let h=a[P],d=s[h],p=t[h],b=p.length===d.length,C=d.length,w=new Float32Array(C*3),Q=new Float32Array(C*I);for(let E=0;E<C;E++)w.set(i.subarray((P*v+E)*3,(P*v+E)*3+3),E*3),Q.set(l.subarray((P*v+E)*I,(P*v+E)*I+I),E*I);let H={bioLogits:w,clsLogits:Q,length:C,nCls:I},L=this.decodeForward(d,H,0,C);if(b)for(let E of L)E.span=p.slice(E.start,E.end);o[h]=L}}return o}},$=null;function IA(){return $||($=new Y),$}function pe(A,e={}){return IA().parse(A,e)}function Le(A,e={}){return IA().parseBatch(A,e)}function He(A={}){return new Y(A)}var te=lA(bA,EA);export{Y as Parser,He as createParser,q as isWebGPUAvailable,x as normalizeText,pe as parse,Le as parseBatch,Z as probeWebGPU};
|
|
79
|
+
`;function nA(){return typeof navigator<"u"&&!!navigator.gpu}var K=null;function rA(){return K||(K=(async()=>{if(!nA())return!1;try{return await navigator.gpu.requestAdapter()!==null}catch{return!1}})(),K)}var _=class{weights;state=null;constructor(B){this.weights=B}async init(){if(this.state)return this.state;if(!nA())throw new Error("WebGPU is not available in this environment");let B=await navigator.gpu.requestAdapter();if(!B)throw new Error("No WebGPU adapter available");let n=await B.requestDevice(),e=(f,w)=>{let s=n.createBuffer({size:Math.max(4,f.byteLength),usage:w,mappedAtCreation:!0});return new Float32Array(s.getMappedRange()).set(f),s.unmap(),s},t=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,r=this.weights,g=r.conv.map(f=>({w:e(f.w.data,t),b:e(f.b,t)}));return this.state={device:n,embedModule:n.createShaderModule({code:eB}),convModule:n.createShaderModule({code:nB}),headModule:n.createShaderModule({code:rB}),embedBuf:e(r.embed.data,t),convBufs:g,bioBuf:{w:e(r.bio.w.data,t),b:e(r.bio.b,t)},clsBuf:{w:e(r.cls.w.data,t),b:e(r.cls.b,t)}},this.state}async run(B,n,e){let t=await this.init(),{device:r}=t,g=this.weights,f=g.embed.shape[1],w=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,P=r.createBuffer({size:B.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Int32Array(P.getMappedRange()).set(B),P.unmap();let u=E=>{let c=r.createBuffer({size:E.byteLength,usage:s,mappedAtCreation:!0});return new Uint32Array(c.getMappedRange()).set(E),c.unmap(),c},o=r.limits?.maxComputeWorkgroupsPerDimension??65535,C=E=>{let c=Math.max(1,Math.ceil(E/64)),a=Math.min(c,o),d=Math.ceil(c/a);return{x:a,y:d,stride:a*64}},D=(E,c,a)=>{let d=r.createBindGroup({layout:E.getBindGroupLayout(0),entries:c}),F=r.createCommandEncoder(),l=F.beginComputePass();l.setPipeline(E),l.setBindGroup(0,d),l.dispatchWorkgroups(a.x,a.y),l.end(),r.queue.submit([F.finish()])},Q=r.createBuffer({size:n*f*e*4,usage:w});{let E=C(n*e),c=u(new Uint32Array([n,e,f,g.embed.shape[0],E.stride])),a=r.createComputePipeline({layout:"auto",compute:{module:t.embedModule,entryPoint:"main"}});D(a,[{binding:0,resource:{buffer:c}},{binding:1,resource:{buffer:P}},{binding:2,resource:{buffer:t.embedBuf}},{binding:3,resource:{buffer:Q}}],E)}let i=f,I=g.conv,v=r.createComputePipeline({layout:"auto",compute:{module:t.convModule,entryPoint:"main"}});for(let E=0;E<I.length;E++){let c=I[E],[a,,d]=c.w.shape,F=c.dilation,l=c.padding,z=r.createBuffer({size:n*a*e*4,usage:w}),y=C(n*a*e),hA=u(new Uint32Array([n,e,i,a,d,l,F,1,c.residual?1:0,y.stride]));D(v,[{binding:0,resource:{buffer:hA}},{binding:1,resource:{buffer:Q}},{binding:2,resource:{buffer:t.convBufs[E].w}},{binding:3,resource:{buffer:t.convBufs[E].b}},{binding:4,resource:{buffer:z}}],y),Q=z,i=a}let h=r.createComputePipeline({layout:"auto",compute:{module:t.headModule,entryPoint:"main"}}),b=async(E,c)=>{let a=r.createBuffer({size:n*e*c*4,usage:w}),d=C(n*e*c),F=u(new Uint32Array([n,e,i,c,d.stride]));D(h,[{binding:0,resource:{buffer:F}},{binding:1,resource:{buffer:Q}},{binding:2,resource:{buffer:E.w}},{binding:3,resource:{buffer:E.b}},{binding:4,resource:{buffer:a}}],d);let l=r.createBuffer({size:n*e*c*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),z=r.createCommandEncoder();z.copyBufferToBuffer(a,0,l,0,n*e*c*4),r.queue.submit([z.finish()]),await l.mapAsync(GPUMapMode.READ);let y=new Float32Array(l.getMappedRange().slice(0));return l.unmap(),y},L=await b(t.bioBuf,g.bio.w.shape[0]),H=await b(t.clsBuf,g.cls.w.shape[0]);return{bio:L,cls:H}}};var lA={version:2,quantized:"int8_symmetric_per_tensor",charset:["<pad>","<unk>"," ","!",'"',"#","%","'","(",")","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":","=","?","@","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","}","~","\u0901","\u0902","\u0903","\u0905","\u0906","\u0907","\u0908","\u0909","\u090A","\u090F","\u0911","\u0913","\u0915","\u0916","\u0917","\u0918","\u091A","\u091B","\u091C","\u091D","\u091F","\u0920","\u0921","\u0922","\u0923","\u0924","\u0925","\u0926","\u0927","\u0928","\u092A","\u092B","\u092C","\u092D","\u092E","\u092F","\u0930","\u0932","\u0935","\u0936","\u0937","\u0938","\u0939","\u093C","\u093E","\u093F","\u0940","\u0941","\u0942","\u0947","\u0948","\u0949","\u094B","\u094C","\u094D","\u20B9"],classes:["O","SEP","RANGE","DIGITS","DOT","COMMA","PFX_PAAV","PFX_AADHA","PFX_PAUNE","PFX_SAVA","PFX_DEDH","PFX_DHAI","PFX_SAADHE","CARD_1","CARD_2","CARD_3","CARD_4","CARD_5","CARD_6","CARD_7","CARD_8","CARD_9","CARD_10","CARD_11","CARD_12","CARD_13","CARD_14","CARD_15","CARD_16","CARD_17","CARD_18","CARD_19","CARD_20","CARD_21","CARD_22","CARD_23","CARD_24","CARD_25","CARD_26","CARD_27","CARD_28","CARD_29","CARD_30","CARD_31","CARD_32","CARD_33","CARD_34","CARD_35","CARD_36","CARD_37","CARD_38","CARD_39","CARD_40","CARD_41","CARD_42","CARD_43","CARD_44","CARD_45","CARD_46","CARD_47","CARD_48","CARD_49","CARD_50","CARD_51","CARD_52","CARD_53","CARD_54","CARD_55","CARD_56","CARD_57","CARD_58","CARD_59","CARD_60","CARD_61","CARD_62","CARD_63","CARD_64","CARD_65","CARD_66","CARD_67","CARD_68","CARD_69","CARD_70","CARD_71","CARD_72","CARD_73","CARD_74","CARD_75","CARD_76","CARD_77","CARD_78","CARD_79","CARD_80","CARD_81","CARD_82","CARD_83","CARD_84","CARD_85","CARD_86","CARD_87","CARD_88","CARD_89","CARD_90","CARD_91","CARD_92","CARD_93","CARD_94","CARD_95","CARD_96","CARD_97","CARD_98","CARD_99","UNIT_SAU","UNIT_HAZAAR","UNIT_LAKH","UNIT_MILLION","UNIT_CRORE","UNIT_BILLION","UNIT_ARAB","UNIT_KHARAB"],embed_dim:16,channels:48,embed:{shape:[114,16],scale:.026793908327817917,data_b64:"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"},conv:[{k:5,dilation:1,residual:!1,w:{shape:[48,16,5],scale:.006297729909420013,data_b64:"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"},b:[-.41403,-.37083,-.17471,-.10723,-.217,-.12782,-.13307,-.17872,.14632,.22011,-.51505,-.49735,-.37585,-.09941,-.28281,-.019124,-.42833,.035917,-.10015,-.15915,-.25731,-.26232,-.0039441,-.27283,-.15598,-.25122,-.0023473,-.22346,-.29785,-.20515,-.19531,-.4258,-.18466,-.01237,.29463,-.2259,-.34927,.099886,-.44475,.075165,-.23074,-.3804,-.36044,-.20509,-.13041,-.65456,-.15375,-.27194]},{k:3,dilation:1,residual:!0,w:{shape:[48,48,3],scale:.011268280446529388,data_b64:"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"},b:[-.11524,-.18613,.1175,-.24892,.044796,.036463,.162,.1028,.29527,.66518,.22132,.018315,.021825,-.035526,-.079711,.003407,.027631,.018111,.091177,.19069,-.014315,.14228,.56057,.094511,-.2393,.14826,.15474,.080275,.10113,-.0066077,.18899,.37924,.22151,.15665,.025146,.12335,.039528,.020341,.17161,.30304,.089673,.7569,-.26167,-.43312,-.10887,-.15408,.089991,.14783]},{k:3,dilation:2,residual:!0,w:{shape:[48,48,3],scale:.01531923096626997,data_b64:"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"},b:[.32767,.15526,.082936,-.049189,-.054941,-.15,.26939,.011199,82305e-8,1.0392,.2586,-.35586,.59987,.199,.1843,.024139,-.021032,.021746,.068581,.1081,-.066881,.28893,.89474,.89374,.0083983,.010518,.63441,.033195,.63983,.12939,.35362,.14388,1.1091,.2411,-.18525,.38478,-.054586,.68936,-.039841,.35021,.042444,1.2556,-.077732,-.63378,-.12078,.63872,-.024576,.76438]},{k:3,dilation:4,residual:!0,w:{shape:[48,48,3],scale:.017100131139159203,data_b64:"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"},b:[1.3777,.085752,.28277,-.0026793,-.36331,.26844,.23482,.45244,-1.3456,.32375,.62031,-.2426,.0069488,.28055,1.2795,.49334,.092458,.021483,.35107,.12564,.094297,.33727,1.1613,.91248,.33595,-.31547,1.0323,.48746,-.51575,.62476,.13256,.57825,1.5317,.17567,.028722,.71635,-.029699,-.071299,.67362,.67226,.57821,1.9162,.22972,-.058133,-.21721,1.7296,-.063783,1.2866]},{k:3,dilation:8,residual:!0,w:{shape:[48,48,3],scale:.01713515631854534,data_b64:"++n83QEW+BzsB/0K+wDk9Qz2GP/uCgX1+gHO+v7/AAYb9Abn+d4iBf/7DAAPEQEK/QXv7vwZ+A7y/gAB9AX//P8F/fj29vAMAf0eAf0E+Aj499UBB+IrCeQeCw4EBAz5AOXr+g/3ANr58fn7+wjvDvHz//r//Boe/guz9fT2B+YN5QL4ChHuCATj+ekD/A0N/wYB/QXt/qYG/REB8rXy9M4HCBQB/x0CCOsLA/8C+eP+BugH+BP6CsT+EQoIBSsI6+/86eL2AA3/Bd4G+Nn/BuUB8g0TDRUT+PHr6tb+BRME/6z2CRT+BdP4+gkEA97+7v4LCDL97AUI9NACDw8GB+AADQYLAgb+BvgKAvIaDqID+OoB/T4B9jUQAsQE//H9/s8DBAf8BDQFAvX7/NX+/gMCABwG+/3+A+sKBfkDAwz9BAwCBuz5ARMG/AkHACL8/PYABQL9BAD/AvX7/BQCATMEAQIF+w8G/ATlA/sA/gcEA+v9BOj2/PX7BA8D//X//QQL98wA/PgEAwADAeoEAu/9AfoE//79A/YJAv8Q/tj7AQsC//YB//0T/eL+//gH/c8DAfD5/gYEACECAOf//xwC//cFAeUCAgL8AgwA/gEC/wYAAAEAADIGAAgI/xkEAAv///8AAPwA/vsAAdf/Ab0CAfkKAPAEAPn5AAIAAhoAAeABAdH9Agb9/+YBAvP8A9sUAfT/APUCAQ8EAfIEAOj6//sAAAX+AfUHARMU+7QDAsAAABz//hMO/v/+AgUIAPH/AQj9AET//voAANoC/pX8/RUB//IAAO4EAvUC/PP9Agv/B/IAAAYE/wcB/TD8AQP+Afv/AAv7//j8AswA/ywCA/EDARMAAPb3Afz/ABoDA90EAAH9/QH6A9kA/+8A/v0KAwUA/xH+Af8DAAwEAfgDAcgDAAEDAv0CAAoE/tH+AgoFAAoA/xcGAP7/AgUI+fIC/OL99ucB/+j5BBAQDDYF+AIB9OX/Cs8KCBP+ASID8wkB/P36+AoBAusMARf7AQMK/g/98t77+cP29u4AAPQH+xEEBxADAfjY/vkECuoNBAgAANn9BvPlBwIDCgIIDgEH/Qj69eX7+xT7BA4B/OoDCgj5BQUB+tkDAv4I9sbzDPXyA9kE+PwVAOD8+wUB/wMBAAr2AB4FAPT4/v/+AcoEAxgDANUDBO7+BAEBAf4BAvMA/P3+/wcAAvUF/xQD/wYB/+b+AAkBA94C/h8BAw8A+QgIBAwF/A34/f7+AgcBAN39Ac7+Av/+ASACAPH+++wKAwL+/fgD/fIDA/oDAvQBARYBAAr/AgQFAg8Q/tQFANsA/R8A/A8LAA4E/wX9/wD/APT9AQL/AP4AAQgDAfL+APoAAeoABBoAAAYAAA0DAAYAAe7/APAAAAP8/+8AAAL9//P/AeYBARD/ABb/AAv/APv6AOkC//wCACoAAAYBAOMBAAcBAAcAAOYAAfUAAQT3AewA/wr9APb+AisB/vL/APsB/wEDABAAAv70+ssGAfoAACH+//L5/x0BBdv4/wL6AwrlAxUI+wz8/Q0CAwAC/hAGAQgICwMSAv3+/RH/AvsAAOjyAxQLA/kC//4EAAIE/QT2AgQBB/r5AQ4EBAQD+/7/A+cK/Pvl/i37BAADBL/+Atn2/PvzBhUAAAv//P4HBPv2+iEBAP//CB4NAt8B/wIAABn7Ag4PBf0C9sIEAhb+/iwA+PQRAC0DAgH4//UAAPkB/woCABgDAAsA//L//h0C/9j//g7/AQ7//Rn/AP7+AgIDACoFAP4E/woCAR//APEC/wcA/gAAAtb//uIDA9sF/8j+Af79AQIBABj/Af0BAN0AAeP/Afz/ABj+AhkKABAAAPMBAvkE//sBAfv9/8n/AAL/AOsCAe0H/tQAARUBAfEBAQsH/wD+AQ8D+t0CBA77Adb8/+X8/bD/ACICAvoC/wYEAvkB/xIE/0QD/tQFA/kEBhMJBAIJ+979AwsBAQn9BP3+ALv7AfT/AhgEAQgKAd8H/fvvAfwBACwFBOkBBOX8APny+uoE+/oEAuQUAhf9+QMBCRoEABAEBOn//Rr7/wUBBtUF+/kS/sb//ff8+84B/goO/rsBBAcKAfr89/cC/P77APv8/gH6+////vkB/fsCAf0B+vv6+fv7+vcAAff6+PwA/wAA/vr8/f35/Pr/+vn7+/3//f/5+AH6+fwBAv39APv8//j9+v/9/v//AfsB/Pj/+vv7+vz8Av/7//v7+/kA+fz/+vn7/gD9/vr5+P78+/79/voB/vj/9/n5AP/9+fz8AP8B+/oA/vX4AwrhAhwM+g75/Q8EAg8E/QkHAQEICysdA/39/An/BPQAALPtAwYPA+AE/g0EAAMG/QLzAQABB/f3AQYFBA0E++v8A+kI/PTa/TH8Bf8GBrb8AdLy+//uBxoC/wT+/vYGBQ/1+TEDAAX/CRkRA9wCAAL/AAT3Ag0SBvf/9a4CAwr8/ikC9vUTADEEAfn0+94B+sr09BgD+dX8BSUOBeH6/BH89N4BA/sJCAH/AgYBBhoAAuHr/CsF/QMBAxb+AAIFART//PUBBfz5BCYFA+0A+soGB+IAAefRBvgDEBkIAAIBA/EBAw/oBx8E+g0DCOsLCOv4/vEBBQwB/fMD/PEA/Qn++wIA/wgIBL4J/PEBBQz/APYH/QwPA9//9ygEAPL9AQr0AhT8/wUFAAf/AfX/ABQBAQICAhP6Av0B/f4D/v//AukDAQT+Av4B/wADAAP8/wAAAgQCA/T/ARX/Ae7///0AAeUF/vkA/xj9AQsAAdYBAvMD/+kAAgP9AxMB+/wBAxMA/Rn7/wAAAhMCAPD/AAMCABIEAgoBAAH6/9YFAhYE/iP+/fT+AA0BAQP0AOL+/eb4AfIHA/r4/wUEBO0B+hMB+hMEA+8H+CUFA9cE/uwG+dD2+/P9AfcGCT8D+uECBeX9/fMJ//T4AAb8/54DAPsI+/AECjHkBesI/RD+AfIAAuPw9uXpAgEGAOr6//0L+xb6BeEGBA4CAekCBhsA+xcA/wAA/vwIAQAU/b78/fb4BRUB/RoQBN/+B+YYAAEC/Pr8AgAD/P3++//9AQEC/P76/gH6BPwCAAIA/v0A/v4C/v78/f38///7/f/8/gL//gH9Af7//P39Av77AfsAAAD5+wD9Avz+AAP9AQP7BAD9/wAA+wEB+/0D//z9+wH9/P78AQD7AP39APoBAP7+AwD7//39/QD8BPz5AfwDA/7+Af76/AL8/v79/vz+/PcA7tj1AiQC9Bb+/NYK/gH++wkBAhsCAd4MBNv/9usCBzMA+Njx+QoD+egOByn6/PwPGDD+/MkAA/HvABgGAxEEAQEG/Q4G+tnQ/ekCCvkGA+b9/OgD/gzp9PcE9Q0BAvYNAvL3CeoEChz7BewDENr7/gQABAH4A/UIAegD/Prz+s32AwgCBOYS//f++xH49wEF//j4BP///Pr/+v37/vUC/vr8/P8A/wL/+Pz8+fsC9/v69/j39/oAAP4C///4/vwC9/kB//wD+gH+/f39AwL8APn8/AH++gEA+/gA+AD69vr8APsA+gH4Af76/wL+/gD/+AD6+AL7+f8B/Pj++wH+9gD5+/37A/wA/Pv/+vv+/fv9//oD+vf8Af4B//76ABQCAQT9AO4AAAQBAAD/APwAABABAQYBAu/7AAwA/wUBAAsAAAcFAQMAABMCAP8BAAAA//sAAfgAAM8AAAQBAPgAAPQEAP8CAP4CABL+APkAAAAAAAcB/wYAAPoAAf4AAAgGAff/ACIAAAUAAQYBAAb/AP8AAIkAAA4BAA4F//8BAfsAAP7//xoDAP8AAQsDAAIC//P7+wgCAhH7APX/ARQE/AQD/vr+AfsHBPcDAAv/AgwBBOn7/gII/vYH/vz+Af7/APH+A/YB/838BDwEABcBAfkB/u//APnuBAL+AA0IA/wB/O4B/x75/+b//fcBA/4GAAv+Af4ABRcAAQkGAAIAAAb9/wb7AO0GAfoF/eP+/8v8Aw8G/vkM//kBAeH+AAQAAR7/89QBABH9CCEJAQsJ+dj7+Pf/BtQH/uYA7NQCCQQABQIEA7ICBNQH9RX6BxULANn4BigD+MX3+fv7BTUD/AYACRT/BgXmAfMAC/MAAv3/A/4B/BL1APP7BhwEBfgHEjr2/fD4AxYAAQ4C++UDBA79+QT8/90D/wv+//L1A9z3/AAC9eoNAML99+r/9+4O8gY4AQz8AA8FANv4AsgJ+/8VAs3yAPT+CgUMBQH9/eICEQf5/AP48PkOAdT+CNv3A/30BfXu8PX4AwPr+wEAE/r/BAr2Cur+E738ChT68OXoAvIB7An7/SX/C+0TCvv+BfD+G/b7B+b6A9Tw8wr9AAYC/gP5CP/zDfUF8qvuCqzQ+yQHAwAA/tT+CtsAAgEC//QBAA4AAez/AQL//wMAAP8B/+wA+wwAAPMAAPEAAPr/A/H/APIB/wkCABUBAPkBABYA/wQAAPsAAfUB//gBAQsE/9oAAP/+/+8BAA0AAAABAPX/AvgAAP3/AP3///QH/vX/AP0BABkB/wL/AO8AAAYAAP0AAAcBABEJAfr//+7/APcAAg4F/9sA/gsJAe4GAQP6/vEBAfP8AN4CAEwB/yj+ASQBBi7+ACEB//cDAeYE/v4A/8UA/hwB/+sBAOn+/6v9/xYB/+D9/yj+ANcAAQECAeUCAiX8/wcAAA0DAOACAOf//rH9/rYCAub+ABsEAMP+AP8A/9sBAtME//3+AAYE/wQC/xcE/w0K+pwCABD9ATL8/wgDAAP+B+0GAPEAAPT+APv9/wMDAQgDAfz+/QcBAQYABQH9ABgB/fYDAfz/BOv/AOACAQn//+kBAAf//94AAeABAA7/ARwBAf8BAPsA/+0DAN0BAQwCAO0BAu4C/+MCAQX9ANsAAAkAAPIBAfYC/wf8AfX/AhQC//X9AOYA/wgDABIB/yL79uIHAPUB/zb+/wv8/yH/Be7+A/f/69j29tcIAvb7AQYA/vUC+RUDARsE+fsH/KoD8xwE99YF/cjxBfD9//EF/AYGB/kFABf+AQr/BRD8BPT8994EBQYH/PEA/ijdAfQHCDwGALD/+RD2BAnuAfUGA9X/AyER/fj4BvEKBA0I/rEF/gf9BBoC//X7+/4JCfAWAbIFBBH9Df8AA/UPAtkB9yYGAA4CAfcHAff+/+IA/wUAAfkAAPr+/+L+Aw73APYBAfX9ABYB/QoJAOf9/xQDABsAACACAOcCAegB/woB/wP//xH9AAMFAQH/AN8DAu8DAfIAAMoAAA4BAPwDAfz/AO0AABgDAAIBAfMAAvMAArv7/hIB//QB/+8BAAf8AQEB/zn9//f+Aeb+/ir/AOMAAAQA/uAHCRz+/AH9A/f/+x0HCCUFCg8EAw3/DxP99MwCAAr7BCEB/xMJAD8DBRoEAPr5BA0D+e/1/PH8AdL7/hQD/t0CAPX+BhcDBBHw/+T8BRD//cn9BOkHBAz8ADH+BqL8Afz9A9f5AgP4+xQEAwgBAOcH/AwB/QP8/f4C/8739Or3BggDAQH7+QcFA/cA//f7/gD7/wH9+wD8A/v+/P0B+/z8/fr6Afn6/gD7/vsDAAL/+/z9A///Av38A/8AAP8BAvz5+v7/+/kDAv4AAvwAAQT6AQL+AQD//PsC/AADAgEA/AIAAff+APn7Avf//P4C/v37BPoCAwL+APsCAPsAAP3+AQIB/v39/gL+/fn6/QIA//r9APv+A/78/v4CAgL6AdYD/RD0/RUH+fsE/g/7BhAHDhIB//oCDNUIAOwA/fL7/fcC+RL+BlECCxQIAxUG/uQA9s34/vf/CPMC98wBAqQE9/cLCxEG/f3k+Pb/ByEF/Nr4APn9BBH6BgMBAeoB+gMNBhD7+gEF+x0EBfkB//j/B+0AAP77/uEIBO4RAeMA/f8DAtz/9gYPBuAB+R8D/9YD9e/x+gMAAQ76/gwA+QkF+AYDA+IB97EHAQr/ABcCAfYICNn3A8wH+dIHABz7AOT//un3/g0B/OT3/BoB/UgAAwUM/xoNCPXl/OwC+xEFAuz9B9T5/vHq/9sHCSkKBBER+CID+/YIBQUEAeAGBPP8APQDAgICAO4GAA4aBtL8A5z4/t0BBiQR/tYC//cK/fAB/wkC/xAA/v79/PP+AOQB/xUCAfEABf4G/fUCAAL/AuYEBPr8AOQB+wYC/yD9A+0BAez9Ag///QH5AOsB+vMBBgQC/QUDBgn/AxIB/h79/9f8A/r7/fD//wIEAP7+BQIHAAP/Bf4GBu8D+/ID/PYE/REA///8AOsA/QYG+uX5/gcC/gMDB/sG/uUBAwcC/wr8AgHxARcG/gn//w8BAAwD/wMDAPoCAgsKAvQA+/YBAekAAe/6AuAGAv0G/hkDAAABAAH8/wMAAvz9Af0CAvcC/wQCAecD/unr/iD/AhECBMr+Aez9/fb4AwcB/wj+/vcIBRP9/R4B/wkBAgcGA/AAAQoAAQT8AgYIAAMG/sIAAvr//hwB+wkLABUBAQD6/gz9AgzqAQgI/A7+/wUCAQwD/goEAQEFB/MPAgz+/gEAA/oBAf74AwEJAgEF/g4DAAAE/v34Af0BBPv7AQMDAwcC/AQCAvcF/vfp/Sf9A/sDA9L9AOr4/Qb0BAwBAPz+/gUKA/36/BAC/wUABgwLAuv/AQD/ANP6AQcLBAgE+r8CAwH+/w4C+QUOABkCAAH7+vr8+QP8APYA+/3/Afn6/vv5Aff6APn6+vv2APz8AQAA/wD5Av33/vj3+v79/vr///b5/v//AQD9+gT9Avn5APz6AP3/AfkAAvn7Av76+/b/+v/7+AP5/gH5/P0AAP/5+QEAAfv+///9A/z8+wH8//wAAwL5+/z8//r3+/z+/wD3AwIA/gH7/v39AAIAAP/8AfsA+/v/+vv+/QD6/P3/AP36AgEA+wH9/v38/PkA//r+//j+/AD9+/v/+v35+f0B/v37+v35//j7+fr+AfoA+fr//Pv9/QH//fn7/Pz8/Pr///z7/gD//v7+/vz7AAD4/voB/fv6APz/Af79/v77//r6+vz9+/r7Af35+QH+AP34+wD8+/kA/vr+/fz8+/z5/u8F+wH//Av+ABj6/+b9APEEBDAJASX9BccAAckABCgA/tkB/AMAAPQABg8LAgwEALf+AN///7z6Av8BAeYBAcUC+vQFBz4M/8YD+Pz+AToF+sn+AOwEA+b+/gP8AjIF/uAHAgAC/+wE/RH/A80HAg0BACf9APv9/vIEAhcSAswAAOIE/vEEARkLAvQE+OwD+dUC/PH1B9r7/uv4A+YBAQz4+/cDAvwCCuz6BfEI+gcM/PD+BPsEA/b5/toP/xP9APgH/AQG/w8EAu/zABMD/v38/SIJAPoH/Q3f/AsGAQH/AgYI/+YF/O/1/PkHAvUAAQQO+MYE+dMC/xoGB+ECBOH6AkAH/wj8AgUI/twNAc/8Bf/7/ecAAQYSAdUBAhL8+//3/fj7+wT6Afj7BPv9/voA/gIB/gH///r9//n8/fr9//v7/fr9/P///v77BPr7+/r7+/8AAPr//f38/v37/v76AP/5/fv8//76Afv///0AAQP6Av/5BAL7/f/+A/8C/wD4/gEB/P0AAvz9+vv9+/8D/v7//v3+Av38AP4A//78/v4CA/kD+/kA/f3++/75//4C+wD7/vv//QEAAAEB///9Afz+AvsE/gL5/P38/P/9/v/////4/fz9+/76/P4CAf/7/AP4APsCAf///AL8Avz9/AP5AwAC+v76AvoAAAP/Av/++QL/Av37AwIAA/v//wAA/gQC//v+//0CAv3+AfsD/foA/QIC+wAB+f39//72AQT7A/v+//oB/QD7//oAAPYCAAD+AekEABEAAOsAAPIAAe4BAA0B/xP8AP0BAeIAAPL/AfwBAeYDAPABAPgDAAgAAPsAAPQBAvIBAAEBAAoC//wHAP0C/gL//wMBABb///IAAAYC/+n9APABAPb/Ae0IAA7+//YCAAIBAfoAAPIAABv/AAYAAAUDA/oK/uACAOIAABr/AAAG////AgoH+64I+PP5ED8BChr88sAGCC79/hf/BA8A/+sK/AH5+/H+/RAAAeD3/TAF/+sIAMT6ABIOBDj+/9UCDTL8/jkJBP77BhgJ9vUD/OrRAgkEBvkKAgIEBNr//wnsAf4H/gsEAfUH84H+Auj+A+P2AL//AeD6/RYA/vr8APwG/wv+AMD1BQj3/s4EAgMOAOD//B/8ANj9++L6BRH/Atr+AREIBAr9/yH/DRwACusP/ggC9wIA9eoBBNTv/AT+BwIL/wz99QQEBBv++gwFAPjzAPcBA98C+wwD/vcD9vPW+wYDAQ4I/wT9/u35A/Lr/e4ABsv+/P8J7773+/MA9gH/CvQBA/r6AgMFBfn9AvgE/gIE++b2ECsAAO0C/vgNANL+Bij7AgQA/wnv/gsI+Qn9Af0C+gMB/QcBBhsCAOoNCA0D/dcCBQ4ABgHxB/sC/f0FABQDAQoF/O33BBP9AOr/AwkCAP8D+wMEAAkC/vng+////+sFAu78/ej9BPL3/xcF/gT/AfsJARX5+QwB+fP7BQMHANb+BOACAAX/BusK/uQKAO8A/vUC/AgH/w0P/e///QX+APMCAPsAAPsBAAQAAAb/APsAAA4BAAYBARf8AAEBAAcAAP8AAP8DAAMBAPYCAAQBAP0BAP4AAP0AAAkAAAUBAPYAAAQFAAEBAAAAAAn/AP4AAAAAAAQBAPsAAP8AAAIAAPwHARb/APIAAP4BAPoAAAUAAP0AAOUAAP0BAAoJAAEAAPsAAAv/AOgFAAL/AAsGAwUBAAT8/8n9/gQDATMAAOX+/ekAARgABCP8AOkD+Sn/A+X/BuwGAsYCAPcD/Oj9ACkB/tP+ARsAAAMAArcAAff+AQEGAOoB/gv7ASYAAS8CAcgB/hIC/wUBAcf9AdoBAPsJAR7+ABb8AesDAhH+/9b+AegA//4BAAX//QQE/uH+BCUE/hkEAP4EAev/AfX9Ae4E/tz9/vIE/tICAAf+BBAD/S0FAfgB/u39+u8EABQD//IBBecC/PUDBv0NBQAF/poEAgX+/v8AAOj//hQD//cBAQ8Q/f7//wLvARQCAxECANz9/eb//+L4/vEEAgn/AQcZ/Q/6AfcD/Q0C/vUBAvD/+gf/Av/4/tIJAvMe+sEBABD8/v8G//kYAfP+AS4F"},b:[.17334,.95171,.39722,.81052,.1426,.24649,.26206,-1.6457,.60351,.68078,.32679,-.072643,-1.4102,-.10251,-.77406,.49564,-.033894,.076563,.036676,-.66481,-.080242,.22412,.46619,1.2746,.53776,.49293,.26188,.56415,-.41336,-.037646,.33929,.76413,.56441,.18243,.5228,-95438e-10,-.11429,.43393,.4121,-.025991,.0081522,1.6035,.041022,.06896,.15759,1.8212,-.1321,.81853]}],bio:{w:{shape:[3,48],scale:.004121375735849142,data_b64:"KP707AkH9PmB9RL0dgJFDxD4ASj2ADr27AgHFQIH9PgXzeMA/QHvLQ4FAP76/wb52gD+7gwJ9/IM9xDu9wT4ERP3/FX7/yD67Q0FEwT09fYMFtL68wTsVgAB/gIGuAb62gH67AoK+vA/9hEAiwTwEBr48+X7Adbt7BEFEgL29fcLFkQIBwXuwCH//gIE9Qb7"},b:[.33826,-.72342,.082475]},cls:{w:{shape:[120,48],scale:.006543000228703022,data_b64:"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"},b:[2.1537,.47451,.029461,.89724,-.12645,-1.3064,-.42351,-.070797,.34355,.20397,-.43014,-.063977,-.11719,-.34141,-.37835,-.64427,-.53819,-.47944,-.56216,-.12763,-.48014,-.56977,.050473,-.33839,-.65921,-.31452,-.33799,.10971,.078488,-.45741,-.15056,-.018883,-.27828,-.17847,-.81039,-.28268,-.14222,-.29722,-.77616,-.47762,-.3697,-.46026,-.13087,-.49869,-.28312,-.69974,-.41188,-.92325,-.58822,-.39002,-.77904,-.36065,-.11276,-.51998,-.6679,-.38287,-.65133,-.40006,-.26539,-.30836,-.44642,-.63607,-.34191,-.47544,-.56102,-.12988,-.55126,-.47222,-.1993,-.83675,-.95856,-.1607,-.10582,-.52014,-.43954,-.43493,-.62038,-.5219,-.36894,-.45107,-.21352,-.24609,-.35412,-.22215,-.3239,.0019337,-.40894,-.61599,-.35282,-.37185,-.41393,-.5583,-.21046,-.82141,-.49686,-.81666,-.62528,-.17747,-.33321,-.42288,-.37428,-.17428,-1.1207,-.22147,-.65601,-.58428,-.5439,-.10838,-.0096173,-.40622,-.38756,-1.0267,.49986,.42088,.80243,-.025016,.4964,-.71379,.045631,-.52001]}};var V=class{weights;charToId;gpu=null;defaultBackend;scratch;idsScratch=new Int32Array(R);bioIdsScratch=new Int32Array(128);clsIdsScratch=new Int32Array(128);bioProbsScratch=Array.from({length:128},()=>new Float32Array(3));constructor(B={}){this.weights=gA(B.weights??lA),this.charToId=sA(this.weights.charset),this.defaultBackend=B.backend??"cpu",this.scratch=new X(this.weights)}parse(B,n={}){let e=B;B=k(B);let t=e.length===B.length,r,g=Z(B.length);if(g.length===1&&g[0].length===B.length){let f=x(B.length),w=p(B,this.charToId,this.idsScratch,f),s=j(this.weights,w,this.scratch);r=this.decodeForward(B,s,0,B.length)}else{let f=[],w=new Set;for(let s of g){let P=B.slice(s.offset,s.offset+s.length),u=x(P.length),o=p(P,this.charToId,this.idsScratch,u),C=j(this.weights,o,this.scratch),D=this.decodeForward(P,C,s.offset,P.length);for(let Q of D){let i=`${Q.start}:${Q.end}`;w.has(i)||(w.add(i),f.push(Q))}}f.sort((s,P)=>s.start-P.start),r=f}if(t)for(let f of r)f.span=e.slice(f.start,f.end);return r}decodeForward(B,n,e,t=n.length){let r=t,g=r<=128,f=g?this.bioIdsScratch:new Int32Array(r),w=g?this.clsIdsScratch:new Int32Array(r),s=g?this.bioProbsScratch:Array.from({length:r},()=>new Float32Array(3));for(let o=0;o<r;o++)f[o]=G(n.bioLogits,o*3,3),w[o]=G(n.clsLogits,o*n.nCls,n.nCls),$(n.bioLogits,o*3,3,s[o]);let P=cA(B,f.subarray(0,r),w.subarray(0,r),s),u=[];for(let o of P){let C=o.tokens.map(([i,I])=>[M[i],I]),D=aA(C),Q=IA(B,o.start,o.end,tB);u.push({span:o.text,start:o.start+e,end:o.end+e,value:D.value,...D.range?{range:D.range}:{},unit:D.unit??null,currency:Q,confidence:o.confidence??0,classes:D.classes})}return u}inspect(B){let n=performance.now(),e=k(B),t=Z(e.length),r=new Array(e.length),g=new Array(e.length).fill(!1);for(let s of t){let P=e.slice(s.offset,s.offset+s.length),u=x(P.length),o=p(P,this.charToId,this.idsScratch,u),C=j(this.weights,o,this.scratch);for(let D=0;D<P.length;D++){let Q=s.offset+D;if(g[Q])continue;g[Q]=!0;let i=G(C.bioLogits,D*3,3),I=new Float32Array(3);$(C.bioLogits,D*3,3,I);let v=G(C.clsLogits,D*C.nCls,C.nCls);r[Q]={ch:P[D],bio:i,bioProb:[I[0],I[1],I[2]],cls:M[v],clsId:v}}}let f=this.parse(B),w=performance.now()-n;return{text:e,chars:r,spans:f,ms:w}}modelInfo(){let B=this.weights,n=B.embed.data.length;for(let t of B.conv)n+=t.w.data.length+t.b.length;n+=B.bio.w.data.length+B.bio.b.length,n+=B.cls.w.data.length+B.cls.b.length;let e=B.conv.length?Math.max(...B.conv.map(t=>t.w.shape[0])):B.embed.shape[1];return{version:B.version,params:n,channels:e,embedDim:B.embed.shape[1],vocab:B.embed.shape[0],classes:B.classes.length,layers:B.conv.map(t=>({k:t.k,dilation:t.dilation,residual:t.residual}))}}async parseBatch(B,n={}){let e=n.backend??this.defaultBackend;if(!(e==="webgpu"||e==="auto"&&B.length>=32&&await rA()))return B.map(P=>this.parse(P,{backend:"cpu"}));let r=B,g=B.map(k),f=new Array(B.length),w=[],s=[];for(let P=0;P<g.length;P++)g[P].length<=128?w.push(P):s.push(P);for(let P of s)f[P]=this.parse(r[P],{backend:"cpu"});if(w.length>0){this.gpu||(this.gpu=new _(this.weights));let P=Math.max(...w.map(v=>g[v].length),1),u=x(P),o=w.length,C=new Int32Array(o*u),D=this.charToId.get("<pad>")??0;C.fill(D);for(let v=0;v<o;v++){let h=g[w[v]],b=p(h,this.charToId);C.set(b,v*u)}let{bio:Q,cls:i}=await this.gpu.run(C,o,u),I=this.weights.cls.w.shape[0];for(let v=0;v<o;v++){let h=w[v],b=g[h],L=r[h],H=L.length===b.length,E=b.length,c=new Float32Array(E*3),a=new Float32Array(E*I);for(let l=0;l<E;l++)c.set(Q.subarray((v*u+l)*3,(v*u+l)*3+3),l*3),a.set(i.subarray((v*u+l)*I,(v*u+l)*I+I),l*I);let d={bioLogits:c,clsLogits:a,length:E,nCls:I},F=this.decodeForward(b,d,0,E);if(H)for(let l of F)l.span=L.slice(l.start,l.end);f[h]=F}}return f}},fA=null;function q(){return fA||(fA=new V),fA}function FB(A,B={}){return q().parse(A,B)}function MB(A,B={}){return q().parseBatch(A,B)}function RB(A){return q().inspect(A)}function OB(){return q().modelInfo()}function xB(A={}){return new V(A)}var tB=iA(HA,bA);export{M as CLASSES,V as Parser,xB as createParser,RB as inspect,nA as isWebGPUAvailable,OB as modelInfo,k as normalizeText,FB as parse,MB as parseBatch,rA as probeWebGPU};
|
package/dist/types.d.ts
CHANGED
|
@@ -146,4 +146,122 @@ export interface WeightsJsonInt8 {
|
|
|
146
146
|
b: number[];
|
|
147
147
|
};
|
|
148
148
|
}
|
|
149
|
-
|
|
149
|
+
/** v2 conv layer entry, float form. */
|
|
150
|
+
export interface ConvLayerJsonFloat {
|
|
151
|
+
k: number;
|
|
152
|
+
dilation: number;
|
|
153
|
+
residual: boolean;
|
|
154
|
+
w: {
|
|
155
|
+
shape: number[];
|
|
156
|
+
data: number[];
|
|
157
|
+
};
|
|
158
|
+
b: {
|
|
159
|
+
shape: number[];
|
|
160
|
+
data: number[];
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/** v2 conv layer entry, int8 form. */
|
|
164
|
+
export interface ConvLayerJsonInt8 {
|
|
165
|
+
k: number;
|
|
166
|
+
dilation: number;
|
|
167
|
+
residual: boolean;
|
|
168
|
+
w: {
|
|
169
|
+
shape: number[];
|
|
170
|
+
scale: number;
|
|
171
|
+
data_b64: string;
|
|
172
|
+
};
|
|
173
|
+
b: number[];
|
|
174
|
+
}
|
|
175
|
+
/** Weights JSON version 2, float form: an explicit ordered `conv` layer list
|
|
176
|
+
* instead of the hard-coded conv1..conv4 fields. See CONTRACT.md section 2. */
|
|
177
|
+
export interface WeightsJsonV2Float {
|
|
178
|
+
version: 2;
|
|
179
|
+
charset: string[];
|
|
180
|
+
classes: string[];
|
|
181
|
+
embed_dim?: number;
|
|
182
|
+
channels?: number;
|
|
183
|
+
embed: {
|
|
184
|
+
shape: number[];
|
|
185
|
+
data: number[];
|
|
186
|
+
};
|
|
187
|
+
conv: ConvLayerJsonFloat[];
|
|
188
|
+
bio: {
|
|
189
|
+
w: {
|
|
190
|
+
shape: number[];
|
|
191
|
+
data: number[];
|
|
192
|
+
};
|
|
193
|
+
b: {
|
|
194
|
+
shape: number[];
|
|
195
|
+
data: number[];
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
cls: {
|
|
199
|
+
w: {
|
|
200
|
+
shape: number[];
|
|
201
|
+
data: number[];
|
|
202
|
+
};
|
|
203
|
+
b: {
|
|
204
|
+
shape: number[];
|
|
205
|
+
data: number[];
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/** Weights JSON version 2, int8 form. */
|
|
210
|
+
export interface WeightsJsonV2Int8 {
|
|
211
|
+
version: 2;
|
|
212
|
+
quantized: string;
|
|
213
|
+
charset: string[];
|
|
214
|
+
classes: string[];
|
|
215
|
+
embed_dim?: number;
|
|
216
|
+
channels?: number;
|
|
217
|
+
embed: {
|
|
218
|
+
shape: number[];
|
|
219
|
+
scale: number;
|
|
220
|
+
data_b64: string;
|
|
221
|
+
};
|
|
222
|
+
conv: ConvLayerJsonInt8[];
|
|
223
|
+
bio: {
|
|
224
|
+
w: {
|
|
225
|
+
shape: number[];
|
|
226
|
+
scale: number;
|
|
227
|
+
data_b64: string;
|
|
228
|
+
};
|
|
229
|
+
b: number[];
|
|
230
|
+
};
|
|
231
|
+
cls: {
|
|
232
|
+
w: {
|
|
233
|
+
shape: number[];
|
|
234
|
+
scale: number;
|
|
235
|
+
data_b64: string;
|
|
236
|
+
};
|
|
237
|
+
b: number[];
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export type WeightsJson = WeightsJsonFloat | WeightsJsonInt8 | WeightsJsonV2Float | WeightsJsonV2Int8;
|
|
241
|
+
export interface CharTag {
|
|
242
|
+
ch: string;
|
|
243
|
+
bio: 0 | 1 | 2;
|
|
244
|
+
bioProb: [number, number, number];
|
|
245
|
+
cls: string;
|
|
246
|
+
clsId: number;
|
|
247
|
+
}
|
|
248
|
+
export interface Inspection {
|
|
249
|
+
/** normalized text (see normalizeText()) */
|
|
250
|
+
text: string;
|
|
251
|
+
chars: CharTag[];
|
|
252
|
+
spans: Sankhya[];
|
|
253
|
+
ms: number;
|
|
254
|
+
}
|
|
255
|
+
export interface ModelInfo {
|
|
256
|
+
version: number;
|
|
257
|
+
params: number;
|
|
258
|
+
channels: number;
|
|
259
|
+
embedDim: number;
|
|
260
|
+
vocab: number;
|
|
261
|
+
classes: number;
|
|
262
|
+
layers: Array<{
|
|
263
|
+
k: number;
|
|
264
|
+
dilation: number;
|
|
265
|
+
residual: boolean;
|
|
266
|
+
}>;
|
|
267
|
+
}
|
package/dist/weights.d.ts
CHANGED
|
@@ -4,22 +4,27 @@ export interface Tensor {
|
|
|
4
4
|
data: Float32Array;
|
|
5
5
|
}
|
|
6
6
|
export interface ConvLayer {
|
|
7
|
+
k: number;
|
|
8
|
+
dilation: number;
|
|
9
|
+
residual: boolean;
|
|
10
|
+
padding: number;
|
|
11
|
+
w: Tensor;
|
|
12
|
+
b: Float32Array;
|
|
13
|
+
}
|
|
14
|
+
export interface HeadLayer {
|
|
7
15
|
w: Tensor;
|
|
8
16
|
b: Float32Array;
|
|
9
17
|
}
|
|
10
18
|
export interface LoadedWeights {
|
|
11
|
-
|
|
12
|
-
dilation: number;
|
|
19
|
+
version: number;
|
|
13
20
|
charset: string[];
|
|
14
21
|
classes: string[];
|
|
15
22
|
embed: Tensor;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
conv4?: ConvLayer;
|
|
20
|
-
bio: ConvLayer;
|
|
21
|
-
cls: ConvLayer;
|
|
23
|
+
conv: ConvLayer[];
|
|
24
|
+
bio: HeadLayer;
|
|
25
|
+
cls: HeadLayer;
|
|
22
26
|
}
|
|
23
|
-
/** Load
|
|
24
|
-
* python/sankhya/export.py) into
|
|
27
|
+
/** Load a v1 or v2, float or int8, weights JSON (as written by
|
|
28
|
+
* python/sankhya/export.py) into a normalised LoadedWeights with an ordered
|
|
29
|
+
* `conv` layer list. See CONTRACT.md section 2. */
|
|
25
30
|
export declare function loadWeights(json: WeightsJson): LoadedWeights;
|