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,473 @@
1
+ """Coordinated, workload-neutral target allocation over affine Pareto geometry.
2
+
3
+ The policy is intentionally prospective. It sees only the frozen archive and
4
+ already-evaluated parents. It converts the reference directions exposed by the
5
+ authenticated affine frontier projector into distinct lane-level opportunities
6
+ using an augmented weighted-Chebyshev achievement scalar. Evaluator outcomes
7
+ from the current or future wave, model/provider metadata, action names, and
8
+ workload identifiers are outside the interface.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import math
15
+ from dataclasses import dataclass
16
+ from itertools import permutations
17
+
18
+ from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
19
+ from agent_evolve.policies.selection.affine_frontier_context import (
20
+ AuthenticatedAffineFrontierContextProjector,
21
+ )
22
+ from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
23
+
24
+
25
+ ALLOCATOR_ID = "affine_frontier_opportunity_target"
26
+ ALLOCATOR_VERSION = 1
27
+ ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
28
+ b"agent-evolve:affine-frontier-opportunity-target:v1;"
29
+ b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
30
+ b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
31
+ b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
32
+ b"opportunity=nonnegative-distance-from-normalized-ideal;"
33
+ b"direction-selection=descending-opportunity-distinct-before-cycle;"
34
+ b"lane-matching=greedy-min-parent-achievement;"
35
+ b"current-future-outcomes=false;workload-model-provider-action-fields=false"
36
+ ).hexdigest()
37
+ DIRECTION_COVERED_ALLOCATOR_ID = "direction_covered_affine_frontier_target"
38
+ DIRECTION_COVERED_ALLOCATOR_VERSION = 2
39
+ DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
40
+ b"agent-evolve:direction-covered-affine-frontier-target:v2;"
41
+ b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
42
+ b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
43
+ b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
44
+ b"opportunity=nonnegative-distance-from-normalized-ideal;"
45
+ b"direction-selection=canonical-phase-stratified-coverage-before-repeat;"
46
+ b"coverage-phase=portfolio-wave-index-derived-from-generation;"
47
+ b"lane-matching=greedy-min-parent-achievement;"
48
+ b"current-future-outcomes=false;workload-model-provider-action-fields=false;"
49
+ b"legacy-opportunity-target-unchanged=true"
50
+ ).hexdigest()
51
+ GLOBALLY_MATCHED_ALLOCATOR_ID = "globally_matched_direction_covered_frontier_target"
52
+ GLOBALLY_MATCHED_ALLOCATOR_VERSION = 3
53
+ GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
54
+ b"agent-evolve:globally-matched-direction-covered-frontier-target:v3;"
55
+ b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
56
+ b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
57
+ b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
58
+ b"opportunity=nonnegative-distance-from-normalized-ideal;"
59
+ b"direction-selection=canonical-phase-stratified-coverage-before-repeat;"
60
+ b"coverage-phase=portfolio-wave-index-derived-from-generation;"
61
+ b"lane-matching=exact-global-minimum-total-parent-achievement;"
62
+ b"ties=canonical-lane-permutation;"
63
+ b"current-future-outcomes=false;workload-model-provider-action-fields=false;"
64
+ b"legacy-allocators-unchanged=true"
65
+ ).hexdigest()
66
+
67
+
68
+ def _object(value: dict[str, object]) -> FrozenJsonObject:
69
+ result = freeze_json(value)
70
+ if type(result) is not FrozenJsonObject: # pragma: no cover - closed root.
71
+ raise AssertionError("frontier target payload did not freeze to an object")
72
+ return result
73
+
74
+
75
+ def _finite_decimal(value: object, *, name: str) -> float:
76
+ if type(value) is not str:
77
+ raise TypeError(f"{name} must be decimal text")
78
+ result = float(value)
79
+ if not math.isfinite(result):
80
+ raise ValueError(f"{name} must be finite")
81
+ return result
82
+
83
+
84
+ def _decimal(value: float) -> str:
85
+ if not math.isfinite(value):
86
+ raise ValueError("frontier target cannot render a non-finite value")
87
+ normalized = 0.0 if value == 0.0 else value
88
+ return format(normalized, ".17g")
89
+
90
+
91
+ def _achievement(point: tuple[float, ...], weights: tuple[float, ...]) -> float:
92
+ active = tuple(
93
+ (value, weight)
94
+ for value, weight in zip(point, weights, strict=True)
95
+ if weight > 0
96
+ )
97
+ if not active:
98
+ raise ValueError("frontier target direction must activate an axis")
99
+ maximum = max(weight * value for value, weight in active)
100
+ weighted_mean = sum(weight * value for value, weight in active) / sum(
101
+ weight for _, weight in active
102
+ )
103
+ return maximum + 0.05 * weighted_mean
104
+
105
+
106
+ @dataclass(frozen=True, slots=True)
107
+ class AuthenticatedAffineFrontierTargetAllocator:
108
+ """Coordinate lane targets without benchmark-specific knowledge."""
109
+
110
+ allocator_id: str = ALLOCATOR_ID
111
+ allocator_version: int = ALLOCATOR_VERSION
112
+ definition_sha256: str = ALLOCATOR_DEFINITION_SHA256
113
+
114
+ def __post_init__(self) -> None:
115
+ if (
116
+ self.allocator_id != ALLOCATOR_ID
117
+ or self.allocator_version != ALLOCATOR_VERSION
118
+ or self.definition_sha256 != ALLOCATOR_DEFINITION_SHA256
119
+ ):
120
+ raise ValueError("affine frontier target allocator identity drifted")
121
+
122
+ def _select_directions(
123
+ self,
124
+ directions: tuple[dict[str, object], ...],
125
+ *,
126
+ lane_count: int,
127
+ generation: int,
128
+ ) -> tuple[dict[str, object], ...]:
129
+ del generation
130
+ return tuple(
131
+ directions[index % len(directions)] for index in range(lane_count)
132
+ )
133
+
134
+ def _match_directions_to_parents(
135
+ self,
136
+ *,
137
+ selected: tuple[dict[str, object], ...],
138
+ parents: dict[str, tuple[object, tuple[float, ...]]],
139
+ ) -> tuple[tuple[str, object, tuple[float, ...], dict[str, object]], ...]:
140
+ """Preserve the version-1 greedy matching law for replay stability."""
141
+
142
+ assignments: list[
143
+ tuple[str, object, tuple[float, ...], dict[str, object]]
144
+ ] = []
145
+ remaining = dict(parents)
146
+ for direction in selected:
147
+ weights = direction["weights"]
148
+ assert type(weights) is tuple
149
+ lane_id = min(
150
+ remaining,
151
+ key=lambda value: (
152
+ _achievement(remaining[value][1], weights),
153
+ value,
154
+ ),
155
+ )
156
+ parent, point = remaining.pop(lane_id)
157
+ assignments.append((lane_id, parent, point, direction))
158
+ return tuple(assignments)
159
+
160
+ def allocate(self, *, archive_utility, lanes):
161
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
162
+ from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
163
+
164
+ self.__post_init__()
165
+ if type(archive_utility) is not ArchiveUtilitySnapshot:
166
+ raise TypeError("archive_utility must be an exact frozen snapshot")
167
+ ArchiveUtilitySnapshot.__post_init__(archive_utility)
168
+ if type(lanes) is not tuple or not lanes:
169
+ raise ValueError("lanes must be a non-empty exact tuple")
170
+ for lane_id, parent in lanes:
171
+ if type(lane_id) is not str or not lane_id:
172
+ raise ValueError("lane IDs must be non-empty strings")
173
+ if type(parent) is not EvolutionCandidate:
174
+ raise TypeError("lane parents must be exact EvolutionCandidate values")
175
+ EvolutionCandidate.__post_init__(parent)
176
+ if tuple(value[0] for value in lanes) != tuple(
177
+ sorted({value[0] for value in lanes})
178
+ ):
179
+ raise ValueError("lanes must be unique and canonical")
180
+
181
+ projector = AuthenticatedAffineFrontierContextProjector()
182
+ projected = tuple(
183
+ (
184
+ lane_id,
185
+ parent,
186
+ projector.project(archive_utility=archive_utility, parent=parent),
187
+ )
188
+ for lane_id, parent in lanes
189
+ )
190
+ payloads = tuple(thaw_json(value.payload) for _, _, value in projected)
191
+ if any(type(value) is not dict for value in payloads):
192
+ raise TypeError("affine frontier projection payload must be an object")
193
+ first = payloads[0]
194
+ frame = first.get("optimization_frame")
195
+ archive = first.get("archive")
196
+ if type(frame) is not dict or type(archive) is not dict:
197
+ raise ValueError("affine frontier projection omitted its geometry")
198
+ raw_points = archive.get("normalized_points_decimal")
199
+ raw_directions = frame.get("reference_directions")
200
+ if type(raw_points) is not list or not raw_points:
201
+ raise ValueError("affine frontier target requires archive points")
202
+ if type(raw_directions) is not list or not raw_directions:
203
+ raise ValueError("affine frontier target requires reference directions")
204
+ dimension = frame.get("dimension")
205
+ if type(dimension) is not int or dimension not in (2, 3):
206
+ raise ValueError("affine frontier target supports exact 2-D or 3-D")
207
+ points = tuple(
208
+ tuple(
209
+ _finite_decimal(cell, name=f"archive[{row_index}][{axis_index}]")
210
+ for axis_index, cell in enumerate(row)
211
+ )
212
+ for row_index, row in enumerate(raw_points)
213
+ if type(row) is list and len(row) == dimension
214
+ )
215
+ if len(points) != len(raw_points):
216
+ raise ValueError("affine archive point dimension is malformed")
217
+
218
+ directions: list[dict[str, object]] = []
219
+ for raw in raw_directions:
220
+ if type(raw) is not dict or type(raw.get("direction_id")) is not str:
221
+ raise ValueError("affine reference direction is malformed")
222
+ raw_weights = raw.get("normalized_importance_decimal")
223
+ if type(raw_weights) is not list or len(raw_weights) != dimension:
224
+ raise ValueError("affine reference-direction dimension is malformed")
225
+ weights = tuple(
226
+ _finite_decimal(value, name="reference_direction_weight")
227
+ for value in raw_weights
228
+ )
229
+ if any(value < 0 for value in weights) or max(weights) <= 0:
230
+ raise ValueError("reference-direction weights must be nonnegative")
231
+ maximum = max(weights)
232
+ comparable = tuple(value / maximum for value in weights)
233
+ archive_best = min(_achievement(point, comparable) for point in points)
234
+ directions.append(
235
+ {
236
+ "direction_id": raw["direction_id"],
237
+ "weights": comparable,
238
+ "archive_best": archive_best,
239
+ "opportunity": max(0.0, archive_best),
240
+ }
241
+ )
242
+ directions.sort(
243
+ key=lambda value: (
244
+ -float(value["opportunity"]),
245
+ str(value["direction_id"]),
246
+ )
247
+ )
248
+ selected = self._select_directions(
249
+ tuple(directions),
250
+ lane_count=len(lanes),
251
+ generation=archive_utility.generation,
252
+ )
253
+
254
+ parents: dict[str, tuple[object, tuple[float, ...]]] = {}
255
+ shared_geometry_sha256 = None
256
+ for (lane_id, parent, projection), payload in zip(
257
+ projected, payloads, strict=True
258
+ ):
259
+ assert type(payload) is dict
260
+ if (
261
+ payload.get("optimization_frame") != frame
262
+ or payload.get("archive") != archive
263
+ ):
264
+ raise ValueError(
265
+ "lane frontier projections disagree on archive geometry"
266
+ )
267
+ parent_record = payload.get("parent")
268
+ if type(parent_record) is not dict:
269
+ raise ValueError("affine frontier projection omitted its parent")
270
+ raw_parent = parent_record.get("normalized_point_decimal")
271
+ if type(raw_parent) is not list or len(raw_parent) != dimension:
272
+ raise ValueError("affine parent point dimension is malformed")
273
+ parents[lane_id] = (
274
+ parent,
275
+ tuple(
276
+ _finite_decimal(value, name="parent_normalized_point")
277
+ for value in raw_parent
278
+ ),
279
+ )
280
+ geometry_sha256 = projection.archive_utility_snapshot_sha256
281
+ if shared_geometry_sha256 is None:
282
+ shared_geometry_sha256 = geometry_sha256
283
+ elif shared_geometry_sha256 != geometry_sha256:
284
+ raise ValueError("lane frontier projections use different cutoffs")
285
+
286
+ assignments = self._match_directions_to_parents(
287
+ selected=selected,
288
+ parents=parents,
289
+ )
290
+
291
+ rank_by_direction = {
292
+ str(value["direction_id"]): index
293
+ for index, value in enumerate(directions, start=1)
294
+ }
295
+ results = []
296
+ for lane_id, parent, point, direction in assignments:
297
+ weights = direction["weights"]
298
+ assert type(weights) is tuple
299
+ parent_achievement = _achievement(point, weights)
300
+ archive_best = float(direction["archive_best"])
301
+ direction_id = str(direction["direction_id"])
302
+ rank = rank_by_direction[direction_id]
303
+ results.append(
304
+ CampaignPortfolioFrontierTarget(
305
+ allocator_id=self.allocator_id,
306
+ allocator_version=self.allocator_version,
307
+ definition_sha256=self.definition_sha256,
308
+ archive_utility_snapshot_sha256=(archive_utility.snapshot_sha256),
309
+ lane_id=lane_id,
310
+ parent_configuration_sha256=(parent.occurrence.configuration_hash),
311
+ direction_id=direction_id,
312
+ opportunity_rank=rank,
313
+ payload=_object(
314
+ {
315
+ "schema_version": 1,
316
+ "epistemic_cutoff": {
317
+ "generation": archive_utility.generation,
318
+ "archive_utility_snapshot_sha256": (
319
+ archive_utility.snapshot_sha256
320
+ ),
321
+ "current_or_future_candidate_outcomes_consulted": False,
322
+ },
323
+ "normalized_orientation": ("lower_is_better_on_every_axis"),
324
+ "target_direction": {
325
+ "direction_id": direction_id,
326
+ "normalized_weights_decimal": [
327
+ _decimal(value) for value in weights
328
+ ],
329
+ "opportunity_rank": rank,
330
+ "archive_best_achievement_decimal": _decimal(
331
+ archive_best
332
+ ),
333
+ "opportunity_from_ideal_decimal": _decimal(
334
+ float(direction["opportunity"])
335
+ ),
336
+ },
337
+ "assigned_parent": {
338
+ "normalized_point_decimal": [
339
+ _decimal(value) for value in point
340
+ ],
341
+ "achievement_decimal": _decimal(parent_achievement),
342
+ "regret_above_archive_best_decimal": _decimal(
343
+ max(0.0, parent_achievement - archive_best)
344
+ ),
345
+ },
346
+ "acquisition_instruction": {
347
+ "objective": (
348
+ "reduce_the_assigned_augmented_chebyshev_achievement"
349
+ ),
350
+ "tradeoffs_can_be_frontier_improving": True,
351
+ "simultaneous_improvement_on_every_axis_required": False,
352
+ "propose_semantically_distinct_finite_actions": True,
353
+ "evaluator_outcomes_remain_unknown": True,
354
+ },
355
+ "achievement_scalar": {
356
+ "kind": "augmented_weighted_chebyshev",
357
+ "rho_decimal": "0.050000000000000003",
358
+ "weights_rescaled_to_max_one": True,
359
+ },
360
+ "workload_identifiers_consulted": False,
361
+ "model_or_provider_fields_consulted": False,
362
+ }
363
+ ),
364
+ )
365
+ )
366
+ return tuple(sorted(results, key=lambda value: value.lane_id))
367
+
368
+
369
+ @dataclass(frozen=True, slots=True)
370
+ class DirectionCoveredAffineFrontierTargetAllocator(
371
+ AuthenticatedAffineFrontierTargetAllocator
372
+ ):
373
+ """Rotate canonical directions across waves before any direction repeats."""
374
+
375
+ allocator_id: str = DIRECTION_COVERED_ALLOCATOR_ID
376
+ allocator_version: int = DIRECTION_COVERED_ALLOCATOR_VERSION
377
+ definition_sha256: str = DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256
378
+
379
+ def __post_init__(self) -> None:
380
+ if (
381
+ self.allocator_id != DIRECTION_COVERED_ALLOCATOR_ID
382
+ or self.allocator_version != DIRECTION_COVERED_ALLOCATOR_VERSION
383
+ or self.definition_sha256 != DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256
384
+ ):
385
+ raise ValueError("direction-covered frontier allocator identity drifted")
386
+
387
+ def _select_directions(
388
+ self,
389
+ directions: tuple[dict[str, object], ...],
390
+ *,
391
+ lane_count: int,
392
+ generation: int,
393
+ ) -> tuple[dict[str, object], ...]:
394
+ canonical = tuple(
395
+ sorted(directions, key=lambda value: str(value["direction_id"]))
396
+ )
397
+ portfolio_wave_index = max(0, (generation - 1) // 2)
398
+ offset = (portfolio_wave_index * lane_count) % len(canonical)
399
+ return tuple(
400
+ canonical[(offset + index) % len(canonical)]
401
+ for index in range(lane_count)
402
+ )
403
+
404
+
405
+ @dataclass(frozen=True, slots=True)
406
+ class GloballyMatchedDirectionCoveredAffineFrontierTargetAllocator(
407
+ DirectionCoveredAffineFrontierTargetAllocator
408
+ ):
409
+ """Cover directions and solve their lane binding as one exact assignment."""
410
+
411
+ allocator_id: str = GLOBALLY_MATCHED_ALLOCATOR_ID
412
+ allocator_version: int = GLOBALLY_MATCHED_ALLOCATOR_VERSION
413
+ definition_sha256: str = GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256
414
+
415
+ def __post_init__(self) -> None:
416
+ if (
417
+ self.allocator_id != GLOBALLY_MATCHED_ALLOCATOR_ID
418
+ or self.allocator_version != GLOBALLY_MATCHED_ALLOCATOR_VERSION
419
+ or self.definition_sha256 != GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256
420
+ ):
421
+ raise ValueError("globally matched frontier allocator identity drifted")
422
+
423
+ def _match_directions_to_parents(
424
+ self,
425
+ *,
426
+ selected: tuple[dict[str, object], ...],
427
+ parents: dict[str, tuple[object, tuple[float, ...]]],
428
+ ) -> tuple[tuple[str, object, tuple[float, ...], dict[str, object]], ...]:
429
+ if len(selected) != len(parents):
430
+ raise ValueError("global frontier matching requires equal cardinality")
431
+ lane_ids = tuple(sorted(parents))
432
+ # Campaign lane counts are intentionally small. Exact enumeration is
433
+ # preferable here: it is dependency-free, deterministic, and leaves an
434
+ # auditable optimum rather than another greedy repair boundary.
435
+ best = min(
436
+ permutations(lane_ids),
437
+ key=lambda assignment: (
438
+ sum(
439
+ _achievement(parents[lane_id][1], direction["weights"])
440
+ for lane_id, direction in zip(
441
+ assignment,
442
+ selected,
443
+ strict=True,
444
+ )
445
+ ),
446
+ assignment,
447
+ ),
448
+ )
449
+ return tuple(
450
+ (
451
+ lane_id,
452
+ parents[lane_id][0],
453
+ parents[lane_id][1],
454
+ direction,
455
+ )
456
+ for lane_id, direction in zip(best, selected, strict=True)
457
+ )
458
+
459
+
460
+ __all__ = [
461
+ "ALLOCATOR_DEFINITION_SHA256",
462
+ "ALLOCATOR_ID",
463
+ "ALLOCATOR_VERSION",
464
+ "AuthenticatedAffineFrontierTargetAllocator",
465
+ "DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256",
466
+ "DIRECTION_COVERED_ALLOCATOR_ID",
467
+ "DIRECTION_COVERED_ALLOCATOR_VERSION",
468
+ "DirectionCoveredAffineFrontierTargetAllocator",
469
+ "GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256",
470
+ "GLOBALLY_MATCHED_ALLOCATOR_ID",
471
+ "GLOBALLY_MATCHED_ALLOCATOR_VERSION",
472
+ "GloballyMatchedDirectionCoveredAffineFrontierTargetAllocator",
473
+ ]