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,453 @@
|
|
|
1
|
+
"""Geometry-conditional seat elasticity for pilot lane allocation (R3).
|
|
2
|
+
|
|
3
|
+
Defects D2/D6 (jul28 pareto defect theory): the pilot's fixed per-lane
|
|
4
|
+
coverage floor spends seats on lanes whose archive state makes them
|
|
5
|
+
structurally dead (numerical proposals re-deriving a saturated archive:
|
|
6
|
+
0/16 positives; coverage lanes whose parents sit >=0.25 normalized off the
|
|
7
|
+
front: 0/13), while the lane holding the positives is under-seated (V70:
|
|
8
|
+
83% of positives, 1/6 seats). The conditioning variable is archive state,
|
|
9
|
+
not lane identity, so this module replaces the fixed floor with elastic
|
|
10
|
+
per-lane seat bids computed from three state features the receipts already
|
|
11
|
+
expose:
|
|
12
|
+
|
|
13
|
+
* parent distance-to-front of the lane's proposals (outcome-blind,
|
|
14
|
+
additive-epsilon in the normalized objective frame);
|
|
15
|
+
* archive saturation, the lane's predicted self-overlap: the fraction of
|
|
16
|
+
its proposals whose central forecast lands inside the currently
|
|
17
|
+
dominated region (outcome-blind; lanes without forecasts stay at the
|
|
18
|
+
neutral prior); and
|
|
19
|
+
* the lane's conversion posterior over outcomes revealed BEFORE the seat
|
|
20
|
+
(Beta shrinkage toward the global revealed posterior).
|
|
21
|
+
|
|
22
|
+
Seats follow a D'Hondt walk over the bids (bid divided by seats already
|
|
23
|
+
awarded plus one), so far-front, saturated lanes bid low and concede seats
|
|
24
|
+
while a global exploration floor keeps every lane's bid strictly positive;
|
|
25
|
+
the within-engine seat design (band schedule, blocked randomization,
|
|
26
|
+
epsilon-uniform floor, exact rational propensities) is delegated unchanged
|
|
27
|
+
to the existing sequential adaptive pilot. Composition is config-gated in
|
|
28
|
+
``v9_candidate_policy``; no existing module is modified. The policy knows
|
|
29
|
+
no workload, objective name, model, provider, or prompt.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import hashlib
|
|
35
|
+
import json
|
|
36
|
+
import math
|
|
37
|
+
import re
|
|
38
|
+
from dataclasses import dataclass, field
|
|
39
|
+
|
|
40
|
+
from agent_evolve.application.calibrated_positive_gain_opportunity import (
|
|
41
|
+
_beta_posterior_mean,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_ID = (
|
|
45
|
+
"geometry_conditional_elasticity"
|
|
46
|
+
)
|
|
47
|
+
GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_VERSION = 1
|
|
48
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
49
|
+
_DEFINITION_DOMAIN = (
|
|
50
|
+
b"agent-evolve:geometry-conditional-elasticity-definition:v1\x00"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _canonical_json(value: object) -> bytes:
|
|
55
|
+
return json.dumps(
|
|
56
|
+
value,
|
|
57
|
+
allow_nan=False,
|
|
58
|
+
ensure_ascii=True,
|
|
59
|
+
separators=(",", ":"),
|
|
60
|
+
sort_keys=True,
|
|
61
|
+
).encode("ascii", errors="strict")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
65
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _require_token(value: str, *, name: str) -> None:
|
|
69
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
70
|
+
raise ValueError(f"{name} must use the closed token grammar")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True, slots=True)
|
|
74
|
+
class ElasticSeatConfig:
|
|
75
|
+
"""All R3 constants; every float is an exact dyadic value."""
|
|
76
|
+
|
|
77
|
+
exploration_floor_bid: float = 0.0625
|
|
78
|
+
distance_weight: float = 4.0
|
|
79
|
+
saturation_weight: float = 1.0
|
|
80
|
+
|
|
81
|
+
def __post_init__(self) -> None:
|
|
82
|
+
if (
|
|
83
|
+
type(self.exploration_floor_bid) is not float
|
|
84
|
+
or not math.isfinite(self.exploration_floor_bid)
|
|
85
|
+
or not 0.0 < self.exploration_floor_bid <= 1.0
|
|
86
|
+
):
|
|
87
|
+
raise ValueError(
|
|
88
|
+
"exploration_floor_bid must lie in (0, 1]"
|
|
89
|
+
)
|
|
90
|
+
if (
|
|
91
|
+
type(self.distance_weight) is not float
|
|
92
|
+
or not math.isfinite(self.distance_weight)
|
|
93
|
+
or self.distance_weight < 0.0
|
|
94
|
+
):
|
|
95
|
+
raise ValueError(
|
|
96
|
+
"distance_weight must be finite and non-negative"
|
|
97
|
+
)
|
|
98
|
+
if (
|
|
99
|
+
type(self.saturation_weight) is not float
|
|
100
|
+
or not math.isfinite(self.saturation_weight)
|
|
101
|
+
or not 0.0 <= self.saturation_weight <= 1.0
|
|
102
|
+
):
|
|
103
|
+
raise ValueError(
|
|
104
|
+
"saturation_weight must lie in [0, 1]"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def to_record(self) -> dict[str, object]:
|
|
108
|
+
self.__post_init__()
|
|
109
|
+
return {
|
|
110
|
+
"exploration_floor_bid_hex": (
|
|
111
|
+
self.exploration_floor_bid.hex()
|
|
112
|
+
),
|
|
113
|
+
"distance_weight_hex": self.distance_weight.hex(),
|
|
114
|
+
"saturation_weight_hex": self.saturation_weight.hex(),
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass(frozen=True, slots=True)
|
|
119
|
+
class LaneGeometryEvidence:
|
|
120
|
+
"""Outcome-blind and prequential state features of one lane.
|
|
121
|
+
|
|
122
|
+
``parent_front_distances`` are additive-epsilon distances of the
|
|
123
|
+
lane's proposals' parents behind the current front (empty when the
|
|
124
|
+
lane records no parents). ``predicted_dominated`` flags, one per
|
|
125
|
+
proposal carrying a forecast, are True when the central forecast
|
|
126
|
+
point adds zero archive gain (the lane re-derives the dominated
|
|
127
|
+
region). ``revealed_positive`` holds the positivity of the lane's
|
|
128
|
+
outcomes revealed strictly before the current seat.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
engine_id: str
|
|
132
|
+
parent_front_distances: tuple[float, ...] = ()
|
|
133
|
+
predicted_dominated: tuple[bool, ...] = ()
|
|
134
|
+
revealed_positive: tuple[bool, ...] = ()
|
|
135
|
+
|
|
136
|
+
def __post_init__(self) -> None:
|
|
137
|
+
_require_token(self.engine_id, name="engine_id")
|
|
138
|
+
if type(self.parent_front_distances) is not tuple or any(
|
|
139
|
+
type(value) is not float
|
|
140
|
+
or not math.isfinite(value)
|
|
141
|
+
or value < 0.0
|
|
142
|
+
for value in self.parent_front_distances
|
|
143
|
+
):
|
|
144
|
+
raise ValueError(
|
|
145
|
+
"parent_front_distances must be finite non-negative "
|
|
146
|
+
"exact floats"
|
|
147
|
+
)
|
|
148
|
+
for name in ("predicted_dominated", "revealed_positive"):
|
|
149
|
+
values = getattr(self, name)
|
|
150
|
+
if type(values) is not tuple or any(
|
|
151
|
+
type(value) is not bool for value in values
|
|
152
|
+
):
|
|
153
|
+
raise TypeError(f"{name} must contain exact booleans")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@dataclass(frozen=True, slots=True)
|
|
157
|
+
class LaneSeatBid:
|
|
158
|
+
"""One lane's elastic seat bid with its feature decomposition."""
|
|
159
|
+
|
|
160
|
+
engine_id: str
|
|
161
|
+
conversion_posterior: float
|
|
162
|
+
saturation_posterior: float
|
|
163
|
+
mean_parent_front_distance: float | None
|
|
164
|
+
distance_factor: float
|
|
165
|
+
bid: float
|
|
166
|
+
floored: bool
|
|
167
|
+
|
|
168
|
+
def __post_init__(self) -> None:
|
|
169
|
+
_require_token(self.engine_id, name="engine_id")
|
|
170
|
+
for name in (
|
|
171
|
+
"conversion_posterior",
|
|
172
|
+
"saturation_posterior",
|
|
173
|
+
):
|
|
174
|
+
value = getattr(self, name)
|
|
175
|
+
if (
|
|
176
|
+
type(value) is not float
|
|
177
|
+
or not math.isfinite(value)
|
|
178
|
+
or not 0.0 <= value <= 1.0
|
|
179
|
+
):
|
|
180
|
+
raise ValueError(f"{name} must lie in [0, 1]")
|
|
181
|
+
if self.mean_parent_front_distance is not None and (
|
|
182
|
+
type(self.mean_parent_front_distance) is not float
|
|
183
|
+
or not math.isfinite(self.mean_parent_front_distance)
|
|
184
|
+
or self.mean_parent_front_distance < 0.0
|
|
185
|
+
):
|
|
186
|
+
raise ValueError(
|
|
187
|
+
"mean_parent_front_distance must be finite and "
|
|
188
|
+
"non-negative or None"
|
|
189
|
+
)
|
|
190
|
+
for name in ("distance_factor", "bid"):
|
|
191
|
+
value = getattr(self, name)
|
|
192
|
+
if (
|
|
193
|
+
type(value) is not float
|
|
194
|
+
or not math.isfinite(value)
|
|
195
|
+
or value <= 0.0
|
|
196
|
+
):
|
|
197
|
+
raise ValueError(f"{name} must be strictly positive")
|
|
198
|
+
if type(self.floored) is not bool:
|
|
199
|
+
raise TypeError("floored must be exact")
|
|
200
|
+
|
|
201
|
+
def to_record(self) -> dict[str, object]:
|
|
202
|
+
self.__post_init__()
|
|
203
|
+
return {
|
|
204
|
+
"engine_id": self.engine_id,
|
|
205
|
+
"conversion_posterior_hex": (
|
|
206
|
+
self.conversion_posterior.hex()
|
|
207
|
+
),
|
|
208
|
+
"saturation_posterior_hex": (
|
|
209
|
+
self.saturation_posterior.hex()
|
|
210
|
+
),
|
|
211
|
+
"mean_parent_front_distance_hex": (
|
|
212
|
+
None
|
|
213
|
+
if self.mean_parent_front_distance is None
|
|
214
|
+
else self.mean_parent_front_distance.hex()
|
|
215
|
+
),
|
|
216
|
+
"distance_factor_hex": self.distance_factor.hex(),
|
|
217
|
+
"bid_hex": self.bid.hex(),
|
|
218
|
+
"floored": self.floored,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@dataclass(frozen=True, slots=True)
|
|
223
|
+
class ElasticSeatBidder:
|
|
224
|
+
"""Compute elastic lane bids and walk seats by D'Hondt over them."""
|
|
225
|
+
|
|
226
|
+
config: ElasticSeatConfig = ElasticSeatConfig()
|
|
227
|
+
prior_strength: float = 2.0
|
|
228
|
+
root_prior_probability: float = 0.5
|
|
229
|
+
policy_id: str = GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_ID
|
|
230
|
+
policy_version: int = (
|
|
231
|
+
GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_VERSION
|
|
232
|
+
)
|
|
233
|
+
definition_sha256: str = field(init=False)
|
|
234
|
+
|
|
235
|
+
def __post_init__(self) -> None:
|
|
236
|
+
if type(self.config) is not ElasticSeatConfig:
|
|
237
|
+
raise TypeError("config must be exact")
|
|
238
|
+
self.config.__post_init__()
|
|
239
|
+
if (
|
|
240
|
+
type(self.prior_strength) is not float
|
|
241
|
+
or not math.isfinite(self.prior_strength)
|
|
242
|
+
or self.prior_strength <= 0.0
|
|
243
|
+
):
|
|
244
|
+
raise ValueError("prior_strength must be positive")
|
|
245
|
+
if (
|
|
246
|
+
type(self.root_prior_probability) is not float
|
|
247
|
+
or not math.isfinite(self.root_prior_probability)
|
|
248
|
+
or not 0.0 < self.root_prior_probability < 1.0
|
|
249
|
+
):
|
|
250
|
+
raise ValueError(
|
|
251
|
+
"root_prior_probability must lie in (0, 1)"
|
|
252
|
+
)
|
|
253
|
+
_require_token(self.policy_id, name="policy_id")
|
|
254
|
+
if (
|
|
255
|
+
self.policy_id != GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_ID
|
|
256
|
+
or self.policy_version
|
|
257
|
+
!= GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_VERSION
|
|
258
|
+
):
|
|
259
|
+
raise ValueError("policy identity is immutable")
|
|
260
|
+
object.__setattr__(
|
|
261
|
+
self,
|
|
262
|
+
"definition_sha256",
|
|
263
|
+
_hash(
|
|
264
|
+
_DEFINITION_DOMAIN,
|
|
265
|
+
{
|
|
266
|
+
"schema_version": 1,
|
|
267
|
+
"policy_id": self.policy_id,
|
|
268
|
+
"policy_version": self.policy_version,
|
|
269
|
+
"config": self.config.to_record(),
|
|
270
|
+
"prior_strength_hex": self.prior_strength.hex(),
|
|
271
|
+
"root_prior_probability_hex": (
|
|
272
|
+
self.root_prior_probability.hex()
|
|
273
|
+
),
|
|
274
|
+
"bid": (
|
|
275
|
+
"conversion_posterior_times_exp_neg_weighted_"
|
|
276
|
+
"mean_parent_front_distance_times_one_minus_"
|
|
277
|
+
"weighted_saturation_floored"
|
|
278
|
+
),
|
|
279
|
+
"conversion_evidence": (
|
|
280
|
+
"revealed_lane_positivity_beta_shrunk_toward_"
|
|
281
|
+
"global_revealed_posterior"
|
|
282
|
+
),
|
|
283
|
+
"saturation_evidence": (
|
|
284
|
+
"outcome_blind_central_forecast_self_overlap_"
|
|
285
|
+
"per_lane_beta_from_root_prior_no_cross_lane_"
|
|
286
|
+
"pooling"
|
|
287
|
+
),
|
|
288
|
+
"seat_walk": (
|
|
289
|
+
"dhondt_bid_over_awarded_plus_one_tie_break_"
|
|
290
|
+
"ascending_engine_id"
|
|
291
|
+
),
|
|
292
|
+
"fixed_per_lane_coverage_floor": False,
|
|
293
|
+
"global_exploration_floor": (
|
|
294
|
+
"strictly_positive_bid_floor_plus_unchanged_"
|
|
295
|
+
"within_engine_epsilon_uniform_propensities"
|
|
296
|
+
),
|
|
297
|
+
"campaign_level_unexposed_lane_diagnostic_seat": (
|
|
298
|
+
"out_of_scope_for_market_level_composition"
|
|
299
|
+
),
|
|
300
|
+
"future_outcomes_visible": False,
|
|
301
|
+
"workload_objective_model_provider_prompt_branches": (
|
|
302
|
+
False
|
|
303
|
+
),
|
|
304
|
+
},
|
|
305
|
+
),
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def _posterior(
|
|
309
|
+
self,
|
|
310
|
+
*,
|
|
311
|
+
prior_mean: float,
|
|
312
|
+
successes: float,
|
|
313
|
+
failures: float,
|
|
314
|
+
) -> float:
|
|
315
|
+
return _beta_posterior_mean(
|
|
316
|
+
prior_mean=prior_mean,
|
|
317
|
+
prior_strength=self.prior_strength,
|
|
318
|
+
successes=successes,
|
|
319
|
+
failures=failures,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
def lane_bids(
|
|
323
|
+
self,
|
|
324
|
+
lanes: tuple[LaneGeometryEvidence, ...],
|
|
325
|
+
) -> tuple[LaneSeatBid, ...]:
|
|
326
|
+
"""Elastic bids for every lane, in ascending engine order."""
|
|
327
|
+
|
|
328
|
+
self.__post_init__()
|
|
329
|
+
if type(lanes) is not tuple or not lanes:
|
|
330
|
+
raise ValueError("lanes must be a non-empty exact tuple")
|
|
331
|
+
engine_ids = []
|
|
332
|
+
for value in lanes:
|
|
333
|
+
if type(value) is not LaneGeometryEvidence:
|
|
334
|
+
raise TypeError(
|
|
335
|
+
"lanes must contain exact lane evidence"
|
|
336
|
+
)
|
|
337
|
+
value.__post_init__()
|
|
338
|
+
engine_ids.append(value.engine_id)
|
|
339
|
+
if len(engine_ids) != len(set(engine_ids)):
|
|
340
|
+
raise ValueError("lane engines repeat")
|
|
341
|
+
global_revealed = [
|
|
342
|
+
positive
|
|
343
|
+
for value in lanes
|
|
344
|
+
for positive in value.revealed_positive
|
|
345
|
+
]
|
|
346
|
+
global_conversion = self._posterior(
|
|
347
|
+
prior_mean=self.root_prior_probability,
|
|
348
|
+
successes=float(sum(global_revealed)),
|
|
349
|
+
failures=float(
|
|
350
|
+
len(global_revealed) - sum(global_revealed)
|
|
351
|
+
),
|
|
352
|
+
)
|
|
353
|
+
bids: list[LaneSeatBid] = []
|
|
354
|
+
for lane in sorted(lanes, key=lambda value: value.engine_id):
|
|
355
|
+
conversion = self._posterior(
|
|
356
|
+
prior_mean=global_conversion,
|
|
357
|
+
successes=float(sum(lane.revealed_positive)),
|
|
358
|
+
failures=float(
|
|
359
|
+
len(lane.revealed_positive)
|
|
360
|
+
- sum(lane.revealed_positive)
|
|
361
|
+
),
|
|
362
|
+
)
|
|
363
|
+
# Saturation is a lane SELF-overlap feature: a lane without
|
|
364
|
+
# forecast evidence stays at the neutral root prior instead
|
|
365
|
+
# of inheriting another lane's saturation.
|
|
366
|
+
saturation = self._posterior(
|
|
367
|
+
prior_mean=self.root_prior_probability,
|
|
368
|
+
successes=float(sum(lane.predicted_dominated)),
|
|
369
|
+
failures=float(
|
|
370
|
+
len(lane.predicted_dominated)
|
|
371
|
+
- sum(lane.predicted_dominated)
|
|
372
|
+
),
|
|
373
|
+
)
|
|
374
|
+
if lane.parent_front_distances:
|
|
375
|
+
mean_distance: float | None = float(
|
|
376
|
+
math.fsum(lane.parent_front_distances)
|
|
377
|
+
/ len(lane.parent_front_distances)
|
|
378
|
+
)
|
|
379
|
+
distance_factor = math.exp(
|
|
380
|
+
-self.config.distance_weight * mean_distance
|
|
381
|
+
)
|
|
382
|
+
else:
|
|
383
|
+
mean_distance = None
|
|
384
|
+
distance_factor = 1.0
|
|
385
|
+
raw = (
|
|
386
|
+
conversion
|
|
387
|
+
* distance_factor
|
|
388
|
+
* (
|
|
389
|
+
1.0
|
|
390
|
+
- self.config.saturation_weight * saturation
|
|
391
|
+
)
|
|
392
|
+
)
|
|
393
|
+
floored = raw < self.config.exploration_floor_bid
|
|
394
|
+
bids.append(
|
|
395
|
+
LaneSeatBid(
|
|
396
|
+
engine_id=lane.engine_id,
|
|
397
|
+
conversion_posterior=float(conversion),
|
|
398
|
+
saturation_posterior=float(saturation),
|
|
399
|
+
mean_parent_front_distance=mean_distance,
|
|
400
|
+
distance_factor=float(distance_factor),
|
|
401
|
+
bid=float(
|
|
402
|
+
max(raw, self.config.exploration_floor_bid)
|
|
403
|
+
),
|
|
404
|
+
floored=floored,
|
|
405
|
+
)
|
|
406
|
+
)
|
|
407
|
+
return tuple(bids)
|
|
408
|
+
|
|
409
|
+
@staticmethod
|
|
410
|
+
def choose_engine(
|
|
411
|
+
*,
|
|
412
|
+
bids: tuple[LaneSeatBid, ...],
|
|
413
|
+
seats_awarded: dict[str, int],
|
|
414
|
+
open_engine_ids: frozenset[str],
|
|
415
|
+
) -> str:
|
|
416
|
+
"""One D'Hondt step over the elastic bids.
|
|
417
|
+
|
|
418
|
+
The winning lane maximizes ``bid / (seats_awarded + 1)`` among
|
|
419
|
+
lanes that still hold a remaining candidate; exact ties break by
|
|
420
|
+
ascending engine id. This REPLACES the fixed coverage floor: a
|
|
421
|
+
lane earns its early seats through its bid, never through mere
|
|
422
|
+
membership.
|
|
423
|
+
"""
|
|
424
|
+
|
|
425
|
+
if type(bids) is not tuple or not bids:
|
|
426
|
+
raise ValueError("bids must be a non-empty exact tuple")
|
|
427
|
+
open_bids = [
|
|
428
|
+
value
|
|
429
|
+
for value in bids
|
|
430
|
+
if value.engine_id in open_engine_ids
|
|
431
|
+
]
|
|
432
|
+
if not open_bids:
|
|
433
|
+
raise ValueError("no open engine holds a remaining candidate")
|
|
434
|
+
return min(
|
|
435
|
+
open_bids,
|
|
436
|
+
key=lambda value: (
|
|
437
|
+
-(
|
|
438
|
+
value.bid
|
|
439
|
+
/ (seats_awarded.get(value.engine_id, 0) + 1)
|
|
440
|
+
),
|
|
441
|
+
value.engine_id,
|
|
442
|
+
),
|
|
443
|
+
).engine_id
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
__all__ = [
|
|
447
|
+
"GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_ID",
|
|
448
|
+
"GEOMETRY_CONDITIONAL_ELASTICITY_POLICY_VERSION",
|
|
449
|
+
"ElasticSeatBidder",
|
|
450
|
+
"ElasticSeatConfig",
|
|
451
|
+
"LaneGeometryEvidence",
|
|
452
|
+
"LaneSeatBid",
|
|
453
|
+
]
|