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,452 @@
|
|
|
1
|
+
"""Immutable experiment profiles for workload- and model-transfer campaigns.
|
|
2
|
+
|
|
3
|
+
The workload boundary owns candidate and evaluator semantics. A campaign
|
|
4
|
+
profile owns every optimizer decision that must remain fixed when the same
|
|
5
|
+
method is transferred between workloads: depth/width, proposal support,
|
|
6
|
+
parent selection, acquisition, memory, recombination, reflection, and prompt
|
|
7
|
+
arm. Model routing and concurrency are bound in the same inspectable object,
|
|
8
|
+
but have a separate digest so systems changes cannot be mistaken for method
|
|
9
|
+
changes.
|
|
10
|
+
|
|
11
|
+
The executable objects inside :class:`CampaignPolicyBinding` are deliberately
|
|
12
|
+
excluded from identity by that type. Their authenticated public policy
|
|
13
|
+
identities are included. This permits workload-specific composition objects
|
|
14
|
+
to implement the same inverted port without silently creating a new method.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import hashlib
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
from dataclasses import dataclass
|
|
23
|
+
|
|
24
|
+
from agent_evolve.application.evolution_campaign import (
|
|
25
|
+
ArchiveUtilityPort,
|
|
26
|
+
CampaignAgentRuntimePort,
|
|
27
|
+
CampaignJournalPort,
|
|
28
|
+
CampaignPolicyBinding,
|
|
29
|
+
CampaignReflectionSupervisionPolicy,
|
|
30
|
+
EvolutionCampaign,
|
|
31
|
+
PreparedEvolutionCampaign,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.campaign_presets import (
|
|
34
|
+
DelayedPortfolioCampaignPreset,
|
|
35
|
+
PortfolioCampaignBehavior,
|
|
36
|
+
PortfolioScaleShape,
|
|
37
|
+
)
|
|
38
|
+
from agent_evolve.campaign_workload import AgenticCampaignWorkloadConfig
|
|
39
|
+
from agent_evolve.integrations.pydantic_ai.model_execution_profile import (
|
|
40
|
+
OpenRouterModelExecutionProfile,
|
|
41
|
+
)
|
|
42
|
+
from agent_evolve.ports.archive_context import (
|
|
43
|
+
CampaignPortfolioArchiveContextProjector,
|
|
44
|
+
)
|
|
45
|
+
from agent_evolve.workload_kit import WorkloadKit
|
|
46
|
+
from agent_evolve.workload_prompt import WorkloadPromptArm
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_]{0,95}$")
|
|
50
|
+
_METHOD_DOMAIN = b"agent-evolve:campaign-method-profile:v2\x00"
|
|
51
|
+
_METHOD_DOMAIN_V3 = b"agent-evolve:campaign-method-profile:v3\x00"
|
|
52
|
+
_EXECUTION_DOMAIN = b"agent-evolve:campaign-experiment-profile:v2\x00"
|
|
53
|
+
_EXECUTION_DOMAIN_V3 = b"agent-evolve:campaign-experiment-profile:v3\x00"
|
|
54
|
+
_CONFORMANCE_DOMAIN = b"agent-evolve:campaign-profile-conformance:v1\x00"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _canonical_bytes(value: object) -> bytes:
|
|
58
|
+
return json.dumps(
|
|
59
|
+
value,
|
|
60
|
+
allow_nan=False,
|
|
61
|
+
ensure_ascii=True,
|
|
62
|
+
separators=(",", ":"),
|
|
63
|
+
sort_keys=True,
|
|
64
|
+
).encode("ascii", errors="strict")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _digest(domain: bytes, value: object) -> str:
|
|
68
|
+
return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
72
|
+
class CampaignExperimentProfile:
|
|
73
|
+
"""One complete, replay-identifiable campaign composition contract.
|
|
74
|
+
|
|
75
|
+
``method_definition_sha256`` intentionally excludes model routing and
|
|
76
|
+
concurrency. It must remain identical across a workload/model transfer
|
|
77
|
+
block. ``experiment_definition_sha256`` additionally binds those systems
|
|
78
|
+
settings and therefore identifies an executable cell.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
profile_id: str
|
|
82
|
+
profile_version: int
|
|
83
|
+
method_id: str
|
|
84
|
+
method_version: int
|
|
85
|
+
scale_shape: PortfolioScaleShape
|
|
86
|
+
candidate_pool_size: int | None
|
|
87
|
+
model_selection_size: int
|
|
88
|
+
prompt_arm: WorkloadPromptArm
|
|
89
|
+
parent_selection: CampaignPolicyBinding
|
|
90
|
+
memory_assignment: CampaignPolicyBinding
|
|
91
|
+
portfolio_selection: CampaignPolicyBinding
|
|
92
|
+
recombination: CampaignPolicyBinding
|
|
93
|
+
reflection: CampaignPolicyBinding
|
|
94
|
+
model_execution: OpenRouterModelExecutionProfile
|
|
95
|
+
archive_context: CampaignPolicyBinding | None = None
|
|
96
|
+
variation_topology: CampaignPolicyBinding | None = None
|
|
97
|
+
contextual_outcomes: CampaignPolicyBinding | None = None
|
|
98
|
+
evaluator_concurrency: int = 1
|
|
99
|
+
agent_concurrency: int = 3
|
|
100
|
+
agent_queue_capacity: int = 8
|
|
101
|
+
reflection_supervision: CampaignReflectionSupervisionPolicy = (
|
|
102
|
+
CampaignReflectionSupervisionPolicy()
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def __post_init__(self) -> None:
|
|
106
|
+
for name in ("profile_id", "method_id"):
|
|
107
|
+
value = getattr(self, name)
|
|
108
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
109
|
+
raise ValueError(f"{name} must use the closed lowercase token grammar")
|
|
110
|
+
for name in ("profile_version", "method_version"):
|
|
111
|
+
value = getattr(self, name)
|
|
112
|
+
if type(value) is not int or value <= 0:
|
|
113
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
114
|
+
if type(self.scale_shape) is not PortfolioScaleShape:
|
|
115
|
+
raise TypeError("scale_shape must be an exact PortfolioScaleShape")
|
|
116
|
+
self.scale_shape.__post_init__()
|
|
117
|
+
if self.candidate_pool_size is not None and (
|
|
118
|
+
type(self.candidate_pool_size) is not int
|
|
119
|
+
or self.candidate_pool_size <= 0
|
|
120
|
+
):
|
|
121
|
+
raise ValueError(
|
|
122
|
+
"candidate_pool_size must be a positive exact integer or None"
|
|
123
|
+
)
|
|
124
|
+
if type(self.model_selection_size) is not int or (
|
|
125
|
+
self.model_selection_size <= 0
|
|
126
|
+
):
|
|
127
|
+
raise ValueError("model_selection_size must be a positive exact integer")
|
|
128
|
+
if not (
|
|
129
|
+
self.model_selection_size >= self.scale_shape.portfolio_width
|
|
130
|
+
and (
|
|
131
|
+
self.candidate_pool_size is None
|
|
132
|
+
or self.candidate_pool_size >= self.model_selection_size
|
|
133
|
+
)
|
|
134
|
+
):
|
|
135
|
+
raise ValueError(
|
|
136
|
+
"candidate/model/evaluated widths must satisfy M >= K >= k"
|
|
137
|
+
)
|
|
138
|
+
if type(self.prompt_arm) is not WorkloadPromptArm:
|
|
139
|
+
raise TypeError("prompt_arm must be an exact WorkloadPromptArm")
|
|
140
|
+
for name in (
|
|
141
|
+
"parent_selection",
|
|
142
|
+
"memory_assignment",
|
|
143
|
+
"portfolio_selection",
|
|
144
|
+
"recombination",
|
|
145
|
+
"reflection",
|
|
146
|
+
):
|
|
147
|
+
binding = getattr(self, name)
|
|
148
|
+
if type(binding) is not CampaignPolicyBinding:
|
|
149
|
+
raise TypeError(f"{name} must be an exact CampaignPolicyBinding")
|
|
150
|
+
CampaignPolicyBinding.__post_init__(binding)
|
|
151
|
+
if self.archive_context is not None:
|
|
152
|
+
if type(self.archive_context) is not CampaignPolicyBinding:
|
|
153
|
+
raise TypeError(
|
|
154
|
+
"archive_context must be an exact CampaignPolicyBinding or None"
|
|
155
|
+
)
|
|
156
|
+
CampaignPolicyBinding.__post_init__(self.archive_context)
|
|
157
|
+
if not isinstance(
|
|
158
|
+
self.archive_context.implementation,
|
|
159
|
+
CampaignPortfolioArchiveContextProjector,
|
|
160
|
+
):
|
|
161
|
+
raise TypeError(
|
|
162
|
+
"archive_context implementation must satisfy the generic "
|
|
163
|
+
"archive-context projector port"
|
|
164
|
+
)
|
|
165
|
+
for name in ("variation_topology", "contextual_outcomes"):
|
|
166
|
+
binding = getattr(self, name)
|
|
167
|
+
if binding is not None:
|
|
168
|
+
if type(binding) is not CampaignPolicyBinding:
|
|
169
|
+
raise TypeError(
|
|
170
|
+
f"{name} must be an exact CampaignPolicyBinding or None"
|
|
171
|
+
)
|
|
172
|
+
CampaignPolicyBinding.__post_init__(binding)
|
|
173
|
+
if type(self.model_execution) is not OpenRouterModelExecutionProfile:
|
|
174
|
+
raise TypeError(
|
|
175
|
+
"model_execution must be an exact OpenRouterModelExecutionProfile"
|
|
176
|
+
)
|
|
177
|
+
self.model_execution.__post_init__()
|
|
178
|
+
for name in ("evaluator_concurrency", "agent_concurrency"):
|
|
179
|
+
value = getattr(self, name)
|
|
180
|
+
if type(value) is not int or value <= 0:
|
|
181
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
182
|
+
if (
|
|
183
|
+
type(self.agent_queue_capacity) is not int
|
|
184
|
+
or self.agent_queue_capacity < self.agent_concurrency
|
|
185
|
+
):
|
|
186
|
+
raise ValueError("agent_queue_capacity must cover agent_concurrency")
|
|
187
|
+
if (
|
|
188
|
+
self.model_execution.route_concurrency_cap is not None
|
|
189
|
+
and self.agent_concurrency
|
|
190
|
+
> self.model_execution.route_concurrency_cap
|
|
191
|
+
):
|
|
192
|
+
raise ValueError(
|
|
193
|
+
"agent_concurrency exceeds the authenticated model-route cap"
|
|
194
|
+
)
|
|
195
|
+
if type(self.reflection_supervision) is not (
|
|
196
|
+
CampaignReflectionSupervisionPolicy
|
|
197
|
+
):
|
|
198
|
+
raise TypeError(
|
|
199
|
+
"reflection_supervision must be exact "
|
|
200
|
+
"CampaignReflectionSupervisionPolicy"
|
|
201
|
+
)
|
|
202
|
+
CampaignReflectionSupervisionPolicy.__post_init__(
|
|
203
|
+
self.reflection_supervision
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def _method_record(self) -> dict[str, object]:
|
|
207
|
+
self.__post_init__()
|
|
208
|
+
extended_identity = (
|
|
209
|
+
self.variation_topology is not None
|
|
210
|
+
or self.contextual_outcomes is not None
|
|
211
|
+
)
|
|
212
|
+
record = {
|
|
213
|
+
"schema_version": 3 if extended_identity else 2,
|
|
214
|
+
"method_id": self.method_id,
|
|
215
|
+
"method_version": self.method_version,
|
|
216
|
+
"scale_shape": self.scale_shape.to_record(),
|
|
217
|
+
"candidate_pool_size": self.candidate_pool_size,
|
|
218
|
+
"candidate_pool_mode": (
|
|
219
|
+
"complete_finite_contract"
|
|
220
|
+
if self.candidate_pool_size is None
|
|
221
|
+
else "fixed_size"
|
|
222
|
+
),
|
|
223
|
+
"model_selection_size": self.model_selection_size,
|
|
224
|
+
"evaluated_portfolio_width": self.scale_shape.portfolio_width,
|
|
225
|
+
"prompt_arm": self.prompt_arm.value,
|
|
226
|
+
"policies": {
|
|
227
|
+
"parent_selection": self.parent_selection.to_record(),
|
|
228
|
+
"memory_assignment": self.memory_assignment.to_record(),
|
|
229
|
+
"portfolio_selection": self.portfolio_selection.to_record(),
|
|
230
|
+
"recombination": self.recombination.to_record(),
|
|
231
|
+
"reflection": self.reflection.to_record(),
|
|
232
|
+
"archive_context": (
|
|
233
|
+
None
|
|
234
|
+
if self.archive_context is None
|
|
235
|
+
else self.archive_context.to_record()
|
|
236
|
+
),
|
|
237
|
+
"reflection_supervision": self.reflection_supervision.to_record(),
|
|
238
|
+
},
|
|
239
|
+
"workload_specific_fields": [],
|
|
240
|
+
"model_specific_optimizer_fields": [],
|
|
241
|
+
}
|
|
242
|
+
if extended_identity:
|
|
243
|
+
policies = record["policies"]
|
|
244
|
+
assert type(policies) is dict
|
|
245
|
+
policies["variation_topology"] = (
|
|
246
|
+
None
|
|
247
|
+
if self.variation_topology is None
|
|
248
|
+
else self.variation_topology.to_record()
|
|
249
|
+
)
|
|
250
|
+
policies["contextual_outcomes"] = (
|
|
251
|
+
None
|
|
252
|
+
if self.contextual_outcomes is None
|
|
253
|
+
else self.contextual_outcomes.to_record()
|
|
254
|
+
)
|
|
255
|
+
return record
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def method_definition_sha256(self) -> str:
|
|
259
|
+
"""Identity compared across every workload and model quality cell."""
|
|
260
|
+
|
|
261
|
+
record = self._method_record()
|
|
262
|
+
return _digest(
|
|
263
|
+
_METHOD_DOMAIN_V3 if record["schema_version"] == 3 else _METHOD_DOMAIN,
|
|
264
|
+
record,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
def _execution_record(self) -> dict[str, object]:
|
|
268
|
+
self.__post_init__()
|
|
269
|
+
extended_identity = (
|
|
270
|
+
self.variation_topology is not None
|
|
271
|
+
or self.contextual_outcomes is not None
|
|
272
|
+
)
|
|
273
|
+
return {
|
|
274
|
+
"schema_version": 3 if extended_identity else 2,
|
|
275
|
+
"profile_id": self.profile_id,
|
|
276
|
+
"profile_version": self.profile_version,
|
|
277
|
+
"method_definition_sha256": self.method_definition_sha256,
|
|
278
|
+
"model_execution_profile_sha256": self.model_execution.profile_sha256,
|
|
279
|
+
"systems": {
|
|
280
|
+
"evaluator_concurrency": self.evaluator_concurrency,
|
|
281
|
+
"agent_concurrency": self.agent_concurrency,
|
|
282
|
+
"agent_queue_capacity": self.agent_queue_capacity,
|
|
283
|
+
},
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
@property
|
|
287
|
+
def experiment_definition_sha256(self) -> str:
|
|
288
|
+
"""Identity of the method plus model route and systems settings."""
|
|
289
|
+
|
|
290
|
+
record = self._execution_record()
|
|
291
|
+
return _digest(
|
|
292
|
+
(
|
|
293
|
+
_EXECUTION_DOMAIN_V3
|
|
294
|
+
if record["schema_version"] == 3
|
|
295
|
+
else _EXECUTION_DOMAIN
|
|
296
|
+
),
|
|
297
|
+
record,
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
def to_record(self) -> dict[str, object]:
|
|
301
|
+
"""Publish both identities so quality and systems changes stay separate."""
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
**self._execution_record(),
|
|
305
|
+
"method": self._method_record(),
|
|
306
|
+
"model_execution": self.model_execution.to_record(),
|
|
307
|
+
"experiment_definition_sha256": self.experiment_definition_sha256,
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
def behavior(self, *, archive_utility: ArchiveUtilityPort) -> PortfolioCampaignBehavior:
|
|
311
|
+
"""Bind workload-owned objective utility to the frozen generic method."""
|
|
312
|
+
|
|
313
|
+
self.__post_init__()
|
|
314
|
+
if not isinstance(archive_utility, ArchiveUtilityPort):
|
|
315
|
+
raise TypeError("archive_utility must implement ArchiveUtilityPort")
|
|
316
|
+
return PortfolioCampaignBehavior(
|
|
317
|
+
parent_selection=self.parent_selection,
|
|
318
|
+
memory_assignment=self.memory_assignment,
|
|
319
|
+
portfolio_selection=self.portfolio_selection,
|
|
320
|
+
recombination=self.recombination,
|
|
321
|
+
reflection=self.reflection,
|
|
322
|
+
archive_utility=archive_utility,
|
|
323
|
+
reflection_supervision=self.reflection_supervision,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def archive_context_projector(
|
|
328
|
+
self,
|
|
329
|
+
) -> CampaignPortfolioArchiveContextProjector | None:
|
|
330
|
+
"""Return the executable projector authenticated by this method profile."""
|
|
331
|
+
|
|
332
|
+
self.__post_init__()
|
|
333
|
+
if self.archive_context is None:
|
|
334
|
+
return None
|
|
335
|
+
implementation = self.archive_context.implementation
|
|
336
|
+
if not isinstance(implementation, CampaignPortfolioArchiveContextProjector):
|
|
337
|
+
raise AssertionError("validated archive-context implementation drifted")
|
|
338
|
+
return implementation
|
|
339
|
+
|
|
340
|
+
def preset(self, *, outer_seed: int) -> DelayedPortfolioCampaignPreset:
|
|
341
|
+
"""Construct the exact scale schedule without workload constants."""
|
|
342
|
+
|
|
343
|
+
self.__post_init__()
|
|
344
|
+
return DelayedPortfolioCampaignPreset.scale_shape(
|
|
345
|
+
self.scale_shape,
|
|
346
|
+
outer_seed=outer_seed,
|
|
347
|
+
evaluator_concurrency=self.evaluator_concurrency,
|
|
348
|
+
agent_concurrency=self.agent_concurrency,
|
|
349
|
+
agent_queue_capacity=self.agent_queue_capacity,
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
def compose(
|
|
353
|
+
self,
|
|
354
|
+
*,
|
|
355
|
+
outer_seed: int,
|
|
356
|
+
workload: WorkloadKit | AgenticCampaignWorkloadConfig,
|
|
357
|
+
archive_utility: ArchiveUtilityPort,
|
|
358
|
+
runtime: CampaignAgentRuntimePort,
|
|
359
|
+
journals: tuple[CampaignJournalPort, ...],
|
|
360
|
+
) -> EvolutionCampaign:
|
|
361
|
+
"""Compose one workload through the frozen experiment profile."""
|
|
362
|
+
|
|
363
|
+
return self.preset(outer_seed=outer_seed).compose(
|
|
364
|
+
workload=workload,
|
|
365
|
+
behavior=self.behavior(archive_utility=archive_utility),
|
|
366
|
+
runtime=runtime,
|
|
367
|
+
journals=journals,
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
def prepared_conformance_record(
|
|
371
|
+
self,
|
|
372
|
+
*,
|
|
373
|
+
prepared: PreparedEvolutionCampaign,
|
|
374
|
+
archive_utility: ArchiveUtilityPort,
|
|
375
|
+
outer_seed: int,
|
|
376
|
+
) -> dict[str, object]:
|
|
377
|
+
"""Authenticate that a workload runner executed this profile.
|
|
378
|
+
|
|
379
|
+
Runners may retain a workload-facing protocol label, but they may not
|
|
380
|
+
silently change the optimizer shape, budget, policy identities, or
|
|
381
|
+
concurrency. The runtime implementations behind policy bindings are
|
|
382
|
+
intentionally swappable and do not affect these scientific identities.
|
|
383
|
+
"""
|
|
384
|
+
|
|
385
|
+
self.__post_init__()
|
|
386
|
+
if type(prepared) is not PreparedEvolutionCampaign:
|
|
387
|
+
raise TypeError("prepared must be an exact PreparedEvolutionCampaign")
|
|
388
|
+
prepared.__post_init__()
|
|
389
|
+
if type(outer_seed) is not int or outer_seed < 0:
|
|
390
|
+
raise ValueError("outer_seed must be a non-negative exact integer")
|
|
391
|
+
preset = self.preset(outer_seed=outer_seed)
|
|
392
|
+
expected_protocol = preset.protocol(
|
|
393
|
+
required_seed_count=prepared.protocol.required_seed_count
|
|
394
|
+
)
|
|
395
|
+
expected_budget = preset.budget(
|
|
396
|
+
required_seed_count=prepared.protocol.required_seed_count
|
|
397
|
+
)
|
|
398
|
+
expected_concurrency = preset.concurrency()
|
|
399
|
+
expected_policies = self.behavior(
|
|
400
|
+
archive_utility=archive_utility
|
|
401
|
+
).bind()
|
|
402
|
+
shape_fields = (
|
|
403
|
+
"outer_seed",
|
|
404
|
+
"generation_count",
|
|
405
|
+
"required_seed_count",
|
|
406
|
+
"parents_per_portfolio_generation",
|
|
407
|
+
"portfolio_width",
|
|
408
|
+
"recombinations_per_parent",
|
|
409
|
+
"reflections_per_recombination_generation",
|
|
410
|
+
"reflection_promotion_block_pairs",
|
|
411
|
+
"terminal_reflection_policy",
|
|
412
|
+
)
|
|
413
|
+
gates = {
|
|
414
|
+
"optimizer_shape_exact": all(
|
|
415
|
+
getattr(prepared.protocol, name)
|
|
416
|
+
== getattr(expected_protocol, name)
|
|
417
|
+
for name in shape_fields
|
|
418
|
+
),
|
|
419
|
+
"derived_budget_exact": prepared.budget == expected_budget,
|
|
420
|
+
"concurrency_exact": prepared.concurrency == expected_concurrency,
|
|
421
|
+
"policy_identity_exact": (
|
|
422
|
+
prepared.policies_sha256 == expected_policies.policies_sha256
|
|
423
|
+
),
|
|
424
|
+
}
|
|
425
|
+
unsigned = {
|
|
426
|
+
"schema_version": 1,
|
|
427
|
+
"method_definition_sha256": self.method_definition_sha256,
|
|
428
|
+
"experiment_definition_sha256": self.experiment_definition_sha256,
|
|
429
|
+
"preparation_sha256": prepared.preparation_sha256,
|
|
430
|
+
"gates": gates,
|
|
431
|
+
"pass": all(gates.values()),
|
|
432
|
+
}
|
|
433
|
+
record = {
|
|
434
|
+
**unsigned,
|
|
435
|
+
"conformance_sha256": _digest(_CONFORMANCE_DOMAIN, unsigned),
|
|
436
|
+
}
|
|
437
|
+
if not record["pass"]:
|
|
438
|
+
failed = ", ".join(name for name, value in gates.items() if not value)
|
|
439
|
+
raise RuntimeError(f"prepared campaign violates profile: {failed}")
|
|
440
|
+
return record
|
|
441
|
+
|
|
442
|
+
def __eq__(self, other: object) -> bool:
|
|
443
|
+
return (
|
|
444
|
+
type(other) is CampaignExperimentProfile
|
|
445
|
+
and self.experiment_definition_sha256
|
|
446
|
+
== other.experiment_definition_sha256
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
__hash__ = None
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
__all__ = ["CampaignExperimentProfile"]
|