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,732 @@
1
+ """Outcome-blind evaluation allocation across heterogeneous proposal experts.
2
+
3
+ An LLM's native ranks are meaningful only within the proposal set produced by
4
+ that expert. Treating ranks from different experts as a single calibrated
5
+ score silently collapses source diversity; trusting only each expert's head
6
+ silently assumes rank monotonicity before any real evaluator evidence exists.
7
+
8
+ This module implements a small, workload-neutral cold-start design:
9
+
10
+ * proposals are partitioned by opaque ``expert_id``;
11
+ * one coverage slot is reserved per expert when the budget permits;
12
+ * residual slots are apportioned by support size using exact D'Hondt
13
+ quotients; and
14
+ * each expert's quota samples the head and deterministic interior rank
15
+ quantiles.
16
+
17
+ The policy sees no objective value, forecast score, workload identity, model
18
+ identity, provider identity, or prompt text. It is intended only for an
19
+ unidentified cold-start block. Once real outcomes exist, a prior-only
20
+ prequential acquisition policy should replace it rather than mix post-treatment
21
+ evidence into this design.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import hashlib
27
+ import json
28
+ import re
29
+ from dataclasses import dataclass, field
30
+ from fractions import Fraction
31
+
32
+ from agent_evolve.application.materialized_action_broker import (
33
+ MaterializedActionDescriptor,
34
+ )
35
+ from agent_evolve.domain.ids import CandidateId
36
+ from agent_evolve.domain.patch import require_sha256
37
+
38
+ STRATIFIED_COLD_START_ALLOCATOR_ID = (
39
+ "support_proportional_rank_stratified_cold_start"
40
+ )
41
+ STRATIFIED_COLD_START_ALLOCATOR_VERSION = 1
42
+ STRATIFIED_COLD_START_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
43
+ b"agent-evolve:support-proportional-rank-stratified-cold-start:v1;"
44
+ b"eligibility=authenticated-unique-materialized-phenotypes;"
45
+ b"lane=opaque-expert-id;"
46
+ b"coverage=floor-one-per-lane-when-capacity-permits;"
47
+ b"partial-coverage=largest-support-first;"
48
+ b"residual-apportionment=exact-dhondt-support-over-quota-plus-one;"
49
+ b"within-lane=head-preserving-floor-j-times-n-over-quota;"
50
+ b"native-rank=within-expert-order-only;"
51
+ b"audited-axes=role,variation-scale,parent,structural-cell;"
52
+ b"outcomes-consulted=false;"
53
+ b"forbidden-inputs=workload-id,model-id,provider-id,objective-name,prompt"
54
+ ).hexdigest()
55
+
56
+ LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_ID = (
57
+ "support_proportional_low_discrepancy_rank_stratified_exploration"
58
+ )
59
+ LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_VERSION = 1
60
+ LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
61
+ b"agent-evolve:support-proportional-low-discrepancy-rank-stratified-"
62
+ b"exploration:v1;"
63
+ b"eligibility=authenticated-unique-materialized-phenotypes;"
64
+ b"lane=opaque-expert-id;"
65
+ b"coverage=floor-one-per-lane-when-capacity-permits;"
66
+ b"partial-coverage=largest-support-first;"
67
+ b"residual-apportionment=exact-dhondt-support-over-quota-plus-one;"
68
+ b"within-lane=deduplicated-base-two-radical-inverse-rank-permutation;"
69
+ b"schedule=contiguous-quota-block-cycled-by-decision-index;"
70
+ b"native-rank=within-expert-order-only;"
71
+ b"audited-axes=role,variation-scale,parent,structural-cell;"
72
+ b"outcomes-consulted=false;"
73
+ b"forbidden-inputs=workload-id,model-id,provider-id,objective-name,prompt"
74
+ ).hexdigest()
75
+
76
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
77
+ _PROPOSAL_DOMAIN = b"agent-evolve:stratified-cold-start-proposal:v1\x00"
78
+ _REQUEST_DOMAIN = b"agent-evolve:stratified-cold-start-request:v1\x00"
79
+ _DECISION_DOMAIN = b"agent-evolve:stratified-cold-start-decision:v1\x00"
80
+
81
+
82
+ def _canonical_bytes(value: object) -> bytes:
83
+ return json.dumps(
84
+ value,
85
+ allow_nan=False,
86
+ ensure_ascii=True,
87
+ separators=(",", ":"),
88
+ sort_keys=True,
89
+ ).encode("ascii", errors="strict")
90
+
91
+
92
+ def _hash(domain: bytes, value: object) -> str:
93
+ return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
94
+
95
+
96
+ def _require_token(value: str, name: str) -> None:
97
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
98
+ raise ValueError(f"{name} must use the closed token grammar")
99
+
100
+
101
+ def _candidate(value: CandidateId, name: str) -> None:
102
+ if type(value) is not CandidateId:
103
+ raise TypeError(f"{name} must contain exact CandidateId values")
104
+ CandidateId.__post_init__(value)
105
+
106
+
107
+ @dataclass(frozen=True, slots=True, eq=False)
108
+ class StratifiedColdStartProposal:
109
+ """Minimal authenticated proposal view required by the cold-start design."""
110
+
111
+ proposal_id: str
112
+ phenotype_identity_sha256: str
113
+ expert_id: str
114
+ native_rank: int
115
+ parent_ids: tuple[CandidateId, ...]
116
+ role_id: str
117
+ variation_scale: int
118
+ structural_cell: str
119
+ proposal_sha256: str = field(init=False)
120
+
121
+ def __post_init__(self) -> None:
122
+ _require_token(self.proposal_id, "proposal_id")
123
+ require_sha256(
124
+ self.phenotype_identity_sha256,
125
+ "phenotype_identity_sha256",
126
+ )
127
+ _require_token(self.expert_id, "expert_id")
128
+ if type(self.native_rank) is not int or self.native_rank <= 0:
129
+ raise ValueError("native_rank must be a positive exact integer")
130
+ if type(self.parent_ids) is not tuple or len(self.parent_ids) > 8:
131
+ raise ValueError(
132
+ "parent_ids must be an exact tuple with arity at most eight"
133
+ )
134
+ for value in self.parent_ids:
135
+ _candidate(value, "parent_ids")
136
+ parent_values = tuple(value.value for value in self.parent_ids)
137
+ if len(parent_values) != len(set(parent_values)):
138
+ raise ValueError("parent_ids must be unique")
139
+ _require_token(self.role_id, "role_id")
140
+ if type(self.variation_scale) is not int or self.variation_scale <= 0:
141
+ raise ValueError("variation_scale must be a positive exact integer")
142
+ _require_token(self.structural_cell, "structural_cell")
143
+ object.__setattr__(
144
+ self,
145
+ "proposal_sha256",
146
+ _hash(_PROPOSAL_DOMAIN, self._unsigned_record()),
147
+ )
148
+
149
+ def _unsigned_record(self) -> dict[str, object]:
150
+ return {
151
+ "schema_version": 1,
152
+ "proposal_id": self.proposal_id,
153
+ "phenotype_identity_sha256": self.phenotype_identity_sha256,
154
+ "expert_id": self.expert_id,
155
+ "native_rank": self.native_rank,
156
+ "parent_ids": [value.value for value in self.parent_ids],
157
+ "parent_arity": len(self.parent_ids),
158
+ "role_id": self.role_id,
159
+ "variation_scale": self.variation_scale,
160
+ "structural_cell": self.structural_cell,
161
+ }
162
+
163
+ def to_record(self) -> dict[str, object]:
164
+ self.__post_init__()
165
+ return {
166
+ **self._unsigned_record(),
167
+ "proposal_sha256": self.proposal_sha256,
168
+ }
169
+
170
+ def __eq__(self, other: object) -> bool:
171
+ return (
172
+ type(other) is StratifiedColdStartProposal
173
+ and self.proposal_sha256 == other.proposal_sha256
174
+ )
175
+
176
+ __hash__ = None
177
+
178
+
179
+ def stratified_proposal_from_materialized_action(
180
+ action: MaterializedActionDescriptor,
181
+ *,
182
+ proposal_id: str,
183
+ variation_scale: int,
184
+ structural_cell: str,
185
+ ) -> StratifiedColdStartProposal:
186
+ """Project the generic materialized-action API onto the cold-start view."""
187
+
188
+ if type(action) is not MaterializedActionDescriptor:
189
+ raise TypeError("action must be an exact MaterializedActionDescriptor")
190
+ action.__post_init__()
191
+ return StratifiedColdStartProposal(
192
+ proposal_id=proposal_id,
193
+ phenotype_identity_sha256=action.phenotype_identity_sha256,
194
+ expert_id=action.expert_id,
195
+ native_rank=action.native_rank,
196
+ parent_ids=action.parent_ids,
197
+ role_id=action.role_id,
198
+ variation_scale=variation_scale,
199
+ structural_cell=structural_cell,
200
+ )
201
+
202
+
203
+ @dataclass(frozen=True, slots=True, eq=False)
204
+ class StratifiedColdStartAllocationRequest:
205
+ """One outcome-blind finite proposal universe and its evaluator capacity."""
206
+
207
+ decision_scope_sha256: str
208
+ decision_index: int
209
+ proposals: tuple[StratifiedColdStartProposal, ...]
210
+ evaluation_slots: int
211
+ request_sha256: str = field(init=False)
212
+
213
+ def __post_init__(self) -> None:
214
+ require_sha256(self.decision_scope_sha256, "decision_scope_sha256")
215
+ if type(self.decision_index) is not int or self.decision_index <= 0:
216
+ raise ValueError("decision_index must be a positive exact integer")
217
+ if type(self.proposals) is not tuple or not self.proposals:
218
+ raise ValueError("proposals must be a non-empty exact tuple")
219
+ for value in self.proposals:
220
+ if type(value) is not StratifiedColdStartProposal:
221
+ raise TypeError("proposals must contain exact proposal views")
222
+ value.__post_init__()
223
+ proposal_ids = tuple(value.proposal_id for value in self.proposals)
224
+ if len(proposal_ids) != len(set(proposal_ids)):
225
+ raise ValueError("proposal_id values must be unique")
226
+ proposal_hashes = tuple(value.proposal_sha256 for value in self.proposals)
227
+ if len(proposal_hashes) != len(set(proposal_hashes)):
228
+ raise ValueError("proposal identities must be unique")
229
+ phenotypes = tuple(
230
+ value.phenotype_identity_sha256 for value in self.proposals
231
+ )
232
+ if len(phenotypes) != len(set(phenotypes)):
233
+ raise ValueError(
234
+ "upstream materialization must collapse duplicate phenotypes"
235
+ )
236
+ if (
237
+ type(self.evaluation_slots) is not int
238
+ or not 1 <= self.evaluation_slots <= len(self.proposals)
239
+ ):
240
+ raise ValueError(
241
+ "evaluation_slots must fit the finite proposal universe"
242
+ )
243
+ object.__setattr__(
244
+ self,
245
+ "request_sha256",
246
+ _hash(_REQUEST_DOMAIN, self._unsigned_record()),
247
+ )
248
+
249
+ @property
250
+ def canonical_proposals(self) -> tuple[StratifiedColdStartProposal, ...]:
251
+ return tuple(sorted(self.proposals, key=lambda value: value.proposal_id))
252
+
253
+ def _unsigned_record(self) -> dict[str, object]:
254
+ return {
255
+ "schema_version": 1,
256
+ "decision_scope_sha256": self.decision_scope_sha256,
257
+ "decision_index": self.decision_index,
258
+ "evaluation_slots": self.evaluation_slots,
259
+ "proposal_sha256s": [
260
+ value.proposal_sha256 for value in self.canonical_proposals
261
+ ],
262
+ "proposal_universe_count": len(self.proposals),
263
+ "outcomes_consulted": False,
264
+ }
265
+
266
+ def to_record(self, *, include_proposals: bool = False) -> dict[str, object]:
267
+ self.__post_init__()
268
+ record = {
269
+ **self._unsigned_record(),
270
+ "request_sha256": self.request_sha256,
271
+ }
272
+ if include_proposals:
273
+ record["proposals"] = [
274
+ value.to_record() for value in self.canonical_proposals
275
+ ]
276
+ return record
277
+
278
+ def __eq__(self, other: object) -> bool:
279
+ return (
280
+ type(other) is StratifiedColdStartAllocationRequest
281
+ and self.request_sha256 == other.request_sha256
282
+ )
283
+
284
+ __hash__ = None
285
+
286
+
287
+ @dataclass(frozen=True, slots=True)
288
+ class StratifiedColdStartLaneAllocation:
289
+ expert_id: str
290
+ support_count: int
291
+ allocated_slots: int
292
+
293
+ def __post_init__(self) -> None:
294
+ _require_token(self.expert_id, "expert_id")
295
+ if type(self.support_count) is not int or self.support_count <= 0:
296
+ raise ValueError("support_count must be a positive exact integer")
297
+ if (
298
+ type(self.allocated_slots) is not int
299
+ or not 0 <= self.allocated_slots <= self.support_count
300
+ ):
301
+ raise ValueError("allocated_slots must fit the expert support")
302
+
303
+ def to_record(self) -> dict[str, object]:
304
+ self.__post_init__()
305
+ return {
306
+ "expert_id": self.expert_id,
307
+ "support_count": self.support_count,
308
+ "allocated_slots": self.allocated_slots,
309
+ }
310
+
311
+
312
+ @dataclass(frozen=True, slots=True)
313
+ class StratifiedColdStartAllocationMember:
314
+ proposal: StratifiedColdStartProposal
315
+ selection_ticket_ordinal: int
316
+ lane_support_count: int
317
+ lane_allocated_slots: int
318
+ lane_quantile_ordinal: int
319
+ target_rank_index: int
320
+ selected_rank_index: int
321
+
322
+ def __post_init__(self) -> None:
323
+ if type(self.proposal) is not StratifiedColdStartProposal:
324
+ raise TypeError("proposal must be an exact proposal view")
325
+ self.proposal.__post_init__()
326
+ for name in (
327
+ "selection_ticket_ordinal",
328
+ "lane_support_count",
329
+ "lane_allocated_slots",
330
+ ):
331
+ value = getattr(self, name)
332
+ if type(value) is not int or value <= 0:
333
+ raise ValueError(f"{name} must be a positive exact integer")
334
+ if self.lane_allocated_slots > self.lane_support_count:
335
+ raise ValueError("lane allocation exceeds its support")
336
+ if (
337
+ type(self.lane_quantile_ordinal) is not int
338
+ or not 0 <= self.lane_quantile_ordinal < self.lane_allocated_slots
339
+ ):
340
+ raise ValueError("lane_quantile_ordinal lies outside its quota")
341
+ for name in ("target_rank_index", "selected_rank_index"):
342
+ value = getattr(self, name)
343
+ if (
344
+ type(value) is not int
345
+ or not 0 <= value < self.lane_support_count
346
+ ):
347
+ raise ValueError(f"{name} lies outside the expert support")
348
+
349
+ def to_record(self) -> dict[str, object]:
350
+ self.__post_init__()
351
+ return {
352
+ "proposal": self.proposal.to_record(),
353
+ "selection_ticket_ordinal": self.selection_ticket_ordinal,
354
+ "lane_support_count": self.lane_support_count,
355
+ "lane_allocated_slots": self.lane_allocated_slots,
356
+ "lane_quantile_ordinal": self.lane_quantile_ordinal,
357
+ "target_rank_index": self.target_rank_index,
358
+ "selected_rank_index": self.selected_rank_index,
359
+ }
360
+
361
+
362
+ @dataclass(frozen=True, slots=True, eq=False)
363
+ class StratifiedColdStartAllocationDecision:
364
+ request_sha256: str
365
+ lanes: tuple[StratifiedColdStartLaneAllocation, ...]
366
+ members: tuple[StratifiedColdStartAllocationMember, ...]
367
+ allocator_id: str = STRATIFIED_COLD_START_ALLOCATOR_ID
368
+ allocator_version: int = STRATIFIED_COLD_START_ALLOCATOR_VERSION
369
+ allocator_definition_sha256: str = (
370
+ STRATIFIED_COLD_START_ALLOCATOR_DEFINITION_SHA256
371
+ )
372
+ decision_sha256: str = field(init=False)
373
+
374
+ def __post_init__(self) -> None:
375
+ require_sha256(self.request_sha256, "request_sha256")
376
+ _require_token(self.allocator_id, "allocator_id")
377
+ if type(self.allocator_version) is not int or self.allocator_version <= 0:
378
+ raise ValueError("allocator_version must be a positive exact integer")
379
+ require_sha256(
380
+ self.allocator_definition_sha256,
381
+ "allocator_definition_sha256",
382
+ )
383
+ if type(self.lanes) is not tuple or not self.lanes:
384
+ raise ValueError("lanes must be a non-empty exact tuple")
385
+ for value in self.lanes:
386
+ if type(value) is not StratifiedColdStartLaneAllocation:
387
+ raise TypeError("lanes must contain exact lane allocations")
388
+ value.__post_init__()
389
+ if tuple(value.expert_id for value in self.lanes) != tuple(
390
+ sorted(value.expert_id for value in self.lanes)
391
+ ):
392
+ raise ValueError("lanes must use canonical expert order")
393
+ if type(self.members) is not tuple or not self.members:
394
+ raise ValueError("members must be a non-empty exact tuple")
395
+ for value in self.members:
396
+ if type(value) is not StratifiedColdStartAllocationMember:
397
+ raise TypeError("members must contain exact allocation members")
398
+ value.__post_init__()
399
+ if tuple(value.selection_ticket_ordinal for value in self.members) != tuple(
400
+ range(1, len(self.members) + 1)
401
+ ):
402
+ raise ValueError("member ticket ordinals must be contiguous")
403
+ if len(
404
+ {value.proposal.phenotype_identity_sha256 for value in self.members}
405
+ ) != len(self.members):
406
+ raise ValueError("selected members must have unique phenotypes")
407
+ lane_by_id = {value.expert_id: value for value in self.lanes}
408
+ selected_by_lane: dict[str, int] = {}
409
+ for member in self.members:
410
+ lane = lane_by_id.get(member.proposal.expert_id)
411
+ if lane is None:
412
+ raise ValueError("selected member names an absent expert lane")
413
+ if (
414
+ member.lane_support_count != lane.support_count
415
+ or member.lane_allocated_slots != lane.allocated_slots
416
+ ):
417
+ raise ValueError("member and lane allocation evidence disagree")
418
+ selected_by_lane[member.proposal.expert_id] = (
419
+ selected_by_lane.get(member.proposal.expert_id, 0) + 1
420
+ )
421
+ if any(
422
+ selected_by_lane.get(value.expert_id, 0) != value.allocated_slots
423
+ for value in self.lanes
424
+ ):
425
+ raise ValueError("selected members do not close the lane quotas")
426
+ object.__setattr__(
427
+ self,
428
+ "decision_sha256",
429
+ _hash(_DECISION_DOMAIN, self._unsigned_record()),
430
+ )
431
+
432
+ @property
433
+ def selected_proposal_ids(self) -> tuple[str, ...]:
434
+ return tuple(value.proposal.proposal_id for value in self.members)
435
+
436
+ def _coverage_record(self) -> dict[str, object]:
437
+ parents = {
438
+ parent.value
439
+ for value in self.members
440
+ for parent in value.proposal.parent_ids
441
+ }
442
+ return {
443
+ "selected_expert_count": len(
444
+ {value.proposal.expert_id for value in self.members}
445
+ ),
446
+ "selected_role_count": len(
447
+ {value.proposal.role_id for value in self.members}
448
+ ),
449
+ "selected_variation_scale_count": len(
450
+ {value.proposal.variation_scale for value in self.members}
451
+ ),
452
+ "selected_parent_count": len(parents),
453
+ "selected_structural_cell_count": len(
454
+ {value.proposal.structural_cell for value in self.members}
455
+ ),
456
+ }
457
+
458
+ def _unsigned_record(self) -> dict[str, object]:
459
+ return {
460
+ "schema_version": 1,
461
+ "allocator": {
462
+ "allocator_id": self.allocator_id,
463
+ "allocator_version": self.allocator_version,
464
+ "definition_sha256": self.allocator_definition_sha256,
465
+ },
466
+ "request_sha256": self.request_sha256,
467
+ "lanes": [value.to_record() for value in self.lanes],
468
+ "members": [value.to_record() for value in self.members],
469
+ "coverage": self._coverage_record(),
470
+ "outcomes_consulted": False,
471
+ }
472
+
473
+ def to_record(self) -> dict[str, object]:
474
+ self.__post_init__()
475
+ return {
476
+ **self._unsigned_record(),
477
+ "decision_sha256": self.decision_sha256,
478
+ }
479
+
480
+ def __eq__(self, other: object) -> bool:
481
+ return (
482
+ type(other) is StratifiedColdStartAllocationDecision
483
+ and self.decision_sha256 == other.decision_sha256
484
+ )
485
+
486
+ __hash__ = None
487
+
488
+
489
+ @dataclass(frozen=True, slots=True)
490
+ class SupportProportionalStratifiedColdStartAllocator:
491
+ """Allocate a cold-start evaluator block without comparing expert scores."""
492
+
493
+ def _lanes(
494
+ self,
495
+ request: StratifiedColdStartAllocationRequest,
496
+ ) -> dict[str, tuple[StratifiedColdStartProposal, ...]]:
497
+ grouped: dict[str, list[StratifiedColdStartProposal]] = {}
498
+ for proposal in request.canonical_proposals:
499
+ grouped.setdefault(proposal.expert_id, []).append(proposal)
500
+ return {
501
+ expert_id: tuple(
502
+ sorted(values, key=lambda value: (value.native_rank, value.proposal_id))
503
+ )
504
+ for expert_id, values in grouped.items()
505
+ }
506
+
507
+ @staticmethod
508
+ def _quotas(
509
+ lanes: dict[str, tuple[StratifiedColdStartProposal, ...]],
510
+ slots: int,
511
+ ) -> dict[str, int]:
512
+ support = {key: len(value) for key, value in lanes.items()}
513
+ quotas = {key: 0 for key in lanes}
514
+ ordered_by_support = tuple(
515
+ sorted(lanes, key=lambda key: (-support[key], key))
516
+ )
517
+
518
+ # A complete coverage floor is possible only when every lane can
519
+ # receive one evaluation. Under a smaller budget, retain the largest
520
+ # authenticated supports rather than invent incomparable expert scores.
521
+ initial = (
522
+ tuple(sorted(lanes))
523
+ if slots >= len(lanes)
524
+ else ordered_by_support[:slots]
525
+ )
526
+ for key in initial:
527
+ quotas[key] = 1
528
+
529
+ remaining = slots - len(initial)
530
+ while remaining:
531
+ eligible = tuple(
532
+ key for key in lanes if quotas[key] < support[key]
533
+ )
534
+ if not eligible: # pragma: no cover - request capacity prevents it.
535
+ raise AssertionError("stratified quota capacity unexpectedly exhausted")
536
+ selected = min(
537
+ eligible,
538
+ key=lambda key: (
539
+ -Fraction(support[key], quotas[key] + 1),
540
+ -support[key],
541
+ key,
542
+ ),
543
+ )
544
+ quotas[selected] += 1
545
+ remaining -= 1
546
+ return quotas
547
+
548
+ def select(
549
+ self,
550
+ request: StratifiedColdStartAllocationRequest,
551
+ ) -> StratifiedColdStartAllocationDecision:
552
+ if type(request) is not StratifiedColdStartAllocationRequest:
553
+ raise TypeError(
554
+ "request must be an exact StratifiedColdStartAllocationRequest"
555
+ )
556
+ request.__post_init__()
557
+ lanes = self._lanes(request)
558
+ quotas = self._quotas(lanes, request.evaluation_slots)
559
+ lane_priority = tuple(
560
+ sorted(lanes, key=lambda key: (-len(lanes[key]), key))
561
+ )
562
+
563
+ members: list[StratifiedColdStartAllocationMember] = []
564
+ maximum_quota = max(quotas.values())
565
+ for quantile_ordinal in range(maximum_quota):
566
+ for expert_id in lane_priority:
567
+ quota = quotas[expert_id]
568
+ if quantile_ordinal >= quota:
569
+ continue
570
+ lane = lanes[expert_id]
571
+ target_index = (quantile_ordinal * len(lane)) // quota
572
+ proposal = lane[target_index]
573
+ members.append(
574
+ StratifiedColdStartAllocationMember(
575
+ proposal=proposal,
576
+ selection_ticket_ordinal=len(members) + 1,
577
+ lane_support_count=len(lane),
578
+ lane_allocated_slots=quota,
579
+ lane_quantile_ordinal=quantile_ordinal,
580
+ target_rank_index=target_index,
581
+ selected_rank_index=target_index,
582
+ )
583
+ )
584
+
585
+ if len(members) != request.evaluation_slots:
586
+ raise AssertionError("selected member count does not close capacity")
587
+ lane_records = tuple(
588
+ StratifiedColdStartLaneAllocation(
589
+ expert_id=expert_id,
590
+ support_count=len(lanes[expert_id]),
591
+ allocated_slots=quotas[expert_id],
592
+ )
593
+ for expert_id in sorted(lanes)
594
+ )
595
+ return StratifiedColdStartAllocationDecision(
596
+ request_sha256=request.request_sha256,
597
+ lanes=lane_records,
598
+ members=tuple(members),
599
+ )
600
+
601
+
602
+ def _base_two_low_discrepancy_rank_permutation(size: int) -> tuple[int, ...]:
603
+ """Return a head-first, progressively space-filling rank permutation."""
604
+
605
+ if type(size) is not int or size <= 0:
606
+ raise ValueError("size must be a positive exact integer")
607
+ selected: list[int] = []
608
+ selected_set: set[int] = set()
609
+ sequence_index = 0
610
+ while len(selected) < size:
611
+ value = sequence_index
612
+ numerator = 0
613
+ denominator = 1
614
+ while value:
615
+ denominator *= 2
616
+ numerator = 2 * numerator + (value & 1)
617
+ value >>= 1
618
+ rank_index = (numerator * size) // denominator
619
+ if rank_index not in selected_set:
620
+ selected.append(rank_index)
621
+ selected_set.add(rank_index)
622
+ sequence_index += 1
623
+ return tuple(selected)
624
+
625
+
626
+ @dataclass(frozen=True, slots=True)
627
+ class SupportProportionalLowDiscrepancyStratifiedAllocator(
628
+ SupportProportionalStratifiedColdStartAllocator
629
+ ):
630
+ """Cycle rank strata across decisions without consulting outcomes.
631
+
632
+ Decision one reproduces the head-plus-interior behavior of the original
633
+ cold-start policy. Later decisions consume the next contiguous block of a
634
+ base-two low-discrepancy permutation. For a six-member lane with one slot,
635
+ the rank schedule is 1, 4, 2, 5, 3, 6. With two slots it is
636
+ (1, 4), (2, 5), (3, 6). The schedule is exact, deterministic, and closes
637
+ every finite rank stratum before repeating.
638
+ """
639
+
640
+ def select(
641
+ self,
642
+ request: StratifiedColdStartAllocationRequest,
643
+ ) -> StratifiedColdStartAllocationDecision:
644
+ if type(request) is not StratifiedColdStartAllocationRequest:
645
+ raise TypeError(
646
+ "request must be an exact StratifiedColdStartAllocationRequest"
647
+ )
648
+ request.__post_init__()
649
+ lanes = self._lanes(request)
650
+ quotas = self._quotas(lanes, request.evaluation_slots)
651
+ lane_priority = tuple(
652
+ sorted(lanes, key=lambda key: (-len(lanes[key]), key))
653
+ )
654
+
655
+ members: list[StratifiedColdStartAllocationMember] = []
656
+ maximum_quota = max(quotas.values())
657
+ selected_by_lane: dict[
658
+ str, tuple[tuple[int, StratifiedColdStartProposal], ...]
659
+ ] = {}
660
+ for expert_id, lane in lanes.items():
661
+ quota = quotas[expert_id]
662
+ if quota == 0:
663
+ selected_by_lane[expert_id] = ()
664
+ continue
665
+ permutation = _base_two_low_discrepancy_rank_permutation(len(lane))
666
+ offset = ((request.decision_index - 1) * quota) % len(lane)
667
+ selected_by_lane[expert_id] = tuple(
668
+ (
669
+ permutation[(offset + ordinal) % len(lane)],
670
+ lane[permutation[(offset + ordinal) % len(lane)]],
671
+ )
672
+ for ordinal in range(quota)
673
+ )
674
+
675
+ for rank_schedule_ordinal in range(maximum_quota):
676
+ for expert_id in lane_priority:
677
+ quota = quotas[expert_id]
678
+ if rank_schedule_ordinal >= quota:
679
+ continue
680
+ selected_index, proposal = selected_by_lane[expert_id][
681
+ rank_schedule_ordinal
682
+ ]
683
+ members.append(
684
+ StratifiedColdStartAllocationMember(
685
+ proposal=proposal,
686
+ selection_ticket_ordinal=len(members) + 1,
687
+ lane_support_count=len(lanes[expert_id]),
688
+ lane_allocated_slots=quota,
689
+ lane_quantile_ordinal=rank_schedule_ordinal,
690
+ target_rank_index=selected_index,
691
+ selected_rank_index=selected_index,
692
+ )
693
+ )
694
+
695
+ if len(members) != request.evaluation_slots:
696
+ raise AssertionError("selected member count does not close capacity")
697
+ lane_records = tuple(
698
+ StratifiedColdStartLaneAllocation(
699
+ expert_id=expert_id,
700
+ support_count=len(lanes[expert_id]),
701
+ allocated_slots=quotas[expert_id],
702
+ )
703
+ for expert_id in sorted(lanes)
704
+ )
705
+ return StratifiedColdStartAllocationDecision(
706
+ request_sha256=request.request_sha256,
707
+ lanes=lane_records,
708
+ members=tuple(members),
709
+ allocator_id=LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_ID,
710
+ allocator_version=LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_VERSION,
711
+ allocator_definition_sha256=(
712
+ LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_DEFINITION_SHA256
713
+ ),
714
+ )
715
+
716
+
717
+ __all__ = [
718
+ "LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_DEFINITION_SHA256",
719
+ "LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_ID",
720
+ "LOW_DISCREPANCY_STRATIFIED_ALLOCATOR_VERSION",
721
+ "STRATIFIED_COLD_START_ALLOCATOR_DEFINITION_SHA256",
722
+ "STRATIFIED_COLD_START_ALLOCATOR_ID",
723
+ "STRATIFIED_COLD_START_ALLOCATOR_VERSION",
724
+ "StratifiedColdStartAllocationDecision",
725
+ "StratifiedColdStartAllocationMember",
726
+ "StratifiedColdStartAllocationRequest",
727
+ "StratifiedColdStartLaneAllocation",
728
+ "StratifiedColdStartProposal",
729
+ "SupportProportionalLowDiscrepancyStratifiedAllocator",
730
+ "SupportProportionalStratifiedColdStartAllocator",
731
+ "stratified_proposal_from_materialized_action",
732
+ ]