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,473 @@
|
|
|
1
|
+
"""Coordinated, workload-neutral target allocation over affine Pareto geometry.
|
|
2
|
+
|
|
3
|
+
The policy is intentionally prospective. It sees only the frozen archive and
|
|
4
|
+
already-evaluated parents. It converts the reference directions exposed by the
|
|
5
|
+
authenticated affine frontier projector into distinct lane-level opportunities
|
|
6
|
+
using an augmented weighted-Chebyshev achievement scalar. Evaluator outcomes
|
|
7
|
+
from the current or future wave, model/provider metadata, action names, and
|
|
8
|
+
workload identifiers are outside the interface.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import math
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from itertools import permutations
|
|
17
|
+
|
|
18
|
+
from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
|
|
19
|
+
from agent_evolve.policies.selection.affine_frontier_context import (
|
|
20
|
+
AuthenticatedAffineFrontierContextProjector,
|
|
21
|
+
)
|
|
22
|
+
from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
ALLOCATOR_ID = "affine_frontier_opportunity_target"
|
|
26
|
+
ALLOCATOR_VERSION = 1
|
|
27
|
+
ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
|
|
28
|
+
b"agent-evolve:affine-frontier-opportunity-target:v1;"
|
|
29
|
+
b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
|
|
30
|
+
b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
|
|
31
|
+
b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
|
|
32
|
+
b"opportunity=nonnegative-distance-from-normalized-ideal;"
|
|
33
|
+
b"direction-selection=descending-opportunity-distinct-before-cycle;"
|
|
34
|
+
b"lane-matching=greedy-min-parent-achievement;"
|
|
35
|
+
b"current-future-outcomes=false;workload-model-provider-action-fields=false"
|
|
36
|
+
).hexdigest()
|
|
37
|
+
DIRECTION_COVERED_ALLOCATOR_ID = "direction_covered_affine_frontier_target"
|
|
38
|
+
DIRECTION_COVERED_ALLOCATOR_VERSION = 2
|
|
39
|
+
DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
|
|
40
|
+
b"agent-evolve:direction-covered-affine-frontier-target:v2;"
|
|
41
|
+
b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
|
|
42
|
+
b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
|
|
43
|
+
b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
|
|
44
|
+
b"opportunity=nonnegative-distance-from-normalized-ideal;"
|
|
45
|
+
b"direction-selection=canonical-phase-stratified-coverage-before-repeat;"
|
|
46
|
+
b"coverage-phase=portfolio-wave-index-derived-from-generation;"
|
|
47
|
+
b"lane-matching=greedy-min-parent-achievement;"
|
|
48
|
+
b"current-future-outcomes=false;workload-model-provider-action-fields=false;"
|
|
49
|
+
b"legacy-opportunity-target-unchanged=true"
|
|
50
|
+
).hexdigest()
|
|
51
|
+
GLOBALLY_MATCHED_ALLOCATOR_ID = "globally_matched_direction_covered_frontier_target"
|
|
52
|
+
GLOBALLY_MATCHED_ALLOCATOR_VERSION = 3
|
|
53
|
+
GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256 = hashlib.sha256(
|
|
54
|
+
b"agent-evolve:globally-matched-direction-covered-frontier-target:v3;"
|
|
55
|
+
b"input=frozen-affine-archive-cutoff,selected-evaluated-parent-lanes;"
|
|
56
|
+
b"geometry=authenticated-normalized-lower-is-better-reference-directions;"
|
|
57
|
+
b"achievement=normalized-weight-augmented-chebyshev-rho-0.05;"
|
|
58
|
+
b"opportunity=nonnegative-distance-from-normalized-ideal;"
|
|
59
|
+
b"direction-selection=canonical-phase-stratified-coverage-before-repeat;"
|
|
60
|
+
b"coverage-phase=portfolio-wave-index-derived-from-generation;"
|
|
61
|
+
b"lane-matching=exact-global-minimum-total-parent-achievement;"
|
|
62
|
+
b"ties=canonical-lane-permutation;"
|
|
63
|
+
b"current-future-outcomes=false;workload-model-provider-action-fields=false;"
|
|
64
|
+
b"legacy-allocators-unchanged=true"
|
|
65
|
+
).hexdigest()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _object(value: dict[str, object]) -> FrozenJsonObject:
|
|
69
|
+
result = freeze_json(value)
|
|
70
|
+
if type(result) is not FrozenJsonObject: # pragma: no cover - closed root.
|
|
71
|
+
raise AssertionError("frontier target payload did not freeze to an object")
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _finite_decimal(value: object, *, name: str) -> float:
|
|
76
|
+
if type(value) is not str:
|
|
77
|
+
raise TypeError(f"{name} must be decimal text")
|
|
78
|
+
result = float(value)
|
|
79
|
+
if not math.isfinite(result):
|
|
80
|
+
raise ValueError(f"{name} must be finite")
|
|
81
|
+
return result
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _decimal(value: float) -> str:
|
|
85
|
+
if not math.isfinite(value):
|
|
86
|
+
raise ValueError("frontier target cannot render a non-finite value")
|
|
87
|
+
normalized = 0.0 if value == 0.0 else value
|
|
88
|
+
return format(normalized, ".17g")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _achievement(point: tuple[float, ...], weights: tuple[float, ...]) -> float:
|
|
92
|
+
active = tuple(
|
|
93
|
+
(value, weight)
|
|
94
|
+
for value, weight in zip(point, weights, strict=True)
|
|
95
|
+
if weight > 0
|
|
96
|
+
)
|
|
97
|
+
if not active:
|
|
98
|
+
raise ValueError("frontier target direction must activate an axis")
|
|
99
|
+
maximum = max(weight * value for value, weight in active)
|
|
100
|
+
weighted_mean = sum(weight * value for value, weight in active) / sum(
|
|
101
|
+
weight for _, weight in active
|
|
102
|
+
)
|
|
103
|
+
return maximum + 0.05 * weighted_mean
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@dataclass(frozen=True, slots=True)
|
|
107
|
+
class AuthenticatedAffineFrontierTargetAllocator:
|
|
108
|
+
"""Coordinate lane targets without benchmark-specific knowledge."""
|
|
109
|
+
|
|
110
|
+
allocator_id: str = ALLOCATOR_ID
|
|
111
|
+
allocator_version: int = ALLOCATOR_VERSION
|
|
112
|
+
definition_sha256: str = ALLOCATOR_DEFINITION_SHA256
|
|
113
|
+
|
|
114
|
+
def __post_init__(self) -> None:
|
|
115
|
+
if (
|
|
116
|
+
self.allocator_id != ALLOCATOR_ID
|
|
117
|
+
or self.allocator_version != ALLOCATOR_VERSION
|
|
118
|
+
or self.definition_sha256 != ALLOCATOR_DEFINITION_SHA256
|
|
119
|
+
):
|
|
120
|
+
raise ValueError("affine frontier target allocator identity drifted")
|
|
121
|
+
|
|
122
|
+
def _select_directions(
|
|
123
|
+
self,
|
|
124
|
+
directions: tuple[dict[str, object], ...],
|
|
125
|
+
*,
|
|
126
|
+
lane_count: int,
|
|
127
|
+
generation: int,
|
|
128
|
+
) -> tuple[dict[str, object], ...]:
|
|
129
|
+
del generation
|
|
130
|
+
return tuple(
|
|
131
|
+
directions[index % len(directions)] for index in range(lane_count)
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
def _match_directions_to_parents(
|
|
135
|
+
self,
|
|
136
|
+
*,
|
|
137
|
+
selected: tuple[dict[str, object], ...],
|
|
138
|
+
parents: dict[str, tuple[object, tuple[float, ...]]],
|
|
139
|
+
) -> tuple[tuple[str, object, tuple[float, ...], dict[str, object]], ...]:
|
|
140
|
+
"""Preserve the version-1 greedy matching law for replay stability."""
|
|
141
|
+
|
|
142
|
+
assignments: list[
|
|
143
|
+
tuple[str, object, tuple[float, ...], dict[str, object]]
|
|
144
|
+
] = []
|
|
145
|
+
remaining = dict(parents)
|
|
146
|
+
for direction in selected:
|
|
147
|
+
weights = direction["weights"]
|
|
148
|
+
assert type(weights) is tuple
|
|
149
|
+
lane_id = min(
|
|
150
|
+
remaining,
|
|
151
|
+
key=lambda value: (
|
|
152
|
+
_achievement(remaining[value][1], weights),
|
|
153
|
+
value,
|
|
154
|
+
),
|
|
155
|
+
)
|
|
156
|
+
parent, point = remaining.pop(lane_id)
|
|
157
|
+
assignments.append((lane_id, parent, point, direction))
|
|
158
|
+
return tuple(assignments)
|
|
159
|
+
|
|
160
|
+
def allocate(self, *, archive_utility, lanes):
|
|
161
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
162
|
+
from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
|
|
163
|
+
|
|
164
|
+
self.__post_init__()
|
|
165
|
+
if type(archive_utility) is not ArchiveUtilitySnapshot:
|
|
166
|
+
raise TypeError("archive_utility must be an exact frozen snapshot")
|
|
167
|
+
ArchiveUtilitySnapshot.__post_init__(archive_utility)
|
|
168
|
+
if type(lanes) is not tuple or not lanes:
|
|
169
|
+
raise ValueError("lanes must be a non-empty exact tuple")
|
|
170
|
+
for lane_id, parent in lanes:
|
|
171
|
+
if type(lane_id) is not str or not lane_id:
|
|
172
|
+
raise ValueError("lane IDs must be non-empty strings")
|
|
173
|
+
if type(parent) is not EvolutionCandidate:
|
|
174
|
+
raise TypeError("lane parents must be exact EvolutionCandidate values")
|
|
175
|
+
EvolutionCandidate.__post_init__(parent)
|
|
176
|
+
if tuple(value[0] for value in lanes) != tuple(
|
|
177
|
+
sorted({value[0] for value in lanes})
|
|
178
|
+
):
|
|
179
|
+
raise ValueError("lanes must be unique and canonical")
|
|
180
|
+
|
|
181
|
+
projector = AuthenticatedAffineFrontierContextProjector()
|
|
182
|
+
projected = tuple(
|
|
183
|
+
(
|
|
184
|
+
lane_id,
|
|
185
|
+
parent,
|
|
186
|
+
projector.project(archive_utility=archive_utility, parent=parent),
|
|
187
|
+
)
|
|
188
|
+
for lane_id, parent in lanes
|
|
189
|
+
)
|
|
190
|
+
payloads = tuple(thaw_json(value.payload) for _, _, value in projected)
|
|
191
|
+
if any(type(value) is not dict for value in payloads):
|
|
192
|
+
raise TypeError("affine frontier projection payload must be an object")
|
|
193
|
+
first = payloads[0]
|
|
194
|
+
frame = first.get("optimization_frame")
|
|
195
|
+
archive = first.get("archive")
|
|
196
|
+
if type(frame) is not dict or type(archive) is not dict:
|
|
197
|
+
raise ValueError("affine frontier projection omitted its geometry")
|
|
198
|
+
raw_points = archive.get("normalized_points_decimal")
|
|
199
|
+
raw_directions = frame.get("reference_directions")
|
|
200
|
+
if type(raw_points) is not list or not raw_points:
|
|
201
|
+
raise ValueError("affine frontier target requires archive points")
|
|
202
|
+
if type(raw_directions) is not list or not raw_directions:
|
|
203
|
+
raise ValueError("affine frontier target requires reference directions")
|
|
204
|
+
dimension = frame.get("dimension")
|
|
205
|
+
if type(dimension) is not int or dimension not in (2, 3):
|
|
206
|
+
raise ValueError("affine frontier target supports exact 2-D or 3-D")
|
|
207
|
+
points = tuple(
|
|
208
|
+
tuple(
|
|
209
|
+
_finite_decimal(cell, name=f"archive[{row_index}][{axis_index}]")
|
|
210
|
+
for axis_index, cell in enumerate(row)
|
|
211
|
+
)
|
|
212
|
+
for row_index, row in enumerate(raw_points)
|
|
213
|
+
if type(row) is list and len(row) == dimension
|
|
214
|
+
)
|
|
215
|
+
if len(points) != len(raw_points):
|
|
216
|
+
raise ValueError("affine archive point dimension is malformed")
|
|
217
|
+
|
|
218
|
+
directions: list[dict[str, object]] = []
|
|
219
|
+
for raw in raw_directions:
|
|
220
|
+
if type(raw) is not dict or type(raw.get("direction_id")) is not str:
|
|
221
|
+
raise ValueError("affine reference direction is malformed")
|
|
222
|
+
raw_weights = raw.get("normalized_importance_decimal")
|
|
223
|
+
if type(raw_weights) is not list or len(raw_weights) != dimension:
|
|
224
|
+
raise ValueError("affine reference-direction dimension is malformed")
|
|
225
|
+
weights = tuple(
|
|
226
|
+
_finite_decimal(value, name="reference_direction_weight")
|
|
227
|
+
for value in raw_weights
|
|
228
|
+
)
|
|
229
|
+
if any(value < 0 for value in weights) or max(weights) <= 0:
|
|
230
|
+
raise ValueError("reference-direction weights must be nonnegative")
|
|
231
|
+
maximum = max(weights)
|
|
232
|
+
comparable = tuple(value / maximum for value in weights)
|
|
233
|
+
archive_best = min(_achievement(point, comparable) for point in points)
|
|
234
|
+
directions.append(
|
|
235
|
+
{
|
|
236
|
+
"direction_id": raw["direction_id"],
|
|
237
|
+
"weights": comparable,
|
|
238
|
+
"archive_best": archive_best,
|
|
239
|
+
"opportunity": max(0.0, archive_best),
|
|
240
|
+
}
|
|
241
|
+
)
|
|
242
|
+
directions.sort(
|
|
243
|
+
key=lambda value: (
|
|
244
|
+
-float(value["opportunity"]),
|
|
245
|
+
str(value["direction_id"]),
|
|
246
|
+
)
|
|
247
|
+
)
|
|
248
|
+
selected = self._select_directions(
|
|
249
|
+
tuple(directions),
|
|
250
|
+
lane_count=len(lanes),
|
|
251
|
+
generation=archive_utility.generation,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
parents: dict[str, tuple[object, tuple[float, ...]]] = {}
|
|
255
|
+
shared_geometry_sha256 = None
|
|
256
|
+
for (lane_id, parent, projection), payload in zip(
|
|
257
|
+
projected, payloads, strict=True
|
|
258
|
+
):
|
|
259
|
+
assert type(payload) is dict
|
|
260
|
+
if (
|
|
261
|
+
payload.get("optimization_frame") != frame
|
|
262
|
+
or payload.get("archive") != archive
|
|
263
|
+
):
|
|
264
|
+
raise ValueError(
|
|
265
|
+
"lane frontier projections disagree on archive geometry"
|
|
266
|
+
)
|
|
267
|
+
parent_record = payload.get("parent")
|
|
268
|
+
if type(parent_record) is not dict:
|
|
269
|
+
raise ValueError("affine frontier projection omitted its parent")
|
|
270
|
+
raw_parent = parent_record.get("normalized_point_decimal")
|
|
271
|
+
if type(raw_parent) is not list or len(raw_parent) != dimension:
|
|
272
|
+
raise ValueError("affine parent point dimension is malformed")
|
|
273
|
+
parents[lane_id] = (
|
|
274
|
+
parent,
|
|
275
|
+
tuple(
|
|
276
|
+
_finite_decimal(value, name="parent_normalized_point")
|
|
277
|
+
for value in raw_parent
|
|
278
|
+
),
|
|
279
|
+
)
|
|
280
|
+
geometry_sha256 = projection.archive_utility_snapshot_sha256
|
|
281
|
+
if shared_geometry_sha256 is None:
|
|
282
|
+
shared_geometry_sha256 = geometry_sha256
|
|
283
|
+
elif shared_geometry_sha256 != geometry_sha256:
|
|
284
|
+
raise ValueError("lane frontier projections use different cutoffs")
|
|
285
|
+
|
|
286
|
+
assignments = self._match_directions_to_parents(
|
|
287
|
+
selected=selected,
|
|
288
|
+
parents=parents,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
rank_by_direction = {
|
|
292
|
+
str(value["direction_id"]): index
|
|
293
|
+
for index, value in enumerate(directions, start=1)
|
|
294
|
+
}
|
|
295
|
+
results = []
|
|
296
|
+
for lane_id, parent, point, direction in assignments:
|
|
297
|
+
weights = direction["weights"]
|
|
298
|
+
assert type(weights) is tuple
|
|
299
|
+
parent_achievement = _achievement(point, weights)
|
|
300
|
+
archive_best = float(direction["archive_best"])
|
|
301
|
+
direction_id = str(direction["direction_id"])
|
|
302
|
+
rank = rank_by_direction[direction_id]
|
|
303
|
+
results.append(
|
|
304
|
+
CampaignPortfolioFrontierTarget(
|
|
305
|
+
allocator_id=self.allocator_id,
|
|
306
|
+
allocator_version=self.allocator_version,
|
|
307
|
+
definition_sha256=self.definition_sha256,
|
|
308
|
+
archive_utility_snapshot_sha256=(archive_utility.snapshot_sha256),
|
|
309
|
+
lane_id=lane_id,
|
|
310
|
+
parent_configuration_sha256=(parent.occurrence.configuration_hash),
|
|
311
|
+
direction_id=direction_id,
|
|
312
|
+
opportunity_rank=rank,
|
|
313
|
+
payload=_object(
|
|
314
|
+
{
|
|
315
|
+
"schema_version": 1,
|
|
316
|
+
"epistemic_cutoff": {
|
|
317
|
+
"generation": archive_utility.generation,
|
|
318
|
+
"archive_utility_snapshot_sha256": (
|
|
319
|
+
archive_utility.snapshot_sha256
|
|
320
|
+
),
|
|
321
|
+
"current_or_future_candidate_outcomes_consulted": False,
|
|
322
|
+
},
|
|
323
|
+
"normalized_orientation": ("lower_is_better_on_every_axis"),
|
|
324
|
+
"target_direction": {
|
|
325
|
+
"direction_id": direction_id,
|
|
326
|
+
"normalized_weights_decimal": [
|
|
327
|
+
_decimal(value) for value in weights
|
|
328
|
+
],
|
|
329
|
+
"opportunity_rank": rank,
|
|
330
|
+
"archive_best_achievement_decimal": _decimal(
|
|
331
|
+
archive_best
|
|
332
|
+
),
|
|
333
|
+
"opportunity_from_ideal_decimal": _decimal(
|
|
334
|
+
float(direction["opportunity"])
|
|
335
|
+
),
|
|
336
|
+
},
|
|
337
|
+
"assigned_parent": {
|
|
338
|
+
"normalized_point_decimal": [
|
|
339
|
+
_decimal(value) for value in point
|
|
340
|
+
],
|
|
341
|
+
"achievement_decimal": _decimal(parent_achievement),
|
|
342
|
+
"regret_above_archive_best_decimal": _decimal(
|
|
343
|
+
max(0.0, parent_achievement - archive_best)
|
|
344
|
+
),
|
|
345
|
+
},
|
|
346
|
+
"acquisition_instruction": {
|
|
347
|
+
"objective": (
|
|
348
|
+
"reduce_the_assigned_augmented_chebyshev_achievement"
|
|
349
|
+
),
|
|
350
|
+
"tradeoffs_can_be_frontier_improving": True,
|
|
351
|
+
"simultaneous_improvement_on_every_axis_required": False,
|
|
352
|
+
"propose_semantically_distinct_finite_actions": True,
|
|
353
|
+
"evaluator_outcomes_remain_unknown": True,
|
|
354
|
+
},
|
|
355
|
+
"achievement_scalar": {
|
|
356
|
+
"kind": "augmented_weighted_chebyshev",
|
|
357
|
+
"rho_decimal": "0.050000000000000003",
|
|
358
|
+
"weights_rescaled_to_max_one": True,
|
|
359
|
+
},
|
|
360
|
+
"workload_identifiers_consulted": False,
|
|
361
|
+
"model_or_provider_fields_consulted": False,
|
|
362
|
+
}
|
|
363
|
+
),
|
|
364
|
+
)
|
|
365
|
+
)
|
|
366
|
+
return tuple(sorted(results, key=lambda value: value.lane_id))
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
@dataclass(frozen=True, slots=True)
|
|
370
|
+
class DirectionCoveredAffineFrontierTargetAllocator(
|
|
371
|
+
AuthenticatedAffineFrontierTargetAllocator
|
|
372
|
+
):
|
|
373
|
+
"""Rotate canonical directions across waves before any direction repeats."""
|
|
374
|
+
|
|
375
|
+
allocator_id: str = DIRECTION_COVERED_ALLOCATOR_ID
|
|
376
|
+
allocator_version: int = DIRECTION_COVERED_ALLOCATOR_VERSION
|
|
377
|
+
definition_sha256: str = DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256
|
|
378
|
+
|
|
379
|
+
def __post_init__(self) -> None:
|
|
380
|
+
if (
|
|
381
|
+
self.allocator_id != DIRECTION_COVERED_ALLOCATOR_ID
|
|
382
|
+
or self.allocator_version != DIRECTION_COVERED_ALLOCATOR_VERSION
|
|
383
|
+
or self.definition_sha256 != DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256
|
|
384
|
+
):
|
|
385
|
+
raise ValueError("direction-covered frontier allocator identity drifted")
|
|
386
|
+
|
|
387
|
+
def _select_directions(
|
|
388
|
+
self,
|
|
389
|
+
directions: tuple[dict[str, object], ...],
|
|
390
|
+
*,
|
|
391
|
+
lane_count: int,
|
|
392
|
+
generation: int,
|
|
393
|
+
) -> tuple[dict[str, object], ...]:
|
|
394
|
+
canonical = tuple(
|
|
395
|
+
sorted(directions, key=lambda value: str(value["direction_id"]))
|
|
396
|
+
)
|
|
397
|
+
portfolio_wave_index = max(0, (generation - 1) // 2)
|
|
398
|
+
offset = (portfolio_wave_index * lane_count) % len(canonical)
|
|
399
|
+
return tuple(
|
|
400
|
+
canonical[(offset + index) % len(canonical)]
|
|
401
|
+
for index in range(lane_count)
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
@dataclass(frozen=True, slots=True)
|
|
406
|
+
class GloballyMatchedDirectionCoveredAffineFrontierTargetAllocator(
|
|
407
|
+
DirectionCoveredAffineFrontierTargetAllocator
|
|
408
|
+
):
|
|
409
|
+
"""Cover directions and solve their lane binding as one exact assignment."""
|
|
410
|
+
|
|
411
|
+
allocator_id: str = GLOBALLY_MATCHED_ALLOCATOR_ID
|
|
412
|
+
allocator_version: int = GLOBALLY_MATCHED_ALLOCATOR_VERSION
|
|
413
|
+
definition_sha256: str = GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256
|
|
414
|
+
|
|
415
|
+
def __post_init__(self) -> None:
|
|
416
|
+
if (
|
|
417
|
+
self.allocator_id != GLOBALLY_MATCHED_ALLOCATOR_ID
|
|
418
|
+
or self.allocator_version != GLOBALLY_MATCHED_ALLOCATOR_VERSION
|
|
419
|
+
or self.definition_sha256 != GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256
|
|
420
|
+
):
|
|
421
|
+
raise ValueError("globally matched frontier allocator identity drifted")
|
|
422
|
+
|
|
423
|
+
def _match_directions_to_parents(
|
|
424
|
+
self,
|
|
425
|
+
*,
|
|
426
|
+
selected: tuple[dict[str, object], ...],
|
|
427
|
+
parents: dict[str, tuple[object, tuple[float, ...]]],
|
|
428
|
+
) -> tuple[tuple[str, object, tuple[float, ...], dict[str, object]], ...]:
|
|
429
|
+
if len(selected) != len(parents):
|
|
430
|
+
raise ValueError("global frontier matching requires equal cardinality")
|
|
431
|
+
lane_ids = tuple(sorted(parents))
|
|
432
|
+
# Campaign lane counts are intentionally small. Exact enumeration is
|
|
433
|
+
# preferable here: it is dependency-free, deterministic, and leaves an
|
|
434
|
+
# auditable optimum rather than another greedy repair boundary.
|
|
435
|
+
best = min(
|
|
436
|
+
permutations(lane_ids),
|
|
437
|
+
key=lambda assignment: (
|
|
438
|
+
sum(
|
|
439
|
+
_achievement(parents[lane_id][1], direction["weights"])
|
|
440
|
+
for lane_id, direction in zip(
|
|
441
|
+
assignment,
|
|
442
|
+
selected,
|
|
443
|
+
strict=True,
|
|
444
|
+
)
|
|
445
|
+
),
|
|
446
|
+
assignment,
|
|
447
|
+
),
|
|
448
|
+
)
|
|
449
|
+
return tuple(
|
|
450
|
+
(
|
|
451
|
+
lane_id,
|
|
452
|
+
parents[lane_id][0],
|
|
453
|
+
parents[lane_id][1],
|
|
454
|
+
direction,
|
|
455
|
+
)
|
|
456
|
+
for lane_id, direction in zip(best, selected, strict=True)
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
__all__ = [
|
|
461
|
+
"ALLOCATOR_DEFINITION_SHA256",
|
|
462
|
+
"ALLOCATOR_ID",
|
|
463
|
+
"ALLOCATOR_VERSION",
|
|
464
|
+
"AuthenticatedAffineFrontierTargetAllocator",
|
|
465
|
+
"DIRECTION_COVERED_ALLOCATOR_DEFINITION_SHA256",
|
|
466
|
+
"DIRECTION_COVERED_ALLOCATOR_ID",
|
|
467
|
+
"DIRECTION_COVERED_ALLOCATOR_VERSION",
|
|
468
|
+
"DirectionCoveredAffineFrontierTargetAllocator",
|
|
469
|
+
"GLOBALLY_MATCHED_ALLOCATOR_DEFINITION_SHA256",
|
|
470
|
+
"GLOBALLY_MATCHED_ALLOCATOR_ID",
|
|
471
|
+
"GLOBALLY_MATCHED_ALLOCATOR_VERSION",
|
|
472
|
+
"GloballyMatchedDirectionCoveredAffineFrontierTargetAllocator",
|
|
473
|
+
]
|