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,458 @@
|
|
|
1
|
+
"""Front-proximity parent basis: stop generating from dominated parents.
|
|
2
|
+
|
|
3
|
+
The allocator-side companion of this rule
|
|
4
|
+
(:mod:`agent_evolve.application.front_proximity_admission`) restricts which
|
|
5
|
+
members of an already-generated market an allocator may buy. This module
|
|
6
|
+
applies the *same* geometric quantity one level earlier, to the set of
|
|
7
|
+
parents a proposal market is generated FROM.
|
|
8
|
+
|
|
9
|
+
The measured motivation is in
|
|
10
|
+
``research_artifacts/jul28_large_gain_anatomy_and_refinement.md``: across the
|
|
11
|
+
eight sealed BOiLS held-out markets, 26% of every market descended from
|
|
12
|
+
parents whose Chebyshev excess over the archive front exceeded 0.05, and that
|
|
13
|
+
quarter held 1 of 88 prefix-positive members and 1.6% of all realised gain.
|
|
14
|
+
No allocator can recover a seat spent inside a region that carries no outcome
|
|
15
|
+
mass; the binding constraint is at least as much in the proposal universe as
|
|
16
|
+
in the allocation. This module removes that region at its source.
|
|
17
|
+
|
|
18
|
+
The rule is a *support restriction over the parent population*, composed on
|
|
19
|
+
top of the unchanged
|
|
20
|
+
:func:`agent_evolve.application.residual_reachability.select_residual_reachability_basis`.
|
|
21
|
+
Every existing admission route (quality archive, initial design, earned
|
|
22
|
+
lineage, structural cover, capacity fill) still runs and still stamps its own
|
|
23
|
+
reason; the only change is which parents each route is allowed to see.
|
|
24
|
+
|
|
25
|
+
Three properties are deliberate:
|
|
26
|
+
|
|
27
|
+
* **Relative, not absolute.** ``proximity_concentration`` names a fraction of
|
|
28
|
+
the parent population, never a distance threshold, so the rule carries no
|
|
29
|
+
workload constant, no metric name, no scale assumption and no objective
|
|
30
|
+
count. Anchor excess is computed from the archive front and a parent's own
|
|
31
|
+
objective vector, so it is domain-agnostic by construction.
|
|
32
|
+
* **Floored, not banned.** ``far_front_floor`` reserves a strictly positive
|
|
33
|
+
share of the basis for parents *outside* the proximal head. The archive
|
|
34
|
+
front moves as the campaign buys points, so today's far parent can be
|
|
35
|
+
tomorrow's near one; a rule that banned the distal tail outright could never
|
|
36
|
+
discover that. ``minimum_far_front_parents`` keeps the reservation
|
|
37
|
+
non-empty even for a small basis.
|
|
38
|
+
* **A no-op without anchors.** Parents with no recorded objective vector are
|
|
39
|
+
scored at the population median, exactly as the admission rule scores
|
|
40
|
+
anchorless candidates, so a lane is never systematically evicted. If no
|
|
41
|
+
parent carries an anchor at all, the selection is byte-identical to the
|
|
42
|
+
unrestricted basis.
|
|
43
|
+
|
|
44
|
+
Claim boundary: this changes which parents a generator proposes from. It
|
|
45
|
+
makes no claim about the outcome of any campaign that uses it.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
from __future__ import annotations
|
|
49
|
+
|
|
50
|
+
import hashlib
|
|
51
|
+
import json
|
|
52
|
+
import math
|
|
53
|
+
import re
|
|
54
|
+
from dataclasses import dataclass, field
|
|
55
|
+
|
|
56
|
+
from agent_evolve.application.calibrated_positive_gain_opportunity import (
|
|
57
|
+
ObjectivePoint,
|
|
58
|
+
)
|
|
59
|
+
from agent_evolve.application.front_proximity_admission import (
|
|
60
|
+
chebyshev_excess,
|
|
61
|
+
)
|
|
62
|
+
from agent_evolve.application.residual_reachability import (
|
|
63
|
+
ReachabilityCandidate,
|
|
64
|
+
ResidualReachabilityBasis,
|
|
65
|
+
ResidualReachabilityBasisPolicy,
|
|
66
|
+
select_residual_reachability_basis,
|
|
67
|
+
)
|
|
68
|
+
from agent_evolve.domain.ids import CandidateId
|
|
69
|
+
|
|
70
|
+
FRONT_PROXIMITY_PARENT_BASIS_ID = "front_proximity_parent_basis"
|
|
71
|
+
FRONT_PROXIMITY_PARENT_BASIS_VERSION = 1
|
|
72
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
73
|
+
_DEFINITION_DOMAIN = b"agent-evolve:front-proximity-parent-basis:v1\x00"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _canonical_json(value: object) -> bytes:
|
|
77
|
+
return json.dumps(
|
|
78
|
+
value,
|
|
79
|
+
allow_nan=False,
|
|
80
|
+
ensure_ascii=True,
|
|
81
|
+
separators=(",", ":"),
|
|
82
|
+
sort_keys=True,
|
|
83
|
+
).encode("ascii", errors="strict")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _hash(value: object) -> str:
|
|
87
|
+
return hashlib.sha256(
|
|
88
|
+
_DEFINITION_DOMAIN + _canonical_json(value)
|
|
89
|
+
).hexdigest()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@dataclass(frozen=True, slots=True)
|
|
93
|
+
class FrontProximityParentBasisConfig:
|
|
94
|
+
"""How hard the parent population is concentrated toward the front."""
|
|
95
|
+
|
|
96
|
+
#: Fraction of the anchored parent population treated as front-proximal.
|
|
97
|
+
#: 1.0 disables the restriction entirely and reproduces the unrestricted
|
|
98
|
+
#: basis byte for byte.
|
|
99
|
+
proximity_concentration: float = 0.50
|
|
100
|
+
#: Fraction of the basis reserved for parents OUTSIDE the proximal head,
|
|
101
|
+
#: so the distal tail is floored rather than banned. 0.0 is rejected:
|
|
102
|
+
#: banning is not a configuration of this rule. The floor is small by
|
|
103
|
+
#: default because its purpose is to keep the distal region reachable
|
|
104
|
+
#: as the front moves, not to guarantee it a large share of the basis.
|
|
105
|
+
far_front_floor: float = 0.125
|
|
106
|
+
#: Absolute floor on reserved distal slots, applied when the fractional
|
|
107
|
+
#: reservation rounds to zero on a small basis.
|
|
108
|
+
minimum_far_front_parents: int = 1
|
|
109
|
+
|
|
110
|
+
def __post_init__(self) -> None:
|
|
111
|
+
for name in ("proximity_concentration", "far_front_floor"):
|
|
112
|
+
value = getattr(self, name)
|
|
113
|
+
if (
|
|
114
|
+
type(value) is not float
|
|
115
|
+
or not math.isfinite(value)
|
|
116
|
+
or not 0.0 < value <= 1.0
|
|
117
|
+
):
|
|
118
|
+
raise ValueError(f"{name} must lie in (0, 1]")
|
|
119
|
+
if self.far_front_floor >= 1.0:
|
|
120
|
+
raise ValueError("far_front_floor must leave a proximal share")
|
|
121
|
+
if (
|
|
122
|
+
type(self.minimum_far_front_parents) is not int
|
|
123
|
+
or self.minimum_far_front_parents < 1
|
|
124
|
+
):
|
|
125
|
+
raise ValueError(
|
|
126
|
+
"minimum_far_front_parents must be a positive integer; "
|
|
127
|
+
"the distal tail is floored, never banned"
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def to_record(self) -> dict[str, object]:
|
|
131
|
+
self.__post_init__()
|
|
132
|
+
return {
|
|
133
|
+
"proximity_concentration_hex": float(
|
|
134
|
+
self.proximity_concentration
|
|
135
|
+
).hex(),
|
|
136
|
+
"far_front_floor_hex": float(self.far_front_floor).hex(),
|
|
137
|
+
"minimum_far_front_parents": self.minimum_far_front_parents,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@dataclass(frozen=True, slots=True)
|
|
142
|
+
class ParentAnchorExcess:
|
|
143
|
+
"""One parent's Chebyshev excess over the parent population's front."""
|
|
144
|
+
|
|
145
|
+
candidate_id: CandidateId
|
|
146
|
+
excess: float
|
|
147
|
+
anchored: bool
|
|
148
|
+
|
|
149
|
+
def to_record(self) -> dict[str, object]:
|
|
150
|
+
return {
|
|
151
|
+
"candidate_id": self.candidate_id.value,
|
|
152
|
+
"excess_hex": float(self.excess).hex(),
|
|
153
|
+
"anchored": self.anchored,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def parent_anchor_excesses(
|
|
158
|
+
candidates: tuple[ReachabilityCandidate, ...],
|
|
159
|
+
anchors: dict[CandidateId, ObjectivePoint],
|
|
160
|
+
metric_ids: tuple[str, ...],
|
|
161
|
+
) -> tuple[ParentAnchorExcess, ...]:
|
|
162
|
+
"""Excess of every parent over the front of the anchored population.
|
|
163
|
+
|
|
164
|
+
The front is the Pareto filter of every supplied anchor, so the quantity
|
|
165
|
+
is relative to the archive the campaign has actually evaluated. A parent
|
|
166
|
+
on the front scores exactly 0.0; a dominated parent scores the worst-axis
|
|
167
|
+
improvement it would need to reach the nearest front point. Parents with
|
|
168
|
+
no anchor take the population median, so they are neither systematically
|
|
169
|
+
admitted nor systematically evicted.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
if type(candidates) is not tuple or not candidates:
|
|
173
|
+
raise ValueError("candidates must be a non-empty exact tuple")
|
|
174
|
+
if type(anchors) is not dict:
|
|
175
|
+
raise TypeError("anchors must be an exact mapping")
|
|
176
|
+
if type(metric_ids) is not tuple or not metric_ids:
|
|
177
|
+
raise ValueError("metric_ids must be a non-empty exact tuple")
|
|
178
|
+
if tuple(sorted(metric_ids)) != metric_ids:
|
|
179
|
+
raise ValueError("metric_ids must be canonically ordered")
|
|
180
|
+
points = tuple(
|
|
181
|
+
anchors[value.candidate_id]
|
|
182
|
+
for value in candidates
|
|
183
|
+
if value.candidate_id in anchors
|
|
184
|
+
)
|
|
185
|
+
if not points:
|
|
186
|
+
return tuple(
|
|
187
|
+
ParentAnchorExcess(
|
|
188
|
+
candidate_id=value.candidate_id,
|
|
189
|
+
excess=0.0,
|
|
190
|
+
anchored=False,
|
|
191
|
+
)
|
|
192
|
+
for value in candidates
|
|
193
|
+
)
|
|
194
|
+
known: dict[CandidateId, float] = {
|
|
195
|
+
value.candidate_id: chebyshev_excess(
|
|
196
|
+
anchors[value.candidate_id], points, metric_ids
|
|
197
|
+
)
|
|
198
|
+
for value in candidates
|
|
199
|
+
if value.candidate_id in anchors
|
|
200
|
+
}
|
|
201
|
+
ordered = sorted(known.values())
|
|
202
|
+
median = ordered[len(ordered) // 2]
|
|
203
|
+
return tuple(
|
|
204
|
+
ParentAnchorExcess(
|
|
205
|
+
candidate_id=value.candidate_id,
|
|
206
|
+
excess=known.get(value.candidate_id, median),
|
|
207
|
+
anchored=value.candidate_id in known,
|
|
208
|
+
)
|
|
209
|
+
for value in candidates
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@dataclass(frozen=True, slots=True)
|
|
214
|
+
class FrontProximityParentBasis:
|
|
215
|
+
"""Select a reachability basis biased toward front-proximal parents.
|
|
216
|
+
|
|
217
|
+
``inner_policy`` is the unmodified bounded dual-archive retention policy.
|
|
218
|
+
This wrapper runs it twice — once over the proximal head with the
|
|
219
|
+
unreserved slots, once over the distal remainder with the reserved floor
|
|
220
|
+
— and merges the two bases. Every admission reason is produced by the
|
|
221
|
+
inner policy; none is invented here.
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
inner_policy: ResidualReachabilityBasisPolicy
|
|
225
|
+
config: FrontProximityParentBasisConfig = field(
|
|
226
|
+
default_factory=FrontProximityParentBasisConfig
|
|
227
|
+
)
|
|
228
|
+
policy_id: str = "front_proximity_parent_basis"
|
|
229
|
+
definition_sha256: str = field(init=False)
|
|
230
|
+
|
|
231
|
+
def __post_init__(self) -> None:
|
|
232
|
+
if type(self.inner_policy) is not ResidualReachabilityBasisPolicy:
|
|
233
|
+
raise TypeError(
|
|
234
|
+
"inner_policy must be an exact "
|
|
235
|
+
"ResidualReachabilityBasisPolicy"
|
|
236
|
+
)
|
|
237
|
+
self.inner_policy.__post_init__()
|
|
238
|
+
if type(self.config) is not FrontProximityParentBasisConfig:
|
|
239
|
+
raise TypeError("config must be an exact config")
|
|
240
|
+
self.config.__post_init__()
|
|
241
|
+
if _TOKEN.fullmatch(self.policy_id) is None:
|
|
242
|
+
raise ValueError("policy_id must use the closed token grammar")
|
|
243
|
+
object.__setattr__(
|
|
244
|
+
self,
|
|
245
|
+
"definition_sha256",
|
|
246
|
+
_hash(
|
|
247
|
+
{
|
|
248
|
+
"arm": FRONT_PROXIMITY_PARENT_BASIS_ID,
|
|
249
|
+
"version": FRONT_PROXIMITY_PARENT_BASIS_VERSION,
|
|
250
|
+
"config": self.config.to_record(),
|
|
251
|
+
"inner_policy_definition_sha256": (
|
|
252
|
+
self.inner_policy.definition_sha256
|
|
253
|
+
),
|
|
254
|
+
"rule": (
|
|
255
|
+
"partition the parent population by chebyshev "
|
|
256
|
+
"excess of its objective vector over the front of "
|
|
257
|
+
"that population, run the unchanged bounded "
|
|
258
|
+
"dual-archive retention over the proximal head "
|
|
259
|
+
"for the unreserved slots and over the distal "
|
|
260
|
+
"remainder for the floored slots, then merge; "
|
|
261
|
+
"unanchored parents take the population median"
|
|
262
|
+
),
|
|
263
|
+
"outcomes_consulted": [
|
|
264
|
+
"evaluated_parent_objective_vector",
|
|
265
|
+
"quality_archive_membership",
|
|
266
|
+
"earned_positive_lineage",
|
|
267
|
+
],
|
|
268
|
+
"forbidden_fields": [
|
|
269
|
+
"workload_id",
|
|
270
|
+
"model_id",
|
|
271
|
+
"provider_id",
|
|
272
|
+
"metric_id",
|
|
273
|
+
],
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
def _split_slots(self, maximum_parents: int) -> tuple[int, int]:
|
|
279
|
+
"""Unreserved proximal slots and the floored distal reservation."""
|
|
280
|
+
|
|
281
|
+
reserved = max(
|
|
282
|
+
self.config.minimum_far_front_parents,
|
|
283
|
+
int(math.floor(self.config.far_front_floor * maximum_parents)),
|
|
284
|
+
)
|
|
285
|
+
reserved = min(reserved, maximum_parents - 1)
|
|
286
|
+
return maximum_parents - reserved, reserved
|
|
287
|
+
|
|
288
|
+
def proximity_order(
|
|
289
|
+
self,
|
|
290
|
+
excesses: tuple[ParentAnchorExcess, ...],
|
|
291
|
+
) -> tuple[CandidateId, ...]:
|
|
292
|
+
"""Parents ordered nearest-front first.
|
|
293
|
+
|
|
294
|
+
Ties break on the candidate id so the order is deterministic and
|
|
295
|
+
cannot depend on the order candidates were supplied in.
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
return tuple(
|
|
299
|
+
value.candidate_id
|
|
300
|
+
for value in sorted(
|
|
301
|
+
excesses,
|
|
302
|
+
key=lambda value: (value.excess, value.candidate_id.value),
|
|
303
|
+
)
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
def partition(
|
|
307
|
+
self,
|
|
308
|
+
excesses: tuple[ParentAnchorExcess, ...],
|
|
309
|
+
) -> tuple[tuple[CandidateId, ...], tuple[CandidateId, ...]]:
|
|
310
|
+
"""Proximal head and distal remainder, best excess first."""
|
|
311
|
+
|
|
312
|
+
order = self.proximity_order(excesses)
|
|
313
|
+
head_size = max(
|
|
314
|
+
1,
|
|
315
|
+
min(
|
|
316
|
+
len(order),
|
|
317
|
+
int(
|
|
318
|
+
math.ceil(
|
|
319
|
+
self.config.proximity_concentration * len(order)
|
|
320
|
+
)
|
|
321
|
+
),
|
|
322
|
+
),
|
|
323
|
+
)
|
|
324
|
+
return order[:head_size], order[head_size:]
|
|
325
|
+
|
|
326
|
+
def select(
|
|
327
|
+
self,
|
|
328
|
+
candidates: tuple[ReachabilityCandidate, ...],
|
|
329
|
+
anchors: dict[CandidateId, ObjectivePoint],
|
|
330
|
+
metric_ids: tuple[str, ...],
|
|
331
|
+
) -> ResidualReachabilityBasis:
|
|
332
|
+
"""The front-proximal basis over ``candidates``.
|
|
333
|
+
|
|
334
|
+
Reduces to :func:`select_residual_reachability_basis` exactly when the
|
|
335
|
+
concentration is 1.0 or when no parent carries an anchor.
|
|
336
|
+
"""
|
|
337
|
+
|
|
338
|
+
if type(candidates) is not tuple or not candidates:
|
|
339
|
+
raise ValueError("candidates must be a non-empty exact tuple")
|
|
340
|
+
excesses = parent_anchor_excesses(candidates, anchors, metric_ids)
|
|
341
|
+
if self.config.proximity_concentration >= 1.0 or not any(
|
|
342
|
+
value.anchored for value in excesses
|
|
343
|
+
):
|
|
344
|
+
return select_residual_reachability_basis(
|
|
345
|
+
candidates, self.inner_policy
|
|
346
|
+
)
|
|
347
|
+
by_id = {value.candidate_id: value for value in candidates}
|
|
348
|
+
proximal_ids, distal_ids = self.partition(excesses)
|
|
349
|
+
proximal_slots, distal_slots = self._split_slots(
|
|
350
|
+
self.inner_policy.maximum_parents
|
|
351
|
+
)
|
|
352
|
+
# Slots the proximal head cannot use spill OUTWARD in proximity
|
|
353
|
+
# order rather than back to the unrestricted population, so a
|
|
354
|
+
# tighter concentration can never move the basis away from the
|
|
355
|
+
# front. The reserved floor is measured against the ORIGINAL
|
|
356
|
+
# partition, so growing the head never eats the reservation.
|
|
357
|
+
head = self.proximity_order(excesses)[
|
|
358
|
+
: max(len(proximal_ids), proximal_slots)
|
|
359
|
+
]
|
|
360
|
+
members = dict(self._sub_basis(by_id, head, proximal_slots))
|
|
361
|
+
for candidate_id, member in self._sub_basis(
|
|
362
|
+
by_id, distal_ids, distal_slots
|
|
363
|
+
):
|
|
364
|
+
members.setdefault(candidate_id, member)
|
|
365
|
+
if len(members) < self.inner_policy.maximum_parents:
|
|
366
|
+
# Either side of the partition can be smaller than its slot
|
|
367
|
+
# allowance. Top up from the UNRESTRICTED basis so the
|
|
368
|
+
# restriction can never yield fewer parents than the policy
|
|
369
|
+
# would have retained on its own.
|
|
370
|
+
for candidate_id, member in self._sub_basis(
|
|
371
|
+
by_id,
|
|
372
|
+
tuple(sorted(by_id, key=lambda value: value.value)),
|
|
373
|
+
self.inner_policy.maximum_parents,
|
|
374
|
+
):
|
|
375
|
+
if len(members) >= self.inner_policy.maximum_parents:
|
|
376
|
+
break
|
|
377
|
+
members.setdefault(candidate_id, member)
|
|
378
|
+
return ResidualReachabilityBasis(
|
|
379
|
+
policy_definition_sha256=self.inner_policy.definition_sha256,
|
|
380
|
+
source_candidate_count=len(candidates),
|
|
381
|
+
members=tuple(
|
|
382
|
+
members[key] for key in sorted(members, key=lambda v: v.value)
|
|
383
|
+
),
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
def _sub_basis(
|
|
387
|
+
self,
|
|
388
|
+
by_id: dict[CandidateId, ReachabilityCandidate],
|
|
389
|
+
candidate_ids: tuple[CandidateId, ...],
|
|
390
|
+
slots: int,
|
|
391
|
+
):
|
|
392
|
+
"""Run the unchanged inner policy over one side of the partition."""
|
|
393
|
+
|
|
394
|
+
if not candidate_ids or slots <= 0:
|
|
395
|
+
return ()
|
|
396
|
+
capped = min(slots, len(candidate_ids))
|
|
397
|
+
policy = ResidualReachabilityBasisPolicy(
|
|
398
|
+
maximum_parents=capped,
|
|
399
|
+
maximum_quality_archive_parents=min(
|
|
400
|
+
self.inner_policy.maximum_quality_archive_parents, capped
|
|
401
|
+
),
|
|
402
|
+
maximum_initial_design_parents=min(
|
|
403
|
+
self.inner_policy.maximum_initial_design_parents, capped
|
|
404
|
+
),
|
|
405
|
+
maximum_earned_lineage_parents=min(
|
|
406
|
+
self.inner_policy.maximum_earned_lineage_parents, capped
|
|
407
|
+
),
|
|
408
|
+
maximum_structural_cover_parents=min(
|
|
409
|
+
self.inner_policy.maximum_structural_cover_parents, capped
|
|
410
|
+
),
|
|
411
|
+
policy_id=self.inner_policy.policy_id,
|
|
412
|
+
policy_version=self.inner_policy.policy_version,
|
|
413
|
+
)
|
|
414
|
+
basis = select_residual_reachability_basis(
|
|
415
|
+
tuple(by_id[value] for value in candidate_ids), policy
|
|
416
|
+
)
|
|
417
|
+
return tuple(
|
|
418
|
+
(member.candidate.candidate_id, member)
|
|
419
|
+
for member in basis.members
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
def evidence_record(
|
|
423
|
+
self,
|
|
424
|
+
candidates: tuple[ReachabilityCandidate, ...],
|
|
425
|
+
anchors: dict[CandidateId, ObjectivePoint],
|
|
426
|
+
metric_ids: tuple[str, ...],
|
|
427
|
+
) -> dict[str, object]:
|
|
428
|
+
"""Outcome-blind record of what the restriction did, for receipts."""
|
|
429
|
+
|
|
430
|
+
excesses = parent_anchor_excesses(candidates, anchors, metric_ids)
|
|
431
|
+
proximal_ids, distal_ids = self.partition(excesses)
|
|
432
|
+
proximal_slots, distal_slots = self._split_slots(
|
|
433
|
+
self.inner_policy.maximum_parents
|
|
434
|
+
)
|
|
435
|
+
anchored = tuple(value for value in excesses if value.anchored)
|
|
436
|
+
return {
|
|
437
|
+
"policy_id": self.policy_id,
|
|
438
|
+
"version": FRONT_PROXIMITY_PARENT_BASIS_VERSION,
|
|
439
|
+
"definition_sha256": self.definition_sha256,
|
|
440
|
+
"config": self.config.to_record(),
|
|
441
|
+
"source_parent_count": len(candidates),
|
|
442
|
+
"anchored_parent_count": len(anchored),
|
|
443
|
+
"proximal_pool_size": len(proximal_ids),
|
|
444
|
+
"distal_pool_size": len(distal_ids),
|
|
445
|
+
"unreserved_proximal_slots": proximal_slots,
|
|
446
|
+
"reserved_distal_slots": distal_slots,
|
|
447
|
+
"excesses": [value.to_record() for value in excesses],
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
__all__ = [
|
|
452
|
+
"FRONT_PROXIMITY_PARENT_BASIS_ID",
|
|
453
|
+
"FRONT_PROXIMITY_PARENT_BASIS_VERSION",
|
|
454
|
+
"FrontProximityParentBasis",
|
|
455
|
+
"FrontProximityParentBasisConfig",
|
|
456
|
+
"ParentAnchorExcess",
|
|
457
|
+
"parent_anchor_excesses",
|
|
458
|
+
]
|