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,648 @@
1
+ """Inverted allocation adapter for portable target-conditioned acquisition.
2
+
3
+ The adapter implements the existing ``select(SlateAllocationRequest)`` shape,
4
+ but obtains branch-local prior state and configuration-transition receipts from
5
+ an injected, authenticated context provider. Workload integrations therefore
6
+ materialize only generic finite configurations and feasibility; provider code,
7
+ objective values, and domain identifiers remain outside the acquisition core.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import re
15
+ from dataclasses import dataclass, field, replace
16
+ from typing import ClassVar, Protocol, runtime_checkable
17
+
18
+ from agent_evolve.domain.patch import require_sha256
19
+ from agent_evolve.domain.finite_variation import (
20
+ FiniteVariationContract,
21
+ validated_finite_variation_identity_index,
22
+ )
23
+ from agent_evolve.policies.selection.calibrated_slate import SlateAllocationRequest
24
+ from agent_evolve.policies.selection.structural_posterior_slate import (
25
+ StructuralPosteriorMemberScoreRow,
26
+ score_structural_posterior_slate,
27
+ )
28
+ from agent_evolve.policies.selection.target_conditioned_features import (
29
+ PortableTransitionReceipt,
30
+ TargetConditionedFeatureProjectionRequest,
31
+ TargetConditionedPortableFeatureProjector,
32
+ project_portable_transition,
33
+ )
34
+ from agent_evolve.policies.selection.target_conditioned_prequential import (
35
+ BASE_REALIZABILITY_DEFINITION_SHA256,
36
+ BASE_REALIZABILITY_PROJECTOR_ID,
37
+ BASE_REALIZABILITY_PROJECTOR_VERSION,
38
+ RealizablePortfolioSet,
39
+ TargetConditionedAcquisitionProfile,
40
+ TargetConditionedAcquisitionState,
41
+ TargetConditionedPrequentialSlatePolicy,
42
+ TargetConditionedSlateDecision,
43
+ TargetConditionedSlateRequest,
44
+ enumerate_base_realizable_portfolios,
45
+ )
46
+ from agent_evolve.ports.archive_context import (
47
+ CampaignPortfolioArchiveContextProjection,
48
+ )
49
+ from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
50
+
51
+
52
+ ADAPTER_ID = "target_conditioned_prequential_allocator_adapter"
53
+ ADAPTER_VERSION = 1
54
+ ADAPTER_DEFINITION_SHA256 = hashlib.sha256(
55
+ b"agent-evolve:target-conditioned-prequential-allocator-adapter:v1;"
56
+ b"input=slate-allocation-request,authenticated-prior-context-provider,"
57
+ b"portable-feature-projector,realizable-set-projector;"
58
+ b"structural-score-projection=prior-only-complete-slate;"
59
+ b"transition-receipts=precall-context-subset;"
60
+ b"selection=target-conditioned-prequential-policy;"
61
+ b"workload-model-provider-current-outcome-fields=false"
62
+ ).hexdigest()
63
+ BASE_REALIZABLE_PROJECTOR_ID = BASE_REALIZABILITY_PROJECTOR_ID
64
+ BASE_REALIZABLE_PROJECTOR_VERSION = BASE_REALIZABILITY_PROJECTOR_VERSION
65
+ BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256 = (
66
+ BASE_REALIZABILITY_DEFINITION_SHA256
67
+ )
68
+ PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID = "prior_structural_slate_scores"
69
+ PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION = 1
70
+ PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256 = hashlib.sha256(
71
+ b"agent-evolve:prior-structural-slate-scores:v1;"
72
+ b"delegates=score-structural-posterior-slate;"
73
+ b"complete-sealed-slate=true;current-future-outcomes=false"
74
+ ).hexdigest()
75
+ REGISTERED_CONTEXT_PROVIDER_ID = "registered_target_conditioned_contexts"
76
+ REGISTERED_CONTEXT_PROVIDER_VERSION = 2
77
+ REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256 = hashlib.sha256(
78
+ b"agent-evolve:registered-target-conditioned-contexts:v2;"
79
+ b"key=scope-wave-parent-finite-contract;registration=append-only-precall;"
80
+ b"contract=sealed-once;lookup=exact-slate-allocation-request;"
81
+ b"transition-projection=lazy-exact-proposed-slate;"
82
+ b"current-future-outcomes=false"
83
+ ).hexdigest()
84
+
85
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
86
+ _CONTEXT_DOMAIN = b"agent-evolve:target-conditioned-allocation-context:v1\x00"
87
+ _ADAPTER_CONFIGURATION_DOMAIN = (
88
+ b"agent-evolve:target-conditioned-allocator-configuration:v1\x00"
89
+ )
90
+
91
+
92
+ def _canonical_json(value: object) -> bytes:
93
+ return json.dumps(
94
+ value,
95
+ allow_nan=False,
96
+ ensure_ascii=True,
97
+ separators=(",", ":"),
98
+ sort_keys=True,
99
+ ).encode("ascii", errors="strict")
100
+
101
+
102
+ def _hash(domain: bytes, value: object) -> str:
103
+ return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
104
+
105
+
106
+ def _provider_identity(value: object, *, name: str) -> dict[str, object]:
107
+ provider_id = getattr(value, "provider_id", None)
108
+ provider_version = getattr(value, "provider_version", None)
109
+ definition_sha256 = getattr(value, "definition_sha256", None)
110
+ if type(provider_id) is not str or _TOKEN.fullmatch(provider_id) is None:
111
+ raise ValueError(f"{name}.provider_id must use the closed token grammar")
112
+ if type(provider_version) is not int or provider_version <= 0:
113
+ raise ValueError(f"{name}.provider_version must be positive")
114
+ require_sha256(definition_sha256, f"{name}.definition_sha256")
115
+ return {
116
+ "provider_id": provider_id,
117
+ "provider_version": provider_version,
118
+ "definition_sha256": definition_sha256,
119
+ }
120
+
121
+
122
+ @dataclass(frozen=True, slots=True, eq=False)
123
+ class TargetConditionedAllocationContext:
124
+ """Pre-call, branch-local facts available to one eventual K-slate."""
125
+
126
+ finite_contract_sha256: str
127
+ cutoff_receipt_sha256: str
128
+ archive_context: CampaignPortfolioArchiveContextProjection
129
+ frontier_target: CampaignPortfolioFrontierTarget
130
+ state: TargetConditionedAcquisitionState
131
+ transition_receipts: tuple[PortableTransitionReceipt, ...]
132
+ campaign_generation: int
133
+ lane_slot: int
134
+ remaining_proposal_horizon: int
135
+
136
+ def __post_init__(self) -> None:
137
+ require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
138
+ require_sha256(self.cutoff_receipt_sha256, "cutoff_receipt_sha256")
139
+ if type(self.archive_context) is not CampaignPortfolioArchiveContextProjection:
140
+ raise TypeError("archive_context must be exact")
141
+ self.archive_context.__post_init__()
142
+ if type(self.frontier_target) is not CampaignPortfolioFrontierTarget:
143
+ raise TypeError("frontier_target must be exact")
144
+ self.frontier_target.__post_init__()
145
+ if type(self.state) is not TargetConditionedAcquisitionState:
146
+ raise TypeError("state must be exact")
147
+ self.state.__post_init__()
148
+ if type(self.transition_receipts) is not tuple:
149
+ raise TypeError("transition_receipts must be an exact tuple")
150
+ if any(
151
+ type(value) is not PortableTransitionReceipt
152
+ for value in self.transition_receipts
153
+ ):
154
+ raise TypeError("transition_receipts must contain exact rows")
155
+ for value in self.transition_receipts:
156
+ value.__post_init__()
157
+ option_ids = tuple(value.option_id for value in self.transition_receipts)
158
+ if option_ids != tuple(sorted(set(option_ids))):
159
+ raise ValueError("transition receipts must use canonical option order")
160
+ parents = {
161
+ value.parent_configuration_sha256 for value in self.transition_receipts
162
+ }
163
+ if parents and parents != {self.frontier_target.parent_configuration_sha256}:
164
+ raise ValueError("transition receipts differ from the targeted parent")
165
+ if (
166
+ self.archive_context.archive_utility_snapshot_sha256
167
+ != self.frontier_target.archive_utility_snapshot_sha256
168
+ or self.archive_context.parent_configuration_sha256
169
+ != self.frontier_target.parent_configuration_sha256
170
+ ):
171
+ raise ValueError("archive context and frontier target disagree")
172
+ if type(self.campaign_generation) is not int or self.campaign_generation <= 0:
173
+ raise ValueError("campaign_generation must be positive")
174
+ if self.state.cutoff_generation >= self.campaign_generation:
175
+ raise ValueError("state cutoff reaches the current generation")
176
+ if type(self.lane_slot) is not int or self.lane_slot < 0:
177
+ raise ValueError("lane_slot must be non-negative")
178
+ if (
179
+ type(self.remaining_proposal_horizon) is not int
180
+ or self.remaining_proposal_horizon < 0
181
+ ):
182
+ raise ValueError("remaining_proposal_horizon must be non-negative")
183
+
184
+ def require_request(self, request: SlateAllocationRequest) -> None:
185
+ self.__post_init__()
186
+ if type(request) is not SlateAllocationRequest:
187
+ raise TypeError("request must be exact SlateAllocationRequest")
188
+ request.revalidate()
189
+ if request.slate.finite_contract_sha256 != self.finite_contract_sha256:
190
+ raise ValueError("allocation request names a foreign finite contract")
191
+ if (
192
+ request.slate.parent_candidate_identity_sha256
193
+ != self.frontier_target.parent_configuration_sha256
194
+ ):
195
+ raise ValueError("allocation request names a foreign parent")
196
+ transitions = {value.option_id: value for value in self.transition_receipts}
197
+ for member in request.slate.members:
198
+ transition = transitions.get(member.option_id)
199
+ if (
200
+ transition is None
201
+ or transition.option_identity_sha256
202
+ != member.option_identity_sha256
203
+ ):
204
+ raise ValueError("pre-call transition context does not cover the slate")
205
+
206
+ def transition_subset(
207
+ self, request: SlateAllocationRequest
208
+ ) -> tuple[PortableTransitionReceipt, ...]:
209
+ self.require_request(request)
210
+ option_ids = {value.option_id for value in request.slate.members}
211
+ return tuple(
212
+ value for value in self.transition_receipts if value.option_id in option_ids
213
+ )
214
+
215
+ def _unsigned_record(self) -> dict[str, object]:
216
+ self.__post_init__()
217
+ return {
218
+ "schema_version": 1,
219
+ "finite_contract_sha256": self.finite_contract_sha256,
220
+ "cutoff_receipt_sha256": self.cutoff_receipt_sha256,
221
+ "archive_context": self.archive_context.to_record(),
222
+ "frontier_target": self.frontier_target.to_record(),
223
+ "state": self.state.to_record(),
224
+ "transition_receipts": [
225
+ value.to_record() for value in self.transition_receipts
226
+ ],
227
+ "campaign_generation": self.campaign_generation,
228
+ "lane_slot": self.lane_slot,
229
+ "remaining_proposal_horizon": self.remaining_proposal_horizon,
230
+ "context_frozen_before_model_call": True,
231
+ "current_or_future_outcomes_consulted": False,
232
+ }
233
+
234
+ @property
235
+ def context_sha256(self) -> str:
236
+ return _hash(_CONTEXT_DOMAIN, self._unsigned_record())
237
+
238
+ def to_record(self) -> dict[str, object]:
239
+ return {**self._unsigned_record(), "context_sha256": self.context_sha256}
240
+
241
+ def __eq__(self, other: object) -> bool:
242
+ return (
243
+ type(other) is TargetConditionedAllocationContext
244
+ and self.context_sha256 == other.context_sha256
245
+ )
246
+
247
+ __hash__ = None
248
+
249
+
250
+ @dataclass(frozen=True, slots=True, eq=False)
251
+ class TargetConditionedAllocationContextKey:
252
+ """Provider-independent identity for one prospectively registered branch."""
253
+
254
+ scope_sha256: str
255
+ wave_index: int
256
+ parent_configuration_sha256: str
257
+ finite_contract_sha256: str
258
+
259
+ def __post_init__(self) -> None:
260
+ for name in (
261
+ "scope_sha256",
262
+ "parent_configuration_sha256",
263
+ "finite_contract_sha256",
264
+ ):
265
+ require_sha256(getattr(self, name), name)
266
+ if type(self.wave_index) is not int or self.wave_index <= 0:
267
+ raise ValueError("wave_index must be positive")
268
+
269
+ @classmethod
270
+ def from_request(
271
+ cls, request: SlateAllocationRequest
272
+ ) -> TargetConditionedAllocationContextKey:
273
+ if type(request) is not SlateAllocationRequest:
274
+ raise TypeError("request must be exact SlateAllocationRequest")
275
+ request.revalidate()
276
+ return cls(
277
+ scope_sha256=request.slate.scope.scope_sha256,
278
+ wave_index=request.slate.wave_index,
279
+ parent_configuration_sha256=(
280
+ request.slate.parent_candidate_identity_sha256
281
+ ),
282
+ finite_contract_sha256=request.slate.finite_contract_sha256,
283
+ )
284
+
285
+ def _unsigned_record(self) -> dict[str, object]:
286
+ self.__post_init__()
287
+ return {
288
+ "schema_version": 1,
289
+ "scope_sha256": self.scope_sha256,
290
+ "wave_index": self.wave_index,
291
+ "parent_configuration_sha256": self.parent_configuration_sha256,
292
+ "finite_contract_sha256": self.finite_contract_sha256,
293
+ }
294
+
295
+ @property
296
+ def key_sha256(self) -> str:
297
+ return _hash(
298
+ b"agent-evolve:target-conditioned-allocation-context-key:v1\x00",
299
+ self._unsigned_record(),
300
+ )
301
+
302
+ def to_record(self) -> dict[str, object]:
303
+ return {**self._unsigned_record(), "key_sha256": self.key_sha256}
304
+
305
+ def __eq__(self, other: object) -> bool:
306
+ return (
307
+ type(other) is TargetConditionedAllocationContextKey
308
+ and self.key_sha256 == other.key_sha256
309
+ )
310
+
311
+ __hash__ = None
312
+
313
+
314
+ @runtime_checkable
315
+ class TargetConditionedAllocationContextProvider(Protocol):
316
+ provider_id: str
317
+ provider_version: int
318
+ definition_sha256: str
319
+
320
+ def context_for(
321
+ self, request: SlateAllocationRequest
322
+ ) -> TargetConditionedAllocationContext: ...
323
+
324
+
325
+ @runtime_checkable
326
+ class TargetConditionedAllocationContextRegistrar(
327
+ TargetConditionedAllocationContextProvider, Protocol
328
+ ):
329
+ def register(
330
+ self,
331
+ key: TargetConditionedAllocationContextKey,
332
+ context: TargetConditionedAllocationContext,
333
+ finite_contract: FiniteVariationContract,
334
+ ) -> None: ...
335
+
336
+
337
+ @dataclass(slots=True)
338
+ class RegisteredTargetConditionedAllocationContextProvider:
339
+ """Append-only in-memory bridge from pre-call campaign facts to K8 allocation."""
340
+
341
+ provider_id: str = REGISTERED_CONTEXT_PROVIDER_ID
342
+ provider_version: int = REGISTERED_CONTEXT_PROVIDER_VERSION
343
+ definition_sha256: str = REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256
344
+ _contexts: dict[
345
+ str,
346
+ tuple[
347
+ TargetConditionedAllocationContextKey,
348
+ TargetConditionedAllocationContext,
349
+ FiniteVariationContract,
350
+ ],
351
+ ] = field(
352
+ init=False,
353
+ default_factory=dict,
354
+ repr=False,
355
+ )
356
+
357
+ def __post_init__(self) -> None:
358
+ expected = {
359
+ "provider_id": REGISTERED_CONTEXT_PROVIDER_ID,
360
+ "provider_version": REGISTERED_CONTEXT_PROVIDER_VERSION,
361
+ "definition_sha256": REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256,
362
+ }
363
+ if _provider_identity(self, name="registered context provider") != expected:
364
+ raise ValueError("registered context provider identity drifted")
365
+
366
+ def register(
367
+ self,
368
+ key: TargetConditionedAllocationContextKey,
369
+ context: TargetConditionedAllocationContext,
370
+ finite_contract: FiniteVariationContract,
371
+ ) -> None:
372
+ """Seal one context before its corresponding provider call begins."""
373
+
374
+ self.__post_init__()
375
+ if type(key) is not TargetConditionedAllocationContextKey:
376
+ raise TypeError("key must be exact TargetConditionedAllocationContextKey")
377
+ key.__post_init__()
378
+ if type(context) is not TargetConditionedAllocationContext:
379
+ raise TypeError("context must be exact TargetConditionedAllocationContext")
380
+ context.__post_init__()
381
+ if type(finite_contract) is not FiniteVariationContract:
382
+ raise TypeError("finite_contract must be exact FiniteVariationContract")
383
+ identity_index = validated_finite_variation_identity_index(finite_contract)
384
+ if (
385
+ context.finite_contract_sha256 != key.finite_contract_sha256
386
+ or context.frontier_target.parent_configuration_sha256
387
+ != key.parent_configuration_sha256
388
+ or identity_index.contract_identity_sha256
389
+ != key.finite_contract_sha256
390
+ or identity_index.parent_configuration_sha256
391
+ != key.parent_configuration_sha256
392
+ ):
393
+ raise ValueError("registered context differs from its branch key")
394
+ if key.key_sha256 in self._contexts:
395
+ raise ValueError("target-conditioned branch is already registered")
396
+ self._contexts[key.key_sha256] = (key, context, finite_contract)
397
+
398
+ def context_for(
399
+ self, request: SlateAllocationRequest
400
+ ) -> TargetConditionedAllocationContext:
401
+ self.__post_init__()
402
+ key = TargetConditionedAllocationContextKey.from_request(request)
403
+ registered = self._contexts.get(key.key_sha256)
404
+ if registered is None:
405
+ raise ValueError("target-conditioned branch is foreign or unregistered")
406
+ registered_key, context, finite_contract = registered
407
+ if registered_key != key:
408
+ raise ValueError("target-conditioned context key digest collision")
409
+ identity_index = validated_finite_variation_identity_index(finite_contract)
410
+ identity_by_option_id = dict(
411
+ zip(
412
+ identity_index.option_ids,
413
+ identity_index.option_identity_sha256s,
414
+ strict=True,
415
+ )
416
+ )
417
+ option_by_id = {
418
+ option.option_id: option for option in finite_contract.options
419
+ }
420
+ transitions = tuple(
421
+ project_portable_transition(
422
+ option_id=member.option_id,
423
+ option_identity_sha256=member.option_identity_sha256,
424
+ parent_configuration=finite_contract.parent_configuration,
425
+ child_configuration=option_by_id[member.option_id].child_configuration,
426
+ )
427
+ for member in sorted(request.slate.members, key=lambda value: value.option_id)
428
+ if identity_by_option_id.get(member.option_id)
429
+ == member.option_identity_sha256
430
+ )
431
+ if len(transitions) != len(request.slate.members):
432
+ raise ValueError("proposed slate differs from its registered finite contract")
433
+ materialized = replace(context, transition_receipts=transitions)
434
+ materialized.require_request(request)
435
+ return materialized
436
+
437
+ @property
438
+ def registered_context_count(self) -> int:
439
+ return len(self._contexts)
440
+
441
+
442
+ @runtime_checkable
443
+ class RealizablePortfolioProjector(Protocol):
444
+ provider_id: str
445
+ provider_version: int
446
+ definition_sha256: str
447
+
448
+ def project(self, request: SlateAllocationRequest) -> RealizablePortfolioSet: ...
449
+
450
+
451
+ @runtime_checkable
452
+ class StructuralScoreProjector(Protocol):
453
+ provider_id: str
454
+ provider_version: int
455
+ definition_sha256: str
456
+
457
+ def project(
458
+ self, request: SlateAllocationRequest
459
+ ) -> tuple[StructuralPosteriorMemberScoreRow, ...]: ...
460
+
461
+
462
+ @dataclass(frozen=True, slots=True)
463
+ class PriorStructuralScoreProjector:
464
+ provider_id: str = PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID
465
+ provider_version: int = PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION
466
+ definition_sha256: str = PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256
467
+
468
+ def __post_init__(self) -> None:
469
+ expected = {
470
+ "provider_id": PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID,
471
+ "provider_version": PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION,
472
+ "definition_sha256": PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256,
473
+ }
474
+ if _provider_identity(self, name="structural score projector") != expected:
475
+ raise ValueError("prior structural score projector identity drifted")
476
+
477
+ def project(
478
+ self, request: SlateAllocationRequest
479
+ ) -> tuple[StructuralPosteriorMemberScoreRow, ...]:
480
+ self.__post_init__()
481
+ return score_structural_posterior_slate(request)
482
+
483
+
484
+ @dataclass(frozen=True, slots=True)
485
+ class BaseRealizablePortfolioProjector:
486
+ provider_id: str = BASE_REALIZABLE_PROJECTOR_ID
487
+ provider_version: int = BASE_REALIZABLE_PROJECTOR_VERSION
488
+ definition_sha256: str = BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256
489
+
490
+ def __post_init__(self) -> None:
491
+ expected = {
492
+ "provider_id": BASE_REALIZABLE_PROJECTOR_ID,
493
+ "provider_version": BASE_REALIZABLE_PROJECTOR_VERSION,
494
+ "definition_sha256": BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256,
495
+ }
496
+ if _provider_identity(self, name="base realizability projector") != expected:
497
+ raise ValueError("base realizability projector identity drifted")
498
+
499
+ def project(self, request: SlateAllocationRequest) -> RealizablePortfolioSet:
500
+ self.__post_init__()
501
+ return enumerate_base_realizable_portfolios(request)
502
+
503
+
504
+ @dataclass(frozen=True, slots=True)
505
+ class TargetConditionedSlateAllocatorAdapter:
506
+ """Compose portable projection and T-RAP behind the existing allocation port."""
507
+
508
+ context_provider: TargetConditionedAllocationContextProvider
509
+ profile: TargetConditionedAcquisitionProfile
510
+ feature_projector: TargetConditionedPortableFeatureProjector = (
511
+ TargetConditionedPortableFeatureProjector()
512
+ )
513
+ structural_score_projector: StructuralScoreProjector = (
514
+ PriorStructuralScoreProjector()
515
+ )
516
+ realizability_projector: RealizablePortfolioProjector = (
517
+ BaseRealizablePortfolioProjector()
518
+ )
519
+
520
+ policy_id: ClassVar[str] = ADAPTER_ID
521
+ policy_version: ClassVar[int] = ADAPTER_VERSION
522
+ definition_sha256: ClassVar[str] = ADAPTER_DEFINITION_SHA256
523
+
524
+ def __post_init__(self) -> None:
525
+ if not isinstance(
526
+ self.context_provider, TargetConditionedAllocationContextProvider
527
+ ):
528
+ raise TypeError("context_provider must implement the authenticated port")
529
+ _provider_identity(self.context_provider, name="context_provider")
530
+ if type(self.profile) is not TargetConditionedAcquisitionProfile:
531
+ raise TypeError("profile must be exact")
532
+ self.profile.__post_init__()
533
+ if type(self.feature_projector) is not TargetConditionedPortableFeatureProjector:
534
+ raise TypeError("feature_projector must be exact")
535
+ if not isinstance(self.structural_score_projector, StructuralScoreProjector):
536
+ raise TypeError("structural_score_projector must implement the port")
537
+ _provider_identity(
538
+ self.structural_score_projector, name="structural_score_projector"
539
+ )
540
+ if not isinstance(self.realizability_projector, RealizablePortfolioProjector):
541
+ raise TypeError("realizability_projector must implement the port")
542
+ _provider_identity(
543
+ self.realizability_projector, name="realizability_projector"
544
+ )
545
+
546
+ def select(self, request: SlateAllocationRequest) -> TargetConditionedSlateDecision:
547
+ self.__post_init__()
548
+ if type(request) is not SlateAllocationRequest:
549
+ raise TypeError("request must be exact SlateAllocationRequest")
550
+ request.revalidate()
551
+ context = self.context_provider.context_for(request)
552
+ if type(context) is not TargetConditionedAllocationContext:
553
+ raise TypeError("context provider returned a foreign value")
554
+ context.require_request(request)
555
+ raw_scores = self.structural_score_projector.project(request)
556
+ if type(raw_scores) is not tuple or any(
557
+ type(value) is not StructuralPosteriorMemberScoreRow
558
+ for value in raw_scores
559
+ ):
560
+ raise TypeError("structural score projector returned foreign rows")
561
+ scores = tuple(sorted(raw_scores, key=lambda value: value.option_id))
562
+ features = self.feature_projector.project(
563
+ TargetConditionedFeatureProjectionRequest(
564
+ allocation_request=request,
565
+ structural_score_rows=scores,
566
+ transition_receipts=context.transition_subset(request),
567
+ archive_context=context.archive_context,
568
+ frontier_target=context.frontier_target,
569
+ campaign_generation=context.campaign_generation,
570
+ lane_slot=context.lane_slot,
571
+ remaining_proposal_horizon=(context.remaining_proposal_horizon),
572
+ )
573
+ )
574
+ realizable = self.realizability_projector.project(request)
575
+ if type(realizable) is not RealizablePortfolioSet:
576
+ raise TypeError("realizability projector returned a foreign value")
577
+ projected_identity = {
578
+ "provider_id": realizable.projector_id,
579
+ "provider_version": realizable.projector_version,
580
+ "definition_sha256": realizable.projector_definition_sha256,
581
+ }
582
+ if projected_identity != _provider_identity(
583
+ self.realizability_projector, name="realizability_projector"
584
+ ):
585
+ raise ValueError("realizability receipt has a foreign projector identity")
586
+ return TargetConditionedPrequentialSlatePolicy(self.profile).select(
587
+ TargetConditionedSlateRequest(
588
+ allocation_request=request,
589
+ frontier_target=context.frontier_target,
590
+ state=context.state,
591
+ member_features=features,
592
+ realizable_portfolios=realizable,
593
+ campaign_generation=context.campaign_generation,
594
+ remaining_proposal_horizon=(context.remaining_proposal_horizon),
595
+ )
596
+ )
597
+
598
+ @property
599
+ def configuration_sha256(self) -> str:
600
+ """Bind every injected prior-only provider and the frozen T-RAP profile."""
601
+
602
+ return _hash(_ADAPTER_CONFIGURATION_DOMAIN, self.to_record())
603
+
604
+ def to_record(self) -> dict[str, object]:
605
+ self.__post_init__()
606
+ return {
607
+ "policy_id": self.policy_id,
608
+ "policy_version": self.policy_version,
609
+ "definition_sha256": self.definition_sha256,
610
+ "profile": self.profile.to_record(),
611
+ "feature_projector": self.feature_projector.to_record(),
612
+ "structural_score_projector": _provider_identity(
613
+ self.structural_score_projector,
614
+ name="structural_score_projector",
615
+ ),
616
+ "context_provider": _provider_identity(
617
+ self.context_provider, name="context_provider"
618
+ ),
619
+ "realizability_projector": _provider_identity(
620
+ self.realizability_projector, name="realizability_projector"
621
+ ),
622
+ }
623
+
624
+
625
+ __all__ = [
626
+ "ADAPTER_DEFINITION_SHA256",
627
+ "ADAPTER_ID",
628
+ "ADAPTER_VERSION",
629
+ "BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256",
630
+ "BASE_REALIZABLE_PROJECTOR_ID",
631
+ "BASE_REALIZABLE_PROJECTOR_VERSION",
632
+ "BaseRealizablePortfolioProjector",
633
+ "PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256",
634
+ "PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID",
635
+ "PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION",
636
+ "PriorStructuralScoreProjector",
637
+ "REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256",
638
+ "REGISTERED_CONTEXT_PROVIDER_ID",
639
+ "REGISTERED_CONTEXT_PROVIDER_VERSION",
640
+ "RegisteredTargetConditionedAllocationContextProvider",
641
+ "RealizablePortfolioProjector",
642
+ "StructuralScoreProjector",
643
+ "TargetConditionedAllocationContext",
644
+ "TargetConditionedAllocationContextKey",
645
+ "TargetConditionedAllocationContextProvider",
646
+ "TargetConditionedAllocationContextRegistrar",
647
+ "TargetConditionedSlateAllocatorAdapter",
648
+ ]