@lucern/graph-primitives 0.1.0-alpha.2

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 (224) hide show
  1. package/README.md +29 -0
  2. package/dist/beliefDecay-Q_26RTc-.d.ts +72 -0
  3. package/dist/beliefDecay.d.ts +2 -0
  4. package/dist/beliefDecay.js +1628 -0
  5. package/dist/beliefDecay.js.map +1 -0
  6. package/dist/beliefEvidenceLinks-42FlR48t.d.ts +77 -0
  7. package/dist/beliefEvidenceLinks.d.ts +1 -0
  8. package/dist/beliefEvidenceLinks.js +1978 -0
  9. package/dist/beliefEvidenceLinks.js.map +1 -0
  10. package/dist/beliefLifecycle-C-AehZgF.d.ts +43 -0
  11. package/dist/beliefLifecycle.d.ts +1 -0
  12. package/dist/beliefLifecycle.js +98 -0
  13. package/dist/beliefLifecycle.js.map +1 -0
  14. package/dist/confidencePropagationDispatch.d.ts +46 -0
  15. package/dist/confidencePropagationDispatch.js +744 -0
  16. package/dist/confidencePropagationDispatch.js.map +1 -0
  17. package/dist/contradictions-Hdwl7zid.d.ts +71 -0
  18. package/dist/contradictions.d.ts +1 -0
  19. package/dist/contradictions.js +1557 -0
  20. package/dist/contradictions.js.map +1 -0
  21. package/dist/convex.d.ts +23 -0
  22. package/dist/convex.js +17 -0
  23. package/dist/convex.js.map +1 -0
  24. package/dist/edgeValidation-CeI0wc0r.d.ts +35 -0
  25. package/dist/edgeValidation.d.ts +2 -0
  26. package/dist/edgeValidation.js +307 -0
  27. package/dist/edgeValidation.js.map +1 -0
  28. package/dist/edges/contains.d.ts +6 -0
  29. package/dist/edges/contains.js +14 -0
  30. package/dist/edges/contains.js.map +1 -0
  31. package/dist/edges/contradicts.d.ts +6 -0
  32. package/dist/edges/contradicts.js +183 -0
  33. package/dist/edges/contradicts.js.map +1 -0
  34. package/dist/edges/dependsOn.d.ts +6 -0
  35. package/dist/edges/dependsOn.js +240 -0
  36. package/dist/edges/dependsOn.js.map +1 -0
  37. package/dist/edges/derivedFrom.d.ts +6 -0
  38. package/dist/edges/derivedFrom.js +14 -0
  39. package/dist/edges/derivedFrom.js.map +1 -0
  40. package/dist/edges/elaborates.d.ts +6 -0
  41. package/dist/edges/elaborates.js +100 -0
  42. package/dist/edges/elaborates.js.map +1 -0
  43. package/dist/edges/index.d.ts +3 -0
  44. package/dist/edges/index.js +556 -0
  45. package/dist/edges/index.js.map +1 -0
  46. package/dist/edges/informs.d.ts +6 -0
  47. package/dist/edges/informs.js +112 -0
  48. package/dist/edges/informs.js.map +1 -0
  49. package/dist/edges/propagationTypes.d.ts +39 -0
  50. package/dist/edges/propagationTypes.js +17 -0
  51. package/dist/edges/propagationTypes.js.map +1 -0
  52. package/dist/edges/refutes.d.ts +6 -0
  53. package/dist/edges/refutes.js +108 -0
  54. package/dist/edges/refutes.js.map +1 -0
  55. package/dist/edges/supports.d.ts +6 -0
  56. package/dist/edges/supports.js +193 -0
  57. package/dist/edges/supports.js.map +1 -0
  58. package/dist/edges/tests.d.ts +6 -0
  59. package/dist/edges/tests.js +14 -0
  60. package/dist/edges/tests.js.map +1 -0
  61. package/dist/edges/utils.d.ts +12 -0
  62. package/dist/edges/utils.js +188 -0
  63. package/dist/edges/utils.js.map +1 -0
  64. package/dist/embeddingTrigger.d.ts +24 -0
  65. package/dist/embeddingTrigger.js +24 -0
  66. package/dist/embeddingTrigger.js.map +1 -0
  67. package/dist/entityBridge-DMaKooYn.d.ts +59 -0
  68. package/dist/entityBridge.d.ts +1 -0
  69. package/dist/entityBridge.js +663 -0
  70. package/dist/entityBridge.js.map +1 -0
  71. package/dist/entityLifecycle-BkhRJ-XI.d.ts +69 -0
  72. package/dist/entityLifecycle.d.ts +1 -0
  73. package/dist/entityLifecycle.js +2083 -0
  74. package/dist/entityLifecycle.js.map +1 -0
  75. package/dist/entityValidation-KLZ_Xl2D.d.ts +50 -0
  76. package/dist/entityValidation.d.ts +3 -0
  77. package/dist/entityValidation.js +71 -0
  78. package/dist/entityValidation.js.map +1 -0
  79. package/dist/epistemicAnswers-DSP1slZ9.d.ts +67 -0
  80. package/dist/epistemicAnswers.d.ts +1 -0
  81. package/dist/epistemicAnswers.js +1650 -0
  82. package/dist/epistemicAnswers.js.map +1 -0
  83. package/dist/epistemicBeliefs-DtFVTp-k.d.ts +377 -0
  84. package/dist/epistemicBeliefs.d.ts +5 -0
  85. package/dist/epistemicBeliefs.js +6386 -0
  86. package/dist/epistemicBeliefs.js.map +1 -0
  87. package/dist/epistemicContractHelpers.d.ts +1 -0
  88. package/dist/epistemicContractHelpers.js +320 -0
  89. package/dist/epistemicContractHelpers.js.map +1 -0
  90. package/dist/epistemicContracts.d.ts +77 -0
  91. package/dist/epistemicContracts.js +8436 -0
  92. package/dist/epistemicContracts.js.map +1 -0
  93. package/dist/epistemicEdges-DcA8ErUG.d.ts +191 -0
  94. package/dist/epistemicEdges.d.ts +2 -0
  95. package/dist/epistemicEdges.js +2749 -0
  96. package/dist/epistemicEdges.js.map +1 -0
  97. package/dist/epistemicEvidence-Bo638XDP.d.ts +128 -0
  98. package/dist/epistemicEvidence.d.ts +3 -0
  99. package/dist/epistemicEvidence.js +3282 -0
  100. package/dist/epistemicEvidence.js.map +1 -0
  101. package/dist/epistemicHelpers-Bd9xbaib.d.ts +329 -0
  102. package/dist/epistemicHelpers.d.ts +4 -0
  103. package/dist/epistemicHelpers.js +999 -0
  104. package/dist/epistemicHelpers.js.map +1 -0
  105. package/dist/epistemicLinking-CyeLOIzN.d.ts +35 -0
  106. package/dist/epistemicLinking.d.ts +1 -0
  107. package/dist/epistemicLinking.js +1391 -0
  108. package/dist/epistemicLinking.js.map +1 -0
  109. package/dist/epistemicNodes-BpD6Koud.d.ts +167 -0
  110. package/dist/epistemicNodes.d.ts +2 -0
  111. package/dist/epistemicNodes.js +2942 -0
  112. package/dist/epistemicNodes.js.map +1 -0
  113. package/dist/epistemicQuestions-CmEeY6zQ.d.ts +214 -0
  114. package/dist/epistemicQuestions.d.ts +3 -0
  115. package/dist/epistemicQuestions.js +4993 -0
  116. package/dist/epistemicQuestions.js.map +1 -0
  117. package/dist/epistemicSources-ZazxHOK1.d.ts +25 -0
  118. package/dist/epistemicSources.d.ts +1 -0
  119. package/dist/epistemicSources.js +2025 -0
  120. package/dist/epistemicSources.js.map +1 -0
  121. package/dist/evaluators/index.d.ts +9 -0
  122. package/dist/evaluators/index.js +8440 -0
  123. package/dist/evaluators/index.js.map +1 -0
  124. package/dist/evaluators/lintCheckerEvaluator.d.ts +11 -0
  125. package/dist/evaluators/lintCheckerEvaluator.js +155 -0
  126. package/dist/evaluators/lintCheckerEvaluator.js.map +1 -0
  127. package/dist/evaluators/sentryCheckerEvaluator.d.ts +11 -0
  128. package/dist/evaluators/sentryCheckerEvaluator.js +126 -0
  129. package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -0
  130. package/dist/evaluators/shared.d.ts +27 -0
  131. package/dist/evaluators/shared.js +92 -0
  132. package/dist/evaluators/shared.js.map +1 -0
  133. package/dist/evaluators/testRunnerEvaluator.d.ts +17 -0
  134. package/dist/evaluators/testRunnerEvaluator.js +232 -0
  135. package/dist/evaluators/testRunnerEvaluator.js.map +1 -0
  136. package/dist/evaluators/tscCheckerEvaluator.d.ts +11 -0
  137. package/dist/evaluators/tscCheckerEvaluator.js +189 -0
  138. package/dist/evaluators/tscCheckerEvaluator.js.map +1 -0
  139. package/dist/globalId-DKh9d_uD.d.ts +20 -0
  140. package/dist/globalId.d.ts +1 -0
  141. package/dist/globalId.js +15 -0
  142. package/dist/globalId.js.map +1 -0
  143. package/dist/graphTypes-CpgIuCdo.d.ts +52 -0
  144. package/dist/graphTypes.d.ts +1 -0
  145. package/dist/graphTypes.js +120 -0
  146. package/dist/graphTypes.js.map +1 -0
  147. package/dist/helpers-BYHIk5vU.d.ts +27 -0
  148. package/dist/helpers.d.ts +4 -0
  149. package/dist/helpers.js +313 -0
  150. package/dist/helpers.js.map +1 -0
  151. package/dist/index-Dct1T70K.d.ts +25 -0
  152. package/dist/index-Dq-7R-gi.d.ts +31 -0
  153. package/dist/index.d.ts +45 -0
  154. package/dist/index.js +22294 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/invariantEnforcement.d.ts +52 -0
  157. package/dist/invariantEnforcement.js +231 -0
  158. package/dist/invariantEnforcement.js.map +1 -0
  159. package/dist/logicalRoleInference-CJxqWi3u.d.ts +16 -0
  160. package/dist/logicalRoleInference.d.ts +3 -0
  161. package/dist/logicalRoleInference.js +64 -0
  162. package/dist/logicalRoleInference.js.map +1 -0
  163. package/dist/matcherFeedbackUtils.d.ts +33 -0
  164. package/dist/matcherFeedbackUtils.js +95 -0
  165. package/dist/matcherFeedbackUtils.js.map +1 -0
  166. package/dist/ontology-matching-Buhu23ss.d.ts +48 -0
  167. package/dist/ontology-matching.d.ts +2 -0
  168. package/dist/ontology-matching.js +346 -0
  169. package/dist/ontology-matching.js.map +1 -0
  170. package/dist/ontologyApproval-Ba0Jjk1k.d.ts +26 -0
  171. package/dist/ontologyApproval.d.ts +1 -0
  172. package/dist/ontologyApproval.js +78 -0
  173. package/dist/ontologyApproval.js.map +1 -0
  174. package/dist/ontologyDefinitions.d.ts +72 -0
  175. package/dist/ontologyDefinitions.js +635 -0
  176. package/dist/ontologyDefinitions.js.map +1 -0
  177. package/dist/ontologyHelpers.d.ts +79 -0
  178. package/dist/ontologyHelpers.js +81 -0
  179. package/dist/ontologyHelpers.js.map +1 -0
  180. package/dist/ontologyRegistry-B67rPJ16.d.ts +31 -0
  181. package/dist/ontologyRegistry.d.ts +1 -0
  182. package/dist/ontologyRegistry.js +296 -0
  183. package/dist/ontologyRegistry.js.map +1 -0
  184. package/dist/projectionReconciliation-CxrXYGaB.d.ts +20 -0
  185. package/dist/projectionReconciliation.d.ts +1 -0
  186. package/dist/projectionReconciliation.js +261 -0
  187. package/dist/projectionReconciliation.js.map +1 -0
  188. package/dist/projectionStaleness-CAdpIsaW.d.ts +51 -0
  189. package/dist/projectionStaleness.d.ts +1 -0
  190. package/dist/projectionStaleness.js +57 -0
  191. package/dist/projectionStaleness.js.map +1 -0
  192. package/dist/questionEvidenceLinks-BdQD0TkM.d.ts +34 -0
  193. package/dist/questionEvidenceLinks.d.ts +1 -0
  194. package/dist/questionEvidenceLinks.js +1690 -0
  195. package/dist/questionEvidenceLinks.js.map +1 -0
  196. package/dist/resolverTypes-CC8Ea2E2.d.ts +20 -0
  197. package/dist/resolverTypes.d.ts +4 -0
  198. package/dist/resolverTypes.js +3 -0
  199. package/dist/resolverTypes.js.map +1 -0
  200. package/dist/resolvers-Br1a6eLV.d.ts +14 -0
  201. package/dist/resolvers.d.ts +5 -0
  202. package/dist/resolvers.js +308 -0
  203. package/dist/resolvers.js.map +1 -0
  204. package/dist/scopeResolverCompat.d.ts +26 -0
  205. package/dist/scopeResolverCompat.js +242 -0
  206. package/dist/scopeResolverCompat.js.map +1 -0
  207. package/dist/text-matching-CMn2WnVD.d.ts +40 -0
  208. package/dist/text-matching.d.ts +2 -0
  209. package/dist/text-matching.js +246 -0
  210. package/dist/text-matching.js.map +1 -0
  211. package/dist/topicOntologyResolver.d.ts +80 -0
  212. package/dist/topicOntologyResolver.js +67 -0
  213. package/dist/topicOntologyResolver.js.map +1 -0
  214. package/dist/topicProjectOverlay.d.ts +92 -0
  215. package/dist/topicProjectOverlay.js +249 -0
  216. package/dist/topicProjectOverlay.js.map +1 -0
  217. package/dist/topicScope-By_zp4tt.d.ts +34 -0
  218. package/dist/topicScope.d.ts +3 -0
  219. package/dist/topicScope.js +206 -0
  220. package/dist/topicScope.js.map +1 -0
  221. package/dist/workspaceIsolation.d.ts +44 -0
  222. package/dist/workspaceIsolation.js +950 -0
  223. package/dist/workspaceIsolation.js.map +1 -0
  224. package/package.json +46 -0
