@lucern/confidence 0.1.0-alpha.4 → 0.3.0-alpha.1

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 (49) hide show
  1. package/README.md +5 -1
  2. package/dist/index.d.ts +5 -3
  3. package/dist/index.js +214 -87
  4. package/dist/index.js.map +1 -1
  5. package/dist/v1/codec.d.ts +42 -0
  6. package/dist/v1/codec.js +62 -0
  7. package/dist/v1/codec.js.map +1 -0
  8. package/dist/v1/index.d.ts +5 -3
  9. package/dist/v1/index.js +214 -87
  10. package/dist/v1/index.js.map +1 -1
  11. package/dist/v1/operations/approximation.js +30 -21
  12. package/dist/v1/operations/approximation.js.map +1 -1
  13. package/dist/v1/operations/bridge/index.d.ts +3 -3
  14. package/dist/v1/operations/bridge/index.js +27 -13
  15. package/dist/v1/operations/bridge/index.js.map +1 -1
  16. package/dist/v1/operations/canonical.d.ts +2 -2
  17. package/dist/v1/operations/canonical.js +16 -19
  18. package/dist/v1/operations/canonical.js.map +1 -1
  19. package/dist/v1/operations/contradiction/detectTupleContradiction.js.map +1 -1
  20. package/dist/v1/operations/contradiction/index.js.map +1 -1
  21. package/dist/v1/operations/dynamics/cascade.js +19 -6
  22. package/dist/v1/operations/dynamics/cascade.js.map +1 -1
  23. package/dist/v1/operations/dynamics/decay.js +5 -4
  24. package/dist/v1/operations/dynamics/decay.js.map +1 -1
  25. package/dist/v1/operations/dynamics/defeat.js +22 -17
  26. package/dist/v1/operations/dynamics/defeat.js.map +1 -1
  27. package/dist/v1/operations/dynamics/propagation.js +66 -33
  28. package/dist/v1/operations/dynamics/propagation.js.map +1 -1
  29. package/dist/v1/operations/dynamics/revision.d.ts +6 -6
  30. package/dist/v1/operations/dynamics/revision.js +31 -19
  31. package/dist/v1/operations/dynamics/revision.js.map +1 -1
  32. package/dist/v1/operations/index.js +9 -5
  33. package/dist/v1/operations/index.js.map +1 -1
  34. package/dist/v1/operations/lucern.d.ts +4 -2
  35. package/dist/v1/operations/lucern.js +179 -76
  36. package/dist/v1/operations/lucern.js.map +1 -1
  37. package/dist/v1/operations/operatorTaxonomy.d.ts +23 -1
  38. package/dist/v1/operations/operatorTaxonomy.js +28 -0
  39. package/dist/v1/operations/operatorTaxonomy.js.map +1 -1
  40. package/dist/v1/operations/scoring.d.ts +30 -12
  41. package/dist/v1/operations/scoring.js +82 -40
  42. package/dist/v1/operations/scoring.js.map +1 -1
  43. package/dist/v1/operations/subjectiveLogic/index.d.ts +20 -19
  44. package/dist/v1/operations/subjectiveLogic/index.js +11 -10
  45. package/dist/v1/operations/subjectiveLogic/index.js.map +1 -1
  46. package/dist/v1/operations/temporalDecay.js +9 -5
  47. package/dist/v1/operations/temporalDecay.js.map +1 -1
  48. package/dist/v1/types.d.ts +5 -1
  49. package/package.json +5 -1
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import { SLOpinion, StoredOpinionFields } from './types.js';
3
+
4
+ declare const SLOpinionRefinement: z.ZodEffects<z.ZodObject<{
5
+ b: z.ZodNumber;
6
+ d: z.ZodNumber;
7
+ u: z.ZodNumber;
8
+ a: z.ZodNumber;
9
+ }, "strip", z.ZodTypeAny, {
10
+ b: number;
11
+ d: number;
12
+ u: number;
13
+ a: number;
14
+ }, {
15
+ b: number;
16
+ d: number;
17
+ u: number;
18
+ a: number;
19
+ }>, {
20
+ b: number;
21
+ d: number;
22
+ u: number;
23
+ a: number;
24
+ }, {
25
+ b: number;
26
+ d: number;
27
+ u: number;
28
+ a: number;
29
+ }>;
30
+ type FromStorageResult = {
31
+ ok: true;
32
+ opinion: SLOpinion;
33
+ } | {
34
+ ok: false;
35
+ opinion: SLOpinion;
36
+ repairNeeded: true;
37
+ reason: string;
38
+ };
39
+ declare function fromStorage(fields: StoredOpinionFields): FromStorageResult;
40
+ declare function toStorage(opinion: SLOpinion): StoredOpinionFields;
41
+
42
+ export { type FromStorageResult, SLOpinionRefinement, fromStorage, toStorage };
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/v1/codec.ts
4
+
5
+ // src/v1/operations/subjectiveLogic/index.ts
6
+ function mkOpinion(belief, disbelief, uncertainty, baseRate) {
7
+ const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;
8
+ const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;
9
+ const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;
10
+ const a = Math.max(0, Math.min(1, baseRate));
11
+ const sum = b + d + u;
12
+ if (sum === 0) {
13
+ return { b: 0, d: 0, u: 1, a };
14
+ }
15
+ return {
16
+ b: b / sum,
17
+ d: d / sum,
18
+ u: u / sum,
19
+ a
20
+ };
21
+ }
22
+
23
+ // src/v1/codec.ts
24
+ var SL_EPSILON = 1e-9;
25
+ var SLOpinionRefinement = z.object({
26
+ b: z.number(),
27
+ d: z.number(),
28
+ u: z.number(),
29
+ a: z.number()
30
+ }).refine((o) => Math.abs(o.b + o.d + o.u - 1) < SL_EPSILON, {
31
+ message: "SL invariant b+d+u=1 violated"
32
+ });
33
+ function fromStorage(fields) {
34
+ const sum = fields.belief + fields.disbelief + fields.uncertainty;
35
+ const opinion = mkOpinion(
36
+ fields.belief,
37
+ fields.disbelief,
38
+ fields.uncertainty,
39
+ fields.baseRate
40
+ );
41
+ if (Math.abs(sum - 1) < SL_EPSILON) {
42
+ return { ok: true, opinion };
43
+ }
44
+ return {
45
+ ok: false,
46
+ opinion,
47
+ repairNeeded: true,
48
+ reason: `Stored fields sum to ${sum.toFixed(6)}, not 1; normalized on read`
49
+ };
50
+ }
51
+ function toStorage(opinion) {
52
+ return {
53
+ belief: opinion.b,
54
+ disbelief: opinion.d,
55
+ uncertainty: opinion.u,
56
+ baseRate: opinion.a
57
+ };
58
+ }
59
+
60
+ export { SLOpinionRefinement, fromStorage, toStorage };
61
+ //# sourceMappingURL=codec.js.map
62
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/v1/operations/subjectiveLogic/index.ts","../../src/v1/codec.ts"],"names":[],"mappings":";;;;;AAEO,SAAS,SAAA,CACd,MAAA,EACA,SAAA,EACA,WAAA,EACA,QAAA,EACW;AACX,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA;AAC1D,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,SAAS,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,GAAI,CAAA;AAChE,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,GAAI,CAAA;AACpE,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,CAAA,GAAI,CAAA;AAEpB,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC/B;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,CAAA,GAAI,GAAA;AAAA,IACP,GAAG,CAAA,GAAI,GAAA;AAAA,IACP,GAAG,CAAA,GAAI,GAAA;AAAA,IACP;AAAA,GACF;AACF;;;ACpBA,IAAM,UAAA,GAAa,IAAA;AAEZ,IAAM,mBAAA,GAAsB,EAChC,MAAA,CAAO;AAAA,EACN,CAAA,EAAG,EAAE,MAAA,EAAO;AAAA,EACZ,CAAA,EAAG,EAAE,MAAA,EAAO;AAAA,EACZ,CAAA,EAAG,EAAE,MAAA,EAAO;AAAA,EACZ,CAAA,EAAG,EAAE,MAAA;AACP,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,IAAI,UAAA,EAAY;AAAA,EACzD,OAAA,EAAS;AACX,CAAC;AAWI,SAAS,YAAY,MAAA,EAAgD;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,YAAY,MAAA,CAAO,WAAA;AACtD,EAAA,MAAM,OAAA,GAAU,SAAA;AAAA,IACd,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,SAAA;AAAA,IACP,MAAA,CAAO,WAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAC,IAAI,UAAA,EAAY;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC7B;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,OAAA;AAAA,IACA,YAAA,EAAc,IAAA;AAAA,IACd,MAAA,EAAQ,CAAA,qBAAA,EAAwB,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,2BAAA;AAAA,GAChD;AACF;AAEO,SAAS,UAAU,OAAA,EAAyC;AACjE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,CAAA;AAAA,IAChB,WAAW,OAAA,CAAQ,CAAA;AAAA,IACnB,aAAa,OAAA,CAAQ,CAAA;AAAA,IACrB,UAAU,OAAA,CAAQ;AAAA,GACpB;AACF","file":"codec.js","sourcesContent":["import type { SLOpinion } from \"../../types\";\n\nexport function mkOpinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number\n): SLOpinion {\n const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;\n const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;\n const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;\n const a = Math.max(0, Math.min(1, baseRate));\n const sum = b + d + u;\n\n if (sum === 0) {\n return { b: 0, d: 0, u: 1, a } as SLOpinion;\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n } as SLOpinion;\n}\n\nexport const opinion = mkOpinion;\n\nexport function vacuous(baseRate: number): SLOpinion {\n return mkOpinion(0, 0, 1, baseRate);\n}\n\nexport function dogmatic(probability: number, baseRate: number): SLOpinion {\n const p = Math.max(0, Math.min(1, probability));\n return mkOpinion(p, 1 - p, 0, baseRate);\n}\n\nexport function project(o: SLOpinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: SLOpinion): \"high\" | \"medium\" | \"low\" {\n const projected = project(o);\n if (o.u > 0.5) {\n return \"low\";\n }\n if (projected >= 0.8 && o.u < 0.2) {\n return \"high\";\n }\n if (projected >= 0.6) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function cumulativeFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u - left.u * right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function averagingFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (2 * left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function trustDiscount(sourceOpinion: SLOpinion, trust: number): SLOpinion {\n const weight = Math.max(0, Math.min(1, Math.abs(trust)));\n return opinion(\n weight * sourceOpinion.b,\n weight * sourceOpinion.d,\n 1 - weight * (sourceOpinion.b + sourceOpinion.d),\n sourceOpinion.a\n );\n}\n\nconst EPSILON = 1e-9;\n\nfunction childBaseRateFallback(\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number | undefined\n): number {\n if (fallbackBaseRate !== undefined) {\n return Math.max(0, Math.min(1, fallbackBaseRate));\n }\n\n if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {\n return ifTrue.a;\n }\n\n return (ifTrue.a + ifFalse.a) / 2;\n}\n\nfunction computeConditionalDeductionBaseRate(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number\n): number {\n const denominator =\n 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;\n\n if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {\n const baseRate =\n (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;\n if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {\n return Math.max(0, Math.min(1, baseRate));\n }\n }\n\n return fallbackBaseRate;\n}\n\nfunction safeCorrectionTerm(\n numerator: number,\n denominator: number\n): number | undefined {\n if (Math.abs(denominator) <= EPSILON) {\n return undefined;\n }\n\n const value = numerator / denominator;\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, value);\n}\n\nexport function conditionalDeduction(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate?: number\n): SLOpinion {\n const fallbackChildBaseRate = childBaseRateFallback(\n ifTrue,\n ifFalse,\n fallbackBaseRate\n );\n const childBaseRate = computeConditionalDeductionBaseRate(\n opinionA,\n ifTrue,\n ifFalse,\n fallbackChildBaseRate\n );\n const projectedAntecedent = project(opinionA);\n const projectedAntecedentComplement = 1 - projectedAntecedent;\n const intermediateBelief =\n opinionA.b * ifTrue.b +\n opinionA.d * ifFalse.b +\n opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));\n const intermediateDisbelief =\n opinionA.b * ifTrue.d +\n opinionA.d * ifFalse.d +\n opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));\n const intermediateUncertainty =\n opinionA.b * ifTrue.u +\n opinionA.d * ifFalse.u +\n opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedVacuousDeduction =\n ifTrue.b * opinionA.a +\n ifFalse.b * (1 - opinionA.a) +\n childBaseRate *\n (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedConditionalA =\n ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);\n let correction = 0;\n\n if (\n (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d) ||\n (ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d)\n ) {\n correction = 0;\n } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {\n const beliefGap = ifTrue.b - ifFalse.b;\n const disbeliefGap = ifFalse.d - ifTrue.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedent * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,\n projectedAntecedentComplement * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedent * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedentComplement * (1 - childBaseRate)\n ) ?? 0;\n }\n } else {\n const beliefGap = ifFalse.b - ifTrue.b;\n const disbeliefGap = ifTrue.d - ifFalse.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateDisbelief - ifTrue.d) *\n beliefGap,\n projectedAntecedent * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedentComplement * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedent * (1 - childBaseRate)\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n opinionA.a *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedentComplement * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n }\n }\n\n return opinion(\n intermediateBelief - childBaseRate * correction,\n intermediateDisbelief - (1 - childBaseRate) * correction,\n intermediateUncertainty + correction,\n childBaseRate\n );\n}\n\n/**\n * Abductive inference over a conditional.\n * Given an opinion on Y and conditionals P(Y|X), P(Y|~X), infer an opinion on X.\n */\nexport function conditionalAbduction(\n opinionY: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n baseRateX: number\n): SLOpinion {\n const priorX = Math.max(0, Math.min(1, baseRateX));\n const probabilityY = project(opinionY);\n const probabilityGivenTrue = project(ifTrue);\n const probabilityGivenFalse = project(ifFalse);\n\n const posteriorIfYDenominator =\n probabilityGivenTrue * priorX +\n probabilityGivenFalse * (1 - priorX);\n const posteriorIfY =\n posteriorIfYDenominator === 0\n ? priorX\n : (probabilityGivenTrue * priorX) / posteriorIfYDenominator;\n\n const posteriorIfNotYDenominator =\n (1 - probabilityGivenTrue) * priorX +\n (1 - probabilityGivenFalse) * (1 - priorX);\n const posteriorIfNotY =\n posteriorIfNotYDenominator === 0\n ? priorX\n : ((1 - probabilityGivenTrue) * priorX) / posteriorIfNotYDenominator;\n\n const projectedX =\n probabilityY * posteriorIfY + (1 - probabilityY) * posteriorIfNotY;\n const uncertainty = Math.max(\n opinionY.u * 0.5,\n probabilityY * ifTrue.u + (1 - probabilityY) * ifFalse.u\n );\n\n return opinion(\n projectedX * (1 - uncertainty),\n (1 - projectedX) * (1 - uncertainty),\n uncertainty,\n priorX\n );\n}\n\nexport function negate(o: SLOpinion): SLOpinion {\n return mkOpinion(o.d, o.b, o.u, 1 - o.a);\n}\n\nexport function constraintFusion(\n left: SLOpinion,\n right: SLOpinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: SLOpinion; o2: SLOpinion } {\n if (mode === \"redistribute\") {\n const leftProjected = project(left);\n const rightProjected = project(right);\n const total = leftProjected + rightProjected;\n\n if (total <= 1) {\n return { o1: left, o2: right };\n }\n\n const scale = 1 / total;\n return {\n o1: opinion(\n left.b * scale,\n left.d + left.b * (1 - scale),\n left.u,\n left.a\n ),\n o2: opinion(\n right.b * scale,\n right.d + right.b * (1 - scale),\n right.u,\n right.a\n ),\n };\n }\n\n const pressureLeft = right.b * 0.5;\n const pressureRight = left.b * 0.5;\n\n return {\n o1: opinion(\n left.b - pressureLeft * 0.3,\n left.d + pressureLeft * 0.3,\n left.u,\n left.a\n ),\n o2: opinion(\n right.b - pressureRight * 0.3,\n right.d + pressureRight * 0.3,\n right.u,\n right.a\n ),\n };\n}\n\nexport function evidenceBalance(o: SLOpinion): number {\n const total = o.b + o.d;\n if (total === 0) {\n return 0;\n }\n return (o.b - o.d) / total;\n}\n\nexport function areTensioned(left: SLOpinion, right: SLOpinion): boolean {\n return (\n project(left) > 0.5 &&\n project(right) > 0.5 &&\n (left.d > 0.2 || right.d > 0.2)\n );\n}\n\nexport function informationGain(o: SLOpinion): number {\n if (o.u === 0) {\n return 0;\n }\n if (o.u === 1) {\n return 1;\n }\n return o.u * (1 - Math.abs(o.b - o.d));\n}\n","import { z } from \"zod\";\nimport type { SLOpinion, StoredOpinionFields } from \"./types\";\nimport { mkOpinion } from \"./operations/subjectiveLogic\";\n\nconst SL_EPSILON = 1e-9;\n\nexport const SLOpinionRefinement = z\n .object({\n b: z.number(),\n d: z.number(),\n u: z.number(),\n a: z.number(),\n })\n .refine((o) => Math.abs(o.b + o.d + o.u - 1) < SL_EPSILON, {\n message: \"SL invariant b+d+u=1 violated\",\n });\n\nexport type FromStorageResult =\n | { ok: true; opinion: SLOpinion }\n | {\n ok: false;\n opinion: SLOpinion;\n repairNeeded: true;\n reason: string;\n };\n\nexport function fromStorage(fields: StoredOpinionFields): FromStorageResult {\n const sum = fields.belief + fields.disbelief + fields.uncertainty;\n const opinion = mkOpinion(\n fields.belief,\n fields.disbelief,\n fields.uncertainty,\n fields.baseRate\n );\n\n if (Math.abs(sum - 1) < SL_EPSILON) {\n return { ok: true, opinion };\n }\n\n return {\n ok: false,\n opinion,\n repairNeeded: true,\n reason: `Stored fields sum to ${sum.toFixed(6)}, not 1; normalized on read`,\n };\n}\n\nexport function toStorage(opinion: SLOpinion): StoredOpinionFields {\n return {\n belief: opinion.b,\n disbelief: opinion.d,\n uncertainty: opinion.u,\n baseRate: opinion.a,\n };\n}\n"]}
@@ -1,10 +1,11 @@
1
- export { BeliefLifecycleBucket, ConfidencePolicyConfig, ConfidenceScoringMode, ContractConfirmedRule, ContractDisconfirmedRule, ContractExpiredRule, ContractModulationPlan, ContractPartialRule, DeadlineUrgency, DeadlineUrgencyLabel, DeadlineUrgencyTier, DecayTier, DecayTierLabel, DirichletOpinion, EdgeConstraint, EdgeMetadata, EdgeNormalization, EffectiveDecay, EpistemicContractCompositeOperator, EpistemicContractCondition, EpistemicContractConditionType, EpistemicContractDirection, EpistemicContractEvaluationResult, EpistemicContractLineageSource, EpistemicContractModulation, EpistemicContractRecord, EpistemicContractSchedule, EpistemicContractStatus, EvidentialAction, EvidentialEvaluatorConfig, EvidentialMetric, EvidentialMetricSnapshot, EvidentialOperator, MarketIndexComparatorConfig, MetricCheckerEvaluatorConfig, Opinion, PropagationMode, PropagationResult, ReferenceCheckCounterConfig, RescoringSchedule, SLOperator, StoredOpinionFields, TemporalDeadlineEvaluatorConfig, TupleContradictionPolicy, TupleContradictionTransition, VerificationConfidenceTrigger } from './types.js';
1
+ export { BeliefLifecycleBucket, ConfidencePolicyConfig, ConfidenceScoringMode, ContractConfirmedRule, ContractDisconfirmedRule, ContractExpiredRule, ContractModulationPlan, ContractPartialRule, DeadlineUrgency, DeadlineUrgencyLabel, DeadlineUrgencyTier, DecayTier, DecayTierLabel, DirichletOpinion, EdgeConstraint, EdgeMetadata, EdgeNormalization, EffectiveDecay, EpistemicContractCompositeOperator, EpistemicContractCondition, EpistemicContractConditionType, EpistemicContractDirection, EpistemicContractEvaluationResult, EpistemicContractLineageSource, EpistemicContractModulation, EpistemicContractRecord, EpistemicContractSchedule, EpistemicContractStatus, EvidentialAction, EvidentialEvaluatorConfig, EvidentialMetric, EvidentialMetricSnapshot, EvidentialOperator, MarketIndexComparatorConfig, MetricCheckerEvaluatorConfig, Opinion, PropagationMode, PropagationResult, ReferenceCheckCounterConfig, RescoringSchedule, SLOperator, SLOpinion, StoredOpinionFields, TemporalDeadlineEvaluatorConfig, TupleContradictionPolicy, TupleContradictionTransition, VerificationConfidenceTrigger } from './types.js';
2
+ export { FromStorageResult, SLOpinionRefinement, fromStorage, toStorage } from './codec.js';
2
3
  export { ConfidenceEngine, ContractEvaluatorPort, SubjectiveLogicOperatorPort } from './interfaces.js';
