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,451 @@
1
+ """Workload-neutral audit of proposed and evaluated variation topology.
2
+
3
+ The calibrated selector commits its original proposal slate and the engine's
4
+ evaluated subset in one authenticated result. This projection makes the
5
+ search-topology behavior directly comparable across workloads without
6
+ inspecting candidate fields, objective names, or model prose.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections import Counter
12
+ from dataclasses import dataclass
13
+
14
+ from agent_evolve.domain.finite_variation import FiniteVariationContract
15
+ from agent_evolve.domain.typed_json import thaw_json
16
+ from agent_evolve.policies.variation.compositional_finite_catalog import (
17
+ COMPOSITION_LEFT_OPTION_METADATA_KEY,
18
+ COMPOSITION_RIGHT_OPTION_METADATA_KEY,
19
+ COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY,
20
+ CompositionSelectionExposure,
21
+ )
22
+ from agent_evolve.ports.portfolio_selection import PortfolioSelectionResult
23
+
24
+
25
+ _HIERARCHICAL_ACTION_KINDS = frozenset({"atomic", "compose_r2"})
26
+
27
+
28
+ def project_finite_contract_proposal_topology(
29
+ *,
30
+ source_contract: FiniteVariationContract,
31
+ proposal_contract: FiniteVariationContract,
32
+ ) -> dict[str, object]:
33
+ """Project an authenticated proposal surface without pretending it is LLM output."""
34
+
35
+ if type(source_contract) is not FiniteVariationContract or type(
36
+ proposal_contract
37
+ ) is not FiniteVariationContract:
38
+ raise TypeError("source and proposal contracts must be exact")
39
+ source_contract.__post_init__()
40
+ proposal_contract.__post_init__()
41
+ source_by_identity = {
42
+ option.identity_sha256: option for option in source_contract.options
43
+ }
44
+ if any(
45
+ source_by_identity.get(option.identity_sha256) != option
46
+ for option in proposal_contract.options
47
+ ):
48
+ raise ValueError("proposal topology escapes the source finite contract")
49
+ hierarchical = any(
50
+ COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY in dict(option.metadata)
51
+ for option in source_contract.options
52
+ )
53
+ members: list[dict[str, object]] = []
54
+ for rank, option in enumerate(proposal_contract.options, start=1):
55
+ metadata = dict(option.metadata)
56
+ exposure = metadata.get(COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY)
57
+ if exposure is not None and exposure != (
58
+ CompositionSelectionExposure.HIERARCHICAL_RANKED_UNION.value
59
+ ):
60
+ raise ValueError("finite option declares an unknown hierarchy exposure")
61
+ if not hierarchical:
62
+ kind = "unclassified"
63
+ components: list[str] = []
64
+ elif exposure is None:
65
+ kind = "atomic"
66
+ components = []
67
+ else:
68
+ try:
69
+ components = sorted(
70
+ (
71
+ metadata[COMPOSITION_LEFT_OPTION_METADATA_KEY],
72
+ metadata[COMPOSITION_RIGHT_OPTION_METADATA_KEY],
73
+ )
74
+ )
75
+ except KeyError as error:
76
+ raise ValueError(
77
+ "hierarchical composite omitted its component options"
78
+ ) from error
79
+ if (
80
+ len(components) != 2
81
+ or len(set(components)) != 2
82
+ or any(type(value) is not str or not value for value in components)
83
+ ):
84
+ raise ValueError("hierarchical composite components are invalid")
85
+ kind = "compose_r2"
86
+ members.append(
87
+ {
88
+ "proposal_rank": rank,
89
+ "option_id": option.option_id,
90
+ "action_kind": kind,
91
+ "component_option_ids": components,
92
+ }
93
+ )
94
+ return {
95
+ "schema_version": 1,
96
+ "provenance": "engine_authenticated_finite_contract",
97
+ "source_contract_sha256": source_contract.identity_sha256,
98
+ "proposal_contract_sha256": proposal_contract.identity_sha256,
99
+ "members": members,
100
+ }
101
+
102
+
103
+ def _proposal_members_from_audit(
104
+ payload: dict[str, object],
105
+ ) -> tuple[list[dict[str, object]], str]:
106
+ original = payload.get("original_k8_response")
107
+ members = original.get("members") if type(original) is dict else None
108
+ if type(members) is list and members:
109
+ return members, "model_original_k8_response"
110
+ topology = payload.get("proposal_topology")
111
+ rows = topology.get("members") if type(topology) is dict else None
112
+ if type(rows) is not list or not rows:
113
+ raise ValueError("selector supplemental audit omitted proposal topology")
114
+ normalized: list[dict[str, object]] = []
115
+ for row in rows:
116
+ if type(row) is not dict:
117
+ raise TypeError("proposal topology member must be an object")
118
+ kind = row.get("action_kind")
119
+ if kind == "unclassified":
120
+ action = None
121
+ elif kind in _HIERARCHICAL_ACTION_KINDS:
122
+ action = {
123
+ "action_kind": kind,
124
+ "component_option_ids": row.get("component_option_ids", []),
125
+ }
126
+ else:
127
+ raise ValueError("proposal topology has an unknown action kind")
128
+ normalized.append(
129
+ {
130
+ "option_id": row.get("option_id"),
131
+ "hierarchical_action": action,
132
+ }
133
+ )
134
+ return normalized, "engine_authenticated_finite_contract"
135
+
136
+
137
+ @dataclass(frozen=True, slots=True)
138
+ class CampaignVariationTraceSummary:
139
+ """Aggregate exact proposal-to-evaluation topology behavior."""
140
+
141
+ selector_call_count: int
142
+ proposal_member_count: int
143
+ evaluated_member_count: int
144
+ proposal_action_kind_counts: tuple[tuple[str, int], ...]
145
+ evaluated_action_kind_counts: tuple[tuple[str, int], ...]
146
+ hierarchical_call_count: int
147
+ model_original_proposal_call_count: int
148
+ engine_authenticated_proposal_call_count: int
149
+ required_composite_proposals: int | None
150
+ exact_required_composite_call_count: int
151
+ required_composite_capacity_available_call_count: int
152
+ capacity_projected_call_count: int
153
+ effective_composite_proposal_count_histogram: tuple[tuple[int, int], ...]
154
+ calls: tuple[dict[str, object], ...]
155
+
156
+ def __post_init__(self) -> None:
157
+ for name in (
158
+ "selector_call_count",
159
+ "proposal_member_count",
160
+ "evaluated_member_count",
161
+ "hierarchical_call_count",
162
+ "model_original_proposal_call_count",
163
+ "engine_authenticated_proposal_call_count",
164
+ "exact_required_composite_call_count",
165
+ "required_composite_capacity_available_call_count",
166
+ "capacity_projected_call_count",
167
+ ):
168
+ value = getattr(self, name)
169
+ if type(value) is not int or value < 0:
170
+ raise ValueError(f"{name} must be a non-negative exact integer")
171
+ if self.required_composite_proposals is not None and (
172
+ type(self.required_composite_proposals) is not int
173
+ or not 1 <= self.required_composite_proposals < 8
174
+ ):
175
+ raise ValueError("required_composite_proposals must lie in [1, 8)")
176
+ for name in (
177
+ "proposal_action_kind_counts",
178
+ "evaluated_action_kind_counts",
179
+ ):
180
+ values = getattr(self, name)
181
+ if type(values) is not tuple or values != tuple(sorted(values)):
182
+ raise ValueError(f"{name} must be a canonical exact tuple")
183
+ if any(
184
+ type(key) is not str or not key or type(count) is not int or count < 0
185
+ for key, count in values
186
+ ):
187
+ raise ValueError(f"{name} contains an invalid counter")
188
+ if type(self.calls) is not tuple or len(self.calls) != self.selector_call_count:
189
+ raise ValueError("calls must contain one record per selector call")
190
+ if (
191
+ self.model_original_proposal_call_count
192
+ + self.engine_authenticated_proposal_call_count
193
+ > self.selector_call_count
194
+ ):
195
+ raise ValueError("classified proposal surfaces exceed selector calls")
196
+ if (
197
+ self.exact_required_composite_call_count
198
+ > self.model_original_proposal_call_count
199
+ ):
200
+ raise ValueError("exact hierarchy count exceeds model proposal calls")
201
+ if (
202
+ self.required_composite_capacity_available_call_count
203
+ > self.engine_authenticated_proposal_call_count
204
+ ):
205
+ raise ValueError(
206
+ "available hierarchy capacity exceeds engine proposal calls"
207
+ )
208
+ if self.capacity_projected_call_count > self.hierarchical_call_count:
209
+ raise ValueError("capacity projection count exceeds hierarchical calls")
210
+ if (
211
+ type(self.effective_composite_proposal_count_histogram) is not tuple
212
+ or self.effective_composite_proposal_count_histogram
213
+ != tuple(sorted(self.effective_composite_proposal_count_histogram))
214
+ or any(
215
+ type(count) is not int
216
+ or count < 0
217
+ or type(calls) is not int
218
+ or calls <= 0
219
+ for count, calls in self.effective_composite_proposal_count_histogram
220
+ )
221
+ ):
222
+ raise ValueError("effective hierarchy histogram is not canonical")
223
+
224
+ def to_record(self) -> dict[str, object]:
225
+ self.__post_init__()
226
+ proposed = dict(self.proposal_action_kind_counts)
227
+ evaluated = dict(self.evaluated_action_kind_counts)
228
+ composite_proposed = proposed.get("compose_r2", 0)
229
+ composite_evaluated = evaluated.get("compose_r2", 0)
230
+ return {
231
+ "schema_version": 4,
232
+ "selector_call_count": self.selector_call_count,
233
+ "proposal_member_count": self.proposal_member_count,
234
+ "evaluated_member_count": self.evaluated_member_count,
235
+ "proposal_action_kind_counts": proposed,
236
+ "evaluated_action_kind_counts": evaluated,
237
+ "hierarchical_call_count": self.hierarchical_call_count,
238
+ "model_original_proposal_call_count": (
239
+ self.model_original_proposal_call_count
240
+ ),
241
+ "engine_authenticated_proposal_call_count": (
242
+ self.engine_authenticated_proposal_call_count
243
+ ),
244
+ "required_composite_proposals": self.required_composite_proposals,
245
+ "exact_required_composite_call_count": (
246
+ self.exact_required_composite_call_count
247
+ ),
248
+ "required_composite_capacity_available_call_count": (
249
+ self.required_composite_capacity_available_call_count
250
+ ),
251
+ "capacity_projected_call_count": self.capacity_projected_call_count,
252
+ "effective_composite_proposal_count_histogram": {
253
+ str(count): calls
254
+ for count, calls in self.effective_composite_proposal_count_histogram
255
+ },
256
+ "exact_required_composite_call_rate": (
257
+ None
258
+ if self.required_composite_proposals is None
259
+ or self.model_original_proposal_call_count == 0
260
+ else self.exact_required_composite_call_count
261
+ / self.model_original_proposal_call_count
262
+ ),
263
+ "required_composite_capacity_available_rate": (
264
+ None
265
+ if self.required_composite_proposals is None
266
+ or self.engine_authenticated_proposal_call_count == 0
267
+ else self.required_composite_capacity_available_call_count
268
+ / self.engine_authenticated_proposal_call_count
269
+ ),
270
+ "composite_proposal_count": composite_proposed,
271
+ "composite_evaluated_count": composite_evaluated,
272
+ "composite_proposal_evaluation_rate": (
273
+ None
274
+ if composite_proposed == 0
275
+ else composite_evaluated / composite_proposed
276
+ ),
277
+ "calls": list(self.calls),
278
+ }
279
+
280
+
281
+ def summarize_campaign_variation_trace(
282
+ results: tuple[PortfolioSelectionResult, ...],
283
+ *,
284
+ required_composite_proposals: int | None = None,
285
+ ) -> CampaignVariationTraceSummary:
286
+ """Join authenticated K8 proposals to their engine-selected subsets."""
287
+
288
+ if type(results) is not tuple or any(
289
+ type(value) is not PortfolioSelectionResult for value in results
290
+ ):
291
+ raise TypeError("results must contain exact PortfolioSelectionResult values")
292
+ if required_composite_proposals is not None and (
293
+ type(required_composite_proposals) is not int
294
+ or not 1 <= required_composite_proposals < 8
295
+ ):
296
+ raise ValueError("required_composite_proposals must lie in [1, 8)")
297
+
298
+ proposal_counts: Counter[str] = Counter()
299
+ evaluated_counts: Counter[str] = Counter()
300
+ proposal_member_count = 0
301
+ evaluated_member_count = 0
302
+ hierarchical_call_count = 0
303
+ model_original_call_count = 0
304
+ engine_authenticated_call_count = 0
305
+ exact_required_count = 0
306
+ required_capacity_available_count = 0
307
+ capacity_projected_call_count = 0
308
+ effective_composite_counts: Counter[int] = Counter()
309
+ call_records: list[dict[str, object]] = []
310
+
311
+ for result in results:
312
+ selected_ids = tuple(member.option_id for member in result.decision.members)
313
+ evaluated_member_count += len(selected_ids)
314
+ audit = result.supplemental_audit
315
+ if audit is None:
316
+ evaluated_counts.update({"unclassified": len(selected_ids)})
317
+ call_records.append(
318
+ {
319
+ "request_sha256": result.decision.request_sha256,
320
+ "topology": "direct_or_unclassified",
321
+ "proposal_option_ids": [],
322
+ "evaluated_option_ids": list(selected_ids),
323
+ "proposal_action_kinds": [],
324
+ "evaluated_action_kinds": ["unclassified" for _ in selected_ids],
325
+ }
326
+ )
327
+ continue
328
+
329
+ payload = thaw_json(audit.payload)
330
+ if type(payload) is not dict:
331
+ raise TypeError("selector supplemental audit payload must be an object")
332
+ members, proposal_provenance = _proposal_members_from_audit(payload)
333
+ option_ids: list[str] = []
334
+ kinds: list[str] = []
335
+ kind_by_option: dict[str, str] = {}
336
+ hierarchical_flags: list[bool] = []
337
+ for row in members:
338
+ if type(row) is not dict:
339
+ raise TypeError("selector proposal member must be an object")
340
+ option_id = row.get("option_id")
341
+ if type(option_id) is not str or not option_id:
342
+ raise ValueError("selector proposal member omitted option_id")
343
+ action = row.get("hierarchical_action")
344
+ hierarchical_flags.append(action is not None)
345
+ if action is None:
346
+ kind = "unclassified"
347
+ else:
348
+ if type(action) is not dict:
349
+ raise TypeError("hierarchical action must be an object")
350
+ kind = action.get("action_kind")
351
+ if kind not in _HIERARCHICAL_ACTION_KINDS:
352
+ raise ValueError("hierarchical action has an unknown kind")
353
+ components = action.get("component_option_ids", [])
354
+ if type(components) is not list:
355
+ raise TypeError("hierarchical components must be a list")
356
+ if kind == "atomic" and components:
357
+ raise ValueError("atomic hierarchical member declares components")
358
+ if kind == "compose_r2" and (
359
+ len(components) != 2 or len(set(components)) != 2
360
+ ):
361
+ raise ValueError("radius-two member lacks two source atoms")
362
+ option_ids.append(option_id)
363
+ kinds.append(kind)
364
+ kind_by_option[option_id] = kind
365
+ if len(set(option_ids)) != len(option_ids):
366
+ raise ValueError("selector proposal repeats an option")
367
+ if not set(selected_ids).issubset(option_ids):
368
+ raise ValueError("evaluated selection escapes its original proposal")
369
+ if any(hierarchical_flags) and not all(hierarchical_flags):
370
+ raise ValueError("one selector call mixes hierarchical and flat members")
371
+
372
+ hierarchical = all(hierarchical_flags)
373
+ if hierarchical:
374
+ hierarchical_call_count += 1
375
+ observed_composites = kinds.count("compose_r2")
376
+ if proposal_provenance == "model_original_k8_response":
377
+ model_original_call_count += 1
378
+ else:
379
+ engine_authenticated_call_count += 1
380
+ if required_composite_proposals is not None:
381
+ if not hierarchical:
382
+ raise ValueError("required hierarchical trace lacks hierarchy actions")
383
+ effective_composite_counts[observed_composites] += 1
384
+ if proposal_provenance == "model_original_k8_response":
385
+ # Every model result has passed its dynamic exact-K8 schema.
386
+ # A different count is an authenticated K8 capacity projection.
387
+ exact_required_count += 1
388
+ if observed_composites != required_composite_proposals:
389
+ capacity_projected_call_count += 1
390
+ else:
391
+ # An engine screen may be wider than K8. Its relevant promise
392
+ # is availability, not equality with the model's K8 mix.
393
+ if observed_composites >= required_composite_proposals:
394
+ required_capacity_available_count += 1
395
+ else:
396
+ capacity_projected_call_count += 1
397
+ proposal_counts.update(kinds)
398
+ evaluated_kinds = [kind_by_option[value] for value in selected_ids]
399
+ evaluated_counts.update(evaluated_kinds)
400
+ proposal_member_count += len(option_ids)
401
+ call_records.append(
402
+ {
403
+ "request_sha256": result.decision.request_sha256,
404
+ "proposal_provenance": proposal_provenance,
405
+ "topology": "hierarchical_r2" if hierarchical else "flat_or_atomic",
406
+ "proposal_option_ids": option_ids,
407
+ "evaluated_option_ids": list(selected_ids),
408
+ "proposal_action_kinds": kinds,
409
+ "evaluated_action_kinds": evaluated_kinds,
410
+ "composite_proposal_count": observed_composites,
411
+ "composite_evaluated_count": evaluated_kinds.count("compose_r2"),
412
+ "preferred_composite_proposal_count": (required_composite_proposals),
413
+ "effective_composite_proposal_count": observed_composites,
414
+ "capacity_projected": (
415
+ required_composite_proposals is not None
416
+ and (
417
+ observed_composites != required_composite_proposals
418
+ if proposal_provenance == "model_original_k8_response"
419
+ else observed_composites < required_composite_proposals
420
+ )
421
+ ),
422
+ }
423
+ )
424
+
425
+ return CampaignVariationTraceSummary(
426
+ selector_call_count=len(results),
427
+ proposal_member_count=proposal_member_count,
428
+ evaluated_member_count=evaluated_member_count,
429
+ proposal_action_kind_counts=tuple(sorted(proposal_counts.items())),
430
+ evaluated_action_kind_counts=tuple(sorted(evaluated_counts.items())),
431
+ hierarchical_call_count=hierarchical_call_count,
432
+ model_original_proposal_call_count=model_original_call_count,
433
+ engine_authenticated_proposal_call_count=engine_authenticated_call_count,
434
+ required_composite_proposals=required_composite_proposals,
435
+ exact_required_composite_call_count=exact_required_count,
436
+ required_composite_capacity_available_call_count=(
437
+ required_capacity_available_count
438
+ ),
439
+ capacity_projected_call_count=capacity_projected_call_count,
440
+ effective_composite_proposal_count_histogram=tuple(
441
+ sorted(effective_composite_counts.items())
442
+ ),
443
+ calls=tuple(call_records),
444
+ )
445
+
446
+
447
+ __all__ = [
448
+ "CampaignVariationTraceSummary",
449
+ "project_finite_contract_proposal_topology",
450
+ "summarize_campaign_variation_trace",
451
+ ]
@@ -0,0 +1,128 @@
1
+ """Generic scalar archive-geometry port for pre-evaluation consequence models."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ import re
7
+ from typing import Mapping, Protocol, runtime_checkable
8
+
9
+ from agent_evolve.application.agentic_evolution import EvolutionCandidate
10
+ from agent_evolve.domain.patch import require_sha256
11
+
12
+
13
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
14
+
15
+
16
+ @runtime_checkable
17
+ class CandidateArchiveConsequenceUtilityPort(Protocol):
18
+ """Measure prior archive utility and one hypothetical objective point.
19
+
20
+ The port receives only evaluated candidates and raw decision objectives.
21
+ It may implement fixed-reference hypervolume or another workload-defined
22
+ archive utility, while the consequence projector remains workload blind.
23
+ """
24
+
25
+ utility_id: str
26
+ utility_version: int
27
+ definition_sha256: str
28
+
29
+ def utility(
30
+ self,
31
+ candidates: tuple[EvolutionCandidate, ...],
32
+ ) -> float: ...
33
+
34
+ def marginal_utility(
35
+ self,
36
+ candidates: tuple[EvolutionCandidate, ...],
37
+ objective_point: Mapping[str, float],
38
+ ) -> float: ...
39
+
40
+
41
+ @runtime_checkable
42
+ class CandidateArchivePortfolioConsequenceUtilityPort(
43
+ CandidateArchiveConsequenceUtilityPort,
44
+ Protocol,
45
+ ):
46
+ """Measure the joint marginal value of hypothetical objective points.
47
+
48
+ This optional extension preserves the inverted workload boundary while
49
+ allowing a generic allocation policy to value Pareto-complementary sets
50
+ rather than summing member-wise scores. Implementations remain
51
+ authoritative for objective senses, normalization, and reference points.
52
+ """
53
+
54
+ def portfolio_marginal_utility(
55
+ self,
56
+ candidates: tuple[EvolutionCandidate, ...],
57
+ objective_points: tuple[Mapping[str, float], ...],
58
+ ) -> float: ...
59
+
60
+
61
+ def validate_candidate_archive_consequence_utility(
62
+ value: CandidateArchiveConsequenceUtilityPort,
63
+ ) -> tuple[str, int, str]:
64
+ """Validate and return an injected utility's public identity."""
65
+
66
+ if not isinstance(value, CandidateArchiveConsequenceUtilityPort):
67
+ raise TypeError(
68
+ "value must implement CandidateArchiveConsequenceUtilityPort"
69
+ )
70
+ identity = (
71
+ getattr(value, "utility_id", None),
72
+ getattr(value, "utility_version", None),
73
+ getattr(value, "definition_sha256", None),
74
+ )
75
+ if type(identity[0]) is not str or _TOKEN.fullmatch(identity[0]) is None:
76
+ raise ValueError("utility_id must use the closed token grammar")
77
+ if type(identity[1]) is not int or identity[1] <= 0:
78
+ raise ValueError("utility_version must be positive")
79
+ require_sha256(identity[2], "utility definition_sha256")
80
+ return identity # type: ignore[return-value]
81
+
82
+
83
+ def validate_candidate_archive_portfolio_consequence_utility(
84
+ value: CandidateArchivePortfolioConsequenceUtilityPort,
85
+ ) -> tuple[str, int, str]:
86
+ """Validate the joint-set extension and return its public identity."""
87
+
88
+ if not isinstance(
89
+ value,
90
+ CandidateArchivePortfolioConsequenceUtilityPort,
91
+ ):
92
+ raise TypeError(
93
+ "value must implement "
94
+ "CandidateArchivePortfolioConsequenceUtilityPort"
95
+ )
96
+ return validate_candidate_archive_consequence_utility(value)
97
+
98
+
99
+ def candidate_archive_utility(
100
+ port: CandidateArchiveConsequenceUtilityPort,
101
+ candidates: tuple[EvolutionCandidate, ...],
102
+ ) -> float:
103
+ """Call an injected utility and enforce the normalized scalar contract."""
104
+
105
+ validate_candidate_archive_consequence_utility(port)
106
+ if (
107
+ type(candidates) is not tuple
108
+ or any(
109
+ type(candidate) is not EvolutionCandidate
110
+ for candidate in candidates
111
+ )
112
+ ):
113
+ raise TypeError("candidates must be an exact candidate tuple")
114
+ for candidate in candidates:
115
+ candidate.__post_init__()
116
+ result = port.utility(candidates)
117
+ if type(result) is not float or not math.isfinite(result) or result < 0.0:
118
+ raise ValueError("archive utility must be finite and non-negative")
119
+ return result
120
+
121
+
122
+ __all__ = [
123
+ "CandidateArchiveConsequenceUtilityPort",
124
+ "CandidateArchivePortfolioConsequenceUtilityPort",
125
+ "candidate_archive_utility",
126
+ "validate_candidate_archive_portfolio_consequence_utility",
127
+ "validate_candidate_archive_consequence_utility",
128
+ ]