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,463 @@
1
+ """Outcome-blind identification audit for anchor–residual portfolios.
2
+
3
+ Campaign runtimes already authenticate every selector request and structured
4
+ decision. This module projects the regret-bounded allocation evidence from
5
+ those generic receipts, then assesses a workload- and model-independent
6
+ identification contract. It never reads candidate outcomes.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from dataclasses import dataclass
12
+ import json
13
+ import math
14
+
15
+ from agent_evolve.application.campaign_execution import (
16
+ CampaignSelectorAuditReceipt,
17
+ CampaignStageReceipt,
18
+ decode_selector_audit_text,
19
+ )
20
+ from agent_evolve.domain.patch import require_sha256
21
+ from agent_evolve.domain.typed_json import thaw_json
22
+
23
+
24
+ REGRET_BOUNDED_SELECTOR_AUDIT_KIND = (
25
+ "regret_bounded_information_portfolio_k8_to_k4"
26
+ )
27
+ STRICTLY_PRIOR_CERTIFICATE_SCOPE = (
28
+ "conditional_on_frozen_acquisition_calibration_not_sota"
29
+ )
30
+
31
+
32
+ def _exact_option_ids(value: object, name: str) -> tuple[str, ...]:
33
+ if type(value) is not list or not value:
34
+ raise TypeError(f"{name} must be a non-empty option-id array")
35
+ result = tuple(value)
36
+ if any(type(option_id) is not str or not option_id for option_id in result):
37
+ raise TypeError(f"{name} contains an invalid option identity")
38
+ if len(set(result)) != len(result):
39
+ raise ValueError(f"{name} contains duplicate option identities")
40
+ return result
41
+
42
+
43
+ def _hex_float(value: object, name: str) -> float:
44
+ if type(value) is not str:
45
+ raise TypeError(f"{name} must be an exact hexadecimal float")
46
+ try:
47
+ result = float.fromhex(value)
48
+ except ValueError as error:
49
+ raise ValueError(f"{name} is not a hexadecimal float") from error
50
+ if not math.isfinite(result):
51
+ raise ValueError(f"{name} must be finite")
52
+ return result
53
+
54
+
55
+ @dataclass(frozen=True, slots=True)
56
+ class AnchorResidualSelectionAudit:
57
+ """One authenticated pre-evaluation reference displacement decision."""
58
+
59
+ generation: int
60
+ parent_slot: int
61
+ selector_call_id: str
62
+ request_sha256: str
63
+ decision_sha256: str
64
+ policy_id: str
65
+ policy_version: int
66
+ policy_definition_sha256: str
67
+ certificate_scope: str
68
+ reference_option_ids: tuple[str, ...]
69
+ selected_option_ids: tuple[str, ...]
70
+ reported_retained_anchor_member_count: int
71
+ minimum_residual_audit_members: int
72
+ reported_selected_residual_member_count: int
73
+ acquisition_retention_ratio: float
74
+ minimum_acquisition_retention_ratio: float
75
+
76
+ def __post_init__(self) -> None:
77
+ if type(self.generation) is not int or self.generation <= 0:
78
+ raise ValueError("generation must be positive")
79
+ if type(self.parent_slot) is not int or self.parent_slot < 0:
80
+ raise ValueError("parent_slot must be non-negative")
81
+ if type(self.selector_call_id) is not str or not self.selector_call_id:
82
+ raise ValueError("selector_call_id must be non-empty")
83
+ require_sha256(self.request_sha256, "request_sha256")
84
+ require_sha256(self.decision_sha256, "decision_sha256")
85
+ if type(self.policy_id) is not str or not self.policy_id:
86
+ raise ValueError("policy_id must be non-empty")
87
+ if type(self.policy_version) is not int or self.policy_version <= 0:
88
+ raise ValueError("policy_version must be positive")
89
+ require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
90
+ if type(self.certificate_scope) is not str or not self.certificate_scope:
91
+ raise ValueError("certificate_scope must be non-empty")
92
+ for name in ("reference_option_ids", "selected_option_ids"):
93
+ values = getattr(self, name)
94
+ if type(values) is not tuple or not values:
95
+ raise TypeError(f"{name} must be a non-empty tuple")
96
+ if any(type(value) is not str or not value for value in values):
97
+ raise TypeError(f"{name} contains an invalid option identity")
98
+ if len(set(values)) != len(values):
99
+ raise ValueError(f"{name} contains duplicate option identities")
100
+ if len(self.reference_option_ids) != len(self.selected_option_ids):
101
+ raise ValueError("reference and selected slate widths differ")
102
+ for name in (
103
+ "reported_retained_anchor_member_count",
104
+ "minimum_residual_audit_members",
105
+ "reported_selected_residual_member_count",
106
+ ):
107
+ value = getattr(self, name)
108
+ if type(value) is not int or value < 0:
109
+ raise ValueError(f"{name} must be a non-negative integer")
110
+ retained = len(self.retained_anchor_option_ids)
111
+ residual = len(self.residual_option_ids)
112
+ if self.reported_retained_anchor_member_count != retained:
113
+ raise ValueError("reported retained-anchor count does not close")
114
+ if self.reported_selected_residual_member_count != residual:
115
+ raise ValueError("reported residual count does not close")
116
+ if retained + residual != len(self.selected_option_ids):
117
+ raise ValueError("anchor–residual decomposition does not close")
118
+ if len(self.displaced_anchor_option_ids) != residual:
119
+ raise ValueError("residual and displaced-anchor counts differ")
120
+ if self.minimum_residual_audit_members > residual:
121
+ raise ValueError("selected slate violates its residual audit floor")
122
+ for name in (
123
+ "acquisition_retention_ratio",
124
+ "minimum_acquisition_retention_ratio",
125
+ ):
126
+ value = getattr(self, name)
127
+ if type(value) is not float or not math.isfinite(value):
128
+ raise ValueError(f"{name} must be finite")
129
+ if not 0.0 < self.minimum_acquisition_retention_ratio <= 1.0:
130
+ raise ValueError("minimum acquisition retention must lie in (0, 1]")
131
+ if not 0.0 < self.acquisition_retention_ratio <= 1.0:
132
+ raise ValueError("acquisition retention must lie in (0, 1]")
133
+ if not self.hard_retention_bound_respected:
134
+ raise ValueError("selection escapes its hard retention envelope")
135
+
136
+ @property
137
+ def retained_anchor_option_ids(self) -> tuple[str, ...]:
138
+ reference = set(self.reference_option_ids)
139
+ return tuple(value for value in self.selected_option_ids if value in reference)
140
+
141
+ @property
142
+ def residual_option_ids(self) -> tuple[str, ...]:
143
+ reference = set(self.reference_option_ids)
144
+ return tuple(value for value in self.selected_option_ids if value not in reference)
145
+
146
+ @property
147
+ def displaced_anchor_option_ids(self) -> tuple[str, ...]:
148
+ selected = set(self.selected_option_ids)
149
+ return tuple(value for value in self.reference_option_ids if value not in selected)
150
+
151
+ @property
152
+ def hard_retention_bound_respected(self) -> bool:
153
+ return (
154
+ self.acquisition_retention_ratio
155
+ >= self.minimum_acquisition_retention_ratio
156
+ )
157
+
158
+ @classmethod
159
+ def from_allocation_record(
160
+ cls,
161
+ *,
162
+ generation: int,
163
+ parent_slot: int,
164
+ selector_call_id: str,
165
+ request_sha256: str,
166
+ decision_sha256: str,
167
+ allocation: dict[str, object],
168
+ ) -> AnchorResidualSelectionAudit:
169
+ if type(allocation) is not dict:
170
+ raise TypeError("allocation must be an exact object")
171
+ result = cls(
172
+ generation=generation,
173
+ parent_slot=parent_slot,
174
+ selector_call_id=selector_call_id,
175
+ request_sha256=request_sha256,
176
+ decision_sha256=decision_sha256,
177
+ policy_id=str(allocation.get("policy_id", "")),
178
+ policy_version=allocation.get("policy_version"),
179
+ policy_definition_sha256=allocation.get("policy_definition_sha256"),
180
+ certificate_scope=str(allocation.get("certificate_scope", "")),
181
+ reference_option_ids=_exact_option_ids(
182
+ allocation.get("reference_option_ids"), "reference_option_ids"
183
+ ),
184
+ selected_option_ids=_exact_option_ids(
185
+ allocation.get("selected_option_ids"), "selected_option_ids"
186
+ ),
187
+ reported_retained_anchor_member_count=allocation.get(
188
+ "reference_member_count"
189
+ ),
190
+ minimum_residual_audit_members=allocation.get(
191
+ "minimum_residual_audit_members"
192
+ ),
193
+ reported_selected_residual_member_count=allocation.get(
194
+ "selected_residual_member_count"
195
+ ),
196
+ acquisition_retention_ratio=_hex_float(
197
+ allocation.get("acquisition_retention_ratio_hex"),
198
+ "acquisition_retention_ratio_hex",
199
+ ),
200
+ minimum_acquisition_retention_ratio=_hex_float(
201
+ allocation.get("minimum_acquisition_retention_ratio_hex"),
202
+ "minimum_acquisition_retention_ratio_hex",
203
+ ),
204
+ )
205
+ result.__post_init__()
206
+ return result
207
+
208
+ def to_record(self) -> dict[str, object]:
209
+ self.__post_init__()
210
+ return {
211
+ "generation": self.generation,
212
+ "parent_slot": self.parent_slot,
213
+ "selector_call_id": self.selector_call_id,
214
+ "request_sha256": self.request_sha256,
215
+ "decision_sha256": self.decision_sha256,
216
+ "policy": {
217
+ "policy_id": self.policy_id,
218
+ "policy_version": self.policy_version,
219
+ "definition_sha256": self.policy_definition_sha256,
220
+ },
221
+ "certificate_scope": self.certificate_scope,
222
+ "reference_option_ids": list(self.reference_option_ids),
223
+ "selected_option_ids": list(self.selected_option_ids),
224
+ "retained_anchor_option_ids": list(self.retained_anchor_option_ids),
225
+ "displaced_anchor_option_ids": list(self.displaced_anchor_option_ids),
226
+ "residual_option_ids": list(self.residual_option_ids),
227
+ "reference_slate_member_count": len(self.reference_option_ids),
228
+ "retained_anchor_member_count": len(self.retained_anchor_option_ids),
229
+ "displaced_anchor_member_count": len(
230
+ self.displaced_anchor_option_ids
231
+ ),
232
+ "residual_member_count": len(self.residual_option_ids),
233
+ "minimum_residual_audit_members": self.minimum_residual_audit_members,
234
+ "acquisition_retention_ratio_hex": (
235
+ self.acquisition_retention_ratio.hex()
236
+ ),
237
+ "minimum_acquisition_retention_ratio_hex": (
238
+ self.minimum_acquisition_retention_ratio.hex()
239
+ ),
240
+ "hard_retention_bound_respected": (
241
+ self.hard_retention_bound_respected
242
+ ),
243
+ }
244
+
245
+
246
+ def _supplemental_audit(
247
+ receipt: CampaignSelectorAuditReceipt,
248
+ ) -> dict[str, object] | None:
249
+ receipt.__post_init__()
250
+ plaintext = thaw_json(receipt.plaintext_audit)
251
+ if type(plaintext) is not dict: # pragma: no cover - closed by receipt.
252
+ raise AssertionError("selector audit did not thaw to an object")
253
+ response_text = decode_selector_audit_text(plaintext, "response_text")
254
+ response = json.loads(response_text)
255
+ if type(response) is not dict:
256
+ raise TypeError("selector response audit must be an exact object")
257
+ supplemental = response.get("supplemental_selector_audit")
258
+ if supplemental is None:
259
+ return None
260
+ if type(supplemental) is not dict:
261
+ raise TypeError("supplemental selector audit must be an exact object")
262
+ if (
263
+ supplemental.get("request_sha256") != receipt.request_sha256
264
+ or supplemental.get("decision_sha256") != receipt.decision_sha256
265
+ ):
266
+ raise ValueError("supplemental audit differs from selector receipt identity")
267
+ return supplemental
268
+
269
+
270
+ def project_anchor_residual_selection_audits(
271
+ stage_receipts: tuple[CampaignStageReceipt, ...],
272
+ ) -> tuple[AnchorResidualSelectionAudit, ...]:
273
+ """Project all regret-bounded decisions from generic campaign receipts."""
274
+
275
+ if type(stage_receipts) is not tuple or any(
276
+ type(value) is not CampaignStageReceipt for value in stage_receipts
277
+ ):
278
+ raise TypeError("stage_receipts must contain exact stage receipts")
279
+ records: list[AnchorResidualSelectionAudit] = []
280
+ for stage in stage_receipts:
281
+ stage.__post_init__()
282
+ for receipt in stage.selector_audits:
283
+ supplemental = _supplemental_audit(receipt)
284
+ if supplemental is None:
285
+ continue
286
+ if supplemental.get("audit_kind") != REGRET_BOUNDED_SELECTOR_AUDIT_KIND:
287
+ continue
288
+ payload = supplemental.get("payload")
289
+ allocation = payload.get("allocation") if type(payload) is dict else None
290
+ if type(allocation) is not dict:
291
+ raise TypeError("regret-bounded audit lacks allocation evidence")
292
+ records.append(
293
+ AnchorResidualSelectionAudit.from_allocation_record(
294
+ generation=receipt.generation,
295
+ parent_slot=receipt.parent_slot,
296
+ selector_call_id=receipt.selector_call_id,
297
+ request_sha256=receipt.request_sha256,
298
+ decision_sha256=receipt.decision_sha256,
299
+ allocation=allocation,
300
+ )
301
+ )
302
+ return tuple(records)
303
+
304
+
305
+ @dataclass(frozen=True, slots=True)
306
+ class AnchorResidualIdentificationContract:
307
+ """Expected causal treatment shared by every workload and model."""
308
+
309
+ expected_selector_calls: int
310
+ portfolio_width: int
311
+ minimum_residual_members: int
312
+ exact_residual_members: int | None = None
313
+
314
+ def __post_init__(self) -> None:
315
+ if type(self.expected_selector_calls) is not int or (
316
+ self.expected_selector_calls <= 0
317
+ ):
318
+ raise ValueError("expected_selector_calls must be positive")
319
+ if type(self.portfolio_width) is not int or self.portfolio_width <= 1:
320
+ raise ValueError("portfolio_width must exceed one")
321
+ if (
322
+ type(self.minimum_residual_members) is not int
323
+ or not 0 <= self.minimum_residual_members < self.portfolio_width
324
+ ):
325
+ raise ValueError("minimum_residual_members lies outside the portfolio")
326
+ if self.exact_residual_members is not None and (
327
+ type(self.exact_residual_members) is not int
328
+ or not self.minimum_residual_members
329
+ <= self.exact_residual_members
330
+ < self.portfolio_width
331
+ ):
332
+ raise ValueError("exact_residual_members lies outside the contract")
333
+
334
+ def assess(
335
+ self,
336
+ records: tuple[AnchorResidualSelectionAudit, ...],
337
+ ) -> AnchorResidualIdentificationAssessment:
338
+ self.__post_init__()
339
+ if type(records) is not tuple or any(
340
+ type(value) is not AnchorResidualSelectionAudit for value in records
341
+ ):
342
+ raise TypeError("records must contain exact anchor-residual audits")
343
+ for value in records:
344
+ value.__post_init__()
345
+ gates = {
346
+ "exact_selector_call_count": (
347
+ len(records) == self.expected_selector_calls
348
+ ),
349
+ "unique_authenticated_selector_calls": (
350
+ len({value.selector_call_id for value in records}) == len(records)
351
+ and len({value.request_sha256 for value in records}) == len(records)
352
+ and len({value.decision_sha256 for value in records}) == len(records)
353
+ ),
354
+ "complete_reference_and_selected_slates": all(
355
+ len(value.reference_option_ids) == self.portfolio_width
356
+ and len(value.selected_option_ids) == self.portfolio_width
357
+ for value in records
358
+ ),
359
+ "configured_residual_floor_realized": all(
360
+ value.minimum_residual_audit_members
361
+ == self.minimum_residual_members
362
+ and len(value.residual_option_ids) >= self.minimum_residual_members
363
+ for value in records
364
+ ),
365
+ "exact_residual_mix_realized": (
366
+ self.exact_residual_members is None
367
+ or all(
368
+ len(value.residual_option_ids) == self.exact_residual_members
369
+ and len(value.retained_anchor_option_ids)
370
+ == self.portfolio_width - self.exact_residual_members
371
+ for value in records
372
+ )
373
+ ),
374
+ "hard_retention_bound_respected": all(
375
+ value.hard_retention_bound_respected for value in records
376
+ ),
377
+ "strictly_prior_certificate_scope": all(
378
+ value.certificate_scope == STRICTLY_PRIOR_CERTIFICATE_SCOPE
379
+ for value in records
380
+ ),
381
+ "single_allocator_policy_identity": len(
382
+ {
383
+ (
384
+ value.policy_id,
385
+ value.policy_version,
386
+ value.policy_definition_sha256,
387
+ )
388
+ for value in records
389
+ }
390
+ )
391
+ == 1,
392
+ }
393
+ return AnchorResidualIdentificationAssessment(
394
+ contract=self,
395
+ records=records,
396
+ gates=gates,
397
+ )
398
+
399
+ def to_record(self) -> dict[str, object]:
400
+ self.__post_init__()
401
+ return {
402
+ "expected_selector_calls": self.expected_selector_calls,
403
+ "portfolio_width": self.portfolio_width,
404
+ "minimum_residual_members": self.minimum_residual_members,
405
+ "exact_residual_members": self.exact_residual_members,
406
+ }
407
+
408
+
409
+ @dataclass(frozen=True, slots=True)
410
+ class AnchorResidualIdentificationAssessment:
411
+ contract: AnchorResidualIdentificationContract
412
+ records: tuple[AnchorResidualSelectionAudit, ...]
413
+ gates: dict[str, bool]
414
+
415
+ def __post_init__(self) -> None:
416
+ if type(self.contract) is not AnchorResidualIdentificationContract:
417
+ raise TypeError("contract must be exact")
418
+ self.contract.__post_init__()
419
+ if type(self.records) is not tuple or any(
420
+ type(value) is not AnchorResidualSelectionAudit for value in self.records
421
+ ):
422
+ raise TypeError("records must contain exact anchor-residual audits")
423
+ if type(self.gates) is not dict or not self.gates:
424
+ raise TypeError("gates must be a non-empty exact object")
425
+ if any(type(name) is not str or type(value) is not bool for name, value in self.gates.items()):
426
+ raise TypeError("gates must map strings to exact bools")
427
+
428
+ @property
429
+ def all_gates_pass(self) -> bool:
430
+ return all(self.gates.values())
431
+
432
+ def to_record(self) -> dict[str, object]:
433
+ self.__post_init__()
434
+ ratios = tuple(value.acquisition_retention_ratio for value in self.records)
435
+ return {
436
+ "contract": self.contract.to_record(),
437
+ "all_gates_pass": self.all_gates_pass,
438
+ "gates": dict(self.gates),
439
+ "selector_call_count": len(self.records),
440
+ "retained_anchor_member_count": sum(
441
+ len(value.retained_anchor_option_ids) for value in self.records
442
+ ),
443
+ "residual_member_count": sum(
444
+ len(value.residual_option_ids) for value in self.records
445
+ ),
446
+ "minimum_realized_acquisition_retention_ratio_hex": (
447
+ None if not ratios else min(ratios).hex()
448
+ ),
449
+ "maximum_realized_acquisition_retention_ratio_hex": (
450
+ None if not ratios else max(ratios).hex()
451
+ ),
452
+ "records": [value.to_record() for value in self.records],
453
+ }
454
+
455
+
456
+ __all__ = [
457
+ "AnchorResidualIdentificationAssessment",
458
+ "AnchorResidualIdentificationContract",
459
+ "AnchorResidualSelectionAudit",
460
+ "REGRET_BOUNDED_SELECTOR_AUDIT_KIND",
461
+ "STRICTLY_PRIOR_CERTIFICATE_SCOPE",
462
+ "project_anchor_residual_selection_audits",
463
+ ]
@@ -0,0 +1,208 @@
1
+ """Generic archive-conditioned target synthesis for action consequence search.
2
+
3
+ Residual-cell targeting may legitimately fall back when a prior archive has a
4
+ single effective frontier point. Expected-hypervolume action allocation still
5
+ has a complete decision frame in that case: the frozen affine archive, fixed
6
+ reference, and selected parent's measured objectives. This adapter binds that
7
+ frame into the same authenticated target contract consumed by action forecasts
8
+ without inventing an evaluator outcome or a workload-specific aspiration.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import json
15
+ import math
16
+ from dataclasses import replace
17
+ from typing import Mapping
18
+
19
+ from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
20
+ from agent_evolve.application.portfolio_campaign_runtime import (
21
+ CAMPAIGN_FRONTIER_TARGET_KEY,
22
+ )
23
+ from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
24
+ from agent_evolve.policies.reward.affine_hypervolume import (
25
+ AffineHypervolumeSnapshot2D,
26
+ )
27
+ from agent_evolve.policies.reward.affine_hypervolume_3d import (
28
+ AffineHypervolumeSnapshot3D,
29
+ )
30
+ from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
31
+ from agent_evolve.ports.portfolio_selection import PortfolioSelectionRequest
32
+
33
+
34
+ ARCHIVE_CONDITIONED_TARGET_ID = "archive_conditioned_expected_hypervolume"
35
+ ARCHIVE_CONDITIONED_TARGET_VERSION = 1
36
+ ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256 = hashlib.sha256(
37
+ b"agent-evolve:archive-conditioned-expected-hypervolume-target:v1;"
38
+ b"inputs=frozen-affine-prior-archive-plus-measured-parent;"
39
+ b"aspiration=parent-neutral-no-invented-outcome;cell=entire-normalized-prior-"
40
+ b"archive;reference=unit-vector;purpose=expected-fixed-reference-hv-gain;"
41
+ b"workload-model-provider-action-identifiers=false;future-outcomes=false"
42
+ ).hexdigest()
43
+ _CELL_DOMAIN = b"agent-evolve:archive-conditioned-cell:v1\x00"
44
+
45
+
46
+ def _canonical_json(value: object) -> bytes:
47
+ return json.dumps(
48
+ value,
49
+ allow_nan=False,
50
+ ensure_ascii=True,
51
+ separators=(",", ":"),
52
+ sort_keys=True,
53
+ ).encode("ascii")
54
+
55
+
56
+ def _decimal(value: float) -> str:
57
+ if type(value) is not float or not math.isfinite(value):
58
+ raise TypeError("archive-conditioned values must be finite exact floats")
59
+ return format(0.0 if value == 0.0 else value, ".17g")
60
+
61
+
62
+ def _object(value: dict[str, object]) -> FrozenJsonObject:
63
+ result = freeze_json(value)
64
+ if type(result) is not FrozenJsonObject:
65
+ raise TypeError("archive-conditioned target payload must be an object")
66
+ return result
67
+
68
+
69
+ def bind_archive_conditioned_affine_action_target(
70
+ *,
71
+ selection_request: PortfolioSelectionRequest,
72
+ archive_utility: ArchiveUtilitySnapshot,
73
+ affine_snapshot: AffineHypervolumeSnapshot2D | AffineHypervolumeSnapshot3D,
74
+ parent_objectives: Mapping[str, float],
75
+ lane_id: str,
76
+ ) -> tuple[PortfolioSelectionRequest, CampaignPortfolioFrontierTarget]:
77
+ """Attach a prior-only whole-archive expected-HV target to one request."""
78
+
79
+ if type(selection_request) is not PortfolioSelectionRequest:
80
+ raise TypeError("selection_request must be exact")
81
+ selection_request.__post_init__()
82
+ if type(archive_utility) is not ArchiveUtilitySnapshot:
83
+ raise TypeError("archive_utility must be exact")
84
+ archive_utility.__post_init__()
85
+ if type(affine_snapshot) not in {
86
+ AffineHypervolumeSnapshot2D,
87
+ AffineHypervolumeSnapshot3D,
88
+ }:
89
+ raise TypeError("affine_snapshot must be an exact 2-D or 3-D snapshot")
90
+ affine_snapshot.__post_init__()
91
+ if affine_snapshot.to_record() != thaw_json(archive_utility.snapshot_receipt):
92
+ raise ValueError("affine snapshot differs from the archive utility receipt")
93
+ if archive_utility.definition_sha256 != affine_snapshot.spec.definition_sha256:
94
+ raise ValueError("archive utility and affine definition differ")
95
+ if not isinstance(parent_objectives, Mapping):
96
+ raise TypeError("parent_objectives must be a mapping")
97
+ metric_ids = affine_snapshot.spec.metric_ids
98
+ if set(parent_objectives) != set(metric_ids):
99
+ raise ValueError("parent objectives differ from the affine metric frame")
100
+ parent = {metric_id: float(parent_objectives[metric_id]) for metric_id in metric_ids}
101
+ if any(not math.isfinite(value) for value in parent.values()):
102
+ raise ValueError("parent objectives must be finite")
103
+ if type(lane_id) is not str or not lane_id:
104
+ raise ValueError("lane_id must be non-empty")
105
+
106
+ anchors = affine_snapshot.normalized_archive_points
107
+ if not anchors:
108
+ raise ValueError("archive-conditioned targeting requires prior archive points")
109
+ normalized_parent = affine_snapshot.spec.normalize(parent)
110
+ cell_payload = {
111
+ "archive_utility_snapshot_sha256": archive_utility.snapshot_sha256,
112
+ "normalized_anchor_points_hex": [
113
+ [value.hex() for value in point] for point in anchors
114
+ ],
115
+ "metric_ids": list(metric_ids),
116
+ }
117
+ cell_sha256 = hashlib.sha256(
118
+ _CELL_DOMAIN + _canonical_json(cell_payload)
119
+ ).hexdigest()
120
+ axes = []
121
+ for axis in affine_snapshot.spec.axes:
122
+ value = parent[axis.metric_id]
123
+ axes.append(
124
+ {
125
+ "metric_id": axis.metric_id,
126
+ "goal": axis.goal,
127
+ "ideal_decimal": _decimal(float(axis.ideal)),
128
+ "reference_decimal": _decimal(float(axis.reference)),
129
+ "parent_value_decimal": _decimal(value),
130
+ "aspiration_value_decimal": _decimal(value),
131
+ "signed_parent_to_aspiration_delta_decimal": _decimal(0.0),
132
+ "improving_raw_delta_sign": (
133
+ "negative" if axis.goal == "min" else "positive"
134
+ ),
135
+ }
136
+ )
137
+ payload = _object(
138
+ {
139
+ "schema_version": 2,
140
+ "objective_space_target": {
141
+ "purpose": (
142
+ "score_probabilistic_actions_by_expected_fixed_reference_"
143
+ "hypervolume_without_inventing_an_aspiration"
144
+ ),
145
+ "axes": axes,
146
+ },
147
+ "residual_frontier_cell": {
148
+ "cell_sha256": cell_sha256,
149
+ "geometry_sha256": affine_snapshot.spec.definition_sha256,
150
+ "policy_definition_sha256": (
151
+ ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256
152
+ ),
153
+ "normalized_anchor_points_decimal": [
154
+ [_decimal(value) for value in point] for point in anchors
155
+ ],
156
+ "normalized_aspiration_point_decimal": [
157
+ _decimal(value) for value in normalized_parent
158
+ ],
159
+ "potential_hypervolume_gain_decimal": _decimal(0.0),
160
+ "parent_anchor_binding_distance_decimal": _decimal(0.0),
161
+ },
162
+ "acquisition_instruction": {
163
+ "objective": "maximize_expected_fixed_reference_hypervolume_gain",
164
+ "avoid_candidates_dominated_by_the_prior_archive": True,
165
+ "evaluator_outcomes_remain_unknown": True,
166
+ "target_realization_is_magnitude_sensitive": True,
167
+ "tradeoffs_can_be_frontier_improving": True,
168
+ },
169
+ "normalized_orientation": "lower_is_better_on_every_axis",
170
+ "epistemic_cutoff": {
171
+ "archive_utility_snapshot_sha256": archive_utility.snapshot_sha256,
172
+ "generation": archive_utility.generation,
173
+ "current_or_future_candidate_outcomes_consulted": False,
174
+ },
175
+ "workload_identifiers_consulted": False,
176
+ "model_or_provider_fields_consulted": False,
177
+ }
178
+ )
179
+ target = CampaignPortfolioFrontierTarget(
180
+ allocator_id=ARCHIVE_CONDITIONED_TARGET_ID,
181
+ allocator_version=ARCHIVE_CONDITIONED_TARGET_VERSION,
182
+ definition_sha256=ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256,
183
+ archive_utility_snapshot_sha256=archive_utility.snapshot_sha256,
184
+ lane_id=lane_id,
185
+ parent_configuration_sha256=(
186
+ selection_request.finite_variation_contract
187
+ .parent_configuration_sha256
188
+ ),
189
+ direction_id="expected_hypervolume",
190
+ opportunity_rank=1,
191
+ payload=payload,
192
+ )
193
+ context = thaw_json(selection_request.context)
194
+ if type(context) is not dict:
195
+ raise TypeError("selection request context must be an object")
196
+ context[CAMPAIGN_FRONTIER_TARGET_KEY] = target.to_record()
197
+ rebound_context = freeze_json(context)
198
+ if type(rebound_context) is not FrozenJsonObject:
199
+ raise TypeError("rebound selector context must be an object")
200
+ return replace(selection_request, context=rebound_context), target
201
+
202
+
203
+ __all__ = [
204
+ "ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256",
205
+ "ARCHIVE_CONDITIONED_TARGET_ID",
206
+ "ARCHIVE_CONDITIONED_TARGET_VERSION",
207
+ "bind_archive_conditioned_affine_action_target",
208
+ ]