3
4
  export { DEFAULT_TEMPORAL_DECAY_HALF_LIFE_MS, TemporalDecayParams, temporalDecay } from './operations/temporalDecay.js';
4
5
  export { DEFAULT_NON_INFORMATIVE_WEIGHT, betaFromOpinion, opinionFromBeta, opinionFromDirichlet, projectDirichletOpinion } from './operations/bridge/index.js';
5
- export { OpinionFromScalarMode, clamp01, confidenceFromOpinion, confidenceFromSL, hasProjectedOpinionChanged, opinionFromBaseRate, opinionFromDogmatic, opinionFromProjected, opinionFromScalar, readOpinionFromRecord, toDogmaticOpinion, toStoredOpinionFields } from './operations/scoring.js';
6
+ export { OpinionFromScalarMode, OpinionFromScalarOptions, clamp01, confidenceFromOpinion, confidenceFromSL, hasProjectedOpinionChanged, opinionFromBaseRate, opinionFromDogmatic, opinionFromProjected, opinionFromScalar, readOpinionFromRecord, toDogmaticOpinion, toStoredOpinionFields } from './operations/scoring.js';
6
7
  export { DEFAULT_TUPLE_CONTRADICTION_BELIEF_THRESHOLD, DEFAULT_TUPLE_CONTRADICTION_DISBELIEF_THRESHOLD, detectTupleContradiction, evaluateTupleContradictionTransition, normalizeTupleContradictionPolicy } from './operations/contradiction/detectTupleContradiction.js';
