@higher.archi/boe 1.0.3 → 1.0.5

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 (59) hide show
  1. package/dist/engines/scoring/strategy.d.ts.map +1 -1
  2. package/dist/engines/scoring/strategy.js +51 -0
  3. package/dist/engines/scoring/strategy.js.map +1 -1
  4. package/dist/engines/scoring/types.d.ts +1 -0
  5. package/dist/engines/scoring/types.d.ts.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/qfacts/collapse.d.ts +6 -0
  11. package/dist/qfacts/collapse.d.ts.map +1 -0
  12. package/dist/qfacts/collapse.js +95 -0
  13. package/dist/qfacts/collapse.js.map +1 -0
  14. package/dist/qfacts/index.d.ts +5 -0
  15. package/dist/qfacts/index.d.ts.map +1 -0
  16. package/dist/qfacts/index.js +20 -0
  17. package/dist/qfacts/index.js.map +1 -0
  18. package/dist/qfacts/simulate.d.ts +7 -0
  19. package/dist/qfacts/simulate.d.ts.map +1 -0
  20. package/dist/qfacts/simulate.js +19 -0
  21. package/dist/qfacts/simulate.js.map +1 -0
  22. package/dist/qfacts/strategies/crypto.d.ts +2 -0
  23. package/dist/qfacts/strategies/crypto.d.ts.map +1 -0
  24. package/dist/qfacts/strategies/crypto.js +21 -0
  25. package/dist/qfacts/strategies/crypto.js.map +1 -0
  26. package/dist/qfacts/strategies/deterministic.d.ts +2 -0
  27. package/dist/qfacts/strategies/deterministic.d.ts.map +1 -0
  28. package/dist/qfacts/strategies/deterministic.js +15 -0
  29. package/dist/qfacts/strategies/deterministic.js.map +1 -0
  30. package/dist/qfacts/strategies/index.d.ts +8 -0
  31. package/dist/qfacts/strategies/index.d.ts.map +1 -0
  32. package/dist/qfacts/strategies/index.js +29 -0
  33. package/dist/qfacts/strategies/index.js.map +1 -0
  34. package/dist/qfacts/strategies/quasi-random.d.ts +2 -0
  35. package/dist/qfacts/strategies/quasi-random.d.ts.map +1 -0
  36. package/dist/qfacts/strategies/quasi-random.js +26 -0
  37. package/dist/qfacts/strategies/quasi-random.js.map +1 -0
  38. package/dist/qfacts/strategies/seeded.d.ts +2 -0
  39. package/dist/qfacts/strategies/seeded.d.ts.map +1 -0
  40. package/dist/qfacts/strategies/seeded.js +34 -0
  41. package/dist/qfacts/strategies/seeded.js.map +1 -0
  42. package/dist/qfacts/types.d.ts +36 -0
  43. package/dist/qfacts/types.d.ts.map +1 -0
  44. package/dist/qfacts/types.js +3 -0
  45. package/dist/qfacts/types.js.map +1 -0
  46. package/package.json +1 -1
  47. package/src/engines/scoring/strategy.ts +54 -0
  48. package/src/engines/scoring/types.ts +1 -0
  49. package/src/index.ts +6 -0
  50. package/src/qfacts/README.md +243 -0
  51. package/src/qfacts/collapse.ts +111 -0
  52. package/src/qfacts/index.ts +27 -0
  53. package/src/qfacts/simulate.ts +25 -0
  54. package/src/qfacts/strategies/crypto.ts +20 -0
  55. package/src/qfacts/strategies/deterministic.ts +11 -0
  56. package/src/qfacts/strategies/index.ts +25 -0
  57. package/src/qfacts/strategies/quasi-random.ts +23 -0
  58. package/src/qfacts/strategies/seeded.ts +32 -0
  59. package/src/qfacts/types.ts +44 -0
@@ -0,0 +1,23 @@
1
+ function halton(index: number, base: number): number {
2
+ let result = 0;
3
+ let f = 1 / base;
4
+ let i = index;
5
+ while (i > 0) {
6
+ result += f * (i % base);
7
+ i = Math.floor(i / base);
8
+ f /= base;
9
+ }
10
+ return result;
11
+ }
12
+
13
+ export function quasiRandomCollapse(amplitudes: Record<string, number>, index: number): string {
14
+ const roll = halton(index + 1, 2); // +1 to avoid halton(0) = 0
15
+
16
+ const keys = Object.keys(amplitudes);
17
+ let cumulative = 0;
18
+ for (const key of keys) {
19
+ cumulative += amplitudes[key];
20
+ if (roll < cumulative) return key;
21
+ }
22
+ return keys[keys.length - 1];
23
+ }
@@ -0,0 +1,32 @@
1
+ function createRng(seed: number): () => number {
2
+ let state = seed;
3
+ return () => {
4
+ state |= 0;
5
+ state = (state + 0x6d2b79f5) | 0;
6
+ let t = Math.imul(state ^ (state >>> 15), 1 | state);
7
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
8
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
9
+ };
10
+ }
11
+
12
+ function djb2Hash(str: string): number {
13
+ let hash = 5381;
14
+ for (let i = 0; i < str.length; i++) {
15
+ hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;
16
+ }
17
+ return hash >>> 0;
18
+ }
19
+
20
+ export function seededCollapse(amplitudes: Record<string, number>, seed: number, fieldName: string): string {
21
+ const fieldSeed = (seed ^ djb2Hash(fieldName)) >>> 0;
22
+ const rng = createRng(fieldSeed);
23
+ const roll = rng();
24
+
25
+ const keys = Object.keys(amplitudes);
26
+ let cumulative = 0;
27
+ for (const key of keys) {
28
+ cumulative += amplitudes[key];
29
+ if (roll < cumulative) return key;
30
+ }
31
+ return keys[keys.length - 1];
32
+ }
@@ -0,0 +1,44 @@
1
+ import type { FactInput } from '../core';
2
+
3
+ export type AmplitudeValue = number | `${number}%`;
4
+
5
+ export type Superposition = {
6
+ state: 'superposition';
7
+ amplitudes: Record<string, number>;
8
+ };
9
+
10
+ export type QValue = any | Superposition;
11
+
12
+ export type QFactInput = {
13
+ id?: string;
14
+ type: string;
15
+ data: Record<string, QValue>;
16
+ };
17
+
18
+ export type CollapseStrategy = 'seeded' | 'crypto' | 'deterministic' | 'quasi-random';
19
+
20
+ export type CollapseOptions = {
21
+ strategy?: CollapseStrategy;
22
+ seed?: number;
23
+ coerce?: boolean;
24
+ };
25
+
26
+ export type CollapseRecord = {
27
+ field: string;
28
+ selectedValue: any;
29
+ amplitudes: Record<string, number>;
30
+ strategy: CollapseStrategy;
31
+ seed?: number;
32
+ };
33
+
34
+ export type CollapsedFact = {
35
+ fact: FactInput;
36
+ collapseLog: CollapseRecord[];
37
+ };
38
+
39
+ export type SimulationResult<T = any> = {
40
+ runs: number;
41
+ results: T[];
42
+ collapseHistory: CollapseRecord[][];
43
+ strategy: CollapseStrategy;
44
+ };