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,463 @@
|
|
|
1
|
+
"""Outcome-blind identification audit for anchor–residual portfolios.
|
|
2
|
+
|
|
3
|
+
Campaign runtimes already authenticate every selector request and structured
|
|
4
|
+
decision. This module projects the regret-bounded allocation evidence from
|
|
5
|
+
those generic receipts, then assesses a workload- and model-independent
|
|
6
|
+
identification contract. It never reads candidate outcomes.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
import json
|
|
13
|
+
import math
|
|
14
|
+
|
|
15
|
+
from agent_evolve.application.campaign_execution import (
|
|
16
|
+
CampaignSelectorAuditReceipt,
|
|
17
|
+
CampaignStageReceipt,
|
|
18
|
+
decode_selector_audit_text,
|
|
19
|
+
)
|
|
20
|
+
from agent_evolve.domain.patch import require_sha256
|
|
21
|
+
from agent_evolve.domain.typed_json import thaw_json
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
REGRET_BOUNDED_SELECTOR_AUDIT_KIND = (
|
|
25
|
+
"regret_bounded_information_portfolio_k8_to_k4"
|
|
26
|
+
)
|
|
27
|
+
STRICTLY_PRIOR_CERTIFICATE_SCOPE = (
|
|
28
|
+
"conditional_on_frozen_acquisition_calibration_not_sota"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _exact_option_ids(value: object, name: str) -> tuple[str, ...]:
|
|
33
|
+
if type(value) is not list or not value:
|
|
34
|
+
raise TypeError(f"{name} must be a non-empty option-id array")
|
|
35
|
+
result = tuple(value)
|
|
36
|
+
if any(type(option_id) is not str or not option_id for option_id in result):
|
|
37
|
+
raise TypeError(f"{name} contains an invalid option identity")
|
|
38
|
+
if len(set(result)) != len(result):
|
|
39
|
+
raise ValueError(f"{name} contains duplicate option identities")
|
|
40
|
+
return result
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _hex_float(value: object, name: str) -> float:
|
|
44
|
+
if type(value) is not str:
|
|
45
|
+
raise TypeError(f"{name} must be an exact hexadecimal float")
|
|
46
|
+
try:
|
|
47
|
+
result = float.fromhex(value)
|
|
48
|
+
except ValueError as error:
|
|
49
|
+
raise ValueError(f"{name} is not a hexadecimal float") from error
|
|
50
|
+
if not math.isfinite(result):
|
|
51
|
+
raise ValueError(f"{name} must be finite")
|
|
52
|
+
return result
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True, slots=True)
|
|
56
|
+
class AnchorResidualSelectionAudit:
|
|
57
|
+
"""One authenticated pre-evaluation reference displacement decision."""
|
|
58
|
+
|
|
59
|
+
generation: int
|
|
60
|
+
parent_slot: int
|
|
61
|
+
selector_call_id: str
|
|
62
|
+
request_sha256: str
|
|
63
|
+
decision_sha256: str
|
|
64
|
+
policy_id: str
|
|
65
|
+
policy_version: int
|
|
66
|
+
policy_definition_sha256: str
|
|
67
|
+
certificate_scope: str
|
|
68
|
+
reference_option_ids: tuple[str, ...]
|
|
69
|
+
selected_option_ids: tuple[str, ...]
|
|
70
|
+
reported_retained_anchor_member_count: int
|
|
71
|
+
minimum_residual_audit_members: int
|
|
72
|
+
reported_selected_residual_member_count: int
|
|
73
|
+
acquisition_retention_ratio: float
|
|
74
|
+
minimum_acquisition_retention_ratio: float
|
|
75
|
+
|
|
76
|
+
def __post_init__(self) -> None:
|
|
77
|
+
if type(self.generation) is not int or self.generation <= 0:
|
|
78
|
+
raise ValueError("generation must be positive")
|
|
79
|
+
if type(self.parent_slot) is not int or self.parent_slot < 0:
|
|
80
|
+
raise ValueError("parent_slot must be non-negative")
|
|
81
|
+
if type(self.selector_call_id) is not str or not self.selector_call_id:
|
|
82
|
+
raise ValueError("selector_call_id must be non-empty")
|
|
83
|
+
require_sha256(self.request_sha256, "request_sha256")
|
|
84
|
+
require_sha256(self.decision_sha256, "decision_sha256")
|
|
85
|
+
if type(self.policy_id) is not str or not self.policy_id:
|
|
86
|
+
raise ValueError("policy_id must be non-empty")
|
|
87
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
88
|
+
raise ValueError("policy_version must be positive")
|
|
89
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
90
|
+
if type(self.certificate_scope) is not str or not self.certificate_scope:
|
|
91
|
+
raise ValueError("certificate_scope must be non-empty")
|
|
92
|
+
for name in ("reference_option_ids", "selected_option_ids"):
|
|
93
|
+
values = getattr(self, name)
|
|
94
|
+
if type(values) is not tuple or not values:
|
|
95
|
+
raise TypeError(f"{name} must be a non-empty tuple")
|
|
96
|
+
if any(type(value) is not str or not value for value in values):
|
|
97
|
+
raise TypeError(f"{name} contains an invalid option identity")
|
|
98
|
+
if len(set(values)) != len(values):
|
|
99
|
+
raise ValueError(f"{name} contains duplicate option identities")
|
|
100
|
+
if len(self.reference_option_ids) != len(self.selected_option_ids):
|
|
101
|
+
raise ValueError("reference and selected slate widths differ")
|
|
102
|
+
for name in (
|
|
103
|
+
"reported_retained_anchor_member_count",
|
|
104
|
+
"minimum_residual_audit_members",
|
|
105
|
+
"reported_selected_residual_member_count",
|
|
106
|
+
):
|
|
107
|
+
value = getattr(self, name)
|
|
108
|
+
if type(value) is not int or value < 0:
|
|
109
|
+
raise ValueError(f"{name} must be a non-negative integer")
|
|
110
|
+
retained = len(self.retained_anchor_option_ids)
|
|
111
|
+
residual = len(self.residual_option_ids)
|
|
112
|
+
if self.reported_retained_anchor_member_count != retained:
|
|
113
|
+
raise ValueError("reported retained-anchor count does not close")
|
|
114
|
+
if self.reported_selected_residual_member_count != residual:
|
|
115
|
+
raise ValueError("reported residual count does not close")
|
|
116
|
+
if retained + residual != len(self.selected_option_ids):
|
|
117
|
+
raise ValueError("anchor–residual decomposition does not close")
|
|
118
|
+
if len(self.displaced_anchor_option_ids) != residual:
|
|
119
|
+
raise ValueError("residual and displaced-anchor counts differ")
|
|
120
|
+
if self.minimum_residual_audit_members > residual:
|
|
121
|
+
raise ValueError("selected slate violates its residual audit floor")
|
|
122
|
+
for name in (
|
|
123
|
+
"acquisition_retention_ratio",
|
|
124
|
+
"minimum_acquisition_retention_ratio",
|
|
125
|
+
):
|
|
126
|
+
value = getattr(self, name)
|
|
127
|
+
if type(value) is not float or not math.isfinite(value):
|
|
128
|
+
raise ValueError(f"{name} must be finite")
|
|
129
|
+
if not 0.0 < self.minimum_acquisition_retention_ratio <= 1.0:
|
|
130
|
+
raise ValueError("minimum acquisition retention must lie in (0, 1]")
|
|
131
|
+
if not 0.0 < self.acquisition_retention_ratio <= 1.0:
|
|
132
|
+
raise ValueError("acquisition retention must lie in (0, 1]")
|
|
133
|
+
if not self.hard_retention_bound_respected:
|
|
134
|
+
raise ValueError("selection escapes its hard retention envelope")
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def retained_anchor_option_ids(self) -> tuple[str, ...]:
|
|
138
|
+
reference = set(self.reference_option_ids)
|
|
139
|
+
return tuple(value for value in self.selected_option_ids if value in reference)
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def residual_option_ids(self) -> tuple[str, ...]:
|
|
143
|
+
reference = set(self.reference_option_ids)
|
|
144
|
+
return tuple(value for value in self.selected_option_ids if value not in reference)
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def displaced_anchor_option_ids(self) -> tuple[str, ...]:
|
|
148
|
+
selected = set(self.selected_option_ids)
|
|
149
|
+
return tuple(value for value in self.reference_option_ids if value not in selected)
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def hard_retention_bound_respected(self) -> bool:
|
|
153
|
+
return (
|
|
154
|
+
self.acquisition_retention_ratio
|
|
155
|
+
>= self.minimum_acquisition_retention_ratio
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def from_allocation_record(
|
|
160
|
+
cls,
|
|
161
|
+
*,
|
|
162
|
+
generation: int,
|
|
163
|
+
parent_slot: int,
|
|
164
|
+
selector_call_id: str,
|
|
165
|
+
request_sha256: str,
|
|
166
|
+
decision_sha256: str,
|
|
167
|
+
allocation: dict[str, object],
|
|
168
|
+
) -> AnchorResidualSelectionAudit:
|
|
169
|
+
if type(allocation) is not dict:
|
|
170
|
+
raise TypeError("allocation must be an exact object")
|
|
171
|
+
result = cls(
|
|
172
|
+
generation=generation,
|
|
173
|
+
parent_slot=parent_slot,
|
|
174
|
+
selector_call_id=selector_call_id,
|
|
175
|
+
request_sha256=request_sha256,
|
|
176
|
+
decision_sha256=decision_sha256,
|
|
177
|
+
policy_id=str(allocation.get("policy_id", "")),
|
|
178
|
+
policy_version=allocation.get("policy_version"),
|
|
179
|
+
policy_definition_sha256=allocation.get("policy_definition_sha256"),
|
|
180
|
+
certificate_scope=str(allocation.get("certificate_scope", "")),
|
|
181
|
+
reference_option_ids=_exact_option_ids(
|
|
182
|
+
allocation.get("reference_option_ids"), "reference_option_ids"
|
|
183
|
+
),
|
|
184
|
+
selected_option_ids=_exact_option_ids(
|
|
185
|
+
allocation.get("selected_option_ids"), "selected_option_ids"
|
|
186
|
+
),
|
|
187
|
+
reported_retained_anchor_member_count=allocation.get(
|
|
188
|
+
"reference_member_count"
|
|
189
|
+
),
|
|
190
|
+
minimum_residual_audit_members=allocation.get(
|
|
191
|
+
"minimum_residual_audit_members"
|
|
192
|
+
),
|
|
193
|
+
reported_selected_residual_member_count=allocation.get(
|
|
194
|
+
"selected_residual_member_count"
|
|
195
|
+
),
|
|
196
|
+
acquisition_retention_ratio=_hex_float(
|
|
197
|
+
allocation.get("acquisition_retention_ratio_hex"),
|
|
198
|
+
"acquisition_retention_ratio_hex",
|
|
199
|
+
),
|
|
200
|
+
minimum_acquisition_retention_ratio=_hex_float(
|
|
201
|
+
allocation.get("minimum_acquisition_retention_ratio_hex"),
|
|
202
|
+
"minimum_acquisition_retention_ratio_hex",
|
|
203
|
+
),
|
|
204
|
+
)
|
|
205
|
+
result.__post_init__()
|
|
206
|
+
return result
|
|
207
|
+
|
|
208
|
+
def to_record(self) -> dict[str, object]:
|
|
209
|
+
self.__post_init__()
|
|
210
|
+
return {
|
|
211
|
+
"generation": self.generation,
|
|
212
|
+
"parent_slot": self.parent_slot,
|
|
213
|
+
"selector_call_id": self.selector_call_id,
|
|
214
|
+
"request_sha256": self.request_sha256,
|
|
215
|
+
"decision_sha256": self.decision_sha256,
|
|
216
|
+
"policy": {
|
|
217
|
+
"policy_id": self.policy_id,
|
|
218
|
+
"policy_version": self.policy_version,
|
|
219
|
+
"definition_sha256": self.policy_definition_sha256,
|
|
220
|
+
},
|
|
221
|
+
"certificate_scope": self.certificate_scope,
|
|
222
|
+
"reference_option_ids": list(self.reference_option_ids),
|
|
223
|
+
"selected_option_ids": list(self.selected_option_ids),
|
|
224
|
+
"retained_anchor_option_ids": list(self.retained_anchor_option_ids),
|
|
225
|
+
"displaced_anchor_option_ids": list(self.displaced_anchor_option_ids),
|
|
226
|
+
"residual_option_ids": list(self.residual_option_ids),
|
|
227
|
+
"reference_slate_member_count": len(self.reference_option_ids),
|
|
228
|
+
"retained_anchor_member_count": len(self.retained_anchor_option_ids),
|
|
229
|
+
"displaced_anchor_member_count": len(
|
|
230
|
+
self.displaced_anchor_option_ids
|
|
231
|
+
),
|
|
232
|
+
"residual_member_count": len(self.residual_option_ids),
|
|
233
|
+
"minimum_residual_audit_members": self.minimum_residual_audit_members,
|
|
234
|
+
"acquisition_retention_ratio_hex": (
|
|
235
|
+
self.acquisition_retention_ratio.hex()
|
|
236
|
+
),
|
|
237
|
+
"minimum_acquisition_retention_ratio_hex": (
|
|
238
|
+
self.minimum_acquisition_retention_ratio.hex()
|
|
239
|
+
),
|
|
240
|
+
"hard_retention_bound_respected": (
|
|
241
|
+
self.hard_retention_bound_respected
|
|
242
|
+
),
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _supplemental_audit(
|
|
247
|
+
receipt: CampaignSelectorAuditReceipt,
|
|
248
|
+
) -> dict[str, object] | None:
|
|
249
|
+
receipt.__post_init__()
|
|
250
|
+
plaintext = thaw_json(receipt.plaintext_audit)
|
|
251
|
+
if type(plaintext) is not dict: # pragma: no cover - closed by receipt.
|
|
252
|
+
raise AssertionError("selector audit did not thaw to an object")
|
|
253
|
+
response_text = decode_selector_audit_text(plaintext, "response_text")
|
|
254
|
+
response = json.loads(response_text)
|
|
255
|
+
if type(response) is not dict:
|
|
256
|
+
raise TypeError("selector response audit must be an exact object")
|
|
257
|
+
supplemental = response.get("supplemental_selector_audit")
|
|
258
|
+
if supplemental is None:
|
|
259
|
+
return None
|
|
260
|
+
if type(supplemental) is not dict:
|
|
261
|
+
raise TypeError("supplemental selector audit must be an exact object")
|
|
262
|
+
if (
|
|
263
|
+
supplemental.get("request_sha256") != receipt.request_sha256
|
|
264
|
+
or supplemental.get("decision_sha256") != receipt.decision_sha256
|
|
265
|
+
):
|
|
266
|
+
raise ValueError("supplemental audit differs from selector receipt identity")
|
|
267
|
+
return supplemental
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def project_anchor_residual_selection_audits(
|
|
271
|
+
stage_receipts: tuple[CampaignStageReceipt, ...],
|
|
272
|
+
) -> tuple[AnchorResidualSelectionAudit, ...]:
|
|
273
|
+
"""Project all regret-bounded decisions from generic campaign receipts."""
|
|
274
|
+
|
|
275
|
+
if type(stage_receipts) is not tuple or any(
|
|
276
|
+
type(value) is not CampaignStageReceipt for value in stage_receipts
|
|
277
|
+
):
|
|
278
|
+
raise TypeError("stage_receipts must contain exact stage receipts")
|
|
279
|
+
records: list[AnchorResidualSelectionAudit] = []
|
|
280
|
+
for stage in stage_receipts:
|
|
281
|
+
stage.__post_init__()
|
|
282
|
+
for receipt in stage.selector_audits:
|
|
283
|
+
supplemental = _supplemental_audit(receipt)
|
|
284
|
+
if supplemental is None:
|
|
285
|
+
continue
|
|
286
|
+
if supplemental.get("audit_kind") != REGRET_BOUNDED_SELECTOR_AUDIT_KIND:
|
|
287
|
+
continue
|
|
288
|
+
payload = supplemental.get("payload")
|
|
289
|
+
allocation = payload.get("allocation") if type(payload) is dict else None
|
|
290
|
+
if type(allocation) is not dict:
|
|
291
|
+
raise TypeError("regret-bounded audit lacks allocation evidence")
|
|
292
|
+
records.append(
|
|
293
|
+
AnchorResidualSelectionAudit.from_allocation_record(
|
|
294
|
+
generation=receipt.generation,
|
|
295
|
+
parent_slot=receipt.parent_slot,
|
|
296
|
+
selector_call_id=receipt.selector_call_id,
|
|
297
|
+
request_sha256=receipt.request_sha256,
|
|
298
|
+
decision_sha256=receipt.decision_sha256,
|
|
299
|
+
allocation=allocation,
|
|
300
|
+
)
|
|
301
|
+
)
|
|
302
|
+
return tuple(records)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
@dataclass(frozen=True, slots=True)
|
|
306
|
+
class AnchorResidualIdentificationContract:
|
|
307
|
+
"""Expected causal treatment shared by every workload and model."""
|
|
308
|
+
|
|
309
|
+
expected_selector_calls: int
|
|
310
|
+
portfolio_width: int
|
|
311
|
+
minimum_residual_members: int
|
|
312
|
+
exact_residual_members: int | None = None
|
|
313
|
+
|
|
314
|
+
def __post_init__(self) -> None:
|
|
315
|
+
if type(self.expected_selector_calls) is not int or (
|
|
316
|
+
self.expected_selector_calls <= 0
|
|
317
|
+
):
|
|
318
|
+
raise ValueError("expected_selector_calls must be positive")
|
|
319
|
+
if type(self.portfolio_width) is not int or self.portfolio_width <= 1:
|
|
320
|
+
raise ValueError("portfolio_width must exceed one")
|
|
321
|
+
if (
|
|
322
|
+
type(self.minimum_residual_members) is not int
|
|
323
|
+
or not 0 <= self.minimum_residual_members < self.portfolio_width
|
|
324
|
+
):
|
|
325
|
+
raise ValueError("minimum_residual_members lies outside the portfolio")
|
|
326
|
+
if self.exact_residual_members is not None and (
|
|
327
|
+
type(self.exact_residual_members) is not int
|
|
328
|
+
or not self.minimum_residual_members
|
|
329
|
+
<= self.exact_residual_members
|
|
330
|
+
< self.portfolio_width
|
|
331
|
+
):
|
|
332
|
+
raise ValueError("exact_residual_members lies outside the contract")
|
|
333
|
+
|
|
334
|
+
def assess(
|
|
335
|
+
self,
|
|
336
|
+
records: tuple[AnchorResidualSelectionAudit, ...],
|
|
337
|
+
) -> AnchorResidualIdentificationAssessment:
|
|
338
|
+
self.__post_init__()
|
|
339
|
+
if type(records) is not tuple or any(
|
|
340
|
+
type(value) is not AnchorResidualSelectionAudit for value in records
|
|
341
|
+
):
|
|
342
|
+
raise TypeError("records must contain exact anchor-residual audits")
|
|
343
|
+
for value in records:
|
|
344
|
+
value.__post_init__()
|
|
345
|
+
gates = {
|
|
346
|
+
"exact_selector_call_count": (
|
|
347
|
+
len(records) == self.expected_selector_calls
|
|
348
|
+
),
|
|
349
|
+
"unique_authenticated_selector_calls": (
|
|
350
|
+
len({value.selector_call_id for value in records}) == len(records)
|
|
351
|
+
and len({value.request_sha256 for value in records}) == len(records)
|
|
352
|
+
and len({value.decision_sha256 for value in records}) == len(records)
|
|
353
|
+
),
|
|
354
|
+
"complete_reference_and_selected_slates": all(
|
|
355
|
+
len(value.reference_option_ids) == self.portfolio_width
|
|
356
|
+
and len(value.selected_option_ids) == self.portfolio_width
|
|
357
|
+
for value in records
|
|
358
|
+
),
|
|
359
|
+
"configured_residual_floor_realized": all(
|
|
360
|
+
value.minimum_residual_audit_members
|
|
361
|
+
== self.minimum_residual_members
|
|
362
|
+
and len(value.residual_option_ids) >= self.minimum_residual_members
|
|
363
|
+
for value in records
|
|
364
|
+
),
|
|
365
|
+
"exact_residual_mix_realized": (
|
|
366
|
+
self.exact_residual_members is None
|
|
367
|
+
or all(
|
|
368
|
+
len(value.residual_option_ids) == self.exact_residual_members
|
|
369
|
+
and len(value.retained_anchor_option_ids)
|
|
370
|
+
== self.portfolio_width - self.exact_residual_members
|
|
371
|
+
for value in records
|
|
372
|
+
)
|
|
373
|
+
),
|
|
374
|
+
"hard_retention_bound_respected": all(
|
|
375
|
+
value.hard_retention_bound_respected for value in records
|
|
376
|
+
),
|
|
377
|
+
"strictly_prior_certificate_scope": all(
|
|
378
|
+
value.certificate_scope == STRICTLY_PRIOR_CERTIFICATE_SCOPE
|
|
379
|
+
for value in records
|
|
380
|
+
),
|
|
381
|
+
"single_allocator_policy_identity": len(
|
|
382
|
+
{
|
|
383
|
+
(
|
|
384
|
+
value.policy_id,
|
|
385
|
+
value.policy_version,
|
|
386
|
+
value.policy_definition_sha256,
|
|
387
|
+
)
|
|
388
|
+
for value in records
|
|
389
|
+
}
|
|
390
|
+
)
|
|
391
|
+
== 1,
|
|
392
|
+
}
|
|
393
|
+
return AnchorResidualIdentificationAssessment(
|
|
394
|
+
contract=self,
|
|
395
|
+
records=records,
|
|
396
|
+
gates=gates,
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
def to_record(self) -> dict[str, object]:
|
|
400
|
+
self.__post_init__()
|
|
401
|
+
return {
|
|
402
|
+
"expected_selector_calls": self.expected_selector_calls,
|
|
403
|
+
"portfolio_width": self.portfolio_width,
|
|
404
|
+
"minimum_residual_members": self.minimum_residual_members,
|
|
405
|
+
"exact_residual_members": self.exact_residual_members,
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
@dataclass(frozen=True, slots=True)
|
|
410
|
+
class AnchorResidualIdentificationAssessment:
|
|
411
|
+
contract: AnchorResidualIdentificationContract
|
|
412
|
+
records: tuple[AnchorResidualSelectionAudit, ...]
|
|
413
|
+
gates: dict[str, bool]
|
|
414
|
+
|
|
415
|
+
def __post_init__(self) -> None:
|
|
416
|
+
if type(self.contract) is not AnchorResidualIdentificationContract:
|
|
417
|
+
raise TypeError("contract must be exact")
|
|
418
|
+
self.contract.__post_init__()
|
|
419
|
+
if type(self.records) is not tuple or any(
|
|
420
|
+
type(value) is not AnchorResidualSelectionAudit for value in self.records
|
|
421
|
+
):
|
|
422
|
+
raise TypeError("records must contain exact anchor-residual audits")
|
|
423
|
+
if type(self.gates) is not dict or not self.gates:
|
|
424
|
+
raise TypeError("gates must be a non-empty exact object")
|
|
425
|
+
if any(type(name) is not str or type(value) is not bool for name, value in self.gates.items()):
|
|
426
|
+
raise TypeError("gates must map strings to exact bools")
|
|
427
|
+
|
|
428
|
+
@property
|
|
429
|
+
def all_gates_pass(self) -> bool:
|
|
430
|
+
return all(self.gates.values())
|
|
431
|
+
|
|
432
|
+
def to_record(self) -> dict[str, object]:
|
|
433
|
+
self.__post_init__()
|
|
434
|
+
ratios = tuple(value.acquisition_retention_ratio for value in self.records)
|
|
435
|
+
return {
|
|
436
|
+
"contract": self.contract.to_record(),
|
|
437
|
+
"all_gates_pass": self.all_gates_pass,
|
|
438
|
+
"gates": dict(self.gates),
|
|
439
|
+
"selector_call_count": len(self.records),
|
|
440
|
+
"retained_anchor_member_count": sum(
|
|
441
|
+
len(value.retained_anchor_option_ids) for value in self.records
|
|
442
|
+
),
|
|
443
|
+
"residual_member_count": sum(
|
|
444
|
+
len(value.residual_option_ids) for value in self.records
|
|
445
|
+
),
|
|
446
|
+
"minimum_realized_acquisition_retention_ratio_hex": (
|
|
447
|
+
None if not ratios else min(ratios).hex()
|
|
448
|
+
),
|
|
449
|
+
"maximum_realized_acquisition_retention_ratio_hex": (
|
|
450
|
+
None if not ratios else max(ratios).hex()
|
|
451
|
+
),
|
|
452
|
+
"records": [value.to_record() for value in self.records],
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
__all__ = [
|
|
457
|
+
"AnchorResidualIdentificationAssessment",
|
|
458
|
+
"AnchorResidualIdentificationContract",
|
|
459
|
+
"AnchorResidualSelectionAudit",
|
|
460
|
+
"REGRET_BOUNDED_SELECTOR_AUDIT_KIND",
|
|
461
|
+
"STRICTLY_PRIOR_CERTIFICATE_SCOPE",
|
|
462
|
+
"project_anchor_residual_selection_audits",
|
|
463
|
+
]
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"""Generic archive-conditioned target synthesis for action consequence search.
|
|
2
|
+
|
|
3
|
+
Residual-cell targeting may legitimately fall back when a prior archive has a
|
|
4
|
+
single effective frontier point. Expected-hypervolume action allocation still
|
|
5
|
+
has a complete decision frame in that case: the frozen affine archive, fixed
|
|
6
|
+
reference, and selected parent's measured objectives. This adapter binds that
|
|
7
|
+
frame into the same authenticated target contract consumed by action forecasts
|
|
8
|
+
without inventing an evaluator outcome or a workload-specific aspiration.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
from dataclasses import replace
|
|
17
|
+
from typing import Mapping
|
|
18
|
+
|
|
19
|
+
from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
|
|
20
|
+
from agent_evolve.application.portfolio_campaign_runtime import (
|
|
21
|
+
CAMPAIGN_FRONTIER_TARGET_KEY,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json, thaw_json
|
|
24
|
+
from agent_evolve.policies.reward.affine_hypervolume import (
|
|
25
|
+
AffineHypervolumeSnapshot2D,
|
|
26
|
+
)
|
|
27
|
+
from agent_evolve.policies.reward.affine_hypervolume_3d import (
|
|
28
|
+
AffineHypervolumeSnapshot3D,
|
|
29
|
+
)
|
|
30
|
+
from agent_evolve.ports.frontier_target import CampaignPortfolioFrontierTarget
|
|
31
|
+
from agent_evolve.ports.portfolio_selection import PortfolioSelectionRequest
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
ARCHIVE_CONDITIONED_TARGET_ID = "archive_conditioned_expected_hypervolume"
|
|
35
|
+
ARCHIVE_CONDITIONED_TARGET_VERSION = 1
|
|
36
|
+
ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256 = hashlib.sha256(
|
|
37
|
+
b"agent-evolve:archive-conditioned-expected-hypervolume-target:v1;"
|
|
38
|
+
b"inputs=frozen-affine-prior-archive-plus-measured-parent;"
|
|
39
|
+
b"aspiration=parent-neutral-no-invented-outcome;cell=entire-normalized-prior-"
|
|
40
|
+
b"archive;reference=unit-vector;purpose=expected-fixed-reference-hv-gain;"
|
|
41
|
+
b"workload-model-provider-action-identifiers=false;future-outcomes=false"
|
|
42
|
+
).hexdigest()
|
|
43
|
+
_CELL_DOMAIN = b"agent-evolve:archive-conditioned-cell:v1\x00"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _canonical_json(value: object) -> bytes:
|
|
47
|
+
return json.dumps(
|
|
48
|
+
value,
|
|
49
|
+
allow_nan=False,
|
|
50
|
+
ensure_ascii=True,
|
|
51
|
+
separators=(",", ":"),
|
|
52
|
+
sort_keys=True,
|
|
53
|
+
).encode("ascii")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _decimal(value: float) -> str:
|
|
57
|
+
if type(value) is not float or not math.isfinite(value):
|
|
58
|
+
raise TypeError("archive-conditioned values must be finite exact floats")
|
|
59
|
+
return format(0.0 if value == 0.0 else value, ".17g")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _object(value: dict[str, object]) -> FrozenJsonObject:
|
|
63
|
+
result = freeze_json(value)
|
|
64
|
+
if type(result) is not FrozenJsonObject:
|
|
65
|
+
raise TypeError("archive-conditioned target payload must be an object")
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def bind_archive_conditioned_affine_action_target(
|
|
70
|
+
*,
|
|
71
|
+
selection_request: PortfolioSelectionRequest,
|
|
72
|
+
archive_utility: ArchiveUtilitySnapshot,
|
|
73
|
+
affine_snapshot: AffineHypervolumeSnapshot2D | AffineHypervolumeSnapshot3D,
|
|
74
|
+
parent_objectives: Mapping[str, float],
|
|
75
|
+
lane_id: str,
|
|
76
|
+
) -> tuple[PortfolioSelectionRequest, CampaignPortfolioFrontierTarget]:
|
|
77
|
+
"""Attach a prior-only whole-archive expected-HV target to one request."""
|
|
78
|
+
|
|
79
|
+
if type(selection_request) is not PortfolioSelectionRequest:
|
|
80
|
+
raise TypeError("selection_request must be exact")
|
|
81
|
+
selection_request.__post_init__()
|
|
82
|
+
if type(archive_utility) is not ArchiveUtilitySnapshot:
|
|
83
|
+
raise TypeError("archive_utility must be exact")
|
|
84
|
+
archive_utility.__post_init__()
|
|
85
|
+
if type(affine_snapshot) not in {
|
|
86
|
+
AffineHypervolumeSnapshot2D,
|
|
87
|
+
AffineHypervolumeSnapshot3D,
|
|
88
|
+
}:
|
|
89
|
+
raise TypeError("affine_snapshot must be an exact 2-D or 3-D snapshot")
|
|
90
|
+
affine_snapshot.__post_init__()
|
|
91
|
+
if affine_snapshot.to_record() != thaw_json(archive_utility.snapshot_receipt):
|
|
92
|
+
raise ValueError("affine snapshot differs from the archive utility receipt")
|
|
93
|
+
if archive_utility.definition_sha256 != affine_snapshot.spec.definition_sha256:
|
|
94
|
+
raise ValueError("archive utility and affine definition differ")
|
|
95
|
+
if not isinstance(parent_objectives, Mapping):
|
|
96
|
+
raise TypeError("parent_objectives must be a mapping")
|
|
97
|
+
metric_ids = affine_snapshot.spec.metric_ids
|
|
98
|
+
if set(parent_objectives) != set(metric_ids):
|
|
99
|
+
raise ValueError("parent objectives differ from the affine metric frame")
|
|
100
|
+
parent = {metric_id: float(parent_objectives[metric_id]) for metric_id in metric_ids}
|
|
101
|
+
if any(not math.isfinite(value) for value in parent.values()):
|
|
102
|
+
raise ValueError("parent objectives must be finite")
|
|
103
|
+
if type(lane_id) is not str or not lane_id:
|
|
104
|
+
raise ValueError("lane_id must be non-empty")
|
|
105
|
+
|
|
106
|
+
anchors = affine_snapshot.normalized_archive_points
|
|
107
|
+
if not anchors:
|
|
108
|
+
raise ValueError("archive-conditioned targeting requires prior archive points")
|
|
109
|
+
normalized_parent = affine_snapshot.spec.normalize(parent)
|
|
110
|
+
cell_payload = {
|
|
111
|
+
"archive_utility_snapshot_sha256": archive_utility.snapshot_sha256,
|
|
112
|
+
"normalized_anchor_points_hex": [
|
|
113
|
+
[value.hex() for value in point] for point in anchors
|
|
114
|
+
],
|
|
115
|
+
"metric_ids": list(metric_ids),
|
|
116
|
+
}
|
|
117
|
+
cell_sha256 = hashlib.sha256(
|
|
118
|
+
_CELL_DOMAIN + _canonical_json(cell_payload)
|
|
119
|
+
).hexdigest()
|
|
120
|
+
axes = []
|
|
121
|
+
for axis in affine_snapshot.spec.axes:
|
|
122
|
+
value = parent[axis.metric_id]
|
|
123
|
+
axes.append(
|
|
124
|
+
{
|
|
125
|
+
"metric_id": axis.metric_id,
|
|
126
|
+
"goal": axis.goal,
|
|
127
|
+
"ideal_decimal": _decimal(float(axis.ideal)),
|
|
128
|
+
"reference_decimal": _decimal(float(axis.reference)),
|
|
129
|
+
"parent_value_decimal": _decimal(value),
|
|
130
|
+
"aspiration_value_decimal": _decimal(value),
|
|
131
|
+
"signed_parent_to_aspiration_delta_decimal": _decimal(0.0),
|
|
132
|
+
"improving_raw_delta_sign": (
|
|
133
|
+
"negative" if axis.goal == "min" else "positive"
|
|
134
|
+
),
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
payload = _object(
|
|
138
|
+
{
|
|
139
|
+
"schema_version": 2,
|
|
140
|
+
"objective_space_target": {
|
|
141
|
+
"purpose": (
|
|
142
|
+
"score_probabilistic_actions_by_expected_fixed_reference_"
|
|
143
|
+
"hypervolume_without_inventing_an_aspiration"
|
|
144
|
+
),
|
|
145
|
+
"axes": axes,
|
|
146
|
+
},
|
|
147
|
+
"residual_frontier_cell": {
|
|
148
|
+
"cell_sha256": cell_sha256,
|
|
149
|
+
"geometry_sha256": affine_snapshot.spec.definition_sha256,
|
|
150
|
+
"policy_definition_sha256": (
|
|
151
|
+
ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256
|
|
152
|
+
),
|
|
153
|
+
"normalized_anchor_points_decimal": [
|
|
154
|
+
[_decimal(value) for value in point] for point in anchors
|
|
155
|
+
],
|
|
156
|
+
"normalized_aspiration_point_decimal": [
|
|
157
|
+
_decimal(value) for value in normalized_parent
|
|
158
|
+
],
|
|
159
|
+
"potential_hypervolume_gain_decimal": _decimal(0.0),
|
|
160
|
+
"parent_anchor_binding_distance_decimal": _decimal(0.0),
|
|
161
|
+
},
|
|
162
|
+
"acquisition_instruction": {
|
|
163
|
+
"objective": "maximize_expected_fixed_reference_hypervolume_gain",
|
|
164
|
+
"avoid_candidates_dominated_by_the_prior_archive": True,
|
|
165
|
+
"evaluator_outcomes_remain_unknown": True,
|
|
166
|
+
"target_realization_is_magnitude_sensitive": True,
|
|
167
|
+
"tradeoffs_can_be_frontier_improving": True,
|
|
168
|
+
},
|
|
169
|
+
"normalized_orientation": "lower_is_better_on_every_axis",
|
|
170
|
+
"epistemic_cutoff": {
|
|
171
|
+
"archive_utility_snapshot_sha256": archive_utility.snapshot_sha256,
|
|
172
|
+
"generation": archive_utility.generation,
|
|
173
|
+
"current_or_future_candidate_outcomes_consulted": False,
|
|
174
|
+
},
|
|
175
|
+
"workload_identifiers_consulted": False,
|
|
176
|
+
"model_or_provider_fields_consulted": False,
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
target = CampaignPortfolioFrontierTarget(
|
|
180
|
+
allocator_id=ARCHIVE_CONDITIONED_TARGET_ID,
|
|
181
|
+
allocator_version=ARCHIVE_CONDITIONED_TARGET_VERSION,
|
|
182
|
+
definition_sha256=ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256,
|
|
183
|
+
archive_utility_snapshot_sha256=archive_utility.snapshot_sha256,
|
|
184
|
+
lane_id=lane_id,
|
|
185
|
+
parent_configuration_sha256=(
|
|
186
|
+
selection_request.finite_variation_contract
|
|
187
|
+
.parent_configuration_sha256
|
|
188
|
+
),
|
|
189
|
+
direction_id="expected_hypervolume",
|
|
190
|
+
opportunity_rank=1,
|
|
191
|
+
payload=payload,
|
|
192
|
+
)
|
|
193
|
+
context = thaw_json(selection_request.context)
|
|
194
|
+
if type(context) is not dict:
|
|
195
|
+
raise TypeError("selection request context must be an object")
|
|
196
|
+
context[CAMPAIGN_FRONTIER_TARGET_KEY] = target.to_record()
|
|
197
|
+
rebound_context = freeze_json(context)
|
|
198
|
+
if type(rebound_context) is not FrozenJsonObject:
|
|
199
|
+
raise TypeError("rebound selector context must be an object")
|
|
200
|
+
return replace(selection_request, context=rebound_context), target
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
__all__ = [
|
|
204
|
+
"ARCHIVE_CONDITIONED_TARGET_DEFINITION_SHA256",
|
|
205
|
+
"ARCHIVE_CONDITIONED_TARGET_ID",
|
|
206
|
+
"ARCHIVE_CONDITIONED_TARGET_VERSION",
|
|
207
|
+
"bind_archive_conditioned_affine_action_target",
|
|
208
|
+
]
|