7
- export { areTensioned, averagingFusion, conditionalAbduction, conditionalDeduction, confidenceLevel, constraintFusion, cumulativeFusion, dogmatic, evidenceBalance, informationGain, negate, opinion, project, trustDiscount, vacuous } from './operations/subjectiveLogic/index.js';
8
+ export { areTensioned, averagingFusion, conditionalAbduction, conditionalDeduction, confidenceLevel, constraintFusion, cumulativeFusion, dogmatic, evidenceBalance, informationGain, mkOpinion, negate, opinion, project, trustDiscount, vacuous } from './operations/subjectiveLogic/index.js';
8
9
  export { PROPAGATION_TRAVERSAL_SPECS, PropagationEdgeType, PropagationTraversalDirection, PropagationTraversalSpec, getPropagationTraversalSpecs, isPropagationEdgeType, propagateAllEdges, propagateThroughEdge } from './operations/dynamics/propagation.js';
9
10
  export { bayesianUpdate, reviseConfidence, reviseConfidenceOpinion } from './operations/dynamics/revision.js';
10
11
  export { DEADLINE_URGENCY, DECAY_TIERS, computeBaseDecay, computeDeadlineUrgency, computeEffectiveDecay, decay, getRescoringSchedule } from './operations/dynamics/decay.js';
