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,648 @@
|
|
|
1
|
+
"""Inverted allocation adapter for portable target-conditioned acquisition.
|
|
2
|
+
|
|
3
|
+
The adapter implements the existing ``select(SlateAllocationRequest)`` shape,
|
|
4
|
+
but obtains branch-local prior state and configuration-transition receipts from
|
|
5
|
+
an injected, authenticated context provider. Workload integrations therefore
|
|
6
|
+
materialize only generic finite configurations and feasibility; provider code,
|
|
7
|
+
objective values, and domain identifiers remain outside the acquisition core.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
import re
|
|
15
|
+
from dataclasses import dataclass, field, replace
|
|
16
|
+
from typing import ClassVar, Protocol, runtime_checkable
|
|
17
|
+
|
|
18
|
+
from agent_evolve.domain.patch import require_sha256
|
|
19
|
+
from agent_evolve.domain.finite_variation import (
|
|
20
|
+
FiniteVariationContract,
|
|
21
|
+
validated_finite_variation_identity_index,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.policies.selection.calibrated_slate import SlateAllocationRequest
|
|
24
|
+
from agent_evolve.policies.selection.structural_posterior_slate import (
|
|
25
|
+
StructuralPosteriorMemberScoreRow,
|
|
26
|
+
score_structural_posterior_slate,
|
|
27
|
+
)
|
|
28
|
+
from agent_evolve.policies.selection.target_conditioned_features import (
|
|
29
|
+
PortableTransitionReceipt,
|
|
30
|
+
TargetConditionedFeatureProjectionRequest,
|
|
31
|
+
TargetConditionedPortableFeatureProjector,
|
|
32
|
+
project_portable_transition,
|
|
33
|
+
)
|
|
34
|
+
from agent_evolve.policies.selection.target_conditioned_prequential import (
|
|
35
|
+
BASE_REALIZABILITY_DEFINITION_SHA256,
|
|
36
|
+
BASE_REALIZABILITY_PROJECTOR_ID,
|
|
37
|
+
BASE_REALIZABILITY_PROJECTOR_VERSION,
|
|
38
|
+
RealizablePortfolioSet,
|
|
39
|
+
TargetConditionedAcquisitionProfile,
|
|
40
|
+
TargetConditionedAcquisitionState,
|
|
41
|
+
TargetConditionedPrequentialSlatePolicy,
|
|
42
|
+
TargetConditionedSlateDecision,
|
|
43
|
+
TargetConditionedSlateRequest,
|
|
44
|
+
enumerate_base_realizable_portfolios,
|
|
45
|
+
)
|
|
46
|
+
from agent_evolve.ports.archive_context import (
|
|
47
|
+
CampaignPortfolioArchiveContextProjection,
|
|
48
|
+
)
|
|
49
|
+
from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
ADAPTER_ID = "target_conditioned_prequential_allocator_adapter"
|
|
53
|
+
ADAPTER_VERSION = 1
|
|
54
|
+
ADAPTER_DEFINITION_SHA256 = hashlib.sha256(
|
|
55
|
+
b"agent-evolve:target-conditioned-prequential-allocator-adapter:v1;"
|
|
56
|
+
b"input=slate-allocation-request,authenticated-prior-context-provider,"
|
|
57
|
+
b"portable-feature-projector,realizable-set-projector;"
|
|
58
|
+
b"structural-score-projection=prior-only-complete-slate;"
|
|
59
|
+
b"transition-receipts=precall-context-subset;"
|
|
60
|
+
b"selection=target-conditioned-prequential-policy;"
|
|
61
|
+
b"workload-model-provider-current-outcome-fields=false"
|
|
62
|
+
).hexdigest()
|
|
63
|
+
BASE_REALIZABLE_PROJECTOR_ID = BASE_REALIZABILITY_PROJECTOR_ID
|
|
64
|
+
BASE_REALIZABLE_PROJECTOR_VERSION = BASE_REALIZABILITY_PROJECTOR_VERSION
|
|
65
|
+
BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256 = (
|
|
66
|
+
BASE_REALIZABILITY_DEFINITION_SHA256
|
|
67
|
+
)
|
|
68
|
+
PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID = "prior_structural_slate_scores"
|
|
69
|
+
PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION = 1
|
|
70
|
+
PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256 = hashlib.sha256(
|
|
71
|
+
b"agent-evolve:prior-structural-slate-scores:v1;"
|
|
72
|
+
b"delegates=score-structural-posterior-slate;"
|
|
73
|
+
b"complete-sealed-slate=true;current-future-outcomes=false"
|
|
74
|
+
).hexdigest()
|
|
75
|
+
REGISTERED_CONTEXT_PROVIDER_ID = "registered_target_conditioned_contexts"
|
|
76
|
+
REGISTERED_CONTEXT_PROVIDER_VERSION = 2
|
|
77
|
+
REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256 = hashlib.sha256(
|
|
78
|
+
b"agent-evolve:registered-target-conditioned-contexts:v2;"
|
|
79
|
+
b"key=scope-wave-parent-finite-contract;registration=append-only-precall;"
|
|
80
|
+
b"contract=sealed-once;lookup=exact-slate-allocation-request;"
|
|
81
|
+
b"transition-projection=lazy-exact-proposed-slate;"
|
|
82
|
+
b"current-future-outcomes=false"
|
|
83
|
+
).hexdigest()
|
|
84
|
+
|
|
85
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
86
|
+
_CONTEXT_DOMAIN = b"agent-evolve:target-conditioned-allocation-context:v1\x00"
|
|
87
|
+
_ADAPTER_CONFIGURATION_DOMAIN = (
|
|
88
|
+
b"agent-evolve:target-conditioned-allocator-configuration:v1\x00"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _canonical_json(value: object) -> bytes:
|
|
93
|
+
return json.dumps(
|
|
94
|
+
value,
|
|
95
|
+
allow_nan=False,
|
|
96
|
+
ensure_ascii=True,
|
|
97
|
+
separators=(",", ":"),
|
|
98
|
+
sort_keys=True,
|
|
99
|
+
).encode("ascii", errors="strict")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
103
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _provider_identity(value: object, *, name: str) -> dict[str, object]:
|
|
107
|
+
provider_id = getattr(value, "provider_id", None)
|
|
108
|
+
provider_version = getattr(value, "provider_version", None)
|
|
109
|
+
definition_sha256 = getattr(value, "definition_sha256", None)
|
|
110
|
+
if type(provider_id) is not str or _TOKEN.fullmatch(provider_id) is None:
|
|
111
|
+
raise ValueError(f"{name}.provider_id must use the closed token grammar")
|
|
112
|
+
if type(provider_version) is not int or provider_version <= 0:
|
|
113
|
+
raise ValueError(f"{name}.provider_version must be positive")
|
|
114
|
+
require_sha256(definition_sha256, f"{name}.definition_sha256")
|
|
115
|
+
return {
|
|
116
|
+
"provider_id": provider_id,
|
|
117
|
+
"provider_version": provider_version,
|
|
118
|
+
"definition_sha256": definition_sha256,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
123
|
+
class TargetConditionedAllocationContext:
|
|
124
|
+
"""Pre-call, branch-local facts available to one eventual K-slate."""
|
|
125
|
+
|
|
126
|
+
finite_contract_sha256: str
|
|
127
|
+
cutoff_receipt_sha256: str
|
|
128
|
+
archive_context: CampaignPortfolioArchiveContextProjection
|
|
129
|
+
frontier_target: CampaignPortfolioFrontierTarget
|
|
130
|
+
state: TargetConditionedAcquisitionState
|
|
131
|
+
transition_receipts: tuple[PortableTransitionReceipt, ...]
|
|
132
|
+
campaign_generation: int
|
|
133
|
+
lane_slot: int
|
|
134
|
+
remaining_proposal_horizon: int
|
|
135
|
+
|
|
136
|
+
def __post_init__(self) -> None:
|
|
137
|
+
require_sha256(self.finite_contract_sha256, "finite_contract_sha256")
|
|
138
|
+
require_sha256(self.cutoff_receipt_sha256, "cutoff_receipt_sha256")
|
|
139
|
+
if type(self.archive_context) is not CampaignPortfolioArchiveContextProjection:
|
|
140
|
+
raise TypeError("archive_context must be exact")
|
|
141
|
+
self.archive_context.__post_init__()
|
|
142
|
+
if type(self.frontier_target) is not CampaignPortfolioFrontierTarget:
|
|
143
|
+
raise TypeError("frontier_target must be exact")
|
|
144
|
+
self.frontier_target.__post_init__()
|
|
145
|
+
if type(self.state) is not TargetConditionedAcquisitionState:
|
|
146
|
+
raise TypeError("state must be exact")
|
|
147
|
+
self.state.__post_init__()
|
|
148
|
+
if type(self.transition_receipts) is not tuple:
|
|
149
|
+
raise TypeError("transition_receipts must be an exact tuple")
|
|
150
|
+
if any(
|
|
151
|
+
type(value) is not PortableTransitionReceipt
|
|
152
|
+
for value in self.transition_receipts
|
|
153
|
+
):
|
|
154
|
+
raise TypeError("transition_receipts must contain exact rows")
|
|
155
|
+
for value in self.transition_receipts:
|
|
156
|
+
value.__post_init__()
|
|
157
|
+
option_ids = tuple(value.option_id for value in self.transition_receipts)
|
|
158
|
+
if option_ids != tuple(sorted(set(option_ids))):
|
|
159
|
+
raise ValueError("transition receipts must use canonical option order")
|
|
160
|
+
parents = {
|
|
161
|
+
value.parent_configuration_sha256 for value in self.transition_receipts
|
|
162
|
+
}
|
|
163
|
+
if parents and parents != {self.frontier_target.parent_configuration_sha256}:
|
|
164
|
+
raise ValueError("transition receipts differ from the targeted parent")
|
|
165
|
+
if (
|
|
166
|
+
self.archive_context.archive_utility_snapshot_sha256
|
|
167
|
+
!= self.frontier_target.archive_utility_snapshot_sha256
|
|
168
|
+
or self.archive_context.parent_configuration_sha256
|
|
169
|
+
!= self.frontier_target.parent_configuration_sha256
|
|
170
|
+
):
|
|
171
|
+
raise ValueError("archive context and frontier target disagree")
|
|
172
|
+
if type(self.campaign_generation) is not int or self.campaign_generation <= 0:
|
|
173
|
+
raise ValueError("campaign_generation must be positive")
|
|
174
|
+
if self.state.cutoff_generation >= self.campaign_generation:
|
|
175
|
+
raise ValueError("state cutoff reaches the current generation")
|
|
176
|
+
if type(self.lane_slot) is not int or self.lane_slot < 0:
|
|
177
|
+
raise ValueError("lane_slot must be non-negative")
|
|
178
|
+
if (
|
|
179
|
+
type(self.remaining_proposal_horizon) is not int
|
|
180
|
+
or self.remaining_proposal_horizon < 0
|
|
181
|
+
):
|
|
182
|
+
raise ValueError("remaining_proposal_horizon must be non-negative")
|
|
183
|
+
|
|
184
|
+
def require_request(self, request: SlateAllocationRequest) -> None:
|
|
185
|
+
self.__post_init__()
|
|
186
|
+
if type(request) is not SlateAllocationRequest:
|
|
187
|
+
raise TypeError("request must be exact SlateAllocationRequest")
|
|
188
|
+
request.revalidate()
|
|
189
|
+
if request.slate.finite_contract_sha256 != self.finite_contract_sha256:
|
|
190
|
+
raise ValueError("allocation request names a foreign finite contract")
|
|
191
|
+
if (
|
|
192
|
+
request.slate.parent_candidate_identity_sha256
|
|
193
|
+
!= self.frontier_target.parent_configuration_sha256
|
|
194
|
+
):
|
|
195
|
+
raise ValueError("allocation request names a foreign parent")
|
|
196
|
+
transitions = {value.option_id: value for value in self.transition_receipts}
|
|
197
|
+
for member in request.slate.members:
|
|
198
|
+
transition = transitions.get(member.option_id)
|
|
199
|
+
if (
|
|
200
|
+
transition is None
|
|
201
|
+
or transition.option_identity_sha256
|
|
202
|
+
!= member.option_identity_sha256
|
|
203
|
+
):
|
|
204
|
+
raise ValueError("pre-call transition context does not cover the slate")
|
|
205
|
+
|
|
206
|
+
def transition_subset(
|
|
207
|
+
self, request: SlateAllocationRequest
|
|
208
|
+
) -> tuple[PortableTransitionReceipt, ...]:
|
|
209
|
+
self.require_request(request)
|
|
210
|
+
option_ids = {value.option_id for value in request.slate.members}
|
|
211
|
+
return tuple(
|
|
212
|
+
value for value in self.transition_receipts if value.option_id in option_ids
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
216
|
+
self.__post_init__()
|
|
217
|
+
return {
|
|
218
|
+
"schema_version": 1,
|
|
219
|
+
"finite_contract_sha256": self.finite_contract_sha256,
|
|
220
|
+
"cutoff_receipt_sha256": self.cutoff_receipt_sha256,
|
|
221
|
+
"archive_context": self.archive_context.to_record(),
|
|
222
|
+
"frontier_target": self.frontier_target.to_record(),
|
|
223
|
+
"state": self.state.to_record(),
|
|
224
|
+
"transition_receipts": [
|
|
225
|
+
value.to_record() for value in self.transition_receipts
|
|
226
|
+
],
|
|
227
|
+
"campaign_generation": self.campaign_generation,
|
|
228
|
+
"lane_slot": self.lane_slot,
|
|
229
|
+
"remaining_proposal_horizon": self.remaining_proposal_horizon,
|
|
230
|
+
"context_frozen_before_model_call": True,
|
|
231
|
+
"current_or_future_outcomes_consulted": False,
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def context_sha256(self) -> str:
|
|
236
|
+
return _hash(_CONTEXT_DOMAIN, self._unsigned_record())
|
|
237
|
+
|
|
238
|
+
def to_record(self) -> dict[str, object]:
|
|
239
|
+
return {**self._unsigned_record(), "context_sha256": self.context_sha256}
|
|
240
|
+
|
|
241
|
+
def __eq__(self, other: object) -> bool:
|
|
242
|
+
return (
|
|
243
|
+
type(other) is TargetConditionedAllocationContext
|
|
244
|
+
and self.context_sha256 == other.context_sha256
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
__hash__ = None
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
251
|
+
class TargetConditionedAllocationContextKey:
|
|
252
|
+
"""Provider-independent identity for one prospectively registered branch."""
|
|
253
|
+
|
|
254
|
+
scope_sha256: str
|
|
255
|
+
wave_index: int
|
|
256
|
+
parent_configuration_sha256: str
|
|
257
|
+
finite_contract_sha256: str
|
|
258
|
+
|
|
259
|
+
def __post_init__(self) -> None:
|
|
260
|
+
for name in (
|
|
261
|
+
"scope_sha256",
|
|
262
|
+
"parent_configuration_sha256",
|
|
263
|
+
"finite_contract_sha256",
|
|
264
|
+
):
|
|
265
|
+
require_sha256(getattr(self, name), name)
|
|
266
|
+
if type(self.wave_index) is not int or self.wave_index <= 0:
|
|
267
|
+
raise ValueError("wave_index must be positive")
|
|
268
|
+
|
|
269
|
+
@classmethod
|
|
270
|
+
def from_request(
|
|
271
|
+
cls, request: SlateAllocationRequest
|
|
272
|
+
) -> TargetConditionedAllocationContextKey:
|
|
273
|
+
if type(request) is not SlateAllocationRequest:
|
|
274
|
+
raise TypeError("request must be exact SlateAllocationRequest")
|
|
275
|
+
request.revalidate()
|
|
276
|
+
return cls(
|
|
277
|
+
scope_sha256=request.slate.scope.scope_sha256,
|
|
278
|
+
wave_index=request.slate.wave_index,
|
|
279
|
+
parent_configuration_sha256=(
|
|
280
|
+
request.slate.parent_candidate_identity_sha256
|
|
281
|
+
),
|
|
282
|
+
finite_contract_sha256=request.slate.finite_contract_sha256,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
286
|
+
self.__post_init__()
|
|
287
|
+
return {
|
|
288
|
+
"schema_version": 1,
|
|
289
|
+
"scope_sha256": self.scope_sha256,
|
|
290
|
+
"wave_index": self.wave_index,
|
|
291
|
+
"parent_configuration_sha256": self.parent_configuration_sha256,
|
|
292
|
+
"finite_contract_sha256": self.finite_contract_sha256,
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def key_sha256(self) -> str:
|
|
297
|
+
return _hash(
|
|
298
|
+
b"agent-evolve:target-conditioned-allocation-context-key:v1\x00",
|
|
299
|
+
self._unsigned_record(),
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
def to_record(self) -> dict[str, object]:
|
|
303
|
+
return {**self._unsigned_record(), "key_sha256": self.key_sha256}
|
|
304
|
+
|
|
305
|
+
def __eq__(self, other: object) -> bool:
|
|
306
|
+
return (
|
|
307
|
+
type(other) is TargetConditionedAllocationContextKey
|
|
308
|
+
and self.key_sha256 == other.key_sha256
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
__hash__ = None
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
@runtime_checkable
|
|
315
|
+
class TargetConditionedAllocationContextProvider(Protocol):
|
|
316
|
+
provider_id: str
|
|
317
|
+
provider_version: int
|
|
318
|
+
definition_sha256: str
|
|
319
|
+
|
|
320
|
+
def context_for(
|
|
321
|
+
self, request: SlateAllocationRequest
|
|
322
|
+
) -> TargetConditionedAllocationContext: ...
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
@runtime_checkable
|
|
326
|
+
class TargetConditionedAllocationContextRegistrar(
|
|
327
|
+
TargetConditionedAllocationContextProvider, Protocol
|
|
328
|
+
):
|
|
329
|
+
def register(
|
|
330
|
+
self,
|
|
331
|
+
key: TargetConditionedAllocationContextKey,
|
|
332
|
+
context: TargetConditionedAllocationContext,
|
|
333
|
+
finite_contract: FiniteVariationContract,
|
|
334
|
+
) -> None: ...
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
@dataclass(slots=True)
|
|
338
|
+
class RegisteredTargetConditionedAllocationContextProvider:
|
|
339
|
+
"""Append-only in-memory bridge from pre-call campaign facts to K8 allocation."""
|
|
340
|
+
|
|
341
|
+
provider_id: str = REGISTERED_CONTEXT_PROVIDER_ID
|
|
342
|
+
provider_version: int = REGISTERED_CONTEXT_PROVIDER_VERSION
|
|
343
|
+
definition_sha256: str = REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256
|
|
344
|
+
_contexts: dict[
|
|
345
|
+
str,
|
|
346
|
+
tuple[
|
|
347
|
+
TargetConditionedAllocationContextKey,
|
|
348
|
+
TargetConditionedAllocationContext,
|
|
349
|
+
FiniteVariationContract,
|
|
350
|
+
],
|
|
351
|
+
] = field(
|
|
352
|
+
init=False,
|
|
353
|
+
default_factory=dict,
|
|
354
|
+
repr=False,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
def __post_init__(self) -> None:
|
|
358
|
+
expected = {
|
|
359
|
+
"provider_id": REGISTERED_CONTEXT_PROVIDER_ID,
|
|
360
|
+
"provider_version": REGISTERED_CONTEXT_PROVIDER_VERSION,
|
|
361
|
+
"definition_sha256": REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256,
|
|
362
|
+
}
|
|
363
|
+
if _provider_identity(self, name="registered context provider") != expected:
|
|
364
|
+
raise ValueError("registered context provider identity drifted")
|
|
365
|
+
|
|
366
|
+
def register(
|
|
367
|
+
self,
|
|
368
|
+
key: TargetConditionedAllocationContextKey,
|
|
369
|
+
context: TargetConditionedAllocationContext,
|
|
370
|
+
finite_contract: FiniteVariationContract,
|
|
371
|
+
) -> None:
|
|
372
|
+
"""Seal one context before its corresponding provider call begins."""
|
|
373
|
+
|
|
374
|
+
self.__post_init__()
|
|
375
|
+
if type(key) is not TargetConditionedAllocationContextKey:
|
|
376
|
+
raise TypeError("key must be exact TargetConditionedAllocationContextKey")
|
|
377
|
+
key.__post_init__()
|
|
378
|
+
if type(context) is not TargetConditionedAllocationContext:
|
|
379
|
+
raise TypeError("context must be exact TargetConditionedAllocationContext")
|
|
380
|
+
context.__post_init__()
|
|
381
|
+
if type(finite_contract) is not FiniteVariationContract:
|
|
382
|
+
raise TypeError("finite_contract must be exact FiniteVariationContract")
|
|
383
|
+
identity_index = validated_finite_variation_identity_index(finite_contract)
|
|
384
|
+
if (
|
|
385
|
+
context.finite_contract_sha256 != key.finite_contract_sha256
|
|
386
|
+
or context.frontier_target.parent_configuration_sha256
|
|
387
|
+
!= key.parent_configuration_sha256
|
|
388
|
+
or identity_index.contract_identity_sha256
|
|
389
|
+
!= key.finite_contract_sha256
|
|
390
|
+
or identity_index.parent_configuration_sha256
|
|
391
|
+
!= key.parent_configuration_sha256
|
|
392
|
+
):
|
|
393
|
+
raise ValueError("registered context differs from its branch key")
|
|
394
|
+
if key.key_sha256 in self._contexts:
|
|
395
|
+
raise ValueError("target-conditioned branch is already registered")
|
|
396
|
+
self._contexts[key.key_sha256] = (key, context, finite_contract)
|
|
397
|
+
|
|
398
|
+
def context_for(
|
|
399
|
+
self, request: SlateAllocationRequest
|
|
400
|
+
) -> TargetConditionedAllocationContext:
|
|
401
|
+
self.__post_init__()
|
|
402
|
+
key = TargetConditionedAllocationContextKey.from_request(request)
|
|
403
|
+
registered = self._contexts.get(key.key_sha256)
|
|
404
|
+
if registered is None:
|
|
405
|
+
raise ValueError("target-conditioned branch is foreign or unregistered")
|
|
406
|
+
registered_key, context, finite_contract = registered
|
|
407
|
+
if registered_key != key:
|
|
408
|
+
raise ValueError("target-conditioned context key digest collision")
|
|
409
|
+
identity_index = validated_finite_variation_identity_index(finite_contract)
|
|
410
|
+
identity_by_option_id = dict(
|
|
411
|
+
zip(
|
|
412
|
+
identity_index.option_ids,
|
|
413
|
+
identity_index.option_identity_sha256s,
|
|
414
|
+
strict=True,
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
option_by_id = {
|
|
418
|
+
option.option_id: option for option in finite_contract.options
|
|
419
|
+
}
|
|
420
|
+
transitions = tuple(
|
|
421
|
+
project_portable_transition(
|
|
422
|
+
option_id=member.option_id,
|
|
423
|
+
option_identity_sha256=member.option_identity_sha256,
|
|
424
|
+
parent_configuration=finite_contract.parent_configuration,
|
|
425
|
+
child_configuration=option_by_id[member.option_id].child_configuration,
|
|
426
|
+
)
|
|
427
|
+
for member in sorted(request.slate.members, key=lambda value: value.option_id)
|
|
428
|
+
if identity_by_option_id.get(member.option_id)
|
|
429
|
+
== member.option_identity_sha256
|
|
430
|
+
)
|
|
431
|
+
if len(transitions) != len(request.slate.members):
|
|
432
|
+
raise ValueError("proposed slate differs from its registered finite contract")
|
|
433
|
+
materialized = replace(context, transition_receipts=transitions)
|
|
434
|
+
materialized.require_request(request)
|
|
435
|
+
return materialized
|
|
436
|
+
|
|
437
|
+
@property
|
|
438
|
+
def registered_context_count(self) -> int:
|
|
439
|
+
return len(self._contexts)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
@runtime_checkable
|
|
443
|
+
class RealizablePortfolioProjector(Protocol):
|
|
444
|
+
provider_id: str
|
|
445
|
+
provider_version: int
|
|
446
|
+
definition_sha256: str
|
|
447
|
+
|
|
448
|
+
def project(self, request: SlateAllocationRequest) -> RealizablePortfolioSet: ...
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
@runtime_checkable
|
|
452
|
+
class StructuralScoreProjector(Protocol):
|
|
453
|
+
provider_id: str
|
|
454
|
+
provider_version: int
|
|
455
|
+
definition_sha256: str
|
|
456
|
+
|
|
457
|
+
def project(
|
|
458
|
+
self, request: SlateAllocationRequest
|
|
459
|
+
) -> tuple[StructuralPosteriorMemberScoreRow, ...]: ...
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
@dataclass(frozen=True, slots=True)
|
|
463
|
+
class PriorStructuralScoreProjector:
|
|
464
|
+
provider_id: str = PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID
|
|
465
|
+
provider_version: int = PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION
|
|
466
|
+
definition_sha256: str = PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256
|
|
467
|
+
|
|
468
|
+
def __post_init__(self) -> None:
|
|
469
|
+
expected = {
|
|
470
|
+
"provider_id": PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID,
|
|
471
|
+
"provider_version": PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION,
|
|
472
|
+
"definition_sha256": PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256,
|
|
473
|
+
}
|
|
474
|
+
if _provider_identity(self, name="structural score projector") != expected:
|
|
475
|
+
raise ValueError("prior structural score projector identity drifted")
|
|
476
|
+
|
|
477
|
+
def project(
|
|
478
|
+
self, request: SlateAllocationRequest
|
|
479
|
+
) -> tuple[StructuralPosteriorMemberScoreRow, ...]:
|
|
480
|
+
self.__post_init__()
|
|
481
|
+
return score_structural_posterior_slate(request)
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
@dataclass(frozen=True, slots=True)
|
|
485
|
+
class BaseRealizablePortfolioProjector:
|
|
486
|
+
provider_id: str = BASE_REALIZABLE_PROJECTOR_ID
|
|
487
|
+
provider_version: int = BASE_REALIZABLE_PROJECTOR_VERSION
|
|
488
|
+
definition_sha256: str = BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256
|
|
489
|
+
|
|
490
|
+
def __post_init__(self) -> None:
|
|
491
|
+
expected = {
|
|
492
|
+
"provider_id": BASE_REALIZABLE_PROJECTOR_ID,
|
|
493
|
+
"provider_version": BASE_REALIZABLE_PROJECTOR_VERSION,
|
|
494
|
+
"definition_sha256": BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256,
|
|
495
|
+
}
|
|
496
|
+
if _provider_identity(self, name="base realizability projector") != expected:
|
|
497
|
+
raise ValueError("base realizability projector identity drifted")
|
|
498
|
+
|
|
499
|
+
def project(self, request: SlateAllocationRequest) -> RealizablePortfolioSet:
|
|
500
|
+
self.__post_init__()
|
|
501
|
+
return enumerate_base_realizable_portfolios(request)
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
@dataclass(frozen=True, slots=True)
|
|
505
|
+
class TargetConditionedSlateAllocatorAdapter:
|
|
506
|
+
"""Compose portable projection and T-RAP behind the existing allocation port."""
|
|
507
|
+
|
|
508
|
+
context_provider: TargetConditionedAllocationContextProvider
|
|
509
|
+
profile: TargetConditionedAcquisitionProfile
|
|
510
|
+
feature_projector: TargetConditionedPortableFeatureProjector = (
|
|
511
|
+
TargetConditionedPortableFeatureProjector()
|
|
512
|
+
)
|
|
513
|
+
structural_score_projector: StructuralScoreProjector = (
|
|
514
|
+
PriorStructuralScoreProjector()
|
|
515
|
+
)
|
|
516
|
+
realizability_projector: RealizablePortfolioProjector = (
|
|
517
|
+
BaseRealizablePortfolioProjector()
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
policy_id: ClassVar[str] = ADAPTER_ID
|
|
521
|
+
policy_version: ClassVar[int] = ADAPTER_VERSION
|
|
522
|
+
definition_sha256: ClassVar[str] = ADAPTER_DEFINITION_SHA256
|
|
523
|
+
|
|
524
|
+
def __post_init__(self) -> None:
|
|
525
|
+
if not isinstance(
|
|
526
|
+
self.context_provider, TargetConditionedAllocationContextProvider
|
|
527
|
+
):
|
|
528
|
+
raise TypeError("context_provider must implement the authenticated port")
|
|
529
|
+
_provider_identity(self.context_provider, name="context_provider")
|
|
530
|
+
if type(self.profile) is not TargetConditionedAcquisitionProfile:
|
|
531
|
+
raise TypeError("profile must be exact")
|
|
532
|
+
self.profile.__post_init__()
|
|
533
|
+
if type(self.feature_projector) is not TargetConditionedPortableFeatureProjector:
|
|
534
|
+
raise TypeError("feature_projector must be exact")
|
|
535
|
+
if not isinstance(self.structural_score_projector, StructuralScoreProjector):
|
|
536
|
+
raise TypeError("structural_score_projector must implement the port")
|
|
537
|
+
_provider_identity(
|
|
538
|
+
self.structural_score_projector, name="structural_score_projector"
|
|
539
|
+
)
|
|
540
|
+
if not isinstance(self.realizability_projector, RealizablePortfolioProjector):
|
|
541
|
+
raise TypeError("realizability_projector must implement the port")
|
|
542
|
+
_provider_identity(
|
|
543
|
+
self.realizability_projector, name="realizability_projector"
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
def select(self, request: SlateAllocationRequest) -> TargetConditionedSlateDecision:
|
|
547
|
+
self.__post_init__()
|
|
548
|
+
if type(request) is not SlateAllocationRequest:
|
|
549
|
+
raise TypeError("request must be exact SlateAllocationRequest")
|
|
550
|
+
request.revalidate()
|
|
551
|
+
context = self.context_provider.context_for(request)
|
|
552
|
+
if type(context) is not TargetConditionedAllocationContext:
|
|
553
|
+
raise TypeError("context provider returned a foreign value")
|
|
554
|
+
context.require_request(request)
|
|
555
|
+
raw_scores = self.structural_score_projector.project(request)
|
|
556
|
+
if type(raw_scores) is not tuple or any(
|
|
557
|
+
type(value) is not StructuralPosteriorMemberScoreRow
|
|
558
|
+
for value in raw_scores
|
|
559
|
+
):
|
|
560
|
+
raise TypeError("structural score projector returned foreign rows")
|
|
561
|
+
scores = tuple(sorted(raw_scores, key=lambda value: value.option_id))
|
|
562
|
+
features = self.feature_projector.project(
|
|
563
|
+
TargetConditionedFeatureProjectionRequest(
|
|
564
|
+
allocation_request=request,
|
|
565
|
+
structural_score_rows=scores,
|
|
566
|
+
transition_receipts=context.transition_subset(request),
|
|
567
|
+
archive_context=context.archive_context,
|
|
568
|
+
frontier_target=context.frontier_target,
|
|
569
|
+
campaign_generation=context.campaign_generation,
|
|
570
|
+
lane_slot=context.lane_slot,
|
|
571
|
+
remaining_proposal_horizon=(context.remaining_proposal_horizon),
|
|
572
|
+
)
|
|
573
|
+
)
|
|
574
|
+
realizable = self.realizability_projector.project(request)
|
|
575
|
+
if type(realizable) is not RealizablePortfolioSet:
|
|
576
|
+
raise TypeError("realizability projector returned a foreign value")
|
|
577
|
+
projected_identity = {
|
|
578
|
+
"provider_id": realizable.projector_id,
|
|
579
|
+
"provider_version": realizable.projector_version,
|
|
580
|
+
"definition_sha256": realizable.projector_definition_sha256,
|
|
581
|
+
}
|
|
582
|
+
if projected_identity != _provider_identity(
|
|
583
|
+
self.realizability_projector, name="realizability_projector"
|
|
584
|
+
):
|
|
585
|
+
raise ValueError("realizability receipt has a foreign projector identity")
|
|
586
|
+
return TargetConditionedPrequentialSlatePolicy(self.profile).select(
|
|
587
|
+
TargetConditionedSlateRequest(
|
|
588
|
+
allocation_request=request,
|
|
589
|
+
frontier_target=context.frontier_target,
|
|
590
|
+
state=context.state,
|
|
591
|
+
member_features=features,
|
|
592
|
+
realizable_portfolios=realizable,
|
|
593
|
+
campaign_generation=context.campaign_generation,
|
|
594
|
+
remaining_proposal_horizon=(context.remaining_proposal_horizon),
|
|
595
|
+
)
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
@property
|
|
599
|
+
def configuration_sha256(self) -> str:
|
|
600
|
+
"""Bind every injected prior-only provider and the frozen T-RAP profile."""
|
|
601
|
+
|
|
602
|
+
return _hash(_ADAPTER_CONFIGURATION_DOMAIN, self.to_record())
|
|
603
|
+
|
|
604
|
+
def to_record(self) -> dict[str, object]:
|
|
605
|
+
self.__post_init__()
|
|
606
|
+
return {
|
|
607
|
+
"policy_id": self.policy_id,
|
|
608
|
+
"policy_version": self.policy_version,
|
|
609
|
+
"definition_sha256": self.definition_sha256,
|
|
610
|
+
"profile": self.profile.to_record(),
|
|
611
|
+
"feature_projector": self.feature_projector.to_record(),
|
|
612
|
+
"structural_score_projector": _provider_identity(
|
|
613
|
+
self.structural_score_projector,
|
|
614
|
+
name="structural_score_projector",
|
|
615
|
+
),
|
|
616
|
+
"context_provider": _provider_identity(
|
|
617
|
+
self.context_provider, name="context_provider"
|
|
618
|
+
),
|
|
619
|
+
"realizability_projector": _provider_identity(
|
|
620
|
+
self.realizability_projector, name="realizability_projector"
|
|
621
|
+
),
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
__all__ = [
|
|
626
|
+
"ADAPTER_DEFINITION_SHA256",
|
|
627
|
+
"ADAPTER_ID",
|
|
628
|
+
"ADAPTER_VERSION",
|
|
629
|
+
"BASE_REALIZABLE_PROJECTOR_DEFINITION_SHA256",
|
|
630
|
+
"BASE_REALIZABLE_PROJECTOR_ID",
|
|
631
|
+
"BASE_REALIZABLE_PROJECTOR_VERSION",
|
|
632
|
+
"BaseRealizablePortfolioProjector",
|
|
633
|
+
"PRIOR_STRUCTURAL_SCORE_PROJECTOR_DEFINITION_SHA256",
|
|
634
|
+
"PRIOR_STRUCTURAL_SCORE_PROJECTOR_ID",
|
|
635
|
+
"PRIOR_STRUCTURAL_SCORE_PROJECTOR_VERSION",
|
|
636
|
+
"PriorStructuralScoreProjector",
|
|
637
|
+
"REGISTERED_CONTEXT_PROVIDER_DEFINITION_SHA256",
|
|
638
|
+
"REGISTERED_CONTEXT_PROVIDER_ID",
|
|
639
|
+
"REGISTERED_CONTEXT_PROVIDER_VERSION",
|
|
640
|
+
"RegisteredTargetConditionedAllocationContextProvider",
|
|
641
|
+
"RealizablePortfolioProjector",
|
|
642
|
+
"StructuralScoreProjector",
|
|
643
|
+
"TargetConditionedAllocationContext",
|
|
644
|
+
"TargetConditionedAllocationContextKey",
|
|
645
|
+
"TargetConditionedAllocationContextProvider",
|
|
646
|
+
"TargetConditionedAllocationContextRegistrar",
|
|
647
|
+
"TargetConditionedSlateAllocatorAdapter",
|
|
648
|
+
]
|