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.
- agent_evolve/__init__.py +722 -0
- agent_evolve/agentic.py +2800 -0
- agent_evolve/api.py +767 -0
- agent_evolve/application/__init__.py +1580 -0
- agent_evolve/application/action_allocation.py +744 -0
- agent_evolve/application/action_allocation_frame.py +347 -0
- agent_evolve/application/action_allocation_frame_commit.py +185 -0
- agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
- agent_evolve/application/action_allocation_frame_v3.py +338 -0
- agent_evolve/application/action_archive_value.py +497 -0
- agent_evolve/application/action_evidence_consistency.py +455 -0
- agent_evolve/application/action_forecast_partitioning.py +1471 -0
- agent_evolve/application/action_metric_projection.py +211 -0
- agent_evolve/application/action_role_value.py +680 -0
- agent_evolve/application/action_score_authorities.py +363 -0
- agent_evolve/application/action_structural_signature.py +116 -0
- agent_evolve/application/action_target_realization.py +402 -0
- agent_evolve/application/agentic_evolution.py +7734 -0
- agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
- agent_evolve/application/anchor_residual_identification.py +463 -0
- agent_evolve/application/archive_conditioned_action_target.py +208 -0
- agent_evolve/application/artifact_journal.py +246 -0
- agent_evolve/application/artifact_replay.py +347 -0
- agent_evolve/application/budgeted_optimizer.py +1828 -0
- agent_evolve/application/calibrated_campaign.py +485 -0
- agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
- agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
- agent_evolve/application/campaign_capacity_recourse.py +254 -0
- agent_evolve/application/campaign_contextual_outcomes.py +119 -0
- agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
- agent_evolve/application/campaign_evidence_registry.py +262 -0
- agent_evolve/application/campaign_execution.py +2537 -0
- agent_evolve/application/campaign_generation_audit.py +942 -0
- agent_evolve/application/campaign_learning.py +1812 -0
- agent_evolve/application/campaign_learning_runtime.py +1977 -0
- agent_evolve/application/campaign_search_phase.py +227 -0
- agent_evolve/application/campaign_selector_context_extension.py +220 -0
- agent_evolve/application/campaign_variation_envelope.py +649 -0
- agent_evolve/application/campaign_variation_trace.py +451 -0
- agent_evolve/application/candidate_archive_consequence.py +128 -0
- agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
- agent_evolve/application/composite_outcome_updater.py +145 -0
- agent_evolve/application/composition_portfolio_selection.py +363 -0
- agent_evolve/application/concurrent_stage.py +144 -0
- agent_evolve/application/contextual_action_allocation.py +181 -0
- agent_evolve/application/contextual_campaign_outcomes.py +267 -0
- agent_evolve/application/contextual_campaign_planning.py +1366 -0
- agent_evolve/application/contextual_delayed_credit.py +651 -0
- agent_evolve/application/contextual_search_controller.py +2374 -0
- agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
- agent_evolve/application/decision_metric_projection.py +112 -0
- agent_evolve/application/derived_action_semantics.py +129 -0
- agent_evolve/application/detailed_evaluation.py +449 -0
- agent_evolve/application/earned_lineage.py +1011 -0
- agent_evolve/application/effective_choice_audit.py +484 -0
- agent_evolve/application/empirical_consequence_calibration.py +908 -0
- agent_evolve/application/evaluation_accounting.py +325 -0
- agent_evolve/application/evaluation_cache.py +199 -0
- agent_evolve/application/evaluation_escrow.py +547 -0
- agent_evolve/application/evaluation_recourse.py +253 -0
- agent_evolve/application/event_recorder.py +151 -0
- agent_evolve/application/evolution_campaign.py +1840 -0
- agent_evolve/application/executable_hypothesis.py +323 -0
- agent_evolve/application/factorial_branch_pilot.py +772 -0
- agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
- agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
- agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
- agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
- agent_evolve/application/finite_action_selection.py +188 -0
- agent_evolve/application/finite_action_set.py +306 -0
- agent_evolve/application/finite_action_transition.py +537 -0
- agent_evolve/application/finite_variation_eligibility.py +296 -0
- agent_evolve/application/forecast_geometry_portfolio.py +799 -0
- agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
- agent_evolve/application/front_proximity_admission.py +311 -0
- agent_evolve/application/front_proximity_parent_basis.py +458 -0
- agent_evolve/application/frozen_hurdle_score.py +659 -0
- agent_evolve/application/g3_causal_screen.py +2257 -0
- agent_evolve/application/g3_causal_validation.py +1046 -0
- agent_evolve/application/g3_postseal_curation.py +818 -0
- agent_evolve/application/gated_agentic_generator.py +205 -0
- agent_evolve/application/generation_feedback.py +293 -0
- agent_evolve/application/generative_proposal_journal.py +185 -0
- agent_evolve/application/geometry_conditional_elasticity.py +453 -0
- agent_evolve/application/global_wave_action_allocation.py +1151 -0
- agent_evolve/application/head_mass_conditional_seat.py +268 -0
- agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
- agent_evolve/application/identifiable_reflection_learning.py +395 -0
- agent_evolve/application/identifiable_reflection_request.py +364 -0
- agent_evolve/application/in_memory_residual_archive.py +341 -0
- agent_evolve/application/insight_memory.py +1804 -0
- agent_evolve/application/live_runtime_manifest.py +758 -0
- agent_evolve/application/llm_task_queue.py +769 -0
- agent_evolve/application/matched_finite_action_block.py +409 -0
- agent_evolve/application/materialized_action_broker.py +2328 -0
- agent_evolve/application/materialized_action_constraints.py +83 -0
- agent_evolve/application/materialized_variation.py +211 -0
- agent_evolve/application/multi_option_evolution.py +1536 -0
- agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
- agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
- agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
- agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
- agent_evolve/application/outcome_relation.py +193 -0
- agent_evolve/application/paired_allocation_comparison.py +241 -0
- agent_evolve/application/paired_block_schedule.py +127 -0
- agent_evolve/application/parent_measurement.py +226 -0
- agent_evolve/application/pareto_archive.py +811 -0
- agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
- agent_evolve/application/portfolio_evolution.py +2950 -0
- agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
- agent_evolve/application/portfolio_memory_attribution.py +581 -0
- agent_evolve/application/portfolio_memory_dose.py +788 -0
- agent_evolve/application/portfolio_memory_matched_control.py +938 -0
- agent_evolve/application/portfolio_memory_transfer.py +297 -0
- agent_evolve/application/portfolio_optimization_memory.py +363 -0
- agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
- agent_evolve/application/portfolio_projection.py +335 -0
- agent_evolve/application/portfolio_recombination.py +2032 -0
- agent_evolve/application/post_evolution_reflection.py +834 -0
- agent_evolve/application/postcommit_rank_authority.py +245 -0
- agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
- agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
- agent_evolve/application/prequential_residual_exploration.py +343 -0
- agent_evolve/application/prequential_score_portfolio.py +954 -0
- agent_evolve/application/projections.py +292 -0
- agent_evolve/application/protected_action_committee.py +1027 -0
- agent_evolve/application/protected_branch_pilot.py +376 -0
- agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
- agent_evolve/application/provider_replay.py +910 -0
- agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
- agent_evolve/application/recombination_residual_expert.py +403 -0
- agent_evolve/application/reflection_workflow.py +571 -0
- agent_evolve/application/region_conditional_credit.py +911 -0
- agent_evolve/application/residual_campaign_runtime.py +531 -0
- agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
- agent_evolve/application/residual_headroom_ledger.py +1544 -0
- agent_evolve/application/residual_learning_transaction.py +396 -0
- agent_evolve/application/residual_portfolio_evolution.py +1228 -0
- agent_evolve/application/residual_reachability.py +749 -0
- agent_evolve/application/residual_stage_credit.py +499 -0
- agent_evolve/application/same_prefix_paired_audit.py +1580 -0
- agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
- agent_evolve/application/sequential_lineage_allocation.py +1017 -0
- agent_evolve/application/sequential_market_replay.py +1395 -0
- agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
- agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
- agent_evolve/application/single_score_action_allocation.py +299 -0
- agent_evolve/application/source_exposure_allocation.py +906 -0
- agent_evolve/application/staged_memory.py +210 -0
- agent_evolve/application/stratified_cold_start_allocation.py +732 -0
- agent_evolve/application/support_guarded_hurdle_score.py +549 -0
- agent_evolve/application/target_conditioned_action_forecast.py +595 -0
- agent_evolve/application/target_conditioned_campaign.py +566 -0
- agent_evolve/application/treatment_assignment.py +201 -0
- agent_evolve/application/trusted_objective_evidence.py +217 -0
- agent_evolve/application/two_stage_action_evolution.py +1131 -0
- agent_evolve/application/v8lite_allocation_policy.py +1083 -0
- agent_evolve/application/v9_candidate_policy.py +1303 -0
- agent_evolve/bootstrap.py +108 -0
- agent_evolve/campaign_presets.py +517 -0
- agent_evolve/campaign_profiles.py +452 -0
- agent_evolve/campaign_variation_topology.py +288 -0
- agent_evolve/campaign_workload.py +950 -0
- agent_evolve/cli.py +797 -0
- agent_evolve/contract.py +241 -0
- agent_evolve/core/__init__.py +91 -0
- agent_evolve/core/action_semantics.py +411 -0
- agent_evolve/core/authored.py +105 -0
- agent_evolve/core/formatting.py +286 -0
- agent_evolve/core/optimization_semantics.py +324 -0
- agent_evolve/core/problem.py +167 -0
- agent_evolve/core/results.py +323 -0
- agent_evolve/core/stats.py +70 -0
- agent_evolve/core/telemetry.py +100 -0
- agent_evolve/domain/__init__.py +89 -0
- agent_evolve/domain/artifact.py +162 -0
- agent_evolve/domain/durable_text.py +68 -0
- agent_evolve/domain/event.py +1454 -0
- agent_evolve/domain/finite_action_set.py +426 -0
- agent_evolve/domain/finite_variation.py +526 -0
- agent_evolve/domain/generative_emission.py +559 -0
- agent_evolve/domain/ids.py +163 -0
- agent_evolve/domain/inline_text.py +106 -0
- agent_evolve/domain/insight.py +27 -0
- agent_evolve/domain/lineage.py +737 -0
- agent_evolve/domain/llm_task_queue.py +960 -0
- agent_evolve/domain/outcome.py +96 -0
- agent_evolve/domain/patch.py +854 -0
- agent_evolve/domain/typed_json.py +542 -0
- agent_evolve/domain/variation_space.py +158 -0
- agent_evolve/driver.py +1014 -0
- agent_evolve/harness/__init__.py +29 -0
- agent_evolve/harness/base.py +242 -0
- agent_evolve/harness/directives.py +163 -0
- agent_evolve/harness/generative_seal.py +479 -0
- agent_evolve/harness/registry.py +41 -0
- agent_evolve/infrastructure/__init__.py +39 -0
- agent_evolve/infrastructure/artifacts/__init__.py +6 -0
- agent_evolve/infrastructure/artifacts/_verification.py +67 -0
- agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
- agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
- agent_evolve/infrastructure/asyncio_runtime.py +109 -0
- agent_evolve/infrastructure/authored_runtime.py +188 -0
- agent_evolve/infrastructure/authored_worker.py +171 -0
- agent_evolve/infrastructure/clock.py +53 -0
- agent_evolve/infrastructure/events/__init__.py +6 -0
- agent_evolve/infrastructure/events/_validation.py +89 -0
- agent_evolve/infrastructure/events/in_memory.py +56 -0
- agent_evolve/infrastructure/events/jsonl.py +193 -0
- agent_evolve/infrastructure/exception_provenance.py +215 -0
- agent_evolve/infrastructure/ids.py +118 -0
- agent_evolve/infrastructure/lineage_codec.py +1836 -0
- agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
- agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
- agent_evolve/infrastructure/resource_lease.py +370 -0
- agent_evolve/infrastructure/sanitization/__init__.py +8 -0
- agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
- agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
- agent_evolve/infrastructure/stream_liveness.py +383 -0
- agent_evolve/infrastructure/subprocess_boundary.py +136 -0
- agent_evolve/integrations/__init__.py +1 -0
- agent_evolve/integrations/botorch/__init__.py +28 -0
- agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
- agent_evolve/integrations/completion.py +242 -0
- agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
- agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
- agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
- agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
- agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
- agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
- agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
- agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
- agent_evolve/integrations/pydantic_ai/harness.py +159 -0
- agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
- agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
- agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
- agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
- agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
- agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
- agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
- agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
- agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
- agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
- agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
- agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
- agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
- agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
- agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
- agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
- agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
- agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
- agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
- agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
- agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
- agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
- agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
- agent_evolve/integrations/pymoo_adapter.py +242 -0
- agent_evolve/policies/__init__.py +17 -0
- agent_evolve/policies/check.py +469 -0
- agent_evolve/policies/emit_scaffold.py +451 -0
- agent_evolve/policies/feedback/__init__.py +37 -0
- agent_evolve/policies/feedback/held_out_asn.py +1325 -0
- agent_evolve/policies/genetic.py +607 -0
- agent_evolve/policies/llm_backoff.py +183 -0
- agent_evolve/policies/llm_chooser.py +226 -0
- agent_evolve/policies/llm_generator.py +1760 -0
- agent_evolve/policies/llm_init.py +267 -0
- agent_evolve/policies/llm_operator.py +109 -0
- agent_evolve/policies/llm_prior.py +194 -0
- agent_evolve/policies/llm_surrogate.py +334 -0
- agent_evolve/policies/measurement_evidence.py +704 -0
- agent_evolve/policies/memory/__init__.py +223 -0
- agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
- agent_evolve/policies/memory/compatibility_matching.py +593 -0
- agent_evolve/policies/memory/global_falsification.py +1841 -0
- agent_evolve/policies/memory/prompt_shape.py +503 -0
- agent_evolve/policies/memory/randomized_subset.py +714 -0
- agent_evolve/policies/memory/staged_causal.py +1270 -0
- agent_evolve/policies/memory/treatment_compliance.py +759 -0
- agent_evolve/policies/objective_resolution/__init__.py +17 -0
- agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
- agent_evolve/policies/operator_portfolio.py +407 -0
- agent_evolve/policies/reguidance.py +1133 -0
- agent_evolve/policies/reward/__init__.py +83 -0
- agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
- agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
- agent_evolve/policies/reward/affine_hypervolume.py +490 -0
- agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
- agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
- agent_evolve/policies/reward/frozen_archive.py +360 -0
- agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
- agent_evolve/policies/search_state.py +208 -0
- agent_evolve/policies/selection/__init__.py +345 -0
- agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
- agent_evolve/policies/selection/affine_frontier_context.py +330 -0
- agent_evolve/policies/selection/affine_frontier_target.py +473 -0
- agent_evolve/policies/selection/archive_elite.py +1346 -0
- agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
- agent_evolve/policies/selection/calibrated_slate.py +1394 -0
- agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
- agent_evolve/policies/selection/common_candidate_pool.py +685 -0
- agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
- agent_evolve/policies/selection/disjoint_pairs.py +479 -0
- agent_evolve/policies/selection/elite_explorer.py +719 -0
- agent_evolve/policies/selection/finite_action.py +187 -0
- agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
- agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
- agent_evolve/policies/selection/forecast_calibration.py +922 -0
- agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
- agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
- agent_evolve/policies/selection/full_support_slate.py +91 -0
- agent_evolve/policies/selection/meaningful_direction.py +240 -0
- agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
- agent_evolve/policies/selection/model_anchored_slate.py +826 -0
- agent_evolve/policies/selection/phenotype_recourse.py +979 -0
- agent_evolve/policies/selection/proposal_support.py +368 -0
- agent_evolve/policies/selection/random_portfolio.py +254 -0
- agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
- agent_evolve/policies/selection/residual_frontier.py +463 -0
- agent_evolve/policies/selection/residual_frontier_target.py +605 -0
- agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
- agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
- agent_evolve/policies/selection/target_conditioned_features.py +812 -0
- agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
- agent_evolve/policies/selection/task_keyed_palette.py +906 -0
- agent_evolve/policies/semantics.py +147 -0
- agent_evolve/policies/structure.py +362 -0
- agent_evolve/policies/structured_output_budget.py +62 -0
- agent_evolve/policies/surrogate.py +696 -0
- agent_evolve/policies/variation/__init__.py +1 -0
- agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
- agent_evolve/policies/variation/crossover_inheritance.py +575 -0
- agent_evolve/policies/variation/disjoint_recombination.py +611 -0
- agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
- agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
- agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
- agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
- agent_evolve/policies/variation/typed_patch.py +1981 -0
- agent_evolve/policies/weighted_prior.py +394 -0
- agent_evolve/ports/__init__.py +383 -0
- agent_evolve/ports/action_allocation.py +733 -0
- agent_evolve/ports/action_allocation_frame.py +1153 -0
- agent_evolve/ports/action_allocation_frame_commit.py +294 -0
- agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
- agent_evolve/ports/action_allocation_frame_v3.py +995 -0
- agent_evolve/ports/action_forecast.py +1568 -0
- agent_evolve/ports/action_metric_projection.py +165 -0
- agent_evolve/ports/agentic_generator.py +1561 -0
- agent_evolve/ports/archive_context.py +136 -0
- agent_evolve/ports/artifact_sanitizer.py +44 -0
- agent_evolve/ports/artifact_store.py +225 -0
- agent_evolve/ports/clock.py +13 -0
- agent_evolve/ports/contextual_search_allocation.py +827 -0
- agent_evolve/ports/decision_metric_projection.py +258 -0
- agent_evolve/ports/event_store.py +55 -0
- agent_evolve/ports/executable_hypothesis.py +557 -0
- agent_evolve/ports/finite_acquisition.py +377 -0
- agent_evolve/ports/finite_acquisition_batch.py +296 -0
- agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
- agent_evolve/ports/finite_acquisition_json.py +247 -0
- agent_evolve/ports/finite_acquisition_space.py +168 -0
- agent_evolve/ports/finite_action_selection.py +348 -0
- agent_evolve/ports/finite_action_set.py +256 -0
- agent_evolve/ports/frontier_target.py +396 -0
- agent_evolve/ports/generation_failure.py +43 -0
- agent_evolve/ports/hard_feasibility.py +233 -0
- agent_evolve/ports/id_factory.py +34 -0
- agent_evolve/ports/llm_task_queue.py +93 -0
- agent_evolve/ports/objective_resolution.py +419 -0
- agent_evolve/ports/paired_allocation_comparison.py +401 -0
- agent_evolve/ports/paired_block_schedule.py +475 -0
- agent_evolve/ports/parent_measurement.py +336 -0
- agent_evolve/ports/portfolio_memory_dose.py +643 -0
- agent_evolve/ports/portfolio_selection.py +3169 -0
- agent_evolve/ports/postcommit_rank_authority.py +467 -0
- agent_evolve/ports/presented_action_evidence.py +794 -0
- agent_evolve/ports/resource_lease.py +162 -0
- agent_evolve/ports/structured_generator.py +734 -0
- agent_evolve/ports/structured_output_budget.py +120 -0
- agent_evolve/ports/subprocess_boundary.py +138 -0
- agent_evolve/ports/treatment_assignment.py +466 -0
- agent_evolve/ports/variation_catalog.py +76 -0
- agent_evolve/ports/variation_source.py +226 -0
- agent_evolve/proposal_mode.py +157 -0
- agent_evolve/proposers/__init__.py +10 -0
- agent_evolve/proposers/random_proposer.py +188 -0
- agent_evolve/provider_accounting.py +163 -0
- agent_evolve/py.typed +0 -0
- agent_evolve/reference_method.py +1570 -0
- agent_evolve/session/__init__.py +11 -0
- agent_evolve/session/authorship.py +864 -0
- agent_evolve/session/evaluate.py +236 -0
- agent_evolve/session/fidelity.py +237 -0
- agent_evolve/session/genetic_loop.py +742 -0
- agent_evolve/session/loop.py +803 -0
- agent_evolve/session/screening.py +671 -0
- agent_evolve/settings.py +376 -0
- agent_evolve/workload_kit.py +368 -0
- agent_evolve/workload_prompt.py +398 -0
- agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
- agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
- agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
- agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
- agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
- agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
"""Generic planning and allocation for action-to-frontier realization.
|
|
2
|
+
|
|
3
|
+
This application service is the workload-neutral seam between an evolutionary
|
|
4
|
+
campaign's authenticated objective-space aspiration and the existing
|
|
5
|
+
all-option consequence forecaster. It depends only on public optimization,
|
|
6
|
+
finite-action, and campaign-context contracts. Benchmark adapters may inject
|
|
7
|
+
a richer action glossary; otherwise a structural glossary is derived from the
|
|
8
|
+
sealed parent-to-child patches.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
|
|
17
|
+
from agent_evolve.application.action_allocation import (
|
|
18
|
+
FeasibleBeamRiskAdjustedDiversityAllocator,
|
|
19
|
+
)
|
|
20
|
+
from agent_evolve.application.action_archive_value import (
|
|
21
|
+
NormalizedResidualFrontierCell,
|
|
22
|
+
ReliabilityAdjustedResidualCellExpectedHypervolumeUtility,
|
|
23
|
+
ResidualCellExpectedHypervolumeUtility,
|
|
24
|
+
residual_frontier_cell_from_target,
|
|
25
|
+
)
|
|
26
|
+
from agent_evolve.application.action_role_value import (
|
|
27
|
+
RoleAssignmentAudit,
|
|
28
|
+
RoleFactorizedActionPortfolioUtility,
|
|
29
|
+
audit_role_factorized_action_portfolio,
|
|
30
|
+
build_role_factorized_action_utility,
|
|
31
|
+
)
|
|
32
|
+
from agent_evolve.application.action_target_realization import (
|
|
33
|
+
ActionTargetRealization,
|
|
34
|
+
ResidualTargetClosurePortfolioUtility,
|
|
35
|
+
TargetMetricAlias,
|
|
36
|
+
assess_action_target_realization,
|
|
37
|
+
)
|
|
38
|
+
from agent_evolve.application.derived_action_semantics import (
|
|
39
|
+
derive_action_space_semantics,
|
|
40
|
+
)
|
|
41
|
+
from agent_evolve.application.portfolio_campaign_runtime import (
|
|
42
|
+
CAMPAIGN_FRONTIER_TARGET_KEY,
|
|
43
|
+
)
|
|
44
|
+
from agent_evolve.core.action_semantics import ActionSpaceSemantics
|
|
45
|
+
from agent_evolve.core.optimization_semantics import (
|
|
46
|
+
MetricRole,
|
|
47
|
+
MetricSense,
|
|
48
|
+
OptimizationSemantics,
|
|
49
|
+
)
|
|
50
|
+
from agent_evolve.domain.finite_variation import FiniteVariationContract
|
|
51
|
+
from agent_evolve.domain.ids import LLMCallId
|
|
52
|
+
from agent_evolve.domain.typed_json import thaw_json
|
|
53
|
+
from agent_evolve.ports.action_allocation import (
|
|
54
|
+
ActionAllocationRequest,
|
|
55
|
+
ActionAllocationResult,
|
|
56
|
+
ActionPortfolioDecision,
|
|
57
|
+
ExactActionArmCountConstraint,
|
|
58
|
+
ForecastPortfolioUtilityBinding,
|
|
59
|
+
validate_action_portfolio_decision,
|
|
60
|
+
)
|
|
61
|
+
from agent_evolve.ports.action_forecast import (
|
|
62
|
+
ActionForecastEvidenceMode,
|
|
63
|
+
ActionForecastRequest,
|
|
64
|
+
MetricForecastScale,
|
|
65
|
+
ParentMetricValue,
|
|
66
|
+
ResolvedActionForecastBatch,
|
|
67
|
+
)
|
|
68
|
+
from agent_evolve.ports.frontier_target import (
|
|
69
|
+
CampaignPortfolioFrontierTarget,
|
|
70
|
+
ObjectiveSpaceTarget,
|
|
71
|
+
campaign_frontier_target_from_record,
|
|
72
|
+
objective_space_target_from_campaign_target,
|
|
73
|
+
)
|
|
74
|
+
from agent_evolve.ports.portfolio_selection import PortfolioSelectionRequest
|
|
75
|
+
from agent_evolve.ports.structured_generator import MAX_OUTPUT_TOKENS
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
TARGET_ACTION_FORECAST_SCALE_POLICY_ID = "target_delta_forecast_scale"
|
|
79
|
+
TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION = 1
|
|
80
|
+
TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
|
|
81
|
+
b"agent-evolve:target-delta-forecast-scale:v1;"
|
|
82
|
+
b"nonzero=absolute-parent-to-aspiration-raw-delta;"
|
|
83
|
+
b"zero=one-thirty-second-objective-affine-span;"
|
|
84
|
+
b"metric-id=optimization-semantic-objective-id;"
|
|
85
|
+
b"workload-model-provider-fields=false;outcomes=false"
|
|
86
|
+
).hexdigest()
|
|
87
|
+
_SCALE_BINDING_DOMAIN = b"agent-evolve:target-delta-scale-binding:v1\x00"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dataclass(frozen=True, slots=True)
|
|
91
|
+
class TargetConditionedActionForecastPlan:
|
|
92
|
+
"""Typed forecast request plus the exact target/metric bridge it realizes."""
|
|
93
|
+
|
|
94
|
+
campaign_target: CampaignPortfolioFrontierTarget
|
|
95
|
+
objective_target: ObjectiveSpaceTarget
|
|
96
|
+
aliases: tuple[TargetMetricAlias, ...]
|
|
97
|
+
request: ActionForecastRequest
|
|
98
|
+
residual_cell: NormalizedResidualFrontierCell | None
|
|
99
|
+
min_distinct_families: int | None
|
|
100
|
+
require_pairwise_disjoint_parent_patches: bool
|
|
101
|
+
|
|
102
|
+
def __post_init__(self) -> None:
|
|
103
|
+
if type(self.campaign_target) is not CampaignPortfolioFrontierTarget:
|
|
104
|
+
raise TypeError("campaign_target must be exact")
|
|
105
|
+
self.campaign_target.__post_init__()
|
|
106
|
+
if type(self.objective_target) is not ObjectiveSpaceTarget:
|
|
107
|
+
raise TypeError("objective_target must be exact")
|
|
108
|
+
self.objective_target.__post_init__()
|
|
109
|
+
if (
|
|
110
|
+
self.objective_target.campaign_target_sha256
|
|
111
|
+
!= self.campaign_target.target_sha256
|
|
112
|
+
):
|
|
113
|
+
raise ValueError("objective target belongs to a foreign campaign target")
|
|
114
|
+
if type(self.aliases) is not tuple or any(
|
|
115
|
+
type(value) is not TargetMetricAlias for value in self.aliases
|
|
116
|
+
):
|
|
117
|
+
raise TypeError("aliases must contain exact target metric aliases")
|
|
118
|
+
for value in self.aliases:
|
|
119
|
+
value.__post_init__()
|
|
120
|
+
if tuple(value.target_metric_id for value in self.aliases) != (
|
|
121
|
+
self.objective_target.metric_ids
|
|
122
|
+
):
|
|
123
|
+
raise ValueError("aliases must canonically cover the objective target")
|
|
124
|
+
if type(self.request) is not ActionForecastRequest:
|
|
125
|
+
raise TypeError("request must be an exact ActionForecastRequest")
|
|
126
|
+
self.request.__post_init__()
|
|
127
|
+
if (
|
|
128
|
+
self.request.finite_variation_contract.parent_configuration_sha256
|
|
129
|
+
!= self.campaign_target.parent_configuration_sha256
|
|
130
|
+
):
|
|
131
|
+
raise ValueError("forecast contract parent differs from frontier target")
|
|
132
|
+
if set(value.forecast_metric_id for value in self.aliases) != set(
|
|
133
|
+
self.request.required_metric_ids
|
|
134
|
+
):
|
|
135
|
+
raise ValueError("forecast request and target aliases cover different metrics")
|
|
136
|
+
if self.residual_cell is not None:
|
|
137
|
+
if type(self.residual_cell) is not NormalizedResidualFrontierCell:
|
|
138
|
+
raise TypeError("residual_cell must be exact or None")
|
|
139
|
+
self.residual_cell.__post_init__()
|
|
140
|
+
if (
|
|
141
|
+
self.residual_cell.campaign_target_sha256
|
|
142
|
+
!= self.campaign_target.target_sha256
|
|
143
|
+
):
|
|
144
|
+
raise ValueError("residual cell belongs to a foreign target")
|
|
145
|
+
if self.min_distinct_families is not None and (
|
|
146
|
+
type(self.min_distinct_families) is not int
|
|
147
|
+
or self.min_distinct_families <= 0
|
|
148
|
+
):
|
|
149
|
+
raise ValueError("min_distinct_families must be positive or None")
|
|
150
|
+
if type(self.require_pairwise_disjoint_parent_patches) is not bool:
|
|
151
|
+
raise TypeError(
|
|
152
|
+
"require_pairwise_disjoint_parent_patches must be exact bool"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
def assess(
|
|
156
|
+
self,
|
|
157
|
+
forecasts: ResolvedActionForecastBatch,
|
|
158
|
+
) -> tuple[ActionTargetRealization, ...]:
|
|
159
|
+
self.__post_init__()
|
|
160
|
+
return assess_action_target_realization(
|
|
161
|
+
target=self.objective_target,
|
|
162
|
+
forecasts=forecasts,
|
|
163
|
+
aliases=self.aliases,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _target_from_selection_context(
|
|
168
|
+
request: PortfolioSelectionRequest,
|
|
169
|
+
) -> tuple[CampaignPortfolioFrontierTarget, ObjectiveSpaceTarget]:
|
|
170
|
+
context = thaw_json(request.context)
|
|
171
|
+
if type(context) is not dict: # pragma: no cover - frozen root is closed.
|
|
172
|
+
raise AssertionError("portfolio selection context is not an object")
|
|
173
|
+
record = context.get(CAMPAIGN_FRONTIER_TARGET_KEY)
|
|
174
|
+
if record is None:
|
|
175
|
+
raise ValueError("portfolio selection context omits a frontier target")
|
|
176
|
+
campaign_target = campaign_frontier_target_from_record(record)
|
|
177
|
+
objective_target = objective_space_target_from_campaign_target(campaign_target)
|
|
178
|
+
if objective_target is None:
|
|
179
|
+
raise ValueError("campaign frontier target omits raw objective-space axes")
|
|
180
|
+
if campaign_target.parent_configuration_sha256 != (
|
|
181
|
+
request.finite_variation_contract.parent_configuration_sha256
|
|
182
|
+
):
|
|
183
|
+
raise ValueError("campaign frontier target names a foreign parent")
|
|
184
|
+
return campaign_target, objective_target
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _objective_metric_aliases(
|
|
188
|
+
target: ObjectiveSpaceTarget,
|
|
189
|
+
semantics: OptimizationSemantics,
|
|
190
|
+
) -> tuple[TargetMetricAlias, ...]:
|
|
191
|
+
objectives_by_name = {
|
|
192
|
+
metric.name: metric
|
|
193
|
+
for metric in semantics.metrics
|
|
194
|
+
if metric.role is MetricRole.OBJECTIVE
|
|
195
|
+
}
|
|
196
|
+
aliases: list[TargetMetricAlias] = []
|
|
197
|
+
for axis in target.axes:
|
|
198
|
+
metric = objectives_by_name.get(axis.metric_id)
|
|
199
|
+
if metric is None:
|
|
200
|
+
raise ValueError(
|
|
201
|
+
"frontier target metric is absent from objective semantics: "
|
|
202
|
+
+ axis.metric_id
|
|
203
|
+
)
|
|
204
|
+
expected_sense = (
|
|
205
|
+
MetricSense.MINIMIZE if axis.goal == "min" else MetricSense.MAXIMIZE
|
|
206
|
+
)
|
|
207
|
+
if metric.sense is not expected_sense:
|
|
208
|
+
raise ValueError("frontier target goal differs from objective semantics")
|
|
209
|
+
aliases.append(TargetMetricAlias(axis.metric_id, metric.metric_id))
|
|
210
|
+
return tuple(sorted(aliases, key=lambda value: value.target_metric_id))
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _scale_definition_sha256(
|
|
214
|
+
*,
|
|
215
|
+
target: ObjectiveSpaceTarget,
|
|
216
|
+
target_metric_id: str,
|
|
217
|
+
forecast_metric_id: str,
|
|
218
|
+
scale: float,
|
|
219
|
+
) -> str:
|
|
220
|
+
payload = json.dumps(
|
|
221
|
+
{
|
|
222
|
+
"schema_version": 1,
|
|
223
|
+
"policy_id": TARGET_ACTION_FORECAST_SCALE_POLICY_ID,
|
|
224
|
+
"policy_version": TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION,
|
|
225
|
+
"policy_definition_sha256": (
|
|
226
|
+
TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256
|
|
227
|
+
),
|
|
228
|
+
"campaign_target_sha256": target.campaign_target_sha256,
|
|
229
|
+
"target_metric_id": target_metric_id,
|
|
230
|
+
"forecast_metric_id": forecast_metric_id,
|
|
231
|
+
"delta_scale_hex": scale.hex(),
|
|
232
|
+
},
|
|
233
|
+
allow_nan=False,
|
|
234
|
+
ensure_ascii=True,
|
|
235
|
+
separators=(",", ":"),
|
|
236
|
+
sort_keys=True,
|
|
237
|
+
).encode("ascii")
|
|
238
|
+
return hashlib.sha256(_SCALE_BINDING_DOMAIN + payload).hexdigest()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def build_target_conditioned_action_forecast_plan(
|
|
242
|
+
*,
|
|
243
|
+
selection_request: PortfolioSelectionRequest,
|
|
244
|
+
optimization_semantics: OptimizationSemantics,
|
|
245
|
+
call_id: LLMCallId,
|
|
246
|
+
forecast_contract: FiniteVariationContract | None = None,
|
|
247
|
+
action_semantics: ActionSpaceSemantics | None = None,
|
|
248
|
+
evidence_mode: ActionForecastEvidenceMode = (
|
|
249
|
+
ActionForecastEvidenceMode.CATALOG_ONLY
|
|
250
|
+
),
|
|
251
|
+
operation: str = "forecast_target_realization",
|
|
252
|
+
max_output_tokens: int = MAX_OUTPUT_TOKENS,
|
|
253
|
+
temperature: float | None = None,
|
|
254
|
+
) -> TargetConditionedActionForecastPlan:
|
|
255
|
+
"""Build one complete consequence-forecast request from generic contracts."""
|
|
256
|
+
|
|
257
|
+
if type(selection_request) is not PortfolioSelectionRequest:
|
|
258
|
+
raise TypeError("selection_request must be exact PortfolioSelectionRequest")
|
|
259
|
+
selection_request.__post_init__()
|
|
260
|
+
if type(optimization_semantics) is not OptimizationSemantics:
|
|
261
|
+
raise TypeError("optimization_semantics must be exact")
|
|
262
|
+
optimization_semantics.__post_init__()
|
|
263
|
+
if type(evidence_mode) is not ActionForecastEvidenceMode:
|
|
264
|
+
raise TypeError("evidence_mode must be exact ActionForecastEvidenceMode")
|
|
265
|
+
resolved_contract = (
|
|
266
|
+
selection_request.finite_variation_contract
|
|
267
|
+
if forecast_contract is None
|
|
268
|
+
else forecast_contract
|
|
269
|
+
)
|
|
270
|
+
if type(resolved_contract) is not FiniteVariationContract:
|
|
271
|
+
raise TypeError("forecast_contract must be an exact contract or None")
|
|
272
|
+
resolved_contract.__post_init__()
|
|
273
|
+
source_contract = selection_request.finite_variation_contract
|
|
274
|
+
if (
|
|
275
|
+
resolved_contract.parent_configuration_sha256
|
|
276
|
+
!= source_contract.parent_configuration_sha256
|
|
277
|
+
):
|
|
278
|
+
raise ValueError("forecast contract belongs to a foreign parent")
|
|
279
|
+
source_options = {
|
|
280
|
+
value.identity_sha256: value for value in source_contract.options
|
|
281
|
+
}
|
|
282
|
+
if any(
|
|
283
|
+
source_options.get(value.identity_sha256) != value
|
|
284
|
+
for value in resolved_contract.options
|
|
285
|
+
):
|
|
286
|
+
raise ValueError("forecast contract is not an exact source-contract subset")
|
|
287
|
+
campaign_target, objective_target = _target_from_selection_context(
|
|
288
|
+
selection_request
|
|
289
|
+
)
|
|
290
|
+
aliases = _objective_metric_aliases(objective_target, optimization_semantics)
|
|
291
|
+
alias_by_target = {
|
|
292
|
+
value.target_metric_id: value.forecast_metric_id for value in aliases
|
|
293
|
+
}
|
|
294
|
+
parent_values: list[ParentMetricValue] = []
|
|
295
|
+
scales: list[MetricForecastScale] = []
|
|
296
|
+
for axis in objective_target.axes:
|
|
297
|
+
forecast_metric_id = alias_by_target[axis.metric_id]
|
|
298
|
+
scale = abs(axis.signed_parent_to_aspiration_delta)
|
|
299
|
+
if scale == 0.0:
|
|
300
|
+
scale = abs(axis.reference - axis.ideal) / 32.0
|
|
301
|
+
if scale <= 0.0: # pragma: no cover - target axis validation closes span.
|
|
302
|
+
raise ValueError("target-conditioned forecast scale is not positive")
|
|
303
|
+
parent_values.append(ParentMetricValue(forecast_metric_id, axis.parent_value))
|
|
304
|
+
scales.append(
|
|
305
|
+
MetricForecastScale(
|
|
306
|
+
forecast_metric_id,
|
|
307
|
+
float(scale),
|
|
308
|
+
_scale_definition_sha256(
|
|
309
|
+
target=objective_target,
|
|
310
|
+
target_metric_id=axis.metric_id,
|
|
311
|
+
forecast_metric_id=forecast_metric_id,
|
|
312
|
+
scale=float(scale),
|
|
313
|
+
),
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
parent_values.sort(key=lambda value: value.metric_id)
|
|
317
|
+
scales.sort(key=lambda value: value.metric_id)
|
|
318
|
+
resolved_action_semantics = (
|
|
319
|
+
derive_action_space_semantics(resolved_contract)
|
|
320
|
+
if action_semantics is None
|
|
321
|
+
else action_semantics
|
|
322
|
+
)
|
|
323
|
+
resolved_action_semantics.validate_contract_binding(
|
|
324
|
+
(
|
|
325
|
+
resolved_contract.catalog_id,
|
|
326
|
+
resolved_contract.catalog_version,
|
|
327
|
+
resolved_contract.catalog_definition_sha256,
|
|
328
|
+
),
|
|
329
|
+
tuple(value.family for value in resolved_contract.options),
|
|
330
|
+
)
|
|
331
|
+
grounded = evidence_mode is ActionForecastEvidenceMode.GROUNDED
|
|
332
|
+
forecast_request = ActionForecastRequest(
|
|
333
|
+
call_id=call_id,
|
|
334
|
+
operation=operation,
|
|
335
|
+
instruction=(
|
|
336
|
+
"Forecast signed child-minus-parent objective changes and validity "
|
|
337
|
+
"for every sealed finite action. Use the raw parent-to-aspiration "
|
|
338
|
+
"target magnitudes in context to distinguish undershoot, plausible "
|
|
339
|
+
"target closure, and destructive overshoot. Estimate consequences; "
|
|
340
|
+
"do not select actions or claim evaluator observations."
|
|
341
|
+
),
|
|
342
|
+
context=selection_request.context,
|
|
343
|
+
optimization_semantics=optimization_semantics,
|
|
344
|
+
action_semantics=resolved_action_semantics,
|
|
345
|
+
finite_variation_contract=resolved_contract,
|
|
346
|
+
cards=selection_request.cards if grounded else (),
|
|
347
|
+
source_registry=selection_request.source_registry if grounded else None,
|
|
348
|
+
evidence_mode=evidence_mode,
|
|
349
|
+
experimental_view_receipt=(
|
|
350
|
+
selection_request.experimental_view_receipt if grounded else None
|
|
351
|
+
),
|
|
352
|
+
parent_metric_values=tuple(parent_values),
|
|
353
|
+
metric_scales=tuple(scales),
|
|
354
|
+
max_output_tokens=max_output_tokens,
|
|
355
|
+
temperature=temperature,
|
|
356
|
+
)
|
|
357
|
+
return TargetConditionedActionForecastPlan(
|
|
358
|
+
campaign_target=campaign_target,
|
|
359
|
+
objective_target=objective_target,
|
|
360
|
+
aliases=aliases,
|
|
361
|
+
request=forecast_request,
|
|
362
|
+
residual_cell=residual_frontier_cell_from_target(
|
|
363
|
+
campaign_target=campaign_target,
|
|
364
|
+
objective_target=objective_target,
|
|
365
|
+
),
|
|
366
|
+
min_distinct_families=selection_request.min_distinct_families,
|
|
367
|
+
require_pairwise_disjoint_parent_patches=(
|
|
368
|
+
selection_request.require_pairwise_disjoint_parent_patches
|
|
369
|
+
),
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def build_target_conditioned_action_utility(
|
|
374
|
+
*,
|
|
375
|
+
plan: TargetConditionedActionForecastPlan,
|
|
376
|
+
forecasts: ResolvedActionForecastBatch,
|
|
377
|
+
portfolio_size: int,
|
|
378
|
+
eligible_option_ids: tuple[str, ...] | None = None,
|
|
379
|
+
utility_mode: str = "target_closure",
|
|
380
|
+
role_slots: tuple[int, int, int] | None = None,
|
|
381
|
+
) -> ForecastPortfolioUtilityBinding:
|
|
382
|
+
"""Build one identified, workload-neutral acquisition utility."""
|
|
383
|
+
|
|
384
|
+
if type(plan) is not TargetConditionedActionForecastPlan:
|
|
385
|
+
raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
|
|
386
|
+
plan.__post_init__()
|
|
387
|
+
plan.assess(forecasts)
|
|
388
|
+
eligible = (
|
|
389
|
+
tuple(sorted(value.option_id for value in forecasts.forecasts))
|
|
390
|
+
if eligible_option_ids is None
|
|
391
|
+
else eligible_option_ids
|
|
392
|
+
)
|
|
393
|
+
if utility_mode == "target_closure":
|
|
394
|
+
return ResidualTargetClosurePortfolioUtility(
|
|
395
|
+
target=plan.objective_target,
|
|
396
|
+
aliases=plan.aliases,
|
|
397
|
+
).binding()
|
|
398
|
+
if utility_mode == "expected_hypervolume":
|
|
399
|
+
if plan.residual_cell is None:
|
|
400
|
+
raise ValueError(
|
|
401
|
+
"expected_hypervolume requires residual frontier cell anchors"
|
|
402
|
+
)
|
|
403
|
+
return ResidualCellExpectedHypervolumeUtility(
|
|
404
|
+
target=plan.objective_target,
|
|
405
|
+
cell=plan.residual_cell,
|
|
406
|
+
aliases=plan.aliases,
|
|
407
|
+
).binding()
|
|
408
|
+
if utility_mode == "reliability_adjusted_expected_hypervolume":
|
|
409
|
+
if plan.residual_cell is None:
|
|
410
|
+
raise ValueError(
|
|
411
|
+
"reliability-adjusted expected_hypervolume requires residual "
|
|
412
|
+
"frontier cell anchors"
|
|
413
|
+
)
|
|
414
|
+
return ReliabilityAdjustedResidualCellExpectedHypervolumeUtility(
|
|
415
|
+
target=plan.objective_target,
|
|
416
|
+
cell=plan.residual_cell,
|
|
417
|
+
aliases=plan.aliases,
|
|
418
|
+
).binding()
|
|
419
|
+
if utility_mode == "role_factorized":
|
|
420
|
+
if plan.residual_cell is None:
|
|
421
|
+
raise ValueError(
|
|
422
|
+
"role_factorized requires residual frontier cell anchors"
|
|
423
|
+
)
|
|
424
|
+
resolved_role_slots = (
|
|
425
|
+
(portfolio_size - 2, 1, 1) if role_slots is None else role_slots
|
|
426
|
+
)
|
|
427
|
+
if (
|
|
428
|
+
type(resolved_role_slots) is not tuple
|
|
429
|
+
or len(resolved_role_slots) != 3
|
|
430
|
+
or any(type(value) is not int for value in resolved_role_slots)
|
|
431
|
+
):
|
|
432
|
+
raise TypeError("role_slots must be an exact (exploit, bridge, probe) tuple")
|
|
433
|
+
exploit_slots, bridge_slots, probe_slots = resolved_role_slots
|
|
434
|
+
if exploit_slots + bridge_slots + probe_slots != portfolio_size:
|
|
435
|
+
raise ValueError("role_slots must sum to portfolio_size")
|
|
436
|
+
role_utility = build_role_factorized_action_utility(
|
|
437
|
+
forecast_request=plan.request,
|
|
438
|
+
forecasts=forecasts,
|
|
439
|
+
eligible_option_ids=eligible,
|
|
440
|
+
exploit_utility=(
|
|
441
|
+
ReliabilityAdjustedResidualCellExpectedHypervolumeUtility(
|
|
442
|
+
target=plan.objective_target,
|
|
443
|
+
cell=plan.residual_cell,
|
|
444
|
+
aliases=plan.aliases,
|
|
445
|
+
)
|
|
446
|
+
),
|
|
447
|
+
bridge_utility=ResidualTargetClosurePortfolioUtility(
|
|
448
|
+
target=plan.objective_target,
|
|
449
|
+
aliases=plan.aliases,
|
|
450
|
+
),
|
|
451
|
+
exploit_slots=exploit_slots,
|
|
452
|
+
bridge_slots=bridge_slots,
|
|
453
|
+
probe_slots=probe_slots,
|
|
454
|
+
)
|
|
455
|
+
return role_utility.binding()
|
|
456
|
+
raise ValueError(
|
|
457
|
+
"utility_mode must be target_closure, expected_hypervolume, "
|
|
458
|
+
"reliability_adjusted_expected_hypervolume, or role_factorized"
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def allocate_target_conditioned_actions(
|
|
463
|
+
*,
|
|
464
|
+
plan: TargetConditionedActionForecastPlan,
|
|
465
|
+
forecasts: ResolvedActionForecastBatch,
|
|
466
|
+
portfolio_size: int,
|
|
467
|
+
eligible_option_ids: tuple[str, ...] | None = None,
|
|
468
|
+
risk_aversion: float = 0.5,
|
|
469
|
+
diversity_weight: float = 0.05,
|
|
470
|
+
beam_width: int = 256,
|
|
471
|
+
utility_mode: str = "target_closure",
|
|
472
|
+
required_option_ids: tuple[str, ...] = (),
|
|
473
|
+
role_slots: tuple[int, int, int] | None = None,
|
|
474
|
+
exact_arm_count_constraints: tuple[ExactActionArmCountConstraint, ...] = (),
|
|
475
|
+
minimum_single_path_interventions: int = 0,
|
|
476
|
+
minimum_disjoint_parent_patch_pairs: int = 0,
|
|
477
|
+
) -> ActionAllocationResult:
|
|
478
|
+
"""Allocate a robust target-closing set from one authenticated forecast."""
|
|
479
|
+
|
|
480
|
+
if type(plan) is not TargetConditionedActionForecastPlan:
|
|
481
|
+
raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
|
|
482
|
+
plan.__post_init__()
|
|
483
|
+
plan.assess(forecasts)
|
|
484
|
+
eligible = (
|
|
485
|
+
tuple(sorted(value.option_id for value in forecasts.forecasts))
|
|
486
|
+
if eligible_option_ids is None
|
|
487
|
+
else eligible_option_ids
|
|
488
|
+
)
|
|
489
|
+
utility = build_target_conditioned_action_utility(
|
|
490
|
+
plan=plan,
|
|
491
|
+
forecasts=forecasts,
|
|
492
|
+
portfolio_size=portfolio_size,
|
|
493
|
+
eligible_option_ids=eligible,
|
|
494
|
+
utility_mode=utility_mode,
|
|
495
|
+
role_slots=role_slots,
|
|
496
|
+
)
|
|
497
|
+
request = ActionAllocationRequest(
|
|
498
|
+
forecast_request=plan.request,
|
|
499
|
+
forecasts=forecasts,
|
|
500
|
+
eligible_option_ids=eligible,
|
|
501
|
+
portfolio_size=portfolio_size,
|
|
502
|
+
utility=utility,
|
|
503
|
+
min_distinct_families=plan.min_distinct_families,
|
|
504
|
+
require_pairwise_disjoint_parent_patches=(
|
|
505
|
+
plan.require_pairwise_disjoint_parent_patches
|
|
506
|
+
),
|
|
507
|
+
minimum_single_path_interventions=minimum_single_path_interventions,
|
|
508
|
+
minimum_disjoint_parent_patch_pairs=(
|
|
509
|
+
minimum_disjoint_parent_patch_pairs
|
|
510
|
+
),
|
|
511
|
+
required_option_ids=required_option_ids,
|
|
512
|
+
exact_arm_count_constraints=exact_arm_count_constraints,
|
|
513
|
+
)
|
|
514
|
+
return FeasibleBeamRiskAdjustedDiversityAllocator(
|
|
515
|
+
risk_aversion=risk_aversion,
|
|
516
|
+
diversity_weight=diversity_weight,
|
|
517
|
+
beam_width=beam_width,
|
|
518
|
+
).allocate(request)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def audit_target_conditioned_role_allocation(
|
|
522
|
+
*,
|
|
523
|
+
plan: TargetConditionedActionForecastPlan,
|
|
524
|
+
forecasts: ResolvedActionForecastBatch,
|
|
525
|
+
decision: ActionPortfolioDecision,
|
|
526
|
+
eligible_option_ids: tuple[str, ...] | None = None,
|
|
527
|
+
role_slots: tuple[int, int, int] | None = None,
|
|
528
|
+
exact_arm_count_constraints: tuple[ExactActionArmCountConstraint, ...] = (),
|
|
529
|
+
required_option_ids: tuple[str, ...] = (),
|
|
530
|
+
minimum_single_path_interventions: int = 0,
|
|
531
|
+
minimum_disjoint_parent_patch_pairs: int = 0,
|
|
532
|
+
) -> tuple[RoleAssignmentAudit, ...]:
|
|
533
|
+
"""Rebuild, validate, and explain a final role-factorized allocation."""
|
|
534
|
+
|
|
535
|
+
if type(plan) is not TargetConditionedActionForecastPlan:
|
|
536
|
+
raise TypeError("plan must be exact TargetConditionedActionForecastPlan")
|
|
537
|
+
plan.__post_init__()
|
|
538
|
+
plan.assess(forecasts)
|
|
539
|
+
if type(decision) is not ActionPortfolioDecision:
|
|
540
|
+
raise TypeError("decision must be exact ActionPortfolioDecision")
|
|
541
|
+
decision.__post_init__()
|
|
542
|
+
eligible = (
|
|
543
|
+
tuple(sorted(value.option_id for value in forecasts.forecasts))
|
|
544
|
+
if eligible_option_ids is None
|
|
545
|
+
else eligible_option_ids
|
|
546
|
+
)
|
|
547
|
+
utility = build_target_conditioned_action_utility(
|
|
548
|
+
plan=plan,
|
|
549
|
+
forecasts=forecasts,
|
|
550
|
+
portfolio_size=len(decision.members),
|
|
551
|
+
eligible_option_ids=eligible,
|
|
552
|
+
utility_mode="role_factorized",
|
|
553
|
+
role_slots=role_slots,
|
|
554
|
+
)
|
|
555
|
+
request = ActionAllocationRequest(
|
|
556
|
+
forecast_request=plan.request,
|
|
557
|
+
forecasts=forecasts,
|
|
558
|
+
eligible_option_ids=eligible,
|
|
559
|
+
portfolio_size=len(decision.members),
|
|
560
|
+
utility=utility,
|
|
561
|
+
min_distinct_families=plan.min_distinct_families,
|
|
562
|
+
require_pairwise_disjoint_parent_patches=(
|
|
563
|
+
plan.require_pairwise_disjoint_parent_patches
|
|
564
|
+
),
|
|
565
|
+
minimum_single_path_interventions=minimum_single_path_interventions,
|
|
566
|
+
minimum_disjoint_parent_patch_pairs=(
|
|
567
|
+
minimum_disjoint_parent_patch_pairs
|
|
568
|
+
),
|
|
569
|
+
required_option_ids=required_option_ids,
|
|
570
|
+
exact_arm_count_constraints=exact_arm_count_constraints,
|
|
571
|
+
)
|
|
572
|
+
validate_action_portfolio_decision(request, decision)
|
|
573
|
+
role_utility = utility.utility
|
|
574
|
+
if type(role_utility) is not RoleFactorizedActionPortfolioUtility:
|
|
575
|
+
raise AssertionError("role utility factory returned a foreign utility")
|
|
576
|
+
return audit_role_factorized_action_portfolio(
|
|
577
|
+
utility=role_utility,
|
|
578
|
+
forecast_request=plan.request,
|
|
579
|
+
forecasts=forecasts,
|
|
580
|
+
selected_option_ids=tuple(
|
|
581
|
+
sorted(value.option_id for value in decision.members)
|
|
582
|
+
),
|
|
583
|
+
)
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
__all__ = [
|
|
587
|
+
"TARGET_ACTION_FORECAST_SCALE_POLICY_DEFINITION_SHA256",
|
|
588
|
+
"TARGET_ACTION_FORECAST_SCALE_POLICY_ID",
|
|
589
|
+
"TARGET_ACTION_FORECAST_SCALE_POLICY_VERSION",
|
|
590
|
+
"TargetConditionedActionForecastPlan",
|
|
591
|
+
"allocate_target_conditioned_actions",
|
|
592
|
+
"audit_target_conditioned_role_allocation",
|
|
593
|
+
"build_target_conditioned_action_utility",
|
|
594
|
+
"build_target_conditioned_action_forecast_plan",
|
|
595
|
+
]
|