@omnid/tinyemo 0.0.0-stage → 1.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.
package/dist/engine.js ADDED
@@ -0,0 +1,537 @@
1
+ import { maybeDecompress } from "./compression.js";
2
+ import { featurize, N_HASHES } from "./features.js";
3
+ import { normalize } from "./normalize.js";
4
+ import { PACKED_CONFIG, PACKED_LABELS } from "./packed-assets.js";
5
+ import { createTinyEmoShaderSource, IN_FLT_STRIDE, IN_INT_STRIDE, WS_STRIDE } from "./shaders.js";
6
+ import { TinyTokenizer } from "./tokenizer.js";
7
+ import { loadPackedTokenizer, loadPackedWeights, loadWeightsFromBuffer, packWeightsForGpu } from "./weights.js";
8
+ export const MAX_OUTPUT = 3;
9
+ // WebGPU buffer usage bitflags (defined as constants so they work even if global GPUBufferUsage is not injected yet)
10
+ const GPU_BUFFER_USAGE = {
11
+ MAP_READ: 0x0001,
12
+ MAP_WRITE: 0x0002,
13
+ COPY_SRC: 0x0004,
14
+ COPY_DST: 0x0008,
15
+ INDEX: 0x0010,
16
+ VERTEX: 0x0020,
17
+ UNIFORM: 0x0040,
18
+ STORAGE: 0x0080,
19
+ INDIRECT: 0x0100,
20
+ QUERY_RESOLVE: 0x0200
21
+ };
22
+ const GPU_SHADER_STAGE = {
23
+ VERTEX: 0x1,
24
+ FRAGMENT: 0x2,
25
+ COMPUTE: 0x4
26
+ };
27
+ const GPU_MAP_MODE = {
28
+ READ: 0x0001,
29
+ WRITE: 0x0002
30
+ };
31
+ /**
32
+ * Numerically stable softmax over a Float32Array.
33
+ */
34
+ export function softmax(logits) {
35
+ const n = logits.length;
36
+ const out = new Float32Array(n);
37
+ if (n === 0)
38
+ return out;
39
+ let maxVal = logits[0];
40
+ for (let i = 1; i < n; i++) {
41
+ if (logits[i] > maxVal)
42
+ maxVal = logits[i];
43
+ }
44
+ let sum = 0.0;
45
+ for (let i = 0; i < n; i++) {
46
+ const e = Math.exp(logits[i] - maxVal);
47
+ out[i] = e;
48
+ sum += e;
49
+ }
50
+ const invSum = 1.0 / sum;
51
+ for (let i = 0; i < n; i++) {
52
+ out[i] *= invSum;
53
+ }
54
+ return out;
55
+ }
56
+ /**
57
+ * Create an EmojiSuggestion object supporting both `{ emoji, probability }` and `[emoji, probability]`.
58
+ */
59
+ export function createSuggestion(emoji, probability, index) {
60
+ const item = {
61
+ emoji,
62
+ probability,
63
+ score: probability,
64
+ index,
65
+ [Symbol.iterator]: function* () {
66
+ yield emoji;
67
+ yield probability;
68
+ }
69
+ };
70
+ Object.defineProperty(item, 0, { value: emoji, enumerable: false });
71
+ Object.defineProperty(item, 1, { value: probability, enumerable: false });
72
+ return item;
73
+ }
74
+ /**
75
+ * Request a WebGPU `GPUDevice` from the global `navigator.gpu`.
76
+ */
77
+ export async function requestWebGpuDevice(adapterOptions) {
78
+ const nav = typeof navigator !== "undefined"
79
+ ? navigator
80
+ : undefined;
81
+ if (!nav?.gpu) {
82
+ throw new Error("WebGPU is not available in this environment (navigator.gpu is undefined). Pass a custom `device` in TinyEmoOptions or enable WebGPU.");
83
+ }
84
+ const adapter = await nav.gpu.requestAdapter(adapterOptions);
85
+ if (!adapter) {
86
+ throw new Error("Failed to acquire a WebGPU adapter (requestAdapter returned null).");
87
+ }
88
+ return adapter.requestDevice();
89
+ }
90
+ /**
91
+ * Pure WebGPU inference engine for the TinyEmo emoji suggestion model.
92
+ */
93
+ export class TinyEmo {
94
+ device;
95
+ config;
96
+ labels;
97
+ tokenizer;
98
+ packedWeights;
99
+ weightsBuffer;
100
+ bindGroupLayout;
101
+ pipelines;
102
+ layerParamsBuffers = [];
103
+ allocatedBatchCap = 0;
104
+ inputsIntBuffer = null;
105
+ inputsFloatBuffer = null;
106
+ workspaceBuffer = null;
107
+ logitsBuffer = null;
108
+ readbackBuffer = null;
109
+ layerBindGroups = [];
110
+ destroyed = false;
111
+ // Serialize GPU queue dispatches when sharing reusable buffers on the same instance
112
+ queueLock = Promise.resolve();
113
+ constructor(device, config, labels, tokenizer, packedWeights) {
114
+ this.device = device;
115
+ this.config = config;
116
+ this.labels = labels;
117
+ this.tokenizer = tokenizer;
118
+ this.packedWeights = packedWeights;
119
+ // Upload all model weights into a single read-only storage GPUBuffer
120
+ const weightByteLen = Math.ceil(packedWeights.buffer.byteLength / 4) * 4;
121
+ this.weightsBuffer = device.createBuffer({
122
+ label: "tinyemo_weights",
123
+ size: weightByteLen,
124
+ usage: GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST,
125
+ mappedAtCreation: true
126
+ });
127
+ new Float32Array(this.weightsBuffer.getMappedRange()).set(packedWeights.buffer);
128
+ this.weightsBuffer.unmap();
129
+ // Create per-layer uniform buffers (64 bytes each)
130
+ const numLayers = Math.max(1, config.n_layers);
131
+ for (let l = 0; l < numLayers; l++) {
132
+ const uBuf = device.createBuffer({
133
+ label: `tinyemo_params_layer_${l}`,
134
+ size: 64,
135
+ usage: GPU_BUFFER_USAGE.UNIFORM | GPU_BUFFER_USAGE.COPY_DST
136
+ });
137
+ this.layerParamsBuffers.push(uBuf);
138
+ }
139
+ this.bindGroupLayout = device.createBindGroupLayout({
140
+ label: "tinyemo_bgl",
141
+ entries: [
142
+ {
143
+ binding: 0,
144
+ visibility: GPU_SHADER_STAGE.COMPUTE,
145
+ buffer: { type: "uniform" }
146
+ },
147
+ {
148
+ binding: 1,
149
+ visibility: GPU_SHADER_STAGE.COMPUTE,
150
+ buffer: { type: "read-only-storage" }
151
+ },
152
+ {
153
+ binding: 2,
154
+ visibility: GPU_SHADER_STAGE.COMPUTE,
155
+ buffer: { type: "read-only-storage" }
156
+ },
157
+ {
158
+ binding: 3,
159
+ visibility: GPU_SHADER_STAGE.COMPUTE,
160
+ buffer: { type: "read-only-storage" }
161
+ },
162
+ {
163
+ binding: 4,
164
+ visibility: GPU_SHADER_STAGE.COMPUTE,
165
+ buffer: { type: "storage" }
166
+ },
167
+ {
168
+ binding: 5,
169
+ visibility: GPU_SHADER_STAGE.COMPUTE,
170
+ buffer: { type: "storage" }
171
+ }
172
+ ]
173
+ });
174
+ const pipelineLayout = device.createPipelineLayout({
175
+ label: "tinyemo_pipeline_layout",
176
+ bindGroupLayouts: [this.bindGroupLayout]
177
+ });
178
+ const shaderSource = createTinyEmoShaderSource(config, packedWeights.offsets);
179
+ const shaderModule = device.createShaderModule({
180
+ label: "tinyemo_shader",
181
+ code: shaderSource
182
+ });
183
+ const mkPipeline = (entryPoint) => device.createComputePipeline({
184
+ label: `tinyemo_${entryPoint}`,
185
+ layout: pipelineLayout,
186
+ compute: {
187
+ module: shaderModule,
188
+ entryPoint
189
+ }
190
+ });
191
+ this.pipelines = {
192
+ ngram: mkPipeline("kernel_ngram"),
193
+ tokEmbed: mkPipeline("kernel_tok_embed"),
194
+ ln1Qkv: mkPipeline("kernel_ln1_qkv"),
195
+ attnProj: mkPipeline("kernel_attn_proj"),
196
+ ln2Ff1: mkPipeline("kernel_ln2_ff1"),
197
+ ff2: mkPipeline("kernel_ff2"),
198
+ finalNormPoolScore: mkPipeline("kernel_final_norm_pool_score"),
199
+ poolAndHead1: mkPipeline("kernel_pool_and_head1"),
200
+ head2: mkPipeline("kernel_head2")
201
+ };
202
+ // Pre-allocate buffers for batch size 1
203
+ this.ensureBatchBuffers(1);
204
+ }
205
+ /**
206
+ * Create and initialize a new TinyEmo WebGPU inference instance.
207
+ * Decompresses the packed safetensors weights and tokenizer using Web `DecompressionStream`
208
+ * unless custom weights/tokenizer buffers are provided.
209
+ */
210
+ static async create(options = {}) {
211
+ const config = options.config ?? PACKED_CONFIG;
212
+ const labels = options.labels ?? PACKED_LABELS;
213
+ const [device, tensors, tokenizer] = await Promise.all([
214
+ options.device ? Promise.resolve(options.device) : requestWebGpuDevice(options.adapterOptions),
215
+ options.weights
216
+ ? loadWeightsFromBuffer(options.weights, options.weightsFormat ?? "auto")
217
+ : loadPackedWeights(),
218
+ options.tokenizer
219
+ ? maybeDecompress(options.tokenizer).then((b) => new TinyTokenizer(b))
220
+ : loadPackedTokenizer()
221
+ ]);
222
+ const packedWeights = packWeightsForGpu(tensors, config);
223
+ return new TinyEmo(device, config, labels, tokenizer, packedWeights);
224
+ }
225
+ ensureBatchBuffers(batchSize) {
226
+ if (batchSize <= this.allocatedBatchCap && this.layerBindGroups.length > 0) {
227
+ return;
228
+ }
229
+ const cap = Math.max(batchSize, 1);
230
+ this.inputsIntBuffer?.destroy();
231
+ this.inputsFloatBuffer?.destroy();
232
+ this.workspaceBuffer?.destroy();
233
+ this.logitsBuffer?.destroy();
234
+ this.readbackBuffer?.destroy();
235
+ this.inputsIntBuffer = this.device.createBuffer({
236
+ label: "tinyemo_inputs_int",
237
+ size: cap * IN_INT_STRIDE * 4,
238
+ usage: GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST
239
+ });
240
+ this.inputsFloatBuffer = this.device.createBuffer({
241
+ label: "tinyemo_inputs_float",
242
+ size: cap * IN_FLT_STRIDE * 4,
243
+ usage: GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_DST
244
+ });
245
+ this.workspaceBuffer = this.device.createBuffer({
246
+ label: "tinyemo_workspace",
247
+ size: cap * WS_STRIDE * 4,
248
+ usage: GPU_BUFFER_USAGE.STORAGE
249
+ });
250
+ this.logitsBuffer = this.device.createBuffer({
251
+ label: "tinyemo_logits",
252
+ size: cap * this.config.n_labels * 4,
253
+ usage: GPU_BUFFER_USAGE.STORAGE | GPU_BUFFER_USAGE.COPY_SRC
254
+ });
255
+ this.readbackBuffer = this.device.createBuffer({
256
+ label: "tinyemo_readback",
257
+ size: cap * this.config.n_labels * 4,
258
+ usage: GPU_BUFFER_USAGE.MAP_READ | GPU_BUFFER_USAGE.COPY_DST
259
+ });
260
+ this.layerBindGroups = this.layerParamsBuffers.map((uBuf, l) => this.device.createBindGroup({
261
+ label: `tinyemo_bg_layer_${l}`,
262
+ layout: this.bindGroupLayout,
263
+ entries: [
264
+ { binding: 0, resource: { buffer: uBuf } },
265
+ { binding: 1, resource: { buffer: this.weightsBuffer } },
266
+ { binding: 2, resource: { buffer: this.inputsIntBuffer } },
267
+ { binding: 3, resource: { buffer: this.inputsFloatBuffer } },
268
+ { binding: 4, resource: { buffer: this.workspaceBuffer } },
269
+ { binding: 5, resource: { buffer: this.logitsBuffer } }
270
+ ]
271
+ }));
272
+ this.allocatedBatchCap = cap;
273
+ }
274
+ /**
275
+ * Normalize input phrase using TinyEmo's normalization rules.
276
+ */
277
+ normalize(text, maxWords) {
278
+ return normalize(text, maxWords);
279
+ }
280
+ /**
281
+ * Encode a single text phrase into token IDs, attention mask, and hashed n-gram features.
282
+ */
283
+ encode(text) {
284
+ const T = this.config.max_tokens;
285
+ const F = this.config.max_features;
286
+ const norm = normalize(text);
287
+ const tokIds = new Uint32Array(T);
288
+ const tokMask = new Uint32Array(T);
289
+ const ids = this.tokenizer.encode(norm, T);
290
+ for (let i = 0; i < ids.length; i++) {
291
+ tokIds[i] = ids[i];
292
+ tokMask[i] = 1;
293
+ }
294
+ const ngBucket = new Uint32Array(F * N_HASHES);
295
+ const ngSign = new Float32Array(F * N_HASHES);
296
+ const { raw, sign, count } = featurize(norm, F);
297
+ for (let i = 0; i < raw.length; i++) {
298
+ ngBucket[i] = raw[i];
299
+ ngSign[i] = sign[i];
300
+ }
301
+ return {
302
+ normalized: norm,
303
+ tokIds,
304
+ tokMask,
305
+ ngBucket,
306
+ ngSign,
307
+ ngCount: Math.max(count, 1)
308
+ };
309
+ }
310
+ /**
311
+ * Encode a batch of text phrases into contiguous typed arrays for WebGPU execution.
312
+ */
313
+ encodeBatch(texts) {
314
+ const B = texts.length;
315
+ const T = this.config.max_tokens;
316
+ const F = this.config.max_features;
317
+ const H = N_HASHES;
318
+ const tokIds = new Uint32Array(B * T);
319
+ const tokMask = new Uint32Array(B * T);
320
+ const ngBucket = new Uint32Array(B * F * H);
321
+ const ngSign = new Float32Array(B * F * H);
322
+ const ngCount = new Float32Array(B);
323
+ for (let b = 0; b < B; b++) {
324
+ const single = this.encode(texts[b]);
325
+ tokIds.set(single.tokIds, b * T);
326
+ tokMask.set(single.tokMask, b * T);
327
+ ngBucket.set(single.ngBucket, b * F * H);
328
+ ngSign.set(single.ngSign, b * F * H);
329
+ ngCount[b] = single.ngCount;
330
+ }
331
+ return {
332
+ batchSize: B,
333
+ maxTokens: T,
334
+ maxFeatures: F,
335
+ tokIds,
336
+ tokMask,
337
+ ngBucket,
338
+ ngSign,
339
+ ngCount
340
+ };
341
+ }
342
+ /**
343
+ * Execute the WebGPU forward pass on an encoded batch, returning a flattened
344
+ * `Float32Array` of shape `[batchSize * n_labels]`.
345
+ */
346
+ async forward(batch) {
347
+ if (this.destroyed) {
348
+ throw new Error("TinyEmo instance has been destroyed.");
349
+ }
350
+ const B = batch.batchSize;
351
+ if (B === 0) {
352
+ return new Float32Array(0);
353
+ }
354
+ const run = async () => {
355
+ this.ensureBatchBuffers(B);
356
+ const T = this.config.max_tokens;
357
+ const F = this.config.max_features;
358
+ const H = N_HASHES;
359
+ const packedInt = new Uint32Array(B * IN_INT_STRIDE);
360
+ const packedFlt = new Float32Array(B * IN_FLT_STRIDE);
361
+ for (let b = 0; b < B; b++) {
362
+ const intBase = b * IN_INT_STRIDE;
363
+ packedInt.set(batch.tokIds.subarray(b * T, (b + 1) * T), intBase);
364
+ packedInt.set(batch.tokMask.subarray(b * T, (b + 1) * T), intBase + T);
365
+ packedInt.set(batch.ngBucket.subarray(b * F * H, (b + 1) * F * H), intBase + 2 * T);
366
+ const fltBase = b * IN_FLT_STRIDE;
367
+ packedFlt.set(batch.ngSign.subarray(b * F * H, (b + 1) * F * H), fltBase);
368
+ packedFlt[fltBase + F * H] = Math.max(batch.ngCount[b], 1);
369
+ }
370
+ this.device.queue.writeBuffer(this.inputsIntBuffer, 0, packedInt);
371
+ this.device.queue.writeBuffer(this.inputsFloatBuffer, 0, packedFlt);
372
+ for (let l = 0; l < this.layerParamsBuffers.length; l++) {
373
+ const layerOff = this.packedWeights.offsets.layers[l];
374
+ const paramsData = new Uint32Array([
375
+ B,
376
+ layerOff.norm1Weight,
377
+ layerOff.norm1Bias,
378
+ layerOff.qkvWeight,
379
+ layerOff.qkvBias,
380
+ layerOff.projWeight,
381
+ layerOff.projBias,
382
+ layerOff.norm2Weight,
383
+ layerOff.norm2Bias,
384
+ layerOff.ff1Weight,
385
+ layerOff.ff1Bias,
386
+ layerOff.ff2Weight,
387
+ layerOff.ff2Bias,
388
+ 0,
389
+ 0,
390
+ 0
391
+ ]);
392
+ this.device.queue.writeBuffer(this.layerParamsBuffers[l], 0, paramsData);
393
+ }
394
+ const encoder = this.device.createCommandEncoder({
395
+ label: "tinyemo_forward_encoder"
396
+ });
397
+ const pass = encoder.beginComputePass({
398
+ label: "tinyemo_forward_pass"
399
+ });
400
+ pass.setBindGroup(0, this.layerBindGroups[0]);
401
+ // 1. N-gram stream: [B, 1, 1]
402
+ pass.setPipeline(this.pipelines.ngram);
403
+ pass.dispatchWorkgroups(B, 1, 1);
404
+ // 2. Token embedding + projection + position: [T, B, 1]
405
+ pass.setPipeline(this.pipelines.tokEmbed);
406
+ pass.dispatchWorkgroups(T, B, 1);
407
+ // 3. Transformer blocks
408
+ for (let l = 0; l < this.config.n_layers; l++) {
409
+ if (l > 0) {
410
+ pass.setBindGroup(0, this.layerBindGroups[l]);
411
+ }
412
+ pass.setPipeline(this.pipelines.ln1Qkv);
413
+ pass.dispatchWorkgroups(T, B, 1);
414
+ pass.setPipeline(this.pipelines.attnProj);
415
+ pass.dispatchWorkgroups(T, B, 1);
416
+ pass.setPipeline(this.pipelines.ln2Ff1);
417
+ pass.dispatchWorkgroups(T, B, 1);
418
+ pass.setPipeline(this.pipelines.ff2);
419
+ pass.dispatchWorkgroups(T, B, 1);
420
+ }
421
+ // 4. Final LayerNorm + attention pool scores: [T, B, 1]
422
+ pass.setPipeline(this.pipelines.finalNormPoolScore);
423
+ pass.dispatchWorkgroups(T, B, 1);
424
+ // 5. Pool softmax + Pool LayerNorm + Concat + Head1 (GELU): [B, 1, 1]
425
+ pass.setPipeline(this.pipelines.poolAndHead1);
426
+ pass.dispatchWorkgroups(B, 1, 1);
427
+ // 6. Head2 output logits: [ceil(812 / 128), B, 1]
428
+ const head2Groups = Math.ceil(this.config.n_labels / 128);
429
+ pass.setPipeline(this.pipelines.head2);
430
+ pass.dispatchWorkgroups(head2Groups, B, 1);
431
+ pass.end();
432
+ const outByteLen = B * this.config.n_labels * 4;
433
+ encoder.copyBufferToBuffer(this.logitsBuffer, 0, this.readbackBuffer, 0, outByteLen);
434
+ this.device.queue.submit([encoder.finish()]);
435
+ await this.readbackBuffer.mapAsync(GPU_MAP_MODE.READ, 0, outByteLen);
436
+ const mapped = new Float32Array(this.readbackBuffer.getMappedRange(0, outByteLen));
437
+ const result = new Float32Array(mapped);
438
+ this.readbackBuffer.unmap();
439
+ return result;
440
+ };
441
+ const next = this.queueLock.then(run, run);
442
+ this.queueLock = next.catch(() => { });
443
+ return next;
444
+ }
445
+ /**
446
+ * Compute raw logits (`Float32Array` of length 812) for a single text phrase on WebGPU.
447
+ */
448
+ async logits(text) {
449
+ const batch = this.encodeBatch([text]);
450
+ return this.forward(batch);
451
+ }
452
+ /**
453
+ * Compute raw logits for a batch of text phrases on WebGPU.
454
+ */
455
+ async logitsBatch(texts, batchSize = 512) {
456
+ if (texts.length === 0) {
457
+ return [];
458
+ }
459
+ const nLabels = this.config.n_labels;
460
+ const results = [];
461
+ for (let i = 0; i < texts.length; i += batchSize) {
462
+ const slice = texts.slice(i, i + batchSize);
463
+ const flat = await this.forward(this.encodeBatch(slice));
464
+ for (let b = 0; b < slice.length; b++) {
465
+ results.push(flat.slice(b * nLabels, (b + 1) * nLabels));
466
+ }
467
+ }
468
+ return results;
469
+ }
470
+ /**
471
+ * Compute softmax probability distribution (`Float32Array` of length 812) for a text phrase.
472
+ */
473
+ async probabilities(text) {
474
+ const rawLogits = await this.logits(text);
475
+ return softmax(rawLogits);
476
+ }
477
+ /**
478
+ * Suggest up to `limit` emojis (clamped to 1..3, default 1) for an input phrase.
479
+ * Returns `[]` if the phrase normalizes to empty string, matching `TinyEmoRuntime.suggest`.
480
+ */
481
+ async suggest(text, limit = 1) {
482
+ const clampedLimit = Math.max(1, Math.min(MAX_OUTPUT, Math.trunc(limit)));
483
+ if (!normalize(text)) {
484
+ return [];
485
+ }
486
+ const probs = await this.probabilities(text);
487
+ return this.topKSuggestionsFromProbs(probs, clampedLimit);
488
+ }
489
+ /**
490
+ * Suggest up to `limit` emojis (clamped to 1..3, default 1) for a batch of phrases
491
+ * in a single WebGPU dispatch.
492
+ */
493
+ async suggestBatch(texts, limit = 1) {
494
+ const clampedLimit = Math.max(1, Math.min(MAX_OUTPUT, Math.trunc(limit)));
495
+ if (texts.length === 0) {
496
+ return [];
497
+ }
498
+ const batchLogits = await this.logitsBatch(texts);
499
+ return texts.map((text, idx) => {
500
+ if (!normalize(text)) {
501
+ return [];
502
+ }
503
+ const probs = softmax(batchLogits[idx]);
504
+ return this.topKSuggestionsFromProbs(probs, clampedLimit);
505
+ });
506
+ }
507
+ topKSuggestionsFromProbs(probs, k) {
508
+ const indices = Array.from({ length: probs.length }, (_, i) => i);
509
+ indices.sort((a, b) => probs[b] - probs[a]);
510
+ const top = indices.slice(0, k);
511
+ return top.map((idx) => createSuggestion(this.labels[idx], probs[idx], idx));
512
+ }
513
+ /**
514
+ * Release all GPU buffers allocated by this TinyEmo instance.
515
+ */
516
+ destroy() {
517
+ if (this.destroyed)
518
+ return;
519
+ this.destroyed = true;
520
+ this.weightsBuffer.destroy();
521
+ for (const uBuf of this.layerParamsBuffers) {
522
+ uBuf.destroy();
523
+ }
524
+ this.inputsIntBuffer?.destroy();
525
+ this.inputsFloatBuffer?.destroy();
526
+ this.workspaceBuffer?.destroy();
527
+ this.logitsBuffer?.destroy();
528
+ this.readbackBuffer?.destroy();
529
+ }
530
+ }
531
+ /**
532
+ * Convenience factory function to create a TinyEmo WebGPU inference instance.
533
+ */
534
+ export async function createTinyEmo(options) {
535
+ return TinyEmo.create(options);
536
+ }
537
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * English-only hashed n-gram features matching tinyemo/en_features.py.
3
+ *
4
+ * Per word: the whole word, plus 3..5-char grams with boundary markers.
5
+ * Between neighbouring words: a word bigram.
6
+ * Each feature is hashed twice (FNV-1a 64); the bucket comes from bits 20..34
7
+ * (15 bits, 0..32767) and the sign from bit 63.
8
+ */
9
+ export declare const FNV_OFFSET = 14695981039346656037n;
10
+ export declare const FNV_PRIME = 1099511628211n;
11
+ export declare const MASK64: bigint;
12
+ export declare const SEEDS: readonly [11400714819323198485n, 14029467366897019727n];
13
+ export declare const N_HASHES: 2;
14
+ export declare const RAW_BITS = 15n;
15
+ /**
16
+ * Compute 64-bit FNV-1a hash of a UTF-8 string with the given 64-bit seed.
17
+ */
18
+ export declare function fnv64(s: string, seed: bigint): bigint;
19
+ /**
20
+ * Extract word, character n-gram (3..5), and word bigram features from normalized text.
21
+ */
22
+ export declare function features(normText: string): string[];
23
+ export type HashPair = readonly [
24
+ readonly [number, number],
25
+ readonly [number, number]
26
+ ];
27
+ /**
28
+ * Compute `((raw0, sign0), (raw1, sign1))` with `raw` in `[0, 32768)` and `sign` in `{-1, 1}`.
29
+ */
30
+ export declare function hash16(feat: string): HashPair;
31
+ /**
32
+ * Featurize normalized text into flattened `[n, 2]` arrays (`raw` and `sign`) up to `maxFeatures`.
33
+ */
34
+ export declare function featurize(normText: string, maxFeatures: number): {
35
+ raw: Int16Array;
36
+ sign: Int8Array;
37
+ count: number;
38
+ };
39
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,UAAU,wBAAsB,CAAC;AAC9C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AACxC,eAAO,MAAM,MAAM,QAAmB,CAAC;AACvC,eAAO,MAAM,KAAK,yDAAsD,CAAC;AACzE,eAAO,MAAM,QAAQ,GAAe,CAAC;AACrC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAK5B;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBnD;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS;IAC9B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;CAC1B,CAAC;AAIF;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAiB7C;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAerD"}