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,772 @@
|
|
|
1
|
+
"""Outcome-blind factorial pilots for heterogeneous proposal branches.
|
|
2
|
+
|
|
3
|
+
Protecting only a generator branch is insufficient when useful proposals can
|
|
4
|
+
occur in different evolutionary roles and at different positions in an
|
|
5
|
+
uncalibrated within-expert ordering. This module constructs a diagnostic
|
|
6
|
+
pilot over portable, pre-evaluation factors:
|
|
7
|
+
|
|
8
|
+
* an opaque source branch supplied by the composition root;
|
|
9
|
+
* the proposal expert and evolutionary role;
|
|
10
|
+
* a quantile layer of the materialized within-expert rank;
|
|
11
|
+
* parent lineage and operator identity; and
|
|
12
|
+
* exact phenotype identity and normalized evaluation cost.
|
|
13
|
+
|
|
14
|
+
The bounded design never observes candidate outcomes, workload identity,
|
|
15
|
+
model/provider names, objective values, prompts, or configuration contents.
|
|
16
|
+
It returns an allocation requirement; the ordinary outcome-adaptive broker
|
|
17
|
+
continues to fill every unprotected evaluation seat.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from collections import Counter
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
import math
|
|
27
|
+
from typing import Iterable
|
|
28
|
+
|
|
29
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
30
|
+
MaterializedActionAllocationRequirement,
|
|
31
|
+
MaterializedActionDescriptor,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.application.protected_branch_pilot import (
|
|
34
|
+
ProtectedBranchBinding,
|
|
35
|
+
)
|
|
36
|
+
from agent_evolve.application.residual_portfolio_evolution import (
|
|
37
|
+
MaterializedActionProposalBatch,
|
|
38
|
+
ResidualPortfolioDecisionRequest,
|
|
39
|
+
)
|
|
40
|
+
from agent_evolve.domain.patch import require_sha256
|
|
41
|
+
from agent_evolve.domain.typed_json import freeze_json
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
FACTORIAL_BRANCH_PILOT_POLICY_ID = "factorial_branch_pilot"
|
|
45
|
+
FACTORIAL_BRANCH_PILOT_POLICY_VERSION = 1
|
|
46
|
+
_DEFINITION_DOMAIN = b"agent-evolve:factorial-branch-pilot-definition:v1\x00"
|
|
47
|
+
_SELECTION_DOMAIN = b"agent-evolve:factorial-branch-pilot-selection:v1\x00"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _canonical_json(value: object) -> bytes:
|
|
51
|
+
return json.dumps(
|
|
52
|
+
value,
|
|
53
|
+
allow_nan=False,
|
|
54
|
+
ensure_ascii=True,
|
|
55
|
+
separators=(",", ":"),
|
|
56
|
+
sort_keys=True,
|
|
57
|
+
).encode("ascii", errors="strict")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _digest(value: object, *, domain: bytes) -> str:
|
|
61
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass(frozen=True, slots=True)
|
|
65
|
+
class FactorialPilotCandidate:
|
|
66
|
+
"""Portable pre-evaluation view of one materialized proposal."""
|
|
67
|
+
|
|
68
|
+
action_sha256: str
|
|
69
|
+
phenotype_identity_sha256: str
|
|
70
|
+
branch_id: str
|
|
71
|
+
expert_id: str
|
|
72
|
+
role_id: str
|
|
73
|
+
operator_id: str
|
|
74
|
+
materialized_lane_rank: int
|
|
75
|
+
lane_support_count: int
|
|
76
|
+
rank_layer_index: int
|
|
77
|
+
parent_ids: tuple[str, ...]
|
|
78
|
+
normalized_evaluation_cost: float
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
require_sha256(self.action_sha256, "action_sha256")
|
|
82
|
+
require_sha256(
|
|
83
|
+
self.phenotype_identity_sha256,
|
|
84
|
+
"phenotype_identity_sha256",
|
|
85
|
+
)
|
|
86
|
+
for name in ("branch_id", "expert_id", "role_id", "operator_id"):
|
|
87
|
+
value = getattr(self, name)
|
|
88
|
+
if type(value) is not str or not value:
|
|
89
|
+
raise ValueError(f"{name} must be a non-empty exact string")
|
|
90
|
+
for name in ("materialized_lane_rank", "lane_support_count"):
|
|
91
|
+
value = getattr(self, name)
|
|
92
|
+
if type(value) is not int or value <= 0:
|
|
93
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
94
|
+
if self.materialized_lane_rank > self.lane_support_count:
|
|
95
|
+
raise ValueError("materialized lane rank exceeds lane support")
|
|
96
|
+
if (
|
|
97
|
+
type(self.rank_layer_index) is not int
|
|
98
|
+
or self.rank_layer_index < 0
|
|
99
|
+
):
|
|
100
|
+
raise ValueError("rank_layer_index must be a non-negative integer")
|
|
101
|
+
if (
|
|
102
|
+
type(self.parent_ids) is not tuple
|
|
103
|
+
or len(self.parent_ids) > 8
|
|
104
|
+
or len(self.parent_ids) != len(set(self.parent_ids))
|
|
105
|
+
or any(type(value) is not str or not value for value in self.parent_ids)
|
|
106
|
+
):
|
|
107
|
+
raise ValueError("parent_ids must be a unique exact string tuple")
|
|
108
|
+
if (
|
|
109
|
+
type(self.normalized_evaluation_cost) is not float
|
|
110
|
+
or not math.isfinite(self.normalized_evaluation_cost)
|
|
111
|
+
or not 0.0 <= self.normalized_evaluation_cost <= 1.0
|
|
112
|
+
):
|
|
113
|
+
raise ValueError(
|
|
114
|
+
"normalized_evaluation_cost must be a finite float in [0, 1]"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def to_record(self) -> dict[str, object]:
|
|
118
|
+
self.__post_init__()
|
|
119
|
+
return {
|
|
120
|
+
"action_sha256": self.action_sha256,
|
|
121
|
+
"phenotype_identity_sha256": self.phenotype_identity_sha256,
|
|
122
|
+
"branch_id": self.branch_id,
|
|
123
|
+
"expert_id": self.expert_id,
|
|
124
|
+
"role_id": self.role_id,
|
|
125
|
+
"operator_id": self.operator_id,
|
|
126
|
+
"materialized_lane_rank": self.materialized_lane_rank,
|
|
127
|
+
"lane_support_count": self.lane_support_count,
|
|
128
|
+
"rank_layer_index": self.rank_layer_index,
|
|
129
|
+
"parent_ids": list(self.parent_ids),
|
|
130
|
+
"normalized_evaluation_cost_hex": (
|
|
131
|
+
self.normalized_evaluation_cost.hex()
|
|
132
|
+
),
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@dataclass(frozen=True, slots=True)
|
|
137
|
+
class FactorialPilotSelection:
|
|
138
|
+
"""One deterministic bounded factorial design."""
|
|
139
|
+
|
|
140
|
+
selected: tuple[FactorialPilotCandidate, ...]
|
|
141
|
+
branch_quotas: tuple[tuple[str, int], ...]
|
|
142
|
+
rank_layer_count: int
|
|
143
|
+
beam_width: int
|
|
144
|
+
decision_scope_sha256: str
|
|
145
|
+
decision_index: int
|
|
146
|
+
anchor_action_sha256s: tuple[str, ...] = ()
|
|
147
|
+
selection_sha256: str = field(init=False)
|
|
148
|
+
|
|
149
|
+
def __post_init__(self) -> None:
|
|
150
|
+
if type(self.selected) is not tuple or not self.selected:
|
|
151
|
+
raise ValueError("selected must be a non-empty exact tuple")
|
|
152
|
+
for value in self.selected:
|
|
153
|
+
if type(value) is not FactorialPilotCandidate:
|
|
154
|
+
raise TypeError(
|
|
155
|
+
"selected must contain exact FactorialPilotCandidate values"
|
|
156
|
+
)
|
|
157
|
+
value.__post_init__()
|
|
158
|
+
require_sha256(self.decision_scope_sha256, "decision_scope_sha256")
|
|
159
|
+
if type(self.decision_index) is not int or self.decision_index <= 0:
|
|
160
|
+
raise ValueError("decision_index must be a positive exact integer")
|
|
161
|
+
if (
|
|
162
|
+
type(self.rank_layer_count) is not int
|
|
163
|
+
or self.rank_layer_count < 2
|
|
164
|
+
):
|
|
165
|
+
raise ValueError("rank_layer_count must be at least two")
|
|
166
|
+
if type(self.beam_width) is not int or self.beam_width <= 0:
|
|
167
|
+
raise ValueError("beam_width must be a positive exact integer")
|
|
168
|
+
if (
|
|
169
|
+
type(self.branch_quotas) is not tuple
|
|
170
|
+
or not self.branch_quotas
|
|
171
|
+
or tuple(value[0] for value in self.branch_quotas)
|
|
172
|
+
!= tuple(sorted({value[0] for value in self.branch_quotas}))
|
|
173
|
+
or any(
|
|
174
|
+
type(branch_id) is not str
|
|
175
|
+
or not branch_id
|
|
176
|
+
or type(quota) is not int
|
|
177
|
+
or quota <= 0
|
|
178
|
+
for branch_id, quota in self.branch_quotas
|
|
179
|
+
)
|
|
180
|
+
):
|
|
181
|
+
raise ValueError("branch_quotas must be positive and canonical")
|
|
182
|
+
expected = dict(self.branch_quotas)
|
|
183
|
+
observed = Counter(value.branch_id for value in self.selected)
|
|
184
|
+
if observed != expected:
|
|
185
|
+
raise ValueError("selected candidates do not close branch quotas")
|
|
186
|
+
if len(
|
|
187
|
+
{value.phenotype_identity_sha256 for value in self.selected}
|
|
188
|
+
) != len(self.selected):
|
|
189
|
+
raise ValueError("selected candidates must have unique phenotypes")
|
|
190
|
+
if any(
|
|
191
|
+
not 0 <= value.rank_layer_index < self.rank_layer_count
|
|
192
|
+
for value in self.selected
|
|
193
|
+
):
|
|
194
|
+
raise ValueError("selected rank layer lies outside the design")
|
|
195
|
+
if (
|
|
196
|
+
type(self.anchor_action_sha256s) is not tuple
|
|
197
|
+
or self.anchor_action_sha256s
|
|
198
|
+
!= tuple(sorted(set(self.anchor_action_sha256s)))
|
|
199
|
+
or not set(self.anchor_action_sha256s)
|
|
200
|
+
<= {value.action_sha256 for value in self.selected}
|
|
201
|
+
):
|
|
202
|
+
raise ValueError(
|
|
203
|
+
"anchor_action_sha256s must be a canonical selected subset"
|
|
204
|
+
)
|
|
205
|
+
for value in self.anchor_action_sha256s:
|
|
206
|
+
require_sha256(value, "anchor_action_sha256s")
|
|
207
|
+
object.__setattr__(
|
|
208
|
+
self,
|
|
209
|
+
"selection_sha256",
|
|
210
|
+
_digest(self._unsigned_record(), domain=_SELECTION_DOMAIN),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
def _coverage_record(self) -> dict[str, object]:
|
|
214
|
+
values = self.selected
|
|
215
|
+
return {
|
|
216
|
+
"branch_count": len({value.branch_id for value in values}),
|
|
217
|
+
"expert_count": len({value.expert_id for value in values}),
|
|
218
|
+
"role_count": len({value.role_id for value in values}),
|
|
219
|
+
"rank_layer_count": len(
|
|
220
|
+
{value.rank_layer_index for value in values}
|
|
221
|
+
),
|
|
222
|
+
"operator_count": len({value.operator_id for value in values}),
|
|
223
|
+
"parent_count": len(
|
|
224
|
+
{parent for value in values for parent in value.parent_ids}
|
|
225
|
+
),
|
|
226
|
+
"branch_role_cell_count": len(
|
|
227
|
+
{(value.branch_id, value.role_id) for value in values}
|
|
228
|
+
),
|
|
229
|
+
"branch_rank_layer_cell_count": len(
|
|
230
|
+
{
|
|
231
|
+
(value.branch_id, value.rank_layer_index)
|
|
232
|
+
for value in values
|
|
233
|
+
}
|
|
234
|
+
),
|
|
235
|
+
"role_rank_layer_cell_count": len(
|
|
236
|
+
{
|
|
237
|
+
(value.role_id, value.rank_layer_index)
|
|
238
|
+
for value in values
|
|
239
|
+
}
|
|
240
|
+
),
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
244
|
+
return {
|
|
245
|
+
"schema_version": 1,
|
|
246
|
+
"decision_scope_sha256": self.decision_scope_sha256,
|
|
247
|
+
"decision_index": self.decision_index,
|
|
248
|
+
"branch_quotas": [
|
|
249
|
+
{"branch_id": branch_id, "pilot_slots": quota}
|
|
250
|
+
for branch_id, quota in self.branch_quotas
|
|
251
|
+
],
|
|
252
|
+
"rank_layer_count": self.rank_layer_count,
|
|
253
|
+
"beam_width": self.beam_width,
|
|
254
|
+
"anchor_action_sha256s": list(self.anchor_action_sha256s),
|
|
255
|
+
"selected": [value.to_record() for value in self.selected],
|
|
256
|
+
"coverage": self._coverage_record(),
|
|
257
|
+
"candidate_outcomes_observed": False,
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
def to_record(self) -> dict[str, object]:
|
|
261
|
+
self.__post_init__()
|
|
262
|
+
return {
|
|
263
|
+
**self._unsigned_record(),
|
|
264
|
+
"selection_sha256": self.selection_sha256,
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def factorial_candidates_from_materialized_actions(
|
|
269
|
+
actions: Iterable[MaterializedActionDescriptor],
|
|
270
|
+
*,
|
|
271
|
+
branch_bindings: tuple[ProtectedBranchBinding, ...],
|
|
272
|
+
rank_layer_count: int,
|
|
273
|
+
) -> tuple[FactorialPilotCandidate, ...]:
|
|
274
|
+
"""Project materialized actions into quantile-layered factor candidates."""
|
|
275
|
+
|
|
276
|
+
if (
|
|
277
|
+
type(branch_bindings) is not tuple
|
|
278
|
+
or len(branch_bindings) < 2
|
|
279
|
+
or any(type(value) is not ProtectedBranchBinding for value in branch_bindings)
|
|
280
|
+
):
|
|
281
|
+
raise TypeError("branch_bindings must contain at least two bindings")
|
|
282
|
+
for value in branch_bindings:
|
|
283
|
+
value.__post_init__()
|
|
284
|
+
if type(rank_layer_count) is not int or rank_layer_count < 2:
|
|
285
|
+
raise ValueError("rank_layer_count must be at least two")
|
|
286
|
+
expert_to_branch: dict[str, str] = {}
|
|
287
|
+
for binding in branch_bindings:
|
|
288
|
+
for expert_id in binding.expert_ids:
|
|
289
|
+
if expert_id in expert_to_branch:
|
|
290
|
+
raise ValueError("one expert cannot belong to two branches")
|
|
291
|
+
expert_to_branch[expert_id] = binding.branch_id
|
|
292
|
+
|
|
293
|
+
values = tuple(actions)
|
|
294
|
+
if not values:
|
|
295
|
+
raise ValueError("actions must be non-empty")
|
|
296
|
+
for value in values:
|
|
297
|
+
if type(value) is not MaterializedActionDescriptor:
|
|
298
|
+
raise TypeError("actions must contain exact descriptors")
|
|
299
|
+
value.__post_init__()
|
|
300
|
+
if len({value.action_sha256 for value in values}) != len(values):
|
|
301
|
+
raise ValueError("actions repeat an action identity")
|
|
302
|
+
|
|
303
|
+
lanes: dict[str, list[MaterializedActionDescriptor]] = {}
|
|
304
|
+
for value in values:
|
|
305
|
+
if value.expert_id in expert_to_branch:
|
|
306
|
+
lanes.setdefault(value.expert_id, []).append(value)
|
|
307
|
+
absent = set(expert_to_branch) - set(lanes)
|
|
308
|
+
if absent:
|
|
309
|
+
raise ValueError(
|
|
310
|
+
"protected branch names absent proposal experts: "
|
|
311
|
+
+ ",".join(sorted(absent))
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
projected: list[FactorialPilotCandidate] = []
|
|
315
|
+
for expert_id, lane_values in sorted(lanes.items()):
|
|
316
|
+
lane = tuple(
|
|
317
|
+
sorted(
|
|
318
|
+
lane_values,
|
|
319
|
+
key=lambda value: (value.native_rank, value.action_sha256),
|
|
320
|
+
)
|
|
321
|
+
)
|
|
322
|
+
for position, value in enumerate(lane):
|
|
323
|
+
layer = min(
|
|
324
|
+
rank_layer_count - 1,
|
|
325
|
+
(position * rank_layer_count) // len(lane),
|
|
326
|
+
)
|
|
327
|
+
projected.append(
|
|
328
|
+
FactorialPilotCandidate(
|
|
329
|
+
action_sha256=value.action_sha256,
|
|
330
|
+
phenotype_identity_sha256=(
|
|
331
|
+
value.phenotype_identity_sha256
|
|
332
|
+
),
|
|
333
|
+
branch_id=expert_to_branch[expert_id],
|
|
334
|
+
expert_id=expert_id,
|
|
335
|
+
role_id=value.role_id,
|
|
336
|
+
operator_id=value.operator_id,
|
|
337
|
+
materialized_lane_rank=position + 1,
|
|
338
|
+
lane_support_count=len(lane),
|
|
339
|
+
rank_layer_index=layer,
|
|
340
|
+
parent_ids=tuple(parent.value for parent in value.parent_ids),
|
|
341
|
+
normalized_evaluation_cost=(
|
|
342
|
+
value.normalized_evaluation_cost
|
|
343
|
+
),
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
|
+
return tuple(
|
|
347
|
+
sorted(projected, key=lambda value: value.action_sha256)
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def _design_rank_key(
|
|
352
|
+
selected: tuple[FactorialPilotCandidate, ...],
|
|
353
|
+
*,
|
|
354
|
+
decision_scope_sha256: str,
|
|
355
|
+
decision_index: int,
|
|
356
|
+
) -> tuple[object, ...]:
|
|
357
|
+
"""Return an ascending key for a high-coverage, balanced design."""
|
|
358
|
+
|
|
359
|
+
branch_role = {(value.branch_id, value.role_id) for value in selected}
|
|
360
|
+
branch_layer = {
|
|
361
|
+
(value.branch_id, value.rank_layer_index) for value in selected
|
|
362
|
+
}
|
|
363
|
+
role_layer = {
|
|
364
|
+
(value.role_id, value.rank_layer_index) for value in selected
|
|
365
|
+
}
|
|
366
|
+
role_counts = Counter(value.role_id for value in selected)
|
|
367
|
+
layer_counts = Counter(value.rank_layer_index for value in selected)
|
|
368
|
+
parents = {parent for value in selected for parent in value.parent_ids}
|
|
369
|
+
normalized_rank_depth = math.fsum(
|
|
370
|
+
(
|
|
371
|
+
(value.materialized_lane_rank - 1)
|
|
372
|
+
/ (value.lane_support_count - 1)
|
|
373
|
+
if value.lane_support_count > 1
|
|
374
|
+
else 0.0
|
|
375
|
+
)
|
|
376
|
+
for value in selected
|
|
377
|
+
)
|
|
378
|
+
tie_sha = _digest(
|
|
379
|
+
{
|
|
380
|
+
"decision_scope_sha256": decision_scope_sha256,
|
|
381
|
+
"decision_index": decision_index,
|
|
382
|
+
"selected_action_sha256s": sorted(
|
|
383
|
+
value.action_sha256 for value in selected
|
|
384
|
+
),
|
|
385
|
+
},
|
|
386
|
+
domain=_SELECTION_DOMAIN,
|
|
387
|
+
)
|
|
388
|
+
return (
|
|
389
|
+
-len(branch_role),
|
|
390
|
+
-len(branch_layer),
|
|
391
|
+
-len(role_layer),
|
|
392
|
+
-len({value.expert_id for value in selected}),
|
|
393
|
+
-len({value.rank_layer_index for value in selected}),
|
|
394
|
+
-len(parents),
|
|
395
|
+
-len({value.operator_id for value in selected}),
|
|
396
|
+
-normalized_rank_depth,
|
|
397
|
+
sum(value * value for value in role_counts.values()),
|
|
398
|
+
sum(value * value for value in layer_counts.values()),
|
|
399
|
+
math.fsum(value.normalized_evaluation_cost for value in selected),
|
|
400
|
+
tie_sha,
|
|
401
|
+
tuple(sorted(value.action_sha256 for value in selected)),
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
def select_factorial_pilot_candidates(
|
|
406
|
+
candidates: tuple[FactorialPilotCandidate, ...],
|
|
407
|
+
*,
|
|
408
|
+
branch_quotas: tuple[tuple[str, int], ...],
|
|
409
|
+
rank_layer_count: int,
|
|
410
|
+
beam_width: int,
|
|
411
|
+
decision_scope_sha256: str,
|
|
412
|
+
decision_index: int,
|
|
413
|
+
anchor_action_sha256s: tuple[str, ...] = (),
|
|
414
|
+
) -> FactorialPilotSelection:
|
|
415
|
+
"""Select or extend a deterministic factorial pilot under exact quotas."""
|
|
416
|
+
|
|
417
|
+
require_sha256(decision_scope_sha256, "decision_scope_sha256")
|
|
418
|
+
if type(decision_index) is not int or decision_index <= 0:
|
|
419
|
+
raise ValueError("decision_index must be a positive exact integer")
|
|
420
|
+
if type(candidates) is not tuple or not candidates:
|
|
421
|
+
raise ValueError("candidates must be a non-empty exact tuple")
|
|
422
|
+
for value in candidates:
|
|
423
|
+
if type(value) is not FactorialPilotCandidate:
|
|
424
|
+
raise TypeError("candidates must contain exact candidate views")
|
|
425
|
+
value.__post_init__()
|
|
426
|
+
if len({value.action_sha256 for value in candidates}) != len(candidates):
|
|
427
|
+
raise ValueError("candidate action identities must be unique")
|
|
428
|
+
if (
|
|
429
|
+
type(branch_quotas) is not tuple
|
|
430
|
+
or not branch_quotas
|
|
431
|
+
or tuple(value[0] for value in branch_quotas)
|
|
432
|
+
!= tuple(sorted({value[0] for value in branch_quotas}))
|
|
433
|
+
or any(
|
|
434
|
+
type(branch_id) is not str
|
|
435
|
+
or not branch_id
|
|
436
|
+
or type(quota) is not int
|
|
437
|
+
or quota <= 0
|
|
438
|
+
for branch_id, quota in branch_quotas
|
|
439
|
+
)
|
|
440
|
+
):
|
|
441
|
+
raise ValueError("branch_quotas must be positive and canonical")
|
|
442
|
+
if type(rank_layer_count) is not int or rank_layer_count < 2:
|
|
443
|
+
raise ValueError("rank_layer_count must be at least two")
|
|
444
|
+
if type(beam_width) is not int or beam_width <= 0:
|
|
445
|
+
raise ValueError("beam_width must be a positive exact integer")
|
|
446
|
+
quota_by_branch = dict(branch_quotas)
|
|
447
|
+
candidate_branches = {value.branch_id for value in candidates}
|
|
448
|
+
if candidate_branches != set(quota_by_branch):
|
|
449
|
+
raise ValueError("candidate and quota branch sets must match exactly")
|
|
450
|
+
for branch_id, quota in branch_quotas:
|
|
451
|
+
unique = {
|
|
452
|
+
value.phenotype_identity_sha256
|
|
453
|
+
for value in candidates
|
|
454
|
+
if value.branch_id == branch_id
|
|
455
|
+
}
|
|
456
|
+
if len(unique) < quota:
|
|
457
|
+
raise ValueError(
|
|
458
|
+
f"branch {branch_id} lacks a phenotype-unique quota witness"
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
if (
|
|
462
|
+
type(anchor_action_sha256s) is not tuple
|
|
463
|
+
or anchor_action_sha256s
|
|
464
|
+
!= tuple(sorted(set(anchor_action_sha256s)))
|
|
465
|
+
):
|
|
466
|
+
raise ValueError("anchor_action_sha256s must be a canonical tuple")
|
|
467
|
+
candidate_by_action = {
|
|
468
|
+
value.action_sha256: value for value in candidates
|
|
469
|
+
}
|
|
470
|
+
if not set(anchor_action_sha256s) <= set(candidate_by_action):
|
|
471
|
+
raise ValueError("factorial pilot anchor is absent from candidates")
|
|
472
|
+
anchors = tuple(
|
|
473
|
+
candidate_by_action[value] for value in anchor_action_sha256s
|
|
474
|
+
)
|
|
475
|
+
if len(
|
|
476
|
+
{value.phenotype_identity_sha256 for value in anchors}
|
|
477
|
+
) != len(anchors):
|
|
478
|
+
raise ValueError("factorial pilot anchors repeat a phenotype")
|
|
479
|
+
anchor_counts = Counter(value.branch_id for value in anchors)
|
|
480
|
+
if any(
|
|
481
|
+
anchor_counts.get(branch_id, 0) > quota
|
|
482
|
+
for branch_id, quota in branch_quotas
|
|
483
|
+
):
|
|
484
|
+
raise ValueError("factorial pilot anchors exceed a branch quota")
|
|
485
|
+
tickets = tuple(
|
|
486
|
+
branch_id
|
|
487
|
+
for ordinal in range(
|
|
488
|
+
max(
|
|
489
|
+
quota_by_branch[branch_id]
|
|
490
|
+
- anchor_counts.get(branch_id, 0)
|
|
491
|
+
for branch_id in quota_by_branch
|
|
492
|
+
)
|
|
493
|
+
)
|
|
494
|
+
for branch_id, quota in branch_quotas
|
|
495
|
+
if ordinal < quota - anchor_counts.get(branch_id, 0)
|
|
496
|
+
)
|
|
497
|
+
beam: tuple[tuple[FactorialPilotCandidate, ...], ...] = (anchors,)
|
|
498
|
+
candidate_order = tuple(
|
|
499
|
+
sorted(candidates, key=lambda value: value.action_sha256)
|
|
500
|
+
)
|
|
501
|
+
for branch_id in tickets:
|
|
502
|
+
expanded: dict[
|
|
503
|
+
tuple[str, ...],
|
|
504
|
+
tuple[FactorialPilotCandidate, ...],
|
|
505
|
+
] = {}
|
|
506
|
+
for state in beam:
|
|
507
|
+
used_actions = {value.action_sha256 for value in state}
|
|
508
|
+
used_phenotypes = {
|
|
509
|
+
value.phenotype_identity_sha256 for value in state
|
|
510
|
+
}
|
|
511
|
+
for candidate in candidate_order:
|
|
512
|
+
if (
|
|
513
|
+
candidate.branch_id != branch_id
|
|
514
|
+
or candidate.action_sha256 in used_actions
|
|
515
|
+
or candidate.phenotype_identity_sha256 in used_phenotypes
|
|
516
|
+
):
|
|
517
|
+
continue
|
|
518
|
+
successor = (*state, candidate)
|
|
519
|
+
key = tuple(
|
|
520
|
+
sorted(value.action_sha256 for value in successor)
|
|
521
|
+
)
|
|
522
|
+
expanded.setdefault(key, successor)
|
|
523
|
+
if not expanded:
|
|
524
|
+
raise ValueError(
|
|
525
|
+
"factorial pilot has no cross-branch unique-phenotype witness"
|
|
526
|
+
)
|
|
527
|
+
beam = tuple(
|
|
528
|
+
sorted(
|
|
529
|
+
expanded.values(),
|
|
530
|
+
key=lambda value: _design_rank_key(
|
|
531
|
+
value,
|
|
532
|
+
decision_scope_sha256=decision_scope_sha256,
|
|
533
|
+
decision_index=decision_index,
|
|
534
|
+
),
|
|
535
|
+
)[:beam_width]
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
selected = min(
|
|
539
|
+
beam,
|
|
540
|
+
key=lambda value: _design_rank_key(
|
|
541
|
+
value,
|
|
542
|
+
decision_scope_sha256=decision_scope_sha256,
|
|
543
|
+
decision_index=decision_index,
|
|
544
|
+
),
|
|
545
|
+
)
|
|
546
|
+
return FactorialPilotSelection(
|
|
547
|
+
selected=selected,
|
|
548
|
+
branch_quotas=branch_quotas,
|
|
549
|
+
rank_layer_count=rank_layer_count,
|
|
550
|
+
beam_width=beam_width,
|
|
551
|
+
decision_scope_sha256=decision_scope_sha256,
|
|
552
|
+
decision_index=decision_index,
|
|
553
|
+
anchor_action_sha256s=anchor_action_sha256s,
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
@dataclass(frozen=True, slots=True)
|
|
558
|
+
class FactorialBranchPilotPolicy:
|
|
559
|
+
"""Reserve a portable factorial diagnostic pilot before adaptation."""
|
|
560
|
+
|
|
561
|
+
branch_bindings: tuple[ProtectedBranchBinding, ...]
|
|
562
|
+
rank_layer_count: int = 3
|
|
563
|
+
beam_width: int = 1024
|
|
564
|
+
policy_id: str = FACTORIAL_BRANCH_PILOT_POLICY_ID
|
|
565
|
+
policy_version: int = FACTORIAL_BRANCH_PILOT_POLICY_VERSION
|
|
566
|
+
definition_sha256: str = field(init=False)
|
|
567
|
+
|
|
568
|
+
def __post_init__(self) -> None:
|
|
569
|
+
if (
|
|
570
|
+
type(self.branch_bindings) is not tuple
|
|
571
|
+
or len(self.branch_bindings) < 2
|
|
572
|
+
or any(
|
|
573
|
+
type(value) is not ProtectedBranchBinding
|
|
574
|
+
for value in self.branch_bindings
|
|
575
|
+
)
|
|
576
|
+
):
|
|
577
|
+
raise TypeError(
|
|
578
|
+
"branch_bindings must contain at least two exact bindings"
|
|
579
|
+
)
|
|
580
|
+
for value in self.branch_bindings:
|
|
581
|
+
value.__post_init__()
|
|
582
|
+
branch_ids = tuple(value.branch_id for value in self.branch_bindings)
|
|
583
|
+
if branch_ids != tuple(sorted(set(branch_ids))):
|
|
584
|
+
raise ValueError("branch bindings must be unique and canonical")
|
|
585
|
+
experts = tuple(
|
|
586
|
+
expert
|
|
587
|
+
for binding in self.branch_bindings
|
|
588
|
+
for expert in binding.expert_ids
|
|
589
|
+
)
|
|
590
|
+
if len(experts) != len(set(experts)):
|
|
591
|
+
raise ValueError("one proposal expert cannot belong to two branches")
|
|
592
|
+
if type(self.rank_layer_count) is not int or self.rank_layer_count < 2:
|
|
593
|
+
raise ValueError("rank_layer_count must be at least two")
|
|
594
|
+
if type(self.beam_width) is not int or self.beam_width <= 0:
|
|
595
|
+
raise ValueError("beam_width must be a positive exact integer")
|
|
596
|
+
if (
|
|
597
|
+
self.policy_id != FACTORIAL_BRANCH_PILOT_POLICY_ID
|
|
598
|
+
or self.policy_version != FACTORIAL_BRANCH_PILOT_POLICY_VERSION
|
|
599
|
+
):
|
|
600
|
+
raise ValueError("factorial branch policy identity is immutable")
|
|
601
|
+
object.__setattr__(
|
|
602
|
+
self,
|
|
603
|
+
"definition_sha256",
|
|
604
|
+
_digest(
|
|
605
|
+
{
|
|
606
|
+
"schema_version": 1,
|
|
607
|
+
"policy_id": self.policy_id,
|
|
608
|
+
"policy_version": self.policy_version,
|
|
609
|
+
"branch_bindings": [
|
|
610
|
+
value.to_record() for value in self.branch_bindings
|
|
611
|
+
],
|
|
612
|
+
"rank_layer_count": self.rank_layer_count,
|
|
613
|
+
"beam_width": self.beam_width,
|
|
614
|
+
"design": (
|
|
615
|
+
"exact-branch-quota-round-robin-bounded-beam;"
|
|
616
|
+
"lexicographic-coverage=branch-role,branch-rank-layer,"
|
|
617
|
+
"role-rank-layer,expert,rank-layer,parent,operator;"
|
|
618
|
+
"tail-sentinel=max-normalized-rank-depth-within-equal-"
|
|
619
|
+
"coverage;balance=role-and-rank-layer;"
|
|
620
|
+
"global-phenotype-unique"
|
|
621
|
+
),
|
|
622
|
+
"rank_semantics": (
|
|
623
|
+
"quantile-layer-of-materialized-within-expert-order"
|
|
624
|
+
),
|
|
625
|
+
"candidate_outcomes_observed": False,
|
|
626
|
+
"interpreted_fields": [
|
|
627
|
+
"branch_binding",
|
|
628
|
+
"expert_id",
|
|
629
|
+
"role_id",
|
|
630
|
+
"operator_id",
|
|
631
|
+
"native_rank_as_materialized_lane_order",
|
|
632
|
+
"parent_ids",
|
|
633
|
+
"phenotype_identity_sha256",
|
|
634
|
+
"normalized_evaluation_cost",
|
|
635
|
+
"action_sha256",
|
|
636
|
+
],
|
|
637
|
+
"forbidden_interpretation": [
|
|
638
|
+
"workload",
|
|
639
|
+
"model",
|
|
640
|
+
"provider",
|
|
641
|
+
"objective",
|
|
642
|
+
"prompt",
|
|
643
|
+
"configuration",
|
|
644
|
+
],
|
|
645
|
+
},
|
|
646
|
+
domain=_DEFINITION_DOMAIN,
|
|
647
|
+
),
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
@staticmethod
|
|
651
|
+
def _validate_cutoff(
|
|
652
|
+
request: ResidualPortfolioDecisionRequest,
|
|
653
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
654
|
+
) -> None:
|
|
655
|
+
if type(request) is not ResidualPortfolioDecisionRequest:
|
|
656
|
+
raise TypeError("request must be an exact residual request")
|
|
657
|
+
request.__post_init__()
|
|
658
|
+
if type(proposals) is not tuple or not proposals:
|
|
659
|
+
raise ValueError("proposals must be a non-empty exact tuple")
|
|
660
|
+
for proposal in proposals:
|
|
661
|
+
if type(proposal) is not MaterializedActionProposalBatch:
|
|
662
|
+
raise TypeError("proposals must contain exact batches")
|
|
663
|
+
proposal.__post_init__()
|
|
664
|
+
proposal.require_request(request)
|
|
665
|
+
expert_ids = tuple(value.expert_id for value in proposals)
|
|
666
|
+
if expert_ids != tuple(sorted(set(expert_ids))):
|
|
667
|
+
raise ValueError("proposal batches must use canonical expert IDs")
|
|
668
|
+
|
|
669
|
+
async def require(
|
|
670
|
+
self,
|
|
671
|
+
request: ResidualPortfolioDecisionRequest,
|
|
672
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
673
|
+
) -> MaterializedActionAllocationRequirement:
|
|
674
|
+
self.__post_init__()
|
|
675
|
+
self._validate_cutoff(request, proposals)
|
|
676
|
+
pilot_slots = sum(
|
|
677
|
+
value.pilot_slots for value in self.branch_bindings
|
|
678
|
+
)
|
|
679
|
+
if pilot_slots > request.evaluation_slots:
|
|
680
|
+
raise ValueError("factorial pilot floors exceed evaluation capacity")
|
|
681
|
+
actions = tuple(
|
|
682
|
+
action for proposal in proposals for action in proposal.actions
|
|
683
|
+
)
|
|
684
|
+
if len({value.action_sha256 for value in actions}) != len(actions):
|
|
685
|
+
raise ValueError("proposal union repeats an action identity")
|
|
686
|
+
unique_market_phenotypes = {
|
|
687
|
+
value.phenotype_identity_sha256 for value in actions
|
|
688
|
+
}
|
|
689
|
+
if len(unique_market_phenotypes) < request.evaluation_slots:
|
|
690
|
+
raise ValueError(
|
|
691
|
+
"sealed proposal market lacks a global unique-phenotype "
|
|
692
|
+
"completion witness"
|
|
693
|
+
)
|
|
694
|
+
candidates = factorial_candidates_from_materialized_actions(
|
|
695
|
+
actions,
|
|
696
|
+
branch_bindings=self.branch_bindings,
|
|
697
|
+
rank_layer_count=self.rank_layer_count,
|
|
698
|
+
)
|
|
699
|
+
selection = select_factorial_pilot_candidates(
|
|
700
|
+
candidates,
|
|
701
|
+
branch_quotas=tuple(
|
|
702
|
+
(value.branch_id, value.pilot_slots)
|
|
703
|
+
for value in self.branch_bindings
|
|
704
|
+
),
|
|
705
|
+
rank_layer_count=self.rank_layer_count,
|
|
706
|
+
beam_width=self.beam_width,
|
|
707
|
+
decision_scope_sha256=request.request_sha256,
|
|
708
|
+
decision_index=request.decision_index,
|
|
709
|
+
)
|
|
710
|
+
selected_phenotypes = {
|
|
711
|
+
value.phenotype_identity_sha256 for value in selection.selected
|
|
712
|
+
}
|
|
713
|
+
residual_seats = request.evaluation_slots - len(selection.selected)
|
|
714
|
+
remaining_unique_phenotypes = (
|
|
715
|
+
unique_market_phenotypes - selected_phenotypes
|
|
716
|
+
)
|
|
717
|
+
if len(remaining_unique_phenotypes) < residual_seats:
|
|
718
|
+
raise ValueError(
|
|
719
|
+
"factorial pilots leave no global phenotype completion witness"
|
|
720
|
+
)
|
|
721
|
+
proposal_sha256s = tuple(
|
|
722
|
+
sorted(value.proposal_sha256 for value in proposals)
|
|
723
|
+
)
|
|
724
|
+
selected_action_sha256s = tuple(
|
|
725
|
+
sorted(value.action_sha256 for value in selection.selected)
|
|
726
|
+
)
|
|
727
|
+
evidence = freeze_json(
|
|
728
|
+
{
|
|
729
|
+
"schema_version": 1,
|
|
730
|
+
"candidate_outcomes_observed": False,
|
|
731
|
+
"residual_request_sha256": request.request_sha256,
|
|
732
|
+
"proposal_sha256s": list(proposal_sha256s),
|
|
733
|
+
"factorial_selection": selection.to_record(),
|
|
734
|
+
"market_capacity_certificate": {
|
|
735
|
+
"evaluation_slots": request.evaluation_slots,
|
|
736
|
+
"action_count": len(actions),
|
|
737
|
+
"unique_phenotype_count": len(unique_market_phenotypes),
|
|
738
|
+
"factorial_pilot_count": len(selection.selected),
|
|
739
|
+
"residual_seats": residual_seats,
|
|
740
|
+
"remaining_unique_phenotype_count": len(
|
|
741
|
+
remaining_unique_phenotypes
|
|
742
|
+
),
|
|
743
|
+
"global_completion_witness": True,
|
|
744
|
+
},
|
|
745
|
+
"ordinary_broker_fills_residual_seats": True,
|
|
746
|
+
"provider_native_rank_available": False,
|
|
747
|
+
"materialized_lane_rank_named_explicitly": True,
|
|
748
|
+
"workload_model_provider_objective_prompt_interpreted": False,
|
|
749
|
+
}
|
|
750
|
+
)
|
|
751
|
+
require_sha256(self.definition_sha256, "definition_sha256")
|
|
752
|
+
return MaterializedActionAllocationRequirement(
|
|
753
|
+
policy_id=self.policy_id,
|
|
754
|
+
policy_version=self.policy_version,
|
|
755
|
+
policy_definition_sha256=self.definition_sha256,
|
|
756
|
+
residual_request_sha256=request.request_sha256,
|
|
757
|
+
proposal_sha256s=proposal_sha256s,
|
|
758
|
+
required_action_sha256s=selected_action_sha256s,
|
|
759
|
+
candidate_outcomes_observed=False,
|
|
760
|
+
evidence=evidence,
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
__all__ = [
|
|
765
|
+
"FACTORIAL_BRANCH_PILOT_POLICY_ID",
|
|
766
|
+
"FACTORIAL_BRANCH_PILOT_POLICY_VERSION",
|
|
767
|
+
"FactorialBranchPilotPolicy",
|
|
768
|
+
"FactorialPilotCandidate",
|
|
769
|
+
"FactorialPilotSelection",
|
|
770
|
+
"factorial_candidates_from_materialized_actions",
|
|
771
|
+
"select_factorial_pilot_candidates",
|
|
772
|
+
]
|