@@ -0,0 +1,556 @@
1
+ // src/edges/contains.ts
2
+ var containsPropagationSpec = {
3
+ edgeType: "contains",
4
+ direction: "outgoing",
5
+ transitivity: "none",
6
+ damping: 1,
7
+ maxHops: 1,
8
+ operator: () => null,
9
+ description: "Structural containment only. Traversed for explicit semantics, but it never propagates opinions."
10
+ };
11
+
12
+ // ../confidence/src/v1/operations/subjectiveLogic/index.ts
13
+ function opinion(belief, disbelief, uncertainty, baseRate = 0.5) {
14
+ const b = Math.max(0, Math.min(1, belief));
15
+ const d = Math.max(0, Math.min(1, disbelief));
16
+ const u = Math.max(0, Math.min(1, uncertainty));
17
+ const a = Math.max(0, Math.min(1, baseRate));
18
+ const sum = b + d + u;
19
+ if (sum === 0) {
20
+ return { b: 0, d: 0, u: 1, a };
21
+ }
22
+ return {
23
+ b: b / sum,
24
+ d: d / sum,
25
+ u: u / sum,
26
+ a
27
+ };
28
+ }
29
+ function vacuous(baseRate = 0.5) {
30
+ return { b: 0, d: 0, u: 1, a: baseRate };
31
+ }
32
+ function project(o) {
33
+ return o.b + o.a * o.u;
34
+ }
35
+ function cumulativeFusion(left, right) {
36
+ if (left.u === 0 && right.u === 0) {
37
+ return opinion(
38
+ (left.b + right.b) / 2,
39
+ (left.d + right.d) / 2,
40
+ 0,
41
+ (left.a + right.a) / 2
42
+ );
43
+ }
44
+ const k = left.u + right.u - left.u * right.u;
45
+ if (k === 0) {
46
+ return vacuous((left.a + right.a) / 2);
47
+ }
48
+ return opinion(
49
+ (left.b * right.u + right.b * left.u) / k,
50
+ (left.d * right.u + right.d * left.u) / k,
51
+ left.u * right.u / k,
52
+ (left.a + right.a) / 2
53
+ );
54
+ }
55
+ function trustDiscount(sourceOpinion, trust) {
56
+ const weight = Math.max(0, Math.min(1, Math.abs(trust)));
57
+ return opinion(
58
+ weight * sourceOpinion.b,
59
+ weight * sourceOpinion.d,
60
+ 1 - weight * (sourceOpinion.b + sourceOpinion.d),
61
+ sourceOpinion.a
62
+ );
63
+ }
64
+ var EPSILON = 1e-9;
65
+ function childBaseRateFallback(ifTrue, ifFalse, fallbackBaseRate) {
66
+ if (fallbackBaseRate !== void 0) {
67
+ return Math.max(0, Math.min(1, fallbackBaseRate));
68
+ }
69
+ if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {
70
+ return ifTrue.a;
71
+ }
72
+ return (ifTrue.a + ifFalse.a) / 2;
73
+ }
74
+ function computeConditionalDeductionBaseRate(opinionA, ifTrue, ifFalse, fallbackBaseRate) {
75
+ const denominator = 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;
76
+ if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {
77
+ const baseRate = (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;
78
+ if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {
79
+ return Math.max(0, Math.min(1, baseRate));
80
+ }
81
+ }
82
+ return fallbackBaseRate;
83
+ }
84
+ function safeCorrectionTerm(numerator, denominator) {
85
+ if (Math.abs(denominator) <= EPSILON) {
86
+ return void 0;
87
+ }
88
+ const value = numerator / denominator;
89
+ if (!Number.isFinite(value)) {
90
+ return void 0;
91
+ }
92
+ return Math.max(0, value);
93
+ }
94
+ function conditionalDeduction(opinionA, ifTrue, ifFalse, fallbackBaseRate) {
95
+ const fallbackChildBaseRate = childBaseRateFallback(
96
+ ifTrue,
97
+ ifFalse,
98
+ fallbackBaseRate
99
+ );
100
+ const childBaseRate = computeConditionalDeductionBaseRate(
101
+ opinionA,
102
+ ifTrue,
103
+ ifFalse,
104
+ fallbackChildBaseRate
105
+ );
106
+ const projectedAntecedent = project(opinionA);
107
+ const projectedAntecedentComplement = 1 - projectedAntecedent;
108
+ const intermediateBelief = opinionA.b * ifTrue.b + opinionA.d * ifFalse.b + opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));
109
+ const intermediateDisbelief = opinionA.b * ifTrue.d + opinionA.d * ifFalse.d + opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));
110
+ const intermediateUncertainty = opinionA.b * ifTrue.u + opinionA.d * ifFalse.u + opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));
111
+ const projectedVacuousDeduction = ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a) + childBaseRate * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));
112
+ const projectedConditionalA = ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);
113
+ let correction = 0;
114
+ if (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d || ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d) {
115
+ correction = 0;
116
+ } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {
117
+ const beliefGap = ifTrue.b - ifFalse.b;
118
+ const disbeliefGap = ifFalse.d - ifTrue.d;
119
+ if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent <= opinionA.a) {
120
+ correction = safeCorrectionTerm(
121
+ opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),
122
+ projectedAntecedent * childBaseRate
123
+ ) ?? 0;
124
+ } else if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent > opinionA.a) {
125
+ correction = safeCorrectionTerm(
126
+ opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,
127
+ projectedAntecedentComplement * childBaseRate * disbeliefGap
128
+ ) ?? 0;
129
+ } else if (projectedVacuousDeduction > projectedConditionalA && projectedAntecedent <= opinionA.a) {
130
+ correction = safeCorrectionTerm(
131
+ (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b) * disbeliefGap,
132
+ projectedAntecedent * (1 - childBaseRate) * beliefGap
133
+ ) ?? 0;
134
+ } else {
135
+ correction = safeCorrectionTerm(
136
+ (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),
137
+ projectedAntecedentComplement * (1 - childBaseRate)
138
+ ) ?? 0;
139
+ }
140
+ } else {
141
+ const beliefGap = ifFalse.b - ifTrue.b;
142
+ const disbeliefGap = ifTrue.d - ifFalse.d;
143
+ if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent <= opinionA.a) {
144
+ correction = safeCorrectionTerm(
145
+ (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,
146
+ projectedAntecedent * childBaseRate * disbeliefGap
147
+ ) ?? 0;
148
+ } else if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent > opinionA.a) {
149
+ correction = safeCorrectionTerm(
150
+ (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),
151
+ projectedAntecedentComplement * childBaseRate
152
+ ) ?? 0;
153
+ } else if (projectedVacuousDeduction > projectedConditionalA && projectedAntecedent <= opinionA.a) {
154
+ correction = safeCorrectionTerm(
155
+ opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),
156
+ projectedAntecedent * (1 - childBaseRate)
157
+ ) ?? 0;
158
+ } else {
159
+ correction = safeCorrectionTerm(
160
+ opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b) * disbeliefGap,
161
+ projectedAntecedentComplement * (1 - childBaseRate) * beliefGap
162
+ ) ?? 0;
163
+ }
164
+ }
165
+ return opinion(
166
+ intermediateBelief - childBaseRate * correction,
167
+ intermediateDisbelief - (1 - childBaseRate) * correction,
168
+ intermediateUncertainty + correction,
169
+ childBaseRate
170
+ );
171
+ }
172
+ function negate(o) {
173
+ return { b: o.d, d: o.b, u: o.u, a: 1 - o.a };
174
+ }
175
+ function constraintFusion(left, right, mode = "pressure") {
176
+ if (mode === "redistribute") {
177
+ const leftProjected = project(left);
178
+ const rightProjected = project(right);
179
+ const total = leftProjected + rightProjected;
180
+ if (total <= 1) {
181
+ return { o1: left, o2: right };
182
+ }
183
+ const scale = 1 / total;
184
+ return {
185
+ o1: opinion(
186
+ left.b * scale,
187
+ left.d + left.b * (1 - scale),
188
+ left.u,
189
+ left.a
190
+ ),
191
+ o2: opinion(
192
+ right.b * scale,
193
+ right.d + right.b * (1 - scale),
194
+ right.u,
195
+ right.a
196
+ )
197
+ };
198
+ }
199
+ const pressureLeft = right.b * 0.5;
200
+ const pressureRight = left.b * 0.5;
201
+ return {
202
+ o1: opinion(
203
+ left.b - pressureLeft * 0.3,
204
+ left.d + pressureLeft * 0.3,
205
+ left.u,
206
+ left.a
207
+ ),
208
+ o2: opinion(
209
+ right.b - pressureRight * 0.3,
210
+ right.d + pressureRight * 0.3,
211
+ right.u,
212
+ right.a
213
+ )
214
+ };
215
+ }
216
+
217
+ // ../confidence/src/v1/operations/dynamics/cascade.ts
218
+ function dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode = "continuous", threshold = 0.3) {
219
+ const dependencyProjection = project(dependencyOpinion);
220
+ if (mode === "threshold") {
221
+ if (dependencyProjection < threshold) {
222
+ return opinion(
223
+ 0,
224
+ beliefOpinion.d + beliefOpinion.b * 0.5,
225
+ 0.5,
226
+ beliefOpinion.a
227
+ );
228
+ }
229
+ return beliefOpinion;
230
+ }
231
+ const dampingFactor = Math.pow(dependencyProjection, 0.5);
232
+ return opinion(
233
+ beliefOpinion.b * dampingFactor,
234
+ beliefOpinion.d + beliefOpinion.b * (1 - dampingFactor) * 0.3,
235
+ beliefOpinion.u + beliefOpinion.b * (1 - dampingFactor) * 0.7,
236
+ beliefOpinion.a
237
+ );
238
+ }
239
+ function dampedDependencyCascade(dependencyOpinion, beliefOpinion, mode = "continuous") {
240
+ return {
241
+ opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),
242
+ operator: "dependency_cascade",
243
+ rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(
244
+ dependencyOpinion
245
+ ).toFixed(2)}`
246
+ };
247
+ }
248
+
249
+ // ../confidence/src/v1/operations/dynamics/defeat.ts
250
+ function applyNegativeSupport(source, target, weight, metadata = {}) {
251
+ if (metadata.constraint === "xor") {
252
+ const result = constraintFusion(
253
+ source,
254
+ target,
255
+ metadata.normalization ?? "pressure"
256
+ );
257
+ return {
258
+ opinion: result.o2,
259
+ operator: "constraint_fusion",
260
+ rationale: `XOR constraint: source belief at ${project(source).toFixed(
261
+ 2
262
+ )} pressures target`
263
+ };
264
+ }
265
+ const discounted = trustDiscount(negate(source), Math.abs(weight));
266
+ return {
267
+ opinion: cumulativeFusion(target, discounted),
268
+ operator: "cumulative_fusion",
269
+ rationale: `Contradicting evidence (weight=${weight.toFixed(
270
+ 2
271
+ )}) from source at ${project(source).toFixed(2)}`
272
+ };
273
+ }
274
+ function applyNegativeEvidence(source, target, weight) {
275
+ const discounted = trustDiscount(negate(source), Math.abs(weight));
276
+ return {
277
+ opinion: cumulativeFusion(target, discounted),
278
+ operator: "cumulative_fusion",
279
+ rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`
280
+ };
281
+ }
282
+
283
+ // src/edges/utils.ts
284
+ function readEdgeMetadata(edge) {
285
+ return {
286
+ constraint: edge.constraint ?? void 0,
287
+ normalization: edge.normalization ?? void 0,
288
+ propagation: edge.propagation ?? void 0,
289
+ conditionalA: edge.conditionalA ?? void 0,
290
+ conditionalNotA: edge.conditionalNotA ?? void 0
291
+ };
292
+ }
293
+ function applyPerHopDamping(sourceOpinion, damping) {
294
+ if (damping >= 1) {
295
+ return sourceOpinion;
296
+ }
297
+ return trustDiscount(sourceOpinion, Math.max(0, damping));
298
+ }
299
+ function annotateRationale(result, spec, hop) {
300
+ return {
301
+ ...result,
302
+ rationale: `hop=${hop} edge=${spec.edgeType} damping=${spec.damping.toFixed(
303
+ 2
304
+ )} :: ${result.rationale}`
305
+ };
306
+ }
307
+ function propagatePositiveSupport(sourceOpinion, targetOpinion, edgeWeight) {
308
+ const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));
309
+ return {
310
+ opinion: cumulativeFusion(targetOpinion, discounted),
311
+ operator: "cumulative_fusion",
312
+ rationale: `Supporting evidence (weight=${edgeWeight.toFixed(
313
+ 2
314
+ )}) from source at ${project(sourceOpinion).toFixed(2)}`
315
+ };
316
+ }
317
+ function propagatePositiveInform(sourceOpinion, targetOpinion, edgeWeight) {
318
+ const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));
319
+ return {
320
+ opinion: cumulativeFusion(targetOpinion, discounted),
321
+ operator: "cumulative_fusion",
322
+ rationale: `Supporting evidence (weight=${edgeWeight.toFixed(2)})`
323
+ };
324
+ }
325
+ function propagateNegativeSupportWithMetadata(sourceOpinion, targetOpinion, edgeWeight, edge) {
326
+ return applyNegativeSupport(
327
+ sourceOpinion,
328
+ targetOpinion,
329
+ edgeWeight,
330
+ readEdgeMetadata(edge)
331
+ );
332
+ }
333
+ function propagateNegativeInform(sourceOpinion, targetOpinion, edgeWeight) {
334
+ return applyNegativeEvidence(sourceOpinion, targetOpinion, edgeWeight);
335
+ }
336
+
337
+ // src/edges/contradicts.ts
338
+ var contradictsPropagationSpec = {
339
+ edgeType: "contradicts",
340
+ direction: "bidirectional",
341
+ transitivity: "none",
342
+ damping: 0.85,
343
+ maxHops: 1,
344
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
345
+ const dampedSource = applyPerHopDamping(
346
+ sourceOpinion,
347
+ context.spec.damping
348
+ );
349
+ const negativeWeight = -Math.abs(edge.weight ?? 1);
350
+ const result = propagateNegativeSupportWithMetadata(
351
+ dampedSource,
352
+ targetOpinion,
353
+ negativeWeight,
354
+ edge
355
+ );
356
+ return annotateRationale(result, context.spec, context.hop);
357
+ },
358
+ description: "Legacy contradiction edges move negative pressure in either direction, but never beyond one hop."
359
+ };
360
+
361
+ // src/edges/dependsOn.ts
362
+ var dependsOnPropagationSpec = {
363
+ edgeType: "depends_on",
364
+ direction: "incoming",
365
+ transitivity: "damped",
366
+ damping: 0.8,
367
+ maxHops: "unbounded",
368
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
369
+ const dampedSource = applyPerHopDamping(
370
+ sourceOpinion,
371
+ context.spec.damping
372
+ );
373
+ const metadata = readEdgeMetadata(edge);
374
+ if (metadata.conditionalA && metadata.conditionalNotA) {
375
+ const deducedOpinion = conditionalDeduction(
376
+ dampedSource,
377
+ metadata.conditionalA,
378
+ metadata.conditionalNotA,
379
+ targetOpinion.a
380
+ );
381
+ return annotateRationale(
382
+ {
383
+ opinion: deducedOpinion,
384
+ operator: "conditional_deduction",
385
+ rationale: `Conditional deduction: prerequisite at ${project(
386
+ dampedSource
387
+ ).toFixed(2)}`
388
+ },
389
+ context.spec,
390
+ context.hop
391
+ );
392
+ }
393
+ const result = dampedDependencyCascade(
394
+ dampedSource,
395
+ targetOpinion,
396
+ metadata.propagation ?? "continuous"
397
+ );
398
+ return annotateRationale(result, context.spec, context.hop);
399
+ },
400
+ description: "Structural gating. Textbook conditional deduction when edge conditionals exist, otherwise damped dependency cascade through downstream chains."
401
+ };
402
+
403
+ // src/edges/derivedFrom.ts
404
+ var derivedFromPropagationSpec = {
405
+ edgeType: "derived_from",
406
+ direction: "incoming",
407
+ transitivity: "none",
408
+ damping: 1,
409
+ maxHops: 1,
410
+ operator: () => null,
411
+ description: "Provenance only. The traversal surface stays explicit, but confidence does not move across derived_from edges."
412
+ };
413
+
414
+ // src/edges/elaborates.ts
415
+ var elaboratesPropagationSpec = {
416
+ edgeType: "elaborates",
417
+ direction: "outgoing",
418
+ transitivity: "damped",
419
+ damping: 0.7,
420
+ maxHops: 2,
421
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
422
+ const dampedSource = applyPerHopDamping(
423
+ sourceOpinion,
424
+ context.spec.damping
425
+ );
426
+ const contextualWeight = Math.min(Math.abs(edge.weight ?? 0.35), 0.35);
427
+ const result = propagatePositiveInform(
428
+ dampedSource,
429
+ targetOpinion,
430
+ contextualWeight
431
+ );
432
+ return annotateRationale(result, context.spec, context.hop);
433
+ },
434
+ description: "Context-rich supporting detail. Elaborates carries a small positive effect with short, damped chaining."
435
+ };
436
+
437
+ // src/edges/informs.ts
438
+ var informsPropagationSpec = {
439
+ edgeType: "informs",
440
+ direction: "outgoing",
441
+ transitivity: "full",
442
+ damping: 0.92,
443
+ maxHops: "unbounded",
444
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
445
+ const dampedSource = applyPerHopDamping(
446
+ sourceOpinion,
447
+ context.spec.damping
448
+ );
449
+ const weight = edge.weight ?? 1;
450
+ const result = weight < 0 ? propagateNegativeInform(dampedSource, targetOpinion, weight) : propagatePositiveInform(dampedSource, targetOpinion, weight);
451
+ return annotateRationale(result, context.spec, context.hop);
452
+ },
453
+ description: "Evidence-bearing influence. Informs can chain through the graph with light per-hop damping."
454
+ };
455
+
456
+ // src/edges/propagationTypes.ts
457
+ function isPropagationTraversalDirection(direction) {
458
+ return direction === "outgoing" || direction === "incoming";
459
+ }
460
+ function canTraverseHop(spec, nextHop) {
461
+ return spec.maxHops === "unbounded" || nextHop <= spec.maxHops;
462
+ }
463
+ function canContinueTransitively(spec, currentHop) {
464
+ if (spec.transitivity === "none") {
465
+ return false;
466
+ }
467
+ return spec.maxHops === "unbounded" || currentHop < spec.maxHops;
468
+ }
469
+
470
+ // src/edges/refutes.ts
471
+ var refutesPropagationSpec = {
472
+ edgeType: "refutes",
473
+ direction: "outgoing",
474
+ transitivity: "none",
475
+ damping: 0.9,
476
+ maxHops: 1,
477
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
478
+ const dampedSource = applyPerHopDamping(
479
+ sourceOpinion,
480
+ context.spec.damping
481
+ );
482
+ const negativeWeight = -Math.abs(edge.weight ?? 1);
483
+ const result = propagateNegativeInform(
484
+ dampedSource,
485
+ targetOpinion,
486
+ negativeWeight
487
+ );
488
+ return annotateRationale(result, context.spec, context.hop);
489
+ },
490
+ description: "Explicit negative evidence semantics. Refutes is treated as strong one-hop counter-evidence."
491
+ };
492
+
493
+ // src/edges/supports.ts
494
+ var supportsPropagationSpec = {
495
+ edgeType: "supports",
496
+ direction: "outgoing",
497
+ transitivity: "full",
498
+ damping: 0.85,
499
+ maxHops: "unbounded",
500
+ operator: (sourceOpinion, targetOpinion, edge, context) => {
501
+ const dampedSource = applyPerHopDamping(
502
+ sourceOpinion,
503
+ context.spec.damping
504
+ );
505
+ const weight = edge.weight ?? 1;
506
+ const result = weight < 0 ? propagateNegativeSupportWithMetadata(
507
+ dampedSource,
508
+ targetOpinion,
509
+ weight,
510
+ edge
511
+ ) : propagatePositiveSupport(dampedSource, targetOpinion, weight);
512
+ return annotateRationale(result, context.spec, context.hop);
513
+ },
514
+ description: "Belief-to-belief influence. Supports chains transitively with moderate per-hop damping."
515
+ };
516
+
517
+ // src/edges/tests.ts
518
+ var testsPropagationSpec = {
519
+ edgeType: "tests",
520
+ direction: "outgoing",
521
+ transitivity: "none",
522
+ damping: 1,
523
+ maxHops: 1,
524
+ operator: () => null,
525
+ description: "Interrogation linkage only. Tests edges do not directly move confidence."
526
+ };
527
+
528
+ // src/edges/index.ts
529
+ var EDGE_PROPAGATION_SPECS = [
530
+ supportsPropagationSpec,
531
+ informsPropagationSpec,
532
+ dependsOnPropagationSpec,
533
+ derivedFromPropagationSpec,
534
+ containsPropagationSpec,
535
+ testsPropagationSpec,
536
+ contradictsPropagationSpec,
537
+ refutesPropagationSpec,
538
+ elaboratesPropagationSpec
539
+ ];
540
+ var EDGE_PROPAGATION_SPEC_MAP = new Map(EDGE_PROPAGATION_SPECS.map((spec) => [spec.edgeType, spec]));
541
+ function getEdgePropagationSpec(edgeType) {
542
+ return EDGE_PROPAGATION_SPEC_MAP.get(edgeType);
543
+ }
544
+ function getEdgePropagationSpecs() {
545
+ return EDGE_PROPAGATION_SPECS;
546
+ }
547
+ function getTraversalDirections(direction) {
548
+ if (isPropagationTraversalDirection(direction)) {
549
+ return [direction];
550
+ }
551
+ return ["outgoing", "incoming"];
552
+ }
553
+
554
+ export { EDGE_PROPAGATION_SPECS, canContinueTransitively, canTraverseHop, getEdgePropagationSpec, getEdgePropagationSpecs, getTraversalDirections, isPropagationTraversalDirection };
555
+ //# sourceMappingURL=index.js.map
556
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/edges/contains.ts","../../../confidence/src/v1/operations/subjectiveLogic/index.ts","../../../confidence/src/v1/operations/dynamics/cascade.ts","../../../confidence/src/v1/operations/dynamics/defeat.ts","../../src/edges/utils.ts","../../src/edges/contradicts.ts","../../src/edges/dependsOn.ts","../../src/edges/derivedFrom.ts","../../src/edges/elaborates.ts","../../src/edges/informs.ts","../../src/edges/propagationTypes.ts","../../src/edges/refutes.ts","../../src/edges/supports.ts","../../src/edges/tests.ts","../../src/edges/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const containsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contains\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Structural containment only. Traversed for explicit semantics, but it never propagates opinions.\",\n};\n\n","import type { Opinion } from \"../../types\";\n\nexport function opinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number = 0.5\n): Opinion {\n const b = Math.max(0, Math.min(1, belief));\n const d = Math.max(0, Math.min(1, disbelief));\n const u = Math.max(0, Math.min(1, uncertainty));\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 };\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n };\n}\n\nexport function vacuous(baseRate: number = 0.5): Opinion {\n return { b: 0, d: 0, u: 1, a: baseRate };\n}\n\nexport function dogmatic(probability: number, baseRate: number = 0.5): Opinion {\n const p = Math.max(0, Math.min(1, probability));\n return { b: p, d: 1 - p, u: 0, a: baseRate };\n}\n\nexport function project(o: Opinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: Opinion): \"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: Opinion, right: Opinion): Opinion {\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: Opinion, right: Opinion): Opinion {\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: Opinion, trust: number): Opinion {\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: Opinion,\n ifFalse: Opinion,\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: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\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: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate?: number\n): Opinion {\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: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n baseRateX: number\n): Opinion {\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: Opinion): Opinion {\n return { b: o.d, d: o.b, u: o.u, a: 1 - o.a };\n}\n\nexport function constraintFusion(\n left: Opinion,\n right: Opinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: Opinion; o2: Opinion } {\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: Opinion): 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: Opinion, right: Opinion): 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: Opinion): 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 type { Opinion, PropagationMode, PropagationResult } from \"../../types\";\nimport { opinion, project } from \"../subjectiveLogic\";\n\nexport function dampedDependencyOpinion(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\",\n threshold: number = 0.3\n): Opinion {\n const dependencyProjection = project(dependencyOpinion);\n\n if (mode === \"threshold\") {\n if (dependencyProjection < threshold) {\n return opinion(\n 0,\n beliefOpinion.d + beliefOpinion.b * 0.5,\n 0.5,\n beliefOpinion.a\n );\n }\n return beliefOpinion;\n }\n\n const dampingFactor = Math.pow(dependencyProjection, 0.5);\n return opinion(\n beliefOpinion.b * dampingFactor,\n beliefOpinion.d + beliefOpinion.b * (1 - dampingFactor) * 0.3,\n beliefOpinion.u + beliefOpinion.b * (1 - dampingFactor) * 0.7,\n beliefOpinion.a\n );\n}\n\nexport function dampedDependencyCascade(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\"\n): PropagationResult {\n return {\n opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),\n operator: \"dependency_cascade\",\n rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(\n dependencyOpinion\n ).toFixed(2)}`,\n };\n}\n","import type { EdgeMetadata, Opinion, PropagationResult } from \"../../types\";\nimport {\n constraintFusion,\n cumulativeFusion,\n negate,\n project,\n trustDiscount,\n} from \"../subjectiveLogic\";\n\nexport function applyNegativeSupport(\n source: Opinion,\n target: Opinion,\n weight: number,\n metadata: EdgeMetadata = {}\n): PropagationResult {\n if (metadata.constraint === \"xor\") {\n const result = constraintFusion(\n source,\n target,\n metadata.normalization ?? \"pressure\"\n );\n return {\n opinion: result.o2,\n operator: \"constraint_fusion\",\n rationale: `XOR constraint: source belief at ${project(source).toFixed(\n 2\n )} pressures target`,\n };\n }\n\n const discounted = trustDiscount(negate(source), Math.abs(weight));\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(\n 2\n )}) from source at ${project(source).toFixed(2)}`,\n };\n}\n\nexport function applyNegativeEvidence(\n source: Opinion,\n target: Opinion,\n weight: number\n): PropagationResult {\n const discounted = trustDiscount(negate(source), Math.abs(weight));\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`,\n };\n}\n","import {\n applyNegativeEvidence,\n applyNegativeSupport,\n cumulativeFusion,\n project,\n trustDiscount,\n type EdgeMetadata,\n type Opinion,\n type PropagationResult,\n} from \"@lucern/confidence\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n} from \"./propagationTypes\";\n\nexport function readEdgeMetadata<TNodeId extends string>(\n edge: PropagationEdgeRecord<TNodeId>\n): EdgeMetadata {\n return {\n constraint: edge.constraint ?? undefined,\n normalization: edge.normalization ?? undefined,\n propagation: edge.propagation ?? undefined,\n conditionalA: edge.conditionalA ?? undefined,\n conditionalNotA: edge.conditionalNotA ?? undefined,\n };\n}\n\nexport function applyPerHopDamping(\n sourceOpinion: Opinion,\n damping: number\n): Opinion {\n if (damping >= 1) {\n return sourceOpinion;\n }\n\n return trustDiscount(sourceOpinion, Math.max(0, damping));\n}\n\nexport function annotateRationale(\n result: PropagationResult,\n spec: EdgePropagationSpec,\n hop: number\n): PropagationResult {\n return {\n ...result,\n rationale: `hop=${hop} edge=${spec.edgeType} damping=${spec.damping.toFixed(\n 2\n )} :: ${result.rationale}`,\n };\n}\n\nexport function propagatePositiveSupport(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(\n 2\n )}) from source at ${project(sourceOpinion).toFixed(2)}`,\n };\n}\n\nexport function propagatePositiveInform(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(2)})`,\n };\n}\n\nexport function propagateNegativeSupportWithMetadata(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeWeight: number,\n edge: PropagationEdgeRecord\n): PropagationResult {\n return applyNegativeSupport(\n sourceOpinion,\n targetOpinion,\n edgeWeight,\n readEdgeMetadata(edge)\n );\n}\n\nexport function propagateNegativeInform(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeWeight: number\n): PropagationResult {\n return applyNegativeEvidence(sourceOpinion, targetOpinion, edgeWeight);\n}\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n} from \"./utils\";\n\nexport const contradictsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contradicts\",\n direction: \"bidirectional\",\n transitivity: \"none\",\n damping: 0.85,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n negativeWeight,\n edge\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Legacy contradiction edges move negative pressure in either direction, but never beyond one hop.\",\n};\n\n","import {\n conditionalDeduction,\n dampedDependencyCascade,\n project,\n} from \"@lucern/confidence\";\nimport type { EdgePropagationSpec } from \"./propagationTypes\";\nimport { annotateRationale, applyPerHopDamping, readEdgeMetadata } from \"./utils\";\n\nexport const dependsOnPropagationSpec: EdgePropagationSpec = {\n edgeType: \"depends_on\",\n direction: \"incoming\",\n transitivity: \"damped\",\n damping: 0.8,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const metadata = readEdgeMetadata(edge);\n\n if (metadata.conditionalA && metadata.conditionalNotA) {\n const deducedOpinion = conditionalDeduction(\n dampedSource,\n metadata.conditionalA,\n metadata.conditionalNotA,\n targetOpinion.a\n );\n\n return annotateRationale(\n {\n opinion: deducedOpinion,\n operator: \"conditional_deduction\",\n rationale: `Conditional deduction: prerequisite at ${project(\n dampedSource\n ).toFixed(2)}`,\n },\n context.spec,\n context.hop\n );\n }\n\n const result = dampedDependencyCascade(\n dampedSource,\n targetOpinion,\n metadata.propagation ?? \"continuous\"\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Structural gating. Textbook conditional deduction when edge conditionals exist, otherwise damped dependency cascade through downstream chains.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const derivedFromPropagationSpec: EdgePropagationSpec = {\n edgeType: \"derived_from\",\n direction: \"incoming\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Provenance only. The traversal surface stays explicit, but confidence does not move across derived_from edges.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const elaboratesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"elaborates\",\n direction: \"outgoing\",\n transitivity: \"damped\",\n damping: 0.7,\n maxHops: 2,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const contextualWeight = Math.min(Math.abs(edge.weight ?? 0.35), 0.35);\n const result = propagatePositiveInform(\n dampedSource,\n targetOpinion,\n contextualWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Context-rich supporting detail. Elaborates carries a small positive effect with short, damped chaining.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const informsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"informs\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.92,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeInform(dampedSource, targetOpinion, weight)\n : propagatePositiveInform(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Evidence-bearing influence. Informs can chain through the graph with light per-hop damping.\",\n};\n\n","import type {\n EdgeMetadata,\n Opinion,\n PropagationResult,\n} from \"@lucern/confidence\";\n\nexport type PropagationTraversalDirection = \"outgoing\" | \"incoming\";\n\nexport type PropagationSpecDirection =\n | PropagationTraversalDirection\n | \"bidirectional\";\n\nexport type PropagationTransitivity = \"none\" | \"damped\" | \"full\";\n\nexport type PropagationEdgeType =\n | \"supports\"\n | \"depends_on\"\n | \"informs\"\n | \"contains\"\n | \"tests\"\n | \"derived_from\"\n | \"contradicts\"\n | \"refutes\"\n | \"elaborates\";\n\nexport type PropagationEdgeRecord<TNodeId extends string = string> = {\n fromNodeId?: TNodeId | null;\n toNodeId?: TNodeId | null;\n edgeType: string;\n weight?: number | null;\n constraint?: EdgeMetadata[\"constraint\"] | null;\n normalization?: EdgeMetadata[\"normalization\"] | null;\n propagation?: EdgeMetadata[\"propagation\"] | null;\n conditionalA?: EdgeMetadata[\"conditionalA\"] | null;\n conditionalNotA?: EdgeMetadata[\"conditionalNotA\"] | null;\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type EdgePropagationSpec<TNodeId extends string = string> = {\n edgeType: PropagationEdgeType;\n direction: PropagationSpecDirection;\n transitivity: PropagationTransitivity;\n damping: number;\n maxHops: number | \"unbounded\";\n operator: (\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edge: PropagationEdgeRecord<TNodeId>,\n context: {\n hop: number;\n sourceNodeId: TNodeId;\n targetNodeId: TNodeId;\n traversedDirection: PropagationTraversalDirection;\n spec: EdgePropagationSpec<TNodeId>;\n }\n ) => PropagationResult | null;\n description: string;\n};\n\nexport function isPropagationTraversalDirection(\n direction: string\n): direction is PropagationTraversalDirection {\n return direction === \"outgoing\" || direction === \"incoming\";\n}\n\nexport function canTraverseHop<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n nextHop: number\n): boolean {\n return spec.maxHops === \"unbounded\" || nextHop <= spec.maxHops;\n}\n\nexport function canContinueTransitively<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n currentHop: number\n): boolean {\n if (spec.transitivity === \"none\") {\n return false;\n }\n\n return spec.maxHops === \"unbounded\" || currentHop < spec.maxHops;\n}\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n} from \"./utils\";\n\nexport const refutesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"refutes\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 0.9,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeInform(\n dampedSource,\n targetOpinion,\n negativeWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Explicit negative evidence semantics. Refutes is treated as strong one-hop counter-evidence.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n propagatePositiveSupport,\n} from \"./utils\";\n\nexport const supportsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"supports\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.85,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n weight,\n edge\n )\n : propagatePositiveSupport(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Belief-to-belief influence. Supports chains transitively with moderate per-hop damping.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const testsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"tests\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Interrogation linkage only. Tests edges do not directly move confidence.\",\n};\n\n","import { containsPropagationSpec } from \"./contains\";\nimport { contradictsPropagationSpec } from \"./contradicts\";\nimport { dependsOnPropagationSpec } from \"./dependsOn\";\nimport { derivedFromPropagationSpec } from \"./derivedFrom\";\nimport { elaboratesPropagationSpec } from \"./elaborates\";\nimport { informsPropagationSpec } from \"./informs\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport { refutesPropagationSpec } from \"./refutes\";\nimport { supportsPropagationSpec } from \"./supports\";\nimport { testsPropagationSpec } from \"./tests\";\n\nexport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTransitivity,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nexport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\n\nexport const EDGE_PROPAGATION_SPECS: readonly EdgePropagationSpec[] = [\n supportsPropagationSpec,\n informsPropagationSpec,\n dependsOnPropagationSpec,\n derivedFromPropagationSpec,\n containsPropagationSpec,\n testsPropagationSpec,\n contradictsPropagationSpec,\n refutesPropagationSpec,\n elaboratesPropagationSpec,\n] as const;\n\nconst EDGE_PROPAGATION_SPEC_MAP = new Map<\n PropagationEdgeType,\n EdgePropagationSpec\n>(EDGE_PROPAGATION_SPECS.map((spec) => [spec.edgeType, spec]));\n\nexport function getEdgePropagationSpec(\n edgeType: string\n): EdgePropagationSpec | undefined {\n return EDGE_PROPAGATION_SPEC_MAP.get(edgeType as PropagationEdgeType);\n}\n\nexport function getEdgePropagationSpecs(): readonly EdgePropagationSpec[] {\n return EDGE_PROPAGATION_SPECS;\n}\n\nexport function getTraversalDirections(\n direction: PropagationSpecDirection\n): readonly PropagationTraversalDirection[] {\n if (isPropagationTraversalDirection(direction)) {\n return [direction];\n }\n\n return [\"outgoing\", \"incoming\"];\n}\n\n"]}
@@ -0,0 +1,6 @@
1
+ import { EdgePropagationSpec } from './propagationTypes.js';
2
+ import '@lucern/confidence';
3
+
4
+ declare const informsPropagationSpec: EdgePropagationSpec;
5
+
6
+ export { informsPropagationSpec };