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,595 @@
1
+ """Generic planning and allocation for action-to-frontier realization.
2
+
3
+ This application service is the workload-neutral seam between an evolutionary
4
+ campaign's authenticated objective-space aspiration and the existing
5
+ all-option consequence forecaster. It depends only on public optimization,
6
+ finite-action, and campaign-context contracts. Benchmark adapters may inject
7
+ a richer action glossary; otherwise a structural glossary is derived from the
8
+ sealed parent-to-child patches.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import json
15
+ from dataclasses import dataclass
16
+
17
+ from agent_evolve.application.action_allocation import (
18
+ FeasibleBeamRiskAdjustedDiversityAllocator,
19
+ )
20
+ from agent_evolve.application.action_archive_value import (
21
+ NormalizedResidualFrontierCell,
22
+ ReliabilityAdjustedResidualCellExpectedHypervolumeUtility,
23
+ ResidualCellExpectedHypervolumeUtility,
24
+ residual_frontier_cell_from_target,
25
+ )
26
+ from agent_evolve.application.action_role_value import (
27
+ RoleAssignmentAudit,
28
+ RoleFactorizedActionPortfolioUtility,
29
+ audit_role_factorized_action_portfolio,
30
+ build_role_factorized_action_utility,
31
+ )
32
+ from agent_evolve.application.action_target_realization import (
33
+ ActionTargetRealization,
34
+ ResidualTargetClosurePortfolioUtility,
35
+ TargetMetricAlias,
36
+ assess_action_target_realization,
37
+ )
38
+ from agent_evolve.application.derived_action_semantics import (
39
+ derive_action_space_semantics,
40
+ )
41
+ from agent_evolve.application.portfolio_campaign_runtime import (
42
+ CAMPAIGN_FRONTIER_TARGET_KEY,
43
+ )
44
+ from agent_evolve.core.action_semantics import ActionSpaceSemantics
45
+ from agent_evolve.core.optimization_semantics import (
46
+ MetricRole,
47
+ MetricSense,
48
+ OptimizationSemantics,
49
+ )
50
+ from agent_evolve.domain.finite_variation import FiniteVariationContract
51
+ from agent_evolve.domain.ids import LLMCallId
52
+ from agent_evolve.domain.typed_json import thaw_json
53
+ from agent_evolve.ports.action_allocation import (
54
+ ActionAllocationRequest,
55
+ ActionAllocationResult,
56
+ ActionPortfolioDecision,
57
+ ExactActionArmCountConstraint,
58
+ ForecastPortfolioUtilityBinding,
59
+ validate_action_portfolio_decision,
60
+ )
61
+ from agent_evolve.ports.action_forecast import (
62
+ ActionForecastEvidenceMode,
63
+ ActionForecastRequest,
64
+ MetricForecastScale,
65
+ ParentMetricValue,
66
+ ResolvedActionForecastBatch,
67
+ )
68
+ from agent_evolve.ports.frontier_target import (
69
+ CampaignPortfolioFrontierTarget,
70
+ ObjectiveSpaceTarget,
71
+ campaign_frontier_target_from_record,
72
+ objective_space_target_from_campaign_target,
73
+ )
74
+ from agent_evolve.ports.portfolio_selection import PortfolioSelectionRequest
75
+ from agent_evolve.ports.structured_generator import MAX_OUTPUT_TOKENS
76
+
77
+
78
+ TARGET_ACTION_FORECAST_SCALE_POLICY_ID = "target_delta_forecast_scale"
79
+ TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION = 1
80
+ TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
81
+ b"agent-evolve:target-delta-forecast-scale:v1;"
82
+ b"nonzero=absolute-parent-to-aspiration-raw-delta;"
83
+ b"zero=one-thirty-second-objective-affine-span;"
84
+ b"metric-id=optimization-semantic-objective-id;"
85
+ b"workload-model-provider-fields=false;outcomes=false"
86
+ ).hexdigest()
87
+ _SCALE_BINDING_DOMAIN = b"agent-evolve:target-delta-scale-binding:v1\x00"
88
+
89
+
90
+ @dataclass(frozen=True, slots=True)
91
+ class TargetConditionedActionForecastPlan:
92
+ """Typed forecast request plus the exact target/metric bridge it realizes."""
93
+
94
+ campaign_target: CampaignPortfolioFrontierTarget
95
+ objective_target: ObjectiveSpaceTarget
96
+ aliases: tuple[TargetMetricAlias, ...]
97
+ request: ActionForecastRequest
98
+ residual_cell: NormalizedResidualFrontierCell | None
99
+ min_distinct_families: int | None
100
+ require_pairwise_disjoint_parent_patches: bool
101
+
102
+ def __post_init__(self) -> None:
103
+ if type(self.campaign_target) is not CampaignPortfolioFrontierTarget:
104
+ raise TypeError("campaign_target must be exact")
105
+ self.campaign_target.__post_init__()
106
+ if type(self.objective_target) is not ObjectiveSpaceTarget:
107
+ raise TypeError("objective_target must be exact")
108
+ self.objective_target.__post_init__()
109
+ if (
110
+ self.objective_target.campaign_target_sha256
111
+ != self.campaign_target.target_sha256
112
+ ):
113
+ raise ValueError("objective target belongs to a foreign campaign target")
114
+ if type(self.aliases) is not tuple or any(
115
+ type(value) is not TargetMetricAlias for value in self.aliases
116
+ ):
117
+ raise TypeError("aliases must contain exact target metric aliases")
118
+ for value in self.aliases:
119
+ value.__post_init__()
120
+ if tuple(value.target_metric_id for value in self.aliases) != (
121
+ self.objective_target.metric_ids
122
+ ):
123
+ raise ValueError("aliases must canonically cover the objective target")
124
+ if type(self.request) is not ActionForecastRequest:
125
+ raise TypeError("request must be an exact ActionForecastRequest")
126
+ self.request.__post_init__()
127
+ if (
128
+ self.request.finite_variation_contract.parent_configuration_sha256
129
+ != self.campaign_target.parent_configuration_sha256
130
+ ):
131
+ raise ValueError("forecast contract parent differs from frontier target")
132
+ if set(value.forecast_metric_id for value in self.aliases) != set(
133
+ self.request.required_metric_ids
134
+ ):
135
+ raise ValueError("forecast request and target aliases cover different metrics")
136
+ if self.residual_cell is not None:
137
+ if type(self.residual_cell) is not NormalizedResidualFrontierCell:
138
+ raise TypeError("residual_cell must be exact or None")
139
+ self.residual_cell.__post_init__()
140
+ if (
141
+ self.residual_cell.campaign_target_sha256
142
+ != self.campaign_target.target_sha256
143
+ ):
144
+ raise ValueError("residual cell belongs to a foreign target")
145
+ if self.min_distinct_families is not None and (
146
+ type(self.min_distinct_families) is not int
147
+ or self.min_distinct_families <= 0
148
+ ):
149
+ raise ValueError("min_distinct_families must be positive or None")
150
+ if type(self.require_pairwise_disjoint_parent_patches) is not bool:
151
+ raise TypeError(
152
+ "require_pairwise_disjoint_parent_patches must be exact bool"
153
+ )
154
+
155
+ def assess(
156
+ self,
157
+ forecasts: ResolvedActionForecastBatch,
158
+ ) -> tuple[ActionTargetRealization, ...]:
159
+ self.__post_init__()
160
+ return assess_action_target_realization(
161
+ target=self.objective_target,
162
+ forecasts=forecasts,
163
+ aliases=self.aliases,
164
+ )
165
+
166
+
167
+ def _target_from_selection_context(
168
+ request: PortfolioSelectionRequest,
169
+ ) -> tuple[CampaignPortfolioFrontierTarget, ObjectiveSpaceTarget]:
170
+ context = thaw_json(request.context)
171
+ if type(context) is not dict: # pragma: no cover - frozen root is closed.
172
+ raise AssertionError("portfolio selection context is not an object")
173
+ record = context.get(CAMPAIGN_FRONTIER_TARGET_KEY)
174
+ if record is None:
175
+ raise ValueError("portfolio selection context omits a frontier target")
176
+ campaign_target = campaign_frontier_target_from_record(record)
177
+ objective_target = objective_space_target_from_campaign_target(campaign_target)
178
+ if objective_target is None:
179
+ raise ValueError("campaign frontier target omits raw objective-space axes")
180
+ if campaign_target.parent_configuration_sha256 != (
181
+ request.finite_variation_contract.parent_configuration_sha256
182
+ ):
183
+ raise ValueError("campaign frontier target names a foreign parent")
184
+ return campaign_target, objective_target
185
+
186
+
187
+ def _objective_metric_aliases(
188
+ target: ObjectiveSpaceTarget,
189
+ semantics: OptimizationSemantics,
190
+ ) -> tuple[TargetMetricAlias, ...]:
191
+ objectives_by_name = {
192
+ metric.name: metric
193
+ for metric in semantics.metrics
194
+ if metric.role is MetricRole.OBJECTIVE
195
+ }
196
+ aliases: list[TargetMetricAlias] = []
197
+ for axis in target.axes:
198
+ metric = objectives_by_name.get(axis.metric_id)
199
+ if metric is None:
200
+ raise ValueError(
201
+ "frontier target metric is absent from objective semantics: "
202
+ + axis.metric_id
203
+ )
204
+ expected_sense = (
205
+ MetricSense.MINIMIZE if axis.goal == "min" else MetricSense.MAXIMIZE
206
+ )
207
+ if metric.sense is not expected_sense:
208
+ raise ValueError("frontier target goal differs from objective semantics")
209
+ aliases.append(TargetMetricAlias(axis.metric_id, metric.metric_id))
210
+ return tuple(sorted(aliases, key=lambda value: value.target_metric_id))
211
+
212
+
213
+ def _scale_definition_sha256(
214
+ *,
215
+ target: ObjectiveSpaceTarget,
216
+ target_metric_id: str,
217
+ forecast_metric_id: str,
218
+ scale: float,
219
+ ) -> str:
220
+ payload = json.dumps(
221
+ {
222
+ "schema_version": 1,
223
+ "policy_id": TARGET_ACTION_FORECAST_SCALE_POLICY_ID,
224
+ "policy_version": TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION,
225
+ "policy_definition_sha256": (
226
+ TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256
227
+ ),
228
+ "campaign_target_sha256": target.campaign_target_sha256,
229
+ "target_metric_id": target_metric_id,
230
+ "forecast_metric_id": forecast_metric_id,
231
+ "delta_scale_hex": scale.hex(),
232
+ },
233
+ allow_nan=False,
234
+ ensure_ascii=True,
235
+ separators=(",", ":"),
236
+ sort_keys=True,
237
+ ).encode("ascii")
238
+ return hashlib.sha256(_SCALE_BINDING_DOMAIN + payload).hexdigest()
239
+
240
+
241
+ def build_target_conditioned_action_forecast_plan(
242
+ *,
243
+ selection_request: PortfolioSelectionRequest,
244
+ optimization_semantics: OptimizationSemantics,
245
+ call_id: LLMCallId,
246
+ forecast_contract: FiniteVariationContract | None = None,
247
+ action_semantics: ActionSpaceSemantics | None = None,
248
+ evidence_mode: ActionForecastEvidenceMode = (
249
+ ActionForecastEvidenceMode.CATALOG_ONLY
250
+ ),
251
+ operation: str = "forecast_target_realization",
252
+ max_output_tokens: int = MAX_OUTPUT_TOKENS,
253
+ temperature: float | None = None,
254
+ ) -> TargetConditionedActionForecastPlan:
255
+ """Build one complete consequence-forecast request from generic contracts."""
256
+
257
+ if type(selection_request) is not PortfolioSelectionRequest:
258
+ raise TypeError("selection_request must be exact PortfolioSelectionRequest")
259
+ selection_request.__post_init__()
260
+ if type(optimization_semantics) is not OptimizationSemantics:
261
+ raise TypeError("optimization_semantics must be exact")
262
+ optimization_semantics.__post_init__()
263
+ if type(evidence_mode) is not ActionForecastEvidenceMode:
264
+ raise TypeError("evidence_mode must be exact ActionForecastEvidenceMode")
265
+ resolved_contract = (
266
+ selection_request.finite_variation_contract
267
+ if forecast_contract is None
268
+ else forecast_contract
269
+ )
270
+ if type(resolved_contract) is not FiniteVariationContract:
271
+ raise TypeError("forecast_contract must be an exact contract or None")
272
+ resolved_contract.__post_init__()
273
+ source_contract = selection_request.finite_variation_contract
274
+ if (
275
+ resolved_contract.parent_configuration_sha256
276
+ != source_contract.parent_configuration_sha256
277
+ ):
278
+ raise ValueError("forecast contract belongs to a foreign parent")
279
+ source_options = {
280
+ value.identity_sha256: value for value in source_contract.options
281
+ }
282
+ if any(
283
+ source_options.get(value.identity_sha256) != value
284
+ for value in resolved_contract.options
285
+ ):
286
+ raise ValueError("forecast contract is not an exact source-contract subset")
287
+ campaign_target, objective_target = _target_from_selection_context(
288
+ selection_request
289
+ )
290
+ aliases = _objective_metric_aliases(objective_target, optimization_semantics)
291
+ alias_by_target = {
292
+ value.target_metric_id: value.forecast_metric_id for value in aliases
293
+ }
294
+ parent_values: list[ParentMetricValue] = []
295
+ scales: list[MetricForecastScale] = []
296
+ for axis in objective_target.axes:
297
+ forecast_metric_id = alias_by_target[axis.metric_id]
298
+ scale = abs(axis.signed_parent_to_aspiration_delta)
299
+ if scale == 0.0:
300
+ scale = abs(axis.reference - axis.ideal) / 32.0
301
+ if scale <= 0.0: # pragma: no cover - target axis validation closes span.
302
+ raise ValueError("target-conditioned forecast scale is not positive")
303
+ parent_values.append(ParentMetricValue(forecast_metric_id, axis.parent_value))
304
+ scales.append(
305
+ MetricForecastScale(
306
+ forecast_metric_id,
307
+ float(scale),
308
+ _scale_definition_sha256(
309
+ target=objective_target,
310
+ target_metric_id=axis.metric_id,
311
+ forecast_metric_id=forecast_metric_id,
312
+ scale=float(scale),
313
+ ),
314
+ )
315
+ )
316
+ parent_values.sort(key=lambda value: value.metric_id)
317
+ scales.sort(key=lambda value: value.metric_id)
318
+ resolved_action_semantics = (
319
+ derive_action_space_semantics(resolved_contract)
320
+ if action_semantics is None
321
+ else action_semantics
322
+ )
323
+ resolved_action_semantics.validate_contract_binding(
324
+ (
325
+ resolved_contract.catalog_id,
326
+ resolved_contract.catalog_version,
327
+ resolved_contract.catalog_definition_sha256,
328
+ ),
329
+ tuple(value.family for value in resolved_contract.options),
330
+ )
331
+ grounded = evidence_mode is ActionForecastEvidenceMode.GROUNDED
332
+ forecast_request = ActionForecastRequest(
333
+ call_id=call_id,
334
+ operation=operation,
335
+ instruction=(
336
+ "Forecast signed child-minus-parent objective changes and validity "
337
+ "for every sealed finite action. Use the raw parent-to-aspiration "
338
+ "target magnitudes in context to distinguish undershoot, plausible "
339
+ "target closure, and destructive overshoot. Estimate consequences; "
340
+ "do not select actions or claim evaluator observations."
341
+ ),
342
+ context=selection_request.context,
343
+ optimization_semantics=optimization_semantics,
344
+ action_semantics=resolved_action_semantics,
345
+ finite_variation_contract=resolved_contract,
346
+ cards=selection_request.cards if grounded else (),
347
+ source_registry=selection_request.source_registry if grounded else None,
348
+ evidence_mode=evidence_mode,
349
+ experimental_view_receipt=(
350
+ selection_request.experimental_view_receipt if grounded else None
351
+ ),
352
+ parent_metric_values=tuple(parent_values),
353
+ metric_scales=tuple(scales),
354
+ max_output_tokens=max_output_tokens,
355
+ temperature=temperature,
356
+ )
357
+ return TargetConditionedActionForecastPlan(
358
+ campaign_target=campaign_target,
359
+ objective_target=objective_target,
360
+ aliases=aliases,
361
+ request=forecast_request,
362
+ residual_cell=residual_frontier_cell_from_target(
363
+ campaign_target=campaign_target,
364
+ objective_target=objective_target,
365
+ ),
366
+ min_distinct_families=selection_request.min_distinct_families,
367
+ require_pairwise_disjoint_parent_patches=(
368
+ selection_request.require_pairwise_disjoint_parent_patches
369
+ ),
370
+ )
371
+
372
+
373
+ def build_target_conditioned_action_utility(
374
+ *,
375
+ plan: TargetConditionedActionForecastPlan,
376
+ forecasts: ResolvedActionForecastBatch,
377
+ portfolio_size: int,
378
+ eligible_option_ids: tuple[str, ...] | None = None,
379
+ utility_mode: str = "target_closure",
380
+ role_slots: tuple[int, int, int] | None = None,
381
+ ) -> ForecastPortfolioUtilityBinding:
382
+ """Build one identified, workload-neutral acquisition utility."""
383
+
384
+ if type(plan) is not TargetConditionedActionForecastPlan:
385
+ raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
386
+ plan.__post_init__()
387
+ plan.assess(forecasts)
388
+ eligible = (
389
+ tuple(sorted(value.option_id for value in forecasts.forecasts))
390
+ if eligible_option_ids is None
391
+ else eligible_option_ids
392
+ )
393
+ if utility_mode == "target_closure":
394
+ return ResidualTargetClosurePortfolioUtility(
395
+ target=plan.objective_target,
396
+ aliases=plan.aliases,
397
+ ).binding()
398
+ if utility_mode == "expected_hypervolume":
399
+ if plan.residual_cell is None:
400
+ raise ValueError(
401
+ "expected_hypervolume requires residual frontier cell anchors"
402
+ )
403
+ return ResidualCellExpectedHypervolumeUtility(
404
+ target=plan.objective_target,
405
+ cell=plan.residual_cell,
406
+ aliases=plan.aliases,
407
+ ).binding()
408
+ if utility_mode == "reliability_adjusted_expected_hypervolume":
409
+ if plan.residual_cell is None:
410
+ raise ValueError(
411
+ "reliability-adjusted expected_hypervolume requires residual "
412
+ "frontier cell anchors"
413
+ )
414
+ return ReliabilityAdjustedResidualCellExpectedHypervolumeUtility(
415
+ target=plan.objective_target,
416
+ cell=plan.residual_cell,
417
+ aliases=plan.aliases,
418
+ ).binding()
419
+ if utility_mode == "role_factorized":
420
+ if plan.residual_cell is None:
421
+ raise ValueError(
422
+ "role_factorized requires residual frontier cell anchors"
423
+ )
424
+ resolved_role_slots = (
425
+ (portfolio_size - 2, 1, 1) if role_slots is None else role_slots
426
+ )
427
+ if (
428
+ type(resolved_role_slots) is not tuple
429
+ or len(resolved_role_slots) != 3
430
+ or any(type(value) is not int for value in resolved_role_slots)
431
+ ):
432
+ raise TypeError("role_slots must be an exact (exploit, bridge, probe) tuple")
433
+ exploit_slots, bridge_slots, probe_slots = resolved_role_slots
434
+ if exploit_slots + bridge_slots + probe_slots != portfolio_size:
435
+ raise ValueError("role_slots must sum to portfolio_size")
436
+ role_utility = build_role_factorized_action_utility(
437
+ forecast_request=plan.request,
438
+ forecasts=forecasts,
439
+ eligible_option_ids=eligible,
440
+ exploit_utility=(
441
+ ReliabilityAdjustedResidualCellExpectedHypervolumeUtility(
442
+ target=plan.objective_target,
443
+ cell=plan.residual_cell,
444
+ aliases=plan.aliases,
445
+ )
446
+ ),
447
+ bridge_utility=ResidualTargetClosurePortfolioUtility(
448
+ target=plan.objective_target,
449
+ aliases=plan.aliases,
450
+ ),
451
+ exploit_slots=exploit_slots,
452
+ bridge_slots=bridge_slots,
453
+ probe_slots=probe_slots,
454
+ )
455
+ return role_utility.binding()
456
+ raise ValueError(
457
+ "utility_mode must be target_closure, expected_hypervolume, "
458
+ "reliability_adjusted_expected_hypervolume, or role_factorized"
459
+ )
460
+
461
+
462
+ def allocate_target_conditioned_actions(
463
+ *,
464
+ plan: TargetConditionedActionForecastPlan,
465
+ forecasts: ResolvedActionForecastBatch,
466
+ portfolio_size: int,
467
+ eligible_option_ids: tuple[str, ...] | None = None,
468
+ risk_aversion: float = 0.5,
469
+ diversity_weight: float = 0.05,
470
+ beam_width: int = 256,
471
+ utility_mode: str = "target_closure",
472
+ required_option_ids: tuple[str, ...] = (),
473
+ role_slots: tuple[int, int, int] | None = None,
474
+ exact_arm_count_constraints: tuple[ExactActionArmCountConstraint, ...] = (),
475
+ minimum_single_path_interventions: int = 0,
476
+ minimum_disjoint_parent_patch_pairs: int = 0,
477
+ ) -> ActionAllocationResult:
478
+ """Allocate a robust target-closing set from one authenticated forecast."""
479
+
480
+ if type(plan) is not TargetConditionedActionForecastPlan:
481
+ raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
482
+ plan.__post_init__()
483
+ plan.assess(forecasts)
484
+ eligible = (
485
+ tuple(sorted(value.option_id for value in forecasts.forecasts))
486
+ if eligible_option_ids is None
487
+ else eligible_option_ids
488
+ )
489
+ utility = build_target_conditioned_action_utility(
490
+ plan=plan,
491
+ forecasts=forecasts,
492
+ portfolio_size=portfolio_size,
493
+ eligible_option_ids=eligible,
494
+ utility_mode=utility_mode,
495
+ role_slots=role_slots,
496
+ )
497
+ request = ActionAllocationRequest(
498
+ forecast_request=plan.request,
499
+ forecasts=forecasts,
500
+ eligible_option_ids=eligible,
501
+ portfolio_size=portfolio_size,
502
+ utility=utility,
503
+ min_distinct_families=plan.min_distinct_families,
504
+ require_pairwise_disjoint_parent_patches=(
505
+ plan.require_pairwise_disjoint_parent_patches
506
+ ),
507
+ minimum_single_path_interventions=minimum_single_path_interventions,
508
+ minimum_disjoint_parent_patch_pairs=(
509
+ minimum_disjoint_parent_patch_pairs
510
+ ),
511
+ required_option_ids=required_option_ids,
512
+ exact_arm_count_constraints=exact_arm_count_constraints,
513
+ )
514
+ return FeasibleBeamRiskAdjustedDiversityAllocator(
515
+ risk_aversion=risk_aversion,
516
+ diversity_weight=diversity_weight,
517
+ beam_width=beam_width,
518
+ ).allocate(request)
519
+
520
+
521
+ def audit_target_conditioned_role_allocation(
522
+ *,
523
+ plan: TargetConditionedActionForecastPlan,
524
+ forecasts: ResolvedActionForecastBatch,
525
+ decision: ActionPortfolioDecision,
526
+ eligible_option_ids: tuple[str, ...] | None = None,
527
+ role_slots: tuple[int, int, int] | None = None,
528
+ exact_arm_count_constraints: tuple[ExactActionArmCountConstraint, ...] = (),
529
+ required_option_ids: tuple[str, ...] = (),
530
+ minimum_single_path_interventions: int = 0,
531
+ minimum_disjoint_parent_patch_pairs: int = 0,
532
+ ) -> tuple[RoleAssignmentAudit, ...]:
533
+ """Rebuild, validate, and explain a final role-factorized allocation."""
534
+
535
+ if type(plan) is not TargetConditionedActionForecastPlan:
536
+ raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
537
+ plan.__post_init__()
538
+ plan.assess(forecasts)
539
+ if type(decision) is not ActionPortfolioDecision:
540
+ raise TypeError("decision must be exact ActionPortfolioDecision")
541
+ decision.__post_init__()
542
+ eligible = (
543
+ tuple(sorted(value.option_id for value in forecasts.forecasts))
544
+ if eligible_option_ids is None
545
+ else eligible_option_ids
546
+ )
547
+ utility = build_target_conditioned_action_utility(
548
+ plan=plan,
549
+ forecasts=forecasts,
550
+ portfolio_size=len(decision.members),
551
+ eligible_option_ids=eligible,
552
+ utility_mode="role_factorized",
553
+ role_slots=role_slots,
554
+ )
555
+ request = ActionAllocationRequest(
556
+ forecast_request=plan.request,
557
+ forecasts=forecasts,
558
+ eligible_option_ids=eligible,
559
+ portfolio_size=len(decision.members),
560
+ utility=utility,
561
+ min_distinct_families=plan.min_distinct_families,
562
+ require_pairwise_disjoint_parent_patches=(
563
+ plan.require_pairwise_disjoint_parent_patches
564
+ ),
565
+ minimum_single_path_interventions=minimum_single_path_interventions,
566
+ minimum_disjoint_parent_patch_pairs=(
567
+ minimum_disjoint_parent_patch_pairs
568
+ ),
569
+ required_option_ids=required_option_ids,
570
+ exact_arm_count_constraints=exact_arm_count_constraints,
571
+ )
572
+ validate_action_portfolio_decision(request, decision)
573
+ role_utility = utility.utility
574
+ if type(role_utility) is not RoleFactorizedActionPortfolioUtility:
575
+ raise AssertionError("role utility factory returned a foreign utility")
576
+ return audit_role_factorized_action_portfolio(
577
+ utility=role_utility,
578
+ forecast_request=plan.request,
579
+ forecasts=forecasts,
580
+ selected_option_ids=tuple(
581
+ sorted(value.option_id for value in decision.members)
582
+ ),
583
+ )
584
+
585
+
586
+ __all__ = [
587
+ "TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256",
588
+ "TARGET_ACTION_FORECAST_SCALE_POLICY_ID",
589
+ "TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION",
590
+ "TargetConditionedActionForecastPlan",
591
+ "allocate_target_conditioned_actions",
592
+ "audit_target_conditioned_role_allocation",
593
+ "build_target_conditioned_action_utility",
594
+ "build_target_conditioned_action_forecast_plan",
595
+ ]