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,402 @@
|
|
|
1
|
+
"""Workload-neutral projection from action forecasts to frontier closure.
|
|
2
|
+
|
|
3
|
+
The residual-frontier planner operates in objective space while the finite
|
|
4
|
+
action forecaster estimates parent-relative metric deltas. This module is the
|
|
5
|
+
missing bridge: it converts those authenticated, provider-neutral values into
|
|
6
|
+
one-sided aspiration shortfall and exposes an identified portfolio utility for
|
|
7
|
+
the existing forecast allocator. It neither evaluates a candidate nor knows
|
|
8
|
+
workload, model, provider, or option-family names.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
|
|
18
|
+
from agent_evolve.ports.action_allocation import (
|
|
19
|
+
ForecastPortfolioUtilityBinding,
|
|
20
|
+
ForecastPortfolioUtilityInput,
|
|
21
|
+
ForecastQuantile,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.ports.action_forecast import (
|
|
24
|
+
ResolvedActionForecast,
|
|
25
|
+
ResolvedActionForecastBatch,
|
|
26
|
+
ResolvedActionMetricForecast,
|
|
27
|
+
)
|
|
28
|
+
from agent_evolve.ports.frontier_target import (
|
|
29
|
+
ObjectiveSpaceTarget,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
TARGET_CLOSURE_PORTFOLIO_UTILITY_ID = "residual_target_closure"
|
|
34
|
+
TARGET_CLOSURE_PORTFOLIO_UTILITY_VERSION = 1
|
|
35
|
+
TARGET_CLOSURE_PORTFOLIO_UTILITY_DEFINITION_SHA256 = hashlib.sha256(
|
|
36
|
+
b"agent-evolve:residual-target-closure-portfolio-utility:v1;"
|
|
37
|
+
b"inputs=authenticated-objective-space-target-and-resolved-action-forecasts;"
|
|
38
|
+
b"child=target-parent-plus-forecast-delta;"
|
|
39
|
+
b"frame=affine-lower-is-better;shortfall=positive-part-child-minus-aspiration;"
|
|
40
|
+
b"member-value=validity-times-parent-minus-child-l1-shortfall-plus-attainment;"
|
|
41
|
+
b"set-value=best-plus-harmonic-redundancy;"
|
|
42
|
+
b"workload-model-provider-identifiers=false;real-outcomes=false"
|
|
43
|
+
).hexdigest()
|
|
44
|
+
_TARGET_CLOSURE_BINDING_DOMAIN = (
|
|
45
|
+
b"agent-evolve:residual-target-closure-utility-binding:v1\x00"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _finite(value: object, *, name: str) -> float:
|
|
50
|
+
if type(value) is not float or not math.isfinite(value):
|
|
51
|
+
raise TypeError(f"{name} must be a finite exact float")
|
|
52
|
+
return value
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True, slots=True)
|
|
56
|
+
class TargetMetricAlias:
|
|
57
|
+
"""Explicit bridge when forecast and archive metric identifiers differ."""
|
|
58
|
+
|
|
59
|
+
target_metric_id: str
|
|
60
|
+
forecast_metric_id: str
|
|
61
|
+
|
|
62
|
+
def __post_init__(self) -> None:
|
|
63
|
+
for name in ("target_metric_id", "forecast_metric_id"):
|
|
64
|
+
value = getattr(self, name)
|
|
65
|
+
if type(value) is not str or not value:
|
|
66
|
+
raise ValueError(f"{name} must be non-empty")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass(frozen=True, slots=True)
|
|
70
|
+
class TargetClosureScenario:
|
|
71
|
+
"""Aspiration-closure statistics under one forecast quantile scenario."""
|
|
72
|
+
|
|
73
|
+
quantile: ForecastQuantile
|
|
74
|
+
normalized_shortfalls: tuple[tuple[str, float], ...]
|
|
75
|
+
normalized_shortfall_l1: float
|
|
76
|
+
normalized_shortfall_linf: float
|
|
77
|
+
shortfall_reduction_l1: float
|
|
78
|
+
attains_or_dominates_aspiration: bool
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
if type(self.quantile) is not ForecastQuantile:
|
|
82
|
+
raise TypeError("quantile must be an exact ForecastQuantile")
|
|
83
|
+
if type(self.normalized_shortfalls) is not tuple or not (
|
|
84
|
+
self.normalized_shortfalls
|
|
85
|
+
):
|
|
86
|
+
raise ValueError("normalized_shortfalls must be a non-empty tuple")
|
|
87
|
+
metric_ids = tuple(value[0] for value in self.normalized_shortfalls)
|
|
88
|
+
if metric_ids != tuple(sorted(set(metric_ids))):
|
|
89
|
+
raise ValueError("normalized shortfalls must be unique and canonical")
|
|
90
|
+
for metric_id, value in self.normalized_shortfalls:
|
|
91
|
+
if type(metric_id) is not str or not metric_id:
|
|
92
|
+
raise ValueError("shortfall metric_id must be non-empty")
|
|
93
|
+
_finite(value, name="normalized shortfall")
|
|
94
|
+
if value < 0.0:
|
|
95
|
+
raise ValueError("normalized shortfall cannot be negative")
|
|
96
|
+
for name in (
|
|
97
|
+
"normalized_shortfall_l1",
|
|
98
|
+
"normalized_shortfall_linf",
|
|
99
|
+
"shortfall_reduction_l1",
|
|
100
|
+
):
|
|
101
|
+
_finite(getattr(self, name), name=name)
|
|
102
|
+
expected_l1 = sum(value for _, value in self.normalized_shortfalls)
|
|
103
|
+
expected_linf = max(value for _, value in self.normalized_shortfalls)
|
|
104
|
+
if self.normalized_shortfall_l1 != expected_l1:
|
|
105
|
+
raise ValueError("L1 shortfall differs from its metric cells")
|
|
106
|
+
if self.normalized_shortfall_linf != expected_linf:
|
|
107
|
+
raise ValueError("Linf shortfall differs from its metric cells")
|
|
108
|
+
if type(self.attains_or_dominates_aspiration) is not bool:
|
|
109
|
+
raise TypeError("aspiration attainment must be an exact bool")
|
|
110
|
+
if self.attains_or_dominates_aspiration != (expected_linf == 0.0):
|
|
111
|
+
raise ValueError("aspiration attainment differs from shortfall")
|
|
112
|
+
|
|
113
|
+
def to_record(self) -> dict[str, object]:
|
|
114
|
+
self.__post_init__()
|
|
115
|
+
return {
|
|
116
|
+
"quantile": self.quantile.value,
|
|
117
|
+
"normalized_shortfalls_hex": [
|
|
118
|
+
{"metric_id": metric_id, "value_hex": value.hex()}
|
|
119
|
+
for metric_id, value in self.normalized_shortfalls
|
|
120
|
+
],
|
|
121
|
+
"normalized_shortfall_l1_hex": self.normalized_shortfall_l1.hex(),
|
|
122
|
+
"normalized_shortfall_linf_hex": self.normalized_shortfall_linf.hex(),
|
|
123
|
+
"shortfall_reduction_l1_hex": self.shortfall_reduction_l1.hex(),
|
|
124
|
+
"attains_or_dominates_aspiration": (
|
|
125
|
+
self.attains_or_dominates_aspiration
|
|
126
|
+
),
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@dataclass(frozen=True, slots=True)
|
|
131
|
+
class ActionTargetRealization:
|
|
132
|
+
"""Complete target-closure audit for one finite action forecast."""
|
|
133
|
+
|
|
134
|
+
option_id: str
|
|
135
|
+
option_identity_sha256: str
|
|
136
|
+
probability_valid: float
|
|
137
|
+
scenarios: tuple[TargetClosureScenario, ...]
|
|
138
|
+
|
|
139
|
+
def __post_init__(self) -> None:
|
|
140
|
+
if type(self.option_id) is not str or not self.option_id:
|
|
141
|
+
raise ValueError("option_id must be non-empty")
|
|
142
|
+
if type(self.option_identity_sha256) is not str or len(
|
|
143
|
+
self.option_identity_sha256
|
|
144
|
+
) != 64:
|
|
145
|
+
raise ValueError("option_identity_sha256 must be a SHA-256 digest")
|
|
146
|
+
_finite(self.probability_valid, name="probability_valid")
|
|
147
|
+
if not 0.0 <= self.probability_valid <= 1.0:
|
|
148
|
+
raise ValueError("probability_valid must lie in [0,1]")
|
|
149
|
+
if type(self.scenarios) is not tuple or any(
|
|
150
|
+
type(value) is not TargetClosureScenario for value in self.scenarios
|
|
151
|
+
):
|
|
152
|
+
raise TypeError("scenarios must contain exact target-closure values")
|
|
153
|
+
for value in self.scenarios:
|
|
154
|
+
value.__post_init__()
|
|
155
|
+
if tuple(value.quantile for value in self.scenarios) != (
|
|
156
|
+
ForecastQuantile.P10,
|
|
157
|
+
ForecastQuantile.P50,
|
|
158
|
+
ForecastQuantile.P90,
|
|
159
|
+
):
|
|
160
|
+
raise ValueError("scenarios must use canonical p10/p50/p90 order")
|
|
161
|
+
|
|
162
|
+
def scenario(self, quantile: ForecastQuantile) -> TargetClosureScenario:
|
|
163
|
+
self.__post_init__()
|
|
164
|
+
return next(value for value in self.scenarios if value.quantile is quantile)
|
|
165
|
+
|
|
166
|
+
def to_record(self) -> dict[str, object]:
|
|
167
|
+
self.__post_init__()
|
|
168
|
+
return {
|
|
169
|
+
"option_id": self.option_id,
|
|
170
|
+
"option_identity_sha256": self.option_identity_sha256,
|
|
171
|
+
"probability_valid_hex": self.probability_valid.hex(),
|
|
172
|
+
"scenarios": [value.to_record() for value in self.scenarios],
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _metric_delta(
|
|
177
|
+
forecast: ResolvedActionMetricForecast,
|
|
178
|
+
quantile: ForecastQuantile,
|
|
179
|
+
) -> float:
|
|
180
|
+
if quantile is ForecastQuantile.P10:
|
|
181
|
+
return forecast.p10_delta
|
|
182
|
+
if quantile is ForecastQuantile.P50:
|
|
183
|
+
return forecast.p50_delta
|
|
184
|
+
return forecast.p90_delta
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _alias_map(
|
|
188
|
+
target: ObjectiveSpaceTarget,
|
|
189
|
+
aliases: tuple[TargetMetricAlias, ...],
|
|
190
|
+
) -> dict[str, str]:
|
|
191
|
+
target.__post_init__()
|
|
192
|
+
if type(aliases) is not tuple or any(
|
|
193
|
+
type(value) is not TargetMetricAlias for value in aliases
|
|
194
|
+
):
|
|
195
|
+
raise TypeError("aliases must contain exact TargetMetricAlias values")
|
|
196
|
+
for value in aliases:
|
|
197
|
+
value.__post_init__()
|
|
198
|
+
if aliases:
|
|
199
|
+
target_ids = tuple(value.target_metric_id for value in aliases)
|
|
200
|
+
forecast_ids = tuple(value.forecast_metric_id for value in aliases)
|
|
201
|
+
if target_ids != tuple(sorted(set(target_ids))):
|
|
202
|
+
raise ValueError("target aliases must be unique and canonical")
|
|
203
|
+
if len(set(forecast_ids)) != len(forecast_ids):
|
|
204
|
+
raise ValueError("forecast aliases must be one-to-one")
|
|
205
|
+
if target_ids != target.metric_ids:
|
|
206
|
+
raise ValueError("aliases must exactly cover the objective target")
|
|
207
|
+
return {value.target_metric_id: value.forecast_metric_id for value in aliases}
|
|
208
|
+
return {metric_id: metric_id for metric_id in target.metric_ids}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _scenario(
|
|
212
|
+
*,
|
|
213
|
+
target: ObjectiveSpaceTarget,
|
|
214
|
+
forecast: ResolvedActionForecast,
|
|
215
|
+
aliases: dict[str, str],
|
|
216
|
+
quantile: ForecastQuantile,
|
|
217
|
+
) -> TargetClosureScenario:
|
|
218
|
+
forecast_by_id = {value.metric_id: value for value in forecast.metric_forecasts}
|
|
219
|
+
required = set(aliases.values())
|
|
220
|
+
if not required.issubset(forecast_by_id):
|
|
221
|
+
raise ValueError("action forecast omits an objective target metric")
|
|
222
|
+
shortfalls: list[tuple[str, float]] = []
|
|
223
|
+
parent_l1 = 0.0
|
|
224
|
+
for axis in target.axes:
|
|
225
|
+
metric_forecast = forecast_by_id[aliases[axis.metric_id]]
|
|
226
|
+
child_value = axis.parent_value + _metric_delta(metric_forecast, quantile)
|
|
227
|
+
child_shortfall = max(
|
|
228
|
+
0.0,
|
|
229
|
+
axis.normalize(child_value) - axis.aspiration_normalized,
|
|
230
|
+
)
|
|
231
|
+
shortfalls.append((axis.metric_id, child_shortfall))
|
|
232
|
+
parent_l1 += axis.parent_shortfall
|
|
233
|
+
canonical = tuple(sorted(shortfalls))
|
|
234
|
+
shortfall_l1 = sum(value for _, value in canonical)
|
|
235
|
+
shortfall_linf = max(value for _, value in canonical)
|
|
236
|
+
return TargetClosureScenario(
|
|
237
|
+
quantile=quantile,
|
|
238
|
+
normalized_shortfalls=canonical,
|
|
239
|
+
normalized_shortfall_l1=shortfall_l1,
|
|
240
|
+
normalized_shortfall_linf=shortfall_linf,
|
|
241
|
+
shortfall_reduction_l1=parent_l1 - shortfall_l1,
|
|
242
|
+
attains_or_dominates_aspiration=shortfall_linf == 0.0,
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def assess_action_target_realization(
|
|
247
|
+
*,
|
|
248
|
+
target: ObjectiveSpaceTarget,
|
|
249
|
+
forecasts: ResolvedActionForecastBatch,
|
|
250
|
+
aliases: tuple[TargetMetricAlias, ...] = (),
|
|
251
|
+
) -> tuple[ActionTargetRealization, ...]:
|
|
252
|
+
"""Audit every forecast against a shared target without evaluator access."""
|
|
253
|
+
|
|
254
|
+
if type(target) is not ObjectiveSpaceTarget:
|
|
255
|
+
raise TypeError("target must be an exact ObjectiveSpaceTarget")
|
|
256
|
+
target.__post_init__()
|
|
257
|
+
if type(forecasts) is not ResolvedActionForecastBatch:
|
|
258
|
+
raise TypeError("forecasts must be an exact ResolvedActionForecastBatch")
|
|
259
|
+
forecasts.__post_init__()
|
|
260
|
+
mapping = _alias_map(target, aliases)
|
|
261
|
+
return tuple(
|
|
262
|
+
ActionTargetRealization(
|
|
263
|
+
option_id=forecast.option_id,
|
|
264
|
+
option_identity_sha256=forecast.option_identity_sha256,
|
|
265
|
+
probability_valid=forecast.probability_valid,
|
|
266
|
+
scenarios=tuple(
|
|
267
|
+
_scenario(
|
|
268
|
+
target=target,
|
|
269
|
+
forecast=forecast,
|
|
270
|
+
aliases=mapping,
|
|
271
|
+
quantile=quantile,
|
|
272
|
+
)
|
|
273
|
+
for quantile in (
|
|
274
|
+
ForecastQuantile.P10,
|
|
275
|
+
ForecastQuantile.P50,
|
|
276
|
+
ForecastQuantile.P90,
|
|
277
|
+
)
|
|
278
|
+
),
|
|
279
|
+
)
|
|
280
|
+
for forecast in forecasts.forecasts
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@dataclass(frozen=True, slots=True)
|
|
285
|
+
class ResidualTargetClosurePortfolioUtility:
|
|
286
|
+
"""Plug-in utility for the existing forecast-based greedy set allocator.
|
|
287
|
+
|
|
288
|
+
The best predicted bridge carries most of the utility. A bounded harmonic
|
|
289
|
+
redundancy term rewards additional independent chances without allowing a
|
|
290
|
+
large collection of mediocre actions to swamp the best bridge.
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
target: ObjectiveSpaceTarget
|
|
294
|
+
aliases: tuple[TargetMetricAlias, ...] = ()
|
|
295
|
+
attainment_bonus: float = 0.25
|
|
296
|
+
redundancy_weight: float = 0.25
|
|
297
|
+
|
|
298
|
+
def __post_init__(self) -> None:
|
|
299
|
+
if type(self.target) is not ObjectiveSpaceTarget:
|
|
300
|
+
raise TypeError("target must be an exact ObjectiveSpaceTarget")
|
|
301
|
+
self.target.__post_init__()
|
|
302
|
+
_alias_map(self.target, self.aliases)
|
|
303
|
+
for name in ("attainment_bonus", "redundancy_weight"):
|
|
304
|
+
value = _finite(getattr(self, name), name=name)
|
|
305
|
+
if value < 0.0:
|
|
306
|
+
raise ValueError(f"{name} must be non-negative")
|
|
307
|
+
|
|
308
|
+
@property
|
|
309
|
+
def binding_definition_sha256(self) -> str:
|
|
310
|
+
"""Bind the reusable policy law to this exact target configuration.
|
|
311
|
+
|
|
312
|
+
``ActionAllocationRequest`` records only the identified utility
|
|
313
|
+
binding. Including the target, aliases, and utility configuration in
|
|
314
|
+
that identity prevents an allocation receipt from being replayed under
|
|
315
|
+
a different frontier aspiration while retaining a stable policy ID.
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
self.__post_init__()
|
|
319
|
+
payload = json.dumps(
|
|
320
|
+
{
|
|
321
|
+
"schema_version": 1,
|
|
322
|
+
"base_policy_definition_sha256": (
|
|
323
|
+
TARGET_CLOSURE_PORTFOLIO_UTILITY_DEFINITION_SHA256
|
|
324
|
+
),
|
|
325
|
+
"target": self.target.to_record(),
|
|
326
|
+
"aliases": [
|
|
327
|
+
{
|
|
328
|
+
"target_metric_id": value.target_metric_id,
|
|
329
|
+
"forecast_metric_id": value.forecast_metric_id,
|
|
330
|
+
}
|
|
331
|
+
for value in self.aliases
|
|
332
|
+
],
|
|
333
|
+
"attainment_bonus_hex": self.attainment_bonus.hex(),
|
|
334
|
+
"redundancy_weight_hex": self.redundancy_weight.hex(),
|
|
335
|
+
},
|
|
336
|
+
allow_nan=False,
|
|
337
|
+
ensure_ascii=True,
|
|
338
|
+
separators=(",", ":"),
|
|
339
|
+
sort_keys=True,
|
|
340
|
+
).encode("ascii")
|
|
341
|
+
return hashlib.sha256(_TARGET_CLOSURE_BINDING_DOMAIN + payload).hexdigest()
|
|
342
|
+
|
|
343
|
+
def binding(self) -> ForecastPortfolioUtilityBinding:
|
|
344
|
+
"""Return the exact identified utility expected by the allocator port."""
|
|
345
|
+
|
|
346
|
+
return ForecastPortfolioUtilityBinding(
|
|
347
|
+
utility=self,
|
|
348
|
+
policy_id=TARGET_CLOSURE_PORTFOLIO_UTILITY_ID,
|
|
349
|
+
policy_version=TARGET_CLOSURE_PORTFOLIO_UTILITY_VERSION,
|
|
350
|
+
definition_sha256=self.binding_definition_sha256,
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
def __call__(self, request: ForecastPortfolioUtilityInput) -> float:
|
|
354
|
+
if type(request) is not ForecastPortfolioUtilityInput:
|
|
355
|
+
raise TypeError("request must be exact ForecastPortfolioUtilityInput")
|
|
356
|
+
request.__post_init__()
|
|
357
|
+
self.__post_init__()
|
|
358
|
+
mapping = _alias_map(self.target, self.aliases)
|
|
359
|
+
parent_by_id = {value.metric_id: value.value for value in request.parent_metric_values}
|
|
360
|
+
for axis in self.target.axes:
|
|
361
|
+
forecast_metric_id = mapping[axis.metric_id]
|
|
362
|
+
if parent_by_id.get(forecast_metric_id) != axis.parent_value:
|
|
363
|
+
raise ValueError("forecast parent values differ from the target")
|
|
364
|
+
values: list[float] = []
|
|
365
|
+
for member in request.members:
|
|
366
|
+
scenario = _scenario(
|
|
367
|
+
target=self.target,
|
|
368
|
+
forecast=member,
|
|
369
|
+
aliases=mapping,
|
|
370
|
+
quantile=request.quantile,
|
|
371
|
+
)
|
|
372
|
+
value = member.probability_valid * (
|
|
373
|
+
scenario.shortfall_reduction_l1
|
|
374
|
+
+ (
|
|
375
|
+
self.attainment_bonus
|
|
376
|
+
if scenario.attains_or_dominates_aspiration
|
|
377
|
+
else 0.0
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
values.append(value)
|
|
381
|
+
ranked = sorted(values, reverse=True)
|
|
382
|
+
total = ranked[0]
|
|
383
|
+
if len(ranked) > 1 and self.redundancy_weight > 0.0:
|
|
384
|
+
total += self.redundancy_weight * sum(
|
|
385
|
+
max(0.0, value) / rank
|
|
386
|
+
for rank, value in enumerate(ranked[1:], start=2)
|
|
387
|
+
)
|
|
388
|
+
if not math.isfinite(total): # pragma: no cover - guarded arithmetic.
|
|
389
|
+
raise ValueError("target-closure utility became non-finite")
|
|
390
|
+
return float(total)
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
__all__ = [
|
|
394
|
+
"ActionTargetRealization",
|
|
395
|
+
"ResidualTargetClosurePortfolioUtility",
|
|
396
|
+
"TARGET_CLOSURE_PORTFOLIO_UTILITY_DEFINITION_SHA256",
|
|
397
|
+
"TARGET_CLOSURE_PORTFOLIO_UTILITY_ID",
|
|
398
|
+
"TARGET_CLOSURE_PORTFOLIO_UTILITY_VERSION",
|
|
399
|
+
"TargetClosureScenario",
|
|
400
|
+
"TargetMetricAlias",
|
|
401
|
+
"assess_action_target_realization",
|
|
402
|
+
]
|