@@ -12,6 +13,7 @@ export { applyNegativeEvidence, applyNegativeSupport } from './operations/dynami
12
13
  export { dampedDependencyCascade, dampedDependencyOpinion } from './operations/dynamics/cascade.js';
13
14
  export { BUILT_IN_EVIDENTIAL_ALIASES, BUILT_IN_EVIDENTIAL_EVALUATOR, BUILT_IN_MARKET_INDEX_COMPARATOR, BUILT_IN_METRIC_CHECKER, BUILT_IN_REFERENCE_CHECK_COUNTER, BUILT_IN_TEMPORAL_DEADLINE, buildComparisonRationale, buildEvidentialRationale, compareMetricValue, createInheritedContractRecord, deriveContractModulationPlan, deriveContractStatus, deriveVerificationTrigger, getEvaluatorInputRecord, normalizeEvidentialAction, parseComparisonOperator, parseEvidentialEvaluatorConfig, parseMarketIndexComparatorConfig, parseMetricCheckerConfig, parseNumericThreshold, parseReferenceCheckCounterConfig, parseTemporalDeadlineConfig, pickFiniteNumber, resolveComparisonResult } from './operations/contracts/epistemicContract.js';
14
15
  export { ConfidenceOperatorName, OPERATOR_TAXONOMY, OPERATOR_TAXONOMY_BY_TAG, OPERATOR_TAXONOMY_ENTRIES, OPERATOR_TAXONOMY_TAGS, OperatorTaxonomyEntry, OperatorTaxonomyTag, PUBLIC_OPERATOR_EXPORT_NAMES } from './operations/operatorTaxonomy.js';
16
+ import 'zod';
15
17
  import './operations/approximation.js';
16
18
  import './operations/canonical.js';
17
19
  import './operations/lucern.js';