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,108 @@
|
|
|
1
|
+
"""Idempotent integration loading: in-tree proposers + setuptools entry points.
|
|
2
|
+
|
|
3
|
+
The core never imports ``integrations``; this module (the composition root)
|
|
4
|
+
does, once per process. Out-of-tree integrations advertise themselves through
|
|
5
|
+
the ``agent_evolve.integrations`` entry-point group.
|
|
6
|
+
|
|
7
|
+
A failed optional integration must not stop the others loading, but it must not
|
|
8
|
+
vanish either: the reason is kept and re-reported when someone asks for a
|
|
9
|
+
harness that failed to register. Swallowing it produced ``Unknown harness
|
|
10
|
+
'pydantic_ai'. Registered: []`` as the only symptom of a broken install.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import importlib
|
|
16
|
+
import importlib.util
|
|
17
|
+
from typing import Dict, Optional
|
|
18
|
+
|
|
19
|
+
from agent_evolve.harness.registry import harness_registry
|
|
20
|
+
from agent_evolve.proposers.random_proposer import RandomProposer
|
|
21
|
+
|
|
22
|
+
_INTREE = ("agent_evolve.integrations.pydantic_ai",)
|
|
23
|
+
|
|
24
|
+
_loaded = False
|
|
25
|
+
|
|
26
|
+
#: Import failures, kept so a missing harness can explain itself.
|
|
27
|
+
load_failures: Dict[str, str] = {}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _register_builtin() -> None:
|
|
31
|
+
"""Register proposers that have no optional dependencies."""
|
|
32
|
+
try:
|
|
33
|
+
harness_registry.create("random")
|
|
34
|
+
except KeyError:
|
|
35
|
+
harness_registry.register("random", RandomProposer)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
_register_builtin()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#: Harness id -> the third-party distribution it cannot work without, and the
|
|
42
|
+
#: extra that installs it. An adapter that imports its provider lazily still
|
|
43
|
+
#: registers successfully without it, and then fails deep inside the first
|
|
44
|
+
#: model call with a bare ModuleNotFoundError. Checking here turns that into
|
|
45
|
+
#: one sentence naming the install command.
|
|
46
|
+
_REQUIRES = {
|
|
47
|
+
"pydantic_ai": ("pydantic_ai", "agentevolve-optimizer[llm]"),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def load_integrations() -> None:
|
|
52
|
+
"""Import in-tree integrations and any registered via entry points (once)."""
|
|
53
|
+
global _loaded
|
|
54
|
+
if _loaded:
|
|
55
|
+
return
|
|
56
|
+
_loaded = True
|
|
57
|
+
_register_builtin()
|
|
58
|
+
for module in _INTREE:
|
|
59
|
+
try:
|
|
60
|
+
importlib.import_module(module)
|
|
61
|
+
except Exception as exc: # noqa: BLE001 - recorded, then reported on use
|
|
62
|
+
load_failures[module] = f"{type(exc).__name__}: {exc}"
|
|
63
|
+
_load_entry_points()
|
|
64
|
+
_check_lazy_requirements()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _check_lazy_requirements() -> None:
|
|
68
|
+
"""Record harnesses whose provider package is not installed."""
|
|
69
|
+
for harness_id, (dist, extra) in _REQUIRES.items():
|
|
70
|
+
if harness_id not in harness_registry.ids():
|
|
71
|
+
continue
|
|
72
|
+
if importlib.util.find_spec(dist) is None:
|
|
73
|
+
load_failures[harness_id] = (
|
|
74
|
+
f"needs {dist}, which is not installed; pip install '{extra}'"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def requirement_failure(harness_id: str) -> Optional[str]:
|
|
79
|
+
"""Return why *harness_id* cannot run, or ``None`` when it can."""
|
|
80
|
+
return load_failures.get(harness_id)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _load_entry_points() -> None:
|
|
84
|
+
try:
|
|
85
|
+
from importlib.metadata import entry_points
|
|
86
|
+
except Exception:
|
|
87
|
+
return
|
|
88
|
+
try:
|
|
89
|
+
eps = entry_points(group="agent_evolve.integrations")
|
|
90
|
+
except TypeError:
|
|
91
|
+
eps = entry_points().get("agent_evolve.integrations", []) # py<3.10 shim
|
|
92
|
+
for ep in eps:
|
|
93
|
+
try:
|
|
94
|
+
ep.load()
|
|
95
|
+
except Exception as exc: # noqa: BLE001 - recorded, then reported on use
|
|
96
|
+
load_failures[getattr(ep, "name", str(ep))] = f"{type(exc).__name__}: {exc}"
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def explain_missing_harness(harness_id: str) -> str:
|
|
100
|
+
"""Return a usable message for a harness that is not registered."""
|
|
101
|
+
known = sorted(harness_registry.ids()) if hasattr(harness_registry, "ids") else []
|
|
102
|
+
if not load_failures:
|
|
103
|
+
return f"Unknown proposer {harness_id!r}. Available: {known}."
|
|
104
|
+
reasons = "; ".join(f"{name} failed to load ({why})" for name, why in load_failures.items())
|
|
105
|
+
return (
|
|
106
|
+
f"Unknown proposer {harness_id!r}. Available: {known}. {reasons}. "
|
|
107
|
+
"Install the optional dependency, e.g. pip install 'agentevolve-optimizer[llm]'."
|
|
108
|
+
)
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
"""Workload-neutral high-level campaign presets.
|
|
2
|
+
|
|
3
|
+
This module owns generational shape, delayed reflection chronology, exact
|
|
4
|
+
budgets, and concurrency. Workload adapters remain in ``WorkloadKit`` while
|
|
5
|
+
method implementations remain injectable as ``PortfolioCampaignBehavior``.
|
|
6
|
+
The split prevents a domain package from copying a thousand-line launcher just
|
|
7
|
+
to change seeds, an evaluator, or static prompt semantics.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
import re
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
|
|
17
|
+
from agent_evolve.application.budgeted_optimizer import OptimizerBudget
|
|
18
|
+
from agent_evolve.application.evolution_campaign import (
|
|
19
|
+
ArchiveUtilityPort,
|
|
20
|
+
CampaignAgentRuntimePort,
|
|
21
|
+
CampaignConcurrency,
|
|
22
|
+
CampaignJournalPort,
|
|
23
|
+
CampaignPolicies,
|
|
24
|
+
CampaignPolicyBinding,
|
|
25
|
+
CampaignProtocol,
|
|
26
|
+
CampaignReflectionSupervisionPolicy,
|
|
27
|
+
EvolutionCampaign,
|
|
28
|
+
SealedCutoffDelayedAdmissionCadence,
|
|
29
|
+
TerminalReflectionPolicy,
|
|
30
|
+
)
|
|
31
|
+
from agent_evolve.campaign_workload import AgenticCampaignWorkloadConfig
|
|
32
|
+
from agent_evolve.workload_kit import WorkloadKit
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_PRESET_DEFINITION_DOMAIN = b"agent-evolve:delayed-portfolio-preset:v1\x00"
|
|
36
|
+
_SCALE_SHAPE_DOMAIN = b"agent-evolve:portfolio-scale-shape:v1\x00"
|
|
37
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_]{0,95}$")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _canonical_bytes(value: object) -> bytes:
|
|
41
|
+
return json.dumps(
|
|
42
|
+
value,
|
|
43
|
+
allow_nan=False,
|
|
44
|
+
ensure_ascii=True,
|
|
45
|
+
separators=(",", ":"),
|
|
46
|
+
sort_keys=True,
|
|
47
|
+
).encode("ascii", errors="strict")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
51
|
+
return hashlib.sha256(domain + _canonical_bytes(value)).hexdigest()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass(frozen=True, slots=True)
|
|
55
|
+
class PortfolioScaleShape:
|
|
56
|
+
"""One workload-neutral depth/width/operator opportunity shape."""
|
|
57
|
+
|
|
58
|
+
shape_id: str
|
|
59
|
+
generation_count: int
|
|
60
|
+
parents_per_portfolio_generation: int
|
|
61
|
+
portfolio_width: int
|
|
62
|
+
recombinations_per_parent: int
|
|
63
|
+
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
if type(self.shape_id) is not str or _TOKEN.fullmatch(self.shape_id) is None:
|
|
66
|
+
raise ValueError("shape_id must use the closed lowercase token grammar")
|
|
67
|
+
if (
|
|
68
|
+
type(self.generation_count) is not int
|
|
69
|
+
or not 3 <= self.generation_count <= 24
|
|
70
|
+
):
|
|
71
|
+
raise ValueError("generation_count must lie in [3, 24]")
|
|
72
|
+
for name in (
|
|
73
|
+
"parents_per_portfolio_generation",
|
|
74
|
+
"portfolio_width",
|
|
75
|
+
"recombinations_per_parent",
|
|
76
|
+
):
|
|
77
|
+
value = getattr(self, name)
|
|
78
|
+
if type(value) is not int or value <= 0:
|
|
79
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
80
|
+
if self.portfolio_width < 2:
|
|
81
|
+
raise ValueError("portfolio_width must be at least two")
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def portfolio_generation_count(self) -> int:
|
|
85
|
+
self.__post_init__()
|
|
86
|
+
return (self.generation_count + 1) // 2
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def recombination_generation_count(self) -> int:
|
|
90
|
+
self.__post_init__()
|
|
91
|
+
return self.generation_count // 2
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def planned_offspring_occurrences(self) -> int:
|
|
95
|
+
self.__post_init__()
|
|
96
|
+
return self.parents_per_portfolio_generation * (
|
|
97
|
+
self.portfolio_generation_count * self.portfolio_width
|
|
98
|
+
+ self.recombination_generation_count * self.recombinations_per_parent
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def to_record(self) -> dict[str, object]:
|
|
102
|
+
self.__post_init__()
|
|
103
|
+
return {
|
|
104
|
+
"schema_version": 1,
|
|
105
|
+
"shape_id": self.shape_id,
|
|
106
|
+
"generation_count": self.generation_count,
|
|
107
|
+
"parents_per_portfolio_generation": (
|
|
108
|
+
self.parents_per_portfolio_generation
|
|
109
|
+
),
|
|
110
|
+
"portfolio_width": self.portfolio_width,
|
|
111
|
+
"recombinations_per_parent": self.recombinations_per_parent,
|
|
112
|
+
"portfolio_generation_count": self.portfolio_generation_count,
|
|
113
|
+
"recombination_generation_count": self.recombination_generation_count,
|
|
114
|
+
"planned_offspring_occurrences": self.planned_offspring_occurrences,
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def definition_sha256(self) -> str:
|
|
119
|
+
return _hash(_SCALE_SHAPE_DOMAIN, self.to_record())
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
EQUAL_60_OFFSPRING_SCALE_SHAPES = {
|
|
123
|
+
value.shape_id: value
|
|
124
|
+
for value in (
|
|
125
|
+
# The agentic selector has an authenticated support width of eight.
|
|
126
|
+
# Keep every equal-budget treatment inside that generic interface and
|
|
127
|
+
# shift the short-run opportunity into recombination instead of asking
|
|
128
|
+
# one call for an impossible fourteen-candidate portfolio.
|
|
129
|
+
PortfolioScaleShape("g4_k8_r7", 4, 2, 8, 7),
|
|
130
|
+
PortfolioScaleShape("g6_k8_r2", 6, 2, 8, 2),
|
|
131
|
+
PortfolioScaleShape("g10_k4_r2", 10, 2, 4, 2),
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Equal-budget B38 shapes. The two campaign seeds are outside the 36
|
|
137
|
+
# offspring opportunities. Keeping the alternatives in one workload-neutral
|
|
138
|
+
# registry prevents benchmark runners from silently rebuilding different
|
|
139
|
+
# schedules with local constants.
|
|
140
|
+
#
|
|
141
|
+
# ``g6_k5_r1`` is the anchor-heavy successor: for two parent lanes it preserves
|
|
142
|
+
# the reference shape's eighteen semantic portfolio positions, doubles the
|
|
143
|
+
# capacity available to a four-member protected numerical batch (six to twelve
|
|
144
|
+
# evaluated positions over the campaign), and halves compulsory
|
|
145
|
+
# recombination from twelve to six positions. It changes allocation
|
|
146
|
+
# opportunity, not the total real-evaluation budget.
|
|
147
|
+
EQUAL_36_OFFSPRING_SCALE_SHAPES = {
|
|
148
|
+
value.shape_id: value
|
|
149
|
+
for value in (
|
|
150
|
+
PortfolioScaleShape("g6_k4_r2", 6, 2, 4, 2),
|
|
151
|
+
PortfolioScaleShape("g6_k5_r1", 6, 2, 5, 1),
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# Truthfully separate near-reference-budget successors from the exactly B38
|
|
157
|
+
# registry. Both successors stay inside the already-qualified K8-to-K4
|
|
158
|
+
# selector. ``g6_k4_r1`` is a B32 screening rung (24 portfolio + 6
|
|
159
|
+
# recombination occurrences); ``g7_k4_r1`` is the B40 expansion rung (32 + 6).
|
|
160
|
+
SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES = {
|
|
161
|
+
**EQUAL_36_OFFSPRING_SCALE_SHAPES,
|
|
162
|
+
"g6_k4_r1": PortfolioScaleShape("g6_k4_r1", 6, 2, 4, 1),
|
|
163
|
+
"g7_k4_r1": PortfolioScaleShape("g7_k4_r1", 7, 2, 4, 1),
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
# Anytime-curve rungs. Everything above is a near-reference budget, so until
|
|
168
|
+
# now the largest expressible campaign was B40 -- and that was a **registry
|
|
169
|
+
# cap, not a design choice**. It is the reason every number this project holds
|
|
170
|
+
# sits at B=38: a claim about evaluation efficiency is a claim about a curve,
|
|
171
|
+
# and no curve past B40 could be expressed at all.
|
|
172
|
+
#
|
|
173
|
+
# These rungs are additions. No entry above is modified, so nothing in flight
|
|
174
|
+
# changes shape underneath it; a run selects by ``shape_id`` and every existing
|
|
175
|
+
# id still resolves to exactly the shape it did before.
|
|
176
|
+
#
|
|
177
|
+
# Budget, from ``planned_offspring_occurrences``:
|
|
178
|
+
# P * (ceil(G/2) * K + floor(G/2) * R) plus the two benchmark seeds
|
|
179
|
+
#
|
|
180
|
+
# ``g24_k17_r8`` is the classical-matched rung: 600 offspring + 2 seeds = 602
|
|
181
|
+
# charged occurrences, matching the sealed classical anytime arms' budget of
|
|
182
|
+
# 600 so our curve and NSGA-II's are read on the same axis. It preserves the
|
|
183
|
+
# reference rung's 2:1 portfolio-to-recombination balance (g6_k4_r2 is K=4,
|
|
184
|
+
# R=2), so it is the same method run longer rather than a different one.
|
|
185
|
+
# ``g12_k8_r4`` is the same balance at 144 + 2 = 146, a cheaper rung for
|
|
186
|
+
# smoking the path before the full curve is bought.
|
|
187
|
+
#
|
|
188
|
+
# ``generation_count`` is independently capped at 24 by ``PortfolioScaleShape``
|
|
189
|
+
# validation, so depth alone cannot reach 600; these rungs buy the remaining
|
|
190
|
+
# budget in width, which is why K is large rather than G.
|
|
191
|
+
ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES = {
|
|
192
|
+
value.shape_id: value
|
|
193
|
+
for value in (
|
|
194
|
+
PortfolioScaleShape("g12_k8_r4", 12, 2, 8, 4),
|
|
195
|
+
PortfolioScaleShape("g24_k17_r8", 24, 2, 17, 8),
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
#: Every registered shape, small-budget and anytime-curve alike. Lookups that
|
|
201
|
+
#: want the full set use this; the two registries above stay exactly as they
|
|
202
|
+
#: were for any caller that deliberately wants only the near-reference rungs.
|
|
203
|
+
CAMPAIGN_SCALE_SHAPES = {
|
|
204
|
+
**SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES,
|
|
205
|
+
**ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES,
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
CLASSICAL_MATCHED_B602_SCALE_SHAPE = ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES[
|
|
210
|
+
"g24_k17_r8"
|
|
211
|
+
]
|
|
212
|
+
ANYTIME_SMOKE_B146_SCALE_SHAPE = ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES[
|
|
213
|
+
"g12_k8_r4"
|
|
214
|
+
]
|
|
215
|
+
REFERENCE_36_OFFSPRING_SCALE_SHAPE = EQUAL_36_OFFSPRING_SCALE_SHAPES[
|
|
216
|
+
"g6_k4_r2"
|
|
217
|
+
]
|
|
218
|
+
ANCHOR_HEAVY_36_OFFSPRING_SCALE_SHAPE = EQUAL_36_OFFSPRING_SCALE_SHAPES[
|
|
219
|
+
"g6_k5_r1"
|
|
220
|
+
]
|
|
221
|
+
REFERENCE_HEAVY_B40_SCALE_SHAPE = SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES[
|
|
222
|
+
"g7_k4_r1"
|
|
223
|
+
]
|
|
224
|
+
REFERENCE_HEAVY_B32_SCALE_SHAPE = SMALL_BUDGET_CAMPAIGN_SCALE_SHAPES[
|
|
225
|
+
"g6_k4_r1"
|
|
226
|
+
]
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
@dataclass(frozen=True, slots=True)
|
|
230
|
+
class PortfolioCampaignBehavior:
|
|
231
|
+
"""Method-owned collaborators, deliberately separate from a workload."""
|
|
232
|
+
|
|
233
|
+
parent_selection: CampaignPolicyBinding
|
|
234
|
+
memory_assignment: CampaignPolicyBinding
|
|
235
|
+
portfolio_selection: CampaignPolicyBinding
|
|
236
|
+
recombination: CampaignPolicyBinding
|
|
237
|
+
reflection: CampaignPolicyBinding
|
|
238
|
+
archive_utility: ArchiveUtilityPort
|
|
239
|
+
reflection_supervision: CampaignReflectionSupervisionPolicy = (
|
|
240
|
+
CampaignReflectionSupervisionPolicy()
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
def __post_init__(self) -> None:
|
|
244
|
+
for name in (
|
|
245
|
+
"parent_selection",
|
|
246
|
+
"memory_assignment",
|
|
247
|
+
"portfolio_selection",
|
|
248
|
+
"recombination",
|
|
249
|
+
"reflection",
|
|
250
|
+
):
|
|
251
|
+
value = getattr(self, name)
|
|
252
|
+
if type(value) is not CampaignPolicyBinding:
|
|
253
|
+
raise TypeError(f"{name} must be an exact CampaignPolicyBinding")
|
|
254
|
+
CampaignPolicyBinding.__post_init__(value)
|
|
255
|
+
if not isinstance(self.archive_utility, ArchiveUtilityPort):
|
|
256
|
+
raise TypeError("archive_utility must implement ArchiveUtilityPort")
|
|
257
|
+
if type(self.reflection_supervision) is not (
|
|
258
|
+
CampaignReflectionSupervisionPolicy
|
|
259
|
+
):
|
|
260
|
+
raise TypeError(
|
|
261
|
+
"reflection_supervision must be exact "
|
|
262
|
+
"CampaignReflectionSupervisionPolicy"
|
|
263
|
+
)
|
|
264
|
+
CampaignReflectionSupervisionPolicy.__post_init__(
|
|
265
|
+
self.reflection_supervision
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
@classmethod
|
|
269
|
+
def from_campaign_policies(
|
|
270
|
+
cls,
|
|
271
|
+
policies: CampaignPolicies,
|
|
272
|
+
) -> "PortfolioCampaignBehavior":
|
|
273
|
+
"""Migrate an existing strict policy bundle without changing identity."""
|
|
274
|
+
|
|
275
|
+
if type(policies) is not CampaignPolicies:
|
|
276
|
+
raise TypeError("policies must be an exact CampaignPolicies")
|
|
277
|
+
CampaignPolicies.__post_init__(policies)
|
|
278
|
+
return cls(
|
|
279
|
+
parent_selection=policies.parent_selection,
|
|
280
|
+
memory_assignment=policies.memory_assignment,
|
|
281
|
+
portfolio_selection=policies.portfolio_selection,
|
|
282
|
+
recombination=policies.recombination,
|
|
283
|
+
reflection=policies.reflection,
|
|
284
|
+
archive_utility=policies.archive_utility,
|
|
285
|
+
reflection_supervision=policies.reflection_supervision,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def bind(self) -> CampaignPolicies:
|
|
289
|
+
"""Bind this behavior to the preset's sealed delayed cadence."""
|
|
290
|
+
|
|
291
|
+
self.__post_init__()
|
|
292
|
+
return CampaignPolicies(
|
|
293
|
+
cadence=SealedCutoffDelayedAdmissionCadence(),
|
|
294
|
+
parent_selection=self.parent_selection,
|
|
295
|
+
memory_assignment=self.memory_assignment,
|
|
296
|
+
portfolio_selection=self.portfolio_selection,
|
|
297
|
+
recombination=self.recombination,
|
|
298
|
+
reflection=self.reflection,
|
|
299
|
+
archive_utility=self.archive_utility,
|
|
300
|
+
reflection_supervision=self.reflection_supervision,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
@dataclass(frozen=True, slots=True)
|
|
305
|
+
class DelayedPortfolioCampaignPreset:
|
|
306
|
+
"""Exact P/R campaign plan with useful, delayed, quarantined reflection."""
|
|
307
|
+
|
|
308
|
+
generation_count: int
|
|
309
|
+
outer_seed: int
|
|
310
|
+
parents_per_portfolio_generation: int = 2
|
|
311
|
+
portfolio_width: int = 4
|
|
312
|
+
recombinations_per_parent: int = 2
|
|
313
|
+
evaluator_concurrency: int = 1
|
|
314
|
+
agent_concurrency: int = 3
|
|
315
|
+
agent_queue_capacity: int = 8
|
|
316
|
+
|
|
317
|
+
def __post_init__(self) -> None:
|
|
318
|
+
if type(self.generation_count) is not int or not 3 <= self.generation_count <= 24:
|
|
319
|
+
raise ValueError("generation_count must lie in [3, 24]")
|
|
320
|
+
if type(self.outer_seed) is not int or not -(1 << 127) <= self.outer_seed < (
|
|
321
|
+
1 << 127
|
|
322
|
+
):
|
|
323
|
+
raise ValueError("outer_seed must be an exact signed int128")
|
|
324
|
+
for name in (
|
|
325
|
+
"parents_per_portfolio_generation",
|
|
326
|
+
"recombinations_per_parent",
|
|
327
|
+
"evaluator_concurrency",
|
|
328
|
+
"agent_concurrency",
|
|
329
|
+
):
|
|
330
|
+
value = getattr(self, name)
|
|
331
|
+
if type(value) is not int or value <= 0:
|
|
332
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
333
|
+
if type(self.portfolio_width) is not int or self.portfolio_width < 2:
|
|
334
|
+
raise ValueError("portfolio_width must be at least two")
|
|
335
|
+
if (
|
|
336
|
+
type(self.agent_queue_capacity) is not int
|
|
337
|
+
or self.agent_queue_capacity < self.agent_concurrency
|
|
338
|
+
):
|
|
339
|
+
raise ValueError("agent_queue_capacity must cover agent_concurrency")
|
|
340
|
+
|
|
341
|
+
@classmethod
|
|
342
|
+
def generations(
|
|
343
|
+
cls,
|
|
344
|
+
generation_count: int,
|
|
345
|
+
*,
|
|
346
|
+
outer_seed: int,
|
|
347
|
+
parents_per_portfolio_generation: int = 2,
|
|
348
|
+
portfolio_width: int = 4,
|
|
349
|
+
recombinations_per_parent: int = 2,
|
|
350
|
+
evaluator_concurrency: int = 1,
|
|
351
|
+
agent_concurrency: int = 3,
|
|
352
|
+
agent_queue_capacity: int = 8,
|
|
353
|
+
) -> "DelayedPortfolioCampaignPreset":
|
|
354
|
+
"""Readable public constructor used by experiment manifests."""
|
|
355
|
+
|
|
356
|
+
return cls(
|
|
357
|
+
generation_count=generation_count,
|
|
358
|
+
outer_seed=outer_seed,
|
|
359
|
+
parents_per_portfolio_generation=parents_per_portfolio_generation,
|
|
360
|
+
portfolio_width=portfolio_width,
|
|
361
|
+
recombinations_per_parent=recombinations_per_parent,
|
|
362
|
+
evaluator_concurrency=evaluator_concurrency,
|
|
363
|
+
agent_concurrency=agent_concurrency,
|
|
364
|
+
agent_queue_capacity=agent_queue_capacity,
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
@classmethod
|
|
368
|
+
def scale_shape(
|
|
369
|
+
cls,
|
|
370
|
+
shape: PortfolioScaleShape,
|
|
371
|
+
*,
|
|
372
|
+
outer_seed: int,
|
|
373
|
+
evaluator_concurrency: int = 1,
|
|
374
|
+
agent_concurrency: int = 3,
|
|
375
|
+
agent_queue_capacity: int = 8,
|
|
376
|
+
) -> "DelayedPortfolioCampaignPreset":
|
|
377
|
+
"""Construct a preset from one authenticated experimental shape."""
|
|
378
|
+
|
|
379
|
+
if type(shape) is not PortfolioScaleShape:
|
|
380
|
+
raise TypeError("shape must be an exact PortfolioScaleShape")
|
|
381
|
+
shape.__post_init__()
|
|
382
|
+
return cls.generations(
|
|
383
|
+
shape.generation_count,
|
|
384
|
+
outer_seed=outer_seed,
|
|
385
|
+
parents_per_portfolio_generation=(
|
|
386
|
+
shape.parents_per_portfolio_generation
|
|
387
|
+
),
|
|
388
|
+
portfolio_width=shape.portfolio_width,
|
|
389
|
+
recombinations_per_parent=shape.recombinations_per_parent,
|
|
390
|
+
evaluator_concurrency=evaluator_concurrency,
|
|
391
|
+
agent_concurrency=agent_concurrency,
|
|
392
|
+
agent_queue_capacity=agent_queue_capacity,
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
def to_record(self) -> dict[str, object]:
|
|
396
|
+
self.__post_init__()
|
|
397
|
+
return {
|
|
398
|
+
"schema_version": 1,
|
|
399
|
+
"preset_id": "sealed_cutoff_delayed_portfolio",
|
|
400
|
+
"preset_version": 1,
|
|
401
|
+
"generation_count": self.generation_count,
|
|
402
|
+
"parents_per_portfolio_generation": (
|
|
403
|
+
self.parents_per_portfolio_generation
|
|
404
|
+
),
|
|
405
|
+
"portfolio_width": self.portfolio_width,
|
|
406
|
+
"recombinations_per_parent": self.recombinations_per_parent,
|
|
407
|
+
"reflections_per_recombination_generation": 1,
|
|
408
|
+
"reflection_promotion_block_pairs": 1,
|
|
409
|
+
"terminal_reflection_policy": (
|
|
410
|
+
TerminalReflectionPolicy.REQUIRE_FUTURE_PORTFOLIO_CONSUMER.value
|
|
411
|
+
),
|
|
412
|
+
"evaluator_concurrency": self.evaluator_concurrency,
|
|
413
|
+
"agent_concurrency": self.agent_concurrency,
|
|
414
|
+
"agent_queue_capacity": self.agent_queue_capacity,
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
@property
|
|
418
|
+
def definition_sha256(self) -> str:
|
|
419
|
+
return _hash(_PRESET_DEFINITION_DOMAIN, self.to_record())
|
|
420
|
+
|
|
421
|
+
def protocol(self, *, required_seed_count: int) -> CampaignProtocol:
|
|
422
|
+
"""Build the exact protocol; the outer seed remains separately bound."""
|
|
423
|
+
|
|
424
|
+
if type(required_seed_count) is not int or required_seed_count <= 0:
|
|
425
|
+
raise ValueError("required_seed_count must be a positive exact integer")
|
|
426
|
+
return CampaignProtocol(
|
|
427
|
+
protocol_id="sealed_cutoff_delayed_portfolio",
|
|
428
|
+
protocol_version=1,
|
|
429
|
+
definition_sha256=self.definition_sha256,
|
|
430
|
+
outer_seed=self.outer_seed,
|
|
431
|
+
generation_count=self.generation_count,
|
|
432
|
+
required_seed_count=required_seed_count,
|
|
433
|
+
parents_per_portfolio_generation=(
|
|
434
|
+
self.parents_per_portfolio_generation
|
|
435
|
+
),
|
|
436
|
+
portfolio_width=self.portfolio_width,
|
|
437
|
+
recombinations_per_parent=self.recombinations_per_parent,
|
|
438
|
+
reflections_per_recombination_generation=1,
|
|
439
|
+
reflection_promotion_block_pairs=1,
|
|
440
|
+
terminal_reflection_policy=(
|
|
441
|
+
TerminalReflectionPolicy.REQUIRE_FUTURE_PORTFOLIO_CONSUMER
|
|
442
|
+
),
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
def budget(self, *, required_seed_count: int) -> OptimizerBudget:
|
|
446
|
+
"""Derive—not hand-maintain—the exact maximum schedule budget."""
|
|
447
|
+
|
|
448
|
+
protocol = self.protocol(required_seed_count=required_seed_count)
|
|
449
|
+
schedule = SealedCutoffDelayedAdmissionCadence().build(protocol)
|
|
450
|
+
return OptimizerBudget(
|
|
451
|
+
max_unique_evaluations=(
|
|
452
|
+
required_seed_count + schedule.planned_candidate_evaluations
|
|
453
|
+
),
|
|
454
|
+
max_logical_llm_calls=schedule.planned_agent_calls,
|
|
455
|
+
max_generations=self.generation_count,
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
def concurrency(self) -> CampaignConcurrency:
|
|
459
|
+
return CampaignConcurrency(
|
|
460
|
+
evaluator_concurrency=self.evaluator_concurrency,
|
|
461
|
+
agent_concurrency=self.agent_concurrency,
|
|
462
|
+
agent_queue_capacity=self.agent_queue_capacity,
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
def compose(
|
|
466
|
+
self,
|
|
467
|
+
*,
|
|
468
|
+
workload: WorkloadKit | AgenticCampaignWorkloadConfig,
|
|
469
|
+
behavior: PortfolioCampaignBehavior,
|
|
470
|
+
runtime: CampaignAgentRuntimePort,
|
|
471
|
+
journals: tuple[CampaignJournalPort, ...],
|
|
472
|
+
) -> EvolutionCampaign:
|
|
473
|
+
"""Compose a strict campaign without running preflight or live waves."""
|
|
474
|
+
|
|
475
|
+
self.__post_init__()
|
|
476
|
+
if type(workload) is WorkloadKit:
|
|
477
|
+
config = workload.to_campaign_workload()
|
|
478
|
+
elif type(workload) is AgenticCampaignWorkloadConfig:
|
|
479
|
+
config = workload
|
|
480
|
+
AgenticCampaignWorkloadConfig.__post_init__(config)
|
|
481
|
+
else:
|
|
482
|
+
raise TypeError(
|
|
483
|
+
"workload must be exact WorkloadKit or "
|
|
484
|
+
"AgenticCampaignWorkloadConfig"
|
|
485
|
+
)
|
|
486
|
+
if self.evaluator_concurrency > config.evaluator_concurrency_cap:
|
|
487
|
+
raise ValueError(
|
|
488
|
+
"preset evaluator concurrency exceeds workload admission cap"
|
|
489
|
+
)
|
|
490
|
+
if type(behavior) is not PortfolioCampaignBehavior:
|
|
491
|
+
raise TypeError("behavior must be exact PortfolioCampaignBehavior")
|
|
492
|
+
behavior.__post_init__()
|
|
493
|
+
required_seed_count = len(config.seeds)
|
|
494
|
+
return EvolutionCampaign(
|
|
495
|
+
protocol=self.protocol(required_seed_count=required_seed_count),
|
|
496
|
+
workload=config.build_ports(),
|
|
497
|
+
policies=behavior.bind(),
|
|
498
|
+
runtime=runtime,
|
|
499
|
+
budget=self.budget(required_seed_count=required_seed_count),
|
|
500
|
+
concurrency=self.concurrency(),
|
|
501
|
+
journals=journals,
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
__all__ = [
|
|
506
|
+
"ANCHOR_HEAVY_36_OFFSPRING_SCALE_SHAPE",
|
|
507
|
+
"ANYTIME_CURVE_CAMPAIGN_SCALE_SHAPES",
|
|
508
|
+
"ANYTIME_SMOKE_B146_SCALE_SHAPE",
|
|
509
|
+
"CAMPAIGN_SCALE_SHAPES",
|
|
510
|
+
"CLASSICAL_MATCHED_B602_SCALE_SHAPE",
|
|
511
|
+
"DelayedPortfolioCampaignPreset",
|
|
512
|
+
"EQUAL_36_OFFSPRING_SCALE_SHAPES",
|
|
513
|
+
"EQUAL_60_OFFSPRING_SCALE_SHAPES",
|
|
514
|
+
"PortfolioCampaignBehavior",
|
|
515
|
+
"PortfolioScaleShape",
|
|
516
|
+
"REFERENCE_36_OFFSPRING_SCALE_SHAPE",
|
|
517
|
+
]
|