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,802 @@
|
|
|
1
|
+
"""Protected numerical-acquisition expert for the campaign variation envelope.
|
|
2
|
+
|
|
3
|
+
The service is workload-neutral. A finite acquisition-space adapter owns legal
|
|
4
|
+
configuration enumeration and normalized feature encoding; a numerical policy
|
|
5
|
+
owns ask selection; a phenotype policy owns evaluator-equivalence identity.
|
|
6
|
+
The service joins those ports to strictly prior real outcomes and adds the
|
|
7
|
+
selected full configurations to the ordinary finite-option universe.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
import math
|
|
15
|
+
import re
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
|
|
18
|
+
from agent_evolve.application.campaign_variation_envelope import (
|
|
19
|
+
CampaignVariationEnvelopeLaneResult,
|
|
20
|
+
CampaignVariationEnvelopeRequest,
|
|
21
|
+
CampaignVariationEnvelopeResult,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.application.evolution_campaign import ParentVariationBinding
|
|
24
|
+
from agent_evolve.application.finite_variation_eligibility import (
|
|
25
|
+
OptionPhenotypeBinding,
|
|
26
|
+
eligible_finite_variation_view,
|
|
27
|
+
)
|
|
28
|
+
from agent_evolve.domain.finite_variation import (
|
|
29
|
+
MAX_FINITE_VARIATION_OPTIONS,
|
|
30
|
+
FiniteVariationContract,
|
|
31
|
+
FiniteVariationOption,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.domain.typed_json import (
|
|
34
|
+
FrozenJsonObject,
|
|
35
|
+
freeze_json,
|
|
36
|
+
thaw_json,
|
|
37
|
+
typed_json_sha256,
|
|
38
|
+
)
|
|
39
|
+
from agent_evolve.policies.selection.phenotype_recourse import (
|
|
40
|
+
PhenotypeIdentity,
|
|
41
|
+
PhenotypeIdentityPolicy,
|
|
42
|
+
)
|
|
43
|
+
from agent_evolve.policies.selection.acquisition_certified_slate import (
|
|
44
|
+
AcquisitionCertifiedSlateContext,
|
|
45
|
+
AcquisitionCertifiedSlateContextSink,
|
|
46
|
+
)
|
|
47
|
+
from agent_evolve.ports.finite_acquisition import (
|
|
48
|
+
FiniteAcquisitionCandidate,
|
|
49
|
+
FiniteAcquisitionObjective,
|
|
50
|
+
FiniteAcquisitionObservation,
|
|
51
|
+
FiniteAcquisitionPolicy,
|
|
52
|
+
FiniteAcquisitionRequest,
|
|
53
|
+
)
|
|
54
|
+
from agent_evolve.ports.finite_acquisition_space import (
|
|
55
|
+
FiniteAcquisitionSpace,
|
|
56
|
+
FiniteAcquisitionSpaceRequest,
|
|
57
|
+
validate_finite_acquisition_space_candidates,
|
|
58
|
+
validate_finite_acquisition_space_identity,
|
|
59
|
+
)
|
|
60
|
+
from agent_evolve.ports.hard_feasibility import (
|
|
61
|
+
HardFeasibilityPort,
|
|
62
|
+
HardFeasibilityRequest,
|
|
63
|
+
HardFeasibilityVerdict,
|
|
64
|
+
assess_hard_feasibility,
|
|
65
|
+
hard_feasibility_decision_batch_sha256,
|
|
66
|
+
validate_hard_feasibility_port,
|
|
67
|
+
)
|
|
68
|
+
from agent_evolve.ports.variation_source import (
|
|
69
|
+
VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY,
|
|
70
|
+
VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
|
|
71
|
+
VARIATION_OPERATOR_METADATA_KEY,
|
|
72
|
+
VARIATION_SOURCE_METADATA_KEY,
|
|
73
|
+
VARIATION_SOURCE_MINIMUM_METADATA_KEY,
|
|
74
|
+
VARIATION_SOURCE_RANK_METADATA_KEY,
|
|
75
|
+
finite_variation_source_id,
|
|
76
|
+
finite_variation_source_ids,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
POLICY_ID = "protected_finite_acquisition_envelope"
|
|
81
|
+
POLICY_VERSION = 5
|
|
82
|
+
PROTECTED_ACQUISITION_SOURCE_ID = "numerical_acquisition"
|
|
83
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,127}$")
|
|
84
|
+
_DEFINITION_DOMAIN = b"agent-evolve:protected-finite-acquisition-envelope:def:v5\x00"
|
|
85
|
+
_CATALOG_DOMAIN = b"agent-evolve:protected-finite-acquisition-envelope:catalog:v5\x00"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _canonical_json(value: object) -> bytes:
|
|
89
|
+
return json.dumps(
|
|
90
|
+
value,
|
|
91
|
+
allow_nan=False,
|
|
92
|
+
ensure_ascii=True,
|
|
93
|
+
separators=(",", ":"),
|
|
94
|
+
sort_keys=True,
|
|
95
|
+
).encode("ascii", errors="strict")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _policy_identity(policy: FiniteAcquisitionPolicy) -> tuple[str, int, str]:
|
|
99
|
+
if not isinstance(policy, FiniteAcquisitionPolicy):
|
|
100
|
+
raise TypeError("acquisition must implement FiniteAcquisitionPolicy")
|
|
101
|
+
values = (
|
|
102
|
+
getattr(policy, "policy_id", None),
|
|
103
|
+
getattr(policy, "policy_version", None),
|
|
104
|
+
getattr(policy, "definition_sha256", None),
|
|
105
|
+
)
|
|
106
|
+
if type(values[0]) is not str or _TOKEN.fullmatch(values[0]) is None:
|
|
107
|
+
raise ValueError("acquisition policy_id has invalid syntax")
|
|
108
|
+
if type(values[1]) is not int or values[1] <= 0:
|
|
109
|
+
raise ValueError("acquisition policy_version must be positive")
|
|
110
|
+
if (
|
|
111
|
+
type(values[2]) is not str
|
|
112
|
+
or len(values[2]) != 64
|
|
113
|
+
or any(value not in "0123456789abcdef" for value in values[2])
|
|
114
|
+
):
|
|
115
|
+
raise ValueError("acquisition definition must be a lowercase SHA-256")
|
|
116
|
+
return values # type: ignore[return-value]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _phenotype(
|
|
120
|
+
policy: PhenotypeIdentityPolicy,
|
|
121
|
+
configuration: FrozenJsonObject,
|
|
122
|
+
) -> str:
|
|
123
|
+
identity = policy.identify(thaw_json(configuration))
|
|
124
|
+
if type(identity) is not PhenotypeIdentity:
|
|
125
|
+
raise TypeError("phenotype policy must return exact PhenotypeIdentity")
|
|
126
|
+
PhenotypeIdentity.__post_init__(identity)
|
|
127
|
+
if (
|
|
128
|
+
identity.policy_id != policy.policy_id
|
|
129
|
+
or identity.policy_version != policy.policy_version
|
|
130
|
+
):
|
|
131
|
+
raise ValueError("phenotype policy returned a foreign identity")
|
|
132
|
+
return identity.value_sha256
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@dataclass(frozen=True, slots=True)
|
|
136
|
+
class ProtectedFiniteAcquisitionVariationEnvelope:
|
|
137
|
+
"""Add one globally selected, evaluator-protected acquisition batch."""
|
|
138
|
+
|
|
139
|
+
objectives: tuple[FiniteAcquisitionObjective, ...]
|
|
140
|
+
space: FiniteAcquisitionSpace
|
|
141
|
+
acquisition: FiniteAcquisitionPolicy
|
|
142
|
+
phenotype_identity: PhenotypeIdentityPolicy
|
|
143
|
+
hard_feasibility: HardFeasibilityPort | None = None
|
|
144
|
+
acquisition_certification_context_sink: (
|
|
145
|
+
AcquisitionCertifiedSlateContextSink | None
|
|
146
|
+
) = None
|
|
147
|
+
pool_size: int = 8192
|
|
148
|
+
protected_batch_size: int = 4
|
|
149
|
+
source_minimum_per_lane: int = 1
|
|
150
|
+
maximum_phenotype_recourse_rounds: int = 3
|
|
151
|
+
seed: int = 0
|
|
152
|
+
source_id: str = PROTECTED_ACQUISITION_SOURCE_ID
|
|
153
|
+
option_family: str = "acquisition"
|
|
154
|
+
operator_id: str = "global"
|
|
155
|
+
policy_id: str = field(init=False, default=POLICY_ID)
|
|
156
|
+
policy_version: int = field(init=False, default=POLICY_VERSION)
|
|
157
|
+
definition_sha256: str = field(init=False, default="")
|
|
158
|
+
_catalog_definition_sha256: str = field(init=False, repr=False, default="")
|
|
159
|
+
|
|
160
|
+
def __post_init__(self) -> None:
|
|
161
|
+
if type(self.objectives) is not tuple or len(self.objectives) < 2:
|
|
162
|
+
raise ValueError("objectives must contain at least two exact axes")
|
|
163
|
+
for value in self.objectives:
|
|
164
|
+
if type(value) is not FiniteAcquisitionObjective:
|
|
165
|
+
raise TypeError("objectives must contain exact acquisition axes")
|
|
166
|
+
FiniteAcquisitionObjective.__post_init__(value)
|
|
167
|
+
metric_ids = tuple(value.metric_id for value in self.objectives)
|
|
168
|
+
if metric_ids != tuple(sorted(set(metric_ids))):
|
|
169
|
+
raise ValueError("objectives must be unique and metric-sorted")
|
|
170
|
+
space_identity = validate_finite_acquisition_space_identity(self.space)
|
|
171
|
+
acquisition_identity = _policy_identity(self.acquisition)
|
|
172
|
+
hard_feasibility_identity = (
|
|
173
|
+
None
|
|
174
|
+
if self.hard_feasibility is None
|
|
175
|
+
else validate_hard_feasibility_port(self.hard_feasibility)
|
|
176
|
+
)
|
|
177
|
+
if self.acquisition_certification_context_sink is not None and not isinstance(
|
|
178
|
+
self.acquisition_certification_context_sink,
|
|
179
|
+
AcquisitionCertifiedSlateContextSink,
|
|
180
|
+
):
|
|
181
|
+
raise TypeError(
|
|
182
|
+
"acquisition_certification_context_sink must implement its port"
|
|
183
|
+
)
|
|
184
|
+
if not callable(getattr(self.phenotype_identity, "identify", None)):
|
|
185
|
+
raise TypeError("phenotype_identity must implement its policy port")
|
|
186
|
+
if (
|
|
187
|
+
type(self.phenotype_identity.policy_id) is not str
|
|
188
|
+
or _TOKEN.fullmatch(self.phenotype_identity.policy_id) is None
|
|
189
|
+
or type(self.phenotype_identity.policy_version) is not int
|
|
190
|
+
or self.phenotype_identity.policy_version <= 0
|
|
191
|
+
):
|
|
192
|
+
raise ValueError("phenotype identity policy has invalid identity")
|
|
193
|
+
if type(self.pool_size) is not int or self.pool_size < 16:
|
|
194
|
+
raise ValueError("pool_size must be an exact integer of at least 16")
|
|
195
|
+
if (
|
|
196
|
+
type(self.protected_batch_size) is not int
|
|
197
|
+
or self.protected_batch_size < 1
|
|
198
|
+
):
|
|
199
|
+
raise ValueError("protected_batch_size must be positive")
|
|
200
|
+
if self.protected_batch_size > self.pool_size:
|
|
201
|
+
raise ValueError("protected batch cannot exceed the pool")
|
|
202
|
+
if (
|
|
203
|
+
type(self.source_minimum_per_lane) is not int
|
|
204
|
+
or not 1 <= self.source_minimum_per_lane < 8
|
|
205
|
+
):
|
|
206
|
+
raise ValueError("source_minimum_per_lane must lie in [1, 8)")
|
|
207
|
+
if (
|
|
208
|
+
type(self.maximum_phenotype_recourse_rounds) is not int
|
|
209
|
+
or self.maximum_phenotype_recourse_rounds < 1
|
|
210
|
+
):
|
|
211
|
+
raise ValueError("maximum phenotype recourse rounds must be positive")
|
|
212
|
+
if type(self.seed) is not int or self.seed < 0:
|
|
213
|
+
raise ValueError("seed must be a non-negative exact integer")
|
|
214
|
+
for name in ("source_id", "option_family", "operator_id"):
|
|
215
|
+
value = getattr(self, name)
|
|
216
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
217
|
+
raise ValueError(f"{name} must use the closed token grammar")
|
|
218
|
+
definition = {
|
|
219
|
+
"schema_version": 1,
|
|
220
|
+
"policy_id": POLICY_ID,
|
|
221
|
+
"policy_version": POLICY_VERSION,
|
|
222
|
+
"objectives": [value.to_record() for value in self.objectives],
|
|
223
|
+
"space": {
|
|
224
|
+
"space_id": space_identity[0],
|
|
225
|
+
"space_version": space_identity[1],
|
|
226
|
+
"definition_sha256": space_identity[2],
|
|
227
|
+
},
|
|
228
|
+
"acquisition": {
|
|
229
|
+
"policy_id": acquisition_identity[0],
|
|
230
|
+
"policy_version": acquisition_identity[1],
|
|
231
|
+
"definition_sha256": acquisition_identity[2],
|
|
232
|
+
},
|
|
233
|
+
"hard_feasibility": (
|
|
234
|
+
None
|
|
235
|
+
if hard_feasibility_identity is None
|
|
236
|
+
else {
|
|
237
|
+
"policy_id": hard_feasibility_identity[0],
|
|
238
|
+
"policy_version": hard_feasibility_identity[1],
|
|
239
|
+
"definition_sha256": hard_feasibility_identity[2],
|
|
240
|
+
"rejection_authority": "exact_infeasibility_only",
|
|
241
|
+
"unknown_disposition": "retain",
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
"acquisition_certification_context_sink": (
|
|
245
|
+
None
|
|
246
|
+
if self.acquisition_certification_context_sink is None
|
|
247
|
+
else {
|
|
248
|
+
"provider_id": (
|
|
249
|
+
self.acquisition_certification_context_sink.provider_id
|
|
250
|
+
),
|
|
251
|
+
"provider_version": (
|
|
252
|
+
self.acquisition_certification_context_sink.provider_version
|
|
253
|
+
),
|
|
254
|
+
"definition_sha256": (
|
|
255
|
+
self.acquisition_certification_context_sink.definition_sha256
|
|
256
|
+
),
|
|
257
|
+
}
|
|
258
|
+
),
|
|
259
|
+
"phenotype_identity": {
|
|
260
|
+
"policy_id": self.phenotype_identity.policy_id,
|
|
261
|
+
"policy_version": self.phenotype_identity.policy_version,
|
|
262
|
+
},
|
|
263
|
+
"pool_size": self.pool_size,
|
|
264
|
+
"protected_batch_size": self.protected_batch_size,
|
|
265
|
+
"source_minimum_per_lane": self.source_minimum_per_lane,
|
|
266
|
+
"maximum_phenotype_recourse_rounds": (
|
|
267
|
+
self.maximum_phenotype_recourse_rounds
|
|
268
|
+
),
|
|
269
|
+
"seed": self.seed,
|
|
270
|
+
"source_id": self.source_id,
|
|
271
|
+
"option_family": self.option_family,
|
|
272
|
+
"operator_id": self.operator_id,
|
|
273
|
+
"archive_outcomes": "strictly_prior_real_valid_unique_configurations",
|
|
274
|
+
"partition": "accepted_acquisition_rank_round_robin_over_sorted_lanes",
|
|
275
|
+
"protected_source_witness": (
|
|
276
|
+
"smallest_authenticated_source_ranks_within_each_lane"
|
|
277
|
+
),
|
|
278
|
+
"phenotype_recourse": (
|
|
279
|
+
"select_then-exact-check-selected-only-bounded-refill"
|
|
280
|
+
),
|
|
281
|
+
"base_support": "preserved",
|
|
282
|
+
"current_future_outcomes": False,
|
|
283
|
+
"workload_model_provider_branches": False,
|
|
284
|
+
}
|
|
285
|
+
definition_sha256 = hashlib.sha256(
|
|
286
|
+
_DEFINITION_DOMAIN + _canonical_json(definition)
|
|
287
|
+
).hexdigest()
|
|
288
|
+
object.__setattr__(self, "definition_sha256", definition_sha256)
|
|
289
|
+
object.__setattr__(
|
|
290
|
+
self,
|
|
291
|
+
"_catalog_definition_sha256",
|
|
292
|
+
hashlib.sha256(
|
|
293
|
+
_CATALOG_DOMAIN + bytes.fromhex(definition_sha256)
|
|
294
|
+
).hexdigest(),
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def _observations(
|
|
298
|
+
self,
|
|
299
|
+
request: CampaignVariationEnvelopeRequest,
|
|
300
|
+
) -> tuple[FiniteAcquisitionObservation, ...]:
|
|
301
|
+
expected_metrics = tuple(value.metric_id for value in self.objectives)
|
|
302
|
+
by_configuration: dict[str, FiniteAcquisitionObservation] = {}
|
|
303
|
+
for candidate in request.state.candidates:
|
|
304
|
+
if not candidate.valid:
|
|
305
|
+
continue
|
|
306
|
+
raw = dict(candidate.objectives)
|
|
307
|
+
if tuple(sorted(raw)) != expected_metrics:
|
|
308
|
+
raise ValueError("archive objective axes differ from acquisition axes")
|
|
309
|
+
configuration = candidate.configuration
|
|
310
|
+
if type(configuration) is not FrozenJsonObject:
|
|
311
|
+
raise TypeError("acquisition requires object-root configurations")
|
|
312
|
+
configuration_sha256 = typed_json_sha256(configuration)
|
|
313
|
+
features = self.space.features(configuration)
|
|
314
|
+
observation = FiniteAcquisitionObservation(
|
|
315
|
+
candidate_id=f"obs-{configuration_sha256[:32]}",
|
|
316
|
+
configuration_sha256=configuration_sha256,
|
|
317
|
+
features=features,
|
|
318
|
+
objectives=tuple(
|
|
319
|
+
(metric_id, float(raw[metric_id]))
|
|
320
|
+
for metric_id in expected_metrics
|
|
321
|
+
),
|
|
322
|
+
)
|
|
323
|
+
previous = by_configuration.setdefault(configuration_sha256, observation)
|
|
324
|
+
if previous != observation:
|
|
325
|
+
raise ValueError("one configuration has conflicting real observations")
|
|
326
|
+
observations = tuple(
|
|
327
|
+
by_configuration[key] for key in sorted(by_configuration)
|
|
328
|
+
)
|
|
329
|
+
if not observations:
|
|
330
|
+
raise ValueError("acquisition envelope requires prior valid observations")
|
|
331
|
+
return observations
|
|
332
|
+
|
|
333
|
+
def enrich(
|
|
334
|
+
self,
|
|
335
|
+
request: CampaignVariationEnvelopeRequest,
|
|
336
|
+
) -> CampaignVariationEnvelopeResult:
|
|
337
|
+
self.__post_init__()
|
|
338
|
+
if type(request) is not CampaignVariationEnvelopeRequest:
|
|
339
|
+
raise TypeError("request must be an exact envelope request")
|
|
340
|
+
CampaignVariationEnvelopeRequest.__post_init__(request)
|
|
341
|
+
if self.protected_batch_size < (
|
|
342
|
+
self.source_minimum_per_lane * len(request.lanes)
|
|
343
|
+
):
|
|
344
|
+
raise ValueError(
|
|
345
|
+
"protected batch must cover every active parent lane source floor"
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
observations = self._observations(request)
|
|
349
|
+
observed_configuration_by_sha256 = {
|
|
350
|
+
typed_json_sha256(value.configuration): value.configuration
|
|
351
|
+
for value in request.state.candidates
|
|
352
|
+
if value.valid and type(value.configuration) is FrozenJsonObject
|
|
353
|
+
}
|
|
354
|
+
excluded_configurations = {
|
|
355
|
+
value.configuration_sha256 for value in observations
|
|
356
|
+
}
|
|
357
|
+
excluded_phenotypes = set(
|
|
358
|
+
request.lanes[0].base_variation.known_phenotype_sha256s
|
|
359
|
+
)
|
|
360
|
+
base_phenotype_by_option_identity: dict[str, str] = {}
|
|
361
|
+
for lane in request.lanes:
|
|
362
|
+
receipt = lane.base_variation.eligibility_receipt
|
|
363
|
+
receipt_by_identity = (
|
|
364
|
+
{}
|
|
365
|
+
if receipt is None
|
|
366
|
+
else {
|
|
367
|
+
value.option_identity_sha256: value.phenotype_identity_sha256
|
|
368
|
+
for value in receipt.option_phenotypes
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
for option in lane.base_variation.contract.options:
|
|
372
|
+
excluded_configurations.add(option.child_configuration_sha256)
|
|
373
|
+
phenotype_sha256 = receipt_by_identity.get(option.identity_sha256)
|
|
374
|
+
if phenotype_sha256 is None:
|
|
375
|
+
phenotype_sha256 = _phenotype(
|
|
376
|
+
self.phenotype_identity,
|
|
377
|
+
option.child_configuration,
|
|
378
|
+
)
|
|
379
|
+
base_phenotype_by_option_identity[option.identity_sha256] = (
|
|
380
|
+
phenotype_sha256
|
|
381
|
+
)
|
|
382
|
+
excluded_phenotypes.add(phenotype_sha256)
|
|
383
|
+
space_request = FiniteAcquisitionSpaceRequest(
|
|
384
|
+
campaign_scope_sha256=request.campaign_scope_sha256,
|
|
385
|
+
cutoff_index=request.state.unique_evaluations,
|
|
386
|
+
pool_size=self.pool_size,
|
|
387
|
+
seed=self.seed + request.generation,
|
|
388
|
+
observed_configurations=tuple(
|
|
389
|
+
observed_configuration_by_sha256[key]
|
|
390
|
+
for key in sorted(observed_configuration_by_sha256)
|
|
391
|
+
),
|
|
392
|
+
excluded_configuration_sha256s=tuple(sorted(excluded_configurations)),
|
|
393
|
+
)
|
|
394
|
+
materializations = self.space.candidates(space_request)
|
|
395
|
+
validate_finite_acquisition_space_candidates(
|
|
396
|
+
request=space_request,
|
|
397
|
+
candidates=materializations,
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
configurations: dict[str, FrozenJsonObject] = {}
|
|
401
|
+
candidates: list[FiniteAcquisitionCandidate] = []
|
|
402
|
+
seen_features: set[tuple[float, ...]] = set()
|
|
403
|
+
hard_feasibility_decision_sha256s: list[str] = []
|
|
404
|
+
hard_feasibility_infeasible_sha256s: list[str] = []
|
|
405
|
+
hard_feasibility_rejection_witnesses: list[dict[str, object]] = []
|
|
406
|
+
hard_feasibility_verdict_counts = {
|
|
407
|
+
HardFeasibilityVerdict.FEASIBLE.value: 0,
|
|
408
|
+
HardFeasibilityVerdict.INFEASIBLE.value: 0,
|
|
409
|
+
HardFeasibilityVerdict.UNKNOWN.value: 0,
|
|
410
|
+
}
|
|
411
|
+
for configuration in materializations:
|
|
412
|
+
configuration_sha256 = typed_json_sha256(configuration)
|
|
413
|
+
if self.hard_feasibility is not None:
|
|
414
|
+
feasibility_request = HardFeasibilityRequest(
|
|
415
|
+
campaign_scope_sha256=request.campaign_scope_sha256,
|
|
416
|
+
cutoff_index=request.state.unique_evaluations,
|
|
417
|
+
configuration=configuration,
|
|
418
|
+
)
|
|
419
|
+
feasibility = assess_hard_feasibility(
|
|
420
|
+
self.hard_feasibility,
|
|
421
|
+
feasibility_request,
|
|
422
|
+
)
|
|
423
|
+
hard_feasibility_decision_sha256s.append(
|
|
424
|
+
feasibility.decision_sha256
|
|
425
|
+
)
|
|
426
|
+
hard_feasibility_verdict_counts[feasibility.verdict.value] += 1
|
|
427
|
+
if feasibility.verdict is HardFeasibilityVerdict.INFEASIBLE:
|
|
428
|
+
hard_feasibility_infeasible_sha256s.append(
|
|
429
|
+
feasibility.decision_sha256
|
|
430
|
+
)
|
|
431
|
+
if len(hard_feasibility_rejection_witnesses) < 8:
|
|
432
|
+
hard_feasibility_rejection_witnesses.append(
|
|
433
|
+
{
|
|
434
|
+
"configuration_sha256": configuration_sha256,
|
|
435
|
+
"decision": feasibility.to_record(),
|
|
436
|
+
}
|
|
437
|
+
)
|
|
438
|
+
continue
|
|
439
|
+
features = self.space.features(configuration)
|
|
440
|
+
if features in seen_features:
|
|
441
|
+
continue
|
|
442
|
+
# Constructing the port value performs finite/[0,1] validation.
|
|
443
|
+
candidate = FiniteAcquisitionCandidate(
|
|
444
|
+
candidate_id=f"acq-{configuration_sha256[:32]}",
|
|
445
|
+
configuration_sha256=configuration_sha256,
|
|
446
|
+
features=features,
|
|
447
|
+
)
|
|
448
|
+
configurations[configuration_sha256] = configuration
|
|
449
|
+
candidates.append(candidate)
|
|
450
|
+
seen_features.add(features)
|
|
451
|
+
# Evaluator-equivalent configurations and duplicate feature rows are
|
|
452
|
+
# intentionally removed after the outcome-blind workload reservoir is
|
|
453
|
+
# materialized. The configured pool size is therefore an upper-bound
|
|
454
|
+
# on usable support, not a promise that phenotype filtering can keep
|
|
455
|
+
# every row. Only exact protected-batch coverage is semantically
|
|
456
|
+
# required by the downstream acquisition boundary.
|
|
457
|
+
if len(candidates) < self.protected_batch_size:
|
|
458
|
+
raise ValueError("acquisition reservoir lost protected-batch support")
|
|
459
|
+
|
|
460
|
+
remaining = tuple(candidates)
|
|
461
|
+
accepted: list[tuple[object, FrozenJsonObject, str]] = []
|
|
462
|
+
accepted_phenotypes = set(excluded_phenotypes)
|
|
463
|
+
acquisition_requests: list[FiniteAcquisitionRequest] = []
|
|
464
|
+
acquisition_decisions = []
|
|
465
|
+
phenotype_rejections: list[dict[str, object]] = []
|
|
466
|
+
for recourse_round in range(self.maximum_phenotype_recourse_rounds):
|
|
467
|
+
needed = self.protected_batch_size - len(accepted)
|
|
468
|
+
if needed <= 0:
|
|
469
|
+
break
|
|
470
|
+
if len(remaining) < needed:
|
|
471
|
+
break
|
|
472
|
+
acquisition_request = FiniteAcquisitionRequest(
|
|
473
|
+
campaign_scope_sha256=request.campaign_scope_sha256,
|
|
474
|
+
cutoff_index=request.state.unique_evaluations,
|
|
475
|
+
batch_size=needed,
|
|
476
|
+
seed=self.seed + request.generation + recourse_round * 1_000_003,
|
|
477
|
+
objectives=self.objectives,
|
|
478
|
+
observations=observations,
|
|
479
|
+
candidates=remaining,
|
|
480
|
+
)
|
|
481
|
+
decision = self.acquisition.select(acquisition_request)
|
|
482
|
+
if decision.request_sha256 != acquisition_request.request_sha256:
|
|
483
|
+
raise ValueError("acquisition decision targets another request")
|
|
484
|
+
if (
|
|
485
|
+
decision.policy_id,
|
|
486
|
+
decision.policy_version,
|
|
487
|
+
decision.policy_definition_sha256,
|
|
488
|
+
) != _policy_identity(self.acquisition):
|
|
489
|
+
raise ValueError("acquisition decision has a foreign policy identity")
|
|
490
|
+
if len(decision.selected) != needed:
|
|
491
|
+
raise ValueError("acquisition policy returned the wrong batch size")
|
|
492
|
+
candidate_by_id = {value.candidate_id: value for value in remaining}
|
|
493
|
+
selected_ids: set[str] = set()
|
|
494
|
+
for value in decision.selected:
|
|
495
|
+
candidate = candidate_by_id.get(value.candidate_id)
|
|
496
|
+
if (
|
|
497
|
+
candidate is None
|
|
498
|
+
or candidate.configuration_sha256
|
|
499
|
+
!= value.configuration_sha256
|
|
500
|
+
):
|
|
501
|
+
raise ValueError(
|
|
502
|
+
"acquisition selected outside the sealed reservoir"
|
|
503
|
+
)
|
|
504
|
+
selected_ids.add(value.candidate_id)
|
|
505
|
+
configuration = configurations[value.configuration_sha256]
|
|
506
|
+
phenotype_sha256 = _phenotype(
|
|
507
|
+
self.phenotype_identity,
|
|
508
|
+
configuration,
|
|
509
|
+
)
|
|
510
|
+
if phenotype_sha256 in accepted_phenotypes:
|
|
511
|
+
phenotype_rejections.append(
|
|
512
|
+
{
|
|
513
|
+
"recourse_round": recourse_round,
|
|
514
|
+
"candidate_id": value.candidate_id,
|
|
515
|
+
"configuration_sha256": value.configuration_sha256,
|
|
516
|
+
"phenotype_sha256": phenotype_sha256,
|
|
517
|
+
}
|
|
518
|
+
)
|
|
519
|
+
continue
|
|
520
|
+
accepted_phenotypes.add(phenotype_sha256)
|
|
521
|
+
accepted.append((value, configuration, phenotype_sha256))
|
|
522
|
+
acquisition_requests.append(acquisition_request)
|
|
523
|
+
acquisition_decisions.append(decision)
|
|
524
|
+
remaining = tuple(
|
|
525
|
+
value for value in remaining if value.candidate_id not in selected_ids
|
|
526
|
+
)
|
|
527
|
+
if len(accepted) != self.protected_batch_size:
|
|
528
|
+
raise ValueError("phenotype recourse underfilled the protected batch")
|
|
529
|
+
selected = tuple(
|
|
530
|
+
(rank, value, configuration, phenotype_sha256)
|
|
531
|
+
for rank, (value, configuration, phenotype_sha256) in enumerate(
|
|
532
|
+
accepted,
|
|
533
|
+
start=1,
|
|
534
|
+
)
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
assignments: dict[str, list[tuple[int, object, FrozenJsonObject]]] = {
|
|
538
|
+
value.lane_id: [] for value in request.lanes
|
|
539
|
+
}
|
|
540
|
+
lane_ids = tuple(sorted(assignments))
|
|
541
|
+
for ordinal, row in enumerate(selected):
|
|
542
|
+
assignments[lane_ids[ordinal % len(lane_ids)]].append(row)
|
|
543
|
+
|
|
544
|
+
result_lanes: list[CampaignVariationEnvelopeLaneResult] = []
|
|
545
|
+
partition_evidence: list[dict[str, object]] = []
|
|
546
|
+
certification_contexts: list[AcquisitionCertifiedSlateContext] = []
|
|
547
|
+
for lane in request.lanes:
|
|
548
|
+
assigned = assignments[lane.lane_id]
|
|
549
|
+
if not assigned:
|
|
550
|
+
raise ValueError("protected acquisition left a lane uncovered")
|
|
551
|
+
parent_sha256 = lane.base_variation.parent_configuration_sha256
|
|
552
|
+
acquisition_options: list[FiniteVariationOption] = []
|
|
553
|
+
selected_phenotypes_by_option_id: dict[str, str] = {}
|
|
554
|
+
for rank, selection, configuration, phenotype_sha256 in assigned:
|
|
555
|
+
if not math.isfinite(selection.acquisition_value):
|
|
556
|
+
raise ValueError("acquisition value must remain finite")
|
|
557
|
+
option = FiniteVariationOption(
|
|
558
|
+
option_id=(
|
|
559
|
+
f"acquisition.g{request.generation:02d}."
|
|
560
|
+
f"r{rank:03d}.{selection.configuration_sha256[:16]}"
|
|
561
|
+
),
|
|
562
|
+
parent_configuration_sha256=parent_sha256,
|
|
563
|
+
child_configuration=configuration,
|
|
564
|
+
family=self.option_family,
|
|
565
|
+
description=(
|
|
566
|
+
"Protected numerical acquisition candidate "
|
|
567
|
+
f"rank {rank:03d} from strictly prior real outcomes."
|
|
568
|
+
),
|
|
569
|
+
metadata=tuple(
|
|
570
|
+
sorted(
|
|
571
|
+
(
|
|
572
|
+
("acquisition_policy_id", decision.policy_id),
|
|
573
|
+
("acquisition_rank", f"{rank:03d}"),
|
|
574
|
+
(
|
|
575
|
+
"acquisition_value_hex",
|
|
576
|
+
selection.acquisition_value.hex(),
|
|
577
|
+
),
|
|
578
|
+
(
|
|
579
|
+
VARIATION_SOURCE_RANK_METADATA_KEY,
|
|
580
|
+
str(rank),
|
|
581
|
+
),
|
|
582
|
+
(
|
|
583
|
+
VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
|
|
584
|
+
f"acquisition.rank{rank:03d}",
|
|
585
|
+
),
|
|
586
|
+
(VARIATION_OPERATOR_METADATA_KEY, self.operator_id),
|
|
587
|
+
(VARIATION_SOURCE_METADATA_KEY, self.source_id),
|
|
588
|
+
*(
|
|
589
|
+
(
|
|
590
|
+
(
|
|
591
|
+
VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY,
|
|
592
|
+
"required",
|
|
593
|
+
),
|
|
594
|
+
)
|
|
595
|
+
if self.acquisition_certification_context_sink
|
|
596
|
+
is not None
|
|
597
|
+
else ()
|
|
598
|
+
),
|
|
599
|
+
(
|
|
600
|
+
VARIATION_SOURCE_MINIMUM_METADATA_KEY,
|
|
601
|
+
str(self.source_minimum_per_lane),
|
|
602
|
+
),
|
|
603
|
+
)
|
|
604
|
+
)
|
|
605
|
+
),
|
|
606
|
+
)
|
|
607
|
+
acquisition_options.append(option)
|
|
608
|
+
selected_phenotypes_by_option_id[option.option_id] = phenotype_sha256
|
|
609
|
+
combined_options = (
|
|
610
|
+
*lane.base_variation.contract.options,
|
|
611
|
+
*acquisition_options,
|
|
612
|
+
)
|
|
613
|
+
if len(combined_options) > MAX_FINITE_VARIATION_OPTIONS:
|
|
614
|
+
raise ValueError("acquisition envelope exceeds the finite-option bound")
|
|
615
|
+
combined = FiniteVariationContract(
|
|
616
|
+
catalog_id="finite_acquisition_expert_union",
|
|
617
|
+
catalog_version=POLICY_VERSION,
|
|
618
|
+
catalog_definition_sha256=self._catalog_definition_sha256,
|
|
619
|
+
parent_configuration=lane.base_variation.contract.parent_configuration,
|
|
620
|
+
options=tuple(combined_options),
|
|
621
|
+
)
|
|
622
|
+
phenotype_bindings = tuple(
|
|
623
|
+
OptionPhenotypeBinding(
|
|
624
|
+
option_id=option.option_id,
|
|
625
|
+
option_identity_sha256=option.identity_sha256,
|
|
626
|
+
phenotype_identity_sha256=(
|
|
627
|
+
selected_phenotypes_by_option_id[option.option_id]
|
|
628
|
+
if option.option_id in selected_phenotypes_by_option_id
|
|
629
|
+
else base_phenotype_by_option_identity[
|
|
630
|
+
option.identity_sha256
|
|
631
|
+
]
|
|
632
|
+
),
|
|
633
|
+
)
|
|
634
|
+
for option in combined.options
|
|
635
|
+
)
|
|
636
|
+
eligible = eligible_finite_variation_view(
|
|
637
|
+
contract=combined,
|
|
638
|
+
option_phenotypes=phenotype_bindings,
|
|
639
|
+
known_phenotype_sha256s=(
|
|
640
|
+
lane.base_variation.known_phenotype_sha256s
|
|
641
|
+
),
|
|
642
|
+
)
|
|
643
|
+
if self.source_id not in finite_variation_source_ids(eligible.contract):
|
|
644
|
+
raise ValueError("protected acquisition source vanished at eligibility")
|
|
645
|
+
enriched = ParentVariationBinding(
|
|
646
|
+
benchmark_sha256=lane.base_variation.benchmark_sha256,
|
|
647
|
+
parent_configuration_sha256=parent_sha256,
|
|
648
|
+
known_phenotype_sha256s=(
|
|
649
|
+
lane.base_variation.known_phenotype_sha256s
|
|
650
|
+
),
|
|
651
|
+
contract=eligible.contract,
|
|
652
|
+
eligibility_receipt=eligible.receipt,
|
|
653
|
+
)
|
|
654
|
+
reference_option_ids = tuple(
|
|
655
|
+
sorted(
|
|
656
|
+
option.option_id
|
|
657
|
+
for option in eligible.contract.options
|
|
658
|
+
if finite_variation_source_id(option) == self.source_id
|
|
659
|
+
)
|
|
660
|
+
)
|
|
661
|
+
if not reference_option_ids:
|
|
662
|
+
raise ValueError("certification reference lost every acquisition option")
|
|
663
|
+
context = AcquisitionCertifiedSlateContext(
|
|
664
|
+
campaign_scope_sha256=request.campaign_scope_sha256,
|
|
665
|
+
finite_contract_sha256=eligible.contract.identity_sha256,
|
|
666
|
+
cutoff_index=request.state.unique_evaluations,
|
|
667
|
+
seed=int.from_bytes(
|
|
668
|
+
hashlib.sha256(
|
|
669
|
+
(
|
|
670
|
+
f"{self.seed}:{request.generation}:{lane.lane_id}"
|
|
671
|
+
).encode("ascii", errors="strict")
|
|
672
|
+
).digest()[:4],
|
|
673
|
+
byteorder="big",
|
|
674
|
+
signed=False,
|
|
675
|
+
),
|
|
676
|
+
objectives=self.objectives,
|
|
677
|
+
observations=observations,
|
|
678
|
+
candidates=tuple(
|
|
679
|
+
FiniteAcquisitionCandidate(
|
|
680
|
+
candidate_id=option.option_id,
|
|
681
|
+
configuration_sha256=option.child_configuration_sha256,
|
|
682
|
+
features=self.space.features(option.child_configuration),
|
|
683
|
+
)
|
|
684
|
+
for option in eligible.contract.options
|
|
685
|
+
),
|
|
686
|
+
reference_option_ids=reference_option_ids,
|
|
687
|
+
)
|
|
688
|
+
certification_contexts.append(context)
|
|
689
|
+
result_lanes.append(
|
|
690
|
+
CampaignVariationEnvelopeLaneResult(
|
|
691
|
+
lane_id=lane.lane_id,
|
|
692
|
+
variation=enriched,
|
|
693
|
+
)
|
|
694
|
+
)
|
|
695
|
+
partition_evidence.append(
|
|
696
|
+
{
|
|
697
|
+
"lane_id": lane.lane_id,
|
|
698
|
+
"base_option_count": len(
|
|
699
|
+
lane.base_variation.contract.options
|
|
700
|
+
),
|
|
701
|
+
"acquisition_ranks": [rank for rank, _, _, _ in assigned],
|
|
702
|
+
"eligible_option_count": len(eligible.contract.options),
|
|
703
|
+
"acquisition_certification_context_sha256": (
|
|
704
|
+
context.context_sha256
|
|
705
|
+
),
|
|
706
|
+
"acquisition_certification_reference_count": (
|
|
707
|
+
len(context.reference_option_ids)
|
|
708
|
+
),
|
|
709
|
+
}
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
if self.acquisition_certification_context_sink is not None:
|
|
713
|
+
self.acquisition_certification_context_sink.register_many(
|
|
714
|
+
tuple(certification_contexts)
|
|
715
|
+
)
|
|
716
|
+
|
|
717
|
+
evidence = freeze_json(
|
|
718
|
+
{
|
|
719
|
+
"schema_version": 1,
|
|
720
|
+
"space_request_sha256": space_request.request_sha256,
|
|
721
|
+
"acquisition_request_sha256": (
|
|
722
|
+
acquisition_requests[0].request_sha256
|
|
723
|
+
),
|
|
724
|
+
"acquisition_decision": acquisition_decisions[0].to_record(),
|
|
725
|
+
"acquisition_recourse_requests": [
|
|
726
|
+
{
|
|
727
|
+
"request_sha256": value.request_sha256,
|
|
728
|
+
"batch_size": value.batch_size,
|
|
729
|
+
"seed": value.seed,
|
|
730
|
+
"observation_count": len(value.observations),
|
|
731
|
+
"candidate_pool_size": len(value.candidates),
|
|
732
|
+
}
|
|
733
|
+
for value in acquisition_requests
|
|
734
|
+
],
|
|
735
|
+
"acquisition_recourse_decisions": [
|
|
736
|
+
value.to_record() for value in acquisition_decisions
|
|
737
|
+
],
|
|
738
|
+
"phenotype_rejections": phenotype_rejections,
|
|
739
|
+
"phenotype_checks_performed": (
|
|
740
|
+
len(accepted) + len(phenotype_rejections)
|
|
741
|
+
),
|
|
742
|
+
"hard_feasibility": {
|
|
743
|
+
"enabled": self.hard_feasibility is not None,
|
|
744
|
+
"verdict_counts": hard_feasibility_verdict_counts,
|
|
745
|
+
"decision_count": len(hard_feasibility_decision_sha256s),
|
|
746
|
+
"decision_batch_sha256": (
|
|
747
|
+
hard_feasibility_decision_batch_sha256(
|
|
748
|
+
hard_feasibility_decision_sha256s
|
|
749
|
+
)
|
|
750
|
+
),
|
|
751
|
+
"infeasible_decision_count": len(
|
|
752
|
+
hard_feasibility_infeasible_sha256s
|
|
753
|
+
),
|
|
754
|
+
"infeasible_decision_batch_sha256": (
|
|
755
|
+
hard_feasibility_decision_batch_sha256(
|
|
756
|
+
hard_feasibility_infeasible_sha256s
|
|
757
|
+
)
|
|
758
|
+
),
|
|
759
|
+
"rejection_witnesses": (
|
|
760
|
+
hard_feasibility_rejection_witnesses
|
|
761
|
+
),
|
|
762
|
+
"rejection_witness_limit": 8,
|
|
763
|
+
"rejection_witness_sampling": (
|
|
764
|
+
"first_in_authenticated_space_order"
|
|
765
|
+
),
|
|
766
|
+
"rejection_authority": "exact_infeasibility_only",
|
|
767
|
+
"unknown_disposition": "retain",
|
|
768
|
+
"outcome_access": False,
|
|
769
|
+
},
|
|
770
|
+
"partition": partition_evidence,
|
|
771
|
+
"acquisition_certification_context_sha256s": [
|
|
772
|
+
value.context_sha256 for value in certification_contexts
|
|
773
|
+
],
|
|
774
|
+
"acquisition_certification_contexts_registered": (
|
|
775
|
+
self.acquisition_certification_context_sink is not None
|
|
776
|
+
),
|
|
777
|
+
"protected_source_id": self.source_id,
|
|
778
|
+
"strictly_prior_observation_count": len(observations),
|
|
779
|
+
"raw_reservoir_size": len(materializations),
|
|
780
|
+
"reservoir_size": len(candidates),
|
|
781
|
+
"current_future_outcomes_consulted": False,
|
|
782
|
+
"workload_model_provider_branches": False,
|
|
783
|
+
}
|
|
784
|
+
)
|
|
785
|
+
if type(evidence) is not FrozenJsonObject: # pragma: no cover
|
|
786
|
+
raise AssertionError("acquisition envelope evidence is not an object")
|
|
787
|
+
return CampaignVariationEnvelopeResult(
|
|
788
|
+
request_sha256=request.request_sha256,
|
|
789
|
+
policy_id=self.policy_id,
|
|
790
|
+
policy_version=self.policy_version,
|
|
791
|
+
policy_definition_sha256=self.definition_sha256,
|
|
792
|
+
lanes=tuple(result_lanes),
|
|
793
|
+
evidence=evidence,
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
__all__ = [
|
|
798
|
+
"POLICY_ID",
|
|
799
|
+
"POLICY_VERSION",
|
|
800
|
+
"PROTECTED_ACQUISITION_SOURCE_ID",
|
|
801
|
+
"ProtectedFiniteAcquisitionVariationEnvelope",
|
|
802
|
+
]
|