ai-experiments 2.1.3 → 2.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +13 -1
  3. package/package.json +16 -16
  4. package/src/clickhouse-storage.ts +698 -0
  5. package/src/decide.ts +8 -10
  6. package/src/experiment.ts +12 -12
  7. package/src/index.ts +13 -3
  8. package/src/tracking.ts +3 -3
  9. package/test/cartesian.test.ts +287 -0
  10. package/test/clickhouse-storage.test.ts +470 -0
  11. package/test/decide.test.ts +414 -0
  12. package/test/experiment.test.ts +473 -0
  13. package/test/tracking.test.ts +347 -0
  14. package/vitest.config.ts +34 -0
  15. package/.turbo/turbo-build.log +0 -4
  16. package/LICENSE +0 -21
  17. package/dist/cartesian.d.ts +0 -140
  18. package/dist/cartesian.d.ts.map +0 -1
  19. package/dist/cartesian.js +0 -216
  20. package/dist/cartesian.js.map +0 -1
  21. package/dist/chdb-storage.d.ts +0 -135
  22. package/dist/chdb-storage.d.ts.map +0 -1
  23. package/dist/chdb-storage.js +0 -468
  24. package/dist/chdb-storage.js.map +0 -1
  25. package/dist/decide.d.ts +0 -152
  26. package/dist/decide.d.ts.map +0 -1
  27. package/dist/decide.js +0 -329
  28. package/dist/decide.js.map +0 -1
  29. package/dist/experiment.d.ts +0 -53
  30. package/dist/experiment.d.ts.map +0 -1
  31. package/dist/experiment.js +0 -292
  32. package/dist/experiment.js.map +0 -1
  33. package/dist/index.d.ts +0 -16
  34. package/dist/index.d.ts.map +0 -1
  35. package/dist/index.js +0 -21
  36. package/dist/index.js.map +0 -1
  37. package/dist/tracking.d.ts +0 -159
  38. package/dist/tracking.d.ts.map +0 -1
  39. package/dist/tracking.js +0 -310
  40. package/dist/tracking.js.map +0 -1
  41. package/dist/types.d.ts +0 -198
  42. package/dist/types.d.ts.map +0 -1
  43. package/dist/types.js +0 -5
  44. package/dist/types.js.map +0 -1
  45. package/src/cartesian.js +0 -215
  46. package/src/chdb-storage.js +0 -464
  47. package/src/chdb-storage.ts +0 -567
  48. package/src/decide.js +0 -328
  49. package/src/experiment.js +0 -291
  50. package/src/index.js +0 -20
  51. package/src/tracking.js +0 -309
  52. package/src/types.js +0 -4
