lex-agentic-inference 0.1.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 (328) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +21 -0
  5. data/README.md +13 -0
  6. data/lex-agentic-inference.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/inference/abductive/client.rb +25 -0
  8. data/lib/legion/extensions/agentic/inference/abductive/helpers/abduction_engine.rb +164 -0
  9. data/lib/legion/extensions/agentic/inference/abductive/helpers/constants.rb +39 -0
  10. data/lib/legion/extensions/agentic/inference/abductive/helpers/hypothesis.rb +106 -0
  11. data/lib/legion/extensions/agentic/inference/abductive/helpers/observation.rb +39 -0
  12. data/lib/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning.rb +129 -0
  13. data/lib/legion/extensions/agentic/inference/abductive/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/inference/abductive.rb +20 -0
  15. data/lib/legion/extensions/agentic/inference/affordance/actors/scan.rb +31 -0
  16. data/lib/legion/extensions/agentic/inference/affordance/client.rb +28 -0
  17. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_field.rb +123 -0
  18. data/lib/legion/extensions/agentic/inference/affordance/helpers/affordance_item.rb +75 -0
  19. data/lib/legion/extensions/agentic/inference/affordance/helpers/constants.rb +42 -0
  20. data/lib/legion/extensions/agentic/inference/affordance/runners/affordance.rb +90 -0
  21. data/lib/legion/extensions/agentic/inference/affordance/version.rb +13 -0
  22. data/lib/legion/extensions/agentic/inference/affordance.rb +19 -0
  23. data/lib/legion/extensions/agentic/inference/analogical/client.rb +28 -0
  24. data/lib/legion/extensions/agentic/inference/analogical/helpers/analogy_engine.rb +209 -0
  25. data/lib/legion/extensions/agentic/inference/analogical/helpers/constants.rb +38 -0
  26. data/lib/legion/extensions/agentic/inference/analogical/helpers/structure_map.rb +113 -0
  27. data/lib/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning.rb +106 -0
  28. data/lib/legion/extensions/agentic/inference/analogical/version.rb +13 -0
  29. data/lib/legion/extensions/agentic/inference/analogical.rb +19 -0
  30. data/lib/legion/extensions/agentic/inference/argument_mapping/client.rb +19 -0
  31. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument.rb +102 -0
  32. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine.rb +131 -0
  33. data/lib/legion/extensions/agentic/inference/argument_mapping/helpers/constants.rb +44 -0
  34. data/lib/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping.rb +78 -0
  35. data/lib/legion/extensions/agentic/inference/argument_mapping/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/inference/argument_mapping.rb +19 -0
  37. data/lib/legion/extensions/agentic/inference/bayesian/client.rb +28 -0
  38. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief.rb +96 -0
  39. data/lib/legion/extensions/agentic/inference/bayesian/helpers/belief_network.rb +147 -0
  40. data/lib/legion/extensions/agentic/inference/bayesian/helpers/constants.rb +36 -0
  41. data/lib/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief.rb +125 -0
  42. data/lib/legion/extensions/agentic/inference/bayesian/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/inference/bayesian.rb +19 -0
  44. data/lib/legion/extensions/agentic/inference/belief_revision/client.rb +19 -0
  45. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief.rb +155 -0
  46. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/belief_network.rb +193 -0
  47. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/constants.rb +54 -0
  48. data/lib/legion/extensions/agentic/inference/belief_revision/helpers/evidence.rb +49 -0
  49. data/lib/legion/extensions/agentic/inference/belief_revision/runners/belief_revision.rb +89 -0
  50. data/lib/legion/extensions/agentic/inference/belief_revision/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/inference/belief_revision.rb +21 -0
  52. data/lib/legion/extensions/agentic/inference/causal_attribution/client.rb +27 -0
  53. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution.rb +92 -0
  54. data/lib/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine.rb +159 -0
  55. data/lib/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution.rb +111 -0
  56. data/lib/legion/extensions/agentic/inference/causal_attribution/version.rb +13 -0
  57. data/lib/legion/extensions/agentic/inference/causal_attribution.rb +18 -0
  58. data/lib/legion/extensions/agentic/inference/causal_reasoning/client.rb +24 -0
  59. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge.rb +101 -0
  60. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph.rb +184 -0
  61. data/lib/legion/extensions/agentic/inference/causal_reasoning/helpers/constants.rb +40 -0
  62. data/lib/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning.rb +111 -0
  63. data/lib/legion/extensions/agentic/inference/causal_reasoning/version.rb +13 -0
  64. data/lib/legion/extensions/agentic/inference/causal_reasoning.rb +19 -0
  65. data/lib/legion/extensions/agentic/inference/coherence/client.rb +28 -0
  66. data/lib/legion/extensions/agentic/inference/coherence/helpers/coherence_engine.rb +170 -0
  67. data/lib/legion/extensions/agentic/inference/coherence/helpers/constants.rb +35 -0
  68. data/lib/legion/extensions/agentic/inference/coherence/helpers/proposition.rb +100 -0
  69. data/lib/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence.rb +123 -0
  70. data/lib/legion/extensions/agentic/inference/coherence/version.rb +13 -0
  71. data/lib/legion/extensions/agentic/inference/coherence.rb +19 -0
  72. data/lib/legion/extensions/agentic/inference/counterfactual/client.rb +19 -0
  73. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/constants.rb +40 -0
  74. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine.rb +157 -0
  75. data/lib/legion/extensions/agentic/inference/counterfactual/helpers/scenario.rb +98 -0
  76. data/lib/legion/extensions/agentic/inference/counterfactual/runners/counterfactual.rb +106 -0
  77. data/lib/legion/extensions/agentic/inference/counterfactual/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/inference/counterfactual.rb +19 -0
  79. data/lib/legion/extensions/agentic/inference/debugging/client.rb +30 -0
  80. data/lib/legion/extensions/agentic/inference/debugging/helpers/causal_trace.rb +51 -0
  81. data/lib/legion/extensions/agentic/inference/debugging/helpers/constants.rb +58 -0
  82. data/lib/legion/extensions/agentic/inference/debugging/helpers/correction.rb +56 -0
  83. data/lib/legion/extensions/agentic/inference/debugging/helpers/debugging_engine.rb +156 -0
  84. data/lib/legion/extensions/agentic/inference/debugging/helpers/reasoning_error.rb +97 -0
  85. data/lib/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging.rb +178 -0
  86. data/lib/legion/extensions/agentic/inference/debugging/version.rb +13 -0
  87. data/lib/legion/extensions/agentic/inference/debugging.rb +21 -0
  88. data/lib/legion/extensions/agentic/inference/enactive_cognition/client.rb +27 -0
  89. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine.rb +120 -0
  90. data/lib/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop.rb +122 -0
  91. data/lib/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition.rb +124 -0
  92. data/lib/legion/extensions/agentic/inference/enactive_cognition/version.rb +13 -0
  93. data/lib/legion/extensions/agentic/inference/enactive_cognition.rb +18 -0
  94. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/client.rb +17 -0
  95. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/constants.rb +47 -0
  96. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/expectation.rb +82 -0
  97. data/lib/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine.rb +126 -0
  98. data/lib/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation.rb +76 -0
  99. data/lib/legion/extensions/agentic/inference/expectation_violation/version.rb +13 -0
  100. data/lib/legion/extensions/agentic/inference/expectation_violation.rb +19 -0
  101. data/lib/legion/extensions/agentic/inference/free_energy/client.rb +19 -0
  102. data/lib/legion/extensions/agentic/inference/free_energy/helpers/belief.rb +127 -0
  103. data/lib/legion/extensions/agentic/inference/free_energy/helpers/constants.rb +58 -0
  104. data/lib/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine.rb +156 -0
  105. data/lib/legion/extensions/agentic/inference/free_energy/runners/free_energy.rb +97 -0
  106. data/lib/legion/extensions/agentic/inference/free_energy/version.rb +13 -0
  107. data/lib/legion/extensions/agentic/inference/free_energy.rb +19 -0
  108. data/lib/legion/extensions/agentic/inference/gravity/client.rb +29 -0
  109. data/lib/legion/extensions/agentic/inference/gravity/helpers/attractor.rb +77 -0
  110. data/lib/legion/extensions/agentic/inference/gravity/helpers/constants.rb +76 -0
  111. data/lib/legion/extensions/agentic/inference/gravity/helpers/gravity_engine.rb +164 -0
  112. data/lib/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought.rb +64 -0
  113. data/lib/legion/extensions/agentic/inference/gravity/runners/gravity.rb +132 -0
  114. data/lib/legion/extensions/agentic/inference/gravity/version.rb +13 -0
  115. data/lib/legion/extensions/agentic/inference/gravity.rb +20 -0
  116. data/lib/legion/extensions/agentic/inference/horizon/actors/adjust.rb +45 -0
  117. data/lib/legion/extensions/agentic/inference/horizon/client.rb +28 -0
  118. data/lib/legion/extensions/agentic/inference/horizon/helpers/constants.rb +43 -0
  119. data/lib/legion/extensions/agentic/inference/horizon/helpers/horizon_engine.rb +110 -0
  120. data/lib/legion/extensions/agentic/inference/horizon/helpers/projection.rb +59 -0
  121. data/lib/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon.rb +107 -0
  122. data/lib/legion/extensions/agentic/inference/horizon/version.rb +13 -0
  123. data/lib/legion/extensions/agentic/inference/horizon.rb +19 -0
  124. data/lib/legion/extensions/agentic/inference/hypothesis_testing/client.rb +28 -0
  125. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants.rb +37 -0
  126. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis.rb +83 -0
  127. data/lib/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine.rb +97 -0
  128. data/lib/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing.rb +115 -0
  129. data/lib/legion/extensions/agentic/inference/hypothesis_testing/version.rb +13 -0
  130. data/lib/legion/extensions/agentic/inference/hypothesis_testing.rb +19 -0
  131. data/lib/legion/extensions/agentic/inference/intuition/client.rb +19 -0
  132. data/lib/legion/extensions/agentic/inference/intuition/helpers/constants.rb +60 -0
  133. data/lib/legion/extensions/agentic/inference/intuition/helpers/heuristic.rb +66 -0
  134. data/lib/legion/extensions/agentic/inference/intuition/helpers/intuition_engine.rb +157 -0
  135. data/lib/legion/extensions/agentic/inference/intuition/helpers/pattern.rb +105 -0
  136. data/lib/legion/extensions/agentic/inference/intuition/runners/intuition.rb +87 -0
  137. data/lib/legion/extensions/agentic/inference/intuition/version.rb +13 -0
  138. data/lib/legion/extensions/agentic/inference/intuition.rb +20 -0
  139. data/lib/legion/extensions/agentic/inference/magnet/client.rb +29 -0
  140. data/lib/legion/extensions/agentic/inference/magnet/helpers/constants.rb +57 -0
  141. data/lib/legion/extensions/agentic/inference/magnet/helpers/field.rb +105 -0
  142. data/lib/legion/extensions/agentic/inference/magnet/helpers/magnet_engine.rb +179 -0
  143. data/lib/legion/extensions/agentic/inference/magnet/helpers/pole.rb +80 -0
  144. data/lib/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet.rb +124 -0
  145. data/lib/legion/extensions/agentic/inference/magnet/version.rb +13 -0
  146. data/lib/legion/extensions/agentic/inference/magnet.rb +21 -0
  147. data/lib/legion/extensions/agentic/inference/momentum/helpers/client.rb +17 -0
  148. data/lib/legion/extensions/agentic/inference/momentum/helpers/constants.rb +65 -0
  149. data/lib/legion/extensions/agentic/inference/momentum/helpers/idea.rb +112 -0
  150. data/lib/legion/extensions/agentic/inference/momentum/helpers/momentum_engine.rb +127 -0
  151. data/lib/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum.rb +101 -0
  152. data/lib/legion/extensions/agentic/inference/momentum/version.rb +13 -0
  153. data/lib/legion/extensions/agentic/inference/momentum.rb +19 -0
  154. data/lib/legion/extensions/agentic/inference/perceptual_inference/client.rb +28 -0
  155. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/constants.rb +34 -0
  156. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field.rb +154 -0
  157. data/lib/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis.rb +100 -0
  158. data/lib/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference.rb +120 -0
  159. data/lib/legion/extensions/agentic/inference/perceptual_inference/version.rb +13 -0
  160. data/lib/legion/extensions/agentic/inference/perceptual_inference.rb +19 -0
  161. data/lib/legion/extensions/agentic/inference/prediction/actors/expire_predictions.rb +45 -0
  162. data/lib/legion/extensions/agentic/inference/prediction/client.rb +27 -0
  163. data/lib/legion/extensions/agentic/inference/prediction/helpers/modes.rb +28 -0
  164. data/lib/legion/extensions/agentic/inference/prediction/helpers/prediction_store.rb +66 -0
  165. data/lib/legion/extensions/agentic/inference/prediction/runners/prediction.rb +146 -0
  166. data/lib/legion/extensions/agentic/inference/prediction/version.rb +13 -0
  167. data/lib/legion/extensions/agentic/inference/prediction.rb +18 -0
  168. data/lib/legion/extensions/agentic/inference/predictive_coding/actors/decay.rb +45 -0
  169. data/lib/legion/extensions/agentic/inference/predictive_coding/client.rb +28 -0
  170. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/constants.rb +46 -0
  171. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model.rb +187 -0
  172. data/lib/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error.rb +59 -0
  173. data/lib/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding.rb +171 -0
  174. data/lib/legion/extensions/agentic/inference/predictive_coding/version.rb +13 -0
  175. data/lib/legion/extensions/agentic/inference/predictive_coding.rb +20 -0
  176. data/lib/legion/extensions/agentic/inference/predictive_processing/client.rb +28 -0
  177. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/constants.rb +35 -0
  178. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model.rb +142 -0
  179. data/lib/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor.rb +129 -0
  180. data/lib/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing.rb +104 -0
  181. data/lib/legion/extensions/agentic/inference/predictive_processing/version.rb +13 -0
  182. data/lib/legion/extensions/agentic/inference/predictive_processing.rb +19 -0
  183. data/lib/legion/extensions/agentic/inference/reality_testing/client.rb +28 -0
  184. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/belief.rb +98 -0
  185. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/constants.rb +41 -0
  186. data/lib/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine.rb +104 -0
  187. data/lib/legion/extensions/agentic/inference/reality_testing/runners/reality_testing.rb +94 -0
  188. data/lib/legion/extensions/agentic/inference/reality_testing/version.rb +13 -0
  189. data/lib/legion/extensions/agentic/inference/reality_testing.rb +19 -0
  190. data/lib/legion/extensions/agentic/inference/schema/client.rb +26 -0
  191. data/lib/legion/extensions/agentic/inference/schema/helpers/causal_relation.rb +70 -0
  192. data/lib/legion/extensions/agentic/inference/schema/helpers/constants.rb +50 -0
  193. data/lib/legion/extensions/agentic/inference/schema/helpers/world_model.rb +173 -0
  194. data/lib/legion/extensions/agentic/inference/schema/runners/schema.rb +101 -0
  195. data/lib/legion/extensions/agentic/inference/schema/version.rb +13 -0
  196. data/lib/legion/extensions/agentic/inference/schema.rb +19 -0
  197. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/client.rb +28 -0
  198. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants.rb +42 -0
  199. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision.rb +66 -0
  200. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine.rb +139 -0
  201. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance.rb +129 -0
  202. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance/version.rb +13 -0
  203. data/lib/legion/extensions/agentic/inference/uncertainty_tolerance.rb +19 -0
  204. data/lib/legion/extensions/agentic/inference/version.rb +11 -0
  205. data/lib/legion/extensions/agentic/inference.rb +44 -0
  206. data/spec/legion/extensions/agentic/inference/abductive/client_spec.rb +25 -0
  207. data/spec/legion/extensions/agentic/inference/abductive/runners/abductive_reasoning_spec.rb +349 -0
  208. data/spec/legion/extensions/agentic/inference/affordance/client_spec.rb +26 -0
  209. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_field_spec.rb +131 -0
  210. data/spec/legion/extensions/agentic/inference/affordance/helpers/affordance_item_spec.rb +107 -0
  211. data/spec/legion/extensions/agentic/inference/affordance/runners/affordance_spec.rb +78 -0
  212. data/spec/legion/extensions/agentic/inference/analogical/client_spec.rb +31 -0
  213. data/spec/legion/extensions/agentic/inference/analogical/helpers/analogy_engine_spec.rb +276 -0
  214. data/spec/legion/extensions/agentic/inference/analogical/helpers/structure_map_spec.rb +255 -0
  215. data/spec/legion/extensions/agentic/inference/analogical/runners/analogical_reasoning_spec.rb +213 -0
  216. data/spec/legion/extensions/agentic/inference/argument_mapping/client_spec.rb +18 -0
  217. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_engine_spec.rb +218 -0
  218. data/spec/legion/extensions/agentic/inference/argument_mapping/helpers/argument_spec.rb +231 -0
  219. data/spec/legion/extensions/agentic/inference/argument_mapping/runners/argument_mapping_spec.rb +171 -0
  220. data/spec/legion/extensions/agentic/inference/bayesian/client_spec.rb +20 -0
  221. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_network_spec.rb +178 -0
  222. data/spec/legion/extensions/agentic/inference/bayesian/helpers/belief_spec.rb +137 -0
  223. data/spec/legion/extensions/agentic/inference/bayesian/runners/bayesian_belief_spec.rb +176 -0
  224. data/spec/legion/extensions/agentic/inference/belief_revision/client_spec.rb +31 -0
  225. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_network_spec.rb +176 -0
  226. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/belief_spec.rb +153 -0
  227. data/spec/legion/extensions/agentic/inference/belief_revision/helpers/evidence_spec.rb +51 -0
  228. data/spec/legion/extensions/agentic/inference/belief_revision/runners/belief_revision_spec.rb +106 -0
  229. data/spec/legion/extensions/agentic/inference/causal_attribution/client_spec.rb +24 -0
  230. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_engine_spec.rb +181 -0
  231. data/spec/legion/extensions/agentic/inference/causal_attribution/helpers/attribution_spec.rb +108 -0
  232. data/spec/legion/extensions/agentic/inference/causal_attribution/runners/causal_attribution_spec.rb +142 -0
  233. data/spec/legion/extensions/agentic/inference/causal_reasoning/client_spec.rb +35 -0
  234. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_edge_spec.rb +158 -0
  235. data/spec/legion/extensions/agentic/inference/causal_reasoning/helpers/causal_graph_spec.rb +259 -0
  236. data/spec/legion/extensions/agentic/inference/causal_reasoning/runners/causal_reasoning_spec.rb +161 -0
  237. data/spec/legion/extensions/agentic/inference/coherence/client_spec.rb +17 -0
  238. data/spec/legion/extensions/agentic/inference/coherence/runners/cognitive_coherence_spec.rb +267 -0
  239. data/spec/legion/extensions/agentic/inference/counterfactual/client_spec.rb +48 -0
  240. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/constants_spec.rb +55 -0
  241. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/counterfactual_engine_spec.rb +234 -0
  242. data/spec/legion/extensions/agentic/inference/counterfactual/helpers/scenario_spec.rb +193 -0
  243. data/spec/legion/extensions/agentic/inference/counterfactual/runners/counterfactual_spec.rb +179 -0
  244. data/spec/legion/extensions/agentic/inference/debugging/client_spec.rb +46 -0
  245. data/spec/legion/extensions/agentic/inference/debugging/helpers/causal_trace_spec.rb +84 -0
  246. data/spec/legion/extensions/agentic/inference/debugging/helpers/constants_spec.rb +97 -0
  247. data/spec/legion/extensions/agentic/inference/debugging/helpers/correction_spec.rb +98 -0
  248. data/spec/legion/extensions/agentic/inference/debugging/helpers/debugging_engine_spec.rb +290 -0
  249. data/spec/legion/extensions/agentic/inference/debugging/helpers/reasoning_error_spec.rb +164 -0
  250. data/spec/legion/extensions/agentic/inference/debugging/runners/cognitive_debugging_spec.rb +301 -0
  251. data/spec/legion/extensions/agentic/inference/enactive_cognition/client_spec.rb +19 -0
  252. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/enaction_engine_spec.rb +181 -0
  253. data/spec/legion/extensions/agentic/inference/enactive_cognition/helpers/sensorimotor_loop_spec.rb +184 -0
  254. data/spec/legion/extensions/agentic/inference/enactive_cognition/runners/enactive_cognition_spec.rb +214 -0
  255. data/spec/legion/extensions/agentic/inference/expectation_violation/expectation_violation_spec.rb +11 -0
  256. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/expectation_spec.rb +102 -0
  257. data/spec/legion/extensions/agentic/inference/expectation_violation/helpers/violation_engine_spec.rb +121 -0
  258. data/spec/legion/extensions/agentic/inference/expectation_violation/runners/expectation_violation_spec.rb +59 -0
  259. data/spec/legion/extensions/agentic/inference/free_energy/client_spec.rb +46 -0
  260. data/spec/legion/extensions/agentic/inference/free_energy/helpers/belief_spec.rb +183 -0
  261. data/spec/legion/extensions/agentic/inference/free_energy/helpers/free_energy_engine_spec.rb +211 -0
  262. data/spec/legion/extensions/agentic/inference/free_energy/runners/free_energy_spec.rb +118 -0
  263. data/spec/legion/extensions/agentic/inference/gravity/client_spec.rb +24 -0
  264. data/spec/legion/extensions/agentic/inference/gravity/helpers/attractor_spec.rb +143 -0
  265. data/spec/legion/extensions/agentic/inference/gravity/helpers/constants_spec.rb +107 -0
  266. data/spec/legion/extensions/agentic/inference/gravity/helpers/gravity_engine_spec.rb +193 -0
  267. data/spec/legion/extensions/agentic/inference/gravity/helpers/orbiting_thought_spec.rb +103 -0
  268. data/spec/legion/extensions/agentic/inference/gravity/runners/gravity_spec.rb +159 -0
  269. data/spec/legion/extensions/agentic/inference/horizon/client_spec.rb +58 -0
  270. data/spec/legion/extensions/agentic/inference/horizon/helpers/constants_spec.rb +98 -0
  271. data/spec/legion/extensions/agentic/inference/horizon/helpers/horizon_engine_spec.rb +325 -0
  272. data/spec/legion/extensions/agentic/inference/horizon/helpers/projection_spec.rb +155 -0
  273. data/spec/legion/extensions/agentic/inference/horizon/runners/cognitive_horizon_spec.rb +269 -0
  274. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/constants_spec.rb +38 -0
  275. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_engine_spec.rb +182 -0
  276. data/spec/legion/extensions/agentic/inference/hypothesis_testing/helpers/hypothesis_spec.rb +172 -0
  277. data/spec/legion/extensions/agentic/inference/hypothesis_testing/hypothesis_testing_spec.rb +16 -0
  278. data/spec/legion/extensions/agentic/inference/hypothesis_testing/runners/hypothesis_testing_spec.rb +159 -0
  279. data/spec/legion/extensions/agentic/inference/intuition/client_spec.rb +33 -0
  280. data/spec/legion/extensions/agentic/inference/intuition/helpers/heuristic_spec.rb +82 -0
  281. data/spec/legion/extensions/agentic/inference/intuition/helpers/intuition_engine_spec.rb +163 -0
  282. data/spec/legion/extensions/agentic/inference/intuition/helpers/pattern_spec.rb +160 -0
  283. data/spec/legion/extensions/agentic/inference/intuition/runners/intuition_spec.rb +107 -0
  284. data/spec/legion/extensions/agentic/inference/magnet/client_spec.rb +30 -0
  285. data/spec/legion/extensions/agentic/inference/magnet/helpers/constants_spec.rb +120 -0
  286. data/spec/legion/extensions/agentic/inference/magnet/helpers/field_spec.rb +193 -0
  287. data/spec/legion/extensions/agentic/inference/magnet/helpers/magnet_engine_spec.rb +281 -0
  288. data/spec/legion/extensions/agentic/inference/magnet/helpers/pole_spec.rb +211 -0
  289. data/spec/legion/extensions/agentic/inference/magnet/runners/cognitive_magnet_spec.rb +201 -0
  290. data/spec/legion/extensions/agentic/inference/momentum/cognitive_momentum_spec.rb +11 -0
  291. data/spec/legion/extensions/agentic/inference/momentum/helpers/idea_spec.rb +152 -0
  292. data/spec/legion/extensions/agentic/inference/momentum/helpers/momentum_engine_spec.rb +154 -0
  293. data/spec/legion/extensions/agentic/inference/momentum/runners/cognitive_momentum_spec.rb +97 -0
  294. data/spec/legion/extensions/agentic/inference/perceptual_inference/client_spec.rb +39 -0
  295. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/constants_spec.rb +97 -0
  296. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_field_spec.rb +270 -0
  297. data/spec/legion/extensions/agentic/inference/perceptual_inference/helpers/perceptual_hypothesis_spec.rb +206 -0
  298. data/spec/legion/extensions/agentic/inference/perceptual_inference/runners/perceptual_inference_spec.rb +305 -0
  299. data/spec/legion/extensions/agentic/inference/prediction/actors/expire_predictions_spec.rb +46 -0
  300. data/spec/legion/extensions/agentic/inference/prediction/client_spec.rb +14 -0
  301. data/spec/legion/extensions/agentic/inference/prediction/helpers/modes_spec.rb +118 -0
  302. data/spec/legion/extensions/agentic/inference/prediction/helpers/prediction_store_spec.rb +262 -0
  303. data/spec/legion/extensions/agentic/inference/prediction/runners/prediction_spec.rb +116 -0
  304. data/spec/legion/extensions/agentic/inference/predictive_coding/client_spec.rb +74 -0
  305. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/generative_model_spec.rb +194 -0
  306. data/spec/legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error_spec.rb +109 -0
  307. data/spec/legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding_spec.rb +210 -0
  308. data/spec/legion/extensions/agentic/inference/predictive_processing/client_spec.rb +82 -0
  309. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/generative_model_spec.rb +220 -0
  310. data/spec/legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor_spec.rb +206 -0
  311. data/spec/legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing_spec.rb +213 -0
  312. data/spec/legion/extensions/agentic/inference/reality_testing/client_spec.rb +29 -0
  313. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/belief_spec.rb +197 -0
  314. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/constants_spec.rb +78 -0
  315. data/spec/legion/extensions/agentic/inference/reality_testing/helpers/reality_engine_spec.rb +191 -0
  316. data/spec/legion/extensions/agentic/inference/reality_testing/runners/reality_testing_spec.rb +154 -0
  317. data/spec/legion/extensions/agentic/inference/schema/client_spec.rb +53 -0
  318. data/spec/legion/extensions/agentic/inference/schema/helpers/causal_relation_spec.rb +108 -0
  319. data/spec/legion/extensions/agentic/inference/schema/helpers/constants_spec.rb +54 -0
  320. data/spec/legion/extensions/agentic/inference/schema/helpers/world_model_spec.rb +179 -0
  321. data/spec/legion/extensions/agentic/inference/schema/runners/schema_spec.rb +146 -0
  322. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/client_spec.rb +18 -0
  323. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/constants_spec.rb +62 -0
  324. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/decision_spec.rb +125 -0
  325. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/helpers/tolerance_engine_spec.rb +184 -0
  326. data/spec/legion/extensions/agentic/inference/uncertainty_tolerance/runners/uncertainty_tolerance_spec.rb +157 -0
  327. data/spec/spec_helper.rb +46 -0
  328. metadata +412 -0
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module PredictiveCoding
8
+ module Helpers
9
+ class GenerativeModel
10
+ attr_reader :model_id, :created_at
11
+
12
+ def initialize(model_id: nil)
13
+ @model_id = model_id || SecureRandom.uuid
14
+ @created_at = Time.now.utc
15
+ @predictions = {} # domain -> { value, confidence, updated_at }
16
+ @error_history = [] # array of PredictionError objects (capped)
17
+ @precisions = {} # domain -> float (0..1)
18
+ @free_energy_ema = 0.0
19
+ @domain_models = {} # domain -> simple weighted mean tracker
20
+ end
21
+
22
+ def predict(domain:, context: {})
23
+ prior = @domain_models[domain]
24
+ if prior
25
+ confidence = @precisions.fetch(domain, Constants::DEFAULT_PRECISION)
26
+ value = prior[:mean]
27
+ else
28
+ confidence = Constants::DEFAULT_PRECISION
29
+ value = context[:expected] || context[:baseline] || 0.5
30
+ end
31
+
32
+ @predictions[domain] = { value: value, confidence: confidence, updated_at: Time.now.utc }
33
+
34
+ { domain: domain, predicted: value, confidence: confidence }
35
+ end
36
+
37
+ def update(domain:, predicted:, actual:)
38
+ precision = @precisions.fetch(domain, Constants::DEFAULT_PRECISION)
39
+ error = PredictionError.new(domain: domain, predicted: predicted, actual: actual, precision: precision)
40
+
41
+ record_error(error)
42
+ update_precision(domain, error.error_magnitude)
43
+ update_domain_model(domain, actual)
44
+ update_free_energy(error.error_magnitude)
45
+
46
+ error
47
+ end
48
+
49
+ def precision_for(domain:)
50
+ @precisions.fetch(domain, Constants::DEFAULT_PRECISION)
51
+ end
52
+
53
+ def free_energy
54
+ prediction_error_term = average_weighted_error
55
+ complexity_term = @domain_models.size * Constants::COMPLEXITY_PENALTY
56
+ @free_energy_ema = ema(@free_energy_ema, prediction_error_term + complexity_term, Constants::FREE_ENERGY_ALPHA)
57
+ @free_energy_ema
58
+ end
59
+
60
+ def free_energy_level
61
+ fe = free_energy
62
+ Constants::FREE_ENERGY_LEVELS.find { |_k, range| range.cover?(fe) }&.first || :unknown
63
+ end
64
+
65
+ def active_inference_candidates
66
+ @domain_models.keys.select do |domain|
67
+ precision = @precisions.fetch(domain, Constants::DEFAULT_PRECISION)
68
+ recent_errors = recent_errors_for(domain)
69
+ next false if recent_errors.empty?
70
+
71
+ avg_error = recent_errors.sum(&:error_magnitude) / recent_errors.size
72
+ avg_error > Constants::SURPRISE_THRESHOLD && precision < 0.6
73
+ end
74
+ end
75
+
76
+ def surprising_errors
77
+ @error_history.select(&:surprising?)
78
+ end
79
+
80
+ def all_errors
81
+ @error_history
82
+ end
83
+
84
+ def decay_all
85
+ @precisions.each_key do |domain|
86
+ current = @precisions[domain]
87
+ decayed = [current - Constants::PRECISION_DECAY, Constants::PRECISION_FLOOR].max
88
+ @precisions[domain] = decayed
89
+ end
90
+
91
+ prune_old_errors
92
+ end
93
+
94
+ def domain_count
95
+ @domain_models.size
96
+ end
97
+
98
+ def error_count
99
+ @error_history.size
100
+ end
101
+
102
+ def to_h
103
+ {
104
+ model_id: @model_id,
105
+ created_at: @created_at,
106
+ domain_count: @domain_models.size,
107
+ error_count: @error_history.size,
108
+ free_energy: free_energy.round(4),
109
+ free_energy_level: free_energy_level,
110
+ surprising_count: surprising_errors.size,
111
+ domains: domain_stats
112
+ }
113
+ end
114
+
115
+ private
116
+
117
+ def record_error(error)
118
+ @error_history << error
119
+ @error_history.shift while @error_history.size > Constants::MAX_ERROR_HISTORY
120
+ end
121
+
122
+ def update_precision(domain, error_magnitude)
123
+ current = @precisions.fetch(domain, Constants::DEFAULT_PRECISION)
124
+ # High error -> precision decreases; low error -> precision increases
125
+ signal = 1.0 - error_magnitude
126
+ updated = ema(current, signal, Constants::PRECISION_ALPHA)
127
+ @precisions[domain] = [updated, Constants::PRECISION_FLOOR].max
128
+ end
129
+
130
+ def update_domain_model(domain, actual)
131
+ if @domain_models[domain]
132
+ model = @domain_models[domain]
133
+ model[:count] += 1
134
+ model[:mean] = ema(model[:mean], actual.to_f, Constants::MODEL_LEARNING_RATE)
135
+ else
136
+ @domain_models[domain] = { mean: actual.to_f, count: 1 }
137
+ end
138
+
139
+ return unless @domain_models.size > Constants::MAX_MODELS
140
+
141
+ oldest_domain = @domain_models.keys.first
142
+ @domain_models.delete(oldest_domain)
143
+ @precisions.delete(oldest_domain)
144
+ end
145
+
146
+ def update_free_energy(error_magnitude)
147
+ complexity = @domain_models.size * Constants::COMPLEXITY_PENALTY
148
+ raw = error_magnitude + complexity
149
+ @free_energy_ema = ema(@free_energy_ema, raw, Constants::FREE_ENERGY_ALPHA)
150
+ end
151
+
152
+ def average_weighted_error
153
+ return 0.0 if @error_history.empty?
154
+
155
+ recent = @error_history.last(50)
156
+ recent.sum(&:weighted_error) / recent.size
157
+ end
158
+
159
+ def recent_errors_for(domain)
160
+ @error_history.select { |e| e.domain == domain }.last(10)
161
+ end
162
+
163
+ def prune_old_errors
164
+ @error_history.shift while @error_history.size > Constants::MAX_ERROR_HISTORY
165
+ end
166
+
167
+ def ema(current, new_value, alpha)
168
+ (alpha * new_value) + ((1.0 - alpha) * current)
169
+ end
170
+
171
+ def domain_stats
172
+ @domain_models.map do |domain, model|
173
+ {
174
+ domain: domain,
175
+ mean: model[:mean].round(4),
176
+ count: model[:count],
177
+ precision: @precisions.fetch(domain, Constants::DEFAULT_PRECISION).round(4)
178
+ }
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module PredictiveCoding
8
+ module Helpers
9
+ class PredictionError
10
+ attr_reader :domain, :predicted, :actual, :error_magnitude, :precision, :weighted_error, :timestamp
11
+
12
+ def initialize(domain:, predicted:, actual:, precision: Constants::DEFAULT_PRECISION)
13
+ @domain = domain
14
+ @predicted = predicted
15
+ @actual = actual
16
+ @error_magnitude = compute_error_magnitude(predicted, actual)
17
+ @precision = precision
18
+ @weighted_error = @error_magnitude * @precision
19
+ @timestamp = Time.now.utc
20
+ end
21
+
22
+ def surprising?
23
+ @error_magnitude >= Constants::SURPRISE_THRESHOLD
24
+ end
25
+
26
+ def level
27
+ Constants::PREDICTION_ERROR_LEVELS.find { |_k, range| range.cover?(@error_magnitude) }&.first || :unknown
28
+ end
29
+
30
+ def to_h
31
+ {
32
+ domain: @domain,
33
+ predicted: @predicted,
34
+ actual: @actual,
35
+ error_magnitude: @error_magnitude,
36
+ precision: @precision,
37
+ weighted_error: @weighted_error,
38
+ surprising: surprising?,
39
+ level: level,
40
+ timestamp: @timestamp
41
+ }
42
+ end
43
+
44
+ private
45
+
46
+ def compute_error_magnitude(predicted, actual)
47
+ if predicted.is_a?(Numeric) && actual.is_a?(Numeric)
48
+ (predicted - actual).abs.clamp(0.0, 1.0)
49
+ else
50
+ predicted == actual ? 0.0 : 1.0
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module PredictiveCoding
10
+ module Runners
11
+ module PredictiveCoding
12
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
13
+ Legion::Extensions::Helpers.const_defined?(:Lex)
14
+
15
+ def generate_prediction(domain:, context: {}, **)
16
+ prediction = generative_model.predict(domain: domain, context: context)
17
+ Legion::Logging.debug "[predictive_coding] generate_prediction domain=#{domain} " \
18
+ "predicted=#{prediction[:predicted]} confidence=#{prediction[:confidence].round(3)}"
19
+ { success: true, domain: domain, predicted: prediction[:predicted], confidence: prediction[:confidence] }
20
+ end
21
+
22
+ def report_outcome(domain:, predicted:, actual:, **)
23
+ error = generative_model.update(domain: domain, predicted: predicted, actual: actual)
24
+ Legion::Logging.debug "[predictive_coding] report_outcome domain=#{domain} " \
25
+ "error_magnitude=#{error.error_magnitude.round(3)} surprising=#{error.surprising?}"
26
+ {
27
+ success: true,
28
+ domain: domain,
29
+ error_magnitude: error.error_magnitude,
30
+ weighted_error: error.weighted_error,
31
+ precision: error.precision,
32
+ surprising: error.surprising?,
33
+ level: error.level
34
+ }
35
+ end
36
+
37
+ def precision_for(domain:, **)
38
+ value = generative_model.precision_for(domain: domain)
39
+ Legion::Logging.debug "[predictive_coding] precision_for domain=#{domain} precision=#{value.round(3)}"
40
+ { success: true, domain: domain, precision: value }
41
+ end
42
+
43
+ def surprising_errors(**)
44
+ errors = generative_model.surprising_errors
45
+ Legion::Logging.debug "[predictive_coding] surprising_errors count=#{errors.size}"
46
+ { success: true, errors: errors.map(&:to_h), count: errors.size }
47
+ end
48
+
49
+ def free_energy_status(**)
50
+ fe = generative_model.free_energy
51
+ level = generative_model.free_energy_level
52
+ Legion::Logging.debug "[predictive_coding] free_energy_status fe=#{fe.round(3)} level=#{level}"
53
+ {
54
+ success: true,
55
+ free_energy: fe,
56
+ level: level,
57
+ model_stats: generative_model.to_h
58
+ }
59
+ end
60
+
61
+ def active_inference_candidates(**)
62
+ candidates = generative_model.active_inference_candidates
63
+ Legion::Logging.debug "[predictive_coding] active_inference_candidates count=#{candidates.size}"
64
+ { success: true, candidates: candidates, count: candidates.size }
65
+ end
66
+
67
+ def register_active_inference(domain:, action:, expected_outcome:, **)
68
+ inference_id = SecureRandom.uuid
69
+ active_inferences[inference_id] = {
70
+ inference_id: inference_id,
71
+ domain: domain,
72
+ action: action,
73
+ expected_outcome: expected_outcome,
74
+ status: :pending,
75
+ registered_at: Time.now.utc
76
+ }
77
+
78
+ prune_active_inferences
79
+
80
+ Legion::Logging.debug "[predictive_coding] register_active_inference domain=#{domain} id=#{inference_id[0..7]}"
81
+ { success: true, inference_id: inference_id, domain: domain, status: :pending }
82
+ end
83
+
84
+ def resolve_active_inference(domain:, action:, actual_outcome:, inference_id: nil, **)
85
+ record = find_inference(domain, action, inference_id)
86
+ unless record
87
+ Legion::Logging.debug "[predictive_coding] resolve_active_inference not found domain=#{domain}"
88
+ return { success: false, reason: :not_found }
89
+ end
90
+
91
+ expected = record[:expected_outcome]
92
+ error = generative_model.update(
93
+ domain: domain,
94
+ predicted: expected,
95
+ actual: actual_outcome
96
+ )
97
+
98
+ record[:status] = :resolved
99
+ record[:actual_outcome] = actual_outcome
100
+ record[:resolved_at] = Time.now.utc
101
+ record[:error_magnitude] = error.error_magnitude
102
+
103
+ Legion::Logging.info "[predictive_coding] resolve_active_inference domain=#{domain} " \
104
+ "error=#{error.error_magnitude.round(3)} id=#{record[:inference_id][0..7]}"
105
+
106
+ {
107
+ success: true,
108
+ inference_id: record[:inference_id],
109
+ domain: domain,
110
+ error_magnitude: error.error_magnitude,
111
+ action_helpful: error.error_magnitude < Legion::Extensions::Agentic::Inference::PredictiveCoding::Helpers::Constants::SURPRISE_THRESHOLD
112
+ }
113
+ end
114
+
115
+ def update_predictive_coding(**)
116
+ generative_model.decay_all
117
+ pruned = prune_resolved_inferences
118
+ Legion::Logging.debug "[predictive_coding] update_predictive_coding pruned_inferences=#{pruned}"
119
+ { success: true, pruned_inferences: pruned }
120
+ end
121
+
122
+ def predictive_coding_stats(**)
123
+ {
124
+ success: true,
125
+ model: generative_model.to_h,
126
+ active_inferences: active_inferences.size,
127
+ pending_inferences: active_inferences.count { |_, v| v[:status] == :pending }
128
+ }
129
+ end
130
+
131
+ private
132
+
133
+ def generative_model
134
+ @generative_model ||= Helpers::GenerativeModel.new
135
+ end
136
+
137
+ def active_inferences
138
+ @active_inferences ||= {}
139
+ end
140
+
141
+ def prune_active_inferences
142
+ max = Legion::Extensions::Agentic::Inference::PredictiveCoding::Helpers::Constants::MAX_ACTIVE_INFERENCES
143
+ return unless active_inferences.size > max
144
+
145
+ sorted = active_inferences.sort_by { |_, v| v[:registered_at] }
146
+ ids = sorted.first(active_inferences.size - max).map(&:first)
147
+ ids.each { |id| active_inferences.delete(id) }
148
+ end
149
+
150
+ def prune_resolved_inferences
151
+ resolved = active_inferences.select { |_, v| v[:status] == :resolved }.keys
152
+ resolved.each { |id| active_inferences.delete(id) }
153
+ resolved.size
154
+ end
155
+
156
+ def find_inference(domain, action, inference_id)
157
+ if inference_id
158
+ active_inferences[inference_id]
159
+ else
160
+ active_inferences.values.find do |r|
161
+ r[:domain] == domain && r[:action] == action && r[:status] == :pending
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module PredictiveCoding
8
+ VERSION = '0.1.0'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'legion/extensions/agentic/inference/predictive_coding/version'
5
+ require 'legion/extensions/agentic/inference/predictive_coding/helpers/constants'
6
+ require 'legion/extensions/agentic/inference/predictive_coding/helpers/prediction_error'
7
+ require 'legion/extensions/agentic/inference/predictive_coding/helpers/generative_model'
8
+ require 'legion/extensions/agentic/inference/predictive_coding/runners/predictive_coding'
9
+ require 'legion/extensions/agentic/inference/predictive_coding/client'
10
+
11
+ module Legion
12
+ module Extensions
13
+ module Agentic
14
+ module Inference
15
+ module PredictiveCoding
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/inference/predictive_processing/helpers/constants'
4
+ require 'legion/extensions/agentic/inference/predictive_processing/helpers/generative_model'
5
+ require 'legion/extensions/agentic/inference/predictive_processing/helpers/predictive_processor'
6
+ require 'legion/extensions/agentic/inference/predictive_processing/runners/predictive_processing'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Agentic
11
+ module Inference
12
+ module PredictiveProcessing
13
+ class Client
14
+ include Runners::PredictiveProcessing
15
+
16
+ def initialize(processor: nil)
17
+ @default_processor = processor || Helpers::PredictiveProcessor.new
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :default_processor
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Agentic
6
+ module Inference
7
+ module PredictiveProcessing
8
+ module Helpers
9
+ module Constants
10
+ MAX_MODELS = 20
11
+ MAX_PREDICTIONS_PER_MODEL = 50
12
+ MAX_HISTORY = 200
13
+ DEFAULT_PRECISION = 0.5
14
+ PRECISION_FLOOR = 0.05
15
+ PRECISION_DECAY = 0.02
16
+ MODEL_CONFIDENCE_FLOOR = 0.1
17
+ FREE_ENERGY_THRESHOLD = 0.7
18
+ ACTIVE_INFERENCE_THRESHOLD = 0.5
19
+ LEARNING_RATE = 0.1
20
+ INFERENCE_MODES = %i[perceptual active hybrid].freeze
21
+ MODEL_STATES = %i[stable updating exploring surprised].freeze
22
+ PRECISION_LABELS = {
23
+ (0.8..) => :certain,
24
+ (0.6...0.8) => :confident,
25
+ (0.4...0.6) => :uncertain,
26
+ (0.2...0.4) => :vague,
27
+ (..0.2) => :noise
28
+ }.freeze
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Agentic
8
+ module Inference
9
+ module PredictiveProcessing
10
+ module Helpers
11
+ class GenerativeModel
12
+ include Constants
13
+
14
+ attr_reader :id, :domain, :confidence, :precision, :prediction_error, :state,
15
+ :last_prediction, :created_at, :updated_at
16
+
17
+ def initialize(domain:)
18
+ @id = SecureRandom.uuid
19
+ @domain = domain
20
+ @confidence = DEFAULT_PRECISION
21
+ @precision = DEFAULT_PRECISION
22
+ @prediction_error = 0.0
23
+ @state = :stable
24
+ @history = []
25
+ @last_prediction = nil
26
+ @created_at = Time.now.utc
27
+ @updated_at = Time.now.utc
28
+ end
29
+
30
+ def predict(context: {})
31
+ richness = context_richness(context)
32
+ expected_val = (confidence + richness).clamp(0.0, 1.0)
33
+ @last_prediction = {
34
+ expected_value: expected_val,
35
+ confidence: confidence,
36
+ precision: precision,
37
+ domain: @domain,
38
+ context_size: context.size,
39
+ predicted_at: Time.now.utc
40
+ }
41
+ end
42
+
43
+ def observe(actual:, predicted:)
44
+ @prediction_error = compute_error(actual, predicted)
45
+ update_history(@prediction_error)
46
+ update_confidence
47
+ update_state
48
+ @updated_at = Time.now.utc
49
+ @prediction_error
50
+ end
51
+
52
+ # Free energy (surprise): high when errors are large relative to precision.
53
+ # Uses a formula that can exceed FREE_ENERGY_THRESHOLD (0.7) with sustained errors.
54
+ def free_energy
55
+ return 0.0 if @history.empty?
56
+
57
+ recent = @history.last(10)
58
+ avg_error = recent.sum.to_f / recent.size
59
+ raw = avg_error * (1.5 - (precision * 0.5))
60
+ raw.clamp(0.0, 1.0)
61
+ end
62
+
63
+ def update_model(error:)
64
+ adjustment = error * LEARNING_RATE * precision
65
+ @confidence = (@confidence - adjustment).clamp(MODEL_CONFIDENCE_FLOOR, 1.0)
66
+ @state = :updating
67
+ @updated_at = Time.now.utc
68
+ end
69
+
70
+ def stable?
71
+ free_energy <= FREE_ENERGY_THRESHOLD
72
+ end
73
+
74
+ def surprised?
75
+ free_energy > FREE_ENERGY_THRESHOLD
76
+ end
77
+
78
+ def decay
79
+ @precision = [@precision - PRECISION_DECAY, PRECISION_FLOOR].max
80
+ @updated_at = Time.now.utc
81
+ end
82
+
83
+ def precision_label
84
+ PRECISION_LABELS.find { |range, _label| range.cover?(precision) }&.last || :noise
85
+ end
86
+
87
+ def to_h
88
+ {
89
+ id: @id,
90
+ domain: @domain,
91
+ confidence: confidence,
92
+ precision: precision,
93
+ prediction_error: @prediction_error,
94
+ free_energy: free_energy,
95
+ state: @state,
96
+ precision_label: precision_label,
97
+ stable: stable?,
98
+ surprised: surprised?,
99
+ history_size: @history.size,
100
+ created_at: @created_at,
101
+ updated_at: @updated_at
102
+ }
103
+ end
104
+
105
+ private
106
+
107
+ def context_richness(context)
108
+ [context.size * 0.02, 0.2].min
109
+ end
110
+
111
+ def compute_error(actual, predicted)
112
+ return 0.0 unless actual.is_a?(Numeric) && predicted.is_a?(Numeric)
113
+
114
+ (actual - predicted).abs.clamp(0.0, 1.0)
115
+ end
116
+
117
+ def update_history(error)
118
+ @history << error
119
+ @history.shift while @history.size > MAX_HISTORY
120
+ end
121
+
122
+ def update_confidence
123
+ delta = -@prediction_error * LEARNING_RATE
124
+ @confidence = (@confidence + delta).clamp(MODEL_CONFIDENCE_FLOOR, 1.0)
125
+ end
126
+
127
+ def update_state
128
+ @state = if surprised?
129
+ :surprised
130
+ elsif @history.size < 5
131
+ :exploring
132
+ else
133
+ :stable
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end