agentevolve-optimizer 0.5.0__py3-none-any.whl

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 (414) hide show
  1. agent_evolve/__init__.py +722 -0
  2. agent_evolve/agentic.py +2800 -0
  3. agent_evolve/api.py +767 -0
  4. agent_evolve/application/__init__.py +1580 -0
  5. agent_evolve/application/action_allocation.py +744 -0
  6. agent_evolve/application/action_allocation_frame.py +347 -0
  7. agent_evolve/application/action_allocation_frame_commit.py +185 -0
  8. agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
  9. agent_evolve/application/action_allocation_frame_v3.py +338 -0
  10. agent_evolve/application/action_archive_value.py +497 -0
  11. agent_evolve/application/action_evidence_consistency.py +455 -0
  12. agent_evolve/application/action_forecast_partitioning.py +1471 -0
  13. agent_evolve/application/action_metric_projection.py +211 -0
  14. agent_evolve/application/action_role_value.py +680 -0
  15. agent_evolve/application/action_score_authorities.py +363 -0
  16. agent_evolve/application/action_structural_signature.py +116 -0
  17. agent_evolve/application/action_target_realization.py +402 -0
  18. agent_evolve/application/agentic_evolution.py +7734 -0
  19. agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
  20. agent_evolve/application/anchor_residual_identification.py +463 -0
  21. agent_evolve/application/archive_conditioned_action_target.py +208 -0
  22. agent_evolve/application/artifact_journal.py +246 -0
  23. agent_evolve/application/artifact_replay.py +347 -0
  24. agent_evolve/application/budgeted_optimizer.py +1828 -0
  25. agent_evolve/application/calibrated_campaign.py +485 -0
  26. agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
  27. agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
  28. agent_evolve/application/campaign_capacity_recourse.py +254 -0
  29. agent_evolve/application/campaign_contextual_outcomes.py +119 -0
  30. agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
  31. agent_evolve/application/campaign_evidence_registry.py +262 -0
  32. agent_evolve/application/campaign_execution.py +2537 -0
  33. agent_evolve/application/campaign_generation_audit.py +942 -0
  34. agent_evolve/application/campaign_learning.py +1812 -0
  35. agent_evolve/application/campaign_learning_runtime.py +1977 -0
  36. agent_evolve/application/campaign_search_phase.py +227 -0
  37. agent_evolve/application/campaign_selector_context_extension.py +220 -0
  38. agent_evolve/application/campaign_variation_envelope.py +649 -0
  39. agent_evolve/application/campaign_variation_trace.py +451 -0
  40. agent_evolve/application/candidate_archive_consequence.py +128 -0
  41. agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
  42. agent_evolve/application/composite_outcome_updater.py +145 -0
  43. agent_evolve/application/composition_portfolio_selection.py +363 -0
  44. agent_evolve/application/concurrent_stage.py +144 -0
  45. agent_evolve/application/contextual_action_allocation.py +181 -0
  46. agent_evolve/application/contextual_campaign_outcomes.py +267 -0
  47. agent_evolve/application/contextual_campaign_planning.py +1366 -0
  48. agent_evolve/application/contextual_delayed_credit.py +651 -0
  49. agent_evolve/application/contextual_search_controller.py +2374 -0
  50. agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
  51. agent_evolve/application/decision_metric_projection.py +112 -0
  52. agent_evolve/application/derived_action_semantics.py +129 -0
  53. agent_evolve/application/detailed_evaluation.py +449 -0
  54. agent_evolve/application/earned_lineage.py +1011 -0
  55. agent_evolve/application/effective_choice_audit.py +484 -0
  56. agent_evolve/application/empirical_consequence_calibration.py +908 -0
  57. agent_evolve/application/evaluation_accounting.py +325 -0
  58. agent_evolve/application/evaluation_cache.py +199 -0
  59. agent_evolve/application/evaluation_escrow.py +547 -0
  60. agent_evolve/application/evaluation_recourse.py +253 -0
  61. agent_evolve/application/event_recorder.py +151 -0
  62. agent_evolve/application/evolution_campaign.py +1840 -0
  63. agent_evolve/application/executable_hypothesis.py +323 -0
  64. agent_evolve/application/factorial_branch_pilot.py +772 -0
  65. agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
  66. agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
  67. agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
  68. agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
  69. agent_evolve/application/finite_action_selection.py +188 -0
  70. agent_evolve/application/finite_action_set.py +306 -0
  71. agent_evolve/application/finite_action_transition.py +537 -0
  72. agent_evolve/application/finite_variation_eligibility.py +296 -0
  73. agent_evolve/application/forecast_geometry_portfolio.py +799 -0
  74. agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
  75. agent_evolve/application/front_proximity_admission.py +311 -0
  76. agent_evolve/application/front_proximity_parent_basis.py +458 -0
  77. agent_evolve/application/frozen_hurdle_score.py +659 -0
  78. agent_evolve/application/g3_causal_screen.py +2257 -0
  79. agent_evolve/application/g3_causal_validation.py +1046 -0
  80. agent_evolve/application/g3_postseal_curation.py +818 -0
  81. agent_evolve/application/gated_agentic_generator.py +205 -0
  82. agent_evolve/application/generation_feedback.py +293 -0
  83. agent_evolve/application/generative_proposal_journal.py +185 -0
  84. agent_evolve/application/geometry_conditional_elasticity.py +453 -0
  85. agent_evolve/application/global_wave_action_allocation.py +1151 -0
  86. agent_evolve/application/head_mass_conditional_seat.py +268 -0
  87. agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
  88. agent_evolve/application/identifiable_reflection_learning.py +395 -0
  89. agent_evolve/application/identifiable_reflection_request.py +364 -0
  90. agent_evolve/application/in_memory_residual_archive.py +341 -0
  91. agent_evolve/application/insight_memory.py +1804 -0
  92. agent_evolve/application/live_runtime_manifest.py +758 -0
  93. agent_evolve/application/llm_task_queue.py +769 -0
  94. agent_evolve/application/matched_finite_action_block.py +409 -0
  95. agent_evolve/application/materialized_action_broker.py +2328 -0
  96. agent_evolve/application/materialized_action_constraints.py +83 -0
  97. agent_evolve/application/materialized_variation.py +211 -0
  98. agent_evolve/application/multi_option_evolution.py +1536 -0
  99. agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
  100. agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
  101. agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
  102. agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
  103. agent_evolve/application/outcome_relation.py +193 -0
  104. agent_evolve/application/paired_allocation_comparison.py +241 -0
  105. agent_evolve/application/paired_block_schedule.py +127 -0
  106. agent_evolve/application/parent_measurement.py +226 -0
  107. agent_evolve/application/pareto_archive.py +811 -0
  108. agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
  109. agent_evolve/application/portfolio_evolution.py +2950 -0
  110. agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
  111. agent_evolve/application/portfolio_memory_attribution.py +581 -0
  112. agent_evolve/application/portfolio_memory_dose.py +788 -0
  113. agent_evolve/application/portfolio_memory_matched_control.py +938 -0
  114. agent_evolve/application/portfolio_memory_transfer.py +297 -0
  115. agent_evolve/application/portfolio_optimization_memory.py +363 -0
  116. agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
  117. agent_evolve/application/portfolio_projection.py +335 -0
  118. agent_evolve/application/portfolio_recombination.py +2032 -0
  119. agent_evolve/application/post_evolution_reflection.py +834 -0
  120. agent_evolve/application/postcommit_rank_authority.py +245 -0
  121. agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
  122. agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
  123. agent_evolve/application/prequential_residual_exploration.py +343 -0
  124. agent_evolve/application/prequential_score_portfolio.py +954 -0
  125. agent_evolve/application/projections.py +292 -0
  126. agent_evolve/application/protected_action_committee.py +1027 -0
  127. agent_evolve/application/protected_branch_pilot.py +376 -0
  128. agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
  129. agent_evolve/application/provider_replay.py +910 -0
  130. agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
  131. agent_evolve/application/recombination_residual_expert.py +403 -0
  132. agent_evolve/application/reflection_workflow.py +571 -0
  133. agent_evolve/application/region_conditional_credit.py +911 -0
  134. agent_evolve/application/residual_campaign_runtime.py +531 -0
  135. agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
  136. agent_evolve/application/residual_headroom_ledger.py +1544 -0
  137. agent_evolve/application/residual_learning_transaction.py +396 -0
  138. agent_evolve/application/residual_portfolio_evolution.py +1228 -0
  139. agent_evolve/application/residual_reachability.py +749 -0
  140. agent_evolve/application/residual_stage_credit.py +499 -0
  141. agent_evolve/application/same_prefix_paired_audit.py +1580 -0
  142. agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
  143. agent_evolve/application/sequential_lineage_allocation.py +1017 -0
  144. agent_evolve/application/sequential_market_replay.py +1395 -0
  145. agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
  146. agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
  147. agent_evolve/application/single_score_action_allocation.py +299 -0
  148. agent_evolve/application/source_exposure_allocation.py +906 -0
  149. agent_evolve/application/staged_memory.py +210 -0
  150. agent_evolve/application/stratified_cold_start_allocation.py +732 -0
  151. agent_evolve/application/support_guarded_hurdle_score.py +549 -0
  152. agent_evolve/application/target_conditioned_action_forecast.py +595 -0
  153. agent_evolve/application/target_conditioned_campaign.py +566 -0
  154. agent_evolve/application/treatment_assignment.py +201 -0
  155. agent_evolve/application/trusted_objective_evidence.py +217 -0
  156. agent_evolve/application/two_stage_action_evolution.py +1131 -0
  157. agent_evolve/application/v8lite_allocation_policy.py +1083 -0
  158. agent_evolve/application/v9_candidate_policy.py +1303 -0
  159. agent_evolve/bootstrap.py +108 -0
  160. agent_evolve/campaign_presets.py +517 -0
  161. agent_evolve/campaign_profiles.py +452 -0
  162. agent_evolve/campaign_variation_topology.py +288 -0
  163. agent_evolve/campaign_workload.py +950 -0
  164. agent_evolve/cli.py +797 -0
  165. agent_evolve/contract.py +241 -0
  166. agent_evolve/core/__init__.py +91 -0
  167. agent_evolve/core/action_semantics.py +411 -0
  168. agent_evolve/core/authored.py +105 -0
  169. agent_evolve/core/formatting.py +286 -0
  170. agent_evolve/core/optimization_semantics.py +324 -0
  171. agent_evolve/core/problem.py +167 -0
  172. agent_evolve/core/results.py +323 -0
  173. agent_evolve/core/stats.py +70 -0
  174. agent_evolve/core/telemetry.py +100 -0
  175. agent_evolve/domain/__init__.py +89 -0
  176. agent_evolve/domain/artifact.py +162 -0
  177. agent_evolve/domain/durable_text.py +68 -0
  178. agent_evolve/domain/event.py +1454 -0
  179. agent_evolve/domain/finite_action_set.py +426 -0
  180. agent_evolve/domain/finite_variation.py +526 -0
  181. agent_evolve/domain/generative_emission.py +559 -0
  182. agent_evolve/domain/ids.py +163 -0
  183. agent_evolve/domain/inline_text.py +106 -0
  184. agent_evolve/domain/insight.py +27 -0
  185. agent_evolve/domain/lineage.py +737 -0
  186. agent_evolve/domain/llm_task_queue.py +960 -0
  187. agent_evolve/domain/outcome.py +96 -0
  188. agent_evolve/domain/patch.py +854 -0
  189. agent_evolve/domain/typed_json.py +542 -0
  190. agent_evolve/domain/variation_space.py +158 -0
  191. agent_evolve/driver.py +1014 -0
  192. agent_evolve/harness/__init__.py +29 -0
  193. agent_evolve/harness/base.py +242 -0
  194. agent_evolve/harness/directives.py +163 -0
  195. agent_evolve/harness/generative_seal.py +479 -0
  196. agent_evolve/harness/registry.py +41 -0
  197. agent_evolve/infrastructure/__init__.py +39 -0
  198. agent_evolve/infrastructure/artifacts/__init__.py +6 -0
  199. agent_evolve/infrastructure/artifacts/_verification.py +67 -0
  200. agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
  201. agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
  202. agent_evolve/infrastructure/asyncio_runtime.py +109 -0
  203. agent_evolve/infrastructure/authored_runtime.py +188 -0
  204. agent_evolve/infrastructure/authored_worker.py +171 -0
  205. agent_evolve/infrastructure/clock.py +53 -0
  206. agent_evolve/infrastructure/events/__init__.py +6 -0
  207. agent_evolve/infrastructure/events/_validation.py +89 -0
  208. agent_evolve/infrastructure/events/in_memory.py +56 -0
  209. agent_evolve/infrastructure/events/jsonl.py +193 -0
  210. agent_evolve/infrastructure/exception_provenance.py +215 -0
  211. agent_evolve/infrastructure/ids.py +118 -0
  212. agent_evolve/infrastructure/lineage_codec.py +1836 -0
  213. agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
  214. agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
  215. agent_evolve/infrastructure/resource_lease.py +370 -0
  216. agent_evolve/infrastructure/sanitization/__init__.py +8 -0
  217. agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
  218. agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
  219. agent_evolve/infrastructure/stream_liveness.py +383 -0
  220. agent_evolve/infrastructure/subprocess_boundary.py +136 -0
  221. agent_evolve/integrations/__init__.py +1 -0
  222. agent_evolve/integrations/botorch/__init__.py +28 -0
  223. agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
  224. agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
  225. agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
  226. agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
  227. agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
  228. agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
  229. agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
  230. agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
  231. agent_evolve/integrations/completion.py +242 -0
  232. agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
  233. agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
  234. agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
  235. agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
  236. agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
  237. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
  238. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
  239. agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
  240. agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
  241. agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
  242. agent_evolve/integrations/pydantic_ai/harness.py +159 -0
  243. agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
  244. agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
  245. agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
  246. agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
  247. agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
  248. agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
  249. agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
  250. agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
  251. agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
  252. agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
  253. agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
  254. agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
  255. agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
  256. agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
  257. agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
  258. agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
  259. agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
  260. agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
  261. agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
  262. agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
  263. agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
  264. agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
  265. agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
  266. agent_evolve/integrations/pymoo_adapter.py +242 -0
  267. agent_evolve/policies/__init__.py +17 -0
  268. agent_evolve/policies/check.py +469 -0
  269. agent_evolve/policies/emit_scaffold.py +451 -0
  270. agent_evolve/policies/feedback/__init__.py +37 -0
  271. agent_evolve/policies/feedback/held_out_asn.py +1325 -0
  272. agent_evolve/policies/genetic.py +607 -0
  273. agent_evolve/policies/llm_backoff.py +183 -0
  274. agent_evolve/policies/llm_chooser.py +226 -0
  275. agent_evolve/policies/llm_generator.py +1760 -0
  276. agent_evolve/policies/llm_init.py +267 -0
  277. agent_evolve/policies/llm_operator.py +109 -0
  278. agent_evolve/policies/llm_prior.py +194 -0
  279. agent_evolve/policies/llm_surrogate.py +334 -0
  280. agent_evolve/policies/measurement_evidence.py +704 -0
  281. agent_evolve/policies/memory/__init__.py +223 -0
  282. agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
  283. agent_evolve/policies/memory/compatibility_matching.py +593 -0
  284. agent_evolve/policies/memory/global_falsification.py +1841 -0
  285. agent_evolve/policies/memory/prompt_shape.py +503 -0
  286. agent_evolve/policies/memory/randomized_subset.py +714 -0
  287. agent_evolve/policies/memory/staged_causal.py +1270 -0
  288. agent_evolve/policies/memory/treatment_compliance.py +759 -0
  289. agent_evolve/policies/objective_resolution/__init__.py +17 -0
  290. agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
  291. agent_evolve/policies/operator_portfolio.py +407 -0
  292. agent_evolve/policies/reguidance.py +1133 -0
  293. agent_evolve/policies/reward/__init__.py +83 -0
  294. agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
  295. agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
  296. agent_evolve/policies/reward/affine_hypervolume.py +490 -0
  297. agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
  298. agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
  299. agent_evolve/policies/reward/frozen_archive.py +360 -0
  300. agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
  301. agent_evolve/policies/search_state.py +208 -0
  302. agent_evolve/policies/selection/__init__.py +345 -0
  303. agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
  304. agent_evolve/policies/selection/affine_frontier_context.py +330 -0
  305. agent_evolve/policies/selection/affine_frontier_target.py +473 -0
  306. agent_evolve/policies/selection/archive_elite.py +1346 -0
  307. agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
  308. agent_evolve/policies/selection/calibrated_slate.py +1394 -0
  309. agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
  310. agent_evolve/policies/selection/common_candidate_pool.py +685 -0
  311. agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
  312. agent_evolve/policies/selection/disjoint_pairs.py +479 -0
  313. agent_evolve/policies/selection/elite_explorer.py +719 -0
  314. agent_evolve/policies/selection/finite_action.py +187 -0
  315. agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
  316. agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
  317. agent_evolve/policies/selection/forecast_calibration.py +922 -0
  318. agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
  319. agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
  320. agent_evolve/policies/selection/full_support_slate.py +91 -0
  321. agent_evolve/policies/selection/meaningful_direction.py +240 -0
  322. agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
  323. agent_evolve/policies/selection/model_anchored_slate.py +826 -0
  324. agent_evolve/policies/selection/phenotype_recourse.py +979 -0
  325. agent_evolve/policies/selection/proposal_support.py +368 -0
  326. agent_evolve/policies/selection/random_portfolio.py +254 -0
  327. agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
  328. agent_evolve/policies/selection/residual_frontier.py +463 -0
  329. agent_evolve/policies/selection/residual_frontier_target.py +605 -0
  330. agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
  331. agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
  332. agent_evolve/policies/selection/target_conditioned_features.py +812 -0
  333. agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
  334. agent_evolve/policies/selection/task_keyed_palette.py +906 -0
  335. agent_evolve/policies/semantics.py +147 -0
  336. agent_evolve/policies/structure.py +362 -0
  337. agent_evolve/policies/structured_output_budget.py +62 -0
  338. agent_evolve/policies/surrogate.py +696 -0
  339. agent_evolve/policies/variation/__init__.py +1 -0
  340. agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
  341. agent_evolve/policies/variation/crossover_inheritance.py +575 -0
  342. agent_evolve/policies/variation/disjoint_recombination.py +611 -0
  343. agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
  344. agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
  345. agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
  346. agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
  347. agent_evolve/policies/variation/typed_patch.py +1981 -0
  348. agent_evolve/policies/weighted_prior.py +394 -0
  349. agent_evolve/ports/__init__.py +383 -0
  350. agent_evolve/ports/action_allocation.py +733 -0
  351. agent_evolve/ports/action_allocation_frame.py +1153 -0
  352. agent_evolve/ports/action_allocation_frame_commit.py +294 -0
  353. agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
  354. agent_evolve/ports/action_allocation_frame_v3.py +995 -0
  355. agent_evolve/ports/action_forecast.py +1568 -0
  356. agent_evolve/ports/action_metric_projection.py +165 -0
  357. agent_evolve/ports/agentic_generator.py +1561 -0
  358. agent_evolve/ports/archive_context.py +136 -0
  359. agent_evolve/ports/artifact_sanitizer.py +44 -0
  360. agent_evolve/ports/artifact_store.py +225 -0
  361. agent_evolve/ports/clock.py +13 -0
  362. agent_evolve/ports/contextual_search_allocation.py +827 -0
  363. agent_evolve/ports/decision_metric_projection.py +258 -0
  364. agent_evolve/ports/event_store.py +55 -0
  365. agent_evolve/ports/executable_hypothesis.py +557 -0
  366. agent_evolve/ports/finite_acquisition.py +377 -0
  367. agent_evolve/ports/finite_acquisition_batch.py +296 -0
  368. agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
  369. agent_evolve/ports/finite_acquisition_json.py +247 -0
  370. agent_evolve/ports/finite_acquisition_space.py +168 -0
  371. agent_evolve/ports/finite_action_selection.py +348 -0
  372. agent_evolve/ports/finite_action_set.py +256 -0
  373. agent_evolve/ports/frontier_target.py +396 -0
  374. agent_evolve/ports/generation_failure.py +43 -0
  375. agent_evolve/ports/hard_feasibility.py +233 -0
  376. agent_evolve/ports/id_factory.py +34 -0
  377. agent_evolve/ports/llm_task_queue.py +93 -0
  378. agent_evolve/ports/objective_resolution.py +419 -0
  379. agent_evolve/ports/paired_allocation_comparison.py +401 -0
  380. agent_evolve/ports/paired_block_schedule.py +475 -0
  381. agent_evolve/ports/parent_measurement.py +336 -0
  382. agent_evolve/ports/portfolio_memory_dose.py +643 -0
  383. agent_evolve/ports/portfolio_selection.py +3169 -0
  384. agent_evolve/ports/postcommit_rank_authority.py +467 -0
  385. agent_evolve/ports/presented_action_evidence.py +794 -0
  386. agent_evolve/ports/resource_lease.py +162 -0
  387. agent_evolve/ports/structured_generator.py +734 -0
  388. agent_evolve/ports/structured_output_budget.py +120 -0
  389. agent_evolve/ports/subprocess_boundary.py +138 -0
  390. agent_evolve/ports/treatment_assignment.py +466 -0
  391. agent_evolve/ports/variation_catalog.py +76 -0
  392. agent_evolve/ports/variation_source.py +226 -0
  393. agent_evolve/proposal_mode.py +157 -0
  394. agent_evolve/proposers/__init__.py +10 -0
  395. agent_evolve/proposers/random_proposer.py +188 -0
  396. agent_evolve/provider_accounting.py +163 -0
  397. agent_evolve/py.typed +0 -0
  398. agent_evolve/reference_method.py +1570 -0
  399. agent_evolve/session/__init__.py +11 -0
  400. agent_evolve/session/authorship.py +864 -0
  401. agent_evolve/session/evaluate.py +236 -0
  402. agent_evolve/session/fidelity.py +237 -0
  403. agent_evolve/session/genetic_loop.py +742 -0
  404. agent_evolve/session/loop.py +803 -0
  405. agent_evolve/session/screening.py +671 -0
  406. agent_evolve/settings.py +376 -0
  407. agent_evolve/workload_kit.py +368 -0
  408. agent_evolve/workload_prompt.py +398 -0
  409. agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
  410. agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
  411. agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
  412. agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
  413. agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
  414. agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,531 @@
