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,497 @@
|
|
|
1
|
+
"""Archive-aligned utility for probabilistic finite-action consequences.
|
|
2
|
+
|
|
3
|
+
Residual frontier targets expose prior-only normalized anchor points. This
|
|
4
|
+
module converts forecasted child outcomes into exact two- or three-dimensional
|
|
5
|
+
fixed-reference hypervolume and integrates independent action-validity
|
|
6
|
+
probabilities exactly for the small evolutionary batches used by AgentEvolve.
|
|
7
|
+
It contains no workload, model, provider, or action-family identifiers.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
import math
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
|
|
17
|
+
from agent_evolve.domain.patch import require_sha256
|
|
18
|
+
from agent_evolve.domain.typed_json import thaw_json
|
|
19
|
+
from agent_evolve.policies.reward.affine_hypervolume_3d import hypervolume_3d
|
|
20
|
+
from agent_evolve.policies.reward.frozen_archive import hypervolume_2d
|
|
21
|
+
from agent_evolve.ports.action_allocation import (
|
|
22
|
+
ForecastPortfolioUtilityBinding,
|
|
23
|
+
ForecastPortfolioUtilityInput,
|
|
24
|
+
ForecastQuantile,
|
|
25
|
+
)
|
|
26
|
+
from agent_evolve.ports.action_forecast import (
|
|
27
|
+
ResolvedActionForecast,
|
|
28
|
+
ResolvedActionMetricForecast,
|
|
29
|
+
)
|
|
30
|
+
from agent_evolve.ports.frontier_target import (
|
|
31
|
+
CampaignPortfolioFrontierTarget,
|
|
32
|
+
ObjectiveSpaceTarget,
|
|
33
|
+
)
|
|
34
|
+
from agent_evolve.application.action_target_realization import TargetMetricAlias
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID = "residual_cell_expected_hypervolume"
|
|
38
|
+
RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION = 1
|
|
39
|
+
RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256 = hashlib.sha256(
|
|
40
|
+
b"agent-evolve:residual-cell-expected-hypervolume:v1;"
|
|
41
|
+
b"frame=prior-only-normalized-lower-is-better-objectives;"
|
|
42
|
+
b"reference=unit-vector;archive=authenticated-residual-cell-anchors;"
|
|
43
|
+
b"candidate=target-parent-plus-forecast-delta;set-value=exact-union-hv-gain;"
|
|
44
|
+
b"validity=exact-independent-bernoulli-expectation;dimensions=two-or-three;"
|
|
45
|
+
b"workload-model-provider-and-family-identifiers=false;outcomes=false"
|
|
46
|
+
).hexdigest()
|
|
47
|
+
_BINDING_DOMAIN = b"agent-evolve:residual-cell-expected-hv-binding:v1\x00"
|
|
48
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID = (
|
|
49
|
+
"reliability_adjusted_residual_cell_expected_hypervolume"
|
|
50
|
+
)
|
|
51
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION = 1
|
|
52
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256 = (
|
|
53
|
+
hashlib.sha256(
|
|
54
|
+
b"agent-evolve:reliability-adjusted-residual-cell-expected-"
|
|
55
|
+
b"hypervolume:v1;source=base-residual-cell-expected-hv-v1;"
|
|
56
|
+
b"joint-forecast-reliability=probability-valid-times-minimum-target-"
|
|
57
|
+
b"metric-epistemic-confidence;unreliable-state=parent-no-gain;"
|
|
58
|
+
b"exact-projected-metric-confidence-one;workload-model-provider-and-"
|
|
59
|
+
b"family-identifiers=false;outcomes=false"
|
|
60
|
+
).hexdigest()
|
|
61
|
+
)
|
|
62
|
+
_RELIABILITY_BINDING_DOMAIN = (
|
|
63
|
+
b"agent-evolve:reliability-adjusted-residual-cell-expected-hv-binding:v1\x00"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _finite(value: object, *, name: str) -> float:
|
|
68
|
+
if type(value) is not float or not math.isfinite(value):
|
|
69
|
+
raise TypeError(f"{name} must be a finite exact float")
|
|
70
|
+
return value
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True, slots=True)
|
|
74
|
+
class NormalizedResidualFrontierCell:
|
|
75
|
+
"""Typed prior-only local archive geometry from a frontier target."""
|
|
76
|
+
|
|
77
|
+
campaign_target_sha256: str
|
|
78
|
+
cell_sha256: str
|
|
79
|
+
geometry_sha256: str
|
|
80
|
+
metric_ids: tuple[str, ...]
|
|
81
|
+
anchor_points: tuple[tuple[float, ...], ...]
|
|
82
|
+
|
|
83
|
+
def __post_init__(self) -> None:
|
|
84
|
+
require_sha256(self.campaign_target_sha256, "campaign_target_sha256")
|
|
85
|
+
require_sha256(self.cell_sha256, "cell_sha256")
|
|
86
|
+
require_sha256(self.geometry_sha256, "geometry_sha256")
|
|
87
|
+
if (
|
|
88
|
+
type(self.metric_ids) is not tuple
|
|
89
|
+
or len(self.metric_ids) not in {2, 3}
|
|
90
|
+
or self.metric_ids != tuple(sorted(set(self.metric_ids)))
|
|
91
|
+
):
|
|
92
|
+
raise ValueError("metric_ids must be two or three canonical metrics")
|
|
93
|
+
if type(self.anchor_points) is not tuple or not self.anchor_points:
|
|
94
|
+
raise ValueError("anchor_points must be a non-empty exact tuple")
|
|
95
|
+
for point in self.anchor_points:
|
|
96
|
+
if type(point) is not tuple or len(point) != len(self.metric_ids):
|
|
97
|
+
raise ValueError("anchor point dimensionality differs from metrics")
|
|
98
|
+
for value in point:
|
|
99
|
+
_finite(value, name="normalized anchor coordinate")
|
|
100
|
+
if self.anchor_points != tuple(sorted(set(self.anchor_points))):
|
|
101
|
+
raise ValueError("anchor_points must be unique and canonical")
|
|
102
|
+
|
|
103
|
+
def to_record(self) -> dict[str, object]:
|
|
104
|
+
self.__post_init__()
|
|
105
|
+
return {
|
|
106
|
+
"schema_version": 1,
|
|
107
|
+
"campaign_target_sha256": self.campaign_target_sha256,
|
|
108
|
+
"cell_sha256": self.cell_sha256,
|
|
109
|
+
"geometry_sha256": self.geometry_sha256,
|
|
110
|
+
"metric_ids": list(self.metric_ids),
|
|
111
|
+
"anchor_points_hex": [
|
|
112
|
+
[value.hex() for value in point] for point in self.anchor_points
|
|
113
|
+
],
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def residual_frontier_cell_from_target(
|
|
118
|
+
*,
|
|
119
|
+
campaign_target: CampaignPortfolioFrontierTarget,
|
|
120
|
+
objective_target: ObjectiveSpaceTarget,
|
|
121
|
+
) -> NormalizedResidualFrontierCell | None:
|
|
122
|
+
"""Read the optional generic residual-cell geometry fail-closed."""
|
|
123
|
+
|
|
124
|
+
if type(campaign_target) is not CampaignPortfolioFrontierTarget:
|
|
125
|
+
raise TypeError("campaign_target must be exact")
|
|
126
|
+
campaign_target.__post_init__()
|
|
127
|
+
if type(objective_target) is not ObjectiveSpaceTarget:
|
|
128
|
+
raise TypeError("objective_target must be exact")
|
|
129
|
+
objective_target.__post_init__()
|
|
130
|
+
if objective_target.campaign_target_sha256 != campaign_target.target_sha256:
|
|
131
|
+
raise ValueError("objective target belongs to a foreign campaign target")
|
|
132
|
+
payload = thaw_json(campaign_target.payload)
|
|
133
|
+
if type(payload) is not dict: # pragma: no cover - frozen root is closed.
|
|
134
|
+
raise AssertionError("campaign target payload is not an object")
|
|
135
|
+
raw = payload.get("residual_frontier_cell")
|
|
136
|
+
if raw is None:
|
|
137
|
+
return None
|
|
138
|
+
if type(raw) is not dict:
|
|
139
|
+
raise ValueError("residual_frontier_cell must be an object")
|
|
140
|
+
required = {
|
|
141
|
+
"cell_sha256",
|
|
142
|
+
"geometry_sha256",
|
|
143
|
+
"normalized_anchor_points_decimal",
|
|
144
|
+
}
|
|
145
|
+
if not required.issubset(raw):
|
|
146
|
+
raise ValueError("residual frontier cell omits archive geometry")
|
|
147
|
+
rows = raw["normalized_anchor_points_decimal"]
|
|
148
|
+
if type(rows) is not list or not rows:
|
|
149
|
+
raise ValueError("residual frontier cell anchors must be non-empty")
|
|
150
|
+
objective_record = payload.get("objective_space_target")
|
|
151
|
+
if type(objective_record) is not dict or type(
|
|
152
|
+
objective_record.get("axes")
|
|
153
|
+
) is not list:
|
|
154
|
+
raise ValueError("residual frontier cell omits its objective axis order")
|
|
155
|
+
raw_axis_ids = tuple(
|
|
156
|
+
row.get("metric_id") if type(row) is dict else None
|
|
157
|
+
for row in objective_record["axes"]
|
|
158
|
+
)
|
|
159
|
+
if (
|
|
160
|
+
any(type(value) is not str for value in raw_axis_ids)
|
|
161
|
+
or len(raw_axis_ids) != len(objective_target.axes)
|
|
162
|
+
or set(raw_axis_ids) != set(objective_target.metric_ids)
|
|
163
|
+
):
|
|
164
|
+
raise ValueError("residual frontier axis order differs from target metrics")
|
|
165
|
+
anchors: list[tuple[float, ...]] = []
|
|
166
|
+
for row in rows:
|
|
167
|
+
if type(row) is not list or len(row) != len(objective_target.axes):
|
|
168
|
+
raise ValueError("residual frontier anchor dimensionality differs")
|
|
169
|
+
values: list[float] = []
|
|
170
|
+
for value in row:
|
|
171
|
+
if type(value) is not str:
|
|
172
|
+
raise TypeError("residual frontier coordinates must be decimal text")
|
|
173
|
+
try:
|
|
174
|
+
decoded = float(value)
|
|
175
|
+
except ValueError as error:
|
|
176
|
+
raise ValueError("residual frontier coordinate is malformed") from error
|
|
177
|
+
if not math.isfinite(decoded):
|
|
178
|
+
raise ValueError("residual frontier coordinate must be finite")
|
|
179
|
+
values.append(decoded)
|
|
180
|
+
by_metric = dict(zip(raw_axis_ids, values, strict=True))
|
|
181
|
+
anchors.append(
|
|
182
|
+
tuple(by_metric[metric_id] for metric_id in objective_target.metric_ids)
|
|
183
|
+
)
|
|
184
|
+
return NormalizedResidualFrontierCell(
|
|
185
|
+
campaign_target_sha256=campaign_target.target_sha256,
|
|
186
|
+
cell_sha256=raw["cell_sha256"],
|
|
187
|
+
geometry_sha256=raw["geometry_sha256"],
|
|
188
|
+
metric_ids=objective_target.metric_ids,
|
|
189
|
+
anchor_points=tuple(sorted(set(anchors))),
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _metric_delta(
|
|
194
|
+
forecast: ResolvedActionMetricForecast,
|
|
195
|
+
quantile: ForecastQuantile,
|
|
196
|
+
) -> float:
|
|
197
|
+
if quantile is ForecastQuantile.P10:
|
|
198
|
+
return forecast.p10_delta
|
|
199
|
+
if quantile is ForecastQuantile.P50:
|
|
200
|
+
return forecast.p50_delta
|
|
201
|
+
return forecast.p90_delta
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _hypervolume(points: tuple[tuple[float, ...], ...]) -> float:
|
|
205
|
+
dimensions = len(points[0])
|
|
206
|
+
if dimensions == 2:
|
|
207
|
+
return hypervolume_2d(points, (1.0, 1.0)) # type: ignore[arg-type]
|
|
208
|
+
if dimensions == 3:
|
|
209
|
+
return hypervolume_3d(points, (1.0, 1.0, 1.0)) # type: ignore[arg-type]
|
|
210
|
+
raise ValueError("residual-cell hypervolume supports two or three objectives")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@dataclass(frozen=True, slots=True)
|
|
214
|
+
class ResidualCellExpectedHypervolumeUtility:
|
|
215
|
+
"""Expected local archive HV gain under forecast quantile and validity."""
|
|
216
|
+
|
|
217
|
+
target: ObjectiveSpaceTarget
|
|
218
|
+
cell: NormalizedResidualFrontierCell
|
|
219
|
+
aliases: tuple[TargetMetricAlias, ...] = ()
|
|
220
|
+
max_exact_validity_members: int = 8
|
|
221
|
+
|
|
222
|
+
def __post_init__(self) -> None:
|
|
223
|
+
if type(self.target) is not ObjectiveSpaceTarget:
|
|
224
|
+
raise TypeError("target must be exact")
|
|
225
|
+
self.target.__post_init__()
|
|
226
|
+
if type(self.cell) is not NormalizedResidualFrontierCell:
|
|
227
|
+
raise TypeError("cell must be exact")
|
|
228
|
+
self.cell.__post_init__()
|
|
229
|
+
if self.cell.campaign_target_sha256 != self.target.campaign_target_sha256:
|
|
230
|
+
raise ValueError("residual cell belongs to a foreign target")
|
|
231
|
+
if self.cell.metric_ids != self.target.metric_ids:
|
|
232
|
+
raise ValueError("residual cell metric frame differs from target")
|
|
233
|
+
if type(self.aliases) is not tuple or any(
|
|
234
|
+
type(value) is not TargetMetricAlias for value in self.aliases
|
|
235
|
+
):
|
|
236
|
+
raise TypeError("aliases must contain exact target metric aliases")
|
|
237
|
+
for value in self.aliases:
|
|
238
|
+
value.__post_init__()
|
|
239
|
+
target_ids = tuple(value.target_metric_id for value in self.aliases)
|
|
240
|
+
forecast_ids = tuple(value.forecast_metric_id for value in self.aliases)
|
|
241
|
+
if self.aliases and (
|
|
242
|
+
target_ids != self.target.metric_ids
|
|
243
|
+
or len(set(forecast_ids)) != len(forecast_ids)
|
|
244
|
+
):
|
|
245
|
+
raise ValueError("aliases must be one-to-one and cover the target")
|
|
246
|
+
if (
|
|
247
|
+
type(self.max_exact_validity_members) is not int
|
|
248
|
+
or self.max_exact_validity_members <= 0
|
|
249
|
+
or self.max_exact_validity_members > 16
|
|
250
|
+
):
|
|
251
|
+
raise ValueError("max_exact_validity_members must lie in [1,16]")
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def binding_definition_sha256(self) -> str:
|
|
255
|
+
self.__post_init__()
|
|
256
|
+
payload = json.dumps(
|
|
257
|
+
{
|
|
258
|
+
"schema_version": 1,
|
|
259
|
+
"base_policy_definition_sha256": (
|
|
260
|
+
RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256
|
|
261
|
+
),
|
|
262
|
+
"target": self.target.to_record(),
|
|
263
|
+
"cell": self.cell.to_record(),
|
|
264
|
+
"aliases": [
|
|
265
|
+
{
|
|
266
|
+
"target_metric_id": value.target_metric_id,
|
|
267
|
+
"forecast_metric_id": value.forecast_metric_id,
|
|
268
|
+
}
|
|
269
|
+
for value in self.aliases
|
|
270
|
+
],
|
|
271
|
+
"max_exact_validity_members": self.max_exact_validity_members,
|
|
272
|
+
},
|
|
273
|
+
allow_nan=False,
|
|
274
|
+
ensure_ascii=True,
|
|
275
|
+
separators=(",", ":"),
|
|
276
|
+
sort_keys=True,
|
|
277
|
+
).encode("ascii")
|
|
278
|
+
return hashlib.sha256(_BINDING_DOMAIN + payload).hexdigest()
|
|
279
|
+
|
|
280
|
+
def binding(self) -> ForecastPortfolioUtilityBinding:
|
|
281
|
+
return ForecastPortfolioUtilityBinding(
|
|
282
|
+
utility=self,
|
|
283
|
+
policy_id=RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID,
|
|
284
|
+
policy_version=RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION,
|
|
285
|
+
definition_sha256=self.binding_definition_sha256,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def _point(
|
|
289
|
+
self,
|
|
290
|
+
member: ResolvedActionForecast,
|
|
291
|
+
quantile: ForecastQuantile,
|
|
292
|
+
) -> tuple[float, ...]:
|
|
293
|
+
forecast_by_id = {
|
|
294
|
+
value.metric_id: value for value in member.metric_forecasts
|
|
295
|
+
}
|
|
296
|
+
alias = (
|
|
297
|
+
{
|
|
298
|
+
value.target_metric_id: value.forecast_metric_id
|
|
299
|
+
for value in self.aliases
|
|
300
|
+
}
|
|
301
|
+
if self.aliases
|
|
302
|
+
else {metric_id: metric_id for metric_id in self.target.metric_ids}
|
|
303
|
+
)
|
|
304
|
+
point: list[float] = []
|
|
305
|
+
for axis in self.target.axes:
|
|
306
|
+
metric = forecast_by_id.get(alias[axis.metric_id])
|
|
307
|
+
if metric is None:
|
|
308
|
+
raise ValueError("action forecast omits a target metric")
|
|
309
|
+
point.append(
|
|
310
|
+
axis.normalize(
|
|
311
|
+
axis.parent_value + _metric_delta(metric, quantile)
|
|
312
|
+
)
|
|
313
|
+
)
|
|
314
|
+
return tuple(point)
|
|
315
|
+
|
|
316
|
+
def __call__(self, request: ForecastPortfolioUtilityInput) -> float:
|
|
317
|
+
if type(request) is not ForecastPortfolioUtilityInput:
|
|
318
|
+
raise TypeError("request must be an exact utility input")
|
|
319
|
+
request.__post_init__()
|
|
320
|
+
self.__post_init__()
|
|
321
|
+
if len(request.members) > self.max_exact_validity_members:
|
|
322
|
+
raise ValueError("portfolio exceeds exact validity integration limit")
|
|
323
|
+
alias = (
|
|
324
|
+
{
|
|
325
|
+
value.target_metric_id: value.forecast_metric_id
|
|
326
|
+
for value in self.aliases
|
|
327
|
+
}
|
|
328
|
+
if self.aliases
|
|
329
|
+
else {metric_id: metric_id for metric_id in self.target.metric_ids}
|
|
330
|
+
)
|
|
331
|
+
parent_by_id = {
|
|
332
|
+
value.metric_id: value.value for value in request.parent_metric_values
|
|
333
|
+
}
|
|
334
|
+
for axis in self.target.axes:
|
|
335
|
+
if parent_by_id.get(alias[axis.metric_id]) != axis.parent_value:
|
|
336
|
+
raise ValueError("forecast parent values differ from target")
|
|
337
|
+
points = tuple(
|
|
338
|
+
self._point(member, request.quantile) for member in request.members
|
|
339
|
+
)
|
|
340
|
+
base = _hypervolume(self.cell.anchor_points)
|
|
341
|
+
expected = 0.0
|
|
342
|
+
count = len(request.members)
|
|
343
|
+
for mask in range(1 << count):
|
|
344
|
+
probability = 1.0
|
|
345
|
+
admitted: list[tuple[float, ...]] = []
|
|
346
|
+
for index, member in enumerate(request.members):
|
|
347
|
+
valid = member.probability_valid
|
|
348
|
+
if mask & (1 << index):
|
|
349
|
+
probability *= valid
|
|
350
|
+
admitted.append(points[index])
|
|
351
|
+
else:
|
|
352
|
+
probability *= 1.0 - valid
|
|
353
|
+
if probability == 0.0:
|
|
354
|
+
continue
|
|
355
|
+
gain = _hypervolume(
|
|
356
|
+
tuple(sorted(set((*self.cell.anchor_points, *admitted))))
|
|
357
|
+
) - base
|
|
358
|
+
expected += probability * max(0.0, gain)
|
|
359
|
+
if not math.isfinite(expected) or expected < 0.0:
|
|
360
|
+
raise RuntimeError("expected residual-cell hypervolume became invalid")
|
|
361
|
+
return float(expected)
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
@dataclass(frozen=True, slots=True)
|
|
365
|
+
class ReliabilityAdjustedResidualCellExpectedHypervolumeUtility(
|
|
366
|
+
ResidualCellExpectedHypervolumeUtility
|
|
367
|
+
):
|
|
368
|
+
"""Conservative exploit value using the weakest target-metric confidence.
|
|
369
|
+
|
|
370
|
+
Model-derived confidence is not treated as calibrated outcome probability.
|
|
371
|
+
It gates how much authority an optimistic consequence forecast receives in
|
|
372
|
+
the exploitation head. A separate exploration head can still value the
|
|
373
|
+
same low-confidence action for information or reachability.
|
|
374
|
+
"""
|
|
375
|
+
|
|
376
|
+
@property
|
|
377
|
+
def binding_definition_sha256(self) -> str:
|
|
378
|
+
self.__post_init__()
|
|
379
|
+
payload = json.dumps(
|
|
380
|
+
{
|
|
381
|
+
"schema_version": 1,
|
|
382
|
+
"base_policy_definition_sha256": (
|
|
383
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256
|
|
384
|
+
),
|
|
385
|
+
"target": self.target.to_record(),
|
|
386
|
+
"cell": self.cell.to_record(),
|
|
387
|
+
"aliases": [
|
|
388
|
+
{
|
|
389
|
+
"target_metric_id": value.target_metric_id,
|
|
390
|
+
"forecast_metric_id": value.forecast_metric_id,
|
|
391
|
+
}
|
|
392
|
+
for value in self.aliases
|
|
393
|
+
],
|
|
394
|
+
"max_exact_validity_members": self.max_exact_validity_members,
|
|
395
|
+
"reliability": (
|
|
396
|
+
"probability_valid_times_minimum_target_metric_confidence"
|
|
397
|
+
),
|
|
398
|
+
},
|
|
399
|
+
allow_nan=False,
|
|
400
|
+
ensure_ascii=True,
|
|
401
|
+
separators=(",", ":"),
|
|
402
|
+
sort_keys=True,
|
|
403
|
+
).encode("ascii")
|
|
404
|
+
return hashlib.sha256(
|
|
405
|
+
_RELIABILITY_BINDING_DOMAIN + payload
|
|
406
|
+
).hexdigest()
|
|
407
|
+
|
|
408
|
+
def binding(self) -> ForecastPortfolioUtilityBinding:
|
|
409
|
+
return ForecastPortfolioUtilityBinding(
|
|
410
|
+
utility=self,
|
|
411
|
+
policy_id=(
|
|
412
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID
|
|
413
|
+
),
|
|
414
|
+
policy_version=(
|
|
415
|
+
RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION
|
|
416
|
+
),
|
|
417
|
+
definition_sha256=self.binding_definition_sha256,
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
def __call__(self, request: ForecastPortfolioUtilityInput) -> float:
|
|
421
|
+
if type(request) is not ForecastPortfolioUtilityInput:
|
|
422
|
+
raise TypeError("request must be an exact utility input")
|
|
423
|
+
request.__post_init__()
|
|
424
|
+
self.__post_init__()
|
|
425
|
+
if len(request.members) > self.max_exact_validity_members:
|
|
426
|
+
raise ValueError("portfolio exceeds exact validity integration limit")
|
|
427
|
+
alias = (
|
|
428
|
+
{
|
|
429
|
+
value.target_metric_id: value.forecast_metric_id
|
|
430
|
+
for value in self.aliases
|
|
431
|
+
}
|
|
432
|
+
if self.aliases
|
|
433
|
+
else {metric_id: metric_id for metric_id in self.target.metric_ids}
|
|
434
|
+
)
|
|
435
|
+
parent_by_id = {
|
|
436
|
+
value.metric_id: value.value for value in request.parent_metric_values
|
|
437
|
+
}
|
|
438
|
+
for axis in self.target.axes:
|
|
439
|
+
if parent_by_id.get(alias[axis.metric_id]) != axis.parent_value:
|
|
440
|
+
raise ValueError("forecast parent values differ from target")
|
|
441
|
+
points = tuple(
|
|
442
|
+
self._point(member, request.quantile) for member in request.members
|
|
443
|
+
)
|
|
444
|
+
target_forecast_ids = tuple(
|
|
445
|
+
alias[metric_id] for metric_id in self.target.metric_ids
|
|
446
|
+
)
|
|
447
|
+
reliabilities: list[float] = []
|
|
448
|
+
for member in request.members:
|
|
449
|
+
metric_by_id = {
|
|
450
|
+
value.metric_id: value for value in member.metric_forecasts
|
|
451
|
+
}
|
|
452
|
+
if not set(target_forecast_ids).issubset(metric_by_id):
|
|
453
|
+
raise ValueError("action forecast omits a target metric")
|
|
454
|
+
weakest_confidence = min(
|
|
455
|
+
metric_by_id[metric_id].confidence
|
|
456
|
+
for metric_id in target_forecast_ids
|
|
457
|
+
)
|
|
458
|
+
reliabilities.append(
|
|
459
|
+
member.probability_valid * weakest_confidence
|
|
460
|
+
)
|
|
461
|
+
base = _hypervolume(self.cell.anchor_points)
|
|
462
|
+
expected = 0.0
|
|
463
|
+
count = len(request.members)
|
|
464
|
+
for mask in range(1 << count):
|
|
465
|
+
probability = 1.0
|
|
466
|
+
admitted: list[tuple[float, ...]] = []
|
|
467
|
+
for index, reliability in enumerate(reliabilities):
|
|
468
|
+
if mask & (1 << index):
|
|
469
|
+
probability *= reliability
|
|
470
|
+
admitted.append(points[index])
|
|
471
|
+
else:
|
|
472
|
+
probability *= 1.0 - reliability
|
|
473
|
+
if probability == 0.0:
|
|
474
|
+
continue
|
|
475
|
+
gain = _hypervolume(
|
|
476
|
+
tuple(sorted(set((*self.cell.anchor_points, *admitted))))
|
|
477
|
+
) - base
|
|
478
|
+
expected += probability * max(0.0, gain)
|
|
479
|
+
if not math.isfinite(expected) or expected < 0.0:
|
|
480
|
+
raise RuntimeError(
|
|
481
|
+
"reliability-adjusted residual-cell hypervolume became invalid"
|
|
482
|
+
)
|
|
483
|
+
return float(expected)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
__all__ = [
|
|
487
|
+
"NormalizedResidualFrontierCell",
|
|
488
|
+
"RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256",
|
|
489
|
+
"RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID",
|
|
490
|
+
"RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION",
|
|
491
|
+
"RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_DEFINITION_SHA256",
|
|
492
|
+
"RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_ID",
|
|
493
|
+
"RELIABILITY_ADJUSTED_RESIDUAL_CELL_EXPECTED_HV_UTILITY_VERSION",
|
|
494
|
+
"ReliabilityAdjustedResidualCellExpectedHypervolumeUtility",
|
|
495
|
+
"ResidualCellExpectedHypervolumeUtility",
|
|
496
|
+
"residual_frontier_cell_from_target",
|
|
497
|
+
]
|