@uwmd/core 1.7.0 → 1.8.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 (89) hide show
  1. package/dist/agents/bancroft.js +4 -1
  2. package/dist/agents/bancroft.js.map +1 -1
  3. package/dist/asset-class.d.ts +98 -0
  4. package/dist/asset-class.d.ts.map +1 -0
  5. package/dist/asset-class.js +226 -0
  6. package/dist/asset-class.js.map +1 -0
  7. package/dist/browser.d.ts +21 -7
  8. package/dist/browser.d.ts.map +1 -1
  9. package/dist/browser.js +22 -4
  10. package/dist/browser.js.map +1 -1
  11. package/dist/calc/errors.d.ts +1 -1
  12. package/dist/calc/errors.d.ts.map +1 -1
  13. package/dist/calc/errors.js.map +1 -1
  14. package/dist/calc/evaluator.js +25 -1
  15. package/dist/calc/evaluator.js.map +1 -1
  16. package/dist/calc/prng.d.ts +59 -0
  17. package/dist/calc/prng.d.ts.map +1 -0
  18. package/dist/calc/prng.js +181 -0
  19. package/dist/calc/prng.js.map +1 -0
  20. package/dist/calc/sensitivity.d.ts +76 -0
  21. package/dist/calc/sensitivity.d.ts.map +1 -0
  22. package/dist/calc/sensitivity.js +160 -0
  23. package/dist/calc/sensitivity.js.map +1 -0
  24. package/dist/calc/stochastic.d.ts +97 -0
  25. package/dist/calc/stochastic.d.ts.map +1 -0
  26. package/dist/calc/stochastic.js +265 -0
  27. package/dist/calc/stochastic.js.map +1 -0
  28. package/dist/cascade.d.ts.map +1 -1
  29. package/dist/cascade.js +8 -4
  30. package/dist/cascade.js.map +1 -1
  31. package/dist/cli-args.d.ts +37 -0
  32. package/dist/cli-args.d.ts.map +1 -0
  33. package/dist/cli-args.js +93 -0
  34. package/dist/cli-args.js.map +1 -0
  35. package/dist/cli.js +119 -72
  36. package/dist/cli.js.map +1 -1
  37. package/dist/editor.js +25 -6
  38. package/dist/editor.js.map +1 -1
  39. package/dist/index.d.ts +22 -8
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +23 -4
  42. package/dist/index.js.map +1 -1
  43. package/dist/init.d.ts.map +1 -1
  44. package/dist/init.js +16 -4
  45. package/dist/init.js.map +1 -1
  46. package/dist/integrity-canonical.d.ts.map +1 -1
  47. package/dist/integrity-canonical.js +10 -2
  48. package/dist/integrity-canonical.js.map +1 -1
  49. package/dist/integrity.d.ts +92 -4
  50. package/dist/integrity.d.ts.map +1 -1
  51. package/dist/integrity.js +195 -9
  52. package/dist/integrity.js.map +1 -1
  53. package/dist/migrate-source-tags.d.ts +34 -0
  54. package/dist/migrate-source-tags.d.ts.map +1 -0
  55. package/dist/migrate-source-tags.js +179 -0
  56. package/dist/migrate-source-tags.js.map +1 -0
  57. package/dist/module-runtime.d.ts +57 -0
  58. package/dist/module-runtime.d.ts.map +1 -0
  59. package/dist/module-runtime.js +167 -0
  60. package/dist/module-runtime.js.map +1 -0
  61. package/dist/module-signing.d.ts +85 -0
  62. package/dist/module-signing.d.ts.map +1 -0
  63. package/dist/module-signing.js +136 -0
  64. package/dist/module-signing.js.map +1 -0
  65. package/dist/modules.d.ts +42 -0
  66. package/dist/modules.d.ts.map +1 -1
  67. package/dist/modules.js +124 -1
  68. package/dist/modules.js.map +1 -1
  69. package/dist/parser.d.ts.map +1 -1
  70. package/dist/parser.js +27 -1
  71. package/dist/parser.js.map +1 -1
  72. package/dist/protocol.d.ts +191 -21
  73. package/dist/protocol.d.ts.map +1 -1
  74. package/dist/protocol.js +289 -32
  75. package/dist/protocol.js.map +1 -1
  76. package/dist/runner.d.ts.map +1 -1
  77. package/dist/runner.js +9 -3
  78. package/dist/runner.js.map +1 -1
  79. package/dist/types.d.ts +118 -5
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js +44 -0
  82. package/dist/types.js.map +1 -1
  83. package/dist/validator.d.ts +26 -2
  84. package/dist/validator.d.ts.map +1 -1
  85. package/dist/validator.js +201 -19
  86. package/dist/validator.js.map +1 -1
  87. package/dist/version.d.ts +1 -1
  88. package/dist/version.js +1 -1
  89. package/package.json +6 -2
@@ -1,5 +1,5 @@
1
1
  import type { ProtocolError } from '../protocol.js';
