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,770 @@
1
+ """Composition root for the generic semantic-coverage residual portfolio."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+
7
+ from agent_evolve.application.action_score_authorities import (
8
+ NativeRankMaterializedActionScorer,
9
+ TargetEmpiricalReturnMaterializedActionScorer,
10
+ )
11
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
12
+ from agent_evolve.application.candidate_archive_consequence import (
13
+ CandidateArchiveConsequenceUtilityPort,
14
+ CandidateArchivePortfolioConsequenceUtilityPort,
15
+ )
16
+ from agent_evolve.application.forecast_geometry_portfolio import (
17
+ ForecastGeometryPortfolioMode,
18
+ ForecastGeometryPortfolioPolicy,
19
+ MaterializedForecastGeometryProjectionPort,
20
+ )
21
+ from agent_evolve.application.frozen_hurdle_score import (
22
+ FrozenHurdleScoreKind,
23
+ FrozenStandardizedLinearModel,
24
+ MaterializedActionFeatureProjectionPort,
25
+ WinsorizedFrozenHurdleMaterializedActionScorer,
26
+ )
27
+ from agent_evolve.application.materialized_action_broker import (
28
+ RegretBrokeredMaterializedActionPolicy,
29
+ )
30
+ from agent_evolve.application.precommitted_portfolio_racing import (
31
+ PortfolioRaceDisagreementPolicyPort,
32
+ PortfolioRacePolicyBinding,
33
+ PortfolioRacePriorProjectionPort,
34
+ PrecommittedPortfolioRacePlanner,
35
+ )
36
+ from agent_evolve.application.residual_portfolio_evolution import (
37
+ MaterializedActionAllocationPolicyPort,
38
+ )
39
+ from agent_evolve.application.semantic_coverage_score_portfolio import (
40
+ MaterializedActionSemanticCellProjectionPort,
41
+ SemanticCoverageScorePortfolioPolicy,
42
+ )
43
+ from agent_evolve.application.sequential_lineage_allocation import (
44
+ CandidateArchiveMarginalPilotOutcomeProjector,
45
+ FrozenBranchSequentialLineagePlanner,
46
+ )
47
+ from agent_evolve.application.source_exposure_allocation import (
48
+ MaterializedActionSourceGroupProjectionPort,
49
+ MinimumSourceExposureAllocationPolicy,
50
+ )
51
+ from agent_evolve.application.support_guarded_hurdle_score import (
52
+ FrozenFeatureSupportGroup,
53
+ SupportGuardedFrozenHurdleMaterializedActionScorer,
54
+ )
55
+ from agent_evolve.ports.hard_feasibility import HardFeasibilityPort
56
+
57
+ from .portable_residual_consequence_features import (
58
+ PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS,
59
+ )
60
+
61
+ PRIMARY_SCORER_ID = "portable_positive_probability"
62
+ TRANSPORT_SCORER_ID = "portable_cross_domain_expected_gain"
63
+ DEFAULT_LINEAGE_CAPACITY_FRACTION = 0.25
64
+ DEFAULT_COVERAGE_STRENGTH = 1.0 / 3.0
65
+ FORECAST_NEUTRAL_FEATURE_GROUP_AUTHORITIES = tuple(
66
+ sorted(
67
+ (
68
+ group_id,
69
+ 0.0 if group_id == "forecast" else 1.0,
70
+ )
71
+ for group_id, _feature_names
72
+ in PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS
73
+ )
74
+ )
75
+
76
+
77
+ @dataclass(frozen=True, slots=True)
78
+ class SemanticCoverageResidualPortfolio:
79
+ """Four score authorities and one portable semantic allocation policy."""
80
+
81
+ primary: SupportGuardedFrozenHurdleMaterializedActionScorer
82
+ transport: WinsorizedFrozenHurdleMaterializedActionScorer
83
+ provider_native: NativeRankMaterializedActionScorer
84
+ target_empirical: TargetEmpiricalReturnMaterializedActionScorer
85
+ allocation: SemanticCoverageScorePortfolioPolicy
86
+
87
+ def __post_init__(self) -> None:
88
+ if (
89
+ type(self.primary)
90
+ is not SupportGuardedFrozenHurdleMaterializedActionScorer
91
+ or type(self.transport)
92
+ is not WinsorizedFrozenHurdleMaterializedActionScorer
93
+ or type(self.provider_native)
94
+ is not NativeRankMaterializedActionScorer
95
+ or type(self.target_empirical)
96
+ is not TargetEmpiricalReturnMaterializedActionScorer
97
+ or type(self.allocation)
98
+ is not SemanticCoverageScorePortfolioPolicy
99
+ ):
100
+ raise TypeError(
101
+ "semantic coverage portfolio contains a foreign component"
102
+ )
103
+ self.primary.__post_init__()
104
+ self.transport.__post_init__()
105
+ self.provider_native.__post_init__()
106
+ self.target_empirical.__post_init__()
107
+ self.allocation.__post_init__()
108
+
109
+
110
+ @dataclass(frozen=True, slots=True)
111
+ class SequentialSemanticCoverageResidualPortfolio:
112
+ """Two frozen allocation branches and their real-outcome pilot seam."""
113
+
114
+ locked: SemanticCoverageResidualPortfolio
115
+ unlocked: SemanticCoverageResidualPortfolio
116
+ planner: FrozenBranchSequentialLineagePlanner
117
+ pilot_outcome_projector: (
118
+ CandidateArchiveMarginalPilotOutcomeProjector
119
+ )
120
+
121
+ def __post_init__(self) -> None:
122
+ if type(self.locked) is not SemanticCoverageResidualPortfolio:
123
+ raise TypeError("locked portfolio must be exact")
124
+ if type(self.unlocked) is not SemanticCoverageResidualPortfolio:
125
+ raise TypeError("unlocked portfolio must be exact")
126
+ self.locked.__post_init__()
127
+ self.unlocked.__post_init__()
128
+ if type(self.planner) is not FrozenBranchSequentialLineagePlanner:
129
+ raise TypeError("planner must be exact")
130
+ self.planner.__post_init__()
131
+ if (
132
+ type(self.pilot_outcome_projector)
133
+ is not CandidateArchiveMarginalPilotOutcomeProjector
134
+ ):
135
+ raise TypeError("pilot_outcome_projector must be exact")
136
+ self.pilot_outcome_projector.__post_init__()
137
+ if self.locked.allocation.allow_recursive_score_lane_spillover:
138
+ raise ValueError("locked branch permits recursive spillover")
139
+ if not self.unlocked.allocation.allow_recursive_score_lane_spillover:
140
+ raise ValueError("unlocked branch forbids recursive spillover")
141
+
142
+ @property
143
+ def primary(self) -> SupportGuardedFrozenHurdleMaterializedActionScorer:
144
+ """Canonical support telemetry; both branches use the same fit."""
145
+
146
+ return self.locked.primary
147
+
148
+
149
+ @dataclass(frozen=True, slots=True)
150
+ class RacingSemanticCoverageResidualPortfolio:
151
+ """Calibrated and forecast-neutral slates behind one generic race."""
152
+
153
+ calibrated_locked: SemanticCoverageResidualPortfolio
154
+ calibrated_unlocked: SemanticCoverageResidualPortfolio
155
+ forecast_neutral_unlocked: SemanticCoverageResidualPortfolio
156
+ planner: PrecommittedPortfolioRacePlanner
157
+ pilot_outcome_projector: (
158
+ CandidateArchiveMarginalPilotOutcomeProjector
159
+ )
160
+
161
+ def __post_init__(self) -> None:
162
+ for value in (
163
+ self.calibrated_locked,
164
+ self.calibrated_unlocked,
165
+ self.forecast_neutral_unlocked,
166
+ ):
167
+ if type(value) is not SemanticCoverageResidualPortfolio:
168
+ raise TypeError("race portfolios must be exact")
169
+ value.__post_init__()
170
+ if type(self.planner) is not PrecommittedPortfolioRacePlanner:
171
+ raise TypeError("race planner must be exact")
172
+ self.planner.__post_init__()
173
+ if (
174
+ type(self.pilot_outcome_projector)
175
+ is not CandidateArchiveMarginalPilotOutcomeProjector
176
+ ):
177
+ raise TypeError("pilot_outcome_projector must be exact")
178
+ self.pilot_outcome_projector.__post_init__()
179
+ if self.calibrated_locked.allocation.allow_recursive_score_lane_spillover:
180
+ raise ValueError("calibrated locked branch permits spillover")
181
+ if not (
182
+ self.calibrated_unlocked.allocation.allow_recursive_score_lane_spillover
183
+ and self.forecast_neutral_unlocked.allocation.allow_recursive_score_lane_spillover
184
+ ):
185
+ raise ValueError("race unlocked branches must permit spillover")
186
+
187
+
188
+ @dataclass(frozen=True, slots=True)
189
+ class ForecastGeometryArmSpec:
190
+ """One interceptable, workload-neutral consequence-policy branch."""
191
+
192
+ branch_id: str
193
+ mode: ForecastGeometryPortfolioMode
194
+ scenario_id: str
195
+ adverse_scenario_id: str | None = None
196
+ risk_aversion: float = 0.0
197
+ prior_mean: float = 0.5
198
+
199
+ def __post_init__(self) -> None:
200
+ if type(self.branch_id) is not str or not self.branch_id:
201
+ raise ValueError("branch_id must be non-empty")
202
+ if type(self.mode) is not ForecastGeometryPortfolioMode:
203
+ raise TypeError("mode must be an exact forecast geometry mode")
204
+ if type(self.scenario_id) is not str or not self.scenario_id:
205
+ raise ValueError("scenario_id must be non-empty")
206
+ if self.adverse_scenario_id is not None and (
207
+ type(self.adverse_scenario_id) is not str
208
+ or not self.adverse_scenario_id
209
+ ):
210
+ raise ValueError("adverse_scenario_id must be non-empty or None")
211
+ for value, name in (
212
+ (self.risk_aversion, "risk_aversion"),
213
+ (self.prior_mean, "prior_mean"),
214
+ ):
215
+ if type(value) is not float:
216
+ raise TypeError(f"{name} must be an exact float")
217
+ if self.risk_aversion < 0.0:
218
+ raise ValueError("risk_aversion must be non-negative")
219
+ if not 0.0 <= self.prior_mean <= 1.0:
220
+ raise ValueError("prior_mean must lie in [0, 1]")
221
+
222
+
223
+ DEFAULT_FORECAST_GEOMETRY_ARM_SPECS = (
224
+ ForecastGeometryArmSpec(
225
+ branch_id="forecast_favorable",
226
+ mode=ForecastGeometryPortfolioMode.SCENARIO,
227
+ scenario_id="favorable",
228
+ ),
229
+ ForecastGeometryArmSpec(
230
+ branch_id="forecast_median",
231
+ mode=ForecastGeometryPortfolioMode.SCENARIO,
232
+ scenario_id="median",
233
+ ),
234
+ ForecastGeometryArmSpec(
235
+ branch_id="forecast_reliability",
236
+ mode=(
237
+ ForecastGeometryPortfolioMode.RELIABILITY_ADJUSTED_SCENARIO
238
+ ),
239
+ scenario_id="median",
240
+ ),
241
+ ForecastGeometryArmSpec(
242
+ branch_id="forecast_risk",
243
+ mode=ForecastGeometryPortfolioMode.RISK_ADJUSTED_SCENARIO,
244
+ scenario_id="median",
245
+ adverse_scenario_id="adverse",
246
+ risk_aversion=1.0,
247
+ ),
248
+ )
249
+
250
+
251
+ @dataclass(frozen=True, slots=True)
252
+ class ForecastGeometryRacingResidualPortfolio:
253
+ """Protected structural arm plus typed consequence-geometry arms."""
254
+
255
+ forecast_neutral: SemanticCoverageResidualPortfolio
256
+ forecast_arms: tuple[
257
+ tuple[str, ForecastGeometryPortfolioPolicy],
258
+ ...,
259
+ ]
260
+ planner: PrecommittedPortfolioRacePlanner
261
+ pilot_outcome_projector: CandidateArchiveMarginalPilotOutcomeProjector
262
+
263
+ def __post_init__(self) -> None:
264
+ if type(self.forecast_neutral) is not SemanticCoverageResidualPortfolio:
265
+ raise TypeError("forecast_neutral must be an exact portfolio")
266
+ self.forecast_neutral.__post_init__()
267
+ if not self.forecast_neutral.allocation.allow_recursive_score_lane_spillover:
268
+ raise ValueError("forecast-neutral branch must permit spillover")
269
+ if (
270
+ type(self.forecast_arms) is not tuple
271
+ or not self.forecast_arms
272
+ or self.forecast_arms
273
+ != tuple(sorted(self.forecast_arms, key=lambda value: value[0]))
274
+ ):
275
+ raise ValueError("forecast_arms must be non-empty and canonical")
276
+ branch_ids = []
277
+ for branch_id, policy in self.forecast_arms:
278
+ if type(branch_id) is not str or not branch_id:
279
+ raise ValueError("forecast arm branch IDs must be non-empty")
280
+ if type(policy) is not ForecastGeometryPortfolioPolicy:
281
+ raise TypeError("forecast arms must contain exact policies")
282
+ policy.__post_init__()
283
+ branch_ids.append(branch_id)
284
+ if len(branch_ids) != len(set(branch_ids)):
285
+ raise ValueError("forecast arms repeat a branch ID")
286
+ if type(self.planner) is not PrecommittedPortfolioRacePlanner:
287
+ raise TypeError("planner must be exact")
288
+ self.planner.__post_init__()
289
+ expected_ids = tuple(sorted(("forecast_neutral", *branch_ids)))
290
+ if tuple(
291
+ value.branch_id for value in self.planner.branch_bindings
292
+ ) != expected_ids:
293
+ raise ValueError("planner branches differ from forecast arms")
294
+ if (
295
+ type(self.pilot_outcome_projector)
296
+ is not CandidateArchiveMarginalPilotOutcomeProjector
297
+ ):
298
+ raise TypeError("pilot_outcome_projector must be exact")
299
+ self.pilot_outcome_projector.__post_init__()
300
+
301
+
302
+ def compose_semantic_coverage_residual_portfolio(
303
+ *,
304
+ projection: MaterializedActionFeatureProjectionPort,
305
+ semantic_projection: MaterializedActionSemanticCellProjectionPort,
306
+ primary_positive_model: FrozenStandardizedLinearModel,
307
+ primary_magnitude_model: FrozenStandardizedLinearModel,
308
+ primary_source_fit_sha256: str,
309
+ transport_positive_model: FrozenStandardizedLinearModel,
310
+ transport_magnitude_model: FrozenStandardizedLinearModel,
311
+ transport_source_fit_sha256: str,
312
+ broker: RegretBrokeredMaterializedActionPolicy,
313
+ lineage_capacity_fraction: float = (
314
+ DEFAULT_LINEAGE_CAPACITY_FRACTION
315
+ ),
316
+ coverage_strength: float = DEFAULT_COVERAGE_STRENGTH,
317
+ allow_recursive_score_lane_spillover: bool = False,
318
+ hard_feasibility: HardFeasibilityPort | None = None,
319
+ feature_group_authorities: tuple[tuple[str, float], ...] | None = None,
320
+ ) -> SemanticCoverageResidualPortfolio:
321
+ """Compose the same four-lane mechanism for any workload or model."""
322
+
323
+ expected_group_ids = tuple(
324
+ sorted(
325
+ group_id
326
+ for group_id, _feature_names
327
+ in PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS
328
+ )
329
+ )
330
+ authorities = (
331
+ tuple((group_id, 1.0) for group_id in expected_group_ids)
332
+ if feature_group_authorities is None
333
+ else feature_group_authorities
334
+ )
335
+ if (
336
+ type(authorities) is not tuple
337
+ or authorities != tuple(sorted(authorities))
338
+ or tuple(value[0] for value in authorities) != expected_group_ids
339
+ ):
340
+ raise ValueError(
341
+ "feature_group_authorities must exactly cover portable groups"
342
+ )
343
+ authority_by_group = dict(authorities)
344
+ groups = tuple(
345
+ FrozenFeatureSupportGroup(
346
+ group_id=group_id,
347
+ feature_names=tuple(feature_names),
348
+ base_authority=authority_by_group[group_id],
349
+ )
350
+ for group_id, feature_names in sorted(
351
+ PORTABLE_RESIDUAL_CONSEQUENCE_FEATURE_GROUPS
352
+ )
353
+ )
354
+ primary = SupportGuardedFrozenHurdleMaterializedActionScorer(
355
+ scorer_id=PRIMARY_SCORER_ID,
356
+ projection=projection,
357
+ positive_model=primary_positive_model,
358
+ magnitude_model=primary_magnitude_model,
359
+ score_kind=FrozenHurdleScoreKind.POSITIVE_PROBABILITY,
360
+ source_fit_sha256=primary_source_fit_sha256,
361
+ support_groups=groups,
362
+ )
363
+ transport = WinsorizedFrozenHurdleMaterializedActionScorer(
364
+ scorer_id=TRANSPORT_SCORER_ID,
365
+ projection=projection,
366
+ positive_model=transport_positive_model,
367
+ magnitude_model=transport_magnitude_model,
368
+ score_kind=FrozenHurdleScoreKind.EXPECTED_POSITIVE_MAGNITUDE,
369
+ source_fit_sha256=transport_source_fit_sha256,
370
+ winsorization_limit=3.0,
371
+ )
372
+ provider_native = NativeRankMaterializedActionScorer()
373
+ target_empirical = TargetEmpiricalReturnMaterializedActionScorer(
374
+ broker=broker
375
+ )
376
+ scorers = tuple(
377
+ sorted(
378
+ (primary, transport, provider_native, target_empirical),
379
+ key=lambda value: value.scorer_id,
380
+ )
381
+ )
382
+ score_lane_capacity = 1.0 - lineage_capacity_fraction
383
+ allocation = SemanticCoverageScorePortfolioPolicy(
384
+ scorers=scorers,
385
+ scorer_capacity_fractions=tuple(
386
+ sorted(
387
+ (
388
+ (
389
+ primary.scorer_id,
390
+ score_lane_capacity * (2.0 / 3.0),
391
+ ),
392
+ (transport.scorer_id, 0.0),
393
+ (
394
+ provider_native.scorer_id,
395
+ score_lane_capacity * (1.0 / 6.0),
396
+ ),
397
+ (
398
+ target_empirical.scorer_id,
399
+ score_lane_capacity * (1.0 / 6.0),
400
+ ),
401
+ )
402
+ )
403
+ ),
404
+ lineage_scorer_id=transport.scorer_id,
405
+ lineage_member_scorer_id=provider_native.scorer_id,
406
+ lineage_deficit_refill_scorer_id=primary.scorer_id,
407
+ lineage_capacity_fraction=lineage_capacity_fraction,
408
+ semantic_projection=semantic_projection,
409
+ coverage_strength=coverage_strength,
410
+ allow_recursive_score_lane_spillover=(
411
+ allow_recursive_score_lane_spillover
412
+ ),
413
+ hard_feasibility=hard_feasibility,
414
+ )
415
+ return SemanticCoverageResidualPortfolio(
416
+ primary=primary,
417
+ transport=transport,
418
+ provider_native=provider_native,
419
+ target_empirical=target_empirical,
420
+ allocation=allocation,
421
+ )
422
+
423
+
424
+ def compose_sequential_semantic_coverage_residual_portfolio(
425
+ *,
426
+ prior_candidates: tuple[EvolutionCandidate, ...],
427
+ archive_utility: CandidateArchiveConsequenceUtilityPort,
428
+ projection: MaterializedActionFeatureProjectionPort,
429
+ semantic_projection: MaterializedActionSemanticCellProjectionPort,
430
+ primary_positive_model: FrozenStandardizedLinearModel,
431
+ primary_magnitude_model: FrozenStandardizedLinearModel,
432
+ primary_source_fit_sha256: str,
433
+ transport_positive_model: FrozenStandardizedLinearModel,
434
+ transport_magnitude_model: FrozenStandardizedLinearModel,
435
+ transport_source_fit_sha256: str,
436
+ broker: RegretBrokeredMaterializedActionPolicy,
437
+ lineage_capacity_fraction: float = (
438
+ DEFAULT_LINEAGE_CAPACITY_FRACTION
439
+ ),
440
+ coverage_strength: float = DEFAULT_COVERAGE_STRENGTH,
441
+ hard_feasibility: HardFeasibilityPort | None = None,
442
+ ) -> SequentialSemanticCoverageResidualPortfolio:
443
+ """Compose outcome-blind locked/unlocked branches for any workload."""
444
+
445
+ common = {
446
+ "projection": projection,
447
+ "semantic_projection": semantic_projection,
448
+ "primary_positive_model": primary_positive_model,
449
+ "primary_magnitude_model": primary_magnitude_model,
450
+ "primary_source_fit_sha256": primary_source_fit_sha256,
451
+ "transport_positive_model": transport_positive_model,
452
+ "transport_magnitude_model": transport_magnitude_model,
453
+ "transport_source_fit_sha256": transport_source_fit_sha256,
454
+ "broker": broker,
455
+ "lineage_capacity_fraction": lineage_capacity_fraction,
456
+ "coverage_strength": coverage_strength,
457
+ "hard_feasibility": hard_feasibility,
458
+ }
459
+ locked = compose_semantic_coverage_residual_portfolio(
460
+ **common,
461
+ allow_recursive_score_lane_spillover=False,
462
+ )
463
+ unlocked = compose_semantic_coverage_residual_portfolio(
464
+ **common,
465
+ allow_recursive_score_lane_spillover=True,
466
+ )
467
+ return SequentialSemanticCoverageResidualPortfolio(
468
+ locked=locked,
469
+ unlocked=unlocked,
470
+ planner=FrozenBranchSequentialLineagePlanner(
471
+ locked_policy=locked.allocation,
472
+ unlocked_policy=unlocked.allocation,
473
+ ),
474
+ pilot_outcome_projector=(
475
+ CandidateArchiveMarginalPilotOutcomeProjector(
476
+ prior_candidates=prior_candidates,
477
+ utility=archive_utility,
478
+ )
479
+ ),
480
+ )
481
+
482
+
483
+ def compose_racing_semantic_coverage_residual_portfolio(
484
+ *,
485
+ prior_candidates: tuple[EvolutionCandidate, ...],
486
+ archive_utility: CandidateArchiveConsequenceUtilityPort,
487
+ projection: MaterializedActionFeatureProjectionPort,
488
+ semantic_projection: MaterializedActionSemanticCellProjectionPort,
489
+ primary_positive_model: FrozenStandardizedLinearModel,
490
+ primary_magnitude_model: FrozenStandardizedLinearModel,
491
+ primary_source_fit_sha256: str,
492
+ transport_positive_model: FrozenStandardizedLinearModel,
493
+ transport_magnitude_model: FrozenStandardizedLinearModel,
494
+ transport_source_fit_sha256: str,
495
+ broker: RegretBrokeredMaterializedActionPolicy,
496
+ lineage_capacity_fraction: float = (
497
+ DEFAULT_LINEAGE_CAPACITY_FRACTION
498
+ ),
499
+ coverage_strength: float = DEFAULT_COVERAGE_STRENGTH,
500
+ pilot_slots: int = 3,
501
+ disagreement_policy: PortfolioRaceDisagreementPolicyPort | None = None,
502
+ prior_projection: PortfolioRacePriorProjectionPort | None = None,
503
+ source_group_projection: (
504
+ MaterializedActionSourceGroupProjectionPort | None
505
+ ) = None,
506
+ minimum_source_exposures: tuple[tuple[str, int], ...] = (),
507
+ hard_feasibility: HardFeasibilityPort | None = None,
508
+ ) -> RacingSemanticCoverageResidualPortfolio:
509
+ """Compose three portable complete slates and a branch-level pilot race."""
510
+
511
+ common = {
512
+ "projection": projection,
513
+ "semantic_projection": semantic_projection,
514
+ "primary_positive_model": primary_positive_model,
515
+ "primary_magnitude_model": primary_magnitude_model,
516
+ "primary_source_fit_sha256": primary_source_fit_sha256,
517
+ "transport_positive_model": transport_positive_model,
518
+ "transport_magnitude_model": transport_magnitude_model,
519
+ "transport_source_fit_sha256": transport_source_fit_sha256,
520
+ "broker": broker,
521
+ "lineage_capacity_fraction": lineage_capacity_fraction,
522
+ "coverage_strength": coverage_strength,
523
+ "hard_feasibility": hard_feasibility,
524
+ }
525
+ calibrated_locked = compose_semantic_coverage_residual_portfolio(
526
+ **common,
527
+ allow_recursive_score_lane_spillover=False,
528
+ )
529
+ calibrated_unlocked = compose_semantic_coverage_residual_portfolio(
530
+ **common,
531
+ allow_recursive_score_lane_spillover=True,
532
+ )
533
+ forecast_neutral_unlocked = (
534
+ compose_semantic_coverage_residual_portfolio(
535
+ **common,
536
+ allow_recursive_score_lane_spillover=True,
537
+ feature_group_authorities=(
538
+ FORECAST_NEUTRAL_FEATURE_GROUP_AUTHORITIES
539
+ ),
540
+ )
541
+ )
542
+ if (source_group_projection is None) != (
543
+ not minimum_source_exposures
544
+ ):
545
+ raise ValueError(
546
+ "source-group projection and minimum exposures must co-occur"
547
+ )
548
+
549
+ def allocation(
550
+ value: SemanticCoverageResidualPortfolio,
551
+ ):
552
+ if source_group_projection is None:
553
+ return value.allocation
554
+ return MinimumSourceExposureAllocationPolicy(
555
+ base_policy=value.allocation,
556
+ priority_scorer=value.primary,
557
+ source_projection=source_group_projection,
558
+ minimum_exposures=minimum_source_exposures,
559
+ )
560
+
561
+ return RacingSemanticCoverageResidualPortfolio(
562
+ calibrated_locked=calibrated_locked,
563
+ calibrated_unlocked=calibrated_unlocked,
564
+ forecast_neutral_unlocked=forecast_neutral_unlocked,
565
+ planner=PrecommittedPortfolioRacePlanner(
566
+ branch_bindings=(
567
+ PortfolioRacePolicyBinding(
568
+ branch_id="calibrated_locked",
569
+ policy=allocation(calibrated_locked),
570
+ ),
571
+ PortfolioRacePolicyBinding(
572
+ branch_id="calibrated_unlocked",
573
+ policy=allocation(calibrated_unlocked),
574
+ ),
575
+ PortfolioRacePolicyBinding(
576
+ branch_id="forecast_neutral_unlocked",
577
+ policy=allocation(forecast_neutral_unlocked),
578
+ ),
579
+ ),
580
+ pilot_policy=None,
581
+ pilot_slots=pilot_slots,
582
+ disagreement_policy=disagreement_policy,
583
+ prior_projection=prior_projection,
584
+ ),
585
+ pilot_outcome_projector=(
586
+ CandidateArchiveMarginalPilotOutcomeProjector(
587
+ prior_candidates=prior_candidates,
588
+ utility=archive_utility,
589
+ )
590
+ ),
591
+ )
592
+
593
+
594
+ def compose_forecast_geometry_racing_residual_portfolio(
595
+ *,
596
+ prior_candidates: tuple[EvolutionCandidate, ...],
597
+ archive_utility: CandidateArchivePortfolioConsequenceUtilityPort,
598
+ forecast_geometry_projection: (
599
+ MaterializedForecastGeometryProjectionPort
600
+ ),
601
+ projection: MaterializedActionFeatureProjectionPort,
602
+ semantic_projection: MaterializedActionSemanticCellProjectionPort,
603
+ primary_positive_model: FrozenStandardizedLinearModel,
604
+ primary_magnitude_model: FrozenStandardizedLinearModel,
605
+ primary_source_fit_sha256: str,
606
+ transport_positive_model: FrozenStandardizedLinearModel,
607
+ transport_magnitude_model: FrozenStandardizedLinearModel,
608
+ transport_source_fit_sha256: str,
609
+ broker: RegretBrokeredMaterializedActionPolicy,
610
+ lineage_capacity_fraction: float = (
611
+ DEFAULT_LINEAGE_CAPACITY_FRACTION
612
+ ),
613
+ coverage_strength: float = DEFAULT_COVERAGE_STRENGTH,
614
+ pilot_slots: int = 3,
615
+ disagreement_policy: PortfolioRaceDisagreementPolicyPort | None = None,
616
+ prior_projection: PortfolioRacePriorProjectionPort | None = None,
617
+ arm_specs: tuple[ForecastGeometryArmSpec, ...] = (
618
+ DEFAULT_FORECAST_GEOMETRY_ARM_SPECS
619
+ ),
620
+ forecast_neutral_prior_mean: float = 0.5,
621
+ max_exact_reliability_members: int = 8,
622
+ source_group_projection: (
623
+ MaterializedActionSourceGroupProjectionPort | None
624
+ ) = None,
625
+ minimum_source_exposures: tuple[tuple[str, int], ...] = (),
626
+ hard_feasibility: HardFeasibilityPort | None = None,
627
+ ) -> ForecastGeometryRacingResidualPortfolio:
628
+ """Compose protected scenario arms behind the same generic race.
629
+
630
+ Workload adapters supply only ordinary objective senses through the
631
+ forecast-geometry projection and the authoritative joint archive utility.
632
+ Arm definitions, source floors, pilot accounting, and current-outcome
633
+ exclusion remain inside reusable application policies.
634
+ """
635
+
636
+ if (
637
+ type(arm_specs) is not tuple
638
+ or not arm_specs
639
+ or any(type(value) is not ForecastGeometryArmSpec for value in arm_specs)
640
+ ):
641
+ raise TypeError("arm_specs must contain exact non-empty specs")
642
+ for value in arm_specs:
643
+ value.__post_init__()
644
+ branch_ids = tuple(value.branch_id for value in arm_specs)
645
+ if (
646
+ branch_ids != tuple(sorted(set(branch_ids)))
647
+ or "forecast_neutral" in branch_ids
648
+ ):
649
+ raise ValueError(
650
+ "arm_specs must be canonical, unique, and reserve forecast_neutral"
651
+ )
652
+ if (
653
+ type(forecast_neutral_prior_mean) is not float
654
+ or not 0.0 <= forecast_neutral_prior_mean <= 1.0
655
+ ):
656
+ raise ValueError("forecast_neutral_prior_mean must lie in [0, 1]")
657
+ if (source_group_projection is None) != (
658
+ not minimum_source_exposures
659
+ ):
660
+ raise ValueError(
661
+ "source-group projection and minimum exposures must co-occur"
662
+ )
663
+
664
+ forecast_neutral = compose_semantic_coverage_residual_portfolio(
665
+ projection=projection,
666
+ semantic_projection=semantic_projection,
667
+ primary_positive_model=primary_positive_model,
668
+ primary_magnitude_model=primary_magnitude_model,
669
+ primary_source_fit_sha256=primary_source_fit_sha256,
670
+ transport_positive_model=transport_positive_model,
671
+ transport_magnitude_model=transport_magnitude_model,
672
+ transport_source_fit_sha256=transport_source_fit_sha256,
673
+ broker=broker,
674
+ lineage_capacity_fraction=lineage_capacity_fraction,
675
+ coverage_strength=coverage_strength,
676
+ allow_recursive_score_lane_spillover=True,
677
+ hard_feasibility=hard_feasibility,
678
+ feature_group_authorities=(
679
+ FORECAST_NEUTRAL_FEATURE_GROUP_AUTHORITIES
680
+ ),
681
+ )
682
+ forecast_arms = tuple(
683
+ (
684
+ spec.branch_id,
685
+ ForecastGeometryPortfolioPolicy(
686
+ prior_candidates=prior_candidates,
687
+ projection=forecast_geometry_projection,
688
+ archive_utility=archive_utility,
689
+ mode=spec.mode,
690
+ scenario_id=spec.scenario_id,
691
+ adverse_scenario_id=spec.adverse_scenario_id,
692
+ risk_aversion=spec.risk_aversion,
693
+ max_exact_reliability_members=(
694
+ max_exact_reliability_members
695
+ ),
696
+ hard_feasibility=hard_feasibility,
697
+ ),
698
+ )
699
+ for spec in arm_specs
700
+ )
701
+
702
+ def with_source_floor(
703
+ policy: MaterializedActionAllocationPolicyPort,
704
+ ) -> MaterializedActionAllocationPolicyPort:
705
+ if source_group_projection is None:
706
+ return policy
707
+ return MinimumSourceExposureAllocationPolicy(
708
+ base_policy=policy,
709
+ priority_scorer=forecast_neutral.primary,
710
+ source_projection=source_group_projection,
711
+ minimum_exposures=minimum_source_exposures,
712
+ )
713
+
714
+ prior_by_branch = {
715
+ value.branch_id: value.prior_mean for value in arm_specs
716
+ }
717
+ bindings = [
718
+ PortfolioRacePolicyBinding(
719
+ branch_id="forecast_neutral",
720
+ policy=with_source_floor(forecast_neutral.allocation),
721
+ prior_mean=forecast_neutral_prior_mean,
722
+ )
723
+ ]
724
+ bindings.extend(
725
+ PortfolioRacePolicyBinding(
726
+ branch_id=branch_id,
727
+ policy=with_source_floor(policy),
728
+ prior_mean=prior_by_branch[branch_id],
729
+ )
730
+ for branch_id, policy in forecast_arms
731
+ )
732
+ planner = PrecommittedPortfolioRacePlanner(
733
+ branch_bindings=tuple(
734
+ sorted(bindings, key=lambda value: value.branch_id)
735
+ ),
736
+ pilot_policy=None,
737
+ pilot_slots=pilot_slots,
738
+ disagreement_policy=disagreement_policy,
739
+ prior_projection=prior_projection,
740
+ )
741
+ return ForecastGeometryRacingResidualPortfolio(
742
+ forecast_neutral=forecast_neutral,
743
+ forecast_arms=forecast_arms,
744
+ planner=planner,
745
+ pilot_outcome_projector=(
746
+ CandidateArchiveMarginalPilotOutcomeProjector(
747
+ prior_candidates=prior_candidates,
748
+ utility=archive_utility,
749
+ )
750
+ ),
751
+ )
752
+
753
+
754
+ __all__ = [
755
+ "DEFAULT_FORECAST_GEOMETRY_ARM_SPECS",
756
+ "DEFAULT_COVERAGE_STRENGTH",
757
+ "DEFAULT_LINEAGE_CAPACITY_FRACTION",
758
+ "FORECAST_NEUTRAL_FEATURE_GROUP_AUTHORITIES",
759
+ "ForecastGeometryArmSpec",
760
+ "ForecastGeometryRacingResidualPortfolio",
761
+ "PRIMARY_SCORER_ID",
762
+ "TRANSPORT_SCORER_ID",
763
+ "RacingSemanticCoverageResidualPortfolio",
764
+ "SemanticCoverageResidualPortfolio",
765
+ "SequentialSemanticCoverageResidualPortfolio",
766
+ "compose_forecast_geometry_racing_residual_portfolio",
767
+ "compose_racing_semantic_coverage_residual_portfolio",
768
+ "compose_semantic_coverage_residual_portfolio",
769
+ "compose_sequential_semantic_coverage_residual_portfolio",
770
+ ]