1
+ """Generic transactional campaign stage for residual portfolio evolution.
2
+
3
+ The runtime composes four independent boundaries:
4
+
5
+ 1. workload-owned proposal experts materialize candidate actions;
6
+ 2. a workload/model/provider-blind broker selects expensive evaluations;
7
+ 3. a workload-owned archive port prepares the resulting state transition; and
8
+ 4. conserved broker and lineage learning publish through one aggregate state.
9
+
10
+ The archive port follows the same prepare/commit/abort rule as the learning
11
+ store: preparation may perform work, while commit is synchronous, no-I/O, and
12
+ must not fail for its own validated preparation. This keeps the application
13
+ core generic without pretending that archive ownership belongs to the broker.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import hashlib
19
+ import json
20
+ import math
21
+ import re
22
+ from dataclasses import dataclass, field
23
+ from typing import Protocol, runtime_checkable
24
+
25
+ from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
26
+ from agent_evolve.application.materialized_action_broker import (
27
+ MaterializedActionExplorationPort,
28
+ MaterializedActionReturnValuePort,
29
+ MaterializedSlateFeasibilityPort,
30
+ MaterializedSlateValuePort,
31
+ RegretBrokeredMaterializedActionPolicy,
32
+ )
33
+ from agent_evolve.application.prequential_residual_exploration import (
34
+ PrequentialLowDiscrepancyResidualExploration,
35
+ )
36
+ from agent_evolve.application.residual_learning_transaction import (
37
+ ResidualLearningPublicationCommit,
38
+ ResidualLearningPublicationPreparation,
39
+ TransactionalResidualLearningStore,
40
+ )
41
+ from agent_evolve.application.residual_portfolio_evolution import (
42
+ MaterializedActionAllocationPolicyPort,
43
+ MaterializedActionProposalExpertPort,
44
+ ResidualPortfolioDecisionRequest,
45
+ ResidualPortfolioEvolution,
46
+ ResidualPortfolioEvolutionResult,
47
+ )
48
+ from agent_evolve.domain.patch import require_sha256
49
+ from agent_evolve.domain.typed_json import (
50
+ FrozenJsonObject,
51
+ freeze_json,
52
+ thaw_json,
53
+ typed_json_sha256,
54
+ )
55
+
56
+
57
+ RESIDUAL_CAMPAIGN_RUNTIME_ID = "transactional_residual_portfolio_campaign"
58
+ RESIDUAL_CAMPAIGN_RUNTIME_VERSION = 3
59
+ RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256 = hashlib.sha256(
60
+ b"agent-evolve:transactional-residual-portfolio-campaign:v3;"
61
+ b"flow=expert-propose-optional-async-allocation-global-broker-selected-only-evaluate;"
62
+ b"archive=injected-prepare-commit-abort-port;"
63
+ b"learning=atomic-conserved-broker-and-earned-lineage-state;"
64
+ b"commit-order=fully-prepare-archive-and-learning-then-no-io-publication;"
65
+ b"broker-cutoff=prior-learning-state-only;"
66
+ b"exploration=prequential-low-discrepancy-protected-actions;"
67
+ b"workload-model-provider-branches=false"
68
+ ).hexdigest()
69
+
70
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
71
+ _ARCHIVE_PREPARATION_DOMAIN = (
72
+ b"agent-evolve:residual-archive-transition-preparation:v1\x00"
73
+ )
74
+ _ARCHIVE_COMMIT_DOMAIN = b"agent-evolve:residual-archive-transition-commit:v1\x00"
75
+ _STAGE_RECEIPT_DOMAIN = b"agent-evolve:residual-campaign-stage-receipt:v1\x00"
76
+
77
+
78
+ def _canonical_json(value: object) -> bytes:
79
+ return json.dumps(
80
+ value,
81
+ allow_nan=False,
82
+ ensure_ascii=True,
83
+ separators=(",", ":"),
84
+ sort_keys=True,
85
+ ).encode("ascii", errors="strict")
86
+
87
+
88
+ def _hash(domain: bytes, value: object) -> str:
89
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
90
+
91
+
92
+ def _token(value: str, *, name: str) -> None:
93
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
94
+ raise ValueError(f"{name} must use the closed token grammar")
95
+
96
+
97
+ @dataclass(frozen=True, slots=True)
98
+ class ResidualArchiveTransitionPreparation:
99
+ """Workload-owned archive transition frozen before publication."""
100
+
101
+ archive_id: str
102
+ archive_version: int
103
+ archive_definition_sha256: str
104
+ residual_result_sha256: str
105
+ pre_snapshot: ArchiveUtilitySnapshot
106
+ post_snapshot: ArchiveUtilitySnapshot
107
+ evidence: FrozenJsonObject
108
+ preparation_sha256: str = field(init=False)
109
+
110
+ def __post_init__(self) -> None:
111
+ _token(self.archive_id, name="archive_id")
112
+ if type(self.archive_version) is not int or self.archive_version <= 0:
113
+ raise ValueError("archive_version must be positive")
114
+ require_sha256(
115
+ self.archive_definition_sha256,
116
+ "archive_definition_sha256",
117
+ )
118
+ require_sha256(self.residual_result_sha256, "residual_result_sha256")
119
+ if type(self.pre_snapshot) is not ArchiveUtilitySnapshot:
120
+ raise TypeError("pre_snapshot must be exact")
121
+ if type(self.post_snapshot) is not ArchiveUtilitySnapshot:
122
+ raise TypeError("post_snapshot must be exact")
123
+ self.pre_snapshot.__post_init__()
124
+ self.post_snapshot.__post_init__()
125
+ if (
126
+ self.pre_snapshot.utility_id,
127
+ self.pre_snapshot.utility_version,
128
+ self.pre_snapshot.definition_sha256,
129
+ self.pre_snapshot.generation,
130
+ self.pre_snapshot.benchmark_sha256,
131
+ ) != (
132
+ self.post_snapshot.utility_id,
133
+ self.post_snapshot.utility_version,
134
+ self.post_snapshot.definition_sha256,
135
+ self.post_snapshot.generation,
136
+ self.post_snapshot.benchmark_sha256,
137
+ ):
138
+ raise ValueError("archive transition snapshots are not comparable")
139
+ if self.pre_snapshot.archive_sha256 == self.post_snapshot.archive_sha256:
140
+ raise ValueError("archive transition must advance its state receipt")
141
+ if (
142
+ type(self.evidence) is not FrozenJsonObject
143
+ or freeze_json(self.evidence) is not self.evidence
144
+ ):
145
+ raise TypeError("archive evidence must be an exact frozen object")
146
+ object.__setattr__(
147
+ self,
148
+ "preparation_sha256",
149
+ _hash(_ARCHIVE_PREPARATION_DOMAIN, self._unsigned_record()),
150
+ )
151
+
152
+ def _unsigned_record(self) -> dict[str, object]:
153
+ return {
154
+ "schema_version": 1,
155
+ "archive": {
156
+ "archive_id": self.archive_id,
157
+ "archive_version": self.archive_version,
158
+ "definition_sha256": self.archive_definition_sha256,
159
+ },
160
+ "residual_result_sha256": self.residual_result_sha256,
161
+ "pre_snapshot_sha256": self.pre_snapshot.snapshot_sha256,
162
+ "post_snapshot_sha256": self.post_snapshot.snapshot_sha256,
163
+ "evidence_sha256": typed_json_sha256(self.evidence),
164
+ "publication_performed": False,
165
+ }
166
+
167
+ def to_record(self, *, include_evidence: bool = False) -> dict[str, object]:
168
+ self.__post_init__()
169
+ record = {
170
+ **self._unsigned_record(),
171
+ "pre_snapshot": self.pre_snapshot.to_record(),
172
+ "post_snapshot": self.post_snapshot.to_record(),
173
+ "preparation_sha256": self.preparation_sha256,
174
+ }
175
+ if include_evidence:
176
+ record["evidence"] = thaw_json(self.evidence)
177
+ return record
178
+
179
+
180
+ @dataclass(frozen=True, slots=True)
181
+ class ResidualArchiveTransitionCommit:
182
+ """Typed receipt from the archive port's no-I/O publication."""
183
+
184
+ preparation_sha256: str
185
+ committed_archive_sha256: str
186
+ evidence: FrozenJsonObject
187
+ commit_sha256: str = field(init=False)
188
+
189
+ def __post_init__(self) -> None:
190
+ require_sha256(self.preparation_sha256, "preparation_sha256")
191
+ require_sha256(
192
+ self.committed_archive_sha256,
193
+ "committed_archive_sha256",
194
+ )
195
+ if (
196
+ type(self.evidence) is not FrozenJsonObject
197
+ or freeze_json(self.evidence) is not self.evidence
198
+ ):
199
+ raise TypeError("commit evidence must be an exact frozen object")
200
+ object.__setattr__(
201
+ self,
202
+ "commit_sha256",
203
+ _hash(_ARCHIVE_COMMIT_DOMAIN, self._unsigned_record()),
204
+ )
205
+
206
+ def _unsigned_record(self) -> dict[str, object]:
207
+ return {
208
+ "schema_version": 1,
209
+ "preparation_sha256": self.preparation_sha256,
210
+ "committed_archive_sha256": self.committed_archive_sha256,
211
+ "evidence_sha256": typed_json_sha256(self.evidence),
212
+ "publication": "synchronous_no_io_prevalidated",
213
+ }
214
+
215
+ def to_record(self, *, include_evidence: bool = False) -> dict[str, object]:
216
+ self.__post_init__()
217
+ record = {**self._unsigned_record(), "commit_sha256": self.commit_sha256}
218
+ if include_evidence:
219
+ record["evidence"] = thaw_json(self.evidence)
220
+ return record
221
+
222
+
223
+ @runtime_checkable
224
+ class ResidualArchiveTransitionPort(Protocol):
225
+ """Prepare and publish a workload-owned archive transition."""
226
+
227
+ archive_id: str
228
+ archive_version: int
229
+ definition_sha256: str
230
+
231
+ async def prepare(
232
+ self,
233
+ result: ResidualPortfolioEvolutionResult,
234
+ ) -> ResidualArchiveTransitionPreparation: ...
235
+
236
+ def commit(
237
+ self,
238
+ preparation: ResidualArchiveTransitionPreparation,
239
+ ) -> ResidualArchiveTransitionCommit: ...
240
+
241
+ def abort(self, preparation: ResidualArchiveTransitionPreparation) -> None: ...
242
+
243
+
244
+ def _archive_identity(
245
+ value: ResidualArchiveTransitionPort,
246
+ ) -> tuple[str, int, str]:
247
+ if not isinstance(value, ResidualArchiveTransitionPort):
248
+ raise TypeError("archive must implement ResidualArchiveTransitionPort")
249
+ identity = (
250
+ getattr(value, "archive_id", None),
251
+ getattr(value, "archive_version", None),
252
+ getattr(value, "definition_sha256", None),
253
+ )
254
+ _token(identity[0], name="archive_id")
255
+ if type(identity[1]) is not int or identity[1] <= 0:
256
+ raise ValueError("archive_version must be positive")
257
+ require_sha256(identity[2], "archive definition_sha256")
258
+ return identity # type: ignore[return-value]
259
+
260
+
261
+ @dataclass(frozen=True, slots=True)
262
+ class ResidualCampaignStageReceipt:
263
+ """Complete trace join for one committed residual campaign decision."""
264
+
265
+ result: ResidualPortfolioEvolutionResult
266
+ archive_preparation: ResidualArchiveTransitionPreparation
267
+ archive_commit: ResidualArchiveTransitionCommit
268
+ learning_preparation: ResidualLearningPublicationPreparation
269
+ learning_commit: ResidualLearningPublicationCommit
270
+ runtime_definition_sha256: str = RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256
271
+ receipt_sha256: str = field(init=False)
272
+
273
+ def __post_init__(self) -> None:
274
+ if type(self.result) is not ResidualPortfolioEvolutionResult:
275
+ raise TypeError("result must be exact")
276
+ self.result.__post_init__()
277
+ if type(self.archive_preparation) is not ResidualArchiveTransitionPreparation:
278
+ raise TypeError("archive_preparation must be exact")
279
+ self.archive_preparation.__post_init__()
280
+ if type(self.archive_commit) is not ResidualArchiveTransitionCommit:
281
+ raise TypeError("archive_commit must be exact")
282
+ self.archive_commit.__post_init__()
283
+ if (
284
+ type(self.learning_preparation)
285
+ is not ResidualLearningPublicationPreparation
286
+ ):
287
+ raise TypeError("learning_preparation must be exact")
288
+ self.learning_preparation.__post_init__()
289
+ if type(self.learning_commit) is not ResidualLearningPublicationCommit:
290
+ raise TypeError("learning_commit must be exact")
291
+ self.learning_commit.__post_init__()
292
+ require_sha256(
293
+ self.runtime_definition_sha256,
294
+ "runtime_definition_sha256",
295
+ )
296
+ if (
297
+ self.archive_preparation.residual_result_sha256
298
+ != self.result.result_sha256
299
+ or self.learning_preparation.projection.residual_result_sha256
300
+ != self.result.result_sha256
301
+ ):
302
+ raise ValueError("campaign stage products name different results")
303
+ if (
304
+ self.archive_commit.preparation_sha256
305
+ != self.archive_preparation.preparation_sha256
306
+ or self.archive_commit.committed_archive_sha256
307
+ != self.archive_preparation.post_snapshot.archive_sha256
308
+ ):
309
+ raise ValueError("archive commit differs from its preparation")
310
+ if (
311
+ self.learning_commit.preparation_sha256
312
+ != self.learning_preparation.preparation_sha256
313
+ or self.learning_commit.committed_state_sha256
314
+ != self.learning_preparation.next_state.state_sha256
315
+ ):
316
+ raise ValueError("learning commit differs from its preparation")
317
+ object.__setattr__(
318
+ self,
319
+ "receipt_sha256",
320
+ _hash(_STAGE_RECEIPT_DOMAIN, self._unsigned_record()),
321
+ )
322
+
323
+ def _unsigned_record(self) -> dict[str, object]:
324
+ return {
325
+ "schema_version": 1,
326
+ "runtime": {
327
+ "runtime_id": RESIDUAL_CAMPAIGN_RUNTIME_ID,
328
+ "runtime_version": RESIDUAL_CAMPAIGN_RUNTIME_VERSION,
329
+ "definition_sha256": self.runtime_definition_sha256,
330
+ },
331
+ "result_sha256": self.result.result_sha256,
332
+ "archive_preparation_sha256": (
333
+ self.archive_preparation.preparation_sha256
334
+ ),
335
+ "archive_commit_sha256": self.archive_commit.commit_sha256,
336
+ "learning_preparation_sha256": (
337
+ self.learning_preparation.preparation_sha256
338
+ ),
339
+ "learning_commit_sha256": self.learning_commit.commit_sha256,
340
+ "workload_model_provider_fields_present": False,
341
+ }
342
+
343
+ def to_record(self) -> dict[str, object]:
344
+ self.__post_init__()
345
+ return {
346
+ **self._unsigned_record(),
347
+ "result": self.result.to_record(
348
+ include_allocation_evidence=True,
349
+ ),
350
+ "archive_transition": {
351
+ "preparation": self.archive_preparation.to_record(),
352
+ "commit": self.archive_commit.to_record(),
353
+ },
354
+ "learning_transaction": {
355
+ "preparation": self.learning_preparation.to_record(),
356
+ "commit": self.learning_commit.to_record(),
357
+ },
358
+ "receipt_sha256": self.receipt_sha256,
359
+ }
360
+
361
+
362
+ async def commit_residual_campaign_stage(
363
+ *,
364
+ archive: ResidualArchiveTransitionPort,
365
+ learning: TransactionalResidualLearningStore,
366
+ result: ResidualPortfolioEvolutionResult,
367
+ ) -> ResidualCampaignStageReceipt:
368
+ """Atomically publish one already-evaluated generic residual result.
369
+
370
+ This transaction boundary is deliberately independent of how the
371
+ proposal/evaluation slate was produced. Single-wave and sequential
372
+ pilot-gated search therefore share exactly the same archive and learning
373
+ publication semantics.
374
+ """
375
+
376
+ archive_identity = _archive_identity(archive)
377
+ if type(learning) is not TransactionalResidualLearningStore:
378
+ raise TypeError("learning must be an exact transactional store")
379
+ learning.__post_init__()
380
+ if type(result) is not ResidualPortfolioEvolutionResult:
381
+ raise TypeError("result must be exact")
382
+ result.__post_init__()
383
+
384
+ archive_preparation = await archive.prepare(result)
385
+ if type(archive_preparation) is not ResidualArchiveTransitionPreparation:
386
+ raise TypeError("archive returned a foreign preparation")
387
+ archive_preparation.__post_init__()
388
+ if (
389
+ archive_preparation.archive_id,
390
+ archive_preparation.archive_version,
391
+ archive_preparation.archive_definition_sha256,
392
+ ) != archive_identity:
393
+ raise ValueError("archive preparation has a foreign definition")
394
+ if archive_preparation.residual_result_sha256 != result.result_sha256:
395
+ raise ValueError("archive prepared a different residual result")
396
+
397
+ learning_preparation: ResidualLearningPublicationPreparation | None = None
398
+ archive_committed = False
399
+ try:
400
+ learning_preparation = learning.prepare(
401
+ pre_snapshot=archive_preparation.pre_snapshot,
402
+ post_snapshot=archive_preparation.post_snapshot,
403
+ result=result,
404
+ )
405
+ archive_commit = archive.commit(archive_preparation)
406
+ if type(archive_commit) is not ResidualArchiveTransitionCommit:
407
+ raise TypeError("archive returned a foreign commit")
408
+ archive_commit.__post_init__()
409
+ archive_committed = True
410
+ learning_commit = learning.commit(learning_preparation)
411
+ except BaseException:
412
+ if learning_preparation is not None and not archive_committed:
413
+ learning.abort(learning_preparation)
414
+ if not archive_committed:
415
+ archive.abort(archive_preparation)
416
+ raise
417
+ return ResidualCampaignStageReceipt(
418
+ result=result,
419
+ archive_preparation=archive_preparation,
420
+ archive_commit=archive_commit,
421
+ learning_preparation=learning_preparation,
422
+ learning_commit=learning_commit,
423
+ )
424
+
425
+
426
+ @dataclass(frozen=True, slots=True)
427
+ class ResidualPortfolioCampaignStageRuntime:
428
+ """Run and transactionally close one generic residual campaign stage."""
429
+
430
+ experts: tuple[MaterializedActionProposalExpertPort, ...]
431
+ archive: ResidualArchiveTransitionPort = field(repr=False, compare=False)
432
+ learning: TransactionalResidualLearningStore = field(
433
+ repr=False,
434
+ compare=False,
435
+ )
436
+ slate_value: MaterializedSlateValuePort = field(repr=False, compare=False)
437
+ slate_feasibility: MaterializedSlateFeasibilityPort = field(
438
+ repr=False,
439
+ compare=False,
440
+ )
441
+ allocation_policy: MaterializedActionAllocationPolicyPort | None = field(
442
+ default=None,
443
+ repr=False,
444
+ compare=False,
445
+ )
446
+ return_value: MaterializedActionReturnValuePort | None = field(
447
+ default=None,
448
+ repr=False,
449
+ compare=False,
450
+ )
451
+ exploration_policy: MaterializedActionExplorationPort | None = field(
452
+ default_factory=PrequentialLowDiscrepancyResidualExploration,
453
+ repr=False,
454
+ compare=False,
455
+ )
456
+ hierarchical_kappa: float = 4.0
457
+ confidence_width: float = 1.0
458
+ exact_combination_limit: int = 250_000
459
+ beam_width: int = 512
460
+
461
+ def __post_init__(self) -> None:
462
+ if type(self.experts) is not tuple or not self.experts:
463
+ raise ValueError("experts must be a non-empty exact tuple")
464
+ _archive_identity(self.archive)
465
+ if type(self.learning) is not TransactionalResidualLearningStore:
466
+ raise TypeError("learning must be an exact transactional store")
467
+ self.learning.__post_init__()
468
+ if self.exploration_policy is not None and not isinstance(
469
+ self.exploration_policy,
470
+ MaterializedActionExplorationPort,
471
+ ):
472
+ raise TypeError(
473
+ "exploration_policy must implement "
474
+ "MaterializedActionExplorationPort"
475
+ )
476
+ if self.allocation_policy is not None and not isinstance(
477
+ self.allocation_policy,
478
+ MaterializedActionAllocationPolicyPort,
479
+ ):
480
+ raise TypeError(
481
+ "allocation_policy must implement "
482
+ "MaterializedActionAllocationPolicyPort"
483
+ )
484
+ for name in ("hierarchical_kappa", "confidence_width"):
485
+ value = getattr(self, name)
486
+ if type(value) is not float or not math.isfinite(value) or value <= 0.0:
487
+ raise ValueError(f"{name} must be a positive finite exact float")
488
+ for name in ("exact_combination_limit", "beam_width"):
489
+ value = getattr(self, name)
490
+ if type(value) is not int or value <= 0:
491
+ raise ValueError(f"{name} must be a positive exact integer")
492
+
493
+ async def run(
494
+ self,
495
+ request: ResidualPortfolioDecisionRequest,
496
+ ) -> ResidualCampaignStageReceipt:
497
+ self.__post_init__()
498
+ runtime = ResidualPortfolioEvolution(
499
+ experts=self.experts,
500
+ broker=RegretBrokeredMaterializedActionPolicy(
501
+ ledger=self.learning.state.broker_evidence,
502
+ return_value=self.return_value,
503
+ exploration_policy=self.exploration_policy,
504
+ hierarchical_kappa=self.hierarchical_kappa,
505
+ confidence_width=self.confidence_width,
506
+ exact_combination_limit=self.exact_combination_limit,
507
+ beam_width=self.beam_width,
508
+ ),
509
+ slate_value=self.slate_value,
510
+ slate_feasibility=self.slate_feasibility,
511
+ allocation_policy=self.allocation_policy,
512
+ )
513
+ result = await runtime.run(request)
514
+ return await commit_residual_campaign_stage(
515
+ archive=self.archive,
516
+ learning=self.learning,
517
+ result=result,
518
+ )
519
+
520
+
521
+ __all__ = [
522
+ "RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256",
523
+ "RESIDUAL_CAMPAIGN_RUNTIME_ID",
524
+ "RESIDUAL_CAMPAIGN_RUNTIME_VERSION",
525
+ "ResidualArchiveTransitionCommit",
526
+ "ResidualArchiveTransitionPort",
527
+ "ResidualArchiveTransitionPreparation",
528
+ "ResidualCampaignStageReceipt",
529
+ "ResidualPortfolioCampaignStageRuntime",
530
+ "commit_residual_campaign_stage",
531
+ ]