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,190 @@
1
+ """Numerically stable qNEHVI over a sealed finite candidate pool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from dataclasses import dataclass
7
+
8
+ import botorch
9
+ import gpytorch
10
+ import torch
11
+ from botorch.acquisition.multi_objective.logei import (
12
+ qLogNoisyExpectedHypervolumeImprovement,
13
+ )
14
+ from botorch.fit import fit_gpytorch_mll
15
+ from botorch.models import SingleTaskGP
16
+ from botorch.models.transforms.outcome import Standardize
17
+ from botorch.optim import optimize_acqf_discrete
18
+ from botorch.sampling.normal import SobolQMCNormalSampler
19
+ from gpytorch.mlls import ExactMarginalLogLikelihood
20
+
21
+ from agent_evolve.ports.finite_acquisition import (
22
+ FiniteAcquisitionDecision,
23
+ FiniteAcquisitionRequest,
24
+ FiniteAcquisitionSelection,
25
+ )
26
+ from agent_evolve.integrations.botorch.finite_qlognehvi_identity import (
27
+ POLICY_DEFINITION_SHA256,
28
+ POLICY_ID,
29
+ POLICY_VERSION,
30
+ )
31
+
32
+
33
+ def _training_tensors(
34
+ request: FiniteAcquisitionRequest,
35
+ *,
36
+ dtype: torch.dtype,
37
+ ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
38
+ train_x = torch.tensor(
39
+ [value.features for value in request.observations],
40
+ dtype=dtype,
41
+ device=torch.device("cpu"),
42
+ )
43
+ axis_by_metric = {value.metric_id: value for value in request.objectives}
44
+ train_y = torch.tensor(
45
+ [
46
+ [
47
+ axis_by_metric[metric_id].maximize_value(raw_value)
48
+ for metric_id, raw_value in observation.objectives
49
+ ]
50
+ for observation in request.observations
51
+ ],
52
+ dtype=dtype,
53
+ device=train_x.device,
54
+ )
55
+ # Current benchmark evaluators are deterministic but numerically finite.
56
+ # A small declared observation variance avoids treating floating-point
57
+ # objective resolution as mathematical exactness.
58
+ train_yvar = torch.full_like(train_y, 1.0e-6)
59
+ return train_x, train_y, train_yvar
60
+
61
+
62
+ @dataclass(frozen=True, slots=True)
63
+ class BotorchQLogNehviFiniteAcquisition:
64
+ """Fit one past-only GP and select an exact unique finite batch."""
65
+
66
+ mc_samples: int = 128
67
+ maximum_optimizer_batch_size: int = 2048
68
+ policy_id: str = POLICY_ID
69
+ policy_version: int = POLICY_VERSION
70
+ definition_sha256: str = POLICY_DEFINITION_SHA256
71
+
72
+ def __post_init__(self) -> None:
73
+ if type(self.mc_samples) is not int or self.mc_samples < 16:
74
+ raise ValueError("mc_samples must be an exact integer of at least 16")
75
+ if (
76
+ type(self.maximum_optimizer_batch_size) is not int
77
+ or self.maximum_optimizer_batch_size < 1
78
+ ):
79
+ raise ValueError("maximum_optimizer_batch_size must be positive")
80
+ if (
81
+ self.policy_id != POLICY_ID
82
+ or self.policy_version != POLICY_VERSION
83
+ or self.definition_sha256 != POLICY_DEFINITION_SHA256
84
+ ):
85
+ raise ValueError("qLogNEHVI policy identity drifted")
86
+
87
+ def select(self, request: FiniteAcquisitionRequest) -> FiniteAcquisitionDecision:
88
+ self.__post_init__()
89
+ if type(request) is not FiniteAcquisitionRequest:
90
+ raise TypeError("request must be an exact FiniteAcquisitionRequest")
91
+ request.__post_init__()
92
+ dtype = torch.double
93
+ train_x, train_y, train_yvar = _training_tensors(request, dtype=dtype)
94
+ model = SingleTaskGP(
95
+ train_X=train_x,
96
+ train_Y=train_y,
97
+ train_Yvar=train_yvar,
98
+ outcome_transform=Standardize(m=len(request.objectives)),
99
+ )
100
+ mll = ExactMarginalLogLikelihood(model.likelihood, model)
101
+ fit_gpytorch_mll(mll)
102
+ model.eval()
103
+ sampler = SobolQMCNormalSampler(
104
+ sample_shape=torch.Size([self.mc_samples]),
105
+ seed=request.seed,
106
+ )
107
+ acquisition = qLogNoisyExpectedHypervolumeImprovement(
108
+ model=model,
109
+ ref_point=torch.zeros(
110
+ len(request.objectives),
111
+ dtype=dtype,
112
+ device=train_x.device,
113
+ ),
114
+ X_baseline=train_x,
115
+ sampler=sampler,
116
+ prune_baseline=True,
117
+ cache_root=True,
118
+ )
119
+ choices = torch.tensor(
120
+ [value.features for value in request.candidates],
121
+ dtype=dtype,
122
+ device=train_x.device,
123
+ )
124
+ selected_x, acquisition_values = optimize_acqf_discrete(
125
+ acq_function=acquisition,
126
+ q=request.batch_size,
127
+ choices=choices,
128
+ max_batch_size=self.maximum_optimizer_batch_size,
129
+ unique=True,
130
+ return_acq_values=True,
131
+ )
132
+ candidate_by_features = {
133
+ value.features: value for value in request.candidates
134
+ }
135
+ selected_rows = []
136
+ flat_values = acquisition_values.detach().cpu().reshape(-1).tolist()
137
+ if len(flat_values) == 1 and request.batch_size > 1:
138
+ flat_values = flat_values * request.batch_size
139
+ if len(flat_values) != request.batch_size:
140
+ raise RuntimeError("BoTorch returned an unexpected acquisition shape")
141
+ for feature_tensor, acquisition_value in zip(
142
+ selected_x.detach().cpu(),
143
+ flat_values,
144
+ strict=True,
145
+ ):
146
+ feature_key = tuple(float(value) for value in feature_tensor.tolist())
147
+ candidate = candidate_by_features.get(feature_key)
148
+ if candidate is None:
149
+ raise RuntimeError("BoTorch selected a row outside the finite pool")
150
+ value = float(acquisition_value)
151
+ if not math.isfinite(value):
152
+ raise RuntimeError("BoTorch returned a non-finite acquisition value")
153
+ selected_rows.append(
154
+ FiniteAcquisitionSelection(
155
+ candidate_id=candidate.candidate_id,
156
+ configuration_sha256=candidate.configuration_sha256,
157
+ acquisition_value=value,
158
+ )
159
+ )
160
+ if len({value.candidate_id for value in selected_rows}) != request.batch_size:
161
+ raise RuntimeError("BoTorch did not return a unique exact batch")
162
+ return FiniteAcquisitionDecision(
163
+ request_sha256=request.request_sha256,
164
+ policy_id=self.policy_id,
165
+ policy_version=self.policy_version,
166
+ policy_definition_sha256=self.definition_sha256,
167
+ selected=tuple(selected_rows),
168
+ diagnostics=tuple(
169
+ sorted(
170
+ (
171
+ ("botorch_version", str(botorch.__version__)),
172
+ ("candidate_pool_size", str(len(request.candidates))),
173
+ ("feature_dimension", str(train_x.shape[-1])),
174
+ ("gpytorch_version", str(gpytorch.__version__)),
175
+ ("mc_samples", str(self.mc_samples)),
176
+ ("objective_count", str(train_y.shape[-1])),
177
+ ("observation_count", str(train_x.shape[-2])),
178
+ ("torch_version", str(torch.__version__)),
179
+ )
180
+ )
181
+ ),
182
+ )
183
+
184
+
185
+ __all__ = [
186
+ "BotorchQLogNehviFiniteAcquisition",
187
+ "POLICY_DEFINITION_SHA256",
188
+ "POLICY_ID",
189
+ "POLICY_VERSION",
190
+ ]
@@ -0,0 +1,155 @@
1
+ """Common-realization qLogNEHVI values for sealed finite slates."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from dataclasses import dataclass
7
+
8
+ import botorch
9
+ import gpytorch
10
+ import torch
11
+ from botorch.acquisition.multi_objective.logei import (
12
+ qLogNoisyExpectedHypervolumeImprovement,
13
+ )
14
+ from botorch.fit import fit_gpytorch_mll
15
+ from botorch.models import SingleTaskGP
16
+ from botorch.models.transforms.outcome import Standardize
17
+ from botorch.sampling.normal import SobolQMCNormalSampler
18
+ from gpytorch.mlls import ExactMarginalLogLikelihood
19
+
20
+ from agent_evolve.integrations.botorch.finite_qlognehvi import _training_tensors
21
+ from agent_evolve.integrations.botorch.finite_qlognehvi_batch_identity import (
22
+ POLICY_DEFINITION_SHA256,
23
+ POLICY_ID,
24
+ POLICY_VERSION,
25
+ )
26
+ from agent_evolve.ports.finite_acquisition_batch import (
27
+ FiniteAcquisitionBatchScoreDecision,
28
+ FiniteAcquisitionBatchScoreRequest,
29
+ FiniteAcquisitionSlateScore,
30
+ )
31
+
32
+
33
+ @dataclass(frozen=True, slots=True)
34
+ class BotorchQLogNehviFiniteBatchScorePolicy:
35
+ """Fit once and score every supplied slate under one acquisition object."""
36
+
37
+ mc_samples: int = 128
38
+ maximum_score_batch_size: int = 512
39
+ policy_id: str = POLICY_ID
40
+ policy_version: int = POLICY_VERSION
41
+ definition_sha256: str = POLICY_DEFINITION_SHA256
42
+
43
+ def __post_init__(self) -> None:
44
+ if type(self.mc_samples) is not int or self.mc_samples < 16:
45
+ raise ValueError("mc_samples must be an exact integer of at least 16")
46
+ if (
47
+ type(self.maximum_score_batch_size) is not int
48
+ or self.maximum_score_batch_size < 1
49
+ ):
50
+ raise ValueError("maximum_score_batch_size must be positive")
51
+ if (
52
+ self.policy_id != POLICY_ID
53
+ or self.policy_version != POLICY_VERSION
54
+ or self.definition_sha256 != POLICY_DEFINITION_SHA256
55
+ ):
56
+ raise ValueError("qLogNEHVI batch-score policy identity drifted")
57
+
58
+ def score(
59
+ self,
60
+ request: FiniteAcquisitionBatchScoreRequest,
61
+ ) -> FiniteAcquisitionBatchScoreDecision:
62
+ self.__post_init__()
63
+ if type(request) is not FiniteAcquisitionBatchScoreRequest:
64
+ raise TypeError("request must be exact")
65
+ request.__post_init__()
66
+ dtype = torch.double
67
+ # GP fitting may use torch randomness internally. The worker process is
68
+ # isolated, but explicitly seeding here also makes direct invocations
69
+ # replayable and keeps every compared slate on one fitted realization.
70
+ torch.manual_seed(request.seed)
71
+ train_x, train_y, train_yvar = _training_tensors(request, dtype=dtype)
72
+ model = SingleTaskGP(
73
+ train_X=train_x,
74
+ train_Y=train_y,
75
+ train_Yvar=train_yvar,
76
+ outcome_transform=Standardize(m=len(request.objectives)),
77
+ )
78
+ mll = ExactMarginalLogLikelihood(model.likelihood, model)
79
+ fit_gpytorch_mll(mll)
80
+ model.eval()
81
+ sampler = SobolQMCNormalSampler(
82
+ sample_shape=torch.Size([self.mc_samples]),
83
+ seed=request.seed,
84
+ )
85
+ acquisition = qLogNoisyExpectedHypervolumeImprovement(
86
+ model=model,
87
+ ref_point=torch.zeros(
88
+ len(request.objectives),
89
+ dtype=dtype,
90
+ device=train_x.device,
91
+ ),
92
+ X_baseline=train_x,
93
+ sampler=sampler,
94
+ prune_baseline=True,
95
+ cache_root=True,
96
+ )
97
+ candidate_by_id = {value.candidate_id: value for value in request.candidates}
98
+ scores: list[FiniteAcquisitionSlateScore] = []
99
+ for start in range(0, len(request.slates), self.maximum_score_batch_size):
100
+ slate_chunk = request.slates[
101
+ start : start + self.maximum_score_batch_size
102
+ ]
103
+ rows = torch.tensor(
104
+ [
105
+ [candidate_by_id[value].features for value in slate.candidate_ids]
106
+ for slate in slate_chunk
107
+ ],
108
+ dtype=dtype,
109
+ device=train_x.device,
110
+ )
111
+ with torch.no_grad():
112
+ values = acquisition(rows).detach().cpu().reshape(-1).tolist()
113
+ if len(values) != len(slate_chunk):
114
+ raise RuntimeError("BoTorch returned an unexpected slate-score shape")
115
+ for slate, raw in zip(slate_chunk, values, strict=True):
116
+ value = float(raw)
117
+ if not math.isfinite(value):
118
+ raise RuntimeError("BoTorch returned a non-finite slate score")
119
+ scores.append(
120
+ FiniteAcquisitionSlateScore(
121
+ slate=slate,
122
+ log_acquisition_value=value,
123
+ )
124
+ )
125
+ return FiniteAcquisitionBatchScoreDecision(
126
+ request_sha256=request.request_sha256,
127
+ policy_id=self.policy_id,
128
+ policy_version=self.policy_version,
129
+ policy_definition_sha256=self.definition_sha256,
130
+ scores=tuple(scores),
131
+ diagnostics=tuple(
132
+ sorted(
133
+ (
134
+ ("botorch_version", str(botorch.__version__)),
135
+ ("candidate_count", str(len(request.candidates))),
136
+ ("feature_dimension", str(train_x.shape[-1])),
137
+ ("gpytorch_version", str(gpytorch.__version__)),
138
+ ("mc_samples", str(self.mc_samples)),
139
+ ("objective_count", str(train_y.shape[-1])),
140
+ ("observation_count", str(train_x.shape[-2])),
141
+ ("slate_count", str(len(request.slates))),
142
+ ("slate_size", str(request.batch_size)),
143
+ ("torch_version", str(torch.__version__)),
144
+ )
145
+ )
146
+ ),
147
+ )
148
+
149
+
150
+ __all__ = [
151
+ "BotorchQLogNehviFiniteBatchScorePolicy",
152
+ "POLICY_DEFINITION_SHA256",
153
+ "POLICY_ID",
154
+ "POLICY_VERSION",
155
+ ]
@@ -0,0 +1,20 @@
1
+ """Dependency-free identity of the direct qLogNEHVI batch scorer."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+
7
+
8
+ POLICY_ID = "botorch_finite_qlognehvi_batch_score"
9
+ POLICY_VERSION = 1
10
+ POLICY_DEFINITION_SHA256 = hashlib.sha256(
11
+ b"agent-evolve:botorch-finite-qlognehvi-batch-score:v1;"
12
+ b"model=independent-output-singletask-gp-standardized;"
13
+ b"noise=declared-1e-6;acquisition=qlognehvi;"
14
+ b"reference=normalized-zero-vector;sampler=sobol-common-seed;"
15
+ b"input=sealed-equal-cardinality-slates;selection=false;"
16
+ b"all-slates-scored-under-one-fit-and-sampler=true;cpu-double=true"
17
+ ).hexdigest()
18
+
19
+
20
+ __all__ = ["POLICY_DEFINITION_SHA256", "POLICY_ID", "POLICY_VERSION"]
@@ -0,0 +1,55 @@
1
+ """Isolated JSON worker for common-realization qLogNEHVI slate scoring."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import json
7
+ from pathlib import Path
8
+
9
+ from agent_evolve.integrations.botorch.finite_qlognehvi_batch import (
10
+ BotorchQLogNehviFiniteBatchScorePolicy,
11
+ )
12
+ from agent_evolve.ports.finite_acquisition_batch_json import (
13
+ finite_acquisition_batch_score_request_from_record,
14
+ )
15
+
16
+
17
+ WORKER_SCHEMA_VERSION = 1
18
+
19
+
20
+ def _parser() -> argparse.ArgumentParser:
21
+ parser = argparse.ArgumentParser()
22
+ parser.add_argument("--request", required=True, type=Path)
23
+ parser.add_argument("--response", required=True, type=Path)
24
+ parser.add_argument("--mc-samples", required=True, type=int)
25
+ parser.add_argument("--maximum-score-batch-size", required=True, type=int)
26
+ return parser
27
+
28
+
29
+ def main() -> None:
30
+ arguments = _parser().parse_args()
31
+ payload = json.loads(arguments.request.read_text(encoding="ascii"))
32
+ request = finite_acquisition_batch_score_request_from_record(payload)
33
+ policy = BotorchQLogNehviFiniteBatchScorePolicy(
34
+ mc_samples=arguments.mc_samples,
35
+ maximum_score_batch_size=arguments.maximum_score_batch_size,
36
+ )
37
+ decision = policy.score(request)
38
+ response = {
39
+ "schema_version": WORKER_SCHEMA_VERSION,
40
+ "decision": decision.to_record(),
41
+ }
42
+ arguments.response.write_text(
43
+ json.dumps(
44
+ response,
45
+ allow_nan=False,
46
+ ensure_ascii=True,
47
+ separators=(",", ":"),
48
+ sort_keys=True,
49
+ ),
50
+ encoding="ascii",
51
+ )
52
+
53
+
54
+ if __name__ == "__main__": # pragma: no cover - exercised as a child process
55
+ main()
@@ -0,0 +1,22 @@
1
+ """Dependency-free identity for the optional BoTorch qLogNEHVI expert."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+
7
+
8
+ POLICY_ID = "botorch_finite_qlognehvi"
9
+ POLICY_VERSION = 1
10
+ POLICY_DEFINITION_SHA256 = hashlib.sha256(
11
+ b"agent-evolve:botorch-finite-qlognehvi:v1;"
12
+ b"model=independent-single-task-gp-known-noise-1e-6;"
13
+ b"outcome-transform=standardize;input-frame=adapter-normalized-unit-cube;"
14
+ b"objective-frame=fixed-affine-reference-zero-ideal-one;"
15
+ b"acquisition=qlog-noisy-expected-hypervolume-improvement;"
16
+ b"optimizer=exact-finite-discrete-unique;"
17
+ b"real-observations=prior-cutoff-only;"
18
+ b"configuration-materialization=outside-policy;workload-branches=false"
19
+ ).hexdigest()
20
+
21
+
22
+ __all__ = ["POLICY_DEFINITION_SHA256", "POLICY_ID", "POLICY_VERSION"]
@@ -0,0 +1,55 @@
1
+ """Isolated JSON worker for the optional BoTorch finite acquisition policy."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import json
7
+ from pathlib import Path
8
+
9
+ from agent_evolve.integrations.botorch.finite_qlognehvi import (
10
+ BotorchQLogNehviFiniteAcquisition,
11
+ )
12
+ from agent_evolve.ports.finite_acquisition_json import (
13
+ finite_acquisition_request_from_record,
14
+ )
15
+
16
+
17
+ WORKER_SCHEMA_VERSION = 1
18
+
19
+
20
+ def _parser() -> argparse.ArgumentParser:
21
+ parser = argparse.ArgumentParser()
22
+ parser.add_argument("--request", required=True, type=Path)
23
+ parser.add_argument("--response", required=True, type=Path)
24
+ parser.add_argument("--mc-samples", required=True, type=int)
25
+ parser.add_argument("--maximum-optimizer-batch-size", required=True, type=int)
26
+ return parser
27
+
28
+
29
+ def main() -> None:
30
+ arguments = _parser().parse_args()
31
+ payload = json.loads(arguments.request.read_text(encoding="ascii"))
32
+ request = finite_acquisition_request_from_record(payload)
33
+ policy = BotorchQLogNehviFiniteAcquisition(
34
+ mc_samples=arguments.mc_samples,
35
+ maximum_optimizer_batch_size=arguments.maximum_optimizer_batch_size,
36
+ )
37
+ decision = policy.select(request)
38
+ response = {
39
+ "schema_version": WORKER_SCHEMA_VERSION,
40
+ "decision": decision.to_record(),
41
+ }
42
+ arguments.response.write_text(
43
+ json.dumps(
44
+ response,
45
+ allow_nan=False,
46
+ ensure_ascii=True,
47
+ separators=(",", ":"),
48
+ sort_keys=True,
49
+ ),
50
+ encoding="ascii",
51
+ )
52
+
53
+
54
+ if __name__ == "__main__": # pragma: no cover - exercised as a child process
55
+ main()