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,193 @@
|
|
|
1
|
+
"""Injected, stateless relations over sealed detailed evaluation evidence."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
from collections.abc import Callable, Sequence
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from enum import Enum
|
|
11
|
+
|
|
12
|
+
from agent_evolve.application.detailed_evaluation import DetailedEvaluation
|
|
13
|
+
from agent_evolve.core.problem import (
|
|
14
|
+
ObjectiveSpec,
|
|
15
|
+
normalize_objective_values,
|
|
16
|
+
validate_objective_specs,
|
|
17
|
+
)
|
|
18
|
+
from agent_evolve.domain.patch import require_sha256
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,95}$")
|
|
22
|
+
_PARETO_DEFINITION_DOMAIN = b"agent-evolve:objective-pareto-relation:v1\x00"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class OutcomeRelation(str, Enum):
|
|
26
|
+
BETTER = "better"
|
|
27
|
+
WORSE = "worse"
|
|
28
|
+
EQUIVALENT = "equivalent"
|
|
29
|
+
INCOMPARABLE = "incomparable"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
OutcomeComparator = Callable[
|
|
33
|
+
[DetailedEvaluation, DetailedEvaluation],
|
|
34
|
+
OutcomeRelation,
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True, slots=True)
|
|
39
|
+
class OutcomeRelationPolicyBinding:
|
|
40
|
+
"""One comparison callable and its immutable published semantics.
|
|
41
|
+
|
|
42
|
+
Archive use requires a deterministic partial order: ``BETTER``/``WORSE``
|
|
43
|
+
are inverse strict relations, ``EQUIVALENT`` is a true transitive
|
|
44
|
+
equivalence relation, and ``INCOMPARABLE`` is symmetric. Resolution bands
|
|
45
|
+
that are not proven transitive should therefore return ``INCOMPARABLE``,
|
|
46
|
+
not ``EQUIVALENT``. Each call verifies determinism and inverse symmetry;
|
|
47
|
+
global transitivity remains a declared policy obligation.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
compare: OutcomeComparator
|
|
51
|
+
policy_id: str
|
|
52
|
+
policy_version: int
|
|
53
|
+
definition_sha256: str
|
|
54
|
+
|
|
55
|
+
def __post_init__(self) -> None:
|
|
56
|
+
if not callable(self.compare):
|
|
57
|
+
raise TypeError("compare must be callable")
|
|
58
|
+
if type(self.policy_id) is not str or _TOKEN.fullmatch(self.policy_id) is None:
|
|
59
|
+
raise ValueError("policy_id must use the closed token grammar")
|
|
60
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
61
|
+
raise ValueError("policy_version must be a positive exact integer")
|
|
62
|
+
require_sha256(self.definition_sha256, "definition_sha256")
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def identity(self) -> tuple[str, int, str]:
|
|
66
|
+
return self.policy_id, self.policy_version, self.definition_sha256
|
|
67
|
+
|
|
68
|
+
def relate(
|
|
69
|
+
self,
|
|
70
|
+
left: DetailedEvaluation,
|
|
71
|
+
right: DetailedEvaluation,
|
|
72
|
+
) -> OutcomeRelation:
|
|
73
|
+
if type(left) is not DetailedEvaluation or type(right) is not DetailedEvaluation:
|
|
74
|
+
raise TypeError("outcome comparison requires exact DetailedEvaluation values")
|
|
75
|
+
DetailedEvaluation.__post_init__(left)
|
|
76
|
+
DetailedEvaluation.__post_init__(right)
|
|
77
|
+
relation = self.compare(left, right)
|
|
78
|
+
repeated = self.compare(left, right)
|
|
79
|
+
inverse = self.compare(right, left)
|
|
80
|
+
inverse_repeated = self.compare(right, left)
|
|
81
|
+
if any(
|
|
82
|
+
type(value) is not OutcomeRelation
|
|
83
|
+
for value in (relation, repeated, inverse, inverse_repeated)
|
|
84
|
+
):
|
|
85
|
+
raise TypeError("outcome relation policy returned an invalid relation")
|
|
86
|
+
if relation is not repeated or inverse is not inverse_repeated:
|
|
87
|
+
raise ValueError("outcome relation policy must be deterministic")
|
|
88
|
+
expected_inverse = {
|
|
89
|
+
OutcomeRelation.BETTER: OutcomeRelation.WORSE,
|
|
90
|
+
OutcomeRelation.WORSE: OutcomeRelation.BETTER,
|
|
91
|
+
OutcomeRelation.EQUIVALENT: OutcomeRelation.EQUIVALENT,
|
|
92
|
+
OutcomeRelation.INCOMPARABLE: OutcomeRelation.INCOMPARABLE,
|
|
93
|
+
}[relation]
|
|
94
|
+
if inverse is not expected_inverse:
|
|
95
|
+
raise ValueError("outcome relation policy violated inverse consistency")
|
|
96
|
+
return relation
|
|
97
|
+
|
|
98
|
+
def to_record(self) -> dict[str, object]:
|
|
99
|
+
return {
|
|
100
|
+
"policy_id": self.policy_id,
|
|
101
|
+
"policy_version": self.policy_version,
|
|
102
|
+
"definition_sha256": self.definition_sha256,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@dataclass(frozen=True, slots=True)
|
|
107
|
+
class ObjectiveParetoOutcomePolicy:
|
|
108
|
+
"""The legacy objective-only partial order, expressed over detailed records."""
|
|
109
|
+
|
|
110
|
+
objectives: tuple[ObjectiveSpec, ...]
|
|
111
|
+
|
|
112
|
+
def __post_init__(self) -> None:
|
|
113
|
+
if type(self.objectives) is not tuple:
|
|
114
|
+
raise TypeError("objectives must be an exact tuple")
|
|
115
|
+
validate_objective_specs(self.objectives)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def definition_sha256(self) -> str:
|
|
119
|
+
record = [
|
|
120
|
+
{"name": objective.name, "goal": objective.goal}
|
|
121
|
+
for objective in self.objectives
|
|
122
|
+
]
|
|
123
|
+
encoded = json.dumps(
|
|
124
|
+
record,
|
|
125
|
+
allow_nan=False,
|
|
126
|
+
ensure_ascii=True,
|
|
127
|
+
separators=(",", ":"),
|
|
128
|
+
sort_keys=True,
|
|
129
|
+
).encode("ascii")
|
|
130
|
+
return hashlib.sha256(_PARETO_DEFINITION_DOMAIN + encoded).hexdigest()
|
|
131
|
+
|
|
132
|
+
def compare(
|
|
133
|
+
self,
|
|
134
|
+
left: DetailedEvaluation,
|
|
135
|
+
right: DetailedEvaluation,
|
|
136
|
+
) -> OutcomeRelation:
|
|
137
|
+
if not left.success or not right.success:
|
|
138
|
+
raise ValueError("objective Pareto comparison requires successful records")
|
|
139
|
+
left_values = normalize_objective_values(
|
|
140
|
+
dict(left.objectives),
|
|
141
|
+
self.objectives,
|
|
142
|
+
)
|
|
143
|
+
right_values = normalize_objective_values(
|
|
144
|
+
dict(right.objectives),
|
|
145
|
+
self.objectives,
|
|
146
|
+
)
|
|
147
|
+
left_weak = True
|
|
148
|
+
left_strict = False
|
|
149
|
+
right_weak = True
|
|
150
|
+
right_strict = False
|
|
151
|
+
for objective in self.objectives:
|
|
152
|
+
left_value = left_values[objective.name]
|
|
153
|
+
right_value = right_values[objective.name]
|
|
154
|
+
if objective.goal == "max":
|
|
155
|
+
left_weak &= left_value >= right_value
|
|
156
|
+
left_strict |= left_value > right_value
|
|
157
|
+
right_weak &= right_value >= left_value
|
|
158
|
+
right_strict |= right_value > left_value
|
|
159
|
+
else:
|
|
160
|
+
left_weak &= left_value <= right_value
|
|
161
|
+
left_strict |= left_value < right_value
|
|
162
|
+
right_weak &= right_value <= left_value
|
|
163
|
+
right_strict |= right_value < left_value
|
|
164
|
+
if left_weak and left_strict:
|
|
165
|
+
return OutcomeRelation.BETTER
|
|
166
|
+
if right_weak and right_strict:
|
|
167
|
+
return OutcomeRelation.WORSE
|
|
168
|
+
if left_weak and right_weak:
|
|
169
|
+
return OutcomeRelation.EQUIVALENT
|
|
170
|
+
return OutcomeRelation.INCOMPARABLE
|
|
171
|
+
|
|
172
|
+
def binding(self) -> OutcomeRelationPolicyBinding:
|
|
173
|
+
return OutcomeRelationPolicyBinding(
|
|
174
|
+
compare=self.compare,
|
|
175
|
+
policy_id="objective_pareto",
|
|
176
|
+
policy_version=1,
|
|
177
|
+
definition_sha256=self.definition_sha256,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def objective_pareto_outcome_binding(
|
|
182
|
+
objectives: Sequence[ObjectiveSpec],
|
|
183
|
+
) -> OutcomeRelationPolicyBinding:
|
|
184
|
+
return ObjectiveParetoOutcomePolicy(tuple(objectives)).binding()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
__all__ = [
|
|
188
|
+
"ObjectiveParetoOutcomePolicy",
|
|
189
|
+
"OutcomeComparator",
|
|
190
|
+
"OutcomeRelation",
|
|
191
|
+
"OutcomeRelationPolicyBinding",
|
|
192
|
+
"objective_pareto_outcome_binding",
|
|
193
|
+
]
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""Build and replay paired v2/v3 allocation authority before outcomes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
|
|
7
|
+
from agent_evolve.application.action_allocation_frame_commit import (
|
|
8
|
+
validate_frame_action_allocation_phase_commit,
|
|
9
|
+
)
|
|
10
|
+
from agent_evolve.application.action_allocation_frame_commit_v3 import (
|
|
11
|
+
validate_operational_frame_action_allocation_phase_commit,
|
|
12
|
+
)
|
|
13
|
+
from agent_evolve.application.two_stage_action_evolution import (
|
|
14
|
+
TwoStageActionPhaseCommit,
|
|
15
|
+
)
|
|
16
|
+
from agent_evolve.domain.patch import require_sha256
|
|
17
|
+
from agent_evolve.ports.action_allocation_frame import FrameActionAllocationRequest
|
|
18
|
+
from agent_evolve.ports.action_allocation_frame_commit import (
|
|
19
|
+
FrameActionAllocationTreatmentExecution,
|
|
20
|
+
)
|
|
21
|
+
from agent_evolve.ports.action_allocation_frame_commit_v3 import (
|
|
22
|
+
OperationalFrameActionAllocationTreatmentExecution,
|
|
23
|
+
)
|
|
24
|
+
from agent_evolve.ports.paired_allocation_comparison import (
|
|
25
|
+
AllocationComparisonMethodKind,
|
|
26
|
+
AllocationComparisonMethodReceipt,
|
|
27
|
+
AllocationComparisonSelectedOption,
|
|
28
|
+
PairedAllocationComparisonCommitment,
|
|
29
|
+
frame_allocation_comparison_structure_sha256,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
AllocationExecution = (
|
|
34
|
+
FrameActionAllocationTreatmentExecution
|
|
35
|
+
| OperationalFrameActionAllocationTreatmentExecution
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class AllocationComparisonMethodWave:
|
|
41
|
+
"""One exact allocator method's already-durable treatment wave.
|
|
42
|
+
|
|
43
|
+
``schedule_binding_sha256`` is a caller-verifiable receipt for the common
|
|
44
|
+
prospective schedule. This builder binds it but does not claim that a
|
|
45
|
+
bare digest proves materialization or chronology.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
comparison_method_id: str
|
|
49
|
+
schedule_binding_sha256: str
|
|
50
|
+
executions: tuple[AllocationExecution, ...] = field(
|
|
51
|
+
repr=False,
|
|
52
|
+
compare=False,
|
|
53
|
+
)
|
|
54
|
+
phase_commit: TwoStageActionPhaseCommit = field(repr=False, compare=False)
|
|
55
|
+
|
|
56
|
+
def __post_init__(self) -> None:
|
|
57
|
+
require_sha256(self.schedule_binding_sha256, "schedule_binding_sha256")
|
|
58
|
+
if type(self.executions) is not tuple or not self.executions:
|
|
59
|
+
raise ValueError("executions must be a non-empty exact tuple")
|
|
60
|
+
first_type = type(self.executions[0])
|
|
61
|
+
if first_type not in {
|
|
62
|
+
FrameActionAllocationTreatmentExecution,
|
|
63
|
+
OperationalFrameActionAllocationTreatmentExecution,
|
|
64
|
+
} or any(type(value) is not first_type for value in self.executions):
|
|
65
|
+
raise TypeError("a method wave must contain one exact execution type")
|
|
66
|
+
if type(self.phase_commit) is not TwoStageActionPhaseCommit:
|
|
67
|
+
raise TypeError("phase_commit must be exact")
|
|
68
|
+
self.phase_commit.__post_init__()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _base_request(execution: AllocationExecution) -> FrameActionAllocationRequest:
|
|
72
|
+
if type(execution) is FrameActionAllocationTreatmentExecution:
|
|
73
|
+
return execution.request
|
|
74
|
+
if type(execution) is OperationalFrameActionAllocationTreatmentExecution:
|
|
75
|
+
return execution.request.allocation
|
|
76
|
+
raise TypeError("execution type is outside the paired comparison")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _method_request_sha256(execution: AllocationExecution) -> str:
|
|
80
|
+
if type(execution) is FrameActionAllocationTreatmentExecution:
|
|
81
|
+
return execution.request.request_sha256
|
|
82
|
+
if type(execution) is OperationalFrameActionAllocationTreatmentExecution:
|
|
83
|
+
return execution.request.request_sha256
|
|
84
|
+
raise TypeError("execution type is outside the paired comparison")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _method_receipt(
|
|
88
|
+
wave: AllocationComparisonMethodWave,
|
|
89
|
+
) -> AllocationComparisonMethodReceipt:
|
|
90
|
+
wave.__post_init__()
|
|
91
|
+
executions = wave.executions
|
|
92
|
+
if type(executions[0]) is FrameActionAllocationTreatmentExecution:
|
|
93
|
+
v2 = executions
|
|
94
|
+
assert all(
|
|
95
|
+
type(value) is FrameActionAllocationTreatmentExecution for value in v2
|
|
96
|
+
)
|
|
97
|
+
commit_input = validate_frame_action_allocation_phase_commit(
|
|
98
|
+
v2, # type: ignore[arg-type]
|
|
99
|
+
wave.phase_commit,
|
|
100
|
+
)
|
|
101
|
+
kind = AllocationComparisonMethodKind.AUDITED_FRAME_V2
|
|
102
|
+
else:
|
|
103
|
+
v3 = executions
|
|
104
|
+
assert all(
|
|
105
|
+
type(value) is OperationalFrameActionAllocationTreatmentExecution
|
|
106
|
+
for value in v3
|
|
107
|
+
)
|
|
108
|
+
commit_input = validate_operational_frame_action_allocation_phase_commit(
|
|
109
|
+
v3, # type: ignore[arg-type]
|
|
110
|
+
wave.phase_commit,
|
|
111
|
+
)
|
|
112
|
+
kind = AllocationComparisonMethodKind.OPERATIONAL_FRAME_V3
|
|
113
|
+
|
|
114
|
+
base_requests = tuple(_base_request(value) for value in executions)
|
|
115
|
+
expected_utility = base_requests[0].utility.utility
|
|
116
|
+
if any(value.utility.utility is not expected_utility for value in base_requests):
|
|
117
|
+
raise ValueError("one method wave must share the same utility executable")
|
|
118
|
+
structures = tuple(
|
|
119
|
+
frame_allocation_comparison_structure_sha256(value)
|
|
120
|
+
for value in base_requests
|
|
121
|
+
)
|
|
122
|
+
if len(set(structures)) != 1:
|
|
123
|
+
raise ValueError(
|
|
124
|
+
"one method wave mixes schedule/frame/eligibility/budget structure"
|
|
125
|
+
)
|
|
126
|
+
decisions = tuple(value.result.decision for value in executions)
|
|
127
|
+
allocator_identities = {
|
|
128
|
+
(
|
|
129
|
+
value.allocator_policy_id,
|
|
130
|
+
value.allocator_policy_version,
|
|
131
|
+
value.allocator_definition_sha256,
|
|
132
|
+
value.allocator_configuration_sha256,
|
|
133
|
+
)
|
|
134
|
+
for value in decisions
|
|
135
|
+
}
|
|
136
|
+
if len(allocator_identities) != 1:
|
|
137
|
+
raise ValueError("one comparison method mixes allocator configurations")
|
|
138
|
+
policy_id, policy_version, definition_sha256, configuration_sha256 = next(
|
|
139
|
+
iter(allocator_identities)
|
|
140
|
+
)
|
|
141
|
+
selected = tuple(
|
|
142
|
+
AllocationComparisonSelectedOption(
|
|
143
|
+
treatment_occurrence_id=(
|
|
144
|
+
execution.treatment_occurrence.occurrence_id.value
|
|
145
|
+
),
|
|
146
|
+
treatment_id=execution.treatment_occurrence.treatment_id.value,
|
|
147
|
+
rank=member.rank,
|
|
148
|
+
option_id=member.option_id,
|
|
149
|
+
option_identity_sha256=member.option_identity_sha256,
|
|
150
|
+
child_configuration_sha256=member.child_configuration_sha256,
|
|
151
|
+
family=member.family,
|
|
152
|
+
)
|
|
153
|
+
for execution in executions
|
|
154
|
+
for member in execution.result.decision.members
|
|
155
|
+
)
|
|
156
|
+
assignment = executions[0].treatment_assignment
|
|
157
|
+
return AllocationComparisonMethodReceipt(
|
|
158
|
+
comparison_method_id=wave.comparison_method_id,
|
|
159
|
+
method_kind=kind,
|
|
160
|
+
schedule_binding_sha256=wave.schedule_binding_sha256,
|
|
161
|
+
allocation_phase_commit_receipt_sha256=(
|
|
162
|
+
wave.phase_commit.receipt.receipt_sha256
|
|
163
|
+
),
|
|
164
|
+
allocation_input_sha256=commit_input.input_sha256,
|
|
165
|
+
treatment_assignment_receipt_sha256=assignment.receipt_sha256,
|
|
166
|
+
upstream_input_sha256=commit_input.upstream_input_sha256,
|
|
167
|
+
terminal_provider_ledger_commitment_sha256=(
|
|
168
|
+
commit_input.terminal_provider_ledger_commitment_sha256
|
|
169
|
+
),
|
|
170
|
+
common_comparison_structure_sha256=structures[0],
|
|
171
|
+
allocator_policy_id=policy_id,
|
|
172
|
+
allocator_policy_version=policy_version,
|
|
173
|
+
allocator_definition_sha256=definition_sha256,
|
|
174
|
+
allocator_configuration_sha256=configuration_sha256,
|
|
175
|
+
ordered_frame_receipt_sha256s=tuple(
|
|
176
|
+
value.frame.receipt_sha256 for value in base_requests
|
|
177
|
+
),
|
|
178
|
+
ordered_base_request_sha256s=tuple(
|
|
179
|
+
value.request_sha256 for value in base_requests
|
|
180
|
+
),
|
|
181
|
+
ordered_method_request_sha256s=tuple(
|
|
182
|
+
_method_request_sha256(value) for value in executions
|
|
183
|
+
),
|
|
184
|
+
ordered_decision_receipt_sha256s=tuple(
|
|
185
|
+
value.receipt_sha256 for value in decisions
|
|
186
|
+
),
|
|
187
|
+
selected_options=selected,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def build_paired_allocation_comparison_commitment(
|
|
192
|
+
methods: tuple[AllocationComparisonMethodWave, ...],
|
|
193
|
+
) -> PairedAllocationComparisonCommitment:
|
|
194
|
+
"""Validate both durable methods and bind their selected-option union."""
|
|
195
|
+
|
|
196
|
+
if type(methods) is not tuple or len(methods) != 2 or any(
|
|
197
|
+
type(value) is not AllocationComparisonMethodWave for value in methods
|
|
198
|
+
):
|
|
199
|
+
raise ValueError("methods must contain exactly two exact method waves")
|
|
200
|
+
for value in methods:
|
|
201
|
+
value.__post_init__()
|
|
202
|
+
all_requests = tuple(
|
|
203
|
+
_base_request(execution)
|
|
204
|
+
for method in methods
|
|
205
|
+
for execution in method.executions
|
|
206
|
+
)
|
|
207
|
+
expected_utility = all_requests[0].utility.utility
|
|
208
|
+
if any(value.utility.utility is not expected_utility for value in all_requests):
|
|
209
|
+
raise ValueError("paired methods must share the same utility executable")
|
|
210
|
+
receipts = tuple(
|
|
211
|
+
sorted(
|
|
212
|
+
(_method_receipt(value) for value in methods),
|
|
213
|
+
key=lambda value: value.comparison_method_id,
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
return PairedAllocationComparisonCommitment(methods=receipts)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def validate_paired_allocation_comparison_commitment(
|
|
220
|
+
methods: tuple[AllocationComparisonMethodWave, ...],
|
|
221
|
+
commitment: PairedAllocationComparisonCommitment,
|
|
222
|
+
) -> PairedAllocationComparisonCommitment:
|
|
223
|
+
"""Replay both phase commits and reject any post-commit object drift."""
|
|
224
|
+
|
|
225
|
+
if type(commitment) is not PairedAllocationComparisonCommitment:
|
|
226
|
+
raise TypeError("commitment must be exact")
|
|
227
|
+
commitment.__post_init__()
|
|
228
|
+
expected = build_paired_allocation_comparison_commitment(methods)
|
|
229
|
+
if (
|
|
230
|
+
commitment.commitment_sha256 != expected.commitment_sha256
|
|
231
|
+
or commitment.to_record() != expected.to_record()
|
|
232
|
+
):
|
|
233
|
+
raise ValueError("paired allocation commitment differs from exact methods")
|
|
234
|
+
return expected
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
__all__ = [
|
|
238
|
+
"AllocationComparisonMethodWave",
|
|
239
|
+
"build_paired_allocation_comparison_commitment",
|
|
240
|
+
"validate_paired_allocation_comparison_commitment",
|
|
241
|
+
]
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"""Pure hash-ranked paired block scheduling over benchmark-neutral ports."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
import hashlib
|
|
7
|
+
import json
|
|
8
|
+
|
|
9
|
+
from agent_evolve.ports.paired_block_schedule import (
|
|
10
|
+
PairedBlockScheduleRequest,
|
|
11
|
+
PairedBlockSchedulePolicyBinding,
|
|
12
|
+
PairedBlockScheduleResult,
|
|
13
|
+
RankedBlockIdentity,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
PAIRED_BLOCK_SCHEDULE_POLICY_ID = "paired_benchmark_block_schedule"
|
|
18
|
+
PAIRED_BLOCK_SCHEDULE_POLICY_VERSION = 2
|
|
19
|
+
PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN = (
|
|
20
|
+
"agent-evolve:paired-benchmark-block-schedule:v2"
|
|
21
|
+
)
|
|
22
|
+
PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
|
|
23
|
+
b"agent-evolve:paired-benchmark-block-schedule-policy:v2;"
|
|
24
|
+
b"inputs=benchmark,task,finite-contract,partition-layout,exact-eligible-mask,"
|
|
25
|
+
b"public-uint64-seed,public-seed-source-sha256,complete-canonical-block-"
|
|
26
|
+
b"identities,replicate-index;public-seed-source=authenticated-provenance-"
|
|
27
|
+
b"not-rank-entropy;"
|
|
28
|
+
b"rank=sha256(domain,schedule-basis,block-index,block-spec-sha256);"
|
|
29
|
+
b"sort=rank-digest-then-block-index;complete-no-replacement-schedule;"
|
|
30
|
+
b"replicate-index=exact-schedule-position;runtime-rng=forbidden;"
|
|
31
|
+
b"method,treatment,provider,prompt,outcome-identities=absent-by-construction"
|
|
32
|
+
).hexdigest()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class PairedBlockScheduleVerificationError(RuntimeError):
|
|
36
|
+
"""A supplied paired schedule differs from deterministic public replay."""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _canonical_json(value: object) -> bytes:
|
|
40
|
+
return json.dumps(
|
|
41
|
+
value,
|
|
42
|
+
allow_nan=False,
|
|
43
|
+
ensure_ascii=True,
|
|
44
|
+
separators=(",", ":"),
|
|
45
|
+
sort_keys=True,
|
|
46
|
+
).encode("ascii")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def paired_block_schedule_policy() -> PairedBlockSchedulePolicyBinding:
|
|
50
|
+
"""Return the identified benchmark-neutral no-replacement schedule policy."""
|
|
51
|
+
|
|
52
|
+
return PairedBlockSchedulePolicyBinding(
|
|
53
|
+
policy_id=PAIRED_BLOCK_SCHEDULE_POLICY_ID,
|
|
54
|
+
policy_version=PAIRED_BLOCK_SCHEDULE_POLICY_VERSION,
|
|
55
|
+
policy_definition_sha256=(
|
|
56
|
+
PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256
|
|
57
|
+
),
|
|
58
|
+
rank_domain=PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def rank_paired_benchmark_blocks(
|
|
63
|
+
request: PairedBlockScheduleRequest,
|
|
64
|
+
) -> PairedBlockScheduleResult:
|
|
65
|
+
"""Hash-rank every block once and select the replicate's schedule position."""
|
|
66
|
+
|
|
67
|
+
if type(request) is not PairedBlockScheduleRequest:
|
|
68
|
+
raise TypeError("request must be an exact PairedBlockScheduleRequest")
|
|
69
|
+
request.__post_init__()
|
|
70
|
+
if request.policy != paired_block_schedule_policy():
|
|
71
|
+
raise ValueError("request policy differs from this identified scheduler")
|
|
72
|
+
domain = request.policy.rank_domain.encode("ascii") + b"\x00"
|
|
73
|
+
basis = request.schedule_basis_record()
|
|
74
|
+
ranked: list[tuple[str, int, object]] = []
|
|
75
|
+
for block in request.blocks:
|
|
76
|
+
rank_payload = {
|
|
77
|
+
**basis,
|
|
78
|
+
"block_index": block.block_index,
|
|
79
|
+
"block_spec_sha256": block.block_spec_sha256,
|
|
80
|
+
}
|
|
81
|
+
digest = hashlib.sha256(domain + _canonical_json(rank_payload)).hexdigest()
|
|
82
|
+
ranked.append((digest, block.block_index, block))
|
|
83
|
+
ranked.sort(key=lambda value: (value[0], value[1]))
|
|
84
|
+
return PairedBlockScheduleResult(
|
|
85
|
+
request=request,
|
|
86
|
+
ranked_blocks=tuple(
|
|
87
|
+
RankedBlockIdentity(
|
|
88
|
+
schedule_position=position,
|
|
89
|
+
block=block, # type: ignore[arg-type]
|
|
90
|
+
rank_digest_sha256=digest,
|
|
91
|
+
)
|
|
92
|
+
for position, (digest, _block_index, block) in enumerate(ranked)
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def verify_paired_block_schedule(
|
|
98
|
+
request: PairedBlockScheduleRequest,
|
|
99
|
+
result: PairedBlockScheduleResult | Mapping[str, object],
|
|
100
|
+
) -> PairedBlockScheduleResult:
|
|
101
|
+
"""Fail closed unless an object or canonical record equals public replay."""
|
|
102
|
+
|
|
103
|
+
expected = rank_paired_benchmark_blocks(request)
|
|
104
|
+
if type(result) is PairedBlockScheduleResult:
|
|
105
|
+
result.__post_init__()
|
|
106
|
+
matches = result == expected and result.to_record() == expected.to_record()
|
|
107
|
+
elif isinstance(result, Mapping):
|
|
108
|
+
matches = type(result) is dict and result == expected.to_record()
|
|
109
|
+
else:
|
|
110
|
+
raise TypeError("result must be an exact schedule result or canonical dict")
|
|
111
|
+
if not matches:
|
|
112
|
+
raise PairedBlockScheduleVerificationError(
|
|
113
|
+
"paired block schedule differs from deterministic public replay"
|
|
114
|
+
)
|
|
115
|
+
return expected
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
__all__ = [
|
|
119
|
+
"PAIRED_BLOCK_SCHEDULE_POLICY_DEFINITION_SHA256",
|
|
120
|
+
"PAIRED_BLOCK_SCHEDULE_POLICY_ID",
|
|
121
|
+
"PAIRED_BLOCK_SCHEDULE_POLICY_VERSION",
|
|
122
|
+
"PAIRED_BLOCK_SCHEDULE_RANK_DOMAIN",
|
|
123
|
+
"PairedBlockScheduleVerificationError",
|
|
124
|
+
"paired_block_schedule_policy",
|
|
125
|
+
"rank_paired_benchmark_blocks",
|
|
126
|
+
"verify_paired_block_schedule",
|
|
127
|
+
]
|