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,183 @@
1
+ """Injectable exponential backoff and jitter policies for LLM task retries."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ import hashlib
7
+ from typing import Protocol, runtime_checkable
8
+
9
+ from agent_evolve.domain.llm_task_queue import RetryClassification, RetryReason
10
+
11
+
12
+ @runtime_checkable
13
+ class JitterPolicy(Protocol):
14
+ def apply(
15
+ self,
16
+ upper_bound_ns: int,
17
+ *,
18
+ task_id: str,
19
+ failed_attempt_number: int,
20
+ ) -> int: ...
21
+
22
+
23
+ @runtime_checkable
24
+ class RandomRange(Protocol):
25
+ def randrange(self, stop: int) -> int: ...
26
+
27
+
28
+ @dataclass(frozen=True, slots=True)
29
+ class NoJitter:
30
+ """Use the capped exponential delay exactly."""
31
+
32
+ def apply(
33
+ self,
34
+ upper_bound_ns: int,
35
+ *,
36
+ task_id: str,
37
+ failed_attempt_number: int,
38
+ ) -> int:
39
+ del task_id, failed_attempt_number
40
+ if type(upper_bound_ns) is not int or upper_bound_ns < 0:
41
+ raise ValueError("upper_bound_ns must be a non-negative integer")
42
+ return upper_bound_ns
43
+
44
+
45
+ @dataclass(frozen=True, slots=True)
46
+ class FullJitter:
47
+ """Choose uniformly from the inclusive interval ``[0, upper_bound]``."""
48
+
49
+ random: RandomRange
50
+
51
+ def __post_init__(self) -> None:
52
+ if not isinstance(self.random, RandomRange):
53
+ raise TypeError("random must implement RandomRange")
54
+
55
+ def apply(
56
+ self,
57
+ upper_bound_ns: int,
58
+ *,
59
+ task_id: str,
60
+ failed_attempt_number: int,
61
+ ) -> int:
62
+ del task_id, failed_attempt_number
63
+ if type(upper_bound_ns) is not int or upper_bound_ns < 0:
64
+ raise ValueError("upper_bound_ns must be a non-negative integer")
65
+ sampled = self.random.randrange(upper_bound_ns + 1)
66
+ if type(sampled) is not int or not 0 <= sampled <= upper_bound_ns:
67
+ raise ValueError("random source returned a value outside the jitter interval")
68
+ return sampled
69
+
70
+
71
+ @dataclass(frozen=True, slots=True)
72
+ class DeterministicHashJitter:
73
+ """Task-keyed full jitter independent of concurrent completion order.
74
+
75
+ The domain string makes the byte framing experiment- or application-specific,
76
+ while the task ID and failed-attempt number prevent a shared mutable RNG from
77
+ coupling otherwise independent requests.
78
+ """
79
+
80
+ seed: int
81
+ domain: str = "agent-evolve-jitter-v1"
82
+
83
+ def __post_init__(self) -> None:
84
+ if type(self.seed) is not int or self.seed < 0:
85
+ raise ValueError("seed must be a non-negative exact integer")
86
+ if (
87
+ type(self.domain) is not str
88
+ or not self.domain
89
+ or "\x00" in self.domain
90
+ or not self.domain.isascii()
91
+ ):
92
+ raise ValueError("domain must be non-empty NUL-free ASCII")
93
+
94
+ def apply(
95
+ self,
96
+ upper_bound_ns: int,
97
+ *,
98
+ task_id: str,
99
+ failed_attempt_number: int,
100
+ ) -> int:
101
+ if type(upper_bound_ns) is not int or upper_bound_ns < 0:
102
+ raise ValueError("upper_bound_ns must be a non-negative integer")
103
+ if type(task_id) is not str or not task_id or "\x00" in task_id:
104
+ raise ValueError("task_id must be non-empty and NUL-free")
105
+ if type(failed_attempt_number) is not int or failed_attempt_number < 1:
106
+ raise ValueError("failed_attempt_number must be a positive integer")
107
+ framed = b"\x00".join(
108
+ (
109
+ self.domain.encode("ascii"),
110
+ str(self.seed).encode("ascii"),
111
+ task_id.encode("utf-8", errors="strict"),
112
+ str(failed_attempt_number).encode("ascii"),
113
+ )
114
+ )
115
+ value = int.from_bytes(hashlib.sha256(framed).digest(), "big")
116
+ return value % (upper_bound_ns + 1)
117
+
118
+
119
+ @dataclass(frozen=True, slots=True)
120
+ class ExponentialBackoff:
121
+ """Capped exponential backoff with jitter and a rate-limit floor.
122
+
123
+ Full jitter is useful for ordinary transient failures, but a sampled delay
124
+ close to zero defeats provider recovery after an HTTP 429. The optional
125
+ floor is classification-aware: it applies only to ``RATE_LIMIT`` retries,
126
+ leaving timeout, transient, and structured-output behavior unchanged.
127
+ """
128
+
129
+ base_delay_ns: int
130
+ max_delay_ns: int
131
+ jitter: JitterPolicy = NoJitter()
132
+ rate_limit_floor_ns: int = 0
133
+
134
+ def __post_init__(self) -> None:
135
+ if type(self.base_delay_ns) is not int or self.base_delay_ns < 0:
136
+ raise ValueError("base_delay_ns must be a non-negative integer")
137
+ if type(self.max_delay_ns) is not int or self.max_delay_ns < 0:
138
+ raise ValueError("max_delay_ns must be a non-negative integer")
139
+ if self.base_delay_ns > self.max_delay_ns:
140
+ raise ValueError("base_delay_ns cannot exceed max_delay_ns")
141
+ if (
142
+ type(self.rate_limit_floor_ns) is not int
143
+ or self.rate_limit_floor_ns < 0
144
+ or self.rate_limit_floor_ns > self.max_delay_ns
145
+ ):
146
+ raise ValueError(
147
+ "rate_limit_floor_ns must lie in [0, max_delay_ns]"
148
+ )
149
+ if not isinstance(self.jitter, JitterPolicy):
150
+ raise TypeError("jitter must implement JitterPolicy")
151
+
152
+ def delay_ns(
153
+ self,
154
+ *,
155
+ task_id: str,
156
+ failed_attempt_number: int,
157
+ classification: RetryClassification,
158
+ ) -> int:
159
+ if type(task_id) is not str or not task_id:
160
+ raise ValueError("task_id must be a non-empty string")
161
+ if type(failed_attempt_number) is not int or failed_attempt_number < 1:
162
+ raise ValueError("failed_attempt_number must be a positive integer")
163
+ if type(classification) is not RetryClassification:
164
+ raise TypeError("classification must be a RetryClassification")
165
+
166
+ if self.base_delay_ns == 0 or self.max_delay_ns == 0:
167
+ upper_bound = 0
168
+ else:
169
+ shift = failed_attempt_number - 1
170
+ # Avoid constructing an enormous intermediate integer for a bad
171
+ # attempt value while retaining the exact capped result.
172
+ if shift >= self.max_delay_ns.bit_length():
173
+ upper_bound = self.max_delay_ns
174
+ else:
175
+ upper_bound = min(self.base_delay_ns << shift, self.max_delay_ns)
176
+ delay = self.jitter.apply(
177
+ upper_bound,
178
+ task_id=task_id,
179
+ failed_attempt_number=failed_attempt_number,
180
+ )
181
+ if classification.reason is RetryReason.RATE_LIMIT:
182
+ return max(delay, self.rate_limit_floor_ns)
183
+ return delay
@@ -0,0 +1,226 @@
1
+ """An operator chooser backed by a language model.
2
+
3
+ The model is asked *which parents to recombine and where to cut*. It is never
4
+ asked to write a candidate, and it could not: :class:`OperatorChoice` has no
5
+ field that can hold a configuration. That is the distinction this project's
6
+ claim rests on -- guidance over operator choice rather than artifact authoring --
7
+ and it is enforced by the type rather than by the prompt.
8
+
9
+ Everything the model sees is derived from the problem's own candidate shape and
10
+ objective declarations. Nothing here knows what a locus means.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import json
16
+ import re
17
+ from typing import Any, Callable, Mapping, Sequence
18
+
19
+ from agent_evolve.policies.genetic import Locus, loci_of
20
+ from agent_evolve.session.genetic_loop import OperatorChoice
21
+
22
+ __all__ = ["ChooserTelemetry", "llm_chooser", "render_population", "parse_choices"]
23
+
24
+ Config = dict[str, Any]
25
+
26
+ #: Minimal provider surface: prompt in, text out. Deliberately not the harness
27
+ #: interface -- a chooser needs one completion, not a proposal protocol, and a
28
+ #: narrow seam is testable without a provider.
29
+ Complete = Callable[[str], str]
30
+
31
+
32
+ class ChooserTelemetry:
33
+ """Counts what the model actually returned. Reported, never inferred.
34
+
35
+ ``wrote_candidate`` is the one that matters: a model that answers with a
36
+ configuration instead of operator arguments has stepped outside the claim,
37
+ and a silent fallback to random choice would produce a null result
38
+ indistinguishable from an honest one.
39
+ """
40
+
41
+ __slots__ = ("calls", "accepted", "unparseable", "malformed",
42
+ "wrote_candidate", "out_of_range", "errors")
43
+
44
+ def __init__(self) -> None:
45
+ self.calls = 0
46
+ self.accepted = 0
47
+ self.unparseable = 0
48
+ self.malformed = 0
49
+ self.wrote_candidate = 0
50
+ self.out_of_range = 0
51
+ self.errors = 0
52
+
53
+ def as_dict(self) -> dict[str, int]:
54
+ return {name: getattr(self, name) for name in self.__slots__}
55
+
56
+
57
+ _PROMPT = """You are choosing recombination operations for a genetic optimizer.
58
+ {context}
59
+ OBJECTIVES (this is what the numbers mean):
60
+ {objectives}
61
+ {state}
62
+ CURRENT POPULATION -- index, then the candidate, then its measured objectives:
63
+ {population}
64
+
65
+ Each candidate has {n_loci} heritable positions, in this order:
66
+ {loci}
67
+
68
+ Budget used: {used} of {total} evaluations.
69
+
70
+ Choose {k} recombination operations. For each, name TWO parents by INDEX and a
71
+ crossover MASK of exactly {n_loci} bits: bit i = 0 takes position i from
72
+ parent_a, bit i = 1 takes it from parent_b.
73
+
74
+ CHOOSE FOR COMPLEMENTARITY, NOT RANK. Recombination only helps when the two
75
+ parents carry DIFFERENT useful material: repeatedly pairing the top-ranked
76
+ candidate, or masks that copy nearly everything from one side, spend
77
+ evaluations on near-clones. Across your {k} choices use varied parent pairs --
78
+ including mid-rank candidates whose positions differ from the leaders' -- and
79
+ prefer masks that genuinely mix both parents.
80
+
81
+ Do NOT write candidates. Choose indices and mask bits only.
82
+
83
+ Reply with ONLY a JSON list of {k} objects and no other text:
84
+ [{{"parent_a": 0, "parent_b": 2, "mask": [{example}]}}]"""
85
+
86
+
87
+ def render_population(
88
+ population: Sequence[tuple[Config, float]],
89
+ objectives: Sequence[Any] | None = None,
90
+ ) -> str:
91
+ """One line per member: index, candidate, rank. Compact and lossless."""
92
+
93
+ lines = []
94
+ for i, (config, rank) in enumerate(population):
95
+ lines.append(f" {i}: {json.dumps(config, sort_keys=True)} "
96
+ f"(rank {rank:g}; lower is better)")
97
+ return "\n".join(lines)
98
+
99
+
100
+ def parse_choices(
101
+ text: str,
102
+ *,
103
+ n_loci: int,
104
+ population_size: int,
105
+ telemetry: ChooserTelemetry,
106
+ ) -> list[OperatorChoice]:
107
+ """Parse operator arguments, rejecting anything that is a candidate.
108
+
109
+ Rejections are counted rather than silently dropped, because the number of
110
+ rejected responses is the difference between "guidance did not help" and
111
+ "guidance never arrived".
112
+ """
113
+
114
+ match = re.search(r"\[.*\]", text, re.S)
115
+ if match is None:
116
+ telemetry.unparseable += 1
117
+ return []
118
+ try:
119
+ raw = json.loads(match.group(0))
120
+ except (ValueError, TypeError):
121
+ telemetry.unparseable += 1
122
+ return []
123
+ if not isinstance(raw, list):
124
+ telemetry.unparseable += 1
125
+ return []
126
+
127
+ out: list[OperatorChoice] = []
128
+ for item in raw:
129
+ if not isinstance(item, dict):
130
+ telemetry.malformed += 1
131
+ continue
132
+ # A nested structure under any key is a candidate, not a choice. This is
133
+ # the failure that would collapse the arm into whole-artifact rewrite.
134
+ if any(isinstance(v, (dict,)) for v in item.values()) or "mask" not in item:
135
+ telemetry.wrote_candidate += 1
136
+ continue
137
+ try:
138
+ parent_a = int(item["parent_a"])
139
+ parent_b = int(item["parent_b"])
140
+ mask = tuple(bool(int(bit)) for bit in item["mask"])
141
+ except (KeyError, TypeError, ValueError):
142
+ telemetry.malformed += 1
143
+ continue
144
+ if not (0 <= parent_a < population_size and 0 <= parent_b < population_size):
145
+ telemetry.out_of_range += 1
146
+ continue
147
+ if len(mask) != n_loci:
148
+ telemetry.out_of_range += 1
149
+ continue
150
+ out.append(OperatorChoice(parent_a=parent_a, parent_b=parent_b, mask=mask))
151
+ telemetry.accepted += len(out)
152
+ return out
153
+
154
+
155
+ def llm_chooser(
156
+ complete: Complete,
157
+ *,
158
+ objectives: Sequence[Any],
159
+ budget: int,
160
+ telemetry: ChooserTelemetry | None = None,
161
+ on_shortfall: Callable[[int, int], None] | None = None,
162
+ domain_context: str = "",
163
+ ):
164
+ """Build an :class:`OperatorChooser` that asks *complete* for choices.
165
+
166
+ When the model returns fewer usable choices than asked for, the caller is
167
+ told through *on_shortfall* and the loop fills the remainder itself. A run
168
+ that quietly substitutes random choices for model choices is a run whose
169
+ result cannot be attributed.
170
+ """
171
+
172
+ from agent_evolve.policies.semantics import objective_lines
173
+
174
+ stats = telemetry if telemetry is not None else ChooserTelemetry()
175
+ spent = {"n": 0}
176
+ # Empty context renders to nothing at all, keeping the no-card prompt
177
+ # byte-identical (the state-block precedent).
178
+ context_block = (f"\n{domain_context.strip()}\n"
179
+ if domain_context.strip() else "")
180
+
181
+ def choose(population: Sequence[tuple[Config, float]], count: int,
182
+ state: Any = None):
183
+ if not population:
184
+ return []
185
+ loci = loci_of(population[0][0])
186
+ # An absent state renders to nothing at all, so the score-only baseline
187
+ # is byte-identical to the prompt this chooser sent before the search
188
+ # state existed -- an ablation must not carry an empty heading.
189
+ block = ""
190
+ if state is not None:
191
+ rendered = state.render([spec.name for spec in objectives])
192
+ if rendered:
193
+ block = "\n" + rendered + "\n"
194
+ prompt = _PROMPT.format(
195
+ context=context_block,
196
+ objectives="\n".join(
197
+ f" {line}" for line in objective_lines(objectives)
198
+ ),
199
+ state=block,
200
+ population=render_population(population, objectives),
201
+ n_loci=len(loci),
202
+ loci=" " + ", ".join(str(locus) for locus in loci),
203
+ used=spent["n"],
204
+ total=budget,
205
+ k=count,
206
+ example=",".join("0" for _ in loci),
207
+ )
208
+ stats.calls += 1
209
+ try:
210
+ text = complete(prompt)
211
+ except Exception:
212
+ stats.errors += 1
213
+ return []
214
+ choices = parse_choices(
215
+ text, n_loci=len(loci), population_size=len(population),
216
+ telemetry=stats,
217
+ )
218
+ spent["n"] += count
219
+ if len(choices) < count and on_shortfall is not None:
220
+ on_shortfall(len(choices), count)
221
+ return choices
222
+
223
+ choose.telemetry = stats # type: ignore[attr-defined]
224
+ choose.mechanism = "chooser" # type: ignore[attr-defined]
225
+ choose.authored_by = "llm" # type: ignore[attr-defined]
226
+ return choose