@@ -1,468 +0,0 @@
1
- /**
2
- * ClickHouse storage backend for AI experiments using chdb (embedded ClickHouse)
3
- *
4
- * Design: Single flat table where experiment events are the atomic unit.
5
- * Cartesian product results, variant comparisons, and winner analysis
6
- * are all derived via aggregation queries.
7
- *
8
- * This maximizes compression and enables fast analytical queries across
9
- * thousands of experiment runs.
10
- */
11
- import { Session } from 'chdb';
12
- const CREATE_TABLE_SQL = `
13
- CREATE TABLE IF NOT EXISTS experiments (
14
- -- Event identity
15
- eventId String,
16
- eventType LowCardinality(String),
17
- timestamp DateTime64(3),
18
-
19
- -- Experiment context
20
- experimentId String,
21
- experimentName String DEFAULT '',
22
-
23
- -- Variant context
24
- variantId String DEFAULT '',
25
- variantName String DEFAULT '',
26
-
27
- -- Cartesian product dimensions (stored as JSON for flexibility)
28
- dimensions String DEFAULT '{}',
29
-
30
- -- Execution data
31
- runId String DEFAULT '',
32
- success UInt8 DEFAULT 1,
33
- durationMs UInt32 DEFAULT 0,
34
-
35
- -- Result data
36
- result String DEFAULT '{}',
37
- metricName LowCardinality(String) DEFAULT '',
38
- metricValue Float64 DEFAULT 0,
39
-
40
- -- Error tracking
41
- errorMessage String DEFAULT '',
42
- errorStack String DEFAULT '',
43
-
44
- -- Metadata
45
- metadata String DEFAULT '{}'
46
- )
47
- ENGINE = MergeTree()
48
- ORDER BY (experimentId, variantId, timestamp, eventId)
49
- SETTINGS index_granularity = 8192
50
- `;
51
- export class ChdbStorage {
52
- options;
53
- session;
54
- initialized = false;
55
- eventCounter = 0;
56
- constructor(options = {}) {
57
- this.options = options;
58
- this.session = new Session(options.dataPath ?? './.experiments-chdb');
59
- }
60
- async init() {
61
- if (this.initialized)
62
- return;
63
- if (this.options.autoInit !== false) {
64
- this.session.query(CREATE_TABLE_SQL);
65
- }
66
- this.initialized = true;
67
- }
68
- escapeString(s) {
69
- return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
70
- }
71
- toJson(value) {
72
- return JSON.stringify(value ?? {});
73
- }
74
- parseJson(value) {
75
- try {
76
- return JSON.parse(value || '{}');
77
- }
78
- catch {
79
- return {};
80
- }
81
- }
82
- nextEventId() {
83
- return `evt-${Date.now()}-${++this.eventCounter}`;
84
- }
85
- // ─────────────────────────────────────────────────────────────────────────────
86
- // TrackingBackend Implementation
87
- // ─────────────────────────────────────────────────────────────────────────────
88
- async track(event) {
89
- await this.init();
90
- const eventId = this.nextEventId();
91
- const timestamp = event.timestamp.toISOString();
92
- const data = event.data;
93
- // Extract standard fields from event data
94
- const experimentId = String(data.experimentId ?? '');
95
- const experimentName = String(data.experimentName ?? '');
96
- const variantId = String(data.variantId ?? '');
97
- const variantName = String(data.variantName ?? '');
98
- const runId = String(data.runId ?? '');
99
- const success = data.success !== false ? 1 : 0;
100
- const durationMs = Number(data.duration ?? data.durationMs ?? 0);
101
- const metricName = String(data.metricName ?? '');
102
- const metricValue = Number(data.metricValue ?? 0);
103
- const errorMessage = data.error instanceof Error ? data.error.message : String(data.errorMessage ?? '');
104
- const errorStack = data.error instanceof Error ? (data.error.stack ?? '') : '';
105
- // Extract dimensions (for cartesian product tracking)
106
- const dimensions = data.dimensions ?? data.config ?? {};
107
- const result = data.result ?? {};
108
- const metadata = data.metadata ?? {};
109
- this.session.query(`
110
- INSERT INTO experiments (
111
- eventId, eventType, timestamp,
112
- experimentId, experimentName,
113
- variantId, variantName,
114
- dimensions, runId, success, durationMs,
115
- result, metricName, metricValue,
116
- errorMessage, errorStack, metadata
117
- ) VALUES (
118
- '${eventId}', '${event.type}', '${timestamp}',
119
- '${this.escapeString(experimentId)}', '${this.escapeString(experimentName)}',
120
- '${this.escapeString(variantId)}', '${this.escapeString(variantName)}',
121
- '${this.escapeString(this.toJson(dimensions))}',
122
- '${this.escapeString(runId)}', ${success}, ${durationMs},
123
- '${this.escapeString(this.toJson(result))}',
124
- '${this.escapeString(metricName)}', ${metricValue},
125
- '${this.escapeString(errorMessage)}', '${this.escapeString(errorStack)}',
126
- '${this.escapeString(this.toJson(metadata))}'
127
- )
128
- `);
129
- }
130
- async flush() {
131
- // chdb writes are synchronous, nothing to flush
132
- }
133
- // ─────────────────────────────────────────────────────────────────────────────
134
- // Experiment Result Storage (direct API)
135
- // ─────────────────────────────────────────────────────────────────────────────
136
- async storeResult(result) {
137
- await this.track({
138
- type: 'variant.complete',
139
- timestamp: result.completedAt,
140
- data: {
141
- experimentId: result.experimentId,
142
- variantId: result.variantId,
143
- variantName: result.variantName,
144
- runId: result.runId,
145
- success: result.success,
146
- duration: result.duration,
147
- result: result.result,
148
- metricValue: result.metricValue,
149
- error: result.error,
150
- metadata: result.metadata,
151
- },
152
- });
153
- }
154
- async storeResults(results) {
155
- for (const result of results) {
156
- await this.storeResult(result);
157
- }
158
- }
159
- // ─────────────────────────────────────────────────────────────────────────────
160
- // Analytics Queries
161
- // ─────────────────────────────────────────────────────────────────────────────
162
- /**
163
- * Get all experiments
164
- */
165
- async getExperiments() {
166
- await this.init();
167
- const result = this.session.query(`
168
- SELECT
169
- experimentId,
170
- any(experimentName) AS experimentName,
171
- uniq(variantId) AS variantCount,
172
- count() AS runCount,
173
- min(timestamp) AS firstRun,
174
- max(timestamp) AS lastRun
175
- FROM experiments
176
- WHERE experimentId != '' AND eventType = 'variant.complete'
177
- GROUP BY experimentId
178
- ORDER BY lastRun DESC
179
- `, 'JSONEachRow');
180
- if (!result.trim())
181
- return [];
182
- return result.trim().split('\n')
183
- .filter(Boolean)
184
- .map(line => JSON.parse(line));
185
- }
186
- /**
187
- * Get variant performance for an experiment
188
- */
189
- async getVariantStats(experimentId) {
190
- await this.init();
191
- const result = this.session.query(`
192
- SELECT
193
- variantId,
194
- any(variantName) AS variantName,
195
- count() AS runCount,
196
- countIf(success = 1) AS successCount,
197
- countIf(success = 1) / count() AS successRate,
198
- avg(durationMs) AS avgDuration,
199
- avg(metricValue) AS avgMetric,
200
- min(metricValue) AS minMetric,
201
- max(metricValue) AS maxMetric
202
- FROM experiments
203
- WHERE experimentId = '${this.escapeString(experimentId)}'
204
- AND eventType = 'variant.complete'
205
- GROUP BY variantId
206
- ORDER BY avgMetric DESC
207
- `, 'JSONEachRow');
208
- if (!result.trim())
209
- return [];
210
- return result.trim().split('\n')
211
- .filter(Boolean)
212
- .map(line => {
213
- const row = JSON.parse(line);
214
- return {
215
- ...row,
216
- runCount: Number(row.runCount),
217
- successCount: Number(row.successCount),
218
- successRate: Number(row.successRate),
219
- avgDuration: Number(row.avgDuration),
220
- avgMetric: Number(row.avgMetric),
221
- minMetric: Number(row.minMetric),
222
- maxMetric: Number(row.maxMetric),
223
- };
224
- });
225
- }
226
- /**
227
- * Get the best performing variant for an experiment
228
- */
229
- async getBestVariant(experimentId, options = {}) {
230
- const { metric = 'avgMetric', minimumRuns = 1 } = options;
231
- await this.init();
232
- const orderBy = metric === 'avgDuration' ? 'ASC' : 'DESC';
233
- const metricExpr = metric === 'successRate'
234
- ? 'countIf(success = 1) / count()'
235
- : metric === 'avgDuration'
236
- ? 'avg(durationMs)'
237
- : 'avg(metricValue)';
238
- const result = this.session.query(`
239
- SELECT
240
- variantId,
241
- any(variantName) AS variantName,
242
- ${metricExpr} AS metricValue,
243
- count() AS runCount
244
- FROM experiments
245
- WHERE experimentId = '${this.escapeString(experimentId)}'
246
- AND eventType = 'variant.complete'
247
- GROUP BY variantId
248
- HAVING runCount >= ${minimumRuns}
249
- ORDER BY metricValue ${orderBy}
250
- LIMIT 1
251
- `, 'JSONEachRow');
252
- if (!result.trim())
253
- return null;
254
- const firstLine = result.trim().split('\n')[0];
255
- if (!firstLine)
256
- return null;
257
- const row = JSON.parse(firstLine);
258
- return {
259
- variantId: row.variantId,
260
- variantName: row.variantName,
261
- metricValue: Number(row.metricValue),
262
- runCount: Number(row.runCount),
263
- };
264
- }
265
- /**
266
- * Get cartesian product analysis - performance by dimension values
267
- */
268
- async getCartesianAnalysis(experimentId, dimension) {
269
- await this.init();
270
- const result = this.session.query(`
271
- SELECT
272
- JSONExtractString(dimensions, '${this.escapeString(dimension)}') AS dimensionValue,
273
- count() AS runCount,
274
- avg(metricValue) AS avgMetric,
275
- countIf(success = 1) / count() AS successRate
276
- FROM experiments
277
- WHERE experimentId = '${this.escapeString(experimentId)}'
278
- AND eventType = 'variant.complete'
279
- AND dimensionValue != ''
280
- GROUP BY dimensionValue
281
- ORDER BY avgMetric DESC
282
- `, 'JSONEachRow');
283
- if (!result.trim())
284
- return [];
285
- return result.trim().split('\n')
286
- .filter(Boolean)
287
- .map(line => {
288
- const row = JSON.parse(line);
289
- return {
290
- dimensionValue: row.dimensionValue,
291
- runCount: Number(row.runCount),
292
- avgMetric: Number(row.avgMetric),
293
- successRate: Number(row.successRate),
294
- };
295
- });
296
- }
297
- /**
298
- * Get multi-dimensional cartesian analysis
299
- */
300
- async getCartesianGrid(experimentId, dimensions) {
301
- await this.init();
302
- const dimExtracts = dimensions.map(d => `JSONExtractString(dimensions, '${this.escapeString(d)}') AS dim_${d}`).join(', ');
303
- const dimGroupBy = dimensions.map(d => `dim_${d}`).join(', ');
304
- const result = this.session.query(`
305
- SELECT
306
- ${dimExtracts},
307
- count() AS runCount,
308
- avg(metricValue) AS avgMetric,
309
- countIf(success = 1) / count() AS successRate
310
- FROM experiments
311
- WHERE experimentId = '${this.escapeString(experimentId)}'
312
- AND eventType = 'variant.complete'
313
- GROUP BY ${dimGroupBy}
314
- ORDER BY avgMetric DESC
315
- `, 'JSONEachRow');
316
- if (!result.trim())
317
- return [];
318
- return result.trim().split('\n')
319
- .filter(Boolean)
320
- .map(line => {
321
- const row = JSON.parse(line);
322
- const dims = {};
323
- for (const d of dimensions) {
324
- dims[d] = row[`dim_${d}`];
325
- }
326
- return {
327
- dimensions: dims,
328
- runCount: Number(row.runCount),
329
- avgMetric: Number(row.avgMetric),
330
- successRate: Number(row.successRate),
331
- };
332
- });
333
- }
334
- /**
335
- * Get time series of experiment metrics
336
- */
337
- async getTimeSeries(experimentId, options = {}) {
338
- const { interval = 'day', variantId } = options;
339
- await this.init();
340
- const dateFunc = interval === 'hour'
341
- ? 'toStartOfHour(timestamp)'
342
- : interval === 'week'
343
- ? 'toStartOfWeek(timestamp)'
344
- : 'toStartOfDay(timestamp)';
345
- const variantFilter = variantId
346
- ? `AND variantId = '${this.escapeString(variantId)}'`
347
- : '';
348
- const result = this.session.query(`
349
- SELECT
350
- ${dateFunc} AS period,
351
- count() AS runCount,
352
- avg(metricValue) AS avgMetric,
353
- countIf(success = 1) / count() AS successRate
354
- FROM experiments
355
- WHERE experimentId = '${this.escapeString(experimentId)}'
356
- AND eventType = 'variant.complete'
357
- ${variantFilter}
358
- GROUP BY period
359
- ORDER BY period ASC
360
- `, 'JSONEachRow');
361
- if (!result.trim())
362
- return [];
363
- return result.trim().split('\n')
364
- .filter(Boolean)
365
- .map(line => {
366
- const row = JSON.parse(line);
367
- return {
368
- period: row.period,
369
- runCount: Number(row.runCount),
370
- avgMetric: Number(row.avgMetric),
371
- successRate: Number(row.successRate),
372
- };
373
- });
374
- }
375
- /**
376
- * Get raw events for an experiment
377
- */
378
- async getEvents(experimentId, options = {}) {
379
- const { eventType, variantId, limit = 100 } = options;
380
- await this.init();
381
- const filters = [`experimentId = '${this.escapeString(experimentId)}'`];
382
- if (eventType)
383
- filters.push(`eventType = '${this.escapeString(eventType)}'`);
384
- if (variantId)
385
- filters.push(`variantId = '${this.escapeString(variantId)}'`);
386
- const result = this.session.query(`
387
- SELECT
388
- eventType,
389
- timestamp,
390
- experimentId,
391
- experimentName,
392
- variantId,
393
- variantName,
394
- dimensions,
395
- runId,
396
- success,
397
- durationMs,
398
- result,
399
- metricName,
400
- metricValue,
401
- errorMessage,
402
- metadata
403
- FROM experiments
404
- WHERE ${filters.join(' AND ')}
405
- ORDER BY timestamp DESC
406
- LIMIT ${limit}
407
- `, 'JSONEachRow');
408
- if (!result.trim())
409
- return [];
410
- return result.trim().split('\n')
411
- .filter(Boolean)
412
- .map(line => {
413
- const row = JSON.parse(line);
414
- return {
415
- type: row.eventType,
416
- timestamp: new Date(row.timestamp),
417
- data: {
418
- experimentId: row.experimentId,
419
- experimentName: row.experimentName,
420
- variantId: row.variantId,
421
- variantName: row.variantName,
422
- dimensions: this.parseJson(row.dimensions),
423
- runId: row.runId,
424
- success: row.success === 1,
425
- duration: row.durationMs,
426
- result: this.parseJson(row.result),
427
- metricName: row.metricName,
428
- metricValue: row.metricValue,
429
- errorMessage: row.errorMessage,
430
- metadata: this.parseJson(row.metadata),
431
- },
432
- };
433
- });
434
- }
435
- /**
436
- * Raw SQL query access for custom analytics
437
- */
438
- query(sql, format = 'JSONEachRow') {
439
- return this.session.query(sql, format);
440
- }
441
- /**
442
- * Close the storage (cleanup)
443
- */
444
- close() {
445
- // Session cleanup handled by chdb
446
- }
447
- }
448
- /**
449
- * Create a chdb storage backend for experiments
450
- *
451
- * @example
452
- * ```ts
453
- * import { configureTracking } from 'ai-experiments'
454
- * import { createChdbBackend } from 'ai-experiments/storage'
455
- *
456
- * const storage = createChdbBackend({ dataPath: './.my-experiments' })
457
- *
458
- * configureTracking({ backend: storage })
459
- *
460
- * // Later: analyze results
461
- * const best = await storage.getBestVariant('my-experiment')
462
- * console.log(`Best variant: ${best.variantName} (${best.metricValue})`)
463
- * ```
464
- */
465
- export function createChdbBackend(options) {
466
- return new ChdbStorage(options);
467
- }
468
- //# sourceMappingURL=chdb-storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chdb-storage.js","sourceRoot":"","sources":["../src/chdb-storage.ts"],"names":[],"mappings":"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"}
package/dist/decide.d.ts DELETED
@@ -1,152 +0,0 @@
1
- /**
2
- * Decision making utilities
3
- */
4
- import type { DecideOptions, DecisionResult } from './types.js';
5
- /**
6
- * Make a decision by evaluating and scoring multiple options
7
- *
8
- * Scores each option and returns the best one (highest score).
9
- *
10
- * @example
11
- * ```ts
12
- * import { decide } from 'ai-experiments'
13
- *
14
- * // Simple decision with sync scoring
15
- * const result = await decide({
16
- * options: ['apple', 'banana', 'orange'],
17
- * score: (fruit) => {
18
- * const prices = { apple: 1.5, banana: 0.5, orange: 2.0 }
19
- * return 1 / prices[fruit] // Lower price = higher score
20
- * },
21
- * })
22
- * console.log(result.selected) // 'banana'
23
- *
24
- * // Decision with async scoring (AI-based)
25
- * const result = await decide({
26
- * options: [
27
- * { prompt: 'Summarize in one sentence' },
28
- * { prompt: 'Provide a detailed summary' },
29
- * { prompt: 'Extract key points only' },
30
- * ],
31
- * score: async (option) => {
32
- * const result = await ai.generate(option)
33
- * return evaluateQuality(result)
34
- * },
35
- * context: 'Choosing best summarization approach',
36
- * })
37
- *
38
- * // Get all options sorted by score
39
- * const result = await decide({
40
- * options: ['fast', 'accurate', 'balanced'],
41
- * score: (approach) => evaluateApproach(approach),
42
- * returnAll: true,
43
- * })
44
- * console.log(result.allOptions)
45
- * // [
46
- * // { option: 'balanced', score: 0.9 },
47
- * // { option: 'accurate', score: 0.85 },
48
- * // { option: 'fast', score: 0.7 },
49
- * // ]
50
- * ```
51
- */
52
- export declare function decide<T>(options: DecideOptions<T>): Promise<DecisionResult<T>>;
53
- /**
54
- * Weighted random selection from options
55
- *
56
- * Each option has a weight, and selection probability is proportional to weight.
57
- *
58
- * @example
59
- * ```ts
60
- * import { decideWeighted } from 'ai-experiments'
61
- *
62
- * const result = decideWeighted([
63
- * { value: 'A', weight: 0.7 }, // 70% chance
64
- * { value: 'B', weight: 0.2 }, // 20% chance
65
- * { value: 'C', weight: 0.1 }, // 10% chance
66
- * ])
67
- *
68
- * console.log(result) // Most likely 'A', but could be B or C
69
- * ```
70
- */
71
- export declare function decideWeighted<T>(options: Array<{
72
- value: T;
73
- weight: number;
74
- }>): T;
75
- /**
76
- * Epsilon-greedy decision strategy
77
- *
78
- * With probability epsilon, select a random option (exploration).
79
- * Otherwise, select the best option by score (exploitation).
80
- *
81
- * @example
82
- * ```ts
83
- * import { decideEpsilonGreedy } from 'ai-experiments'
84
- *
85
- * const result = await decideEpsilonGreedy({
86
- * options: ['model-a', 'model-b', 'model-c'],
87
- * score: async (model) => await evaluateModel(model),
88
- * epsilon: 0.1, // 10% exploration, 90% exploitation
89
- * })
90
- * ```
91
- */
92
- export declare function decideEpsilonGreedy<T>(options: DecideOptions<T> & {
93
- epsilon: number;
94
- }): Promise<DecisionResult<T>>;
95
- /**
96
- * Thompson sampling decision strategy
97
- *
98
- * Bayesian approach to balancing exploration and exploitation.
99
- * Each option has a Beta distribution representing our belief about its true score.
100
- *
101
- * @example
102
- * ```ts
103
- * import { decideThompsonSampling } from 'ai-experiments'
104
- *
105
- * // Track successes and failures for each option
106
- * const priors = {
107
- * 'variant-a': { alpha: 10, beta: 5 }, // 10 successes, 5 failures
108
- * 'variant-b': { alpha: 8, beta: 3 }, // 8 successes, 3 failures
109
- * 'variant-c': { alpha: 2, beta: 2 }, // 2 successes, 2 failures (uncertain)
110
- * }
111
- *
112
- * const result = decideThompsonSampling(['variant-a', 'variant-b', 'variant-c'], priors)
113
- * // More likely to select 'variant-b' (higher rate) but will sometimes explore 'variant-c'
114
- * ```
115
- */
116
- export declare function decideThompsonSampling<T extends string>(options: T[], priors: Record<T, {
117
- alpha: number;
118
- beta: number;
119
- }>): T;
120
- /**
121
- * Upper Confidence Bound (UCB) decision strategy
122
- *
123
- * Select the option with the highest upper confidence bound.
124
- * Balances exploration and exploitation using confidence intervals.
125
- *
126
- * @example
127
- * ```ts
128
- * import { decideUCB } from 'ai-experiments'
129
- *
130
- * const stats = {
131
- * 'variant-a': { mean: 0.85, count: 100 },
132
- * 'variant-b': { mean: 0.82, count: 50 }, // Less data, higher uncertainty
133
- * 'variant-c': { mean: 0.78, count: 10 }, // Very uncertain
134
- * }
135
- *
136
- * const result = decideUCB(['variant-a', 'variant-b', 'variant-c'], stats, {
137
- * explorationFactor: 2.0,
138
- * totalCount: 160,
139
- * })
140
- * // Might select variant-c to explore more, despite lower mean
141
- * ```
142
- */
143
- export declare function decideUCB<T extends string>(options: T[], stats: Record<T, {
144
- mean: number;
145
- count: number;
146
- }>, config: {
147
- /** Exploration factor (typically 1-2) */
148
- explorationFactor: number;
149
- /** Total number of trials across all options */
150
- totalCount: number;
151
- }): T;
152
- //# sourceMappingURL=decide.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA2C5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3C,CAAC,CA0BH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA6C5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,CAAC,CA+BH;AAuDD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,MAAM,EAAE;IACN,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAA;IACzB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAA;CACnB,GACA,CAAC,CAwCH"}