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,394 @@
1
+ """Graded sampling priors: the generic form of domain restriction.
2
+
3
+ A hard :class:`~agent_evolve.policies.genetic.DomainRestriction` is a 0/1 bet:
4
+ sample these values, never those. The generic form carries per-value WEIGHTS,
5
+ so a proposer can grade its confidence instead of gambling the support -- and
6
+ the hard restriction is exactly the special case where every kept value weighs
7
+ the same. That equivalence is enforced, not aspirational: ``weights_for``
8
+ reports ``None`` whenever the mapped weights are uniform, the sampler then
9
+ draws through the identical ``r.choice`` call, and a test pins the two streams
10
+ draw-for-draw.
11
+
12
+ Why grading exists at all: the sealed space-prior arm showed a ~20-line rule
13
+ matching a model's hard restriction to the last digit on 15 of 15 seeds -- a
14
+ hard subset is arithmetic over the screen table, which is rule territory. A
15
+ graded prior is the form that can carry what the table does not say (named
16
+ idioms, couplings, physics) while the evaluator still arbitrates: support can
17
+ only narrow, misses are counted, seeds survive, and the unwind test applies
18
+ wherever the prior actually excludes something. A prior that excludes nothing
19
+ makes no refutable claim; it only biases draws, and its worst case is bounded
20
+ by the declared domain.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import json
26
+ import math
27
+ import re
28
+ from dataclasses import dataclass, field
29
+ from typing import Any, Callable, Mapping, Sequence
30
+
31
+ from agent_evolve.core.problem import ObjectiveSpec
32
+ from agent_evolve.policies.genetic import Locus
33
+ # _domains is package-internal on purpose: both prior proposers must resolve
34
+ # declared domains identically, or the same reply would be judged two ways.
35
+ from agent_evolve.policies.llm_prior import _domains
36
+ from agent_evolve.policies.structure import Attribution, render_attribution
37
+
38
+ __all__ = [
39
+ "WeightedRestriction",
40
+ "statistical_weighted_prior",
41
+ "WeightedPriorTelemetry",
42
+ "llm_weighted_prior_proposer",
43
+ "PROMPT",
44
+ "COMMITTED_PROMPT",
45
+ "PRIOR_STYLES",
46
+ ]
47
+
48
+ #: How the prompt's last instruction reads. See :data:`COMMITTED_PROMPT`.
49
+ PRIOR_STYLES = ("cautious", "committed")
50
+
51
+
52
+ @dataclass(frozen=True)
53
+ class WeightedRestriction:
54
+ """Per-field weights over declared values -- a graded prior over WHERE to sample.
55
+
56
+ ``weighted`` maps a field name to a ``(values, weights)`` pair of parallel
57
+ tuples. Weight zero excludes a value from the support exactly as a hard
58
+ restriction would; positive weights keep values in proportion.
59
+
60
+ The :class:`~agent_evolve.policies.genetic.DomainRestriction` invariants
61
+ hold unchanged: narrows only (undeclared values contribute nothing), never
62
+ empties (an empty intersection returns the declared domain and counts the
63
+ miss), misses accumulate on the frozen instance, and the key is
64
+ ``Locus.field`` so sequence elements share their field's entry.
65
+ """
66
+
67
+ weighted: Mapping[str, tuple[tuple[Any, ...], tuple[float, ...]]] = field(
68
+ default_factory=dict
69
+ )
70
+ misses: list[str] = field(default_factory=list, compare=False, repr=False)
71
+
72
+ def __post_init__(self) -> None:
73
+ for name, entry in dict(self.weighted).items():
74
+ if not isinstance(entry, tuple) or len(entry) != 2:
75
+ raise ValueError(
76
+ f"weighted prior for {name!r} must be a (values, weights) "
77
+ f"pair, got {entry!r}"
78
+ )
79
+ values, weights = entry
80
+ if len(values) != len(weights):
81
+ raise ValueError(
82
+ f"weighted prior for {name!r}: {len(values)} values but "
83
+ f"{len(weights)} weights"
84
+ )
85
+ bad = [
86
+ w for w in weights
87
+ if isinstance(w, bool) or not isinstance(w, (int, float))
88
+ or not math.isfinite(float(w)) or float(w) < 0.0
89
+ ]
90
+ if bad:
91
+ raise ValueError(
92
+ f"weighted prior for {name!r}: weights must be finite and "
93
+ f"non-negative, got {bad}"
94
+ )
95
+ if not any(float(w) > 0.0 for w in weights):
96
+ raise ValueError(
97
+ f"weighted prior for {name!r} gives every value weight "
98
+ "zero, which is a restriction that samples nothing"
99
+ )
100
+
101
+ @classmethod
102
+ def hard(cls, allowed: Mapping[str, Sequence[Any]]) -> "WeightedRestriction":
103
+ """The 0/1 special case, from a hard restriction's vocabulary."""
104
+
105
+ return cls({
106
+ name: (tuple(values), tuple(1.0 for _ in values))
107
+ for name, values in dict(allowed).items()
108
+ })
109
+
110
+ @property
111
+ def allowed(self) -> dict[str, tuple[Any, ...]]:
112
+ """Positive-weight support, in the hard restriction's vocabulary.
113
+
114
+ The loop's structure record and its unwind test read ``allowed``, so a
115
+ graded prior takes part in both through exactly the values it
116
+ excludes. A prior that excludes nothing is unwound by nothing: it made
117
+ no refutable claim, only a bias, and a bias's worst case is bounded.
118
+ """
119
+
120
+ return {
121
+ name: tuple(v for v, w in zip(values, weights) if float(w) > 0.0)
122
+ for name, (values, weights) in dict(self.weighted).items()
123
+ }
124
+
125
+ def narrow(self, locus: Locus, domain: tuple[Any, ...]) -> tuple[Any, ...]:
126
+ entry = self.weighted.get(locus.field)
127
+ if entry is None or not domain:
128
+ return domain
129
+ values, weights = entry
130
+ support = tuple(v for v, w in zip(values, weights) if float(w) > 0.0)
131
+ kept = tuple(v for v in domain if v in support)
132
+ if not kept:
133
+ self.misses.append(locus.field)
134
+ return domain
135
+ return kept
136
+
137
+ def weights_for(
138
+ self, locus: Locus, values: Sequence[Any]
139
+ ) -> "tuple[float, ...] | None":
140
+ """Weights parallel to *values*, or ``None`` when the draw is uniform.
141
+
142
+ ``None`` in exactly three situations, each deliberate: the prior has no
143
+ entry for this field; the mapped weights are all equal (the hard
144
+ special case -- the sampler must take the byte-identical ``r.choice``
145
+ path); or a zero-weight value is present in *values*, which can only
146
+ happen after ``narrow`` missed, and a prior that missed does not get to
147
+ bias the fallback domain it failed to narrow.
148
+ """
149
+
150
+ entry = self.weighted.get(locus.field)
151
+ if entry is None or not values:
152
+ return None
153
+ table = {v: float(w) for v, w in zip(*entry)}
154
+ mapped = [table.get(v, 0.0) for v in values]
155
+ if any(w <= 0.0 for w in mapped):
156
+ return None
157
+ if all(w == mapped[0] for w in mapped):
158
+ return None
159
+ return tuple(mapped)
160
+
161
+
162
+ def statistical_weighted_prior(
163
+ attr: Attribution,
164
+ candidate_model: Any = None,
165
+ *,
166
+ min_levels: int = 2,
167
+ ) -> WeightedRestriction:
168
+ """The credential-free graded prior: weight levels by the screen's evidence.
169
+
170
+ Reads exactly what :func:`~agent_evolve.policies.structure.statistical_prior`
171
+ reads, but grades instead of gambling: each level's weight is its
172
+ Laplace-smoothed within-screen non-domination rate, ``(nd + 0.5)/(n + 1)``,
173
+ so a level a small screen never saw win keeps mass instead of being erased.
174
+ A locus whose rates all tie is left free -- the honest reading of a screen
175
+ that separated nothing. This ships as the rule any model-proposed weighted
176
+ prior has to beat.
177
+ """
178
+
179
+ weighted: dict[str, tuple[tuple[Any, ...], tuple[float, ...]]] = {}
180
+ for name in dict.fromkeys(s.locus for s in attr.levels):
181
+ summaries = attr.for_locus(name)
182
+ if len(summaries) < min_levels:
183
+ continue
184
+ rates = {
185
+ s.value: (s.nondominated + 0.5) / (s.n + 1.0) for s in summaries
186
+ }
187
+ if len(set(rates.values())) < 2:
188
+ continue
189
+ weighted[name.split("[")[0]] = (tuple(rates), tuple(rates.values()))
190
+ return WeightedRestriction(weighted)
191
+
192
+
193
+ @dataclass
194
+ class WeightedPriorTelemetry:
195
+ """What the proposer's replies did. Counted, never inferred."""
196
+
197
+ calls: int = 0
198
+ unparseable: int = 0
199
+ wrote_candidate: int = 0
200
+ out_of_domain: int = 0
201
+ empty: int = 0
202
+ restricted_loci: int = 0
203
+ errors: int = 0
204
+ proposals: list = field(default_factory=list)
205
+
206
+ def as_dict(self) -> dict[str, int]:
207
+ return {
208
+ "calls": self.calls,
209
+ "unparseable": self.unparseable,
210
+ "wrote_candidate": self.wrote_candidate,
211
+ "out_of_domain": self.out_of_domain,
212
+ "empty": self.empty,
213
+ "restricted_loci": self.restricted_loci,
214
+ "errors": self.errors,
215
+ "proposals": len(self.proposals),
216
+ }
217
+
218
+
219
+ _PROMPT_BODY = """The search has spent {n} evaluations on a screening design.
220
+
221
+ OBJECTIVES: {goals}
222
+
223
+ SEARCH SPACE (declared domains):
224
+ {schema}
225
+
226
+ SCREEN EVIDENCE (per locus value, within-screen):
227
+ {screen}
228
+
229
+ Read the table as evidence about THIS evaluator. It may or may not match how
230
+ such problems usually behave; where they disagree, the table wins.
231
+
232
+ Propose a WEIGHTED sampling prior. For any locus the evidence (or the
233
+ parameter's meaning) separates, list the values worth sampling and a
234
+ non-negative weight for each: higher weight, more draws. A value you omit gets
235
+ weight zero and is not sampled; a locus you omit stays free. You are not
236
+ choosing a candidate and must not propose one. {closing}
237
+
238
+ Reply with ONLY this JSON shape and no other text:
239
+ {{"weights": {{"<param>": {{"values": [...], "weights": [...]}}}}, "free": ["<param>", ...]}}"""
240
+
241
+ _CAUTIOUS_CLOSE = (
242
+ "Over-restricting a\nfrontier-spreading parameter destroys diversity: "
243
+ "leave a locus free unless you\nhave a reason."
244
+ )
245
+
246
+ _COMMITTED_CLOSE = (
247
+ "Commit: for every parameter this\nscreen's evidence separates, give "
248
+ "weights proportional to that evidence.\nList a parameter as free ONLY "
249
+ "when the evidence genuinely does not separate\nits values; hedging every "
250
+ "parameter as free discards the screen this run\npaid for."
251
+ )
252
+
253
+ #: The shipped prompt, and every sealed row's: the caution clause asks for a
254
+ #: locus to be left free unless there is a reason to bind it.
255
+ PROMPT = _PROMPT_BODY.replace("{closing}", _CAUTIOUS_CLOSE)
256
+
257
+ #: The same prompt with that one clause swapped for its opposite instruction.
258
+ #: The tuning round's target is a measured phenotype, not a taste: the terra
259
+ #: tier obeys the caution clause most literally -- the flattest weight ratios
260
+ #: of the three tiers (1.82 against luna's 2.67 and sol's 4.0) and a median of
261
+ #: five parameters listed free where the others list none -- and it costs that
262
+ #: tier at the endpoint (4 of 6 paired seeds). Everything else about the
263
+ #: prompt, the reply shape, and the validation is identical, so the arm
264
+ #: measures the clause and nothing else.
265
+ COMMITTED_PROMPT = _PROMPT_BODY.replace("{closing}", _COMMITTED_CLOSE)
266
+
267
+
268
+ def llm_weighted_prior_proposer(
269
+ complete: Callable[[str], str],
270
+ *,
271
+ objectives: Sequence[ObjectiveSpec],
272
+ telemetry: WeightedPriorTelemetry | None = None,
273
+ domain_context: str = "",
274
+ style: str = "cautious",
275
+ ) -> Callable[[Attribution, Any], WeightedRestriction]:
276
+ """A prior proposer that elicits a GRADED prior and repairs nothing.
277
+
278
+ Whole-reply rejection, exactly as the hard proposer: a reply naming
279
+ undeclared values, negative or non-finite weights, mismatched lists, or an
280
+ all-zero field is rejected WHOLE and the run proceeds unguided -- a
281
+ repaired prior is the harness's prior wearing the model's name. A field
282
+ weighted evenly over its full declared domain is recorded as free, not as
283
+ a restriction; a field weighted UNevenly over the full domain is a real
284
+ graded prior and is kept.
285
+
286
+ *style* names which closing instruction the prompt carries -- the shipped
287
+ ``"cautious"`` clause or the ``"committed"`` one (see
288
+ :data:`COMMITTED_PROMPT`). It changes the prompt's last sentence and
289
+ nothing else: same reply shape, same parse, same validation, so the two
290
+ arms differ by the clause alone.
291
+ """
292
+
293
+ from agent_evolve.policies.semantics import objective_lines, parameter_lines
294
+
295
+ if style not in PRIOR_STYLES:
296
+ raise ValueError(
297
+ f"weighted prior style must be one of {PRIOR_STYLES}, got "
298
+ f"{style!r}")
299
+ template = COMMITTED_PROMPT if style == "committed" else PROMPT
300
+ tel = telemetry if telemetry is not None else WeightedPriorTelemetry()
301
+ goals = ", ".join(objective_lines(objectives))
302
+ preamble = f"{domain_context.strip()}\n\n" if domain_context.strip() else ""
303
+
304
+ def propose(attr: Attribution, candidate_model: Any) -> WeightedRestriction:
305
+ domains = _domains(candidate_model, attr)
306
+ if not domains:
307
+ return WeightedRestriction({})
308
+ described = parameter_lines(candidate_model, fields=list(domains))
309
+ prompt = preamble + template.format(
310
+ n=attr.n_evaluated,
311
+ goals=goals,
312
+ schema="\n".join(f" {line}" for line in described)
313
+ if described else
314
+ "\n".join(f" {k}: one of {list(v)}" for k, v in domains.items()),
315
+ screen=render_attribution(attr),
316
+ )
317
+ tel.calls += 1
318
+ try:
319
+ text = complete(prompt)
320
+ except Exception:
321
+ tel.errors += 1
322
+ return WeightedRestriction({})
323
+ match = re.search(r"\{.*\}", text, re.S)
324
+ if match is None:
325
+ tel.unparseable += 1
326
+ return WeightedRestriction({})
327
+ try:
328
+ raw = json.loads(match.group(0))
329
+ except (ValueError, TypeError):
330
+ tel.unparseable += 1
331
+ return WeightedRestriction({})
332
+ if not isinstance(raw, dict) or not isinstance(raw.get("weights", {}), dict):
333
+ tel.unparseable += 1
334
+ return WeightedRestriction({})
335
+ entries = raw.get("weights", {}) or {}
336
+ # Every field mapped to a bare value is a configuration, not a prior --
337
+ # the failure mode that collapses this arm into artifact authoring.
338
+ if entries and all(not isinstance(v, dict) for v in entries.values()):
339
+ tel.wrote_candidate += 1
340
+ return WeightedRestriction({})
341
+
342
+ weighted: dict[str, tuple[tuple[Any, ...], tuple[float, ...]]] = {}
343
+ for name, entry in entries.items():
344
+ if not isinstance(entry, dict):
345
+ tel.unparseable += 1
346
+ return WeightedRestriction({})
347
+ values = entry.get("values")
348
+ weights = entry.get("weights")
349
+ if (
350
+ not isinstance(values, list) or not isinstance(weights, list)
351
+ or not values or len(values) != len(weights)
352
+ ):
353
+ tel.unparseable += 1
354
+ return WeightedRestriction({})
355
+ if name not in domains:
356
+ tel.out_of_domain += 1
357
+ return WeightedRestriction({})
358
+ domain = tuple(domains[name])
359
+ if any(v not in domain for v in values):
360
+ tel.out_of_domain += 1
361
+ return WeightedRestriction({})
362
+ clean: list[float] = []
363
+ for w in weights:
364
+ if (
365
+ isinstance(w, bool) or not isinstance(w, (int, float))
366
+ or not math.isfinite(float(w)) or float(w) < 0.0
367
+ ):
368
+ tel.out_of_domain += 1
369
+ return WeightedRestriction({})
370
+ clean.append(float(w))
371
+ if not any(w > 0.0 for w in clean):
372
+ tel.out_of_domain += 1
373
+ return WeightedRestriction({})
374
+ support = {v for v, w in zip(values, clean) if w > 0.0}
375
+ if len(set(clean)) == 1 and support == set(domain):
376
+ continue # the full domain, evenly: free
377
+ weighted[name] = (tuple(values), tuple(clean))
378
+
379
+ if not weighted:
380
+ tel.empty += 1
381
+ return WeightedRestriction({})
382
+ tel.restricted_loci += len(weighted)
383
+ tel.proposals.append(
384
+ {k: (list(v[0]), list(v[1])) for k, v in weighted.items()}
385
+ )
386
+ return WeightedRestriction(weighted)
387
+
388
+ propose.telemetry = tel # type: ignore[attr-defined]
389
+ propose.mechanism = "weighted_prior" # type: ignore[attr-defined]
390
+ propose.authored_by = "llm" # type: ignore[attr-defined]
391
+ # Which clause this arm bought, readable off the proposer: an arm that
392
+ # cannot say which prompt it ran is not an arm.
393
+ propose.style = style # type: ignore[attr-defined]
394
+ return propose