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,226 @@
1
+ """Workload-neutral source labels for sealed finite variation options.
2
+
3
+ Variation source is a property of how a candidate configuration entered the
4
+ finite action universe. It is deliberately independent of whether a language
5
+ model retained the option or deterministic reconciliation inserted it. The
6
+ latter remains semantic-provenance evidence; conflating the two would split one
7
+ proposal source across unrelated posterior arms.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+
14
+ from agent_evolve.domain.finite_variation import (
15
+ FiniteVariationContract,
16
+ FiniteVariationOption,
17
+ )
18
+
19
+
20
+ PRIMARY_VARIATION_SOURCE_ID = "primary"
21
+ VARIATION_SOURCE_METADATA_KEY = "evaluation_source"
22
+ VARIATION_SOURCE_MINIMUM_METADATA_KEY = "evaluation_source_minimum"
23
+ VARIATION_SOURCE_RANK_METADATA_KEY = "evaluation_source_rank"
24
+ VARIATION_OPERATOR_METADATA_KEY = "evaluation_operator"
25
+ VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY = "evaluation_diversity_signature"
26
+ VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY = (
27
+ "candidate_pool_membership_requirement"
28
+ )
29
+ _SOURCE_ID = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
30
+
31
+
32
+ def _source_id_from_validated_option(option: FiniteVariationOption) -> str:
33
+ """Project source metadata after one enclosing graph validation."""
34
+
35
+ source_id = dict(option.metadata).get(
36
+ VARIATION_SOURCE_METADATA_KEY,
37
+ PRIMARY_VARIATION_SOURCE_ID,
38
+ )
39
+ if _SOURCE_ID.fullmatch(source_id) is None:
40
+ raise ValueError("variation source ID must use the closed token grammar")
41
+ return source_id
42
+
43
+
44
+ def finite_variation_source_id(option: FiniteVariationOption) -> str:
45
+ """Return one sealed source label, inheriting ``primary`` when absent."""
46
+
47
+ if type(option) is not FiniteVariationOption:
48
+ raise TypeError("option must be an exact FiniteVariationOption")
49
+ option.__post_init__()
50
+ return _source_id_from_validated_option(option)
51
+
52
+
53
+ def finite_variation_source_by_option(
54
+ contract: FiniteVariationContract,
55
+ ) -> dict[str, str]:
56
+ """Project a finite contract into exact option-to-source attribution."""
57
+
58
+ if type(contract) is not FiniteVariationContract:
59
+ raise TypeError("contract must be an exact FiniteVariationContract")
60
+ contract.__post_init__()
61
+ return {
62
+ option.option_id: _source_id_from_validated_option(option)
63
+ for option in contract.options
64
+ }
65
+
66
+
67
+ def finite_variation_source_ids(
68
+ contract: FiniteVariationContract,
69
+ ) -> tuple[str, ...]:
70
+ """Return the canonical source-arm universe declared by one contract."""
71
+
72
+ return tuple(sorted(set(finite_variation_source_by_option(contract).values())))
73
+
74
+
75
+ def finite_variation_source_minimum_counts(
76
+ contract: FiniteVariationContract,
77
+ ) -> tuple[tuple[str, int], ...]:
78
+ """Project semantic evaluator-exposure floors from a finite contract.
79
+
80
+ The result deliberately names source counts rather than representative
81
+ option IDs. Structural feasibility layers can therefore choose any
82
+ compatible action from a source while retaining one workload-neutral
83
+ inverted API.
84
+ """
85
+
86
+ if type(contract) is not FiniteVariationContract:
87
+ raise TypeError("contract must be an exact FiniteVariationContract")
88
+ contract.__post_init__()
89
+ available_by_source: dict[str, int] = {}
90
+ minimum_by_source: dict[str, int] = {}
91
+ for option in contract.options:
92
+ metadata = dict(option.metadata)
93
+ source_id = metadata.get(VARIATION_SOURCE_METADATA_KEY)
94
+ raw_minimum = metadata.get(VARIATION_SOURCE_MINIMUM_METADATA_KEY)
95
+ if source_id is None and raw_minimum is None:
96
+ continue
97
+ if source_id is None:
98
+ raise ValueError("source exposure minimum requires a source ID")
99
+ if source_id != _source_id_from_validated_option(option):
100
+ raise ValueError("source option metadata differs from its source ID")
101
+ if raw_minimum is None:
102
+ # Attribution and hard exposure are deliberately independent.
103
+ continue
104
+ if not raw_minimum.isascii() or not raw_minimum.isdigit():
105
+ raise ValueError("evaluation source minimum must be decimal digits")
106
+ minimum = int(raw_minimum)
107
+ if not 1 <= minimum < 8:
108
+ raise ValueError("evaluation source minimum must lie in [1, 8)")
109
+ previous = minimum_by_source.setdefault(source_id, minimum)
110
+ if previous != minimum:
111
+ raise ValueError("one proposal source declares inconsistent minimums")
112
+ available_by_source[source_id] = available_by_source.get(source_id, 0) + 1
113
+ for source_id, minimum in minimum_by_source.items():
114
+ if available_by_source[source_id] < minimum:
115
+ raise ValueError("proposal source cannot satisfy its exposure minimum")
116
+ return tuple(sorted(minimum_by_source.items()))
117
+
118
+
119
+ def finite_variation_candidate_pool_required_option_ids(
120
+ contract: FiniteVariationContract,
121
+ ) -> tuple[str, ...]:
122
+ """Return options that must survive model-blind pool screening.
123
+
124
+ Pool membership is intentionally distinct from evaluator allocation. An
125
+ upstream expert may need a complete reference slate exposed to the model
126
+ and downstream allocator without forcing that slate to consume every real
127
+ evaluation slot. The closed metadata value prevents truthy-string or
128
+ workload-specific interpretations at the common-pool boundary.
129
+ """
130
+
131
+ if type(contract) is not FiniteVariationContract:
132
+ raise TypeError("contract must be an exact FiniteVariationContract")
133
+ contract.__post_init__()
134
+ required: list[str] = []
135
+ for option in contract.options:
136
+ raw = dict(option.metadata).get(
137
+ VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY
138
+ )
139
+ if raw is None:
140
+ continue
141
+ if raw != "required":
142
+ raise ValueError(
143
+ "candidate-pool membership requirement must be exactly required"
144
+ )
145
+ required.append(option.option_id)
146
+ return tuple(sorted(required))
147
+
148
+
149
+ def _operator_id_from_validated_option(option: FiniteVariationOption) -> str:
150
+ """Project operator metadata after one enclosing graph validation."""
151
+
152
+ metadata = dict(option.metadata)
153
+ operator_id = metadata.get(VARIATION_OPERATOR_METADATA_KEY)
154
+ if operator_id is None:
155
+ operator_id = "composite" if "composition_radius" in metadata else "atomic"
156
+ if _SOURCE_ID.fullmatch(operator_id) is None:
157
+ raise ValueError("variation operator ID must use the closed token grammar")
158
+ return operator_id
159
+
160
+
161
+ def finite_variation_operator_id(option: FiniteVariationOption) -> str:
162
+ """Return a typed operator arm without inspecting workload identifiers.
163
+
164
+ New catalogs may declare ``evaluation_operator`` explicitly. Existing
165
+ authenticated radius-composition catalogs remain replayable through their
166
+ generic ``composition_radius`` metadata; all other options inherit the
167
+ primary atomic operator.
168
+ """
169
+
170
+ if type(option) is not FiniteVariationOption:
171
+ raise TypeError("option must be an exact FiniteVariationOption")
172
+ option.__post_init__()
173
+ return _operator_id_from_validated_option(option)
174
+
175
+
176
+ def finite_variation_operator_by_option(
177
+ contract: FiniteVariationContract,
178
+ ) -> dict[str, str]:
179
+ """Project exact option-to-operator attribution in one validation pass."""
180
+
181
+ if type(contract) is not FiniteVariationContract:
182
+ raise TypeError("contract must be an exact FiniteVariationContract")
183
+ contract.__post_init__()
184
+ return {
185
+ option.option_id: _operator_id_from_validated_option(option)
186
+ for option in contract.options
187
+ }
188
+
189
+
190
+ def finite_variation_diversity_signature(option: FiniteVariationOption) -> str:
191
+ """Return the adapter-declared typed diversity signature or action family.
192
+
193
+ This is an optional inverted-API seam. The default preserves the existing
194
+ finite-family semantics; workloads can later expose a finer phenotype-safe
195
+ signature without teaching the search controller domain names.
196
+ """
197
+
198
+ if type(option) is not FiniteVariationOption:
199
+ raise TypeError("option must be an exact FiniteVariationOption")
200
+ option.__post_init__()
201
+ signature = dict(option.metadata).get(
202
+ VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
203
+ option.family,
204
+ )
205
+ if _SOURCE_ID.fullmatch(signature) is None:
206
+ raise ValueError("diversity signature must use the closed token grammar")
207
+ return signature
208
+
209
+
210
+ __all__ = [
211
+ "PRIMARY_VARIATION_SOURCE_ID",
212
+ "VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY",
213
+ "VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY",
214
+ "VARIATION_OPERATOR_METADATA_KEY",
215
+ "VARIATION_SOURCE_METADATA_KEY",
216
+ "VARIATION_SOURCE_MINIMUM_METADATA_KEY",
217
+ "VARIATION_SOURCE_RANK_METADATA_KEY",
218
+ "finite_variation_diversity_signature",
219
+ "finite_variation_candidate_pool_required_option_ids",
220
+ "finite_variation_operator_by_option",
221
+ "finite_variation_operator_id",
222
+ "finite_variation_source_by_option",
223
+ "finite_variation_source_id",
224
+ "finite_variation_source_ids",
225
+ "finite_variation_source_minimum_counts",
226
+ ]
@@ -0,0 +1,157 @@
1
+ """Which operator the model is actually running, chosen per campaign.
2
+
3
+ Two modes, and the difference between them is not a hyper-parameter -- it is
4
+ which evolutionary operator exists at all.
5
+
6
+ ``catalogue`` the engine enumerates a finite set of parent-relative edits and
7
+ the model selects among them. Model authority is one opaque
8
+ identifier; every child configuration is engine-owned. Sealed by
9
+ :mod:`agent_evolve.domain.finite_variation`, replayed by
10
+ resolving the identifier against the sealed contract. This is the
11
+ constrained mode: it certifies feasibility by construction and it
12
+ makes allocation a well-posed scoring problem. It also means the
13
+ model never generates anything, so mutation, crossover, offspring
14
+ generation and population initialization are all absent, and only
15
+ selection remains.
16
+
17
+ ``generative`` the model emits configurations conforming to the problem's
18
+ ``candidate_model``, rejected by ``validate`` when illegal and
19
+ built by ``materialize``. Sealed by
20
+ :mod:`agent_evolve.domain.generative_emission`, replayed from the
21
+ emission itself. This is the path the five public obligations
22
+ always admitted; what was missing was the audit trail, which is
23
+ the other half of this module's job.
24
+
25
+ **The matched null moves with the mode, and this module is where that is
26
+ enforced.** A generative arm sampled from an unbounded schema must be compared
27
+ against a null drawn from *that* schema, not from the catalogue the treatment no
28
+ longer uses. Comparing across supports is failure mode 2 in this project's own
29
+ taxonomy, and it is the easiest mistake to make here because the old null still
30
+ runs and still produces a number.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ from dataclasses import dataclass
36
+ from typing import Any, Callable, Dict, Optional, Sequence
37
+
38
+ from agent_evolve.application.generative_proposal_journal import (
39
+ candidate_schema_sha256,
40
+ )
41
+ from agent_evolve.harness.generative_seal import SealedGenerativeHarness
42
+ from agent_evolve.proposers.random_proposer import RandomProposer
43
+
44
+ __all__ = [
45
+ "CATALOGUE",
46
+ "GENERATIVE",
47
+ "PROPOSAL_MODES",
48
+ "ProposalSupport",
49
+ "build_generative_proposer",
50
+ "build_matched_null_proposer",
51
+ "describe_support",
52
+ "require_matched_support",
53
+ ]
54
+
55
+ CATALOGUE = "catalogue"
56
+ GENERATIVE = "generative"
57
+ PROPOSAL_MODES = (GENERATIVE, CATALOGUE)
58
+
59
+
60
+ @dataclass(frozen=True)
61
+ class ProposalSupport:
62
+ """The space a proposer is allowed to draw from, named so it can be checked.
63
+
64
+ ``schema_sha256`` is present for the generative mode and is the whole story
65
+ there: the support *is* the schema. For the catalogue mode the support is the
66
+ sealed contract, which is parent-relative and therefore changes every
67
+ generation, so ``option_count`` describes one parent's neighbourhood rather
68
+ than the reachable space.
69
+ """
70
+
71
+ mode: str
72
+ schema_sha256: Optional[str] = None
73
+ option_count: Optional[int] = None
74
+
75
+ def __post_init__(self) -> None:
76
+ if self.mode not in PROPOSAL_MODES:
77
+ raise ValueError(f"mode must be one of {PROPOSAL_MODES}, got {self.mode!r}")
78
+ if self.mode == GENERATIVE and not self.schema_sha256:
79
+ raise ValueError("a generative support is identified by its schema digest")
80
+
81
+
82
+ def describe_support(problem: Any, mode: str = GENERATIVE) -> ProposalSupport:
83
+ """Name the support a campaign in *mode* would draw from."""
84
+
85
+ if mode == GENERATIVE:
86
+ return ProposalSupport(
87
+ mode=GENERATIVE,
88
+ schema_sha256=candidate_schema_sha256(
89
+ getattr(problem, "candidate_model", None)
90
+ ),
91
+ )
92
+ return ProposalSupport(mode=CATALOGUE)
93
+
94
+
95
+ def require_matched_support(
96
+ treatment: ProposalSupport, null: ProposalSupport
97
+ ) -> None:
98
+ """Refuse a comparison whose arms do not draw from the same space.
99
+
100
+ This is a hard failure and not a warning. A support mismatch does not make a
101
+ result noisy, it makes it about something other than what it claims, and the
102
+ number it produces looks entirely ordinary.
103
+ """
104
+
105
+ if treatment.mode != null.mode:
106
+ raise ValueError(
107
+ f"support mismatch: the treatment proposes in {treatment.mode!r} mode "
108
+ f"and the null in {null.mode!r} mode. The null has to move with the "
109
+ "treatment or the comparison measures the change of support."
110
+ )
111
+ if treatment.mode == GENERATIVE and treatment.schema_sha256 != null.schema_sha256:
112
+ raise ValueError(
113
+ "support mismatch: treatment and null sample different candidate "
114
+ f"schemas ({treatment.schema_sha256} vs {null.schema_sha256})."
115
+ )
116
+
117
+
118
+ def build_generative_proposer(
119
+ problem: Any,
120
+ *,
121
+ delegate: Optional[Any] = None,
122
+ mode: str = "record",
123
+ validator: Optional[Callable[[Dict[str, Any]], Any]] = None,
124
+ sealed_calls: Sequence[Any] = (),
125
+ on_seal: Optional[Callable[[Dict[str, Any]], None]] = None,
126
+ ) -> SealedGenerativeHarness:
127
+ """Wrap *delegate* so its emissions are sealed against *problem*'s schema.
128
+
129
+ ``validator`` defaults to the problem's own ``validate``, which is the point:
130
+ the feasibility rule that gates the run is the same one the seal records, so
131
+ a replay cannot be told a different story about what was legal.
132
+ """
133
+
134
+ schema_sha256 = candidate_schema_sha256(getattr(problem, "candidate_model", None))
135
+ if validator is None:
136
+ validator = getattr(problem, "validate", None)
137
+ return SealedGenerativeHarness(
138
+ delegate,
139
+ candidate_schema_sha256=schema_sha256,
140
+ mode=mode,
141
+ validator=validator,
142
+ sealed_calls=sealed_calls,
143
+ on_seal=on_seal,
144
+ )
145
+
146
+
147
+ def build_matched_null_proposer(problem: Any, *, seed: Optional[int] = None):
148
+ """The uninformed arm for a generative campaign: same schema, no model.
149
+
150
+ Returned rather than described, so an experiment cannot accidentally use the
151
+ catalogue-era null against a generative treatment. The schema digest it
152
+ reports is the same one :func:`build_generative_proposer` pins, and
153
+ :func:`require_matched_support` will say so.
154
+ """
155
+
156
+ candidate_schema_sha256(getattr(problem, "candidate_model", None))
157
+ return RandomProposer(seed=seed)
@@ -0,0 +1,10 @@
1
+ """Proposers: where candidates come from.
2
+
3
+ ``random`` needs no credentials and is also the control arm every claim about
4
+ a model should be measured against. ``llm`` is the model-driven proposer and
5
+ resolves through the harness registry.
6
+ """
7
+
8
+ from agent_evolve.proposers.random_proposer import RandomProposer
9
+
10
+ __all__ = ["RandomProposer"]
@@ -0,0 +1,188 @@
1
+ """A proposer that samples the candidate schema instead of calling a model.
2
+
3
+ This exists for two reasons and serves both equally.
4
+
5
+ It is the **credential-free path**: someone can install the package and watch
6
+ the loop run end to end -- seeds, validation, materialization, evaluation, a
7
+ Pareto front -- before deciding whether to spend anything on a provider.
8
+
9
+ It is also the **honest baseline**. Uninformed sampling over the same schema,
10
+ the same budget and the same evaluator is the control every claim in this
11
+ project is measured against, and on one benchmark a single median random draw
12
+ already accounted for roughly 80 percent of the hypervolume that a full
13
+ optimization run produced. Anyone deciding whether a model is worth paying for
14
+ on *their* problem should run this arm first. ``agent_evolve check`` does
15
+ exactly that.
16
+
17
+ Sampling is derived from the candidate model's JSON schema, so it needs no
18
+ problem-specific code. It is deliberately uninformed: it never reads the Pareto
19
+ front, the failures, or the insights, because a baseline that learned would not
20
+ be a baseline.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import random
26
+ import string
27
+ from typing import Any, Dict, List, Optional, Sequence
28
+
29
+ from agent_evolve.harness.base import HarnessBase
30
+
31
+ __all__ = ["RandomProposer"]
32
+
33
+ _MAX_TRIES_PER_CANDIDATE = 24
34
+
35
+
36
+ class RandomProposer(HarnessBase):
37
+ """Uninformed sampler over the candidate schema. No provider, no network."""
38
+
39
+ id = "random"
40
+
41
+ #: This proposer synthesises no guidance. Declared rather than
42
+ #: discovered, so the loop skips the insight calls instead of warning
43
+ #: about an empty return that is correct.
44
+ provides_insights = False
45
+
46
+ def __init__(self, seed: Optional[int] = None) -> None:
47
+ super().__init__()
48
+ self._rng = random.Random(seed)
49
+ self.calls: List[str] = []
50
+
51
+ # -- the seven harness operations -------------------------------------
52
+ # Candidate ops sample; insight ops return nothing, because an uninformed
53
+ # baseline that produced guidance would not be uninformed.
54
+
55
+ def generate_initial(self, n: int) -> List[Dict[str, Any]]:
56
+ return self._sample(n, "generate_initial")
57
+
58
+ def regenerate(
59
+ self,
60
+ failed_str: str,
61
+ n: int,
62
+ constraint_instruction: str,
63
+ performance_insights: str,
64
+ ) -> List[Dict[str, Any]]:
65
+ return self._sample(n, "regenerate")
66
+
67
+ def generate_offspring(
68
+ self,
69
+ pareto_str: str,
70
+ n: int,
71
+ constraint_instruction: str,
72
+ performance_insights: str,
73
+ ) -> List[Dict[str, Any]]:
74
+ return self._sample(n, "generate_offspring")
75
+
76
+ def regenerate_offspring(
77
+ self,
78
+ failed_str: str,
79
+ pareto_str: str,
80
+ n: int,
81
+ constraint_instruction: str,
82
+ performance_insights: str,
83
+ ) -> List[Dict[str, Any]]:
84
+ return self._sample(n, "regenerate_offspring")
85
+
86
+ def failure_insights(self, failed_str: str, n_failed: int) -> List[str]:
87
+ return []
88
+
89
+ def constraint_instruction(self, failed_str: str, previous: Optional[str] = None) -> str:
90
+ return previous or ""
91
+
92
+ def performance_insights(
93
+ self,
94
+ stats_str: str,
95
+ pareto_str: str,
96
+ previous: Optional[str] = None,
97
+ ) -> str:
98
+ return previous or ""
99
+
100
+ # -- sampling ----------------------------------------------------------
101
+
102
+ def _sample(self, n: int, op: str) -> List[Dict[str, Any]]:
103
+ self.calls.append(op)
104
+ schema = self._schema()
105
+ return [self._draw_object(schema, schema) for _ in range(max(0, n))]
106
+
107
+ def _schema(self) -> Dict[str, Any]:
108
+ ctx = self._ctx
109
+ model = getattr(ctx, "candidate_model", None) if ctx is not None else None
110
+ if model is None:
111
+ return {}
112
+ try:
113
+ return model.model_json_schema()
114
+ except Exception:
115
+ return {}
116
+
117
+ def _resolve(self, node: Dict[str, Any], root: Dict[str, Any]) -> Dict[str, Any]:
118
+ seen = 0
119
+ while isinstance(node, dict) and "$ref" in node and seen < 8:
120
+ ref = node["$ref"]
121
+ seen += 1
122
+ if not ref.startswith("#/"):
123
+ return {}
124
+ target: Any = root
125
+ for part in ref[2:].split("/"):
126
+ if not isinstance(target, dict) or part not in target:
127
+ return {}
128
+ target = target[part]
129
+ node = target if isinstance(target, dict) else {}
130
+ return node if isinstance(node, dict) else {}
131
+
132
+ def _draw_object(self, node: Dict[str, Any], root: Dict[str, Any]) -> Dict[str, Any]:
133
+ node = self._resolve(node, root)
134
+ props = node.get("properties") or {}
135
+ required = set(node.get("required") or props.keys())
136
+ out: Dict[str, Any] = {}
137
+ for name, sub in props.items():
138
+ if name in required:
139
+ out[name] = self._draw(sub, root)
140
+ return out
141
+
142
+ def _draw(self, node: Dict[str, Any], root: Dict[str, Any], depth: int = 0) -> Any:
143
+ node = self._resolve(node, root)
144
+ if depth > 6:
145
+ return None
146
+ if "enum" in node and node["enum"]:
147
+ return self._rng.choice(list(node["enum"]))
148
+ if "const" in node:
149
+ return node["const"]
150
+ for key in ("anyOf", "oneOf"):
151
+ if node.get(key):
152
+ return self._draw(self._rng.choice(list(node[key])), root, depth + 1)
153
+
154
+ kind = node.get("type")
155
+ if isinstance(kind, list):
156
+ kind = self._rng.choice([k for k in kind if k != "null"] or ["string"])
157
+
158
+ if kind == "integer":
159
+ lo = node.get("minimum", node.get("exclusiveMinimum", 0))
160
+ hi = node.get("maximum", node.get("exclusiveMaximum", lo + 16))
161
+ lo, hi = int(lo), int(hi)
162
+ return self._rng.randint(lo, hi) if hi >= lo else lo
163
+ if kind == "number":
164
+ lo = float(node.get("minimum", node.get("exclusiveMinimum", 0.0)))
165
+ hi = float(node.get("maximum", node.get("exclusiveMaximum", lo + 1.0)))
166
+ return self._rng.uniform(lo, hi) if hi >= lo else lo
167
+ if kind == "boolean":
168
+ return self._rng.random() < 0.5
169
+ if kind == "array":
170
+ items = node.get("items") or {}
171
+ lo = int(node.get("minItems", 1))
172
+ hi = int(node.get("maxItems", max(lo, 6)))
173
+ count = self._rng.randint(lo, hi) if hi >= lo else lo
174
+ drawn = [self._draw(items, root, depth + 1) for _ in range(count)]
175
+ if node.get("uniqueItems"):
176
+ unique: List[Any] = []
177
+ for value in drawn:
178
+ if value not in unique:
179
+ unique.append(value)
180
+ drawn = unique
181
+ return drawn
182
+ if kind == "object":
183
+ return self._draw_object(node, root)
184
+ if kind == "null":
185
+ return None
186
+
187
+ alphabet = string.ascii_lowercase
188
+ return "".join(self._rng.choice(alphabet) for _ in range(self._rng.randint(3, 8)))