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,184 @@
1
+ """Durable fail-closed phase commits for operational allocator-v3 waves."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from agent_evolve.application.two_stage_action_evolution import (
6
+ TwoStageActionPhase,
7
+ TwoStageActionPhaseCommit,
8
+ TwoStageActionPhaseReceipt,
9
+ )
10
+ from agent_evolve.domain.patch import require_sha256
11
+ from agent_evolve.domain.typed_json import (
12
+ FrozenJsonObject,
13
+ freeze_json,
14
+ thaw_json,
15
+ typed_json_sha256,
16
+ )
17
+ from agent_evolve.ports.action_allocation_frame_commit_v3 import (
18
+ OperationalFrameActionAllocationCommitInput,
19
+ OperationalFrameActionAllocationTreatmentExecution,
20
+ )
21
+ from agent_evolve.ports.treatment_assignment import (
22
+ ProspectiveTreatmentAssignmentReceipt,
23
+ )
24
+
25
+
26
+ _COMMIT_KIND = "operational_tie_frame_action_allocation_v3"
27
+
28
+
29
+ class OperationalFrameActionAllocationCommitRejected(RuntimeError):
30
+ """No evaluator authority may open from these allocator-v3 executions."""
31
+
32
+
33
+ def _validated_execution_tuple(
34
+ executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
35
+ *,
36
+ require_all_pass: bool,
37
+ ) -> ProspectiveTreatmentAssignmentReceipt:
38
+ if type(executions) is not tuple or not executions or any(
39
+ type(value) is not OperationalFrameActionAllocationTreatmentExecution
40
+ for value in executions
41
+ ):
42
+ raise ValueError("executions must be a non-empty exact allocator-v3 tuple")
43
+ for value in executions:
44
+ value.__post_init__()
45
+ assignment = executions[0].treatment_assignment
46
+ if any(
47
+ value.treatment_assignment.receipt_sha256 != assignment.receipt_sha256
48
+ for value in executions
49
+ ):
50
+ raise ValueError("v3 executions name different treatment assignments")
51
+ observed_order = tuple(value.treatment_occurrence for value in executions)
52
+ if observed_order != assignment.occurrence_input_order:
53
+ raise ValueError("v3 executions must use treatment occurrence input order")
54
+ configuration = executions[0].request.allocator_configuration_sha256
55
+ if any(
56
+ value.request.allocator_configuration_sha256 != configuration
57
+ for value in executions
58
+ ):
59
+ raise ValueError(
60
+ "v3 treatment arms must share resolution, mode, public seed, and "
61
+ "allocation-unit key"
62
+ )
63
+ if require_all_pass and any(not value.result.audit.passes for value in executions):
64
+ raise OperationalFrameActionAllocationCommitRejected(
65
+ "every operational allocation audit must pass before evaluator authority"
66
+ )
67
+ return assignment
68
+
69
+
70
+ def _frozen_payload(value: dict[str, object]) -> FrozenJsonObject:
71
+ result = freeze_json(value)
72
+ if type(result) is not FrozenJsonObject:
73
+ raise AssertionError("allocator-v3 phase payload must freeze as an object")
74
+ return result
75
+
76
+
77
+ def build_operational_frame_action_allocation_phase_commit(
78
+ *,
79
+ upstream_input_sha256: str,
80
+ terminal_provider_ledger_commitment_sha256: str,
81
+ executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
82
+ ) -> TwoStageActionPhaseCommit:
83
+ """Build an ALLOCATE commit from complete, common-key passing v3 records."""
84
+
85
+ require_sha256(upstream_input_sha256, "upstream_input_sha256")
86
+ require_sha256(
87
+ terminal_provider_ledger_commitment_sha256,
88
+ "terminal_provider_ledger_commitment_sha256",
89
+ )
90
+ assignment = _validated_execution_tuple(executions, require_all_pass=True)
91
+ commit_input = OperationalFrameActionAllocationCommitInput(
92
+ upstream_input_sha256=upstream_input_sha256,
93
+ terminal_provider_ledger_commitment_sha256=(
94
+ terminal_provider_ledger_commitment_sha256
95
+ ),
96
+ treatment_assignment=assignment,
97
+ allocation_requests=tuple(value.request for value in executions),
98
+ )
99
+ payload = _frozen_payload(
100
+ {
101
+ "schema_version": 1,
102
+ "phase": TwoStageActionPhase.ALLOCATE.value,
103
+ "commit_kind": _COMMIT_KIND,
104
+ "allocation_input": commit_input.to_record(),
105
+ "terminal_provider_ledger_commitment": (
106
+ commit_input.terminal_provider_ledger_commitment_record
107
+ ),
108
+ "treatment_assignment_receipt_sha256": assignment.receipt_sha256,
109
+ "treatment_occurrence_order": [
110
+ value.to_record() for value in assignment.occurrence_input_order
111
+ ],
112
+ "treatment_executions": [value.to_record() for value in executions],
113
+ "all_operational_allocation_audits_pass": True,
114
+ "evaluator_authority_eligible": True,
115
+ }
116
+ )
117
+ return TwoStageActionPhaseCommit(
118
+ receipt=TwoStageActionPhaseReceipt(
119
+ phase=TwoStageActionPhase.ALLOCATE,
120
+ input_sha256=commit_input.input_sha256,
121
+ output_sha256=typed_json_sha256(payload),
122
+ ),
123
+ payload=payload,
124
+ )
125
+
126
+
127
+ def validate_operational_frame_action_allocation_phase_commit(
128
+ executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
129
+ phase_commit: TwoStageActionPhaseCommit,
130
+ ) -> OperationalFrameActionAllocationCommitInput:
131
+ """Rebuild and compare the exact v3 commit and every execution record."""
132
+
133
+ assignment = _validated_execution_tuple(executions, require_all_pass=True)
134
+ if type(phase_commit) is not TwoStageActionPhaseCommit:
135
+ raise TypeError("phase_commit must be an exact TwoStageActionPhaseCommit")
136
+ phase_commit.__post_init__()
137
+ if phase_commit.receipt.phase is not TwoStageActionPhase.ALLOCATE:
138
+ raise ValueError("only an ALLOCATE v3 commit can authorize evaluation")
139
+ payload = thaw_json(phase_commit.payload)
140
+ if (
141
+ type(payload) is not dict
142
+ or payload.get("phase") != TwoStageActionPhase.ALLOCATE.value
143
+ or payload.get("commit_kind") != _COMMIT_KIND
144
+ or type(payload.get("allocation_input")) is not dict
145
+ ):
146
+ raise ValueError("operational frame-allocation phase payload is malformed")
147
+ raw_input = payload["allocation_input"]
148
+ assert type(raw_input) is dict
149
+ upstream_input_sha256 = raw_input.get("upstream_input_sha256")
150
+ raw_ledger = raw_input.get("terminal_provider_ledger_commitment")
151
+ if type(upstream_input_sha256) is not str or type(raw_ledger) is not dict:
152
+ raise ValueError("operational frame-allocation input is malformed")
153
+ ledger_sha256 = raw_ledger.get("commitment_sha256")
154
+ if type(ledger_sha256) is not str:
155
+ raise ValueError("terminal-provider-ledger commitment is malformed")
156
+ require_sha256(upstream_input_sha256, "upstream_input_sha256")
157
+ require_sha256(ledger_sha256, "terminal_provider_ledger_commitment_sha256")
158
+ expected = build_operational_frame_action_allocation_phase_commit(
159
+ upstream_input_sha256=upstream_input_sha256,
160
+ terminal_provider_ledger_commitment_sha256=ledger_sha256,
161
+ executions=executions,
162
+ )
163
+ if (
164
+ phase_commit.receipt.receipt_sha256
165
+ != expected.receipt.receipt_sha256
166
+ or phase_commit.payload != expected.payload
167
+ or phase_commit.to_record() != expected.to_record()
168
+ ):
169
+ raise ValueError(
170
+ "operational frame-allocation commit differs from exact executions"
171
+ )
172
+ return OperationalFrameActionAllocationCommitInput(
173
+ upstream_input_sha256=upstream_input_sha256,
174
+ terminal_provider_ledger_commitment_sha256=ledger_sha256,
175
+ treatment_assignment=assignment,
176
+ allocation_requests=tuple(value.request for value in executions),
177
+ )
178
+
179
+
180
+ __all__ = [
181
+ "OperationalFrameActionAllocationCommitRejected",
182
+ "build_operational_frame_action_allocation_phase_commit",
183
+ "validate_operational_frame_action_allocation_phase_commit",
184
+ ]
@@ -0,0 +1,338 @@
1
+ """Operational-tie-aware greedy allocation over authenticated forecast frames."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+
7
+ from agent_evolve.ports.action_allocation import (
8
+ AllocatedActionMember,
9
+ ForecastPortfolioUtilityInput,
10
+ ForecastQuantile,
11
+ PortfolioAllocationScore,
12
+ )
13
+ from agent_evolve.ports.action_allocation_frame import (
14
+ FrameActionPortfolioDecision,
15
+ allocation_score_multiset_sha256,
16
+ )
17
+ from agent_evolve.ports.action_allocation_frame_v3 import (
18
+ AllocationV3Candidate,
19
+ AllocationV3SeedSamplingLaw,
20
+ AllocationV3StepAudit,
21
+ GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_DEFINITION_SHA256,
22
+ GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_ID,
23
+ GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_VERSION,
24
+ OperationalFrameActionAllocationAudit,
25
+ OperationalFrameActionAllocationRequest,
26
+ OperationalFrameActionAllocationResult,
27
+ allocation_v3_failure_codes,
28
+ validate_operational_frame_action_allocation_result,
29
+ )
30
+ from agent_evolve.ports.action_forecast import ResolvedActionForecast
31
+
32
+
33
+ class OperationalTieAllocationRejected(RuntimeError):
34
+ """A fail-closed v3 request produced an operational tie."""
35
+
36
+ result: OperationalFrameActionAllocationResult
37
+
38
+ def __init__(self, result: OperationalFrameActionAllocationResult) -> None:
39
+ if type(result) is not OperationalFrameActionAllocationResult:
40
+ raise TypeError("result must be an exact operational frame result")
41
+ result.__post_init__()
42
+ if result.audit.passes:
43
+ raise ValueError("a passing operational allocation cannot be rejected")
44
+ self.result = result
45
+ RuntimeError.__init__(
46
+ self,
47
+ "operational allocation tie failed its prospectively bound mode",
48
+ )
49
+
50
+
51
+ class OperationalGreedyForecastFrameAllocator:
52
+ """Stateless allocator-v3 application service.
53
+
54
+ Every configuration value capable of changing a decision belongs to the
55
+ request and therefore to its receipt. The benchmark utility remains an
56
+ injected port, and both ``diversity_weight=0.0`` and arbitrary finite N/k
57
+ are supported.
58
+ """
59
+
60
+ @staticmethod
61
+ def _utility(
62
+ request: OperationalFrameActionAllocationRequest,
63
+ members: tuple[ResolvedActionForecast, ...],
64
+ quantile: ForecastQuantile,
65
+ ) -> float:
66
+ base = request.allocation
67
+ canonical_members = tuple(
68
+ sorted(
69
+ members,
70
+ key=lambda value: (value.option_identity_sha256, value.option_id),
71
+ )
72
+ )
73
+ value = base.utility.utility(
74
+ ForecastPortfolioUtilityInput(
75
+ optimization_semantics=base.frame.request.optimization_semantics,
76
+ parent_metric_values=base.frame.request.parent_metric_values,
77
+ metric_scales=base.frame.request.metric_scales,
78
+ members=canonical_members,
79
+ quantile=quantile,
80
+ )
81
+ )
82
+ if type(value) is not float or not math.isfinite(value):
83
+ raise TypeError("bound portfolio utility must return a finite float")
84
+ return value
85
+
86
+ @classmethod
87
+ def _score(
88
+ cls,
89
+ request: OperationalFrameActionAllocationRequest,
90
+ members: tuple[ResolvedActionForecast, ...],
91
+ *,
92
+ attainable_diversity: int,
93
+ ) -> PortfolioAllocationScore:
94
+ if type(attainable_diversity) is not int or attainable_diversity <= 0:
95
+ raise ValueError("attainable_diversity must be a positive exact integer")
96
+ p10 = cls._utility(request, members, ForecastQuantile.P10)
97
+ p50 = cls._utility(request, members, ForecastQuantile.P50)
98
+ p90 = cls._utility(request, members, ForecastQuantile.P90)
99
+ downside = min(p10, p90)
100
+ risk_penalty = request.risk_aversion * max(0.0, p50 - downside)
101
+ diversity_reward = request.diversity_weight * (
102
+ len({member.family for member in members}) / attainable_diversity
103
+ )
104
+ primary = p50 - risk_penalty
105
+ total = primary + diversity_reward
106
+ if not all(
107
+ math.isfinite(value)
108
+ for value in (risk_penalty, diversity_reward, primary, total)
109
+ ):
110
+ raise ValueError("allocator-v3 score arithmetic became non-finite")
111
+ return PortfolioAllocationScore(
112
+ p10_utility=p10,
113
+ p50_utility=p50,
114
+ p90_utility=p90,
115
+ downside_utility=downside,
116
+ risk_penalty=risk_penalty,
117
+ diversity_reward=diversity_reward,
118
+ total_utility=total,
119
+ )
120
+
121
+ def assess(
122
+ self,
123
+ request: OperationalFrameActionAllocationRequest,
124
+ ) -> OperationalFrameActionAllocationResult:
125
+ """Return the complete candidate tables, including a failing attempt."""
126
+
127
+ if type(request) is not OperationalFrameActionAllocationRequest:
128
+ raise TypeError("request must be an exact operational frame request")
129
+ request.__post_init__()
130
+ base = request.allocation
131
+ by_id = {value.option_id: value for value in base.frame.forecasts}
132
+ global_index_by_id = {
133
+ forecast.option_id: global_index
134
+ for global_index, forecast in zip(
135
+ base.frame.global_row_indices,
136
+ base.frame.forecasts,
137
+ strict=True,
138
+ )
139
+ }
140
+ attainable_diversity = min(
141
+ base.portfolio_size,
142
+ len({by_id[value].family for value in base.eligible_option_ids}),
143
+ )
144
+ remaining = sorted(
145
+ (by_id[value] for value in base.eligible_option_ids),
146
+ key=lambda value: (value.option_identity_sha256, value.option_id),
147
+ )
148
+ selected: list[ResolvedActionForecast] = []
149
+ members: list[AllocatedActionMember] = []
150
+ step_audits: list[AllocationV3StepAudit] = []
151
+ previous_total = 0.0
152
+
153
+ for step in range(1, base.portfolio_size + 1):
154
+ evaluated: list[
155
+ tuple[
156
+ ResolvedActionForecast,
157
+ PortfolioAllocationScore,
158
+ float,
159
+ str,
160
+ AllocationV3Candidate,
161
+ ]
162
+ ] = []
163
+ for candidate in remaining:
164
+ portfolio = tuple((*selected, candidate))
165
+ score = self._score(
166
+ request,
167
+ portfolio,
168
+ attainable_diversity=attainable_diversity,
169
+ )
170
+ marginal = score.total_utility - previous_total
171
+ if not math.isfinite(marginal):
172
+ raise ValueError(
173
+ "allocator-v3 marginal arithmetic became non-finite"
174
+ )
175
+ label = f"row_{global_index_by_id[candidate.option_id]:08d}"
176
+ candidate_record = AllocationV3Candidate(
177
+ candidate_label=label,
178
+ option_identity_sha256=candidate.option_identity_sha256,
179
+ score=score,
180
+ marginal_total_utility=marginal,
181
+ public_rank_sha256=request.tie_selection.public_rank_sha256(
182
+ step=step,
183
+ option_identity_sha256=candidate.option_identity_sha256,
184
+ ),
185
+ )
186
+ evaluated.append((candidate, score, marginal, label, candidate_record))
187
+
188
+ candidate_table = tuple(
189
+ sorted(
190
+ (value[4] for value in evaluated),
191
+ key=lambda value: value.candidate_label,
192
+ )
193
+ )
194
+ raw_top = max(value.marginal_total_utility for value in candidate_table)
195
+ ranked_scores = sorted(
196
+ (value.marginal_total_utility for value in candidate_table),
197
+ reverse=True,
198
+ )
199
+ raw_runner_gap = (
200
+ 0.0
201
+ if len(ranked_scores) == 1
202
+ else ranked_scores[0] - ranked_scores[1]
203
+ )
204
+ if not math.isfinite(raw_runner_gap):
205
+ raise ValueError("allocator-v3 runner-gap arithmetic became non-finite")
206
+ raw_top_labels = tuple(
207
+ value.candidate_label
208
+ for value in candidate_table
209
+ if value.marginal_total_utility == raw_top
210
+ )
211
+ operational = tuple(
212
+ value
213
+ for value in candidate_table
214
+ if raw_top - value.marginal_total_utility
215
+ <= request.score_resolution.maximum_indistinguishable_score_gap
216
+ )
217
+ winner_record = min(
218
+ operational,
219
+ key=lambda value: (value.public_rank_sha256, value.candidate_label),
220
+ )
221
+ failures = allocation_v3_failure_codes(
222
+ mode=request.tie_selection.mode,
223
+ operational_top_count=len(operational),
224
+ )
225
+ step_audit = AllocationV3StepAudit(
226
+ step=step,
227
+ candidates=candidate_table,
228
+ distinct_finite_score_count=len(
229
+ {value.marginal_total_utility for value in candidate_table}
230
+ ),
231
+ raw_top_score=raw_top,
232
+ raw_runner_gap=raw_runner_gap,
233
+ raw_top_candidate_labels=raw_top_labels,
234
+ operational_top_candidate_labels=tuple(
235
+ value.candidate_label for value in operational
236
+ ),
237
+ selected_candidate_label=winner_record.candidate_label,
238
+ selected_public_rank_sha256=winner_record.public_rank_sha256,
239
+ random_oracle_prior_weight_numerator=(
240
+ None
241
+ if request.tie_selection.seed_sampling_law
242
+ is AllocationV3SeedSamplingLaw.FIXED_PUBLIC
243
+ else 1
244
+ ),
245
+ random_oracle_prior_weight_denominator=(
246
+ None
247
+ if request.tie_selection.seed_sampling_law
248
+ is AllocationV3SeedSamplingLaw.FIXED_PUBLIC
249
+ else len(operational)
250
+ ),
251
+ score_multiset_sha256=allocation_score_multiset_sha256(
252
+ tuple(value.marginal_total_utility for value in candidate_table)
253
+ ),
254
+ failure_codes=failures,
255
+ passes=not failures,
256
+ )
257
+ step_audits.append(step_audit)
258
+
259
+ winner = next(
260
+ value
261
+ for value in evaluated
262
+ if value[3] == winner_record.candidate_label
263
+ )
264
+ best_forecast, best_score, best_marginal, _label, _record = winner
265
+ selected.append(best_forecast)
266
+ remaining.remove(best_forecast)
267
+ members.append(
268
+ AllocatedActionMember(
269
+ rank=step,
270
+ option_id=best_forecast.option_id,
271
+ option_identity_sha256=best_forecast.option_identity_sha256,
272
+ child_configuration_sha256=(
273
+ best_forecast.child_configuration_sha256
274
+ ),
275
+ family=best_forecast.family,
276
+ greedy_step_score=best_score,
277
+ marginal_total_utility=best_marginal,
278
+ )
279
+ )
280
+ previous_total = best_score.total_utility
281
+
282
+ candidate_evaluations = sum(value.candidate_count for value in step_audits)
283
+ decision = FrameActionPortfolioDecision(
284
+ allocation_request_sha256=base.request_sha256,
285
+ frame_receipt_sha256=base.frame.receipt_sha256,
286
+ source_forecast_receipt_sha256=(
287
+ base.frame.source_forecast_receipt_sha256
288
+ ),
289
+ eligible_options_sha256=base.eligible_options_sha256,
290
+ members=tuple(members),
291
+ final_score=members[-1].greedy_step_score,
292
+ candidate_evaluations=candidate_evaluations,
293
+ utility_policy_id=base.utility.policy_id,
294
+ utility_policy_version=base.utility.policy_version,
295
+ utility_definition_sha256=base.utility.definition_sha256,
296
+ allocator_policy_id=GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_ID,
297
+ allocator_policy_version=GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_VERSION,
298
+ allocator_definition_sha256=(
299
+ GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_DEFINITION_SHA256
300
+ ),
301
+ allocator_configuration_sha256=(
302
+ request.allocator_configuration_sha256
303
+ ),
304
+ )
305
+ audit = OperationalFrameActionAllocationAudit(
306
+ operational_request_sha256=request.request_sha256,
307
+ base_allocation_request_sha256=base.request_sha256,
308
+ decision_receipt_sha256=decision.receipt_sha256,
309
+ frame_receipt_sha256=base.frame.receipt_sha256,
310
+ score_resolution=request.score_resolution,
311
+ tie_selection=request.tie_selection,
312
+ steps=tuple(step_audits),
313
+ candidate_score_count=candidate_evaluations,
314
+ passes=all(value.passes for value in step_audits),
315
+ )
316
+ result = OperationalFrameActionAllocationResult(
317
+ decision=decision,
318
+ audit=audit,
319
+ )
320
+ validate_operational_frame_action_allocation_result(request, result)
321
+ return result
322
+
323
+ def allocate(
324
+ self,
325
+ request: OperationalFrameActionAllocationRequest,
326
+ ) -> OperationalFrameActionAllocationResult:
327
+ """Authorize only a result permitted by the prospectively bound mode."""
328
+
329
+ result = self.assess(request)
330
+ if not result.audit.passes:
331
+ raise OperationalTieAllocationRejected(result)
332
+ return result
333
+
334
+
335
+ __all__ = [
336
+ "OperationalGreedyForecastFrameAllocator",
337
+ "OperationalTieAllocationRejected",
338
+ ]