2
- export type CalcErrorCode = 'CALC-PARSE-001' | 'CALC-RESOLVE-001' | 'CALC-TYPE-001' | 'CALC-DIV-ZERO' | 'CALC-IRR-DIVERGE' | 'CALC-LIMIT-001';
2
+ export type CalcErrorCode = 'CALC-PARSE-001' | 'CALC-RESOLVE-001' | 'CALC-TYPE-001' | 'CALC-DIV-ZERO' | 'CALC-IRR-DIVERGE' | 'CALC-LIMIT-001' | 'CALC-SENS-001' | 'CALC-SENS-002' | 'CALC-SENS-003' | 'CALC-SENS-004' | 'CALC-SENS-005' | 'CALC-STOCH-001' | 'CALC-STOCH-002' | 'CALC-STOCH-003' | 'CALC-STOCH-004' | 'CALC-STOCH-005' | 'CALC-STOCH-006';
3
3
  export declare function calcError(code: CalcErrorCode, message: string, pointer?: string): ProtocolError;
4
4
  export declare class CalcError extends Error {
5
5
  readonly proto: ProtocolError;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/calc/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAO/F;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;gBAClB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAInE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/calc/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAKhB,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GAIf,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAO/F;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;gBAClB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAInE"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/calc/errors.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,uCAAuC;AAYvC,MAAM,UAAU,SAAS,CAAC,IAAmB,EAAE,OAAe,EAAE,OAAgB;IAC9E,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,KAAK,CAAgB;IAC9B,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAgB;QAChE,KAAK,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/calc/errors.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,uCAAuC;AA8BvC,MAAM,UAAU,SAAS,CAAC,IAAmB,EAAE,OAAe,EAAE,OAAgB;IAC9E,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,KAAK,CAAgB;IAC9B,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAgB;QAChE,KAAK,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -15,9 +15,18 @@ function evalNode(expr, ctx, state) {
15
15
  switch (expr.kind) {
16
16
  case 'literal':
17
17
  return expr.value;
18
- case 'ident':
18
+ case 'ident': {
19
+ const overridden = lookupOverride(expr.name, ctx);
20
+ if (overridden !== undefined)
21
+ return overridden;
19
22
  return resolveIdentifier(expr.name, ctx);
23
+ }
20
24
  case 'path': {
25
+ // The whole dotted path is checked first, so `dcf.exit_cap_rate` can be
26
+ // overridden without shadowing everything else under `dcf`.
27
+ const overridden = lookupOverride([expr.head, ...expr.segments].join('.'), ctx);
28
+ if (overridden !== undefined)
29
+ return overridden;
21
30
  const head = resolveIdentifier(expr.head, ctx);
22
31
  if (head === null || head === undefined)
23
32
  return null;
@@ -90,6 +99,21 @@ function evalNode(expr, ctx, state) {
90
99
  }
91
100
  }
92
101
  // ─── Variable resolution ──────────────────────────────────────────────────────
102
+ /**
103
+ * An override for this exact path, or `undefined` when there is none.
104
+ *
105
+ * `undefined` rather than `null` is load-bearing: `null` is a legitimate
106
+ * override value meaning "treat this as absent", and collapsing the two would
107
+ * make it impossible to ask what a formula does when an input goes missing.
108
+ */
109
+ function lookupOverride(path, ctx) {
110
+ const overrides = ctx.overrides;
111
+ if (!overrides)
112
+ return undefined;
113
+ if (!Object.prototype.hasOwnProperty.call(overrides, path))
114
+ return undefined;
115
+ return overrides[path] ?? null;
116
+ }
93
117
  function resolveIdentifier(name, ctx) {
94
118
  // A blocked head is unresolvable for the same reason a blocked segment is:
95
119
  // no document-authored name may reach the prototype chain.
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/calc/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/calc/evaluator.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,iEAAiE;AAEjE,OAAO,EAAW,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,SAAS,GAAG,IAAI,CAAC;AAMvB,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,GAA0B;IAC7D,MAAM,KAAK,GAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,GAA0B,EAAE,KAAgB;IACxE,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,sBAAsB,SAAS,aAAa,CAAC,CAAC;IACtF,CAAC;IAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,KAAK,CAAC;QAEpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,UAAU,CAAC;YAChD,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,wEAAwE;YACxE,4DAA4D;YAC5D,MAAM,UAAU,GAAG,cAAc,CAC/B,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACvC,GAAG,CACJ,CAAC;YACF,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,UAAU,CAAC;YAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACrD,IAAI,GAAG,GAAY,IAAI,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBACnD,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,qBAAqB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,kCAAkC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACtF,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;YACD,IAAI;YACJ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,mCAAmC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,wEAAwE;YACxE,yEAAyE;YACzE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,aAAa,IAAI,CAAC,EAAE,4BAA4B,OAAO,IAAI,WAAW,CAAC,CAAC;gBAC/G,CAAC;gBACD,uDAAuD;gBACvD,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACrD,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/C,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAChC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,aAAa,IAAI,CAAC,EAAE,4BAA4B,OAAO,KAAK,YAAY,CAAC,CAAC;gBACjH,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC/B,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,0CAA0C,OAAO,IAAI,GAAG,CAAC,CAAC;YACjG,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,GAA0B;IAC9D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,GAA0B;IACjE,2EAA2E;IAC3E,2DAA2D;IAC3D,IAAI,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,WAAiD,CAAC;IACxE,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,2EAA2E;QAC3E,oEAAoE;QACpE,sEAAsE;QACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAqD,CAAC;QAC/E,MAAM,KAAK,GAAG,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,SAAS,IAAI,QAAQ;YAC7E,CAAC,CAAC,QAAQ,CAAC,OAAO;YAClB,CAAC,CAAC,QAAQ,CAAC;QACb,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;QAClE,OAAO,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACvF,6EAA6E;IAC7E,2EAA2E;IAC3E,OAAO,CAAyB,CAAC;AACnC,CAAC;AAED,iFAAiF;AAEjF,SAAS,UAAU,CAAC,EAAU,EAAE,CAAY,EAAE,CAAY;IACxD,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,GAAG;YACN,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;QAEvF,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QACxC,CAAC;QAED,KAAK,IAAI,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErC,KAAK,GAAG,CAAC;QACT,KAAK,IAAI,CAAC;QACV,KAAK,GAAG,CAAC;QACT,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,eAAe,EAAE,gCAAgC,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAQ,CAAqB,GAAI,CAAqB,CAAC;YACvE,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAQ,CAAqB,IAAK,CAAqB,CAAC;YACzE,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAQ,CAAqB,GAAI,CAAqB,CAAC;YACvE,OAAQ,CAAqB,IAAK,CAAqB,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,WAAW,CAAC,CAAY,EAAE,CAAY;IAC7C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /** The algorithm identifier a result echoes back, so a reader can tell what produced it. */
2
+ export declare const PRNG_ALGORITHM: "pcg-xsl-rr-128-64";
3
+ export declare class Pcg64 {
4
+ private state;
5
+ /**
6
+ * Seeded exactly as the reference `srandom` does: zero the state, step it,
7
+ * add the seed, step again. Reproducing that sequence matters more than it
8
+ * looks — a host that merely assigned the seed to the state would produce a
9
+ * different stream from every correct implementation, while still being
10
+ * perfectly deterministic and therefore passing any self-consistency test.
11
+ */
12
+ constructor(seed: bigint | number);
13
+ private step;
14
+ /** One 64-bit output. */
15
+ nextUint64(): bigint;
16
+ /**
17
+ * A double in `[0, 1)`, using the top 53 bits — the exact width of a double's
18
+ * mantissa.
19
+ *
20
+ * 53 and not 64: dividing a 64-bit integer by 2^64 rounds, so two integers
21
+ * differing in their low bits can map to the same double while a third maps
22
+ * to `1.0`. Taking 53 bits and dividing by 2^53 is exact for every input, so
23
+ * the result is a faithful function of the draw and never reaches 1.0.
24
+ */
25
+ nextDouble(): number;
26
+ }
27
+ /** A uniform draw on `[min, max)`. Arithmetic only, so bit-exact everywhere. */
28
+ export declare function sampleUniform(u: number, min: number, max: number): number;
29
+ /**
30
+ * A triangular draw. Uses `sqrt`, which IEEE 754 specifies exactly, so this is
31
+ * bit-exact everywhere too.
32
+ *
33
+ * Worth having beyond its own merits: the asset-class default tables already
34
+ * carry `low`/`central`/`high`, which are exactly a triangular distribution's
35
+ * parameters. An adopter can turn the existing napkin-mode ranges into
36
+ * distributions without inventing any numbers (RFC 0005 §Range types).
37
+ */
38
+ export declare function sampleTriangular(u: number, min: number, mode: number, max: number): number;
39
+ /**
40
+ * Inverse standard-normal CDF — Acklam's rational approximation.
41
+ *
42
+ * **This one is not bit-exact across platforms, and the spec says so.** The
43
+ * central region (0.02425 ≤ p ≤ 0.97575, about 95% of draws) is arithmetic
44
+ * only and therefore exact. Both tails need `log`, which no standard requires
45
+ * to be correctly rounded, so two hosts can disagree in the last place there.
46
+ *
47
+ * The alternative was to reject the normal distribution outright, and that is
48
+ * worse: it is the distribution adopters actually reach for. So it ships, the
49
+ * limitation is normative (§VIII.8.4), and conformance compares normal-derived
50
+ * summaries at a stated tolerance while `uniform` and `triangular` are pinned
51
+ * exactly. Naming which distributions are exact is more useful than a blanket
52
+ * tolerance that hides the difference.
53
+ *
54
+ * Relative error of the approximation itself is about 1.15e-9.
55
+ */
56
+ export declare function inverseNormalCdf(p: number): number;
57
+ /** A normal draw, via {@link inverseNormalCdf}. */
58
+ export declare function sampleNormal(u: number, mean: number, stddev: number): number;
59
+ //# sourceMappingURL=prng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../../src/calc/prng.ts"],"names":[],"mappings":"AAuCA,4FAA4F;AAC5F,eAAO,MAAM,cAAc,EAAG,mBAA4B,CAAC;AAE3D,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;;;OAMG;gBACS,IAAI,EAAE,MAAM,GAAG,MAAM;IAOjC,OAAO,CAAC,IAAI;IAIZ,yBAAyB;IACzB,UAAU,IAAI,MAAM;IAUpB;;;;;;;;OAQG;IACH,UAAU,IAAI,MAAM;CAGrB;AAkBD,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM1F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAqDlD;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5E"}
@@ -0,0 +1,181 @@
1
+ // PCG-XSL-RR-128/64 ("pcg64") — the normative PRNG for stochastic
2
+ // calculations (protocol §VIII.8, RFC 0005).
3
+ //
4
+ // The whole point of specifying an algorithm rather than reaching for a
5
+ // library is that the seed and the algorithm together ARE the determinism
6
+ // contract. Two conforming hosts given the same seed must produce the same
7
+ // sample sequence, or a stochastic calc is not reproducible and the format's
8
+ // core promise — that the numbers follow from the inputs — stops holding for
9
+ // anything with uncertainty in it. A library dependency would make its version
10
+ // part of that contract; forty lines here do not.
11
+ //
12
+ // BigInt rather than a 64-bit-pair trick: the state is 128 bits, and hand-rolled
13
+ // limb arithmetic is exactly where an implementation quietly diverges from
14
+ // every other one. Speed is not the constraint — the sample cap is 100,000
15
+ // draws, which BigInt handles in milliseconds.
16
+ //
17
+ // ─────────────────────────────────────────────────────────────────────────────
18
+ // VERIFICATION GAP, stated rather than buried:
19
+ //
20
+ // The test vector in `prng.test.ts` and in `conformance/stochastic/` was
21
+ // generated BY THIS IMPLEMENTATION. It proves self-consistency across runs and
22
+ // platforms; it does NOT prove agreement with the reference C implementation at
23
+ // pcg-random.org. The algorithm below is written from the published
24
+ // specification, but nobody has diffed its output against O'Neill's.
25
+ //
26
+ // That check is cheap and has not been done. Until it is, an implementer
27
+ // porting this to another language should port THIS code, not write pcg64 from
28
+ // the paper and assume the two agree. The steps to close it are in
29
+ // docs/handoff/HUMAN-verify-pcg64-vector.md; RFC 0005 records the same caveat.
30
+ // ─────────────────────────────────────────────────────────────────────────────
31
+ const MASK_128 = (1n << 128n) - 1n;
32
+ const MASK_64 = (1n << 64n) - 1n;
33
+ /** PCG64 multiplier, from the reference implementation. */
34
+ const MULTIPLIER = 47026247687942121848144207491837523525n;
35
+ /** PCG64 default stream increment. */
36
+ const INCREMENT = 117397592171526113268558934119004209487n;
37
+ /** The algorithm identifier a result echoes back, so a reader can tell what produced it. */
38
+ export const PRNG_ALGORITHM = 'pcg-xsl-rr-128-64';
39
+ export class Pcg64 {
40
+ state;
41
+ /**
42
+ * Seeded exactly as the reference `srandom` does: zero the state, step it,
43
+ * add the seed, step again. Reproducing that sequence matters more than it
44
+ * looks — a host that merely assigned the seed to the state would produce a
45
+ * different stream from every correct implementation, while still being
46
+ * perfectly deterministic and therefore passing any self-consistency test.
47
+ */
48
+ constructor(seed) {
49
+ this.state = 0n;
50
+ this.step();
51
+ this.state = (this.state + (BigInt(seed) & MASK_128)) & MASK_128;
52
+ this.step();
53
+ }
54
+ step() {
55
+ this.state = (this.state * MULTIPLIER + INCREMENT) & MASK_128;
56
+ }
57
+ /** One 64-bit output. */
58
+ nextUint64() {
59
+ this.step();
60
+ // XSL: fold the high half into the low half.
61
+ const xorshifted = ((this.state >> 64n) ^ this.state) & MASK_64;
62
+ // RR: rotate right by the top six bits of the state.
63
+ const rot = Number((this.state >> 122n) & 63n);
64
+ if (rot === 0)
65
+ return xorshifted;
66
+ return ((xorshifted >> BigInt(rot)) | (xorshifted << BigInt(64 - rot))) & MASK_64;
67
+ }
68
+ /**
69
+ * A double in `[0, 1)`, using the top 53 bits — the exact width of a double's
70
+ * mantissa.
71
+ *
72
+ * 53 and not 64: dividing a 64-bit integer by 2^64 rounds, so two integers
73
+ * differing in their low bits can map to the same double while a third maps
74
+ * to `1.0`. Taking 53 bits and dividing by 2^53 is exact for every input, so
75
+ * the result is a faithful function of the draw and never reaches 1.0.
76
+ */
77
+ nextDouble() {
78
+ return Number(this.nextUint64() >> 11n) / 9007199254740992; // 2^53
79
+ }
80
+ }
81
+ // ─── Inverse-CDF sampling ────────────────────────────────────────────────────
82
+ //
83
+ // Every distribution is sampled by inverting its CDF at a uniform draw, and
84
+ // that choice is about cross-implementation determinism rather than elegance.
85
+ //
86
+ // IEEE 754 exactly specifies `+ - * /` and `sqrt`. It does NOT specify `log`,
87
+ // `exp`, `sin`, or `cos` — those are libm functions whose last-place results
88
+ // differ between platforms and versions. So the textbook normal samplers are
89
+ // unusable: Box-Muller needs `log` and `cos`, Marsaglia polar needs `log`.
90
+ // Either produces samples that agree to about fifteen digits across hosts and
91
+ // disagree in the sixteenth, which is how "reproducible" becomes "reproducible
92
+ // on my machine".
93
+ //
94
+ // This buys exactness for two of the three distributions, and the third is
95
+ // honest about not having it — see `inverseNormalCdf`.
96
+ /** A uniform draw on `[min, max)`. Arithmetic only, so bit-exact everywhere. */
97
+ export function sampleUniform(u, min, max) {
98
+ return min + u * (max - min);
99
+ }
100
+ /**
101
+ * A triangular draw. Uses `sqrt`, which IEEE 754 specifies exactly, so this is
102
+ * bit-exact everywhere too.
103
+ *
104
+ * Worth having beyond its own merits: the asset-class default tables already
105
+ * carry `low`/`central`/`high`, which are exactly a triangular distribution's
106
+ * parameters. An adopter can turn the existing napkin-mode ranges into
107
+ * distributions without inventing any numbers (RFC 0005 §Range types).
108
+ */
109
+ export function sampleTriangular(u, min, mode, max) {
110
+ const span = max - min;
111
+ if (span === 0)
112
+ return min;
113
+ const split = (mode - min) / span;
114
+ if (u < split)
115
+ return min + Math.sqrt(u * span * (mode - min));
116
+ return max - Math.sqrt((1 - u) * span * (max - mode));
117
+ }
118
+ /**
119
+ * Inverse standard-normal CDF — Acklam's rational approximation.
120
+ *
121
+ * **This one is not bit-exact across platforms, and the spec says so.** The
122
+ * central region (0.02425 ≤ p ≤ 0.97575, about 95% of draws) is arithmetic
123
+ * only and therefore exact. Both tails need `log`, which no standard requires
124
+ * to be correctly rounded, so two hosts can disagree in the last place there.
125
+ *
126
+ * The alternative was to reject the normal distribution outright, and that is
127
+ * worse: it is the distribution adopters actually reach for. So it ships, the
128
+ * limitation is normative (§VIII.8.4), and conformance compares normal-derived
129
+ * summaries at a stated tolerance while `uniform` and `triangular` are pinned
130
+ * exactly. Naming which distributions are exact is more useful than a blanket
131
+ * tolerance that hides the difference.
132
+ *
133
+ * Relative error of the approximation itself is about 1.15e-9.
134
+ */
135
+ export function inverseNormalCdf(p) {
136
+ if (!(p > 0 && p < 1)) {
137
+ throw new RangeError(`inverseNormalCdf expects p in (0, 1), got ${p}`);
138
+ }
139
+ const a1 = -3.969683028665376e1;
140
+ const a2 = 2.209460984245205e2;
141
+ const a3 = -2.759285104469687e2;
142
+ const a4 = 1.38357751867269e2;
143
+ const a5 = -3.066479806614716e1;
144
+ const a6 = 2.506628277459239;
145
+ const b1 = -5.447609879822406e1;
146
+ const b2 = 1.615858368580409e2;
147
+ const b3 = -1.556989798598866e2;
148
+ const b4 = 6.680131188771972e1;
149
+ const b5 = -1.328068155288572e1;
150
+ const c1 = -7.784894002430293e-3;
151
+ const c2 = -3.223964580411365e-1;
152
+ const c3 = -2.400758277161838;
153
+ const c4 = -2.549732539343734;
154
+ const c5 = 4.374664141464968;
155
+ const c6 = 2.938163982698783;
156
+ const d1 = 7.784695709041462e-3;
157
+ const d2 = 3.224671290700398e-1;
158
+ const d3 = 2.445134137142996;
159
+ const d4 = 3.754408661907416;
160
+ const P_LOW = 0.02425;
161
+ const P_HIGH = 1 - P_LOW;
162
+ if (p < P_LOW) {
163
+ const q = Math.sqrt(-2 * Math.log(p));
164
+ return ((((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) /
165
+ ((((d1 * q + d2) * q + d3) * q + d4) * q + 1));
166
+ }
167
+ if (p > P_HIGH) {
168
+ const q = Math.sqrt(-2 * Math.log(1 - p));
169
+ return -((((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) /
170
+ ((((d1 * q + d2) * q + d3) * q + d4) * q + 1));
171
+ }
172
+ const q = p - 0.5;
173
+ const r = q * q;
174
+ return (((((((a1 * r + a2) * r + a3) * r + a4) * r + a5) * r + a6) * q) /
175
+ (((((b1 * r + b2) * r + b3) * r + b4) * r + b5) * r + 1));
176
+ }
177
+ /** A normal draw, via {@link inverseNormalCdf}. */
178
+ export function sampleNormal(u, mean, stddev) {
179
+ return mean + stddev * inverseNormalCdf(u);
180
+ }
181
+ //# sourceMappingURL=prng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prng.js","sourceRoot":"","sources":["../../src/calc/prng.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { CalcEvaluationContext, ProtocolError } from '../protocol.js';
2
+ /** Hard ceiling on grid cells. RFC 0007's suggested bound. */
3
+ export declare const MAX_SENSITIVITY_CELLS = 256;
4
+ /** Hard ceiling per axis, so a 1x256 strip is refused as readily as 16x16. */
5
+ export declare const MAX_SENSITIVITY_AXIS = 64;
6
+ export interface SensitivityAxis {
7
+ /**
8
+ * The dotted path this axis varies, written exactly as an expression writes
9
+ * it: `dcf.exit_cap_rate`, not `exit_cap_rate`.
10
+ */
11
+ variable: string;
12
+ /** The values to sweep. At least two — a one-value axis is not an axis. */
13
+ values: number[];
14
+ /** Optional display label; defaults to `variable`. */
15
+ label?: string;
16
+ }
17
+ export interface SensitivityDecl {
18
+ id: string;
19
+ label: string;
20
+ /** An ordinary §VIII.1 safe expression. */
21
+ base_formula: string;
22
+ row_axis: SensitivityAxis;
23
+ col_axis: SensitivityAxis;
24
+ unit?: string;
25
+ /** Decimal places each cell is quantized to (§VIII.5). */
26
+ round_to?: number;
27
+ }
28
+ /** One cell: a value, or the error that stopped it. Never both. */
29
+ export type SensitivityCell = {
30
+ ok: true;
31
+ value: number | string | boolean | null;
32
+ } | {
33
+ ok: false;
34
+ error: {
35
+ code: string;
36
+ message: string;
37
+ };
38
+ };
39
+ export interface SensitivityResult {
40
+ calc_id: string;
41
+ ok: boolean;
42
+ /** Present only when the declaration itself was unusable. */
43
+ error?: ProtocolError;
44
+ row_axis?: SensitivityAxis;
45
+ col_axis?: SensitivityAxis;
46
+ /** `grid[rowIndex][colIndex]`, matching the axes' declared order. */
47
+ grid?: SensitivityCell[][];
48
+ unit?: string;
49
+ round_to?: number;
50
+ /**
51
+ * How many cells failed. A grid is `ok: true` with failed cells in it — a
52
+ * table where one combination divides by zero is still a useful table, and
53
+ * failing the whole thing would hide the 35 cells that worked.
54
+ */
55
+ failed_cells?: number;
56
+ }
57
+ /**
58
+ * Evaluate a sensitivity declaration into a grid.
59
+ *
60
+ * Total: a malformed declaration returns `ok: false` with a typed error rather
61
+ * than throwing, matching `evaluateCalc`. A cell that fails is recorded in
62
+ * place and does not stop the sweep.
63
+ */
64
+ export declare function evaluateSensitivity(decl: SensitivityDecl, ctx: CalcEvaluationContext): SensitivityResult;
65
+ /**
66
+ * Narrow an unknown declaration, for hosts reading `custom_calculations`.
67
+ *
68
+ * A block that carries `row_axis` and `col_axis` is a sensitivity declaration;
69
+ * one that carries `formula` is a scalar calc. The discriminator is structural
70
+ * rather than a `type` field, because every existing calc block would have to
71
+ * grow one otherwise.
72
+ */
73
+ export declare function isSensitivityDecl(value: unknown): value is SensitivityDecl;
74
+ /** Rethrown as a typed error by callers that prefer exceptions. */
75
+ export declare function assertSensitivityOk(result: SensitivityResult): void;
76
+ //# sourceMappingURL=sensitivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitivity.d.ts","sourceRoot":"","sources":["../../src/calc/sensitivity.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,qBAAqB,EAAc,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEvF,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mEAAmE;AACnE,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,6DAA6D;IAC7D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,qEAAqE;IACrE,IAAI,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAUD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,qBAAqB,GACzB,iBAAiB,CA+FnB;AAiCD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAQ1E;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOnE"}
@@ -0,0 +1,160 @@
1
+ // Sensitivity tables (protocol §VIII.7, RFC 0007).
2
+ //
3
+ // A two-axis grid: one base formula, evaluated once per (row, column) pair
4
+ // with the two axis variables overridden. The thing every underwriter builds
5
+ // by hand in Excel, and the single most-requested calc capability after the
6
+ // basic ratios.
7
+ //
8
+ // **Declared, not a builtin.** RFC 0007 proposed
9
+ // `sensitivity_table(base_expr, {variable, values}, {variable, values})` as a
10
+ // function inside the §VIII.1 grammar. That grammar has no object literals and
11
+ // no array literals, and its `string` production is a value, not a program — so
12
+ // the proposal needs three grammar extensions, one of which makes a string
13
+ // argument executable. Widening a deliberately tiny sandbox that far, to reach
14
+ // data that is already sitting in JSON one level up, is the wrong trade.
15
+ //
16
+ // So the axes are a JSON *declaration* — which is where every other calc
17
+ // declaration already lives — and `base_formula` is an ordinary safe
18
+ // expression. The sandbox does not change at all. The grid is computed by
19
+ // `evaluateSensitivity`, which the Excel emitter and a calc-aware editor can
20
+ // both consume without re-deriving structure from calc-id naming conventions.
21
+ //
22
+ // **The result is its own type.** It never travels through `CalcResult.value`,
23
+ // which stays `number | string | boolean | null`. Receipts pin that union, the
24
+ // CLI renders it, and Excel emits from it; smuggling a grid through it would
25
+ // break all three for a feature none of them asked to carry.
26
+ import { evaluateCalc } from './index.js';
27
+ import { CalcError } from './errors.js';
28
+ import { MAX_ROUND_TO, resolveRoundTo } from './quantize.js';
29
+ /** Hard ceiling on grid cells. RFC 0007's suggested bound. */
30
+ export const MAX_SENSITIVITY_CELLS = 256;
31
+ /** Hard ceiling per axis, so a 1x256 strip is refused as readily as 16x16. */
32
+ export const MAX_SENSITIVITY_AXIS = 64;
33
+ function declError(id, code, message, pointer) {
34
+ return {
35
+ calc_id: id,
36
+ ok: false,
37
+ error: { category: 'calc', code, message, pointer },
38
+ };
39
+ }
40
+ /**
41
+ * Evaluate a sensitivity declaration into a grid.
42
+ *
43
+ * Total: a malformed declaration returns `ok: false` with a typed error rather
44
+ * than throwing, matching `evaluateCalc`. A cell that fails is recorded in
45
+ * place and does not stop the sweep.
46
+ */
47
+ export function evaluateSensitivity(decl, ctx) {
48
+ const axisProblem = checkAxis(decl.id, decl.row_axis, 'row_axis') ?? checkAxis(decl.id, decl.col_axis, 'col_axis');
49
+ if (axisProblem)
50
+ return axisProblem;
51
+ if (decl.row_axis.variable === decl.col_axis.variable) {
52
+ // Both axes overriding one path means the second silently wins for every
53
+ // cell, producing a grid whose rows are identical and whose reader has no
54
+ // way to see why.
55
+ return declError(decl.id, 'CALC-SENS-004', `Both axes vary '${decl.row_axis.variable}'; a grid needs two different variables.`, 'col_axis.variable');
56
+ }
57
+ const cells = decl.row_axis.values.length * decl.col_axis.values.length;
58
+ if (cells > MAX_SENSITIVITY_CELLS) {
59
+ return declError(decl.id, 'CALC-SENS-003', `Grid is ${decl.row_axis.values.length}x${decl.col_axis.values.length} = ${cells} cells; the limit is ${MAX_SENSITIVITY_CELLS}.`, 'row_axis.values');
60
+ }
61
+ if (decl.round_to !== undefined && (!Number.isInteger(decl.round_to) || decl.round_to < 0 || decl.round_to > MAX_ROUND_TO)) {
62
+ return declError(decl.id, 'CALC-SENS-005', `round_to must be an integer in [0, ${MAX_ROUND_TO}].`, 'round_to');
63
+ }
64
+ const roundTo = resolveRoundTo({
65
+ ...(decl.unit !== undefined ? { unit: decl.unit } : {}),
66
+ ...(decl.round_to !== undefined ? { round_to: decl.round_to } : {}),
67
+ });
68
+ const grid = [];
69
+ let failed = 0;
70
+ for (const rowValue of decl.row_axis.values) {
71
+ const row = [];
72
+ for (const colValue of decl.col_axis.values) {
73
+ // Each cell is an independent `evaluateCalc` with two overrides layered
74
+ // on the same context. Nothing is mutated: the document the caller passed
75
+ // in is the document every cell reads, minus exactly two paths.
76
+ const result = evaluateCalc({
77
+ id: decl.id,
78
+ label: decl.label,
79
+ formula: decl.base_formula,
80
+ deterministic: true,
81
+ ...(decl.unit !== undefined ? { unit: decl.unit } : {}),
82
+ round_to: roundTo,
83
+ }, {
84
+ ...ctx,
85
+ overrides: {
86
+ ...ctx.overrides,
87
+ [decl.row_axis.variable]: rowValue,
88
+ [decl.col_axis.variable]: colValue,
89
+ },
90
+ });
91
+ if (result.ok) {
92
+ row.push({ ok: true, value: result.value });
93
+ }
94
+ else {
95
+ failed++;
96
+ row.push({
97
+ ok: false,
98
+ error: {
99
+ code: result.error?.code ?? 'CALC-UNKNOWN',
100
+ message: result.error?.message ?? 'Cell evaluation failed.',
101
+ },
102
+ });
103
+ }
104
+ }
105
+ grid.push(row);
106
+ }
107
+ return {
108
+ calc_id: decl.id,
109
+ ok: true,
110
+ row_axis: decl.row_axis,
111
+ col_axis: decl.col_axis,
112
+ grid,
113
+ ...(decl.unit !== undefined ? { unit: decl.unit } : {}),
114
+ round_to: roundTo,
115
+ failed_cells: failed,
116
+ };
117
+ }
118
+ function checkAxis(id, axis, pointer) {
119
+ if (!axis || typeof axis !== 'object') {
120
+ return declError(id, 'CALC-SENS-001', `${pointer} is missing.`, pointer);
121
+ }
122
+ if (typeof axis.variable !== 'string' || axis.variable.length === 0) {
123
+ return declError(id, 'CALC-SENS-001', `${pointer}.variable must be a non-empty path.`, `${pointer}.variable`);
124
+ }
125
+ if (!Array.isArray(axis.values) || axis.values.length < 2) {
126
+ // One value is not a sweep, and zero is not a table. Refusing here beats
127
+ // returning a degenerate 1xN grid that every consumer then has to
128
+ // special-case.
129
+ return declError(id, 'CALC-SENS-002', `${pointer}.values must list at least two numbers.`, `${pointer}.values`);
130
+ }
131
+ if (axis.values.length > MAX_SENSITIVITY_AXIS) {
132
+ return declError(id, 'CALC-SENS-003', `${pointer}.values has ${axis.values.length} entries; the per-axis limit is ${MAX_SENSITIVITY_AXIS}.`, `${pointer}.values`);
133
+ }
134
+ if (!axis.values.every((v) => typeof v === 'number' && Number.isFinite(v))) {
135
+ return declError(id, 'CALC-SENS-002', `${pointer}.values must be finite numbers.`, `${pointer}.values`);
136
+ }
137
+ return null;
138
+ }
139
+ /**
140
+ * Narrow an unknown declaration, for hosts reading `custom_calculations`.
141
+ *
142
+ * A block that carries `row_axis` and `col_axis` is a sensitivity declaration;
143
+ * one that carries `formula` is a scalar calc. The discriminator is structural
144
+ * rather than a `type` field, because every existing calc block would have to
145
+ * grow one otherwise.
146
+ */
147
+ export function isSensitivityDecl(value) {
148
+ return (typeof value === 'object' &&
149
+ value !== null &&
150
+ 'base_formula' in value &&
151
+ 'row_axis' in value &&
152
+ 'col_axis' in value);
153
+ }
154
+ /** Rethrown as a typed error by callers that prefer exceptions. */
155
+ export function assertSensitivityOk(result) {
156
+ if (!result.ok) {
157
+ throw new CalcError((result.error?.code ?? 'CALC-SENS-001'), result.error?.message ?? 'Sensitivity declaration is unusable.');
158
+ }
159
+ }
160
+ //# sourceMappingURL=sensitivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitivity.js","sourceRoot":"","sources":["../../src/calc/sensitivity.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,gBAAgB;AAChB,EAAE;AACF,iDAAiD;AACjD,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,2EAA2E;AAC3E,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,6EAA6E;AAC7E,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG7D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAkDvC,SAAS,SAAS,CAAC,EAAU,EAAE,IAAmB,EAAE,OAAe,EAAE,OAAe;IAClF,OAAO;QACL,OAAO,EAAE,EAAE;QACX,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;KACpD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAqB,EACrB,GAA0B;IAE1B,MAAM,WAAW,GACf,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACjG,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtD,yEAAyE;QACzE,0EAA0E;QAC1E,kBAAkB;QAClB,OAAO,SAAS,CACd,IAAI,CAAC,EAAE,EACP,eAAe,EACf,mBAAmB,IAAI,CAAC,QAAQ,CAAC,QAAQ,0CAA0C,EACnF,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACxE,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;QAClC,OAAO,SAAS,CACd,IAAI,CAAC,EAAE,EACP,eAAe,EACf,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,MAAM,KAAK,wBAAwB,qBAAqB,GAAG,EAChI,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC;QAC3H,OAAO,SAAS,CACd,IAAI,CAAC,EAAE,EACP,eAAe,EACf,sCAAsC,YAAY,IAAI,EACtD,UAAU,CACX,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,wEAAwE;YACxE,0EAA0E;YAC1E,gEAAgE;YAChE,MAAM,MAAM,GAAe,YAAY,CACrC;gBACE,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,YAAY;gBAC1B,aAAa,EAAE,IAAI;gBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,QAAQ,EAAE,OAAO;aAClB,EACD;gBACE,GAAG,GAAG;gBACN,SAAS,EAAE;oBACT,GAAG,GAAG,CAAC,SAAS;oBAChB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ;oBAClC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ;iBACnC;aACF,CACF,CAAC;YAEF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC;gBACT,GAAG,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,cAAc;wBAC1C,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB;qBAC5D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,EAAU,EACV,IAAiC,EACjC,OAAe;IAEf,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,qCAAqC,EAAE,GAAG,OAAO,WAAW,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,yEAAyE;QACzE,kEAAkE;QAClE,gBAAgB;QAChB,OAAO,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,yCAAyC,EAAE,GAAG,OAAO,SAAS,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAC9C,OAAO,SAAS,CACd,EAAE,EACF,eAAe,EACf,GAAG,OAAO,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,mCAAmC,oBAAoB,GAAG,EACrG,GAAG,OAAO,SAAS,CACpB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,iCAAiC,EAAE,GAAG,OAAO,SAAS,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,cAAc,IAAI,KAAK;QACvB,UAAU,IAAI,KAAK;QACnB,UAAU,IAAI,KAAK,CACpB,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CACjB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,eAAe,CAAkB,EACxD,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,sCAAsC,CAChE,CAAC;IACJ,CAAC;AACH,CAAC"}