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,226 @@
|
|
|
1
|
+
"""Workload-neutral source labels for sealed finite variation options.
|
|
2
|
+
|
|
3
|
+
Variation source is a property of how a candidate configuration entered the
|
|
4
|
+
finite action universe. It is deliberately independent of whether a language
|
|
5
|
+
model retained the option or deterministic reconciliation inserted it. The
|
|
6
|
+
latter remains semantic-provenance evidence; conflating the two would split one
|
|
7
|
+
proposal source across unrelated posterior arms.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
|
|
14
|
+
from agent_evolve.domain.finite_variation import (
|
|
15
|
+
FiniteVariationContract,
|
|
16
|
+
FiniteVariationOption,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
PRIMARY_VARIATION_SOURCE_ID = "primary"
|
|
21
|
+
VARIATION_SOURCE_METADATA_KEY = "evaluation_source"
|
|
22
|
+
VARIATION_SOURCE_MINIMUM_METADATA_KEY = "evaluation_source_minimum"
|
|
23
|
+
VARIATION_SOURCE_RANK_METADATA_KEY = "evaluation_source_rank"
|
|
24
|
+
VARIATION_OPERATOR_METADATA_KEY = "evaluation_operator"
|
|
25
|
+
VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY = "evaluation_diversity_signature"
|
|
26
|
+
VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY = (
|
|
27
|
+
"candidate_pool_membership_requirement"
|
|
28
|
+
)
|
|
29
|
+
_SOURCE_ID = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _source_id_from_validated_option(option: FiniteVariationOption) -> str:
|
|
33
|
+
"""Project source metadata after one enclosing graph validation."""
|
|
34
|
+
|
|
35
|
+
source_id = dict(option.metadata).get(
|
|
36
|
+
VARIATION_SOURCE_METADATA_KEY,
|
|
37
|
+
PRIMARY_VARIATION_SOURCE_ID,
|
|
38
|
+
)
|
|
39
|
+
if _SOURCE_ID.fullmatch(source_id) is None:
|
|
40
|
+
raise ValueError("variation source ID must use the closed token grammar")
|
|
41
|
+
return source_id
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def finite_variation_source_id(option: FiniteVariationOption) -> str:
|
|
45
|
+
"""Return one sealed source label, inheriting ``primary`` when absent."""
|
|
46
|
+
|
|
47
|
+
if type(option) is not FiniteVariationOption:
|
|
48
|
+
raise TypeError("option must be an exact FiniteVariationOption")
|
|
49
|
+
option.__post_init__()
|
|
50
|
+
return _source_id_from_validated_option(option)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def finite_variation_source_by_option(
|
|
54
|
+
contract: FiniteVariationContract,
|
|
55
|
+
) -> dict[str, str]:
|
|
56
|
+
"""Project a finite contract into exact option-to-source attribution."""
|
|
57
|
+
|
|
58
|
+
if type(contract) is not FiniteVariationContract:
|
|
59
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
60
|
+
contract.__post_init__()
|
|
61
|
+
return {
|
|
62
|
+
option.option_id: _source_id_from_validated_option(option)
|
|
63
|
+
for option in contract.options
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def finite_variation_source_ids(
|
|
68
|
+
contract: FiniteVariationContract,
|
|
69
|
+
) -> tuple[str, ...]:
|
|
70
|
+
"""Return the canonical source-arm universe declared by one contract."""
|
|
71
|
+
|
|
72
|
+
return tuple(sorted(set(finite_variation_source_by_option(contract).values())))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def finite_variation_source_minimum_counts(
|
|
76
|
+
contract: FiniteVariationContract,
|
|
77
|
+
) -> tuple[tuple[str, int], ...]:
|
|
78
|
+
"""Project semantic evaluator-exposure floors from a finite contract.
|
|
79
|
+
|
|
80
|
+
The result deliberately names source counts rather than representative
|
|
81
|
+
option IDs. Structural feasibility layers can therefore choose any
|
|
82
|
+
compatible action from a source while retaining one workload-neutral
|
|
83
|
+
inverted API.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
if type(contract) is not FiniteVariationContract:
|
|
87
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
88
|
+
contract.__post_init__()
|
|
89
|
+
available_by_source: dict[str, int] = {}
|
|
90
|
+
minimum_by_source: dict[str, int] = {}
|
|
91
|
+
for option in contract.options:
|
|
92
|
+
metadata = dict(option.metadata)
|
|
93
|
+
source_id = metadata.get(VARIATION_SOURCE_METADATA_KEY)
|
|
94
|
+
raw_minimum = metadata.get(VARIATION_SOURCE_MINIMUM_METADATA_KEY)
|
|
95
|
+
if source_id is None and raw_minimum is None:
|
|
96
|
+
continue
|
|
97
|
+
if source_id is None:
|
|
98
|
+
raise ValueError("source exposure minimum requires a source ID")
|
|
99
|
+
if source_id != _source_id_from_validated_option(option):
|
|
100
|
+
raise ValueError("source option metadata differs from its source ID")
|
|
101
|
+
if raw_minimum is None:
|
|
102
|
+
# Attribution and hard exposure are deliberately independent.
|
|
103
|
+
continue
|
|
104
|
+
if not raw_minimum.isascii() or not raw_minimum.isdigit():
|
|
105
|
+
raise ValueError("evaluation source minimum must be decimal digits")
|
|
106
|
+
minimum = int(raw_minimum)
|
|
107
|
+
if not 1 <= minimum < 8:
|
|
108
|
+
raise ValueError("evaluation source minimum must lie in [1, 8)")
|
|
109
|
+
previous = minimum_by_source.setdefault(source_id, minimum)
|
|
110
|
+
if previous != minimum:
|
|
111
|
+
raise ValueError("one proposal source declares inconsistent minimums")
|
|
112
|
+
available_by_source[source_id] = available_by_source.get(source_id, 0) + 1
|
|
113
|
+
for source_id, minimum in minimum_by_source.items():
|
|
114
|
+
if available_by_source[source_id] < minimum:
|
|
115
|
+
raise ValueError("proposal source cannot satisfy its exposure minimum")
|
|
116
|
+
return tuple(sorted(minimum_by_source.items()))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def finite_variation_candidate_pool_required_option_ids(
|
|
120
|
+
contract: FiniteVariationContract,
|
|
121
|
+
) -> tuple[str, ...]:
|
|
122
|
+
"""Return options that must survive model-blind pool screening.
|
|
123
|
+
|
|
124
|
+
Pool membership is intentionally distinct from evaluator allocation. An
|
|
125
|
+
upstream expert may need a complete reference slate exposed to the model
|
|
126
|
+
and downstream allocator without forcing that slate to consume every real
|
|
127
|
+
evaluation slot. The closed metadata value prevents truthy-string or
|
|
128
|
+
workload-specific interpretations at the common-pool boundary.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
if type(contract) is not FiniteVariationContract:
|
|
132
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
133
|
+
contract.__post_init__()
|
|
134
|
+
required: list[str] = []
|
|
135
|
+
for option in contract.options:
|
|
136
|
+
raw = dict(option.metadata).get(
|
|
137
|
+
VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY
|
|
138
|
+
)
|
|
139
|
+
if raw is None:
|
|
140
|
+
continue
|
|
141
|
+
if raw != "required":
|
|
142
|
+
raise ValueError(
|
|
143
|
+
"candidate-pool membership requirement must be exactly required"
|
|
144
|
+
)
|
|
145
|
+
required.append(option.option_id)
|
|
146
|
+
return tuple(sorted(required))
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _operator_id_from_validated_option(option: FiniteVariationOption) -> str:
|
|
150
|
+
"""Project operator metadata after one enclosing graph validation."""
|
|
151
|
+
|
|
152
|
+
metadata = dict(option.metadata)
|
|
153
|
+
operator_id = metadata.get(VARIATION_OPERATOR_METADATA_KEY)
|
|
154
|
+
if operator_id is None:
|
|
155
|
+
operator_id = "composite" if "composition_radius" in metadata else "atomic"
|
|
156
|
+
if _SOURCE_ID.fullmatch(operator_id) is None:
|
|
157
|
+
raise ValueError("variation operator ID must use the closed token grammar")
|
|
158
|
+
return operator_id
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def finite_variation_operator_id(option: FiniteVariationOption) -> str:
|
|
162
|
+
"""Return a typed operator arm without inspecting workload identifiers.
|
|
163
|
+
|
|
164
|
+
New catalogs may declare ``evaluation_operator`` explicitly. Existing
|
|
165
|
+
authenticated radius-composition catalogs remain replayable through their
|
|
166
|
+
generic ``composition_radius`` metadata; all other options inherit the
|
|
167
|
+
primary atomic operator.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
if type(option) is not FiniteVariationOption:
|
|
171
|
+
raise TypeError("option must be an exact FiniteVariationOption")
|
|
172
|
+
option.__post_init__()
|
|
173
|
+
return _operator_id_from_validated_option(option)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def finite_variation_operator_by_option(
|
|
177
|
+
contract: FiniteVariationContract,
|
|
178
|
+
) -> dict[str, str]:
|
|
179
|
+
"""Project exact option-to-operator attribution in one validation pass."""
|
|
180
|
+
|
|
181
|
+
if type(contract) is not FiniteVariationContract:
|
|
182
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
183
|
+
contract.__post_init__()
|
|
184
|
+
return {
|
|
185
|
+
option.option_id: _operator_id_from_validated_option(option)
|
|
186
|
+
for option in contract.options
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def finite_variation_diversity_signature(option: FiniteVariationOption) -> str:
|
|
191
|
+
"""Return the adapter-declared typed diversity signature or action family.
|
|
192
|
+
|
|
193
|
+
This is an optional inverted-API seam. The default preserves the existing
|
|
194
|
+
finite-family semantics; workloads can later expose a finer phenotype-safe
|
|
195
|
+
signature without teaching the search controller domain names.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
if type(option) is not FiniteVariationOption:
|
|
199
|
+
raise TypeError("option must be an exact FiniteVariationOption")
|
|
200
|
+
option.__post_init__()
|
|
201
|
+
signature = dict(option.metadata).get(
|
|
202
|
+
VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY,
|
|
203
|
+
option.family,
|
|
204
|
+
)
|
|
205
|
+
if _SOURCE_ID.fullmatch(signature) is None:
|
|
206
|
+
raise ValueError("diversity signature must use the closed token grammar")
|
|
207
|
+
return signature
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
__all__ = [
|
|
211
|
+
"PRIMARY_VARIATION_SOURCE_ID",
|
|
212
|
+
"VARIATION_DIVERSITY_SIGNATURE_METADATA_KEY",
|
|
213
|
+
"VARIATION_CANDIDATE_POOL_REQUIREMENT_METADATA_KEY",
|
|
214
|
+
"VARIATION_OPERATOR_METADATA_KEY",
|
|
215
|
+
"VARIATION_SOURCE_METADATA_KEY",
|
|
216
|
+
"VARIATION_SOURCE_MINIMUM_METADATA_KEY",
|
|
217
|
+
"VARIATION_SOURCE_RANK_METADATA_KEY",
|
|
218
|
+
"finite_variation_diversity_signature",
|
|
219
|
+
"finite_variation_candidate_pool_required_option_ids",
|
|
220
|
+
"finite_variation_operator_by_option",
|
|
221
|
+
"finite_variation_operator_id",
|
|
222
|
+
"finite_variation_source_by_option",
|
|
223
|
+
"finite_variation_source_id",
|
|
224
|
+
"finite_variation_source_ids",
|
|
225
|
+
"finite_variation_source_minimum_counts",
|
|
226
|
+
]
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""Which operator the model is actually running, chosen per campaign.
|
|
2
|
+
|
|
3
|
+
Two modes, and the difference between them is not a hyper-parameter -- it is
|
|
4
|
+
which evolutionary operator exists at all.
|
|
5
|
+
|
|
6
|
+
``catalogue`` the engine enumerates a finite set of parent-relative edits and
|
|
7
|
+
the model selects among them. Model authority is one opaque
|
|
8
|
+
identifier; every child configuration is engine-owned. Sealed by
|
|
9
|
+
:mod:`agent_evolve.domain.finite_variation`, replayed by
|
|
10
|
+
resolving the identifier against the sealed contract. This is the
|
|
11
|
+
constrained mode: it certifies feasibility by construction and it
|
|
12
|
+
makes allocation a well-posed scoring problem. It also means the
|
|
13
|
+
model never generates anything, so mutation, crossover, offspring
|
|
14
|
+
generation and population initialization are all absent, and only
|
|
15
|
+
selection remains.
|
|
16
|
+
|
|
17
|
+
``generative`` the model emits configurations conforming to the problem's
|
|
18
|
+
``candidate_model``, rejected by ``validate`` when illegal and
|
|
19
|
+
built by ``materialize``. Sealed by
|
|
20
|
+
:mod:`agent_evolve.domain.generative_emission`, replayed from the
|
|
21
|
+
emission itself. This is the path the five public obligations
|
|
22
|
+
always admitted; what was missing was the audit trail, which is
|
|
23
|
+
the other half of this module's job.
|
|
24
|
+
|
|
25
|
+
**The matched null moves with the mode, and this module is where that is
|
|
26
|
+
enforced.** A generative arm sampled from an unbounded schema must be compared
|
|
27
|
+
against a null drawn from *that* schema, not from the catalogue the treatment no
|
|
28
|
+
longer uses. Comparing across supports is failure mode 2 in this project's own
|
|
29
|
+
taxonomy, and it is the easiest mistake to make here because the old null still
|
|
30
|
+
runs and still produces a number.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from dataclasses import dataclass
|
|
36
|
+
from typing import Any, Callable, Dict, Optional, Sequence
|
|
37
|
+
|
|
38
|
+
from agent_evolve.application.generative_proposal_journal import (
|
|
39
|
+
candidate_schema_sha256,
|
|
40
|
+
)
|
|
41
|
+
from agent_evolve.harness.generative_seal import SealedGenerativeHarness
|
|
42
|
+
from agent_evolve.proposers.random_proposer import RandomProposer
|
|
43
|
+
|
|
44
|
+
__all__ = [
|
|
45
|
+
"CATALOGUE",
|
|
46
|
+
"GENERATIVE",
|
|
47
|
+
"PROPOSAL_MODES",
|
|
48
|
+
"ProposalSupport",
|
|
49
|
+
"build_generative_proposer",
|
|
50
|
+
"build_matched_null_proposer",
|
|
51
|
+
"describe_support",
|
|
52
|
+
"require_matched_support",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
CATALOGUE = "catalogue"
|
|
56
|
+
GENERATIVE = "generative"
|
|
57
|
+
PROPOSAL_MODES = (GENERATIVE, CATALOGUE)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True)
|
|
61
|
+
class ProposalSupport:
|
|
62
|
+
"""The space a proposer is allowed to draw from, named so it can be checked.
|
|
63
|
+
|
|
64
|
+
``schema_sha256`` is present for the generative mode and is the whole story
|
|
65
|
+
there: the support *is* the schema. For the catalogue mode the support is the
|
|
66
|
+
sealed contract, which is parent-relative and therefore changes every
|
|
67
|
+
generation, so ``option_count`` describes one parent's neighbourhood rather
|
|
68
|
+
than the reachable space.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
mode: str
|
|
72
|
+
schema_sha256: Optional[str] = None
|
|
73
|
+
option_count: Optional[int] = None
|
|
74
|
+
|
|
75
|
+
def __post_init__(self) -> None:
|
|
76
|
+
if self.mode not in PROPOSAL_MODES:
|
|
77
|
+
raise ValueError(f"mode must be one of {PROPOSAL_MODES}, got {self.mode!r}")
|
|
78
|
+
if self.mode == GENERATIVE and not self.schema_sha256:
|
|
79
|
+
raise ValueError("a generative support is identified by its schema digest")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def describe_support(problem: Any, mode: str = GENERATIVE) -> ProposalSupport:
|
|
83
|
+
"""Name the support a campaign in *mode* would draw from."""
|
|
84
|
+
|
|
85
|
+
if mode == GENERATIVE:
|
|
86
|
+
return ProposalSupport(
|
|
87
|
+
mode=GENERATIVE,
|
|
88
|
+
schema_sha256=candidate_schema_sha256(
|
|
89
|
+
getattr(problem, "candidate_model", None)
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
return ProposalSupport(mode=CATALOGUE)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def require_matched_support(
|
|
96
|
+
treatment: ProposalSupport, null: ProposalSupport
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Refuse a comparison whose arms do not draw from the same space.
|
|
99
|
+
|
|
100
|
+
This is a hard failure and not a warning. A support mismatch does not make a
|
|
101
|
+
result noisy, it makes it about something other than what it claims, and the
|
|
102
|
+
number it produces looks entirely ordinary.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
if treatment.mode != null.mode:
|
|
106
|
+
raise ValueError(
|
|
107
|
+
f"support mismatch: the treatment proposes in {treatment.mode!r} mode "
|
|
108
|
+
f"and the null in {null.mode!r} mode. The null has to move with the "
|
|
109
|
+
"treatment or the comparison measures the change of support."
|
|
110
|
+
)
|
|
111
|
+
if treatment.mode == GENERATIVE and treatment.schema_sha256 != null.schema_sha256:
|
|
112
|
+
raise ValueError(
|
|
113
|
+
"support mismatch: treatment and null sample different candidate "
|
|
114
|
+
f"schemas ({treatment.schema_sha256} vs {null.schema_sha256})."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def build_generative_proposer(
|
|
119
|
+
problem: Any,
|
|
120
|
+
*,
|
|
121
|
+
delegate: Optional[Any] = None,
|
|
122
|
+
mode: str = "record",
|
|
123
|
+
validator: Optional[Callable[[Dict[str, Any]], Any]] = None,
|
|
124
|
+
sealed_calls: Sequence[Any] = (),
|
|
125
|
+
on_seal: Optional[Callable[[Dict[str, Any]], None]] = None,
|
|
126
|
+
) -> SealedGenerativeHarness:
|
|
127
|
+
"""Wrap *delegate* so its emissions are sealed against *problem*'s schema.
|
|
128
|
+
|
|
129
|
+
``validator`` defaults to the problem's own ``validate``, which is the point:
|
|
130
|
+
the feasibility rule that gates the run is the same one the seal records, so
|
|
131
|
+
a replay cannot be told a different story about what was legal.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
schema_sha256 = candidate_schema_sha256(getattr(problem, "candidate_model", None))
|
|
135
|
+
if validator is None:
|
|
136
|
+
validator = getattr(problem, "validate", None)
|
|
137
|
+
return SealedGenerativeHarness(
|
|
138
|
+
delegate,
|
|
139
|
+
candidate_schema_sha256=schema_sha256,
|
|
140
|
+
mode=mode,
|
|
141
|
+
validator=validator,
|
|
142
|
+
sealed_calls=sealed_calls,
|
|
143
|
+
on_seal=on_seal,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def build_matched_null_proposer(problem: Any, *, seed: Optional[int] = None):
|
|
148
|
+
"""The uninformed arm for a generative campaign: same schema, no model.
|
|
149
|
+
|
|
150
|
+
Returned rather than described, so an experiment cannot accidentally use the
|
|
151
|
+
catalogue-era null against a generative treatment. The schema digest it
|
|
152
|
+
reports is the same one :func:`build_generative_proposer` pins, and
|
|
153
|
+
:func:`require_matched_support` will say so.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
candidate_schema_sha256(getattr(problem, "candidate_model", None))
|
|
157
|
+
return RandomProposer(seed=seed)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Proposers: where candidates come from.
|
|
2
|
+
|
|
3
|
+
``random`` needs no credentials and is also the control arm every claim about
|
|
4
|
+
a model should be measured against. ``llm`` is the model-driven proposer and
|
|
5
|
+
resolves through the harness registry.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from agent_evolve.proposers.random_proposer import RandomProposer
|
|
9
|
+
|
|
10
|
+
__all__ = ["RandomProposer"]
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""A proposer that samples the candidate schema instead of calling a model.
|
|
2
|
+
|
|
3
|
+
This exists for two reasons and serves both equally.
|
|
4
|
+
|
|
5
|
+
It is the **credential-free path**: someone can install the package and watch
|
|
6
|
+
the loop run end to end -- seeds, validation, materialization, evaluation, a
|
|
7
|
+
Pareto front -- before deciding whether to spend anything on a provider.
|
|
8
|
+
|
|
9
|
+
It is also the **honest baseline**. Uninformed sampling over the same schema,
|
|
10
|
+
the same budget and the same evaluator is the control every claim in this
|
|
11
|
+
project is measured against, and on one benchmark a single median random draw
|
|
12
|
+
already accounted for roughly 80 percent of the hypervolume that a full
|
|
13
|
+
optimization run produced. Anyone deciding whether a model is worth paying for
|
|
14
|
+
on *their* problem should run this arm first. ``agent_evolve check`` does
|
|
15
|
+
exactly that.
|
|
16
|
+
|
|
17
|
+
Sampling is derived from the candidate model's JSON schema, so it needs no
|
|
18
|
+
problem-specific code. It is deliberately uninformed: it never reads the Pareto
|
|
19
|
+
front, the failures, or the insights, because a baseline that learned would not
|
|
20
|
+
be a baseline.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import random
|
|
26
|
+
import string
|
|
27
|
+
from typing import Any, Dict, List, Optional, Sequence
|
|
28
|
+
|
|
29
|
+
from agent_evolve.harness.base import HarnessBase
|
|
30
|
+
|
|
31
|
+
__all__ = ["RandomProposer"]
|
|
32
|
+
|
|
33
|
+
_MAX_TRIES_PER_CANDIDATE = 24
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class RandomProposer(HarnessBase):
|
|
37
|
+
"""Uninformed sampler over the candidate schema. No provider, no network."""
|
|
38
|
+
|
|
39
|
+
id = "random"
|
|
40
|
+
|
|
41
|
+
#: This proposer synthesises no guidance. Declared rather than
|
|
42
|
+
#: discovered, so the loop skips the insight calls instead of warning
|
|
43
|
+
#: about an empty return that is correct.
|
|
44
|
+
provides_insights = False
|
|
45
|
+
|
|
46
|
+
def __init__(self, seed: Optional[int] = None) -> None:
|
|
47
|
+
super().__init__()
|
|
48
|
+
self._rng = random.Random(seed)
|
|
49
|
+
self.calls: List[str] = []
|
|
50
|
+
|
|
51
|
+
# -- the seven harness operations -------------------------------------
|
|
52
|
+
# Candidate ops sample; insight ops return nothing, because an uninformed
|
|
53
|
+
# baseline that produced guidance would not be uninformed.
|
|
54
|
+
|
|
55
|
+
def generate_initial(self, n: int) -> List[Dict[str, Any]]:
|
|
56
|
+
return self._sample(n, "generate_initial")
|
|
57
|
+
|
|
58
|
+
def regenerate(
|
|
59
|
+
self,
|
|
60
|
+
failed_str: str,
|
|
61
|
+
n: int,
|
|
62
|
+
constraint_instruction: str,
|
|
63
|
+
performance_insights: str,
|
|
64
|
+
) -> List[Dict[str, Any]]:
|
|
65
|
+
return self._sample(n, "regenerate")
|
|
66
|
+
|
|
67
|
+
def generate_offspring(
|
|
68
|
+
self,
|
|
69
|
+
pareto_str: str,
|
|
70
|
+
n: int,
|
|
71
|
+
constraint_instruction: str,
|
|
72
|
+
performance_insights: str,
|
|
73
|
+
) -> List[Dict[str, Any]]:
|
|
74
|
+
return self._sample(n, "generate_offspring")
|
|
75
|
+
|
|
76
|
+
def regenerate_offspring(
|
|
77
|
+
self,
|
|
78
|
+
failed_str: str,
|
|
79
|
+
pareto_str: str,
|
|
80
|
+
n: int,
|
|
81
|
+
constraint_instruction: str,
|
|
82
|
+
performance_insights: str,
|
|
83
|
+
) -> List[Dict[str, Any]]:
|
|
84
|
+
return self._sample(n, "regenerate_offspring")
|
|
85
|
+
|
|
86
|
+
def failure_insights(self, failed_str: str, n_failed: int) -> List[str]:
|
|
87
|
+
return []
|
|
88
|
+
|
|
89
|
+
def constraint_instruction(self, failed_str: str, previous: Optional[str] = None) -> str:
|
|
90
|
+
return previous or ""
|
|
91
|
+
|
|
92
|
+
def performance_insights(
|
|
93
|
+
self,
|
|
94
|
+
stats_str: str,
|
|
95
|
+
pareto_str: str,
|
|
96
|
+
previous: Optional[str] = None,
|
|
97
|
+
) -> str:
|
|
98
|
+
return previous or ""
|
|
99
|
+
|
|
100
|
+
# -- sampling ----------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
def _sample(self, n: int, op: str) -> List[Dict[str, Any]]:
|
|
103
|
+
self.calls.append(op)
|
|
104
|
+
schema = self._schema()
|
|
105
|
+
return [self._draw_object(schema, schema) for _ in range(max(0, n))]
|
|
106
|
+
|
|
107
|
+
def _schema(self) -> Dict[str, Any]:
|
|
108
|
+
ctx = self._ctx
|
|
109
|
+
model = getattr(ctx, "candidate_model", None) if ctx is not None else None
|
|
110
|
+
if model is None:
|
|
111
|
+
return {}
|
|
112
|
+
try:
|
|
113
|
+
return model.model_json_schema()
|
|
114
|
+
except Exception:
|
|
115
|
+
return {}
|
|
116
|
+
|
|
117
|
+
def _resolve(self, node: Dict[str, Any], root: Dict[str, Any]) -> Dict[str, Any]:
|
|
118
|
+
seen = 0
|
|
119
|
+
while isinstance(node, dict) and "$ref" in node and seen < 8:
|
|
120
|
+
ref = node["$ref"]
|
|
121
|
+
seen += 1
|
|
122
|
+
if not ref.startswith("#/"):
|
|
123
|
+
return {}
|
|
124
|
+
target: Any = root
|
|
125
|
+
for part in ref[2:].split("/"):
|
|
126
|
+
if not isinstance(target, dict) or part not in target:
|
|
127
|
+
return {}
|
|
128
|
+
target = target[part]
|
|
129
|
+
node = target if isinstance(target, dict) else {}
|
|
130
|
+
return node if isinstance(node, dict) else {}
|
|
131
|
+
|
|
132
|
+
def _draw_object(self, node: Dict[str, Any], root: Dict[str, Any]) -> Dict[str, Any]:
|
|
133
|
+
node = self._resolve(node, root)
|
|
134
|
+
props = node.get("properties") or {}
|
|
135
|
+
required = set(node.get("required") or props.keys())
|
|
136
|
+
out: Dict[str, Any] = {}
|
|
137
|
+
for name, sub in props.items():
|
|
138
|
+
if name in required:
|
|
139
|
+
out[name] = self._draw(sub, root)
|
|
140
|
+
return out
|
|
141
|
+
|
|
142
|
+
def _draw(self, node: Dict[str, Any], root: Dict[str, Any], depth: int = 0) -> Any:
|
|
143
|
+
node = self._resolve(node, root)
|
|
144
|
+
if depth > 6:
|
|
145
|
+
return None
|
|
146
|
+
if "enum" in node and node["enum"]:
|
|
147
|
+
return self._rng.choice(list(node["enum"]))
|
|
148
|
+
if "const" in node:
|
|
149
|
+
return node["const"]
|
|
150
|
+
for key in ("anyOf", "oneOf"):
|
|
151
|
+
if node.get(key):
|
|
152
|
+
return self._draw(self._rng.choice(list(node[key])), root, depth + 1)
|
|
153
|
+
|
|
154
|
+
kind = node.get("type")
|
|
155
|
+
if isinstance(kind, list):
|
|
156
|
+
kind = self._rng.choice([k for k in kind if k != "null"] or ["string"])
|
|
157
|
+
|
|
158
|
+
if kind == "integer":
|
|
159
|
+
lo = node.get("minimum", node.get("exclusiveMinimum", 0))
|
|
160
|
+
hi = node.get("maximum", node.get("exclusiveMaximum", lo + 16))
|
|
161
|
+
lo, hi = int(lo), int(hi)
|
|
162
|
+
return self._rng.randint(lo, hi) if hi >= lo else lo
|
|
163
|
+
if kind == "number":
|
|
164
|
+
lo = float(node.get("minimum", node.get("exclusiveMinimum", 0.0)))
|
|
165
|
+
hi = float(node.get("maximum", node.get("exclusiveMaximum", lo + 1.0)))
|
|
166
|
+
return self._rng.uniform(lo, hi) if hi >= lo else lo
|
|
167
|
+
if kind == "boolean":
|
|
168
|
+
return self._rng.random() < 0.5
|
|
169
|
+
if kind == "array":
|
|
170
|
+
items = node.get("items") or {}
|
|
171
|
+
lo = int(node.get("minItems", 1))
|
|
172
|
+
hi = int(node.get("maxItems", max(lo, 6)))
|
|
173
|
+
count = self._rng.randint(lo, hi) if hi >= lo else lo
|
|
174
|
+
drawn = [self._draw(items, root, depth + 1) for _ in range(count)]
|
|
175
|
+
if node.get("uniqueItems"):
|
|
176
|
+
unique: List[Any] = []
|
|
177
|
+
for value in drawn:
|
|
178
|
+
if value not in unique:
|
|
179
|
+
unique.append(value)
|
|
180
|
+
drawn = unique
|
|
181
|
+
return drawn
|
|
182
|
+
if kind == "object":
|
|
183
|
+
return self._draw_object(node, root)
|
|
184
|
+
if kind == "null":
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
alphabet = string.ascii_lowercase
|
|
188
|
+
return "".join(self._rng.choice(alphabet) for _ in range(self._rng.randint(3, 8)))
|