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,261 @@
1
+ """Dependency-isolated qLogNEHVI policy for the ordinary agent runtime."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import math
8
+ from pathlib import Path
9
+ import tempfile
10
+ from dataclasses import dataclass, field
11
+
12
+ from agent_evolve.infrastructure.subprocess_boundary import (
13
+ ExplicitEnvironmentSubprocessBoundary,
14
+ )
15
+ from agent_evolve.integrations.botorch.finite_qlognehvi_identity import (
16
+ POLICY_DEFINITION_SHA256 as UNDERLYING_DEFINITION_SHA256,
17
+ POLICY_ID as UNDERLYING_POLICY_ID,
18
+ POLICY_VERSION as UNDERLYING_POLICY_VERSION,
19
+ )
20
+ from agent_evolve.ports.finite_acquisition import (
21
+ FiniteAcquisitionDecision,
22
+ FiniteAcquisitionPolicy,
23
+ FiniteAcquisitionRequest,
24
+ )
25
+ from agent_evolve.ports.finite_acquisition_json import (
26
+ finite_acquisition_decision_from_record,
27
+ )
28
+ from agent_evolve.ports.subprocess_boundary import (
29
+ BoundedSubprocessBoundary,
30
+ ChildProcessPolicy,
31
+ )
32
+
33
+
34
+ POLICY_ID = "isolated_botorch_finite_qlognehvi"
35
+ POLICY_VERSION = 1
36
+ WORKER_MODULE = "agent_evolve.integrations.botorch.finite_qlognehvi_worker"
37
+ _DEFINITION_DOMAIN = b"agent-evolve:isolated-botorch-finite-qlognehvi:v1\x00"
38
+
39
+
40
+ def _canonical_json(value: object) -> bytes:
41
+ return json.dumps(
42
+ value,
43
+ allow_nan=False,
44
+ ensure_ascii=True,
45
+ separators=(",", ":"),
46
+ sort_keys=True,
47
+ ).encode("ascii", errors="strict")
48
+
49
+
50
+ def _file_sha256(path: Path) -> str:
51
+ digest = hashlib.sha256()
52
+ with path.open("rb") as stream:
53
+ while chunk := stream.read(1024 * 1024):
54
+ digest.update(chunk)
55
+ return digest.hexdigest()
56
+
57
+
58
+ class FiniteAcquisitionSubprocessError(RuntimeError):
59
+ """The isolated numerical expert failed before an authenticated decision."""
60
+
61
+
62
+ @dataclass(frozen=True, slots=True)
63
+ class IsolatedBotorchQLogNehviFiniteAcquisition:
64
+ """Run the optional numerical expert in a pinned dependency environment."""
65
+
66
+ boundary: BoundedSubprocessBoundary
67
+ python_executable: Path
68
+ source_root: Path
69
+ mc_samples: int = 128
70
+ maximum_optimizer_batch_size: int = 2048
71
+ timeout_s: float = 900.0
72
+ policy_id: str = field(init=False, default=POLICY_ID)
73
+ policy_version: int = field(init=False, default=POLICY_VERSION)
74
+ definition_sha256: str = field(init=False, default="")
75
+
76
+ def __post_init__(self) -> None:
77
+ if not isinstance(self.boundary, BoundedSubprocessBoundary):
78
+ raise TypeError("boundary must implement BoundedSubprocessBoundary")
79
+ if not isinstance(self.python_executable, Path) or not self.python_executable.is_absolute():
80
+ raise ValueError("python_executable must be an absolute pathlib.Path")
81
+ if not isinstance(self.source_root, Path) or not self.source_root.is_absolute():
82
+ raise ValueError("source_root must be an absolute pathlib.Path")
83
+ executable = self.python_executable.resolve(strict=True)
84
+ source_root = self.source_root.resolve(strict=True)
85
+ if not executable.is_file():
86
+ raise ValueError("python_executable must resolve to a file")
87
+ if not source_root.is_dir() or not (source_root / "agent_evolve").is_dir():
88
+ raise ValueError("source_root must contain the agent_evolve package")
89
+ if type(self.mc_samples) is not int or self.mc_samples < 16:
90
+ raise ValueError("mc_samples must be an exact integer of at least 16")
91
+ if (
92
+ type(self.maximum_optimizer_batch_size) is not int
93
+ or self.maximum_optimizer_batch_size < 1
94
+ ):
95
+ raise ValueError("maximum_optimizer_batch_size must be positive")
96
+ if (
97
+ isinstance(self.timeout_s, bool)
98
+ or not isinstance(self.timeout_s, (int, float))
99
+ or not math.isfinite(float(self.timeout_s))
100
+ or float(self.timeout_s) <= 0.0
101
+ ):
102
+ raise ValueError("timeout_s must be finite and positive")
103
+ worker = Path(__file__).with_name("finite_qlognehvi_worker.py").resolve(
104
+ strict=True
105
+ )
106
+ direct_policy = Path(__file__).with_name("finite_qlognehvi.py").resolve(
107
+ strict=True
108
+ )
109
+ record = {
110
+ "schema_version": 1,
111
+ "policy_id": POLICY_ID,
112
+ "policy_version": POLICY_VERSION,
113
+ "underlying_policy": {
114
+ "policy_id": UNDERLYING_POLICY_ID,
115
+ "policy_version": UNDERLYING_POLICY_VERSION,
116
+ "definition_sha256": UNDERLYING_DEFINITION_SHA256,
117
+ },
118
+ "worker_module": WORKER_MODULE,
119
+ "worker_source_sha256": _file_sha256(worker),
120
+ "direct_policy_source_sha256": _file_sha256(direct_policy),
121
+ "python_executable_sha256": _file_sha256(executable),
122
+ "python_invocation": self.boundary.invocation_observation(
123
+ str(self.python_executable)
124
+ ),
125
+ "process_boundary_identity_sha256": self.boundary.identity_sha256,
126
+ "mc_samples": self.mc_samples,
127
+ "maximum_optimizer_batch_size": self.maximum_optimizer_batch_size,
128
+ "timeout_s_hex": float(self.timeout_s).hex(),
129
+ "transport": "authenticated-json-files-exact-argv-no-shell",
130
+ "workload_model_provider_branches": False,
131
+ }
132
+ object.__setattr__(
133
+ self,
134
+ "definition_sha256",
135
+ hashlib.sha256(_DEFINITION_DOMAIN + _canonical_json(record)).hexdigest(),
136
+ )
137
+
138
+ def select(self, request: FiniteAcquisitionRequest) -> FiniteAcquisitionDecision:
139
+ self.__post_init__()
140
+ if type(request) is not FiniteAcquisitionRequest:
141
+ raise TypeError("request must be an exact FiniteAcquisitionRequest")
142
+ FiniteAcquisitionRequest.__post_init__(request)
143
+ with tempfile.TemporaryDirectory(prefix="agent-evolve-qlognehvi-") as directory:
144
+ root = Path(directory)
145
+ request_path = root / "request.json"
146
+ response_path = root / "response.json"
147
+ request_path.write_bytes(_canonical_json(request.to_record()))
148
+ result = self.boundary.run(
149
+ (
150
+ str(self.python_executable),
151
+ "-m",
152
+ WORKER_MODULE,
153
+ "--request",
154
+ str(request_path),
155
+ "--response",
156
+ str(response_path),
157
+ "--mc-samples",
158
+ str(self.mc_samples),
159
+ "--maximum-optimizer-batch-size",
160
+ str(self.maximum_optimizer_batch_size),
161
+ ),
162
+ timeout_s=float(self.timeout_s),
163
+ )
164
+ if result.returncode != 0:
165
+ stderr = result.stderr[-8000:]
166
+ raise FiniteAcquisitionSubprocessError(
167
+ f"isolated qLogNEHVI exited {result.returncode}: {stderr}"
168
+ )
169
+ if not response_path.is_file():
170
+ raise FiniteAcquisitionSubprocessError(
171
+ "isolated qLogNEHVI produced no response"
172
+ )
173
+ payload = json.loads(response_path.read_text(encoding="ascii"))
174
+ if (
175
+ type(payload) is not dict
176
+ or set(payload) != {"schema_version", "decision"}
177
+ or payload["schema_version"] != 1
178
+ ):
179
+ raise ValueError("isolated qLogNEHVI returned a foreign response schema")
180
+ underlying = finite_acquisition_decision_from_record(payload["decision"])
181
+ if underlying.request_sha256 != request.request_sha256:
182
+ raise ValueError("isolated qLogNEHVI decision targets another request")
183
+ if (
184
+ underlying.policy_id,
185
+ underlying.policy_version,
186
+ underlying.policy_definition_sha256,
187
+ ) != (
188
+ UNDERLYING_POLICY_ID,
189
+ UNDERLYING_POLICY_VERSION,
190
+ UNDERLYING_DEFINITION_SHA256,
191
+ ):
192
+ raise ValueError("isolated qLogNEHVI returned a foreign policy identity")
193
+ diagnostics = dict(underlying.diagnostics)
194
+ diagnostics.update(
195
+ {
196
+ "execution_boundary_sha256": self.boundary.identity_sha256,
197
+ "underlying_decision_sha256": underlying.decision_sha256,
198
+ "underlying_policy_definition_sha256": (
199
+ UNDERLYING_DEFINITION_SHA256
200
+ ),
201
+ "worker_stderr_sha256": hashlib.sha256(
202
+ result.stderr.encode("utf-8")
203
+ ).hexdigest(),
204
+ "worker_stdout_sha256": hashlib.sha256(
205
+ result.stdout.encode("utf-8")
206
+ ).hexdigest(),
207
+ }
208
+ )
209
+ return FiniteAcquisitionDecision(
210
+ request_sha256=request.request_sha256,
211
+ policy_id=self.policy_id,
212
+ policy_version=self.policy_version,
213
+ policy_definition_sha256=self.definition_sha256,
214
+ selected=underlying.selected,
215
+ diagnostics=tuple(sorted(diagnostics.items())),
216
+ )
217
+
218
+
219
+ def build_isolated_botorch_qlognehvi(
220
+ *,
221
+ python_executable: Path,
222
+ source_root: Path,
223
+ mc_samples: int = 128,
224
+ maximum_optimizer_batch_size: int = 2048,
225
+ timeout_s: float = 900.0,
226
+ ) -> IsolatedBotorchQLogNehviFiniteAcquisition:
227
+ """Build the isolated expert with a deny-by-default child environment."""
228
+
229
+ resolved_source = source_root.resolve(strict=True)
230
+ process_policy = ChildProcessPolicy(
231
+ policy_id="isolated_botorch_qlognehvi_worker",
232
+ policy_version=1,
233
+ inherited_environment_allowlist=(),
234
+ fixed_environment=(
235
+ ("LANG", "C.UTF-8"),
236
+ ("PYTHONHASHSEED", "0"),
237
+ ("PYTHONPATH", str(resolved_source)),
238
+ ),
239
+ )
240
+ boundary = ExplicitEnvironmentSubprocessBoundary(
241
+ policy=process_policy,
242
+ working_directory=resolved_source,
243
+ source_environment={},
244
+ )
245
+ return IsolatedBotorchQLogNehviFiniteAcquisition(
246
+ boundary=boundary,
247
+ python_executable=python_executable,
248
+ source_root=resolved_source,
249
+ mc_samples=mc_samples,
250
+ maximum_optimizer_batch_size=maximum_optimizer_batch_size,
251
+ timeout_s=timeout_s,
252
+ )
253
+
254
+
255
+ __all__ = [
256
+ "FiniteAcquisitionSubprocessError",
257
+ "IsolatedBotorchQLogNehviFiniteAcquisition",
258
+ "POLICY_ID",
259
+ "POLICY_VERSION",
260
+ "build_isolated_botorch_qlognehvi",
261
+ ]
@@ -0,0 +1,273 @@
1
+ """Dependency-isolated qLogNEHVI scorer for fixed finite slates."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import math
8
+ from dataclasses import dataclass, field
9
+ from pathlib import Path
10
+ import tempfile
11
+
12
+ from agent_evolve.infrastructure.subprocess_boundary import (
13
+ ExplicitEnvironmentSubprocessBoundary,
14
+ )
15
+ from agent_evolve.integrations.botorch.finite_qlognehvi_batch_identity import (
16
+ POLICY_DEFINITION_SHA256 as UNDERLYING_DEFINITION_SHA256,
17
+ POLICY_ID as UNDERLYING_POLICY_ID,
18
+ POLICY_VERSION as UNDERLYING_POLICY_VERSION,
19
+ )
20
+ from agent_evolve.ports.finite_acquisition_batch import (
21
+ FiniteAcquisitionBatchScoreDecision,
22
+ FiniteAcquisitionBatchScorePolicy,
23
+ FiniteAcquisitionBatchScoreRequest,
24
+ validate_finite_acquisition_batch_score_decision,
25
+ )
26
+ from agent_evolve.ports.finite_acquisition_batch_json import (
27
+ finite_acquisition_batch_score_decision_from_record,
28
+ )
29
+ from agent_evolve.ports.subprocess_boundary import (
30
+ BoundedSubprocessBoundary,
31
+ ChildProcessPolicy,
32
+ )
33
+
34
+
35
+ POLICY_ID = "isolated_botorch_finite_qlognehvi_batch_score"
36
+ POLICY_VERSION = 1
37
+ WORKER_MODULE = "agent_evolve.integrations.botorch.finite_qlognehvi_batch_worker"
38
+ _DEFINITION_DOMAIN = b"agent-evolve:isolated-botorch-qlognehvi-batch-score:v1\x00"
39
+
40
+
41
+ def _canonical_json(value: object) -> bytes:
42
+ return json.dumps(
43
+ value,
44
+ allow_nan=False,
45
+ ensure_ascii=True,
46
+ separators=(",", ":"),
47
+ sort_keys=True,
48
+ ).encode("ascii", errors="strict")
49
+
50
+
51
+ def _file_sha256(path: Path) -> str:
52
+ digest = hashlib.sha256()
53
+ with path.open("rb") as stream:
54
+ while chunk := stream.read(1024 * 1024):
55
+ digest.update(chunk)
56
+ return digest.hexdigest()
57
+
58
+
59
+ class FiniteAcquisitionBatchScoreSubprocessError(RuntimeError):
60
+ """The isolated scorer failed before producing an authenticated decision."""
61
+
62
+
63
+ @dataclass(frozen=True, slots=True)
64
+ class IsolatedBotorchQLogNehviFiniteBatchScorePolicy:
65
+ """Score sealed slates in the pinned optional-dependency environment."""
66
+
67
+ boundary: BoundedSubprocessBoundary
68
+ python_executable: Path
69
+ source_root: Path
70
+ mc_samples: int = 128
71
+ maximum_score_batch_size: int = 512
72
+ timeout_s: float = 900.0
73
+ policy_id: str = field(init=False, default=POLICY_ID)
74
+ policy_version: int = field(init=False, default=POLICY_VERSION)
75
+ definition_sha256: str = field(init=False, default="")
76
+
77
+ def __post_init__(self) -> None:
78
+ if not isinstance(self.boundary, BoundedSubprocessBoundary):
79
+ raise TypeError("boundary must implement BoundedSubprocessBoundary")
80
+ if not isinstance(self.python_executable, Path) or not (
81
+ self.python_executable.is_absolute()
82
+ ):
83
+ raise ValueError("python_executable must be an absolute pathlib.Path")
84
+ if not isinstance(self.source_root, Path) or not self.source_root.is_absolute():
85
+ raise ValueError("source_root must be an absolute pathlib.Path")
86
+ executable = self.python_executable.resolve(strict=True)
87
+ source_root = self.source_root.resolve(strict=True)
88
+ if not executable.is_file():
89
+ raise ValueError("python_executable must resolve to a file")
90
+ if not source_root.is_dir() or not (source_root / "agent_evolve").is_dir():
91
+ raise ValueError("source_root must contain the agent_evolve package")
92
+ if type(self.mc_samples) is not int or self.mc_samples < 16:
93
+ raise ValueError("mc_samples must be an exact integer of at least 16")
94
+ if (
95
+ type(self.maximum_score_batch_size) is not int
96
+ or self.maximum_score_batch_size < 1
97
+ ):
98
+ raise ValueError("maximum_score_batch_size must be positive")
99
+ if (
100
+ isinstance(self.timeout_s, bool)
101
+ or not isinstance(self.timeout_s, (int, float))
102
+ or not math.isfinite(float(self.timeout_s))
103
+ or float(self.timeout_s) <= 0.0
104
+ ):
105
+ raise ValueError("timeout_s must be finite and positive")
106
+ package = Path(__file__).resolve().parent
107
+ record = {
108
+ "schema_version": 1,
109
+ "policy_id": POLICY_ID,
110
+ "policy_version": POLICY_VERSION,
111
+ "underlying_policy": {
112
+ "policy_id": UNDERLYING_POLICY_ID,
113
+ "policy_version": UNDERLYING_POLICY_VERSION,
114
+ "definition_sha256": UNDERLYING_DEFINITION_SHA256,
115
+ },
116
+ "worker_module": WORKER_MODULE,
117
+ "worker_source_sha256": _file_sha256(
118
+ package / "finite_qlognehvi_batch_worker.py"
119
+ ),
120
+ "direct_policy_source_sha256": _file_sha256(
121
+ package / "finite_qlognehvi_batch.py"
122
+ ),
123
+ "python_executable_sha256": _file_sha256(executable),
124
+ "python_invocation": self.boundary.invocation_observation(
125
+ str(self.python_executable)
126
+ ),
127
+ "process_boundary_identity_sha256": self.boundary.identity_sha256,
128
+ "mc_samples": self.mc_samples,
129
+ "maximum_score_batch_size": self.maximum_score_batch_size,
130
+ "timeout_s_hex": float(self.timeout_s).hex(),
131
+ "transport": "authenticated-json-files-exact-argv-no-shell",
132
+ "common_fit_and_sampler_per_request": True,
133
+ "workload_model_provider_branches": False,
134
+ }
135
+ object.__setattr__(
136
+ self,
137
+ "definition_sha256",
138
+ hashlib.sha256(_DEFINITION_DOMAIN + _canonical_json(record)).hexdigest(),
139
+ )
140
+
141
+ def score(
142
+ self,
143
+ request: FiniteAcquisitionBatchScoreRequest,
144
+ ) -> FiniteAcquisitionBatchScoreDecision:
145
+ self.__post_init__()
146
+ if type(request) is not FiniteAcquisitionBatchScoreRequest:
147
+ raise TypeError("request must be an exact batch-score request")
148
+ request.__post_init__()
149
+ with tempfile.TemporaryDirectory(
150
+ prefix="agent-evolve-qlognehvi-batch-score-"
151
+ ) as directory:
152
+ root = Path(directory)
153
+ request_path = root / "request.json"
154
+ response_path = root / "response.json"
155
+ request_path.write_bytes(_canonical_json(request.to_record()))
156
+ result = self.boundary.run(
157
+ (
158
+ str(self.python_executable),
159
+ "-m",
160
+ WORKER_MODULE,
161
+ "--request",
162
+ str(request_path),
163
+ "--response",
164
+ str(response_path),
165
+ "--mc-samples",
166
+ str(self.mc_samples),
167
+ "--maximum-score-batch-size",
168
+ str(self.maximum_score_batch_size),
169
+ ),
170
+ timeout_s=float(self.timeout_s),
171
+ )
172
+ if result.returncode != 0:
173
+ raise FiniteAcquisitionBatchScoreSubprocessError(
174
+ "isolated qLogNEHVI batch scorer exited "
175
+ f"{result.returncode}: {result.stderr[-8000:]}"
176
+ )
177
+ if not response_path.is_file():
178
+ raise FiniteAcquisitionBatchScoreSubprocessError(
179
+ "isolated qLogNEHVI batch scorer produced no response"
180
+ )
181
+ payload = json.loads(response_path.read_text(encoding="ascii"))
182
+ if (
183
+ type(payload) is not dict
184
+ or set(payload) != {"schema_version", "decision"}
185
+ or payload["schema_version"] != 1
186
+ ):
187
+ raise ValueError("isolated qLogNEHVI scorer returned a foreign schema")
188
+ underlying = finite_acquisition_batch_score_decision_from_record(
189
+ payload["decision"]
190
+ )
191
+ validate_finite_acquisition_batch_score_decision(request, underlying)
192
+ if (
193
+ underlying.policy_id,
194
+ underlying.policy_version,
195
+ underlying.policy_definition_sha256,
196
+ ) != (
197
+ UNDERLYING_POLICY_ID,
198
+ UNDERLYING_POLICY_VERSION,
199
+ UNDERLYING_DEFINITION_SHA256,
200
+ ):
201
+ raise ValueError("isolated qLogNEHVI scorer returned a foreign identity")
202
+ diagnostics = dict(underlying.diagnostics)
203
+ diagnostics.update(
204
+ {
205
+ "execution_boundary_sha256": self.boundary.identity_sha256,
206
+ "underlying_decision_sha256": underlying.decision_sha256,
207
+ "underlying_policy_definition_sha256": (
208
+ UNDERLYING_DEFINITION_SHA256
209
+ ),
210
+ "worker_stderr_sha256": hashlib.sha256(
211
+ result.stderr.encode("utf-8")
212
+ ).hexdigest(),
213
+ "worker_stdout_sha256": hashlib.sha256(
214
+ result.stdout.encode("utf-8")
215
+ ).hexdigest(),
216
+ }
217
+ )
218
+ return FiniteAcquisitionBatchScoreDecision(
219
+ request_sha256=request.request_sha256,
220
+ policy_id=self.policy_id,
221
+ policy_version=self.policy_version,
222
+ policy_definition_sha256=self.definition_sha256,
223
+ scores=underlying.scores,
224
+ diagnostics=tuple(sorted(diagnostics.items())),
225
+ )
226
+
227
+
228
+ def build_isolated_botorch_qlognehvi_batch_score(
229
+ *,
230
+ python_executable: Path,
231
+ source_root: Path,
232
+ mc_samples: int = 128,
233
+ maximum_score_batch_size: int = 512,
234
+ timeout_s: float = 900.0,
235
+ ) -> IsolatedBotorchQLogNehviFiniteBatchScorePolicy:
236
+ """Build the scorer with a deny-by-default child environment."""
237
+
238
+ resolved_source = source_root.resolve(strict=True)
239
+ process_policy = ChildProcessPolicy(
240
+ policy_id="isolated_botorch_qlognehvi_batch_score_worker",
241
+ policy_version=1,
242
+ inherited_environment_allowlist=(),
243
+ fixed_environment=(
244
+ ("LANG", "C.UTF-8"),
245
+ ("PYTHONHASHSEED", "0"),
246
+ ("PYTHONPATH", str(resolved_source)),
247
+ ),
248
+ )
249
+ boundary = ExplicitEnvironmentSubprocessBoundary(
250
+ policy=process_policy,
251
+ working_directory=resolved_source,
252
+ source_environment={},
253
+ )
254
+ policy = IsolatedBotorchQLogNehviFiniteBatchScorePolicy(
255
+ boundary=boundary,
256
+ python_executable=python_executable,
257
+ source_root=resolved_source,
258
+ mc_samples=mc_samples,
259
+ maximum_score_batch_size=maximum_score_batch_size,
260
+ timeout_s=timeout_s,
261
+ )
262
+ if not isinstance(policy, FiniteAcquisitionBatchScorePolicy):
263
+ raise AssertionError("isolated batch scorer does not satisfy its port")
264
+ return policy
265
+
266
+
267
+ __all__ = [
268
+ "FiniteAcquisitionBatchScoreSubprocessError",
269
+ "IsolatedBotorchQLogNehviFiniteBatchScorePolicy",
270
+ "POLICY_ID",
271
+ "POLICY_VERSION",
272
+ "build_isolated_botorch_qlognehvi_batch_score",
273
+ ]