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,451 @@
|
|
|
1
|
+
"""The emit harness: a candidate's SHAPE is the harness's job, not the model's.
|
|
2
|
+
|
|
3
|
+
Wave D measured what happens when it is not. On the assignment-structured
|
|
4
|
+
`upms_j14_m3` instance the authored generator emitted 7,104 candidates and
|
|
5
|
+
the harness could use 23 of them (0.3%); **6,021 of the 7,081 rejects were
|
|
6
|
+
SHAPE** -- the key set, the nesting, the length -- and 1,060 were values
|
|
7
|
+
outside a locus's own declared domain. The same failure had already been
|
|
8
|
+
measured on `upms_j13_m3` (33.9% acceptance, 1,544 shape + 1,172
|
|
9
|
+
out-of-domain), and revision fired on 77 of 80 cells without repairing it.
|
|
10
|
+
Healthy instances on the same substrate run 67.3-96.0%.
|
|
11
|
+
|
|
12
|
+
Shape is the load-bearing half, and it is not a modelling problem: the
|
|
13
|
+
harness already knows the exact key set, the exact nesting and the exact
|
|
14
|
+
admissible value of every locus, because it derives all three from the
|
|
15
|
+
problem's own schema. Asking a model to reproduce that structure by hand --
|
|
16
|
+
fourteen keys named ``job_00``..``job_13``, each with its own eligibility
|
|
17
|
+
subset -- is asking it to re-derive something the caller could simply have
|
|
18
|
+
built, and the failure rate scales with the number of loci exactly as
|
|
19
|
+
transcription errors do.
|
|
20
|
+
|
|
21
|
+
So this module inverts the burden, generically, for ANY structured genome:
|
|
22
|
+
|
|
23
|
+
- :func:`scaffold_prelude` renders a source prelude the sandbox executes
|
|
24
|
+
BEFORE the authored artifact. It defines ``build(picks)`` -- the authored
|
|
25
|
+
code names loci and values, and the harness assembles the configuration.
|
|
26
|
+
A configuration built through ``build`` cannot have the wrong shape,
|
|
27
|
+
because the shape comes from the template rather than from the model, and
|
|
28
|
+
cannot hold an out-of-domain value, because every value is checked against
|
|
29
|
+
that locus's own domain before it is written. Both events are COUNTED and
|
|
30
|
+
reported back through the runtime's notes channel, so "the model got it
|
|
31
|
+
right" and "the harness repaired it" never look alike.
|
|
32
|
+
- :func:`coerce_candidate` is the same assembly, harness-side, for a
|
|
33
|
+
generator that ignored the scaffold and hand-built its dicts anyway. It
|
|
34
|
+
reads whatever loci a member does supply -- flat locus keys, the
|
|
35
|
+
template's own nesting, or a bare sequence aligned with the loci -- and
|
|
36
|
+
repairs the rest. A per-LOCUS fallback strictly dominates the per-
|
|
37
|
+
CANDIDATE fallback it replaces: the run keeps the thirteen loci the model
|
|
38
|
+
chose well instead of throwing all fourteen away because one was wrong.
|
|
39
|
+
- :func:`render_domain_echo` writes the per-locus admissible sets into the
|
|
40
|
+
authoring prompt, so an out-of-domain value is a prompt failure rather
|
|
41
|
+
than a guess. Sequence-valued fields are the case that motivates it: the
|
|
42
|
+
domain card renders a sequence field's SHARED per-element vocabulary,
|
|
43
|
+
while ``domains`` is keyed per position, and only the echo says which.
|
|
44
|
+
|
|
45
|
+
Nothing here knows what a locus means. The template, the loci and the
|
|
46
|
+
domains all arrive from :mod:`agent_evolve.policies.genetic`, which derives
|
|
47
|
+
them from the candidate model's own JSON schema.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
from __future__ import annotations
|
|
51
|
+
|
|
52
|
+
import json
|
|
53
|
+
import random
|
|
54
|
+
from typing import Any, Dict, List, Mapping, Optional, Sequence, Tuple
|
|
55
|
+
|
|
56
|
+
from agent_evolve.infrastructure.authored_worker import ALLOWED_IMPORTS
|
|
57
|
+
from agent_evolve.policies.genetic import Locus, loci_of, read_locus, write_locus
|
|
58
|
+
|
|
59
|
+
__all__ = [
|
|
60
|
+
"NOTES_GLOBAL",
|
|
61
|
+
"locus_names",
|
|
62
|
+
"scaffold_prelude",
|
|
63
|
+
"coerce_candidate",
|
|
64
|
+
"render_domain_echo",
|
|
65
|
+
"SCAFFOLD_RULES",
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
#: The name the prelude publishes its counters under. The worker returns
|
|
69
|
+
#: whatever lives here as the call's ``notes``; nothing else crosses back.
|
|
70
|
+
NOTES_GLOBAL = "_AE_EMIT_NOTES"
|
|
71
|
+
|
|
72
|
+
#: How many values of one locus the echo prints before eliding.
|
|
73
|
+
_MAX_VALUES = 12
|
|
74
|
+
#: How many locus lines the echo prints before collapsing the tail.
|
|
75
|
+
_MAX_LINES = 48
|
|
76
|
+
#: How many distinct offending samples a census keeps per reason.
|
|
77
|
+
_MAX_SAMPLES = 4
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def locus_names(template: Mapping[str, Any]) -> Tuple[str, ...]:
|
|
81
|
+
"""Canonical locus names for *template*, in the harness's own order."""
|
|
82
|
+
|
|
83
|
+
return tuple(str(locus) for locus in loci_of(template))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _parse(name: str) -> Locus:
|
|
87
|
+
"""The inverse of ``str(Locus)``: ``field`` or ``field[i]``."""
|
|
88
|
+
|
|
89
|
+
if name.endswith("]") and "[" in name:
|
|
90
|
+
field, index = name[:-1].split("[", 1)
|
|
91
|
+
try:
|
|
92
|
+
return Locus(field, int(index))
|
|
93
|
+
except ValueError:
|
|
94
|
+
return Locus(name)
|
|
95
|
+
return Locus(name)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# --------------------------------------------------------------- the prelude
|
|
99
|
+
|
|
100
|
+
_PRELUDE = '''\
|
|
101
|
+
{preimports}
|
|
102
|
+
import json as _ae_json
|
|
103
|
+
import random as _ae_random
|
|
104
|
+
|
|
105
|
+
_AE = _ae_json.loads({payload})
|
|
106
|
+
LOCI = tuple(_AE["loci"])
|
|
107
|
+
DOMAINS = {{k: list(v) for k, v in _AE["domains"].items()}}
|
|
108
|
+
_AE_TEMPLATE = _AE["template"]
|
|
109
|
+
{notes} = {{"built": 0, "filled": 0, "out_of_domain": 0, "unknown_locus": 0,
|
|
110
|
+
"by_locus": {{}}, "samples": []}}
|
|
111
|
+
_AE_RNG = _ae_random.Random(_AE["nonce"])
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def domain_of(locus):
|
|
115
|
+
"""The admissible values at *locus* -- the same list `domains` carries."""
|
|
116
|
+
return list(DOMAINS.get(str(locus), ()))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _ae_count(kind, locus, value=None):
|
|
120
|
+
{notes}[kind] = {notes}.get(kind, 0) + 1
|
|
121
|
+
row = {notes}["by_locus"].setdefault(str(locus), {{}})
|
|
122
|
+
row[kind] = row.get(kind, 0) + 1
|
|
123
|
+
if kind == "out_of_domain" and len({notes}["samples"]) < 8:
|
|
124
|
+
try:
|
|
125
|
+
_ae_json.dumps(value)
|
|
126
|
+
except Exception:
|
|
127
|
+
value = repr(value)[:80]
|
|
128
|
+
{notes}["samples"].append({{"locus": str(locus), "value": value}})
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _ae_read(config, locus):
|
|
132
|
+
if locus.endswith("]") and "[" in locus:
|
|
133
|
+
field, index = locus[:-1].split("[", 1)
|
|
134
|
+
return config[field][int(index)]
|
|
135
|
+
return config[locus]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _ae_write(config, locus, value):
|
|
139
|
+
if locus.endswith("]") and "[" in locus:
|
|
140
|
+
field, index = locus[:-1].split("[", 1)
|
|
141
|
+
config[field][int(index)] = value
|
|
142
|
+
else:
|
|
143
|
+
config[locus] = value
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _ae_picks(picks):
|
|
147
|
+
if picks is None:
|
|
148
|
+
return {{}}
|
|
149
|
+
if isinstance(picks, dict):
|
|
150
|
+
flat = {{}}
|
|
151
|
+
for key, value in picks.items():
|
|
152
|
+
key = str(key)
|
|
153
|
+
if key in DOMAINS or key in _AE_TEMPLATE:
|
|
154
|
+
if (isinstance(value, (list, tuple))
|
|
155
|
+
and key not in DOMAINS
|
|
156
|
+
and isinstance(_AE_TEMPLATE.get(key), list)):
|
|
157
|
+
for i, item in enumerate(value):
|
|
158
|
+
flat["%s[%d]" % (key, i)] = item
|
|
159
|
+
else:
|
|
160
|
+
flat[key] = value
|
|
161
|
+
else:
|
|
162
|
+
_ae_count("unknown_locus", key)
|
|
163
|
+
return flat
|
|
164
|
+
try:
|
|
165
|
+
values = list(picks)
|
|
166
|
+
except Exception:
|
|
167
|
+
return {{}}
|
|
168
|
+
return {{LOCI[i]: v for i, v in enumerate(values) if i < len(LOCI)}}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def build(picks=None, seed=None):
|
|
172
|
+
"""Assemble ONE configuration, locus by locus, from your choices.
|
|
173
|
+
|
|
174
|
+
*picks* maps a locus name to the value you want there (or is a sequence
|
|
175
|
+
aligned with ``LOCI``). The shape comes from the harness, so it is always
|
|
176
|
+
right; a locus you omit, or set outside ``DOMAINS[locus]``, is filled by
|
|
177
|
+
a seeded draw from that locus's own domain and counted against you.
|
|
178
|
+
"""
|
|
179
|
+
rng = _ae_random.Random(seed) if seed is not None else _AE_RNG
|
|
180
|
+
config = _ae_json.loads(_ae_json.dumps(_AE_TEMPLATE))
|
|
181
|
+
chosen = _ae_picks(picks)
|
|
182
|
+
for locus in LOCI:
|
|
183
|
+
domain = DOMAINS.get(locus) or ()
|
|
184
|
+
if locus in chosen:
|
|
185
|
+
value = chosen[locus]
|
|
186
|
+
if not domain:
|
|
187
|
+
# The schema constrains this locus to nothing, so the template
|
|
188
|
+
# value is the only defensible one; overwriting it would be
|
|
189
|
+
# authoring a value the problem never declared.
|
|
190
|
+
if value != _ae_read(config, locus):
|
|
191
|
+
_ae_count("out_of_domain", locus, value)
|
|
192
|
+
continue
|
|
193
|
+
if value in domain:
|
|
194
|
+
_ae_write(config, locus, value)
|
|
195
|
+
continue
|
|
196
|
+
_ae_count("out_of_domain", locus, value)
|
|
197
|
+
elif not domain:
|
|
198
|
+
continue
|
|
199
|
+
else:
|
|
200
|
+
_ae_count("filled", locus)
|
|
201
|
+
_ae_write(config, locus, rng.choice(domain))
|
|
202
|
+
{notes}["built"] += 1
|
|
203
|
+
return config
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def build_all(rows, seed=None):
|
|
207
|
+
"""``build`` over an iterable of picks -- one configuration per row."""
|
|
208
|
+
return [build(row, seed=seed) for row in rows]
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def resample(locus, current=None, seed=None, rng=None):
|
|
212
|
+
"""A NEW value at *locus*, or the only one there is.
|
|
213
|
+
|
|
214
|
+
The shipped mutation operator's exact rule. It exists because excluding
|
|
215
|
+
the current value from a domain that holds one value leaves an empty
|
|
216
|
+
sequence, and `random.choice([])` raises -- which is the single largest
|
|
217
|
+
crash class measured in authored generators on heterogeneous genomes.
|
|
218
|
+
"""
|
|
219
|
+
domain = list(DOMAINS.get(str(locus)) or ())
|
|
220
|
+
if not domain:
|
|
221
|
+
return current
|
|
222
|
+
others = [v for v in domain if v != current] or domain
|
|
223
|
+
source = rng if rng is not None else (
|
|
224
|
+
_ae_random.Random(seed) if seed is not None else _AE_RNG)
|
|
225
|
+
return source.choice(others)
|
|
226
|
+
'''
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
#: The paragraph the authoring prompt shows. Kept next to the code it
|
|
230
|
+
#: describes so the two cannot drift.
|
|
231
|
+
SCAFFOLD_RULES = """\
|
|
232
|
+
- Build EVERY configuration through the helper `build(picks)`. It is already
|
|
233
|
+
defined in your module, as are the standard-library modules listed above --
|
|
234
|
+
write `import random` if you like, but `random`, `math` and the rest are
|
|
235
|
+
bound already, and `build` must not be redefined. Do NOT construct
|
|
236
|
+
configuration dicts yourself. `picks` maps a locus name to the
|
|
237
|
+
value you want there -- e.g. `build({"x[0]": 3, "mode": "fast"})` -- or is
|
|
238
|
+
a sequence aligned with the module-level tuple `LOCI`. `build` returns a
|
|
239
|
+
configuration of exactly the right shape; a locus you omit, or set to a
|
|
240
|
+
value outside its domain, is filled by a uniform draw from that locus's
|
|
241
|
+
own domain AND COUNTED AGAINST YOU, so omitting loci wastes the guidance
|
|
242
|
+
you are being paid for. `build_all(rows)` does a whole batch.
|
|
243
|
+
- `LOCI` (tuple of locus names, in order), `DOMAINS` (the same mapping as
|
|
244
|
+
the `domains` argument) and `domain_of(locus)` are available too.
|
|
245
|
+
- LOCI DO NOT SHARE A DOMAIN, and some hold a SINGLE admissible value. So
|
|
246
|
+
`[v for v in domain_of(k) if v != current]` can be EMPTY, and
|
|
247
|
+
`random.choice([])` raises -- which kills the whole batch and forfeits the
|
|
248
|
+
pool. Use `resample(locus, current)` for "change this locus": it returns a
|
|
249
|
+
different value where one exists and the only value where it does not."""
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _preimports() -> str:
|
|
253
|
+
"""Bind every ALLOWED module as a global before the artifact runs.
|
|
254
|
+
|
|
255
|
+
A measured failure class, not a convenience. Replaying the DEV probe's
|
|
256
|
+
zero-emission cells showed 18 of 51 crashes were `NameError: name
|
|
257
|
+
'random'/'math' is not defined` -- an authored function using a module
|
|
258
|
+
the gate already permits, without an import statement. The allowlist is
|
|
259
|
+
the harness's own datum; binding it costs one import per module in a
|
|
260
|
+
process that exists for one batch, and the gate is unchanged, because
|
|
261
|
+
the gate is about what the ARTIFACT may import, not about what the
|
|
262
|
+
harness may hand it.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
return "\n".join(f"import {name}"
|
|
266
|
+
for name in sorted(ALLOWED_IMPORTS))
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def scaffold_prelude(
|
|
270
|
+
template: Mapping[str, Any],
|
|
271
|
+
domains: Mapping[str, Sequence[Any]],
|
|
272
|
+
*,
|
|
273
|
+
nonce: int = 0,
|
|
274
|
+
) -> Optional[str]:
|
|
275
|
+
"""Source the sandbox runs before the artifact, or ``None`` if it cannot.
|
|
276
|
+
|
|
277
|
+
``None`` is returned when the template or a domain will not survive the
|
|
278
|
+
JSON round trip the runtime already imposes on every argument -- in which
|
|
279
|
+
case the artifact runs exactly as it did before this module existed and
|
|
280
|
+
the harness-side guard is the only line of defence, which is the same
|
|
281
|
+
degradation everything else here makes.
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
try:
|
|
285
|
+
payload = json.dumps({
|
|
286
|
+
"template": dict(template),
|
|
287
|
+
"loci": list(locus_names(template)),
|
|
288
|
+
"domains": {str(k): list(v) for k, v in domains.items()},
|
|
289
|
+
"nonce": int(nonce),
|
|
290
|
+
}, sort_keys=True)
|
|
291
|
+
except (TypeError, ValueError):
|
|
292
|
+
return None
|
|
293
|
+
return _PRELUDE.format(payload=repr(payload), notes=NOTES_GLOBAL,
|
|
294
|
+
preimports=_preimports())
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# ------------------------------------------------------- the harness-side twin
|
|
298
|
+
|
|
299
|
+
def _picks_from(
|
|
300
|
+
member: Any,
|
|
301
|
+
*,
|
|
302
|
+
template: Mapping[str, Any],
|
|
303
|
+
domains: Mapping[str, Sequence[Any]],
|
|
304
|
+
loci: Sequence[str],
|
|
305
|
+
) -> Optional[Dict[str, Any]]:
|
|
306
|
+
"""Whatever loci *member* actually supplies, keyed by locus name.
|
|
307
|
+
|
|
308
|
+
Three shapes are read, in the order a generator is likely to emit them:
|
|
309
|
+
flat locus keys (what ``build`` produces), the template's own nesting
|
|
310
|
+
(what a hand-built dict produces), and a bare sequence aligned with the
|
|
311
|
+
loci (what an assignment-structured genome is naturally written as).
|
|
312
|
+
``None`` means the member supplied nothing addressable at all.
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
if isinstance(member, dict):
|
|
316
|
+
flat: Dict[str, Any] = {}
|
|
317
|
+
for key, value in member.items():
|
|
318
|
+
key = str(key)
|
|
319
|
+
if key in domains and not (
|
|
320
|
+
isinstance(value, (list, tuple))
|
|
321
|
+
and isinstance(template.get(key), (list, tuple))):
|
|
322
|
+
flat[key] = value
|
|
323
|
+
elif isinstance(value, (list, tuple)) and not isinstance(
|
|
324
|
+
value, (str, bytes)):
|
|
325
|
+
for index, item in enumerate(value):
|
|
326
|
+
flat[f"{key}[{index}]"] = item
|
|
327
|
+
elif key in template:
|
|
328
|
+
flat[key] = value
|
|
329
|
+
known = {k: v for k, v in flat.items() if k in domains}
|
|
330
|
+
return known or None
|
|
331
|
+
if isinstance(member, (list, tuple)) and not isinstance(member, (str, bytes)):
|
|
332
|
+
if len(member) != len(loci):
|
|
333
|
+
return None
|
|
334
|
+
return dict(zip(loci, member))
|
|
335
|
+
return None
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def coerce_candidate(
|
|
339
|
+
member: Any,
|
|
340
|
+
*,
|
|
341
|
+
template: Mapping[str, Any],
|
|
342
|
+
domains: Mapping[str, Sequence[Any]],
|
|
343
|
+
rng: random.Random,
|
|
344
|
+
loci: Optional[Sequence[Locus]] = None,
|
|
345
|
+
) -> Tuple[Optional[Dict[str, Any]], Dict[str, List[str]]]:
|
|
346
|
+
"""Assemble a valid configuration out of whatever *member* got right.
|
|
347
|
+
|
|
348
|
+
Returns ``(config, repairs)``; ``config`` is ``None`` when the member
|
|
349
|
+
addressed no locus at all, which is the one case a per-locus fallback
|
|
350
|
+
cannot improve on a rejection -- there is nothing of the model's left in
|
|
351
|
+
it. ``repairs`` maps ``"filled"`` / ``"out_of_domain"`` to the loci the
|
|
352
|
+
harness had to decide for.
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
positions = tuple(loci) if loci is not None else loci_of(template)
|
|
356
|
+
names = [str(locus) for locus in positions]
|
|
357
|
+
picks = _picks_from(member, template=template, domains=domains, loci=names)
|
|
358
|
+
if picks is None:
|
|
359
|
+
return None, {}
|
|
360
|
+
|
|
361
|
+
repairs: Dict[str, List[str]] = {"filled": [], "out_of_domain": []}
|
|
362
|
+
config: Dict[str, Any] = dict(template)
|
|
363
|
+
kept = 0
|
|
364
|
+
for locus, name in zip(positions, names):
|
|
365
|
+
domain = tuple(domains.get(name) or ())
|
|
366
|
+
if name in picks:
|
|
367
|
+
value = picks[name]
|
|
368
|
+
if not domain:
|
|
369
|
+
if value != read_locus(template, locus):
|
|
370
|
+
repairs["out_of_domain"].append(name)
|
|
371
|
+
continue
|
|
372
|
+
if value in domain:
|
|
373
|
+
config = write_locus(config, locus, value)
|
|
374
|
+
kept += 1
|
|
375
|
+
continue
|
|
376
|
+
repairs["out_of_domain"].append(name)
|
|
377
|
+
elif not domain:
|
|
378
|
+
continue
|
|
379
|
+
else:
|
|
380
|
+
repairs["filled"].append(name)
|
|
381
|
+
if domain:
|
|
382
|
+
config = write_locus(config, locus, rng.choice(domain))
|
|
383
|
+
if not kept:
|
|
384
|
+
# Nothing the model chose survived. Accepting this would credit the
|
|
385
|
+
# generator with a draw that is schema-uniform in every locus.
|
|
386
|
+
return None, repairs
|
|
387
|
+
return config, repairs
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
# ------------------------------------------------------------------ the echo
|
|
391
|
+
|
|
392
|
+
def _render_values(values: Sequence[Any]) -> str:
|
|
393
|
+
values = list(values)
|
|
394
|
+
if not values:
|
|
395
|
+
return "unconstrained by the schema (keeps the template's value)"
|
|
396
|
+
if len(values) <= _MAX_VALUES:
|
|
397
|
+
return f"one of {values}"
|
|
398
|
+
head = values[:_MAX_VALUES - 2]
|
|
399
|
+
return f"one of {head + ['...', values[-1]]} ({len(values)} values)"
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def render_domain_echo(
|
|
403
|
+
domains: Mapping[str, Sequence[Any]],
|
|
404
|
+
*,
|
|
405
|
+
max_lines: int = _MAX_LINES,
|
|
406
|
+
) -> str:
|
|
407
|
+
"""Every locus's exact admissible set, one line each, runs collapsed.
|
|
408
|
+
|
|
409
|
+
Consecutive loci that share a domain -- the common case for a sequence
|
|
410
|
+
field, and the case the domain card already renders correctly -- collapse
|
|
411
|
+
to one line naming the run, so a 500-position genome costs one line while
|
|
412
|
+
a 14-position genome whose positions differ (per-job eligibility, per-slot
|
|
413
|
+
capability) spends fourteen and says exactly which is which. That
|
|
414
|
+
difference is the whole point: an out-of-domain value must be a prompt
|
|
415
|
+
failure, not a guess.
|
|
416
|
+
"""
|
|
417
|
+
|
|
418
|
+
names = list(domains)
|
|
419
|
+
if not names:
|
|
420
|
+
return ""
|
|
421
|
+
runs: List[Tuple[List[str], Sequence[Any]]] = []
|
|
422
|
+
for name in names:
|
|
423
|
+
values = list(domains[name] or ())
|
|
424
|
+
if runs and list(runs[-1][1]) == values:
|
|
425
|
+
runs[-1][0].append(name)
|
|
426
|
+
else:
|
|
427
|
+
runs.append(([name], values))
|
|
428
|
+
|
|
429
|
+
lines: List[str] = []
|
|
430
|
+
for group, values in runs[:max_lines]:
|
|
431
|
+
label = group[0] if len(group) == 1 else f"{group[0]} .. {group[-1]}"
|
|
432
|
+
if len(group) > 1:
|
|
433
|
+
label += f" ({len(group)} loci)"
|
|
434
|
+
lines.append(f" {label}: {_render_values(values)}")
|
|
435
|
+
if len(runs) > max_lines:
|
|
436
|
+
remaining = sum(len(group) for group, _ in runs[max_lines:])
|
|
437
|
+
lines.append(f" ... and {remaining} further loci; the `domains` "
|
|
438
|
+
f"argument carries all of them at call time.")
|
|
439
|
+
singletons = [name for name in names if len(list(domains[name] or ())) == 1]
|
|
440
|
+
if singletons:
|
|
441
|
+
# Called out because it is the shape of a measured crash, not because
|
|
442
|
+
# it is interesting: a locus with one admissible value makes
|
|
443
|
+
# "pick something else here" an empty draw.
|
|
444
|
+
shown = singletons[:8]
|
|
445
|
+
tail = ("" if len(singletons) <= 8
|
|
446
|
+
else f" and {len(singletons) - 8} more")
|
|
447
|
+
lines.append(f" NOTE: {len(singletons)} locus/loci admit exactly ONE "
|
|
448
|
+
f"value ({', '.join(shown)}{tail}) -- they cannot be "
|
|
449
|
+
f"changed, and excluding their current value leaves an "
|
|
450
|
+
f"empty domain.")
|
|
451
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Injectable feedback experiment policies built on generic application seams."""
|
|
2
|
+
|
|
3
|
+
from agent_evolve.policies.feedback.held_out_asn import (
|
|
4
|
+
G1ReflectionFeedbackInterceptor,
|
|
5
|
+
HeldOutASNAssignments,
|
|
6
|
+
HeldOutASNPlanSet,
|
|
7
|
+
HeldOutASNPlannerAdapter,
|
|
8
|
+
HeldOutArm,
|
|
9
|
+
HeldOutArmAssignment,
|
|
10
|
+
HeldOutAssignmentUnavailable,
|
|
11
|
+
HeldOutAssignmentUnavailableReason,
|
|
12
|
+
ReflectedCard,
|
|
13
|
+
ReflectedCardBatch,
|
|
14
|
+
ReflectedCardMailbox,
|
|
15
|
+
ReflectiveFeedbackContractError,
|
|
16
|
+
build_reflected_card_batch,
|
|
17
|
+
reflection_contrast_id,
|
|
18
|
+
register_neutral_sham_card,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"G1ReflectionFeedbackInterceptor",
|
|
23
|
+
"HeldOutASNAssignments",
|
|
24
|
+
"HeldOutASNPlanSet",
|
|
25
|
+
"HeldOutASNPlannerAdapter",
|
|
26
|
+
"HeldOutArm",
|
|
27
|
+
"HeldOutArmAssignment",
|
|
28
|
+
"HeldOutAssignmentUnavailable",
|
|
29
|
+
"HeldOutAssignmentUnavailableReason",
|
|
30
|
+
"ReflectedCard",
|
|
31
|
+
"ReflectedCardBatch",
|
|
32
|
+
"ReflectedCardMailbox",
|
|
33
|
+
"ReflectiveFeedbackContractError",
|
|
34
|
+
"build_reflected_card_batch",
|
|
35
|
+
"reflection_contrast_id",
|
|
36
|
+
"register_neutral_sham_card",
|
|
37
|
+
]
|