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,108 @@
1
+ """Idempotent integration loading: in-tree proposers + setuptools entry points.
2
+
3
+ The core never imports ``integrations``; this module (the composition root)
4
+ does, once per process. Out-of-tree integrations advertise themselves through
5
+ the ``agent_evolve.integrations`` entry-point group.
6
+
7
+ A failed optional integration must not stop the others loading, but it must not
8
+ vanish either: the reason is kept and re-reported when someone asks for a
9
+ harness that failed to register. Swallowing it produced ``Unknown harness
10
+ 'pydantic_ai'. Registered: []`` as the only symptom of a broken install.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import importlib
16
+ import importlib.util
17
+ from typing import Dict, Optional
18
+
19
+ from agent_evolve.harness.registry import harness_registry
20
+ from agent_evolve.proposers.random_proposer import RandomProposer
21
+
22
+ _INTREE = ("agent_evolve.integrations.pydantic_ai",)
23
+
24
+ _loaded = False
25
+
26
+ #: Import failures, kept so a missing harness can explain itself.
27
+ load_failures: Dict[str, str] = {}
28
+
29
+
30
+ def _register_builtin() -> None:
31
+ """Register proposers that have no optional dependencies."""
32
+ try:
33
+ harness_registry.create("random")
34
+ except KeyError:
35
+ harness_registry.register("random", RandomProposer)
36
+
37
+
38
+ _register_builtin()
39
+
40
+
41
+ #: Harness id -> the third-party distribution it cannot work without, and the
42
+ #: extra that installs it. An adapter that imports its provider lazily still
43
+ #: registers successfully without it, and then fails deep inside the first
44
+ #: model call with a bare ModuleNotFoundError. Checking here turns that into
45
+ #: one sentence naming the install command.
46
+ _REQUIRES = {
47
+ "pydantic_ai": ("pydantic_ai", "agentevolve-optimizer[llm]"),
48
+ }
49
+
50
+
51
+ def load_integrations() -> None:
52
+ """Import in-tree integrations and any registered via entry points (once)."""
53
+ global _loaded
54
+ if _loaded:
55
+ return
56
+ _loaded = True
57
+ _register_builtin()
58
+ for module in _INTREE:
59
+ try:
60
+ importlib.import_module(module)
61
+ except Exception as exc: # noqa: BLE001 - recorded, then reported on use
62
+ load_failures[module] = f"{type(exc).__name__}: {exc}"
63
+ _load_entry_points()
64
+ _check_lazy_requirements()
65
+
66
+
67
+ def _check_lazy_requirements() -> None:
68
+ """Record harnesses whose provider package is not installed."""
69
+ for harness_id, (dist, extra) in _REQUIRES.items():
70
+ if harness_id not in harness_registry.ids():
71
+ continue
72
+ if importlib.util.find_spec(dist) is None:
73
+ load_failures[harness_id] = (
74
+ f"needs {dist}, which is not installed; pip install '{extra}'"
75
+ )
76
+
77
+
78
+ def requirement_failure(harness_id: str) -> Optional[str]:
79
+ """Return why *harness_id* cannot run, or ``None`` when it can."""
80
+ return load_failures.get(harness_id)
81
+
82
+
83
+ def _load_entry_points() -> None:
84
+ try:
85
+ from importlib.metadata import entry_points
86
+ except Exception:
87
+ return
88
+ try:
89
+ eps = entry_points(group="agent_evolve.integrations")
90
+ except TypeError:
91
+ eps = entry_points().get("agent_evolve.integrations", []) # py<3.10 shim
92
+ for ep in eps:
93
+ try:
94
+ ep.load()
95
+ except Exception as exc: # noqa: BLE001 - recorded, then reported on use
96
+ load_failures[getattr(ep, "name", str(ep))] = f"{type(exc).__name__}: {exc}"
97
+
98
+
99
+ def explain_missing_harness(harness_id: str) -> str:
100
+ """Return a usable message for a harness that is not registered."""
101
+ known = sorted(harness_registry.ids()) if hasattr(harness_registry, "ids") else []
102
+ if not load_failures:
103
+ return f"Unknown proposer {harness_id!r}. Available: {known}."
104
+ reasons = "; ".join(f"{name} failed to load ({why})" for name, why in load_failures.items())
105
+ return (
106
+ f"Unknown proposer {harness_id!r}. Available: {known}. {reasons}. "
107
+ "Install the optional dependency, e.g. pip install 'agentevolve-optimizer[llm]'."
108
+ )
@@ -0,0 +1,517 @@
1
+ """Workload-neutral high-level campaign presets.
2
+
3
+ This module owns generational shape, delayed reflection chronology, exact
4
+ budgets, and concurrency. Workload adapters remain in ``WorkloadKit`` while
5
+ method implementations remain injectable as ``PortfolioCampaignBehavior``.
6
+ The split prevents a domain package from copying a thousand-line launcher just
7
+ to change seeds, an evaluator, or static prompt semantics.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import re
15
+ from dataclasses import dataclass
16
+
17
+ from agent_evolve.application.budgeted_optimizer import OptimizerBudget
18
+ from agent_evolve.application.evolution_campaign import (
19
+ ArchiveUtilityPort,
20
+ CampaignAgentRuntimePort,
21
+ CampaignConcurrency,
22
+ CampaignJournalPort,
23
+ CampaignPolicies,
24
+ CampaignPolicyBinding,
25
+ CampaignProtocol,
26
+ CampaignReflectionSupervisionPolicy,
27
+ EvolutionCampaign,
28
+ SealedCutoffDelayedAdmissionCadence,
29
+ TerminalReflectionPolicy,
30
+ )
31
+ from agent_evolve.campaign_workload import AgenticCampaignWorkloadConfig
32
+ from agent_evolve.workload_kit import WorkloadKit
33
+
34
+
35
+ _PRESET_DEFINITION_DOMAIN = b"agent-evolve:delayed-portfolio-preset:v1\x00"
36
+ _SCALE_SHAPE_DOMAIN = b"agent-evolve:portfolio-scale-shape:v1\x00"
37
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_]{0,95}$")
38
+
39
+
40
+ def _canonical_bytes(value: object) -> bytes:
41
+ return json.dumps(
42
+ value,
43
+ allow_nan=False,
44
+ ensure_ascii=True,
45
+ separators=(",", ":"),
46
+ sort_keys=True,
47
+ ).encode("ascii", errors="strict")
48
+
49
+
50
+ def _hash(domain: bytes, value: object) -> str:
51
+ return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
52
+
53
+
54
+ @dataclass(frozen=True, slots=True)
55
+ class PortfolioScaleShape:
56
+ """One workload-neutral depth/width/operator opportunity shape."""
57
+
58
+ shape_id: str
59
+ generation_count: int
60
+ parents_per_portfolio_generation: int
61
+ portfolio_width: int
62
+ recombinations_per_parent: int
63
+
64
+ def __post_init__(self) -> None:
65
+ if type(self.shape_id) is not str or _TOKEN.fullmatch(self.shape_id) is None:
66
+ raise ValueError("shape_id must use the closed lowercase token grammar")
67
+ if (
68
+ type(self.generation_count) is not int
69
+ or not 3 <= self.generation_count <= 24
70
+ ):
71
+ raise ValueError("generation_count must lie in [3, 24]")
72
+ for name in (
73
+ "parents_per_portfolio_generation",
74
+ "portfolio_width",
75
+ "recombinations_per_parent",
76
+ ):
77
+ value = getattr(self, name)
78
+ if type(value) is not int or value <= 0:
79
+ raise ValueError(f"{name} must be a positive exact integer")
80
+ if self.portfolio_width < 2:
81
+ raise ValueError("portfolio_width must be at least two")
82
+
83
+ @property
84
+ def portfolio_generation_count(self) -> int:
85
+ self.__post_init__()
86
+ return (self.generation_count + 1) // 2
87
+
88
+ @property
89
+ def recombination_generation_count(self) -> int:
90
+ self.__post_init__()
91
+ return self.generation_count // 2
92
+
93
+ @property
94
+ def planned_offspring_occurrences(self) -> int:
95
+ self.__post_init__()
96
+ return self.parents_per_portfolio_generation * (
97
+ self.portfolio_generation_count * self.portfolio_width
98
+ + self.recombination_generation_count * self.recombinations_per_parent
99
+ )
100
+
101
+ def to_record(self) -> dict[str, object]:
102
+ self.__post_init__()
103
+ return {
104
+ "schema_version": 1,
105
+ "shape_id": self.shape_id,
106
+ "generation_count": self.generation_count,
107
+ "parents_per_portfolio_generation": (
108
+ self.parents_per_portfolio_generation
109
+ ),
110
+ "portfolio_width": self.portfolio_width,
111
+ "recombinations_per_parent": self.recombinations_per_parent,
112
+ "portfolio_generation_count": self.portfolio_generation_count,
113
+ "recombination_generation_count": self.recombination_generation_count,
114
+ "planned_offspring_occurrences": self.planned_offspring_occurrences,
115
+ }
116
+
117
+ @property
118
+ def definition_sha256(self) -> str:
119
+ return _hash(_SCALE_SHAPE_DOMAIN, self.to_record())
120
+
121
+
122
+ EQUAL_60_OFFSPRING_SCALE_SHAPES = {
123
+ value.shape_id: value
124
+ for value in (
125
+ # The agentic selector has an authenticated support width of eight.
126
+ # Keep every equal-budget treatment inside that generic interface and
127
+ # shift the short-run opportunity into recombination instead of asking
128
+ # one call for an impossible fourteen-candidate portfolio.
129
+ PortfolioScaleShape("g4_k8_r7", 4, 2, 8, 7),
130
+ PortfolioScaleShape("g6_k8_r2", 6, 2, 8, 2),
131
+ PortfolioScaleShape("g10_k4_r2", 10, 2, 4, 2),
132
+ )
133
+ }
134
+
135
+
136
+ # Equal-budget B38 shapes. The two campaign seeds are outside the 36
137
+ # offspring opportunities. Keeping the alternatives in one workload-neutral
138
+ # registry prevents benchmark runners from silently rebuilding different
139
+ # schedules with local constants.
140
+ #
141
+ # ``g6_k5_r1`` is the anchor-heavy successor: for two parent lanes it preserves
142
+ # the reference shape's eighteen semantic portfolio positions, doubles the
143
+ # capacity available to a four-member protected numerical batch (six to twelve
144
+ # evaluated positions over the campaign), and halves compulsory
145
+ # recombination from twelve to six positions. It changes allocation
146
+ # opportunity, not the total real-evaluation budget.
147
+ EQUAL_36_OFFSPRING_SCALE_SHAPES = {
148
+ value.shape_id: value
149
+ for value in (
150
+ PortfolioScaleShape("g6_k4_r2", 6, 2, 4, 2),
151
+ PortfolioScaleShape("g6_k5_r1", 6, 2, 5, 1),
152
+ )
153
+ }
154
+
155
+
156
+ # Truthfully separate near-reference-budget successors from the exactly B38
157
+ # registry. Both successors stay inside the already-qualified K8-to-K4
158
+ # selector. ``g6_k4_r1`` is a B32 screening rung (24 portfolio + 6
159
+ # recombination occurrences); ``g7_k4_r1`` is the B40 expansion rung (32 + 6).
160
+ SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES = {
161
+ **EQUAL_36_OFFSPRING_SCALE_SHAPES,
162
+ "g6_k4_r1": PortfolioScaleShape("g6_k4_r1", 6, 2, 4, 1),
163
+ "g7_k4_r1": PortfolioScaleShape("g7_k4_r1", 7, 2, 4, 1),
164
+ }
165
+
166
+
167
+ # Anytime-curve rungs. Everything above is a near-reference budget, so until
168
+ # now the largest expressible campaign was B40 -- and that was a **registry
169
+ # cap, not a design choice**. It is the reason every number this project holds
170
+ # sits at B=38: a claim about evaluation efficiency is a claim about a curve,
171
+ # and no curve past B40 could be expressed at all.
172
+ #
173
+ # These rungs are additions. No entry above is modified, so nothing in flight
174
+ # changes shape underneath it; a run selects by ``shape_id`` and every existing
175
+ # id still resolves to exactly the shape it did before.
176
+ #
177
+ # Budget, from ``planned_offspring_occurrences``:
178
+ # P * (ceil(G/2) * K + floor(G/2) * R) plus the two benchmark seeds
179
+ #
180
+ # ``g24_k17_r8`` is the classical-matched rung: 600 offspring + 2 seeds = 602
181
+ # charged occurrences, matching the sealed classical anytime arms' budget of
182
+ # 600 so our curve and NSGA-II's are read on the same axis. It preserves the
183
+ # reference rung's 2:1 portfolio-to-recombination balance (g6_k4_r2 is K=4,
184
+ # R=2), so it is the same method run longer rather than a different one.
185
+ # ``g12_k8_r4`` is the same balance at 144 + 2 = 146, a cheaper rung for
186
+ # smoking the path before the full curve is bought.
187
+ #
188
+ # ``generation_count`` is independently capped at 24 by ``PortfolioScaleShape``
189
+ # validation, so depth alone cannot reach 600; these rungs buy the remaining
190
+ # budget in width, which is why K is large rather than G.
191
+ ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES = {
192
+ value.shape_id: value
193
+ for value in (
194
+ PortfolioScaleShape("g12_k8_r4", 12, 2, 8, 4),
195
+ PortfolioScaleShape("g24_k17_r8", 24, 2, 17, 8),
196
+ )
197
+ }
198
+
199
+
200
+ #: Every registered shape, small-budget and anytime-curve alike. Lookups that
201
+ #: want the full set use this; the two registries above stay exactly as they
202
+ #: were for any caller that deliberately wants only the near-reference rungs.
203
+ CAMPAIGN_SCALE_SHAPES = {
204
+ **SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES,
205
+ **ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES,
206
+ }
207
+
208
+
209
+ CLASSICAL_MATCHED_B602_SCALE_SHAPE = ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES[
210
+ "g24_k17_r8"
211
+ ]
212
+ ANYTIME_SMOKE_B146_SCALE_SHAPE = ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES[
213
+ "g12_k8_r4"
214
+ ]
215
+ REFERENCE_36_OFFSPRING_SCALE_SHAPE = EQUAL_36_OFFSPRING_SCALE_SHAPES[
216
+ "g6_k4_r2"
217
+ ]
218
+ ANCHOR_HEAVY_36_OFFSPRING_SCALE_SHAPE = EQUAL_36_OFFSPRING_SCALE_SHAPES[
219
+ "g6_k5_r1"
220
+ ]
221
+ REFERENCE_HEAVY_B40_SCALE_SHAPE = SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES[
222
+ "g7_k4_r1"
223
+ ]
224
+ REFERENCE_HEAVY_B32_SCALE_SHAPE = SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES[
225
+ "g6_k4_r1"
226
+ ]
227
+
228
+
229
+ @dataclass(frozen=True, slots=True)
230
+ class PortfolioCampaignBehavior:
231
+ """Method-owned collaborators, deliberately separate from a workload."""
232
+
233
+ parent_selection: CampaignPolicyBinding
234
+ memory_assignment: CampaignPolicyBinding
235
+ portfolio_selection: CampaignPolicyBinding
236
+ recombination: CampaignPolicyBinding
237
+ reflection: CampaignPolicyBinding
238
+ archive_utility: ArchiveUtilityPort
239
+ reflection_supervision: CampaignReflectionSupervisionPolicy = (
240
+ CampaignReflectionSupervisionPolicy()
241
+ )
242
+
243
+ def __post_init__(self) -> None:
244
+ for name in (
245
+ "parent_selection",
246
+ "memory_assignment",
247
+ "portfolio_selection",
248
+ "recombination",
249
+ "reflection",
250
+ ):
251
+ value = getattr(self, name)
252
+ if type(value) is not CampaignPolicyBinding:
253
+ raise TypeError(f"{name} must be an exact CampaignPolicyBinding")
254
+ CampaignPolicyBinding.__post_init__(value)
255
+ if not isinstance(self.archive_utility, ArchiveUtilityPort):
256
+ raise TypeError("archive_utility must implement ArchiveUtilityPort")
257
+ if type(self.reflection_supervision) is not (
258
+ CampaignReflectionSupervisionPolicy
259
+ ):
260
+ raise TypeError(
261
+ "reflection_supervision must be exact "
262
+ "CampaignReflectionSupervisionPolicy"
263
+ )
264
+ CampaignReflectionSupervisionPolicy.__post_init__(
265
+ self.reflection_supervision
266
+ )
267
+
268
+ @classmethod
269
+ def from_campaign_policies(
270
+ cls,
271
+ policies: CampaignPolicies,
272
+ ) -> "PortfolioCampaignBehavior":
273
+ """Migrate an existing strict policy bundle without changing identity."""
274
+
275
+ if type(policies) is not CampaignPolicies:
276
+ raise TypeError("policies must be an exact CampaignPolicies")
277
+ CampaignPolicies.__post_init__(policies)
278
+ return cls(
279
+ parent_selection=policies.parent_selection,
280
+ memory_assignment=policies.memory_assignment,
281
+ portfolio_selection=policies.portfolio_selection,
282
+ recombination=policies.recombination,
283
+ reflection=policies.reflection,
284
+ archive_utility=policies.archive_utility,
285
+ reflection_supervision=policies.reflection_supervision,
286
+ )
287
+
288
+ def bind(self) -> CampaignPolicies:
289
+ """Bind this behavior to the preset's sealed delayed cadence."""
290
+
291
+ self.__post_init__()
292
+ return CampaignPolicies(
293
+ cadence=SealedCutoffDelayedAdmissionCadence(),
294
+ parent_selection=self.parent_selection,
295
+ memory_assignment=self.memory_assignment,
296
+ portfolio_selection=self.portfolio_selection,
297
+ recombination=self.recombination,
298
+ reflection=self.reflection,
299
+ archive_utility=self.archive_utility,
300
+ reflection_supervision=self.reflection_supervision,
301
+ )
302
+
303
+
304
+ @dataclass(frozen=True, slots=True)
305
+ class DelayedPortfolioCampaignPreset:
306
+ """Exact P/R campaign plan with useful, delayed, quarantined reflection."""
307
+
308
+ generation_count: int
309
+ outer_seed: int
310
+ parents_per_portfolio_generation: int = 2
311
+ portfolio_width: int = 4
312
+ recombinations_per_parent: int = 2
313
+ evaluator_concurrency: int = 1
314
+ agent_concurrency: int = 3
315
+ agent_queue_capacity: int = 8
316
+
317
+ def __post_init__(self) -> None:
318
+ if type(self.generation_count) is not int or not 3 <= self.generation_count <= 24:
319
+ raise ValueError("generation_count must lie in [3, 24]")
320
+ if type(self.outer_seed) is not int or not -(1 << 127) <= self.outer_seed < (
321
+ 1 << 127
322
+ ):
323
+ raise ValueError("outer_seed must be an exact signed int128")
324
+ for name in (
325
+ "parents_per_portfolio_generation",
326
+ "recombinations_per_parent",
327
+ "evaluator_concurrency",
328
+ "agent_concurrency",
329
+ ):
330
+ value = getattr(self, name)
331
+ if type(value) is not int or value <= 0:
332
+ raise ValueError(f"{name} must be a positive exact integer")
333
+ if type(self.portfolio_width) is not int or self.portfolio_width < 2:
334
+ raise ValueError("portfolio_width must be at least two")
335
+ if (
336
+ type(self.agent_queue_capacity) is not int
337
+ or self.agent_queue_capacity < self.agent_concurrency
338
+ ):
339
+ raise ValueError("agent_queue_capacity must cover agent_concurrency")
340
+
341
+ @classmethod
342
+ def generations(
343
+ cls,
344
+ generation_count: int,
345
+ *,
346
+ outer_seed: int,
347
+ parents_per_portfolio_generation: int = 2,
348
+ portfolio_width: int = 4,
349
+ recombinations_per_parent: int = 2,
350
+ evaluator_concurrency: int = 1,
351
+ agent_concurrency: int = 3,
352
+ agent_queue_capacity: int = 8,
353
+ ) -> "DelayedPortfolioCampaignPreset":
354
+ """Readable public constructor used by experiment manifests."""
355
+
356
+ return cls(
357
+ generation_count=generation_count,
358
+ outer_seed=outer_seed,
359
+ parents_per_portfolio_generation=parents_per_portfolio_generation,
360
+ portfolio_width=portfolio_width,
361
+ recombinations_per_parent=recombinations_per_parent,
362
+ evaluator_concurrency=evaluator_concurrency,
363
+ agent_concurrency=agent_concurrency,
364
+ agent_queue_capacity=agent_queue_capacity,
365
+ )
366
+
367
+ @classmethod
368
+ def scale_shape(
369
+ cls,
370
+ shape: PortfolioScaleShape,
371
+ *,
372
+ outer_seed: int,
373
+ evaluator_concurrency: int = 1,
374
+ agent_concurrency: int = 3,
375
+ agent_queue_capacity: int = 8,
376
+ ) -> "DelayedPortfolioCampaignPreset":
377
+ """Construct a preset from one authenticated experimental shape."""
378
+
379
+ if type(shape) is not PortfolioScaleShape:
380
+ raise TypeError("shape must be an exact PortfolioScaleShape")
381
+ shape.__post_init__()
382
+ return cls.generations(
383
+ shape.generation_count,
384
+ outer_seed=outer_seed,
385
+ parents_per_portfolio_generation=(
386
+ shape.parents_per_portfolio_generation
387
+ ),
388
+ portfolio_width=shape.portfolio_width,
389
+ recombinations_per_parent=shape.recombinations_per_parent,
390
+ evaluator_concurrency=evaluator_concurrency,
391
+ agent_concurrency=agent_concurrency,
392
+ agent_queue_capacity=agent_queue_capacity,
393
+ )
394
+
395
+ def to_record(self) -> dict[str, object]:
396
+ self.__post_init__()
397
+ return {
398
+ "schema_version": 1,
399
+ "preset_id": "sealed_cutoff_delayed_portfolio",
400
+ "preset_version": 1,
401
+ "generation_count": self.generation_count,
402
+ "parents_per_portfolio_generation": (
403
+ self.parents_per_portfolio_generation
404
+ ),
405
+ "portfolio_width": self.portfolio_width,
406
+ "recombinations_per_parent": self.recombinations_per_parent,
407
+ "reflections_per_recombination_generation": 1,
408
+ "reflection_promotion_block_pairs": 1,
409
+ "terminal_reflection_policy": (
410
+ TerminalReflectionPolicy.REQUIRE_FUTURE_PORTFOLIO_CONSUMER.value
411
+ ),
412
+ "evaluator_concurrency": self.evaluator_concurrency,
413
+ "agent_concurrency": self.agent_concurrency,
414
+ "agent_queue_capacity": self.agent_queue_capacity,
415
+ }
416
+
417
+ @property
418
+ def definition_sha256(self) -> str:
419
+ return _hash(_PRESET_DEFINITION_DOMAIN, self.to_record())
420
+
421
+ def protocol(self, *, required_seed_count: int) -> CampaignProtocol:
422
+ """Build the exact protocol; the outer seed remains separately bound."""
423
+
424
+ if type(required_seed_count) is not int or required_seed_count <= 0:
425
+ raise ValueError("required_seed_count must be a positive exact integer")
426
+ return CampaignProtocol(
427
+ protocol_id="sealed_cutoff_delayed_portfolio",
428
+ protocol_version=1,
429
+ definition_sha256=self.definition_sha256,
430
+ outer_seed=self.outer_seed,
431
+ generation_count=self.generation_count,
432
+ required_seed_count=required_seed_count,
433
+ parents_per_portfolio_generation=(
434
+ self.parents_per_portfolio_generation
435
+ ),
436
+ portfolio_width=self.portfolio_width,
437
+ recombinations_per_parent=self.recombinations_per_parent,
438
+ reflections_per_recombination_generation=1,
439
+ reflection_promotion_block_pairs=1,
440
+ terminal_reflection_policy=(
441
+ TerminalReflectionPolicy.REQUIRE_FUTURE_PORTFOLIO_CONSUMER
442
+ ),
443
+ )
444
+
445
+ def budget(self, *, required_seed_count: int) -> OptimizerBudget:
446
+ """Derive—not hand-maintain—the exact maximum schedule budget."""
447
+
448
+ protocol = self.protocol(required_seed_count=required_seed_count)
449
+ schedule = SealedCutoffDelayedAdmissionCadence().build(protocol)
450
+ return OptimizerBudget(
451
+ max_unique_evaluations=(
452
+ required_seed_count + schedule.planned_candidate_evaluations
453
+ ),
454
+ max_logical_llm_calls=schedule.planned_agent_calls,
455
+ max_generations=self.generation_count,
456
+ )
457
+
458
+ def concurrency(self) -> CampaignConcurrency:
459
+ return CampaignConcurrency(
460
+ evaluator_concurrency=self.evaluator_concurrency,
461
+ agent_concurrency=self.agent_concurrency,
462
+ agent_queue_capacity=self.agent_queue_capacity,
463
+ )
464
+
465
+ def compose(
466
+ self,
467
+ *,
468
+ workload: WorkloadKit | AgenticCampaignWorkloadConfig,
469
+ behavior: PortfolioCampaignBehavior,
470
+ runtime: CampaignAgentRuntimePort,
471
+ journals: tuple[CampaignJournalPort, ...],
472
+ ) -> EvolutionCampaign:
473
+ """Compose a strict campaign without running preflight or live waves."""
474
+
475
+ self.__post_init__()
476
+ if type(workload) is WorkloadKit:
477
+ config = workload.to_campaign_workload()
478
+ elif type(workload) is AgenticCampaignWorkloadConfig:
479
+ config = workload
480
+ AgenticCampaignWorkloadConfig.__post_init__(config)
481
+ else:
482
+ raise TypeError(
483
+ "workload must be exact WorkloadKit or "
484
+ "AgenticCampaignWorkloadConfig"
485
+ )
486
+ if self.evaluator_concurrency > config.evaluator_concurrency_cap:
487
+ raise ValueError(
488
+ "preset evaluator concurrency exceeds workload admission cap"
489
+ )
490
+ if type(behavior) is not PortfolioCampaignBehavior:
491
+ raise TypeError("behavior must be exact PortfolioCampaignBehavior")
492
+ behavior.__post_init__()
493
+ required_seed_count = len(config.seeds)
494
+ return EvolutionCampaign(
495
+ protocol=self.protocol(required_seed_count=required_seed_count),
496
+ workload=config.build_ports(),
497
+ policies=behavior.bind(),
498
+ runtime=runtime,
499
+ budget=self.budget(required_seed_count=required_seed_count),
500
+ concurrency=self.concurrency(),
501
+ journals=journals,
502
+ )
503
+
504
+
505
+ __all__ = [
506
+ "ANCHOR_HEAVY_36_OFFSPRING_SCALE_SHAPE",
507
+ "ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES",
508
+ "ANYTIME_SMOKE_B146_SCALE_SHAPE",
509
+ "CAMPAIGN_SCALE_SHAPES",
510
+ "CLASSICAL_MATCHED_B602_SCALE_SHAPE",
511
+ "DelayedPortfolioCampaignPreset",
512
+ "EQUAL_36_OFFSPRING_SCALE_SHAPES",
513
+ "EQUAL_60_OFFSPRING_SCALE_SHAPES",
514
+ "PortfolioCampaignBehavior",
515
+ "PortfolioScaleShape",
516
+ "REFERENCE_36_OFFSPRING_SCALE_SHAPE",
517
+ ]