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,394 @@
|
|
|
1
|
+
"""Graded sampling priors: the generic form of domain restriction.
|
|
2
|
+
|
|
3
|
+
A hard :class:`~agent_evolve.policies.genetic.DomainRestriction` is a 0/1 bet:
|
|
4
|
+
sample these values, never those. The generic form carries per-value WEIGHTS,
|
|
5
|
+
so a proposer can grade its confidence instead of gambling the support -- and
|
|
6
|
+
the hard restriction is exactly the special case where every kept value weighs
|
|
7
|
+
the same. That equivalence is enforced, not aspirational: ``weights_for``
|
|
8
|
+
reports ``None`` whenever the mapped weights are uniform, the sampler then
|
|
9
|
+
draws through the identical ``r.choice`` call, and a test pins the two streams
|
|
10
|
+
draw-for-draw.
|
|
11
|
+
|
|
12
|
+
Why grading exists at all: the sealed space-prior arm showed a ~20-line rule
|
|
13
|
+
matching a model's hard restriction to the last digit on 15 of 15 seeds -- a
|
|
14
|
+
hard subset is arithmetic over the screen table, which is rule territory. A
|
|
15
|
+
graded prior is the form that can carry what the table does not say (named
|
|
16
|
+
idioms, couplings, physics) while the evaluator still arbitrates: support can
|
|
17
|
+
only narrow, misses are counted, seeds survive, and the unwind test applies
|
|
18
|
+
wherever the prior actually excludes something. A prior that excludes nothing
|
|
19
|
+
makes no refutable claim; it only biases draws, and its worst case is bounded
|
|
20
|
+
by the declared domain.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import math
|
|
27
|
+
import re
|
|
28
|
+
from dataclasses import dataclass, field
|
|
29
|
+
from typing import Any, Callable, Mapping, Sequence
|
|
30
|
+
|
|
31
|
+
from agent_evolve.core.problem import ObjectiveSpec
|
|
32
|
+
from agent_evolve.policies.genetic import Locus
|
|
33
|
+
# _domains is package-internal on purpose: both prior proposers must resolve
|
|
34
|
+
# declared domains identically, or the same reply would be judged two ways.
|
|
35
|
+
from agent_evolve.policies.llm_prior import _domains
|
|
36
|
+
from agent_evolve.policies.structure import Attribution, render_attribution
|
|
37
|
+
|
|
38
|
+
__all__ = [
|
|
39
|
+
"WeightedRestriction",
|
|
40
|
+
"statistical_weighted_prior",
|
|
41
|
+
"WeightedPriorTelemetry",
|
|
42
|
+
"llm_weighted_prior_proposer",
|
|
43
|
+
"PROMPT",
|
|
44
|
+
"COMMITTED_PROMPT",
|
|
45
|
+
"PRIOR_STYLES",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
#: How the prompt's last instruction reads. See :data:`COMMITTED_PROMPT`.
|
|
49
|
+
PRIOR_STYLES = ("cautious", "committed")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class WeightedRestriction:
|
|
54
|
+
"""Per-field weights over declared values -- a graded prior over WHERE to sample.
|
|
55
|
+
|
|
56
|
+
``weighted`` maps a field name to a ``(values, weights)`` pair of parallel
|
|
57
|
+
tuples. Weight zero excludes a value from the support exactly as a hard
|
|
58
|
+
restriction would; positive weights keep values in proportion.
|
|
59
|
+
|
|
60
|
+
The :class:`~agent_evolve.policies.genetic.DomainRestriction` invariants
|
|
61
|
+
hold unchanged: narrows only (undeclared values contribute nothing), never
|
|
62
|
+
empties (an empty intersection returns the declared domain and counts the
|
|
63
|
+
miss), misses accumulate on the frozen instance, and the key is
|
|
64
|
+
``Locus.field`` so sequence elements share their field's entry.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
weighted: Mapping[str, tuple[tuple[Any, ...], tuple[float, ...]]] = field(
|
|
68
|
+
default_factory=dict
|
|
69
|
+
)
|
|
70
|
+
misses: list[str] = field(default_factory=list, compare=False, repr=False)
|
|
71
|
+
|
|
72
|
+
def __post_init__(self) -> None:
|
|
73
|
+
for name, entry in dict(self.weighted).items():
|
|
74
|
+
if not isinstance(entry, tuple) or len(entry) != 2:
|
|
75
|
+
raise ValueError(
|
|
76
|
+
f"weighted prior for {name!r} must be a (values, weights) "
|
|
77
|
+
f"pair, got {entry!r}"
|
|
78
|
+
)
|
|
79
|
+
values, weights = entry
|
|
80
|
+
if len(values) != len(weights):
|
|
81
|
+
raise ValueError(
|
|
82
|
+
f"weighted prior for {name!r}: {len(values)} values but "
|
|
83
|
+
f"{len(weights)} weights"
|
|
84
|
+
)
|
|
85
|
+
bad = [
|
|
86
|
+
w for w in weights
|
|
87
|
+
if isinstance(w, bool) or not isinstance(w, (int, float))
|
|
88
|
+
or not math.isfinite(float(w)) or float(w) < 0.0
|
|
89
|
+
]
|
|
90
|
+
if bad:
|
|
91
|
+
raise ValueError(
|
|
92
|
+
f"weighted prior for {name!r}: weights must be finite and "
|
|
93
|
+
f"non-negative, got {bad}"
|
|
94
|
+
)
|
|
95
|
+
if not any(float(w) > 0.0 for w in weights):
|
|
96
|
+
raise ValueError(
|
|
97
|
+
f"weighted prior for {name!r} gives every value weight "
|
|
98
|
+
"zero, which is a restriction that samples nothing"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def hard(cls, allowed: Mapping[str, Sequence[Any]]) -> "WeightedRestriction":
|
|
103
|
+
"""The 0/1 special case, from a hard restriction's vocabulary."""
|
|
104
|
+
|
|
105
|
+
return cls({
|
|
106
|
+
name: (tuple(values), tuple(1.0 for _ in values))
|
|
107
|
+
for name, values in dict(allowed).items()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def allowed(self) -> dict[str, tuple[Any, ...]]:
|
|
112
|
+
"""Positive-weight support, in the hard restriction's vocabulary.
|
|
113
|
+
|
|
114
|
+
The loop's structure record and its unwind test read ``allowed``, so a
|
|
115
|
+
graded prior takes part in both through exactly the values it
|
|
116
|
+
excludes. A prior that excludes nothing is unwound by nothing: it made
|
|
117
|
+
no refutable claim, only a bias, and a bias's worst case is bounded.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
name: tuple(v for v, w in zip(values, weights) if float(w) > 0.0)
|
|
122
|
+
for name, (values, weights) in dict(self.weighted).items()
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
def narrow(self, locus: Locus, domain: tuple[Any, ...]) -> tuple[Any, ...]:
|
|
126
|
+
entry = self.weighted.get(locus.field)
|
|
127
|
+
if entry is None or not domain:
|
|
128
|
+
return domain
|
|
129
|
+
values, weights = entry
|
|
130
|
+
support = tuple(v for v, w in zip(values, weights) if float(w) > 0.0)
|
|
131
|
+
kept = tuple(v for v in domain if v in support)
|
|
132
|
+
if not kept:
|
|
133
|
+
self.misses.append(locus.field)
|
|
134
|
+
return domain
|
|
135
|
+
return kept
|
|
136
|
+
|
|
137
|
+
def weights_for(
|
|
138
|
+
self, locus: Locus, values: Sequence[Any]
|
|
139
|
+
) -> "tuple[float, ...] | None":
|
|
140
|
+
"""Weights parallel to *values*, or ``None`` when the draw is uniform.
|
|
141
|
+
|
|
142
|
+
``None`` in exactly three situations, each deliberate: the prior has no
|
|
143
|
+
entry for this field; the mapped weights are all equal (the hard
|
|
144
|
+
special case -- the sampler must take the byte-identical ``r.choice``
|
|
145
|
+
path); or a zero-weight value is present in *values*, which can only
|
|
146
|
+
happen after ``narrow`` missed, and a prior that missed does not get to
|
|
147
|
+
bias the fallback domain it failed to narrow.
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
entry = self.weighted.get(locus.field)
|
|
151
|
+
if entry is None or not values:
|
|
152
|
+
return None
|
|
153
|
+
table = {v: float(w) for v, w in zip(*entry)}
|
|
154
|
+
mapped = [table.get(v, 0.0) for v in values]
|
|
155
|
+
if any(w <= 0.0 for w in mapped):
|
|
156
|
+
return None
|
|
157
|
+
if all(w == mapped[0] for w in mapped):
|
|
158
|
+
return None
|
|
159
|
+
return tuple(mapped)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def statistical_weighted_prior(
|
|
163
|
+
attr: Attribution,
|
|
164
|
+
candidate_model: Any = None,
|
|
165
|
+
*,
|
|
166
|
+
min_levels: int = 2,
|
|
167
|
+
) -> WeightedRestriction:
|
|
168
|
+
"""The credential-free graded prior: weight levels by the screen's evidence.
|
|
169
|
+
|
|
170
|
+
Reads exactly what :func:`~agent_evolve.policies.structure.statistical_prior`
|
|
171
|
+
reads, but grades instead of gambling: each level's weight is its
|
|
172
|
+
Laplace-smoothed within-screen non-domination rate, ``(nd + 0.5)/(n + 1)``,
|
|
173
|
+
so a level a small screen never saw win keeps mass instead of being erased.
|
|
174
|
+
A locus whose rates all tie is left free -- the honest reading of a screen
|
|
175
|
+
that separated nothing. This ships as the rule any model-proposed weighted
|
|
176
|
+
prior has to beat.
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
weighted: dict[str, tuple[tuple[Any, ...], tuple[float, ...]]] = {}
|
|
180
|
+
for name in dict.fromkeys(s.locus for s in attr.levels):
|
|
181
|
+
summaries = attr.for_locus(name)
|
|
182
|
+
if len(summaries) < min_levels:
|
|
183
|
+
continue
|
|
184
|
+
rates = {
|
|
185
|
+
s.value: (s.nondominated + 0.5) / (s.n + 1.0) for s in summaries
|
|
186
|
+
}
|
|
187
|
+
if len(set(rates.values())) < 2:
|
|
188
|
+
continue
|
|
189
|
+
weighted[name.split("[")[0]] = (tuple(rates), tuple(rates.values()))
|
|
190
|
+
return WeightedRestriction(weighted)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@dataclass
|
|
194
|
+
class WeightedPriorTelemetry:
|
|
195
|
+
"""What the proposer's replies did. Counted, never inferred."""
|
|
196
|
+
|
|
197
|
+
calls: int = 0
|
|
198
|
+
unparseable: int = 0
|
|
199
|
+
wrote_candidate: int = 0
|
|
200
|
+
out_of_domain: int = 0
|
|
201
|
+
empty: int = 0
|
|
202
|
+
restricted_loci: int = 0
|
|
203
|
+
errors: int = 0
|
|
204
|
+
proposals: list = field(default_factory=list)
|
|
205
|
+
|
|
206
|
+
def as_dict(self) -> dict[str, int]:
|
|
207
|
+
return {
|
|
208
|
+
"calls": self.calls,
|
|
209
|
+
"unparseable": self.unparseable,
|
|
210
|
+
"wrote_candidate": self.wrote_candidate,
|
|
211
|
+
"out_of_domain": self.out_of_domain,
|
|
212
|
+
"empty": self.empty,
|
|
213
|
+
"restricted_loci": self.restricted_loci,
|
|
214
|
+
"errors": self.errors,
|
|
215
|
+
"proposals": len(self.proposals),
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
_PROMPT_BODY = """The search has spent {n} evaluations on a screening design.
|
|
220
|
+
|
|
221
|
+
OBJECTIVES: {goals}
|
|
222
|
+
|
|
223
|
+
SEARCH SPACE (declared domains):
|
|
224
|
+
{schema}
|
|
225
|
+
|
|
226
|
+
SCREEN EVIDENCE (per locus value, within-screen):
|
|
227
|
+
{screen}
|
|
228
|
+
|
|
229
|
+
Read the table as evidence about THIS evaluator. It may or may not match how
|
|
230
|
+
such problems usually behave; where they disagree, the table wins.
|
|
231
|
+
|
|
232
|
+
Propose a WEIGHTED sampling prior. For any locus the evidence (or the
|
|
233
|
+
parameter's meaning) separates, list the values worth sampling and a
|
|
234
|
+
non-negative weight for each: higher weight, more draws. A value you omit gets
|
|
235
|
+
weight zero and is not sampled; a locus you omit stays free. You are not
|
|
236
|
+
choosing a candidate and must not propose one. {closing}
|
|
237
|
+
|
|
238
|
+
Reply with ONLY this JSON shape and no other text:
|
|
239
|
+
{{"weights": {{"<param>": {{"values": [...], "weights": [...]}}}}, "free": ["<param>", ...]}}"""
|
|
240
|
+
|
|
241
|
+
_CAUTIOUS_CLOSE = (
|
|
242
|
+
"Over-restricting a\nfrontier-spreading parameter destroys diversity: "
|
|
243
|
+
"leave a locus free unless you\nhave a reason."
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
_COMMITTED_CLOSE = (
|
|
247
|
+
"Commit: for every parameter this\nscreen's evidence separates, give "
|
|
248
|
+
"weights proportional to that evidence.\nList a parameter as free ONLY "
|
|
249
|
+
"when the evidence genuinely does not separate\nits values; hedging every "
|
|
250
|
+
"parameter as free discards the screen this run\npaid for."
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
#: The shipped prompt, and every sealed row's: the caution clause asks for a
|
|
254
|
+
#: locus to be left free unless there is a reason to bind it.
|
|
255
|
+
PROMPT = _PROMPT_BODY.replace("{closing}", _CAUTIOUS_CLOSE)
|
|
256
|
+
|
|
257
|
+
#: The same prompt with that one clause swapped for its opposite instruction.
|
|
258
|
+
#: The tuning round's target is a measured phenotype, not a taste: the terra
|
|
259
|
+
#: tier obeys the caution clause most literally -- the flattest weight ratios
|
|
260
|
+
#: of the three tiers (1.82 against luna's 2.67 and sol's 4.0) and a median of
|
|
261
|
+
#: five parameters listed free where the others list none -- and it costs that
|
|
262
|
+
#: tier at the endpoint (4 of 6 paired seeds). Everything else about the
|
|
263
|
+
#: prompt, the reply shape, and the validation is identical, so the arm
|
|
264
|
+
#: measures the clause and nothing else.
|
|
265
|
+
COMMITTED_PROMPT = _PROMPT_BODY.replace("{closing}", _COMMITTED_CLOSE)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def llm_weighted_prior_proposer(
|
|
269
|
+
complete: Callable[[str], str],
|
|
270
|
+
*,
|
|
271
|
+
objectives: Sequence[ObjectiveSpec],
|
|
272
|
+
telemetry: WeightedPriorTelemetry | None = None,
|
|
273
|
+
domain_context: str = "",
|
|
274
|
+
style: str = "cautious",
|
|
275
|
+
) -> Callable[[Attribution, Any], WeightedRestriction]:
|
|
276
|
+
"""A prior proposer that elicits a GRADED prior and repairs nothing.
|
|
277
|
+
|
|
278
|
+
Whole-reply rejection, exactly as the hard proposer: a reply naming
|
|
279
|
+
undeclared values, negative or non-finite weights, mismatched lists, or an
|
|
280
|
+
all-zero field is rejected WHOLE and the run proceeds unguided -- a
|
|
281
|
+
repaired prior is the harness's prior wearing the model's name. A field
|
|
282
|
+
weighted evenly over its full declared domain is recorded as free, not as
|
|
283
|
+
a restriction; a field weighted UNevenly over the full domain is a real
|
|
284
|
+
graded prior and is kept.
|
|
285
|
+
|
|
286
|
+
*style* names which closing instruction the prompt carries -- the shipped
|
|
287
|
+
``"cautious"`` clause or the ``"committed"`` one (see
|
|
288
|
+
:data:`COMMITTED_PROMPT`). It changes the prompt's last sentence and
|
|
289
|
+
nothing else: same reply shape, same parse, same validation, so the two
|
|
290
|
+
arms differ by the clause alone.
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
from agent_evolve.policies.semantics import objective_lines, parameter_lines
|
|
294
|
+
|
|
295
|
+
if style not in PRIOR_STYLES:
|
|
296
|
+
raise ValueError(
|
|
297
|
+
f"weighted prior style must be one of {PRIOR_STYLES}, got "
|
|
298
|
+
f"{style!r}")
|
|
299
|
+
template = COMMITTED_PROMPT if style == "committed" else PROMPT
|
|
300
|
+
tel = telemetry if telemetry is not None else WeightedPriorTelemetry()
|
|
301
|
+
goals = ", ".join(objective_lines(objectives))
|
|
302
|
+
preamble = f"{domain_context.strip()}\n\n" if domain_context.strip() else ""
|
|
303
|
+
|
|
304
|
+
def propose(attr: Attribution, candidate_model: Any) -> WeightedRestriction:
|
|
305
|
+
domains = _domains(candidate_model, attr)
|
|
306
|
+
if not domains:
|
|
307
|
+
return WeightedRestriction({})
|
|
308
|
+
described = parameter_lines(candidate_model, fields=list(domains))
|
|
309
|
+
prompt = preamble + template.format(
|
|
310
|
+
n=attr.n_evaluated,
|
|
311
|
+
goals=goals,
|
|
312
|
+
schema="\n".join(f" {line}" for line in described)
|
|
313
|
+
if described else
|
|
314
|
+
"\n".join(f" {k}: one of {list(v)}" for k, v in domains.items()),
|
|
315
|
+
screen=render_attribution(attr),
|
|
316
|
+
)
|
|
317
|
+
tel.calls += 1
|
|
318
|
+
try:
|
|
319
|
+
text = complete(prompt)
|
|
320
|
+
except Exception:
|
|
321
|
+
tel.errors += 1
|
|
322
|
+
return WeightedRestriction({})
|
|
323
|
+
match = re.search(r"\{.*\}", text, re.S)
|
|
324
|
+
if match is None:
|
|
325
|
+
tel.unparseable += 1
|
|
326
|
+
return WeightedRestriction({})
|
|
327
|
+
try:
|
|
328
|
+
raw = json.loads(match.group(0))
|
|
329
|
+
except (ValueError, TypeError):
|
|
330
|
+
tel.unparseable += 1
|
|
331
|
+
return WeightedRestriction({})
|
|
332
|
+
if not isinstance(raw, dict) or not isinstance(raw.get("weights", {}), dict):
|
|
333
|
+
tel.unparseable += 1
|
|
334
|
+
return WeightedRestriction({})
|
|
335
|
+
entries = raw.get("weights", {}) or {}
|
|
336
|
+
# Every field mapped to a bare value is a configuration, not a prior --
|
|
337
|
+
# the failure mode that collapses this arm into artifact authoring.
|
|
338
|
+
if entries and all(not isinstance(v, dict) for v in entries.values()):
|
|
339
|
+
tel.wrote_candidate += 1
|
|
340
|
+
return WeightedRestriction({})
|
|
341
|
+
|
|
342
|
+
weighted: dict[str, tuple[tuple[Any, ...], tuple[float, ...]]] = {}
|
|
343
|
+
for name, entry in entries.items():
|
|
344
|
+
if not isinstance(entry, dict):
|
|
345
|
+
tel.unparseable += 1
|
|
346
|
+
return WeightedRestriction({})
|
|
347
|
+
values = entry.get("values")
|
|
348
|
+
weights = entry.get("weights")
|
|
349
|
+
if (
|
|
350
|
+
not isinstance(values, list) or not isinstance(weights, list)
|
|
351
|
+
or not values or len(values) != len(weights)
|
|
352
|
+
):
|
|
353
|
+
tel.unparseable += 1
|
|
354
|
+
return WeightedRestriction({})
|
|
355
|
+
if name not in domains:
|
|
356
|
+
tel.out_of_domain += 1
|
|
357
|
+
return WeightedRestriction({})
|
|
358
|
+
domain = tuple(domains[name])
|
|
359
|
+
if any(v not in domain for v in values):
|
|
360
|
+
tel.out_of_domain += 1
|
|
361
|
+
return WeightedRestriction({})
|
|
362
|
+
clean: list[float] = []
|
|
363
|
+
for w in weights:
|
|
364
|
+
if (
|
|
365
|
+
isinstance(w, bool) or not isinstance(w, (int, float))
|
|
366
|
+
or not math.isfinite(float(w)) or float(w) < 0.0
|
|
367
|
+
):
|
|
368
|
+
tel.out_of_domain += 1
|
|
369
|
+
return WeightedRestriction({})
|
|
370
|
+
clean.append(float(w))
|
|
371
|
+
if not any(w > 0.0 for w in clean):
|
|
372
|
+
tel.out_of_domain += 1
|
|
373
|
+
return WeightedRestriction({})
|
|
374
|
+
support = {v for v, w in zip(values, clean) if w > 0.0}
|
|
375
|
+
if len(set(clean)) == 1 and support == set(domain):
|
|
376
|
+
continue # the full domain, evenly: free
|
|
377
|
+
weighted[name] = (tuple(values), tuple(clean))
|
|
378
|
+
|
|
379
|
+
if not weighted:
|
|
380
|
+
tel.empty += 1
|
|
381
|
+
return WeightedRestriction({})
|
|
382
|
+
tel.restricted_loci += len(weighted)
|
|
383
|
+
tel.proposals.append(
|
|
384
|
+
{k: (list(v[0]), list(v[1])) for k, v in weighted.items()}
|
|
385
|
+
)
|
|
386
|
+
return WeightedRestriction(weighted)
|
|
387
|
+
|
|
388
|
+
propose.telemetry = tel # type: ignore[attr-defined]
|
|
389
|
+
propose.mechanism = "weighted_prior" # type: ignore[attr-defined]
|
|
390
|
+
propose.authored_by = "llm" # type: ignore[attr-defined]
|
|
391
|
+
# Which clause this arm bought, readable off the proposer: an arm that
|
|
392
|
+
# cannot say which prompt it ran is not an arm.
|
|
393
|
+
propose.style = style # type: ignore[attr-defined]
|
|
394
|
+
return propose
|