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,184 @@
|
|
|
1
|
+
"""Durable fail-closed phase commits for operational allocator-v3 waves."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from agent_evolve.application.two_stage_action_evolution import (
|
|
6
|
+
TwoStageActionPhase,
|
|
7
|
+
TwoStageActionPhaseCommit,
|
|
8
|
+
TwoStageActionPhaseReceipt,
|
|
9
|
+
)
|
|
10
|
+
from agent_evolve.domain.patch import require_sha256
|
|
11
|
+
from agent_evolve.domain.typed_json import (
|
|
12
|
+
FrozenJsonObject,
|
|
13
|
+
freeze_json,
|
|
14
|
+
thaw_json,
|
|
15
|
+
typed_json_sha256,
|
|
16
|
+
)
|
|
17
|
+
from agent_evolve.ports.action_allocation_frame_commit_v3 import (
|
|
18
|
+
OperationalFrameActionAllocationCommitInput,
|
|
19
|
+
OperationalFrameActionAllocationTreatmentExecution,
|
|
20
|
+
)
|
|
21
|
+
from agent_evolve.ports.treatment_assignment import (
|
|
22
|
+
ProspectiveTreatmentAssignmentReceipt,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
_COMMIT_KIND = "operational_tie_frame_action_allocation_v3"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OperationalFrameActionAllocationCommitRejected(RuntimeError):
|
|
30
|
+
"""No evaluator authority may open from these allocator-v3 executions."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _validated_execution_tuple(
|
|
34
|
+
executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
|
|
35
|
+
*,
|
|
36
|
+
require_all_pass: bool,
|
|
37
|
+
) -> ProspectiveTreatmentAssignmentReceipt:
|
|
38
|
+
if type(executions) is not tuple or not executions or any(
|
|
39
|
+
type(value) is not OperationalFrameActionAllocationTreatmentExecution
|
|
40
|
+
for value in executions
|
|
41
|
+
):
|
|
42
|
+
raise ValueError("executions must be a non-empty exact allocator-v3 tuple")
|
|
43
|
+
for value in executions:
|
|
44
|
+
value.__post_init__()
|
|
45
|
+
assignment = executions[0].treatment_assignment
|
|
46
|
+
if any(
|
|
47
|
+
value.treatment_assignment.receipt_sha256 != assignment.receipt_sha256
|
|
48
|
+
for value in executions
|
|
49
|
+
):
|
|
50
|
+
raise ValueError("v3 executions name different treatment assignments")
|
|
51
|
+
observed_order = tuple(value.treatment_occurrence for value in executions)
|
|
52
|
+
if observed_order != assignment.occurrence_input_order:
|
|
53
|
+
raise ValueError("v3 executions must use treatment occurrence input order")
|
|
54
|
+
configuration = executions[0].request.allocator_configuration_sha256
|
|
55
|
+
if any(
|
|
56
|
+
value.request.allocator_configuration_sha256 != configuration
|
|
57
|
+
for value in executions
|
|
58
|
+
):
|
|
59
|
+
raise ValueError(
|
|
60
|
+
"v3 treatment arms must share resolution, mode, public seed, and "
|
|
61
|
+
"allocation-unit key"
|
|
62
|
+
)
|
|
63
|
+
if require_all_pass and any(not value.result.audit.passes for value in executions):
|
|
64
|
+
raise OperationalFrameActionAllocationCommitRejected(
|
|
65
|
+
"every operational allocation audit must pass before evaluator authority"
|
|
66
|
+
)
|
|
67
|
+
return assignment
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _frozen_payload(value: dict[str, object]) -> FrozenJsonObject:
|
|
71
|
+
result = freeze_json(value)
|
|
72
|
+
if type(result) is not FrozenJsonObject:
|
|
73
|
+
raise AssertionError("allocator-v3 phase payload must freeze as an object")
|
|
74
|
+
return result
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def build_operational_frame_action_allocation_phase_commit(
|
|
78
|
+
*,
|
|
79
|
+
upstream_input_sha256: str,
|
|
80
|
+
terminal_provider_ledger_commitment_sha256: str,
|
|
81
|
+
executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
|
|
82
|
+
) -> TwoStageActionPhaseCommit:
|
|
83
|
+
"""Build an ALLOCATE commit from complete, common-key passing v3 records."""
|
|
84
|
+
|
|
85
|
+
require_sha256(upstream_input_sha256, "upstream_input_sha256")
|
|
86
|
+
require_sha256(
|
|
87
|
+
terminal_provider_ledger_commitment_sha256,
|
|
88
|
+
"terminal_provider_ledger_commitment_sha256",
|
|
89
|
+
)
|
|
90
|
+
assignment = _validated_execution_tuple(executions, require_all_pass=True)
|
|
91
|
+
commit_input = OperationalFrameActionAllocationCommitInput(
|
|
92
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
93
|
+
terminal_provider_ledger_commitment_sha256=(
|
|
94
|
+
terminal_provider_ledger_commitment_sha256
|
|
95
|
+
),
|
|
96
|
+
treatment_assignment=assignment,
|
|
97
|
+
allocation_requests=tuple(value.request for value in executions),
|
|
98
|
+
)
|
|
99
|
+
payload = _frozen_payload(
|
|
100
|
+
{
|
|
101
|
+
"schema_version": 1,
|
|
102
|
+
"phase": TwoStageActionPhase.ALLOCATE.value,
|
|
103
|
+
"commit_kind": _COMMIT_KIND,
|
|
104
|
+
"allocation_input": commit_input.to_record(),
|
|
105
|
+
"terminal_provider_ledger_commitment": (
|
|
106
|
+
commit_input.terminal_provider_ledger_commitment_record
|
|
107
|
+
),
|
|
108
|
+
"treatment_assignment_receipt_sha256": assignment.receipt_sha256,
|
|
109
|
+
"treatment_occurrence_order": [
|
|
110
|
+
value.to_record() for value in assignment.occurrence_input_order
|
|
111
|
+
],
|
|
112
|
+
"treatment_executions": [value.to_record() for value in executions],
|
|
113
|
+
"all_operational_allocation_audits_pass": True,
|
|
114
|
+
"evaluator_authority_eligible": True,
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
return TwoStageActionPhaseCommit(
|
|
118
|
+
receipt=TwoStageActionPhaseReceipt(
|
|
119
|
+
phase=TwoStageActionPhase.ALLOCATE,
|
|
120
|
+
input_sha256=commit_input.input_sha256,
|
|
121
|
+
output_sha256=typed_json_sha256(payload),
|
|
122
|
+
),
|
|
123
|
+
payload=payload,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def validate_operational_frame_action_allocation_phase_commit(
|
|
128
|
+
executions: tuple[OperationalFrameActionAllocationTreatmentExecution, ...],
|
|
129
|
+
phase_commit: TwoStageActionPhaseCommit,
|
|
130
|
+
) -> OperationalFrameActionAllocationCommitInput:
|
|
131
|
+
"""Rebuild and compare the exact v3 commit and every execution record."""
|
|
132
|
+
|
|
133
|
+
assignment = _validated_execution_tuple(executions, require_all_pass=True)
|
|
134
|
+
if type(phase_commit) is not TwoStageActionPhaseCommit:
|
|
135
|
+
raise TypeError("phase_commit must be an exact TwoStageActionPhaseCommit")
|
|
136
|
+
phase_commit.__post_init__()
|
|
137
|
+
if phase_commit.receipt.phase is not TwoStageActionPhase.ALLOCATE:
|
|
138
|
+
raise ValueError("only an ALLOCATE v3 commit can authorize evaluation")
|
|
139
|
+
payload = thaw_json(phase_commit.payload)
|
|
140
|
+
if (
|
|
141
|
+
type(payload) is not dict
|
|
142
|
+
or payload.get("phase") != TwoStageActionPhase.ALLOCATE.value
|
|
143
|
+
or payload.get("commit_kind") != _COMMIT_KIND
|
|
144
|
+
or type(payload.get("allocation_input")) is not dict
|
|
145
|
+
):
|
|
146
|
+
raise ValueError("operational frame-allocation phase payload is malformed")
|
|
147
|
+
raw_input = payload["allocation_input"]
|
|
148
|
+
assert type(raw_input) is dict
|
|
149
|
+
upstream_input_sha256 = raw_input.get("upstream_input_sha256")
|
|
150
|
+
raw_ledger = raw_input.get("terminal_provider_ledger_commitment")
|
|
151
|
+
if type(upstream_input_sha256) is not str or type(raw_ledger) is not dict:
|
|
152
|
+
raise ValueError("operational frame-allocation input is malformed")
|
|
153
|
+
ledger_sha256 = raw_ledger.get("commitment_sha256")
|
|
154
|
+
if type(ledger_sha256) is not str:
|
|
155
|
+
raise ValueError("terminal-provider-ledger commitment is malformed")
|
|
156
|
+
require_sha256(upstream_input_sha256, "upstream_input_sha256")
|
|
157
|
+
require_sha256(ledger_sha256, "terminal_provider_ledger_commitment_sha256")
|
|
158
|
+
expected = build_operational_frame_action_allocation_phase_commit(
|
|
159
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
160
|
+
terminal_provider_ledger_commitment_sha256=ledger_sha256,
|
|
161
|
+
executions=executions,
|
|
162
|
+
)
|
|
163
|
+
if (
|
|
164
|
+
phase_commit.receipt.receipt_sha256
|
|
165
|
+
!= expected.receipt.receipt_sha256
|
|
166
|
+
or phase_commit.payload != expected.payload
|
|
167
|
+
or phase_commit.to_record() != expected.to_record()
|
|
168
|
+
):
|
|
169
|
+
raise ValueError(
|
|
170
|
+
"operational frame-allocation commit differs from exact executions"
|
|
171
|
+
)
|
|
172
|
+
return OperationalFrameActionAllocationCommitInput(
|
|
173
|
+
upstream_input_sha256=upstream_input_sha256,
|
|
174
|
+
terminal_provider_ledger_commitment_sha256=ledger_sha256,
|
|
175
|
+
treatment_assignment=assignment,
|
|
176
|
+
allocation_requests=tuple(value.request for value in executions),
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
__all__ = [
|
|
181
|
+
"OperationalFrameActionAllocationCommitRejected",
|
|
182
|
+
"build_operational_frame_action_allocation_phase_commit",
|
|
183
|
+
"validate_operational_frame_action_allocation_phase_commit",
|
|
184
|
+
]
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"""Operational-tie-aware greedy allocation over authenticated forecast frames."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
|
|
7
|
+
from agent_evolve.ports.action_allocation import (
|
|
8
|
+
AllocatedActionMember,
|
|
9
|
+
ForecastPortfolioUtilityInput,
|
|
10
|
+
ForecastQuantile,
|
|
11
|
+
PortfolioAllocationScore,
|
|
12
|
+
)
|
|
13
|
+
from agent_evolve.ports.action_allocation_frame import (
|
|
14
|
+
FrameActionPortfolioDecision,
|
|
15
|
+
allocation_score_multiset_sha256,
|
|
16
|
+
)
|
|
17
|
+
from agent_evolve.ports.action_allocation_frame_v3 import (
|
|
18
|
+
AllocationV3Candidate,
|
|
19
|
+
AllocationV3SeedSamplingLaw,
|
|
20
|
+
AllocationV3StepAudit,
|
|
21
|
+
GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_DEFINITION_SHA256,
|
|
22
|
+
GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_ID,
|
|
23
|
+
GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_VERSION,
|
|
24
|
+
OperationalFrameActionAllocationAudit,
|
|
25
|
+
OperationalFrameActionAllocationRequest,
|
|
26
|
+
OperationalFrameActionAllocationResult,
|
|
27
|
+
allocation_v3_failure_codes,
|
|
28
|
+
validate_operational_frame_action_allocation_result,
|
|
29
|
+
)
|
|
30
|
+
from agent_evolve.ports.action_forecast import ResolvedActionForecast
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class OperationalTieAllocationRejected(RuntimeError):
|
|
34
|
+
"""A fail-closed v3 request produced an operational tie."""
|
|
35
|
+
|
|
36
|
+
result: OperationalFrameActionAllocationResult
|
|
37
|
+
|
|
38
|
+
def __init__(self, result: OperationalFrameActionAllocationResult) -> None:
|
|
39
|
+
if type(result) is not OperationalFrameActionAllocationResult:
|
|
40
|
+
raise TypeError("result must be an exact operational frame result")
|
|
41
|
+
result.__post_init__()
|
|
42
|
+
if result.audit.passes:
|
|
43
|
+
raise ValueError("a passing operational allocation cannot be rejected")
|
|
44
|
+
self.result = result
|
|
45
|
+
RuntimeError.__init__(
|
|
46
|
+
self,
|
|
47
|
+
"operational allocation tie failed its prospectively bound mode",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class OperationalGreedyForecastFrameAllocator:
|
|
52
|
+
"""Stateless allocator-v3 application service.
|
|
53
|
+
|
|
54
|
+
Every configuration value capable of changing a decision belongs to the
|
|
55
|
+
request and therefore to its receipt. The benchmark utility remains an
|
|
56
|
+
injected port, and both ``diversity_weight=0.0`` and arbitrary finite N/k
|
|
57
|
+
are supported.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
@staticmethod
|
|
61
|
+
def _utility(
|
|
62
|
+
request: OperationalFrameActionAllocationRequest,
|
|
63
|
+
members: tuple[ResolvedActionForecast, ...],
|
|
64
|
+
quantile: ForecastQuantile,
|
|
65
|
+
) -> float:
|
|
66
|
+
base = request.allocation
|
|
67
|
+
canonical_members = tuple(
|
|
68
|
+
sorted(
|
|
69
|
+
members,
|
|
70
|
+
key=lambda value: (value.option_identity_sha256, value.option_id),
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
value = base.utility.utility(
|
|
74
|
+
ForecastPortfolioUtilityInput(
|
|
75
|
+
optimization_semantics=base.frame.request.optimization_semantics,
|
|
76
|
+
parent_metric_values=base.frame.request.parent_metric_values,
|
|
77
|
+
metric_scales=base.frame.request.metric_scales,
|
|
78
|
+
members=canonical_members,
|
|
79
|
+
quantile=quantile,
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
if type(value) is not float or not math.isfinite(value):
|
|
83
|
+
raise TypeError("bound portfolio utility must return a finite float")
|
|
84
|
+
return value
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def _score(
|
|
88
|
+
cls,
|
|
89
|
+
request: OperationalFrameActionAllocationRequest,
|
|
90
|
+
members: tuple[ResolvedActionForecast, ...],
|
|
91
|
+
*,
|
|
92
|
+
attainable_diversity: int,
|
|
93
|
+
) -> PortfolioAllocationScore:
|
|
94
|
+
if type(attainable_diversity) is not int or attainable_diversity <= 0:
|
|
95
|
+
raise ValueError("attainable_diversity must be a positive exact integer")
|
|
96
|
+
p10 = cls._utility(request, members, ForecastQuantile.P10)
|
|
97
|
+
p50 = cls._utility(request, members, ForecastQuantile.P50)
|
|
98
|
+
p90 = cls._utility(request, members, ForecastQuantile.P90)
|
|
99
|
+
downside = min(p10, p90)
|
|
100
|
+
risk_penalty = request.risk_aversion * max(0.0, p50 - downside)
|
|
101
|
+
diversity_reward = request.diversity_weight * (
|
|
102
|
+
len({member.family for member in members}) / attainable_diversity
|
|
103
|
+
)
|
|
104
|
+
primary = p50 - risk_penalty
|
|
105
|
+
total = primary + diversity_reward
|
|
106
|
+
if not all(
|
|
107
|
+
math.isfinite(value)
|
|
108
|
+
for value in (risk_penalty, diversity_reward, primary, total)
|
|
109
|
+
):
|
|
110
|
+
raise ValueError("allocator-v3 score arithmetic became non-finite")
|
|
111
|
+
return PortfolioAllocationScore(
|
|
112
|
+
p10_utility=p10,
|
|
113
|
+
p50_utility=p50,
|
|
114
|
+
p90_utility=p90,
|
|
115
|
+
downside_utility=downside,
|
|
116
|
+
risk_penalty=risk_penalty,
|
|
117
|
+
diversity_reward=diversity_reward,
|
|
118
|
+
total_utility=total,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def assess(
|
|
122
|
+
self,
|
|
123
|
+
request: OperationalFrameActionAllocationRequest,
|
|
124
|
+
) -> OperationalFrameActionAllocationResult:
|
|
125
|
+
"""Return the complete candidate tables, including a failing attempt."""
|
|
126
|
+
|
|
127
|
+
if type(request) is not OperationalFrameActionAllocationRequest:
|
|
128
|
+
raise TypeError("request must be an exact operational frame request")
|
|
129
|
+
request.__post_init__()
|
|
130
|
+
base = request.allocation
|
|
131
|
+
by_id = {value.option_id: value for value in base.frame.forecasts}
|
|
132
|
+
global_index_by_id = {
|
|
133
|
+
forecast.option_id: global_index
|
|
134
|
+
for global_index, forecast in zip(
|
|
135
|
+
base.frame.global_row_indices,
|
|
136
|
+
base.frame.forecasts,
|
|
137
|
+
strict=True,
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
attainable_diversity = min(
|
|
141
|
+
base.portfolio_size,
|
|
142
|
+
len({by_id[value].family for value in base.eligible_option_ids}),
|
|
143
|
+
)
|
|
144
|
+
remaining = sorted(
|
|
145
|
+
(by_id[value] for value in base.eligible_option_ids),
|
|
146
|
+
key=lambda value: (value.option_identity_sha256, value.option_id),
|
|
147
|
+
)
|
|
148
|
+
selected: list[ResolvedActionForecast] = []
|
|
149
|
+
members: list[AllocatedActionMember] = []
|
|
150
|
+
step_audits: list[AllocationV3StepAudit] = []
|
|
151
|
+
previous_total = 0.0
|
|
152
|
+
|
|
153
|
+
for step in range(1, base.portfolio_size + 1):
|
|
154
|
+
evaluated: list[
|
|
155
|
+
tuple[
|
|
156
|
+
ResolvedActionForecast,
|
|
157
|
+
PortfolioAllocationScore,
|
|
158
|
+
float,
|
|
159
|
+
str,
|
|
160
|
+
AllocationV3Candidate,
|
|
161
|
+
]
|
|
162
|
+
] = []
|
|
163
|
+
for candidate in remaining:
|
|
164
|
+
portfolio = tuple((*selected, candidate))
|
|
165
|
+
score = self._score(
|
|
166
|
+
request,
|
|
167
|
+
portfolio,
|
|
168
|
+
attainable_diversity=attainable_diversity,
|
|
169
|
+
)
|
|
170
|
+
marginal = score.total_utility - previous_total
|
|
171
|
+
if not math.isfinite(marginal):
|
|
172
|
+
raise ValueError(
|
|
173
|
+
"allocator-v3 marginal arithmetic became non-finite"
|
|
174
|
+
)
|
|
175
|
+
label = f"row_{global_index_by_id[candidate.option_id]:08d}"
|
|
176
|
+
candidate_record = AllocationV3Candidate(
|
|
177
|
+
candidate_label=label,
|
|
178
|
+
option_identity_sha256=candidate.option_identity_sha256,
|
|
179
|
+
score=score,
|
|
180
|
+
marginal_total_utility=marginal,
|
|
181
|
+
public_rank_sha256=request.tie_selection.public_rank_sha256(
|
|
182
|
+
step=step,
|
|
183
|
+
option_identity_sha256=candidate.option_identity_sha256,
|
|
184
|
+
),
|
|
185
|
+
)
|
|
186
|
+
evaluated.append((candidate, score, marginal, label, candidate_record))
|
|
187
|
+
|
|
188
|
+
candidate_table = tuple(
|
|
189
|
+
sorted(
|
|
190
|
+
(value[4] for value in evaluated),
|
|
191
|
+
key=lambda value: value.candidate_label,
|
|
192
|
+
)
|
|
193
|
+
)
|
|
194
|
+
raw_top = max(value.marginal_total_utility for value in candidate_table)
|
|
195
|
+
ranked_scores = sorted(
|
|
196
|
+
(value.marginal_total_utility for value in candidate_table),
|
|
197
|
+
reverse=True,
|
|
198
|
+
)
|
|
199
|
+
raw_runner_gap = (
|
|
200
|
+
0.0
|
|
201
|
+
if len(ranked_scores) == 1
|
|
202
|
+
else ranked_scores[0] - ranked_scores[1]
|
|
203
|
+
)
|
|
204
|
+
if not math.isfinite(raw_runner_gap):
|
|
205
|
+
raise ValueError("allocator-v3 runner-gap arithmetic became non-finite")
|
|
206
|
+
raw_top_labels = tuple(
|
|
207
|
+
value.candidate_label
|
|
208
|
+
for value in candidate_table
|
|
209
|
+
if value.marginal_total_utility == raw_top
|
|
210
|
+
)
|
|
211
|
+
operational = tuple(
|
|
212
|
+
value
|
|
213
|
+
for value in candidate_table
|
|
214
|
+
if raw_top - value.marginal_total_utility
|
|
215
|
+
<= request.score_resolution.maximum_indistinguishable_score_gap
|
|
216
|
+
)
|
|
217
|
+
winner_record = min(
|
|
218
|
+
operational,
|
|
219
|
+
key=lambda value: (value.public_rank_sha256, value.candidate_label),
|
|
220
|
+
)
|
|
221
|
+
failures = allocation_v3_failure_codes(
|
|
222
|
+
mode=request.tie_selection.mode,
|
|
223
|
+
operational_top_count=len(operational),
|
|
224
|
+
)
|
|
225
|
+
step_audit = AllocationV3StepAudit(
|
|
226
|
+
step=step,
|
|
227
|
+
candidates=candidate_table,
|
|
228
|
+
distinct_finite_score_count=len(
|
|
229
|
+
{value.marginal_total_utility for value in candidate_table}
|
|
230
|
+
),
|
|
231
|
+
raw_top_score=raw_top,
|
|
232
|
+
raw_runner_gap=raw_runner_gap,
|
|
233
|
+
raw_top_candidate_labels=raw_top_labels,
|
|
234
|
+
operational_top_candidate_labels=tuple(
|
|
235
|
+
value.candidate_label for value in operational
|
|
236
|
+
),
|
|
237
|
+
selected_candidate_label=winner_record.candidate_label,
|
|
238
|
+
selected_public_rank_sha256=winner_record.public_rank_sha256,
|
|
239
|
+
random_oracle_prior_weight_numerator=(
|
|
240
|
+
None
|
|
241
|
+
if request.tie_selection.seed_sampling_law
|
|
242
|
+
is AllocationV3SeedSamplingLaw.FIXED_PUBLIC
|
|
243
|
+
else 1
|
|
244
|
+
),
|
|
245
|
+
random_oracle_prior_weight_denominator=(
|
|
246
|
+
None
|
|
247
|
+
if request.tie_selection.seed_sampling_law
|
|
248
|
+
is AllocationV3SeedSamplingLaw.FIXED_PUBLIC
|
|
249
|
+
else len(operational)
|
|
250
|
+
),
|
|
251
|
+
score_multiset_sha256=allocation_score_multiset_sha256(
|
|
252
|
+
tuple(value.marginal_total_utility for value in candidate_table)
|
|
253
|
+
),
|
|
254
|
+
failure_codes=failures,
|
|
255
|
+
passes=not failures,
|
|
256
|
+
)
|
|
257
|
+
step_audits.append(step_audit)
|
|
258
|
+
|
|
259
|
+
winner = next(
|
|
260
|
+
value
|
|
261
|
+
for value in evaluated
|
|
262
|
+
if value[3] == winner_record.candidate_label
|
|
263
|
+
)
|
|
264
|
+
best_forecast, best_score, best_marginal, _label, _record = winner
|
|
265
|
+
selected.append(best_forecast)
|
|
266
|
+
remaining.remove(best_forecast)
|
|
267
|
+
members.append(
|
|
268
|
+
AllocatedActionMember(
|
|
269
|
+
rank=step,
|
|
270
|
+
option_id=best_forecast.option_id,
|
|
271
|
+
option_identity_sha256=best_forecast.option_identity_sha256,
|
|
272
|
+
child_configuration_sha256=(
|
|
273
|
+
best_forecast.child_configuration_sha256
|
|
274
|
+
),
|
|
275
|
+
family=best_forecast.family,
|
|
276
|
+
greedy_step_score=best_score,
|
|
277
|
+
marginal_total_utility=best_marginal,
|
|
278
|
+
)
|
|
279
|
+
)
|
|
280
|
+
previous_total = best_score.total_utility
|
|
281
|
+
|
|
282
|
+
candidate_evaluations = sum(value.candidate_count for value in step_audits)
|
|
283
|
+
decision = FrameActionPortfolioDecision(
|
|
284
|
+
allocation_request_sha256=base.request_sha256,
|
|
285
|
+
frame_receipt_sha256=base.frame.receipt_sha256,
|
|
286
|
+
source_forecast_receipt_sha256=(
|
|
287
|
+
base.frame.source_forecast_receipt_sha256
|
|
288
|
+
),
|
|
289
|
+
eligible_options_sha256=base.eligible_options_sha256,
|
|
290
|
+
members=tuple(members),
|
|
291
|
+
final_score=members[-1].greedy_step_score,
|
|
292
|
+
candidate_evaluations=candidate_evaluations,
|
|
293
|
+
utility_policy_id=base.utility.policy_id,
|
|
294
|
+
utility_policy_version=base.utility.policy_version,
|
|
295
|
+
utility_definition_sha256=base.utility.definition_sha256,
|
|
296
|
+
allocator_policy_id=GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_ID,
|
|
297
|
+
allocator_policy_version=GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_VERSION,
|
|
298
|
+
allocator_definition_sha256=(
|
|
299
|
+
GREEDY_RISK_DIVERSITY_V3_ALLOCATOR_DEFINITION_SHA256
|
|
300
|
+
),
|
|
301
|
+
allocator_configuration_sha256=(
|
|
302
|
+
request.allocator_configuration_sha256
|
|
303
|
+
),
|
|
304
|
+
)
|
|
305
|
+
audit = OperationalFrameActionAllocationAudit(
|
|
306
|
+
operational_request_sha256=request.request_sha256,
|
|
307
|
+
base_allocation_request_sha256=base.request_sha256,
|
|
308
|
+
decision_receipt_sha256=decision.receipt_sha256,
|
|
309
|
+
frame_receipt_sha256=base.frame.receipt_sha256,
|
|
310
|
+
score_resolution=request.score_resolution,
|
|
311
|
+
tie_selection=request.tie_selection,
|
|
312
|
+
steps=tuple(step_audits),
|
|
313
|
+
candidate_score_count=candidate_evaluations,
|
|
314
|
+
passes=all(value.passes for value in step_audits),
|
|
315
|
+
)
|
|
316
|
+
result = OperationalFrameActionAllocationResult(
|
|
317
|
+
decision=decision,
|
|
318
|
+
audit=audit,
|
|
319
|
+
)
|
|
320
|
+
validate_operational_frame_action_allocation_result(request, result)
|
|
321
|
+
return result
|
|
322
|
+
|
|
323
|
+
def allocate(
|
|
324
|
+
self,
|
|
325
|
+
request: OperationalFrameActionAllocationRequest,
|
|
326
|
+
) -> OperationalFrameActionAllocationResult:
|
|
327
|
+
"""Authorize only a result permitted by the prospectively bound mode."""
|
|
328
|
+
|
|
329
|
+
result = self.assess(request)
|
|
330
|
+
if not result.audit.passes:
|
|
331
|
+
raise OperationalTieAllocationRejected(result)
|
|
332
|
+
return result
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
__all__ = [
|
|
336
|
+
"OperationalGreedyForecastFrameAllocator",
|
|
337
|
+
"OperationalTieAllocationRejected",
|
|
338
|
+
]
|