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,802 @@
1
+ """Protected numerical-acquisition expert for the campaign variation envelope.
2
+
3
+ The service is workload-neutral. A finite acquisition-space adapter owns legal
4
+ configuration enumeration and normalized feature encoding; a numerical policy
5
+ owns ask selection; a phenotype policy owns evaluator-equivalence identity.
6
+ The service joins those ports to strictly prior real outcomes and adds the
7
+ selected full configurations to the ordinary finite-option universe.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import math
15
+ import re
16
+ from dataclasses import dataclass, field
17
+
18
+ from agent_evolve.application.campaign_variation_envelope import (
19
+ CampaignVariationEnvelopeLaneResult,
20
+ CampaignVariationEnvelopeRequest,
21
+ CampaignVariationEnvelopeResult,
22
+ )
23
+ from agent_evolve.application.evolution_campaign import ParentVariationBinding
24
+ from agent_evolve.application.finite_variation_eligibility import (
25
+ OptionPhenotypeBinding,
26
+ eligible_finite_variation_view,
27
+ )
28
+ from agent_evolve.domain.finite_variation import (
29
+ MAX_FINITE_VARIATION_OPTIONS,
30
+ FiniteVariationContract,
31
+ FiniteVariationOption,
32
+ )
33
+ from agent_evolve.domain.typed_json import (
34
+ FrozenJsonObject,
35
+ freeze_json,
36
+ thaw_json,
37
+ typed_json_sha256,
38
+ )
39
+ from agent_evolve.policies.selection.phenotype_recourse import (
40
+ PhenotypeIdentity,
41
+ PhenotypeIdentityPolicy,
42
+ )
43
+ from agent_evolve.policies.selection.acquisition_certified_slate import (
44
+ AcquisitionCertifiedSlateContext,
45
+ AcquisitionCertifiedSlateContextSink,
46
+ )
47
+ from agent_evolve.ports.finite_acquisition import (
48
+ FiniteAcquisitionCandidate,
49
+ FiniteAcquisitionObjective,
50
+ FiniteAcquisitionObservation,
51
+ FiniteAcquisitionPolicy,
52
+ FiniteAcquisitionRequest,
53
+ )
54
+ from agent_evolve.ports.finite_acquisition_space import (
55
+ FiniteAcquisitionSpace,
56
+ FiniteAcquisitionSpaceRequest,
57
+ validate_finite_acquisition_space_candidates,
58
+ validate_finite_acquisition_space_identity,
59
+ )
60
+ from agent_evolve.ports.hard_feasibility import (
61
+ HardFeasibilityPort,
62
+ HardFeasibilityRequest,
63
+ HardFeasibilityVerdict,
64
+ assess_hard_feasibility,
65
+ hard_feasibility_decision_batch_sha256,
66
+ validate_hard_feasibility_port,
67
+ )
68
+ from agent_evolve.ports.variation_source import (
69
+ VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY,
70
+ VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
71
+ VARIATION_OPERATOR_METADATA_KEY,
72
+ VARIATION_SOURCE_METADATA_KEY,
73
+ VARIATION_SOURCE_MINIMUM_METADATA_KEY,
74
+ VARIATION_SOURCE_RANK_METADATA_KEY,
75
+ finite_variation_source_id,
76
+ finite_variation_source_ids,
77
+ )
78
+
79
+
80
+ POLICY_ID = "protected_finite_acquisition_envelope"
81
+ POLICY_VERSION = 5
82
+ PROTECTED_ACQUISITION_SOURCE_ID = "numerical_acquisition"
83
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,127}$")
84
+ _DEFINITION_DOMAIN = b"agent-evolve:protected-finite-acquisition-envelope:def:v5\x00"
85
+ _CATALOG_DOMAIN = b"agent-evolve:protected-finite-acquisition-envelope:catalog:v5\x00"
86
+
87
+
88
+ def _canonical_json(value: object) -> bytes:
89
+ return json.dumps(
90
+ value,
91
+ allow_nan=False,
92
+ ensure_ascii=True,
93
+ separators=(",", ":"),
94
+ sort_keys=True,
95
+ ).encode("ascii", errors="strict")
96
+
97
+
98
+ def _policy_identity(policy: FiniteAcquisitionPolicy) -> tuple[str, int, str]:
99
+ if not isinstance(policy, FiniteAcquisitionPolicy):
100
+ raise TypeError("acquisition must implement FiniteAcquisitionPolicy")
101
+ values = (
102
+ getattr(policy, "policy_id", None),
103
+ getattr(policy, "policy_version", None),
104
+ getattr(policy, "definition_sha256", None),
105
+ )
106
+ if type(values[0]) is not str or _TOKEN.fullmatch(values[0]) is None:
107
+ raise ValueError("acquisition policy_id has invalid syntax")
108
+ if type(values[1]) is not int or values[1] <= 0:
109
+ raise ValueError("acquisition policy_version must be positive")
110
+ if (
111
+ type(values[2]) is not str
112
+ or len(values[2]) != 64
113
+ or any(value not in "0123456789abcdef" for value in values[2])
114
+ ):
115
+ raise ValueError("acquisition definition must be a lowercase SHA-256")
116
+ return values # type: ignore[return-value]
117
+
118
+
119
+ def _phenotype(
120
+ policy: PhenotypeIdentityPolicy,
121
+ configuration: FrozenJsonObject,
122
+ ) -> str:
123
+ identity = policy.identify(thaw_json(configuration))
124
+ if type(identity) is not PhenotypeIdentity:
125
+ raise TypeError("phenotype policy must return exact PhenotypeIdentity")
126
+ PhenotypeIdentity.__post_init__(identity)
127
+ if (
128
+ identity.policy_id != policy.policy_id
129
+ or identity.policy_version != policy.policy_version
130
+ ):
131
+ raise ValueError("phenotype policy returned a foreign identity")
132
+ return identity.value_sha256
133
+
134
+
135
+ @dataclass(frozen=True, slots=True)
136
+ class ProtectedFiniteAcquisitionVariationEnvelope:
137
+ """Add one globally selected, evaluator-protected acquisition batch."""
138
+
139
+ objectives: tuple[FiniteAcquisitionObjective, ...]
140
+ space: FiniteAcquisitionSpace
141
+ acquisition: FiniteAcquisitionPolicy
142
+ phenotype_identity: PhenotypeIdentityPolicy
143
+ hard_feasibility: HardFeasibilityPort | None = None
144
+ acquisition_certification_context_sink: (
145
+ AcquisitionCertifiedSlateContextSink | None
146
+ ) = None
147
+ pool_size: int = 8192
148
+ protected_batch_size: int = 4
149
+ source_minimum_per_lane: int = 1
150
+ maximum_phenotype_recourse_rounds: int = 3
151
+ seed: int = 0
152
+ source_id: str = PROTECTED_ACQUISITION_SOURCE_ID
153
+ option_family: str = "acquisition"
154
+ operator_id: str = "global"
155
+ policy_id: str = field(init=False, default=POLICY_ID)
156
+ policy_version: int = field(init=False, default=POLICY_VERSION)
157
+ definition_sha256: str = field(init=False, default="")
158
+ _catalog_definition_sha256: str = field(init=False, repr=False, default="")
159
+
160
+ def __post_init__(self) -> None:
161
+ if type(self.objectives) is not tuple or len(self.objectives) < 2:
162
+ raise ValueError("objectives must contain at least two exact axes")
163
+ for value in self.objectives:
164
+ if type(value) is not FiniteAcquisitionObjective:
165
+ raise TypeError("objectives must contain exact acquisition axes")
166
+ FiniteAcquisitionObjective.__post_init__(value)
167
+ metric_ids = tuple(value.metric_id for value in self.objectives)
168
+ if metric_ids != tuple(sorted(set(metric_ids))):
169
+ raise ValueError("objectives must be unique and metric-sorted")
170
+ space_identity = validate_finite_acquisition_space_identity(self.space)
171
+ acquisition_identity = _policy_identity(self.acquisition)
172
+ hard_feasibility_identity = (
173
+ None
174
+ if self.hard_feasibility is None
175
+ else validate_hard_feasibility_port(self.hard_feasibility)
176
+ )
177
+ if self.acquisition_certification_context_sink is not None and not isinstance(
178
+ self.acquisition_certification_context_sink,
179
+ AcquisitionCertifiedSlateContextSink,
180
+ ):
181
+ raise TypeError(
182
+ "acquisition_certification_context_sink must implement its port"
183
+ )
184
+ if not callable(getattr(self.phenotype_identity, "identify", None)):
185
+ raise TypeError("phenotype_identity must implement its policy port")
186
+ if (
187
+ type(self.phenotype_identity.policy_id) is not str
188
+ or _TOKEN.fullmatch(self.phenotype_identity.policy_id) is None
189
+ or type(self.phenotype_identity.policy_version) is not int
190
+ or self.phenotype_identity.policy_version <= 0
191
+ ):
192
+ raise ValueError("phenotype identity policy has invalid identity")
193
+ if type(self.pool_size) is not int or self.pool_size < 16:
194
+ raise ValueError("pool_size must be an exact integer of at least 16")
195
+ if (
196
+ type(self.protected_batch_size) is not int
197
+ or self.protected_batch_size < 1
198
+ ):
199
+ raise ValueError("protected_batch_size must be positive")
200
+ if self.protected_batch_size > self.pool_size:
201
+ raise ValueError("protected batch cannot exceed the pool")
202
+ if (
203
+ type(self.source_minimum_per_lane) is not int
204
+ or not 1 <= self.source_minimum_per_lane < 8
205
+ ):
206
+ raise ValueError("source_minimum_per_lane must lie in [1, 8)")
207
+ if (
208
+ type(self.maximum_phenotype_recourse_rounds) is not int
209
+ or self.maximum_phenotype_recourse_rounds < 1
210
+ ):
211
+ raise ValueError("maximum phenotype recourse rounds must be positive")
212
+ if type(self.seed) is not int or self.seed < 0:
213
+ raise ValueError("seed must be a non-negative exact integer")
214
+ for name in ("source_id", "option_family", "operator_id"):
215
+ value = getattr(self, name)
216
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
217
+ raise ValueError(f"{name} must use the closed token grammar")
218
+ definition = {
219
+ "schema_version": 1,
220
+ "policy_id": POLICY_ID,
221
+ "policy_version": POLICY_VERSION,
222
+ "objectives": [value.to_record() for value in self.objectives],
223
+ "space": {
224
+ "space_id": space_identity[0],
225
+ "space_version": space_identity[1],
226
+ "definition_sha256": space_identity[2],
227
+ },
228
+ "acquisition": {
229
+ "policy_id": acquisition_identity[0],
230
+ "policy_version": acquisition_identity[1],
231
+ "definition_sha256": acquisition_identity[2],
232
+ },
233
+ "hard_feasibility": (
234
+ None
235
+ if hard_feasibility_identity is None
236
+ else {
237
+ "policy_id": hard_feasibility_identity[0],
238
+ "policy_version": hard_feasibility_identity[1],
239
+ "definition_sha256": hard_feasibility_identity[2],
240
+ "rejection_authority": "exact_infeasibility_only",
241
+ "unknown_disposition": "retain",
242
+ }
243
+ ),
244
+ "acquisition_certification_context_sink": (
245
+ None
246
+ if self.acquisition_certification_context_sink is None
247
+ else {
248
+ "provider_id": (
249
+ self.acquisition_certification_context_sink.provider_id
250
+ ),
251
+ "provider_version": (
252
+ self.acquisition_certification_context_sink.provider_version
253
+ ),
254
+ "definition_sha256": (
255
+ self.acquisition_certification_context_sink.definition_sha256
256
+ ),
257
+ }
258
+ ),
259
+ "phenotype_identity": {
260
+ "policy_id": self.phenotype_identity.policy_id,
261
+ "policy_version": self.phenotype_identity.policy_version,
262
+ },
263
+ "pool_size": self.pool_size,
264
+ "protected_batch_size": self.protected_batch_size,
265
+ "source_minimum_per_lane": self.source_minimum_per_lane,
266
+ "maximum_phenotype_recourse_rounds": (
267
+ self.maximum_phenotype_recourse_rounds
268
+ ),
269
+ "seed": self.seed,
270
+ "source_id": self.source_id,
271
+ "option_family": self.option_family,
272
+ "operator_id": self.operator_id,
273
+ "archive_outcomes": "strictly_prior_real_valid_unique_configurations",
274
+ "partition": "accepted_acquisition_rank_round_robin_over_sorted_lanes",
275
+ "protected_source_witness": (
276
+ "smallest_authenticated_source_ranks_within_each_lane"
277
+ ),
278
+ "phenotype_recourse": (
279
+ "select_then-exact-check-selected-only-bounded-refill"
280
+ ),
281
+ "base_support": "preserved",
282
+ "current_future_outcomes": False,
283
+ "workload_model_provider_branches": False,
284
+ }
285
+ definition_sha256 = hashlib.sha256(
286
+ _DEFINITION_DOMAIN + _canonical_json(definition)
287
+ ).hexdigest()
288
+ object.__setattr__(self, "definition_sha256", definition_sha256)
289
+ object.__setattr__(
290
+ self,
291
+ "_catalog_definition_sha256",
292
+ hashlib.sha256(
293
+ _CATALOG_DOMAIN + bytes.fromhex(definition_sha256)
294
+ ).hexdigest(),
295
+ )
296
+
297
+ def _observations(
298
+ self,
299
+ request: CampaignVariationEnvelopeRequest,
300
+ ) -> tuple[FiniteAcquisitionObservation, ...]:
301
+ expected_metrics = tuple(value.metric_id for value in self.objectives)
302
+ by_configuration: dict[str, FiniteAcquisitionObservation] = {}
303
+ for candidate in request.state.candidates:
304
+ if not candidate.valid:
305
+ continue
306
+ raw = dict(candidate.objectives)
307
+ if tuple(sorted(raw)) != expected_metrics:
308
+ raise ValueError("archive objective axes differ from acquisition axes")
309
+ configuration = candidate.configuration
310
+ if type(configuration) is not FrozenJsonObject:
311
+ raise TypeError("acquisition requires object-root configurations")
312
+ configuration_sha256 = typed_json_sha256(configuration)
313
+ features = self.space.features(configuration)
314
+ observation = FiniteAcquisitionObservation(
315
+ candidate_id=f"obs-{configuration_sha256[:32]}",
316
+ configuration_sha256=configuration_sha256,
317
+ features=features,
318
+ objectives=tuple(
319
+ (metric_id, float(raw[metric_id]))
320
+ for metric_id in expected_metrics
321
+ ),
322
+ )
323
+ previous = by_configuration.setdefault(configuration_sha256, observation)
324
+ if previous != observation:
325
+ raise ValueError("one configuration has conflicting real observations")
326
+ observations = tuple(
327
+ by_configuration[key] for key in sorted(by_configuration)
328
+ )
329
+ if not observations:
330
+ raise ValueError("acquisition envelope requires prior valid observations")
331
+ return observations
332
+
333
+ def enrich(
334
+ self,
335
+ request: CampaignVariationEnvelopeRequest,
336
+ ) -> CampaignVariationEnvelopeResult:
337
+ self.__post_init__()
338
+ if type(request) is not CampaignVariationEnvelopeRequest:
339
+ raise TypeError("request must be an exact envelope request")
340
+ CampaignVariationEnvelopeRequest.__post_init__(request)
341
+ if self.protected_batch_size < (
342
+ self.source_minimum_per_lane * len(request.lanes)
343
+ ):
344
+ raise ValueError(
345
+ "protected batch must cover every active parent lane source floor"
346
+ )
347
+
348
+ observations = self._observations(request)
349
+ observed_configuration_by_sha256 = {
350
+ typed_json_sha256(value.configuration): value.configuration
351
+ for value in request.state.candidates
352
+ if value.valid and type(value.configuration) is FrozenJsonObject
353
+ }
354
+ excluded_configurations = {
355
+ value.configuration_sha256 for value in observations
356
+ }
357
+ excluded_phenotypes = set(
358
+ request.lanes[0].base_variation.known_phenotype_sha256s
359
+ )
360
+ base_phenotype_by_option_identity: dict[str, str] = {}
361
+ for lane in request.lanes:
362
+ receipt = lane.base_variation.eligibility_receipt
363
+ receipt_by_identity = (
364
+ {}
365
+ if receipt is None
366
+ else {
367
+ value.option_identity_sha256: value.phenotype_identity_sha256
368
+ for value in receipt.option_phenotypes
369
+ }
370
+ )
371
+ for option in lane.base_variation.contract.options:
372
+ excluded_configurations.add(option.child_configuration_sha256)
373
+ phenotype_sha256 = receipt_by_identity.get(option.identity_sha256)
374
+ if phenotype_sha256 is None:
375
+ phenotype_sha256 = _phenotype(
376
+ self.phenotype_identity,
377
+ option.child_configuration,
378
+ )
379
+ base_phenotype_by_option_identity[option.identity_sha256] = (
380
+ phenotype_sha256
381
+ )
382
+ excluded_phenotypes.add(phenotype_sha256)
383
+ space_request = FiniteAcquisitionSpaceRequest(
384
+ campaign_scope_sha256=request.campaign_scope_sha256,
385
+ cutoff_index=request.state.unique_evaluations,
386
+ pool_size=self.pool_size,
387
+ seed=self.seed + request.generation,
388
+ observed_configurations=tuple(
389
+ observed_configuration_by_sha256[key]
390
+ for key in sorted(observed_configuration_by_sha256)
391
+ ),
392
+ excluded_configuration_sha256s=tuple(sorted(excluded_configurations)),
393
+ )
394
+ materializations = self.space.candidates(space_request)
395
+ validate_finite_acquisition_space_candidates(
396
+ request=space_request,
397
+ candidates=materializations,
398
+ )
399
+
400
+ configurations: dict[str, FrozenJsonObject] = {}
401
+ candidates: list[FiniteAcquisitionCandidate] = []
402
+ seen_features: set[tuple[float, ...]] = set()
403
+ hard_feasibility_decision_sha256s: list[str] = []
404
+ hard_feasibility_infeasible_sha256s: list[str] = []
405
+ hard_feasibility_rejection_witnesses: list[dict[str, object]] = []
406
+ hard_feasibility_verdict_counts = {
407
+ HardFeasibilityVerdict.FEASIBLE.value: 0,
408
+ HardFeasibilityVerdict.INFEASIBLE.value: 0,
409
+ HardFeasibilityVerdict.UNKNOWN.value: 0,
410
+ }
411
+ for configuration in materializations:
412
+ configuration_sha256 = typed_json_sha256(configuration)
413
+ if self.hard_feasibility is not None:
414
+ feasibility_request = HardFeasibilityRequest(
415
+ campaign_scope_sha256=request.campaign_scope_sha256,
416
+ cutoff_index=request.state.unique_evaluations,
417
+ configuration=configuration,
418
+ )
419
+ feasibility = assess_hard_feasibility(
420
+ self.hard_feasibility,
421
+ feasibility_request,
422
+ )
423
+ hard_feasibility_decision_sha256s.append(
424
+ feasibility.decision_sha256
425
+ )
426
+ hard_feasibility_verdict_counts[feasibility.verdict.value] += 1
427
+ if feasibility.verdict is HardFeasibilityVerdict.INFEASIBLE:
428
+ hard_feasibility_infeasible_sha256s.append(
429
+ feasibility.decision_sha256
430
+ )
431
+ if len(hard_feasibility_rejection_witnesses) < 8:
432
+ hard_feasibility_rejection_witnesses.append(
433
+ {
434
+ "configuration_sha256": configuration_sha256,
435
+ "decision": feasibility.to_record(),
436
+ }
437
+ )
438
+ continue
439
+ features = self.space.features(configuration)
440
+ if features in seen_features:
441
+ continue
442
+ # Constructing the port value performs finite/[0,1] validation.
443
+ candidate = FiniteAcquisitionCandidate(
444
+ candidate_id=f"acq-{configuration_sha256[:32]}",
445
+ configuration_sha256=configuration_sha256,
446
+ features=features,
447
+ )
448
+ configurations[configuration_sha256] = configuration
449
+ candidates.append(candidate)
450
+ seen_features.add(features)
451
+ # Evaluator-equivalent configurations and duplicate feature rows are
452
+ # intentionally removed after the outcome-blind workload reservoir is
453
+ # materialized. The configured pool size is therefore an upper-bound
454
+ # on usable support, not a promise that phenotype filtering can keep
455
+ # every row. Only exact protected-batch coverage is semantically
456
+ # required by the downstream acquisition boundary.
457
+ if len(candidates) < self.protected_batch_size:
458
+ raise ValueError("acquisition reservoir lost protected-batch support")
459
+
460
+ remaining = tuple(candidates)
461
+ accepted: list[tuple[object, FrozenJsonObject, str]] = []
462
+ accepted_phenotypes = set(excluded_phenotypes)
463
+ acquisition_requests: list[FiniteAcquisitionRequest] = []
464
+ acquisition_decisions = []
465
+ phenotype_rejections: list[dict[str, object]] = []
466
+ for recourse_round in range(self.maximum_phenotype_recourse_rounds):
467
+ needed = self.protected_batch_size - len(accepted)
468
+ if needed <= 0:
469
+ break
470
+ if len(remaining) < needed:
471
+ break
472
+ acquisition_request = FiniteAcquisitionRequest(
473
+ campaign_scope_sha256=request.campaign_scope_sha256,
474
+ cutoff_index=request.state.unique_evaluations,
475
+ batch_size=needed,
476
+ seed=self.seed + request.generation + recourse_round * 1_000_003,
477
+ objectives=self.objectives,
478
+ observations=observations,
479
+ candidates=remaining,
480
+ )
481
+ decision = self.acquisition.select(acquisition_request)
482
+ if decision.request_sha256 != acquisition_request.request_sha256:
483
+ raise ValueError("acquisition decision targets another request")
484
+ if (
485
+ decision.policy_id,
486
+ decision.policy_version,
487
+ decision.policy_definition_sha256,
488
+ ) != _policy_identity(self.acquisition):
489
+ raise ValueError("acquisition decision has a foreign policy identity")
490
+ if len(decision.selected) != needed:
491
+ raise ValueError("acquisition policy returned the wrong batch size")
492
+ candidate_by_id = {value.candidate_id: value for value in remaining}
493
+ selected_ids: set[str] = set()
494
+ for value in decision.selected:
495
+ candidate = candidate_by_id.get(value.candidate_id)
496
+ if (
497
+ candidate is None
498
+ or candidate.configuration_sha256
499
+ != value.configuration_sha256
500
+ ):
501
+ raise ValueError(
502
+ "acquisition selected outside the sealed reservoir"
503
+ )
504
+ selected_ids.add(value.candidate_id)
505
+ configuration = configurations[value.configuration_sha256]
506
+ phenotype_sha256 = _phenotype(
507
+ self.phenotype_identity,
508
+ configuration,
509
+ )
510
+ if phenotype_sha256 in accepted_phenotypes:
511
+ phenotype_rejections.append(
512
+ {
513
+ "recourse_round": recourse_round,
514
+ "candidate_id": value.candidate_id,
515
+ "configuration_sha256": value.configuration_sha256,
516
+ "phenotype_sha256": phenotype_sha256,
517
+ }
518
+ )
519
+ continue
520
+ accepted_phenotypes.add(phenotype_sha256)
521
+ accepted.append((value, configuration, phenotype_sha256))
522
+ acquisition_requests.append(acquisition_request)
523
+ acquisition_decisions.append(decision)
524
+ remaining = tuple(
525
+ value for value in remaining if value.candidate_id not in selected_ids
526
+ )
527
+ if len(accepted) != self.protected_batch_size:
528
+ raise ValueError("phenotype recourse underfilled the protected batch")
529
+ selected = tuple(
530
+ (rank, value, configuration, phenotype_sha256)
531
+ for rank, (value, configuration, phenotype_sha256) in enumerate(
532
+ accepted,
533
+ start=1,
534
+ )
535
+ )
536
+
537
+ assignments: dict[str, list[tuple[int, object, FrozenJsonObject]]] = {
538
+ value.lane_id: [] for value in request.lanes
539
+ }
540
+ lane_ids = tuple(sorted(assignments))
541
+ for ordinal, row in enumerate(selected):
542
+ assignments[lane_ids[ordinal % len(lane_ids)]].append(row)
543
+
544
+ result_lanes: list[CampaignVariationEnvelopeLaneResult] = []
545
+ partition_evidence: list[dict[str, object]] = []
546
+ certification_contexts: list[AcquisitionCertifiedSlateContext] = []
547
+ for lane in request.lanes:
548
+ assigned = assignments[lane.lane_id]
549
+ if not assigned:
550
+ raise ValueError("protected acquisition left a lane uncovered")
551
+ parent_sha256 = lane.base_variation.parent_configuration_sha256
552
+ acquisition_options: list[FiniteVariationOption] = []
553
+ selected_phenotypes_by_option_id: dict[str, str] = {}
554
+ for rank, selection, configuration, phenotype_sha256 in assigned:
555
+ if not math.isfinite(selection.acquisition_value):
556
+ raise ValueError("acquisition value must remain finite")
557
+ option = FiniteVariationOption(
558
+ option_id=(
559
+ f"acquisition.g{request.generation:02d}."
560
+ f"r{rank:03d}.{selection.configuration_sha256[:16]}"
561
+ ),
562
+ parent_configuration_sha256=parent_sha256,
563
+ child_configuration=configuration,
564
+ family=self.option_family,
565
+ description=(
566
+ "Protected numerical acquisition candidate "
567
+ f"rank {rank:03d} from strictly prior real outcomes."
568
+ ),
569
+ metadata=tuple(
570
+ sorted(
571
+ (
572
+ ("acquisition_policy_id", decision.policy_id),
573
+ ("acquisition_rank", f"{rank:03d}"),
574
+ (
575
+ "acquisition_value_hex",
576
+ selection.acquisition_value.hex(),
577
+ ),
578
+ (
579
+ VARIATION_SOURCE_RANK_METADATA_KEY,
580
+ str(rank),
581
+ ),
582
+ (
583
+ VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
584
+ f"acquisition.rank{rank:03d}",
585
+ ),
586
+ (VARIATION_OPERATOR_METADATA_KEY, self.operator_id),
587
+ (VARIATION_SOURCE_METADATA_KEY, self.source_id),
588
+ *(
589
+ (
590
+ (
591
+ VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY,
592
+ "required",
593
+ ),
594
+ )
595
+ if self.acquisition_certification_context_sink
596
+ is not None
597
+ else ()
598
+ ),
599
+ (
600
+ VARIATION_SOURCE_MINIMUM_METADATA_KEY,
601
+ str(self.source_minimum_per_lane),
602
+ ),
603
+ )
604
+ )
605
+ ),
606
+ )
607
+ acquisition_options.append(option)
608
+ selected_phenotypes_by_option_id[option.option_id] = phenotype_sha256
609
+ combined_options = (
610
+ *lane.base_variation.contract.options,
611
+ *acquisition_options,
612
+ )
613
+ if len(combined_options) > MAX_FINITE_VARIATION_OPTIONS:
614
+ raise ValueError("acquisition envelope exceeds the finite-option bound")
615
+ combined = FiniteVariationContract(
616
+ catalog_id="finite_acquisition_expert_union",
617
+ catalog_version=POLICY_VERSION,
618
+ catalog_definition_sha256=self._catalog_definition_sha256,
619
+ parent_configuration=lane.base_variation.contract.parent_configuration,
620
+ options=tuple(combined_options),
621
+ )
622
+ phenotype_bindings = tuple(
623
+ OptionPhenotypeBinding(
624
+ option_id=option.option_id,
625
+ option_identity_sha256=option.identity_sha256,
626
+ phenotype_identity_sha256=(
627
+ selected_phenotypes_by_option_id[option.option_id]
628
+ if option.option_id in selected_phenotypes_by_option_id
629
+ else base_phenotype_by_option_identity[
630
+ option.identity_sha256
631
+ ]
632
+ ),
633
+ )
634
+ for option in combined.options
635
+ )
636
+ eligible = eligible_finite_variation_view(
637
+ contract=combined,
638
+ option_phenotypes=phenotype_bindings,
639
+ known_phenotype_sha256s=(
640
+ lane.base_variation.known_phenotype_sha256s
641
+ ),
642
+ )
643
+ if self.source_id not in finite_variation_source_ids(eligible.contract):
644
+ raise ValueError("protected acquisition source vanished at eligibility")
645
+ enriched = ParentVariationBinding(
646
+ benchmark_sha256=lane.base_variation.benchmark_sha256,
647
+ parent_configuration_sha256=parent_sha256,
648
+ known_phenotype_sha256s=(
649
+ lane.base_variation.known_phenotype_sha256s
650
+ ),
651
+ contract=eligible.contract,
652
+ eligibility_receipt=eligible.receipt,
653
+ )
654
+ reference_option_ids = tuple(
655
+ sorted(
656
+ option.option_id
657
+ for option in eligible.contract.options
658
+ if finite_variation_source_id(option) == self.source_id
659
+ )
660
+ )
661
+ if not reference_option_ids:
662
+ raise ValueError("certification reference lost every acquisition option")
663
+ context = AcquisitionCertifiedSlateContext(
664
+ campaign_scope_sha256=request.campaign_scope_sha256,
665
+ finite_contract_sha256=eligible.contract.identity_sha256,
666
+ cutoff_index=request.state.unique_evaluations,
667
+ seed=int.from_bytes(
668
+ hashlib.sha256(
669
+ (
670
+ f"{self.seed}:{request.generation}:{lane.lane_id}"
671
+ ).encode("ascii", errors="strict")
672
+ ).digest()[:4],
673
+ byteorder="big",
674
+ signed=False,
675
+ ),
676
+ objectives=self.objectives,
677
+ observations=observations,
678
+ candidates=tuple(
679
+ FiniteAcquisitionCandidate(
680
+ candidate_id=option.option_id,
681
+ configuration_sha256=option.child_configuration_sha256,
682
+ features=self.space.features(option.child_configuration),
683
+ )
684
+ for option in eligible.contract.options
685
+ ),
686
+ reference_option_ids=reference_option_ids,
687
+ )
688
+ certification_contexts.append(context)
689
+ result_lanes.append(
690
+ CampaignVariationEnvelopeLaneResult(
691
+ lane_id=lane.lane_id,
692
+ variation=enriched,
693
+ )
694
+ )
695
+ partition_evidence.append(
696
+ {
697
+ "lane_id": lane.lane_id,
698
+ "base_option_count": len(
699
+ lane.base_variation.contract.options
700
+ ),
701
+ "acquisition_ranks": [rank for rank, _, _, _ in assigned],
702
+ "eligible_option_count": len(eligible.contract.options),
703
+ "acquisition_certification_context_sha256": (
704
+ context.context_sha256
705
+ ),
706
+ "acquisition_certification_reference_count": (
707
+ len(context.reference_option_ids)
708
+ ),
709
+ }
710
+ )
711
+
712
+ if self.acquisition_certification_context_sink is not None:
713
+ self.acquisition_certification_context_sink.register_many(
714
+ tuple(certification_contexts)
715
+ )
716
+
717
+ evidence = freeze_json(
718
+ {
719
+ "schema_version": 1,
720
+ "space_request_sha256": space_request.request_sha256,
721
+ "acquisition_request_sha256": (
722
+ acquisition_requests[0].request_sha256
723
+ ),
724
+ "acquisition_decision": acquisition_decisions[0].to_record(),
725
+ "acquisition_recourse_requests": [
726
+ {
727
+ "request_sha256": value.request_sha256,
728
+ "batch_size": value.batch_size,
729
+ "seed": value.seed,
730
+ "observation_count": len(value.observations),
731
+ "candidate_pool_size": len(value.candidates),
732
+ }
733
+ for value in acquisition_requests
734
+ ],
735
+ "acquisition_recourse_decisions": [
736
+ value.to_record() for value in acquisition_decisions
737
+ ],
738
+ "phenotype_rejections": phenotype_rejections,
739
+ "phenotype_checks_performed": (
740
+ len(accepted) + len(phenotype_rejections)
741
+ ),
742
+ "hard_feasibility": {
743
+ "enabled": self.hard_feasibility is not None,
744
+ "verdict_counts": hard_feasibility_verdict_counts,
745
+ "decision_count": len(hard_feasibility_decision_sha256s),
746
+ "decision_batch_sha256": (
747
+ hard_feasibility_decision_batch_sha256(
748
+ hard_feasibility_decision_sha256s
749
+ )
750
+ ),
751
+ "infeasible_decision_count": len(
752
+ hard_feasibility_infeasible_sha256s
753
+ ),
754
+ "infeasible_decision_batch_sha256": (
755
+ hard_feasibility_decision_batch_sha256(
756
+ hard_feasibility_infeasible_sha256s
757
+ )
758
+ ),
759
+ "rejection_witnesses": (
760
+ hard_feasibility_rejection_witnesses
761
+ ),
762
+ "rejection_witness_limit": 8,
763
+ "rejection_witness_sampling": (
764
+ "first_in_authenticated_space_order"
765
+ ),
766
+ "rejection_authority": "exact_infeasibility_only",
767
+ "unknown_disposition": "retain",
768
+ "outcome_access": False,
769
+ },
770
+ "partition": partition_evidence,
771
+ "acquisition_certification_context_sha256s": [
772
+ value.context_sha256 for value in certification_contexts
773
+ ],
774
+ "acquisition_certification_contexts_registered": (
775
+ self.acquisition_certification_context_sink is not None
776
+ ),
777
+ "protected_source_id": self.source_id,
778
+ "strictly_prior_observation_count": len(observations),
779
+ "raw_reservoir_size": len(materializations),
780
+ "reservoir_size": len(candidates),
781
+ "current_future_outcomes_consulted": False,
782
+ "workload_model_provider_branches": False,
783
+ }
784
+ )
785
+ if type(evidence) is not FrozenJsonObject: # pragma: no cover
786
+ raise AssertionError("acquisition envelope evidence is not an object")
787
+ return CampaignVariationEnvelopeResult(
788
+ request_sha256=request.request_sha256,
789
+ policy_id=self.policy_id,
790
+ policy_version=self.policy_version,
791
+ policy_definition_sha256=self.definition_sha256,
792
+ lanes=tuple(result_lanes),
793
+ evidence=evidence,
794
+ )
795
+
796
+
797
+ __all__ = [
798
+ "POLICY_ID",
799
+ "POLICY_VERSION",
800
+ "PROTECTED_ACQUISITION_SOURCE_ID",
801
+ "ProtectedFiniteAcquisitionVariationEnvelope",
802
+ ]