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,552 @@
|
|
|
1
|
+
"""Protected current-prefix forecast opportunity for causal continuations.
|
|
2
|
+
|
|
3
|
+
The challenger composes two existing policies without weakening either
|
|
4
|
+
boundary:
|
|
5
|
+
|
|
6
|
+
* an incumbent outcome-adaptive policy authors a complete fallback decision;
|
|
7
|
+
* a sealed forecast-geometry policy may replace that one action when it
|
|
8
|
+
identifies positive conditional archive opportunity against the real
|
|
9
|
+
evaluated prefix.
|
|
10
|
+
|
|
11
|
+
No eligible candidate outcome is visible to the challenger. If forecast
|
|
12
|
+
geometry is absent, exhausted, or has no positive opportunity, the incumbent
|
|
13
|
+
decision is returned under an authenticated composite receipt.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import hashlib
|
|
19
|
+
import json
|
|
20
|
+
import math
|
|
21
|
+
import re
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
|
|
24
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
25
|
+
from agent_evolve.application.current_prefix_forecast_opportunity import (
|
|
26
|
+
CurrentPrefixForecastOpportunityPolicyPort,
|
|
27
|
+
validate_current_prefix_forecast_opportunity_policy,
|
|
28
|
+
)
|
|
29
|
+
from agent_evolve.application.forecast_geometry_portfolio import (
|
|
30
|
+
MaterializedForecastGeometryBatch,
|
|
31
|
+
MaterializedForecastGeometryProjectionPort,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.application.outcome_adaptive_action_racing import (
|
|
34
|
+
AdaptiveActionDescriptor,
|
|
35
|
+
AdaptiveActionRacingDecision,
|
|
36
|
+
AdaptiveActionWave,
|
|
37
|
+
)
|
|
38
|
+
from agent_evolve.application.prequential_archive_opportunity_calibration import (
|
|
39
|
+
ArchiveOpportunityActionContext,
|
|
40
|
+
)
|
|
41
|
+
from agent_evolve.application.residual_portfolio_evolution import (
|
|
42
|
+
MaterializedActionEvaluation,
|
|
43
|
+
MaterializedActionProposalBatch,
|
|
44
|
+
ResidualPortfolioDecisionRequest,
|
|
45
|
+
)
|
|
46
|
+
from agent_evolve.domain.patch import require_sha256
|
|
47
|
+
from agent_evolve.domain.typed_json import freeze_json
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID = (
|
|
51
|
+
"protected_current_prefix_forecast_opportunity"
|
|
52
|
+
)
|
|
53
|
+
PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION = 2
|
|
54
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
55
|
+
_DEFINITION_DOMAIN = (
|
|
56
|
+
b"agent-evolve:protected-current-prefix-forecast-opportunity:v2\x00"
|
|
57
|
+
)
|
|
58
|
+
_PRIOR_DOMAIN = (
|
|
59
|
+
b"agent-evolve:protected-current-prefix-forecast-prior:v1\x00"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _canonical_json(value: object) -> bytes:
|
|
64
|
+
return json.dumps(
|
|
65
|
+
value,
|
|
66
|
+
allow_nan=False,
|
|
67
|
+
ensure_ascii=True,
|
|
68
|
+
separators=(",", ":"),
|
|
69
|
+
sort_keys=True,
|
|
70
|
+
).encode("ascii", errors="strict")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
74
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _require_token(value: str, *, name: str) -> None:
|
|
78
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
79
|
+
raise ValueError(f"{name} must use the closed token grammar")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _prior_sha256(
|
|
83
|
+
candidates: tuple[EvolutionCandidate, ...],
|
|
84
|
+
) -> str:
|
|
85
|
+
return _hash(
|
|
86
|
+
_PRIOR_DOMAIN,
|
|
87
|
+
[
|
|
88
|
+
{
|
|
89
|
+
"candidate_id": value.candidate_id.value,
|
|
90
|
+
"configuration_sha256": value.occurrence.configuration_hash,
|
|
91
|
+
"generation": value.generation,
|
|
92
|
+
"valid": value.valid,
|
|
93
|
+
"operator_compliant": value.operator_compliant,
|
|
94
|
+
"evidence_compliant": value.evidence_compliant,
|
|
95
|
+
"objectives": [
|
|
96
|
+
{
|
|
97
|
+
"metric_id": metric_id,
|
|
98
|
+
"value_hex": number.hex(),
|
|
99
|
+
}
|
|
100
|
+
for metric_id, number in value.objectives
|
|
101
|
+
],
|
|
102
|
+
}
|
|
103
|
+
for value in candidates
|
|
104
|
+
],
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@dataclass(frozen=True, slots=True)
|
|
109
|
+
class ProtectedCurrentPrefixForecastOpportunityChallenger:
|
|
110
|
+
"""Challenge one incumbent continuation while preserving abstention."""
|
|
111
|
+
|
|
112
|
+
prior_candidates: tuple[EvolutionCandidate, ...]
|
|
113
|
+
opportunity_policy: CurrentPrefixForecastOpportunityPolicyPort = field(
|
|
114
|
+
repr=False,
|
|
115
|
+
compare=False,
|
|
116
|
+
)
|
|
117
|
+
geometry_projection: MaterializedForecastGeometryProjectionPort = field(
|
|
118
|
+
repr=False,
|
|
119
|
+
compare=False,
|
|
120
|
+
)
|
|
121
|
+
fallback_policy_id: str
|
|
122
|
+
fallback_policy_version: int
|
|
123
|
+
fallback_policy_definition_sha256: str
|
|
124
|
+
challenger_id: str = PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID
|
|
125
|
+
challenger_version: int = (
|
|
126
|
+
PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION
|
|
127
|
+
)
|
|
128
|
+
definition_sha256: str = field(init=False)
|
|
129
|
+
|
|
130
|
+
def __post_init__(self) -> None:
|
|
131
|
+
if (
|
|
132
|
+
type(self.prior_candidates) is not tuple
|
|
133
|
+
or not self.prior_candidates
|
|
134
|
+
or any(
|
|
135
|
+
type(value) is not EvolutionCandidate
|
|
136
|
+
for value in self.prior_candidates
|
|
137
|
+
)
|
|
138
|
+
):
|
|
139
|
+
raise TypeError(
|
|
140
|
+
"prior_candidates must contain exact non-empty candidates"
|
|
141
|
+
)
|
|
142
|
+
for value in self.prior_candidates:
|
|
143
|
+
value.__post_init__()
|
|
144
|
+
candidate_ids = tuple(
|
|
145
|
+
value.candidate_id for value in self.prior_candidates
|
|
146
|
+
)
|
|
147
|
+
if len(candidate_ids) != len(set(candidate_ids)):
|
|
148
|
+
raise ValueError("prior candidate IDs must be unique")
|
|
149
|
+
opportunity_identity = (
|
|
150
|
+
validate_current_prefix_forecast_opportunity_policy(
|
|
151
|
+
self.opportunity_policy
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
if not isinstance(
|
|
155
|
+
self.geometry_projection,
|
|
156
|
+
MaterializedForecastGeometryProjectionPort,
|
|
157
|
+
):
|
|
158
|
+
raise TypeError(
|
|
159
|
+
"geometry_projection must implement its application port"
|
|
160
|
+
)
|
|
161
|
+
_require_token(
|
|
162
|
+
self.geometry_projection.projection_id,
|
|
163
|
+
name="geometry projection_id",
|
|
164
|
+
)
|
|
165
|
+
if (
|
|
166
|
+
type(self.geometry_projection.projection_version) is not int
|
|
167
|
+
or self.geometry_projection.projection_version <= 0
|
|
168
|
+
):
|
|
169
|
+
raise ValueError("geometry projection_version must be positive")
|
|
170
|
+
require_sha256(
|
|
171
|
+
self.geometry_projection.definition_sha256,
|
|
172
|
+
"geometry projection definition_sha256",
|
|
173
|
+
)
|
|
174
|
+
_require_token(
|
|
175
|
+
self.fallback_policy_id,
|
|
176
|
+
name="fallback_policy_id",
|
|
177
|
+
)
|
|
178
|
+
if (
|
|
179
|
+
type(self.fallback_policy_version) is not int
|
|
180
|
+
or self.fallback_policy_version <= 0
|
|
181
|
+
):
|
|
182
|
+
raise ValueError("fallback_policy_version must be positive")
|
|
183
|
+
require_sha256(
|
|
184
|
+
self.fallback_policy_definition_sha256,
|
|
185
|
+
"fallback_policy_definition_sha256",
|
|
186
|
+
)
|
|
187
|
+
if (
|
|
188
|
+
self.challenger_id
|
|
189
|
+
!= PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID
|
|
190
|
+
or self.challenger_version
|
|
191
|
+
!= PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION
|
|
192
|
+
):
|
|
193
|
+
raise ValueError("challenger identity is immutable")
|
|
194
|
+
object.__setattr__(
|
|
195
|
+
self,
|
|
196
|
+
"definition_sha256",
|
|
197
|
+
_hash(
|
|
198
|
+
_DEFINITION_DOMAIN,
|
|
199
|
+
{
|
|
200
|
+
"schema_version": 1,
|
|
201
|
+
"challenger_id": self.challenger_id,
|
|
202
|
+
"challenger_version": self.challenger_version,
|
|
203
|
+
"prior_sha256": _prior_sha256(
|
|
204
|
+
self.prior_candidates
|
|
205
|
+
),
|
|
206
|
+
"opportunity_policy": {
|
|
207
|
+
"policy_id": opportunity_identity[0],
|
|
208
|
+
"policy_version": opportunity_identity[1],
|
|
209
|
+
"definition_sha256": opportunity_identity[2],
|
|
210
|
+
},
|
|
211
|
+
"geometry_projection": {
|
|
212
|
+
"projection_id": (
|
|
213
|
+
self.geometry_projection.projection_id
|
|
214
|
+
),
|
|
215
|
+
"projection_version": (
|
|
216
|
+
self.geometry_projection.projection_version
|
|
217
|
+
),
|
|
218
|
+
"definition_sha256": (
|
|
219
|
+
self.geometry_projection.definition_sha256
|
|
220
|
+
),
|
|
221
|
+
},
|
|
222
|
+
"fallback_policy": {
|
|
223
|
+
"policy_id": self.fallback_policy_id,
|
|
224
|
+
"policy_version": self.fallback_policy_version,
|
|
225
|
+
"definition_sha256": (
|
|
226
|
+
self.fallback_policy_definition_sha256
|
|
227
|
+
),
|
|
228
|
+
},
|
|
229
|
+
"selection": (
|
|
230
|
+
"positive_current_prefix_opportunity_else_fallback"
|
|
231
|
+
),
|
|
232
|
+
"forecast_geometry_market_relation": (
|
|
233
|
+
"sealed_authored_geometry_intersected_with_"
|
|
234
|
+
"phenotype_projected_adaptive_market"
|
|
235
|
+
),
|
|
236
|
+
"out_of_adaptive_market_forecasts": "ignored_and_logged",
|
|
237
|
+
"eligible_candidate_outcomes_observed": False,
|
|
238
|
+
"workload_objective_model_provider_prompt_config_"
|
|
239
|
+
"branches": False,
|
|
240
|
+
},
|
|
241
|
+
),
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
async def freeze_geometry(
|
|
245
|
+
self,
|
|
246
|
+
*,
|
|
247
|
+
request: ResidualPortfolioDecisionRequest,
|
|
248
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
249
|
+
) -> MaterializedForecastGeometryBatch:
|
|
250
|
+
"""Freeze one complete forecast market before current outcomes."""
|
|
251
|
+
|
|
252
|
+
self.__post_init__()
|
|
253
|
+
geometry = await self.geometry_projection.project(
|
|
254
|
+
request,
|
|
255
|
+
proposals,
|
|
256
|
+
)
|
|
257
|
+
if type(geometry) is not MaterializedForecastGeometryBatch:
|
|
258
|
+
raise TypeError("geometry projection returned a foreign batch")
|
|
259
|
+
geometry.__post_init__()
|
|
260
|
+
proposal_sha256s = tuple(
|
|
261
|
+
sorted(value.proposal_sha256 for value in proposals)
|
|
262
|
+
)
|
|
263
|
+
if (
|
|
264
|
+
geometry.residual_request_sha256 != request.request_sha256
|
|
265
|
+
or geometry.proposal_sha256s != proposal_sha256s
|
|
266
|
+
):
|
|
267
|
+
raise ValueError("geometry changed the sealed proposal cutoff")
|
|
268
|
+
return geometry
|
|
269
|
+
|
|
270
|
+
def challenge(
|
|
271
|
+
self,
|
|
272
|
+
*,
|
|
273
|
+
fallback: AdaptiveActionRacingDecision,
|
|
274
|
+
geometry: MaterializedForecastGeometryBatch,
|
|
275
|
+
adaptive_actions: tuple[AdaptiveActionDescriptor, ...],
|
|
276
|
+
selected_evaluations: tuple[MaterializedActionEvaluation, ...],
|
|
277
|
+
excluded_action_sha256s: tuple[str, ...] = (),
|
|
278
|
+
) -> AdaptiveActionRacingDecision:
|
|
279
|
+
"""Select a positive forecast opportunity or preserve the fallback."""
|
|
280
|
+
|
|
281
|
+
self.__post_init__()
|
|
282
|
+
if type(fallback) is not AdaptiveActionRacingDecision:
|
|
283
|
+
raise TypeError("fallback must be an exact racing decision")
|
|
284
|
+
fallback.__post_init__()
|
|
285
|
+
if (
|
|
286
|
+
fallback.policy_id != self.fallback_policy_id
|
|
287
|
+
or fallback.policy_version != self.fallback_policy_version
|
|
288
|
+
or fallback.policy_definition_sha256
|
|
289
|
+
!= self.fallback_policy_definition_sha256
|
|
290
|
+
):
|
|
291
|
+
raise ValueError("fallback decision changed policy identity")
|
|
292
|
+
if fallback.wave is AdaptiveActionWave.DIAGNOSTIC:
|
|
293
|
+
raise ValueError("diagnostic decisions cannot be challenged")
|
|
294
|
+
if len(fallback.selected_action_sha256s) != 1:
|
|
295
|
+
raise ValueError("continuation fallback must select one action")
|
|
296
|
+
if type(geometry) is not MaterializedForecastGeometryBatch:
|
|
297
|
+
raise TypeError("geometry must be an exact batch")
|
|
298
|
+
geometry.__post_init__()
|
|
299
|
+
if (
|
|
300
|
+
geometry.residual_request_sha256
|
|
301
|
+
!= fallback.residual_request_sha256
|
|
302
|
+
):
|
|
303
|
+
raise ValueError("geometry and fallback cutoffs differ")
|
|
304
|
+
if (
|
|
305
|
+
type(adaptive_actions) is not tuple
|
|
306
|
+
or not adaptive_actions
|
|
307
|
+
or any(
|
|
308
|
+
type(value) is not AdaptiveActionDescriptor
|
|
309
|
+
for value in adaptive_actions
|
|
310
|
+
)
|
|
311
|
+
):
|
|
312
|
+
raise TypeError("adaptive_actions must contain exact descriptors")
|
|
313
|
+
action_by_sha256: dict[str, AdaptiveActionDescriptor] = {}
|
|
314
|
+
for value in adaptive_actions:
|
|
315
|
+
value.__post_init__()
|
|
316
|
+
if value.action_sha256 in action_by_sha256:
|
|
317
|
+
raise ValueError("adaptive market repeats an action")
|
|
318
|
+
action_by_sha256[value.action_sha256] = value
|
|
319
|
+
if (
|
|
320
|
+
type(excluded_action_sha256s) is not tuple
|
|
321
|
+
or excluded_action_sha256s
|
|
322
|
+
!= tuple(sorted(set(excluded_action_sha256s)))
|
|
323
|
+
):
|
|
324
|
+
raise ValueError(
|
|
325
|
+
"excluded action hashes must be unique and canonical"
|
|
326
|
+
)
|
|
327
|
+
for value in excluded_action_sha256s:
|
|
328
|
+
require_sha256(value, "excluded_action_sha256")
|
|
329
|
+
if (
|
|
330
|
+
not set(excluded_action_sha256s) <= set(action_by_sha256)
|
|
331
|
+
or set(excluded_action_sha256s)
|
|
332
|
+
& (
|
|
333
|
+
set(fallback.prior_selected_action_sha256s)
|
|
334
|
+
| set(fallback.selected_action_sha256s)
|
|
335
|
+
)
|
|
336
|
+
):
|
|
337
|
+
raise ValueError(
|
|
338
|
+
"excluded actions must be open non-fallback market members"
|
|
339
|
+
)
|
|
340
|
+
if (
|
|
341
|
+
type(selected_evaluations) is not tuple
|
|
342
|
+
or not selected_evaluations
|
|
343
|
+
or any(
|
|
344
|
+
type(value) is not MaterializedActionEvaluation
|
|
345
|
+
for value in selected_evaluations
|
|
346
|
+
)
|
|
347
|
+
):
|
|
348
|
+
raise TypeError(
|
|
349
|
+
"selected_evaluations must contain the real non-empty prefix"
|
|
350
|
+
)
|
|
351
|
+
evaluation_by_action: dict[str, MaterializedActionEvaluation] = {}
|
|
352
|
+
for value in selected_evaluations:
|
|
353
|
+
value.__post_init__()
|
|
354
|
+
action_sha256 = value.action.action_sha256
|
|
355
|
+
if action_sha256 in evaluation_by_action:
|
|
356
|
+
raise ValueError("selected evaluations repeat an action")
|
|
357
|
+
evaluation_by_action[action_sha256] = value
|
|
358
|
+
selected_ids = tuple(sorted(evaluation_by_action))
|
|
359
|
+
if selected_ids != fallback.prior_selected_action_sha256s:
|
|
360
|
+
raise ValueError("fallback and real selected prefixes differ")
|
|
361
|
+
expected_outcomes = tuple(
|
|
362
|
+
sorted(
|
|
363
|
+
value.evaluation_sha256
|
|
364
|
+
for value in selected_evaluations
|
|
365
|
+
)
|
|
366
|
+
)
|
|
367
|
+
# A fallback binds projected outcome hashes, while this challenger sees
|
|
368
|
+
# evaluation receipts. The caller validates the projected cutoff; here
|
|
369
|
+
# we only require the same action prefix and non-empty observed hashes.
|
|
370
|
+
if not fallback.observed_outcome_sha256s or not expected_outcomes:
|
|
371
|
+
raise ValueError("continuation challenge requires observed outcomes")
|
|
372
|
+
|
|
373
|
+
geometry_by_action = {
|
|
374
|
+
value.action_sha256: value for value in geometry.members
|
|
375
|
+
}
|
|
376
|
+
intersecting_action_ids = tuple(
|
|
377
|
+
sorted(set(geometry_by_action) & set(action_by_sha256))
|
|
378
|
+
)
|
|
379
|
+
for action_sha256 in intersecting_action_ids:
|
|
380
|
+
member = geometry_by_action[action_sha256]
|
|
381
|
+
if (
|
|
382
|
+
member.phenotype_identity_sha256
|
|
383
|
+
!= action_by_sha256[action_sha256].phenotype_sha256
|
|
384
|
+
):
|
|
385
|
+
raise ValueError(
|
|
386
|
+
"geometry and adaptive phenotype identities differ"
|
|
387
|
+
)
|
|
388
|
+
selected_phenotypes = {
|
|
389
|
+
action_by_sha256[value].phenotype_sha256
|
|
390
|
+
for value in selected_ids
|
|
391
|
+
}
|
|
392
|
+
eligible = tuple(
|
|
393
|
+
sorted(
|
|
394
|
+
action_sha256
|
|
395
|
+
for action_sha256 in intersecting_action_ids
|
|
396
|
+
if (
|
|
397
|
+
action_sha256 not in evaluation_by_action
|
|
398
|
+
and action_sha256
|
|
399
|
+
not in set(excluded_action_sha256s)
|
|
400
|
+
and geometry_by_action[
|
|
401
|
+
action_sha256
|
|
402
|
+
].phenotype_identity_sha256
|
|
403
|
+
not in selected_phenotypes
|
|
404
|
+
)
|
|
405
|
+
)
|
|
406
|
+
)
|
|
407
|
+
consumed_geometry = tuple(
|
|
408
|
+
sorted(set(selected_ids) & set(geometry_by_action))
|
|
409
|
+
)
|
|
410
|
+
current_generations = {
|
|
411
|
+
value.candidate.generation
|
|
412
|
+
for value in selected_evaluations
|
|
413
|
+
}
|
|
414
|
+
if (
|
|
415
|
+
len(current_generations) != 1
|
|
416
|
+
or next(iter(current_generations)) <= 0
|
|
417
|
+
):
|
|
418
|
+
raise ValueError(
|
|
419
|
+
"selected prefix must identify one positive decision index"
|
|
420
|
+
)
|
|
421
|
+
decision_index = next(iter(current_generations))
|
|
422
|
+
ranking = self.opportunity_policy.rank(
|
|
423
|
+
prior_candidates=self.prior_candidates,
|
|
424
|
+
current_prefix_candidates=tuple(
|
|
425
|
+
sorted(
|
|
426
|
+
(
|
|
427
|
+
value.candidate
|
|
428
|
+
for value in selected_evaluations
|
|
429
|
+
),
|
|
430
|
+
key=lambda value: value.candidate_id.value,
|
|
431
|
+
)
|
|
432
|
+
),
|
|
433
|
+
geometry=geometry,
|
|
434
|
+
consumed_action_sha256s=consumed_geometry,
|
|
435
|
+
eligible_action_sha256s=eligible,
|
|
436
|
+
recommendation_count=1,
|
|
437
|
+
action_contexts=tuple(
|
|
438
|
+
ArchiveOpportunityActionContext(
|
|
439
|
+
action_sha256=action_sha256,
|
|
440
|
+
decision_index=decision_index,
|
|
441
|
+
lane_id=action_by_sha256[action_sha256].lane_id,
|
|
442
|
+
operator_id=(
|
|
443
|
+
action_by_sha256[action_sha256].operator_id
|
|
444
|
+
),
|
|
445
|
+
native_rank=(
|
|
446
|
+
action_by_sha256[action_sha256].native_rank
|
|
447
|
+
),
|
|
448
|
+
lane_size=(
|
|
449
|
+
action_by_sha256[action_sha256].lane_size
|
|
450
|
+
),
|
|
451
|
+
prior_score=(
|
|
452
|
+
action_by_sha256[action_sha256].prior_score
|
|
453
|
+
),
|
|
454
|
+
parent_generated_in_current_run=(
|
|
455
|
+
action_by_sha256[
|
|
456
|
+
action_sha256
|
|
457
|
+
].parent_generated_in_current_run
|
|
458
|
+
),
|
|
459
|
+
)
|
|
460
|
+
for action_sha256 in eligible
|
|
461
|
+
),
|
|
462
|
+
)
|
|
463
|
+
if ranking.recommended_action_sha256s:
|
|
464
|
+
selected_action_sha256s = (
|
|
465
|
+
ranking.recommended_action_sha256s
|
|
466
|
+
)
|
|
467
|
+
selection_source = (
|
|
468
|
+
"current_prefix_forecast_opportunity"
|
|
469
|
+
)
|
|
470
|
+
propensity = 1.0
|
|
471
|
+
else:
|
|
472
|
+
selected_action_sha256s = (
|
|
473
|
+
fallback.selected_action_sha256s
|
|
474
|
+
)
|
|
475
|
+
selection_source = "protected_fallback"
|
|
476
|
+
propensity = fallback.selection_propensity
|
|
477
|
+
if not set(selected_action_sha256s) <= (
|
|
478
|
+
set(action_by_sha256) - set(selected_ids)
|
|
479
|
+
):
|
|
480
|
+
raise ValueError("challenger selected outside the open market")
|
|
481
|
+
if (
|
|
482
|
+
type(propensity) is not float
|
|
483
|
+
or not math.isfinite(propensity)
|
|
484
|
+
or not 0.0 < propensity <= 1.0
|
|
485
|
+
):
|
|
486
|
+
raise ValueError("composite selection propensity is invalid")
|
|
487
|
+
return AdaptiveActionRacingDecision(
|
|
488
|
+
policy_id=self.challenger_id,
|
|
489
|
+
policy_version=self.challenger_version,
|
|
490
|
+
policy_definition_sha256=self.definition_sha256,
|
|
491
|
+
residual_request_sha256=(
|
|
492
|
+
fallback.residual_request_sha256
|
|
493
|
+
),
|
|
494
|
+
wave=fallback.wave,
|
|
495
|
+
selected_action_sha256s=selected_action_sha256s,
|
|
496
|
+
prior_selected_action_sha256s=(
|
|
497
|
+
fallback.prior_selected_action_sha256s
|
|
498
|
+
),
|
|
499
|
+
observed_outcome_sha256s=(
|
|
500
|
+
fallback.observed_outcome_sha256s
|
|
501
|
+
),
|
|
502
|
+
observed_set_outcome_sha256s=(
|
|
503
|
+
fallback.observed_set_outcome_sha256s
|
|
504
|
+
),
|
|
505
|
+
selection_propensity=float(propensity),
|
|
506
|
+
evidence=freeze_json(
|
|
507
|
+
{
|
|
508
|
+
"selection_source": selection_source,
|
|
509
|
+
"fallback_decision": fallback.to_record(
|
|
510
|
+
include_evidence=True
|
|
511
|
+
),
|
|
512
|
+
"opportunity_ranking": ranking.to_record(
|
|
513
|
+
include_scores=True
|
|
514
|
+
),
|
|
515
|
+
"geometry_batch_sha256": geometry.batch_sha256,
|
|
516
|
+
"geometry_member_count": len(geometry_by_action),
|
|
517
|
+
"adaptive_market_action_count": len(
|
|
518
|
+
action_by_sha256
|
|
519
|
+
),
|
|
520
|
+
"intersecting_forecast_action_sha256s": list(
|
|
521
|
+
intersecting_action_ids
|
|
522
|
+
),
|
|
523
|
+
"ignored_out_of_market_forecast_action_sha256s": list(
|
|
524
|
+
sorted(
|
|
525
|
+
set(geometry_by_action)
|
|
526
|
+
- set(action_by_sha256)
|
|
527
|
+
)
|
|
528
|
+
),
|
|
529
|
+
"selected_real_prefix_action_sha256s": list(
|
|
530
|
+
selected_ids
|
|
531
|
+
),
|
|
532
|
+
"selected_evaluation_sha256s": list(
|
|
533
|
+
expected_outcomes
|
|
534
|
+
),
|
|
535
|
+
"excluded_action_sha256s": list(
|
|
536
|
+
excluded_action_sha256s
|
|
537
|
+
),
|
|
538
|
+
"excluded_action_outcomes_used_for_selection": False,
|
|
539
|
+
"eligible_candidate_outcomes_observed": False,
|
|
540
|
+
"fallback_preserved_on_abstention": True,
|
|
541
|
+
"workload_objective_model_provider_prompt_config_"
|
|
542
|
+
"branches": False,
|
|
543
|
+
}
|
|
544
|
+
),
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
__all__ = [
|
|
549
|
+
"PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_ID",
|
|
550
|
+
"PROTECTED_CURRENT_PREFIX_FORECAST_OPPORTUNITY_VERSION",
|
|
551
|
+
"ProtectedCurrentPrefixForecastOpportunityChallenger",
|
|
552
|
+
]
|