agentevolve-optimizer 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_evolve/__init__.py +722 -0
- agent_evolve/agentic.py +2800 -0
- agent_evolve/api.py +767 -0
- agent_evolve/application/__init__.py +1580 -0
- agent_evolve/application/action_allocation.py +744 -0
- agent_evolve/application/action_allocation_frame.py +347 -0
- agent_evolve/application/action_allocation_frame_commit.py +185 -0
- agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
- agent_evolve/application/action_allocation_frame_v3.py +338 -0
- agent_evolve/application/action_archive_value.py +497 -0
- agent_evolve/application/action_evidence_consistency.py +455 -0
- agent_evolve/application/action_forecast_partitioning.py +1471 -0
- agent_evolve/application/action_metric_projection.py +211 -0
- agent_evolve/application/action_role_value.py +680 -0
- agent_evolve/application/action_score_authorities.py +363 -0
- agent_evolve/application/action_structural_signature.py +116 -0
- agent_evolve/application/action_target_realization.py +402 -0
- agent_evolve/application/agentic_evolution.py +7734 -0
- agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
- agent_evolve/application/anchor_residual_identification.py +463 -0
- agent_evolve/application/archive_conditioned_action_target.py +208 -0
- agent_evolve/application/artifact_journal.py +246 -0
- agent_evolve/application/artifact_replay.py +347 -0
- agent_evolve/application/budgeted_optimizer.py +1828 -0
- agent_evolve/application/calibrated_campaign.py +485 -0
- agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
- agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
- agent_evolve/application/campaign_capacity_recourse.py +254 -0
- agent_evolve/application/campaign_contextual_outcomes.py +119 -0
- agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
- agent_evolve/application/campaign_evidence_registry.py +262 -0
- agent_evolve/application/campaign_execution.py +2537 -0
- agent_evolve/application/campaign_generation_audit.py +942 -0
- agent_evolve/application/campaign_learning.py +1812 -0
- agent_evolve/application/campaign_learning_runtime.py +1977 -0
- agent_evolve/application/campaign_search_phase.py +227 -0
- agent_evolve/application/campaign_selector_context_extension.py +220 -0
- agent_evolve/application/campaign_variation_envelope.py +649 -0
- agent_evolve/application/campaign_variation_trace.py +451 -0
- agent_evolve/application/candidate_archive_consequence.py +128 -0
- agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
- agent_evolve/application/composite_outcome_updater.py +145 -0
- agent_evolve/application/composition_portfolio_selection.py +363 -0
- agent_evolve/application/concurrent_stage.py +144 -0
- agent_evolve/application/contextual_action_allocation.py +181 -0
- agent_evolve/application/contextual_campaign_outcomes.py +267 -0
- agent_evolve/application/contextual_campaign_planning.py +1366 -0
- agent_evolve/application/contextual_delayed_credit.py +651 -0
- agent_evolve/application/contextual_search_controller.py +2374 -0
- agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
- agent_evolve/application/decision_metric_projection.py +112 -0
- agent_evolve/application/derived_action_semantics.py +129 -0
- agent_evolve/application/detailed_evaluation.py +449 -0
- agent_evolve/application/earned_lineage.py +1011 -0
- agent_evolve/application/effective_choice_audit.py +484 -0
- agent_evolve/application/empirical_consequence_calibration.py +908 -0
- agent_evolve/application/evaluation_accounting.py +325 -0
- agent_evolve/application/evaluation_cache.py +199 -0
- agent_evolve/application/evaluation_escrow.py +547 -0
- agent_evolve/application/evaluation_recourse.py +253 -0
- agent_evolve/application/event_recorder.py +151 -0
- agent_evolve/application/evolution_campaign.py +1840 -0
- agent_evolve/application/executable_hypothesis.py +323 -0
- agent_evolve/application/factorial_branch_pilot.py +772 -0
- agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
- agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
- agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
- agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
- agent_evolve/application/finite_action_selection.py +188 -0
- agent_evolve/application/finite_action_set.py +306 -0
- agent_evolve/application/finite_action_transition.py +537 -0
- agent_evolve/application/finite_variation_eligibility.py +296 -0
- agent_evolve/application/forecast_geometry_portfolio.py +799 -0
- agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
- agent_evolve/application/front_proximity_admission.py +311 -0
- agent_evolve/application/front_proximity_parent_basis.py +458 -0
- agent_evolve/application/frozen_hurdle_score.py +659 -0
- agent_evolve/application/g3_causal_screen.py +2257 -0
- agent_evolve/application/g3_causal_validation.py +1046 -0
- agent_evolve/application/g3_postseal_curation.py +818 -0
- agent_evolve/application/gated_agentic_generator.py +205 -0
- agent_evolve/application/generation_feedback.py +293 -0
- agent_evolve/application/generative_proposal_journal.py +185 -0
- agent_evolve/application/geometry_conditional_elasticity.py +453 -0
- agent_evolve/application/global_wave_action_allocation.py +1151 -0
- agent_evolve/application/head_mass_conditional_seat.py +268 -0
- agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
- agent_evolve/application/identifiable_reflection_learning.py +395 -0
- agent_evolve/application/identifiable_reflection_request.py +364 -0
- agent_evolve/application/in_memory_residual_archive.py +341 -0
- agent_evolve/application/insight_memory.py +1804 -0
- agent_evolve/application/live_runtime_manifest.py +758 -0
- agent_evolve/application/llm_task_queue.py +769 -0
- agent_evolve/application/matched_finite_action_block.py +409 -0
- agent_evolve/application/materialized_action_broker.py +2328 -0
- agent_evolve/application/materialized_action_constraints.py +83 -0
- agent_evolve/application/materialized_variation.py +211 -0
- agent_evolve/application/multi_option_evolution.py +1536 -0
- agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
- agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
- agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
- agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
- agent_evolve/application/outcome_relation.py +193 -0
- agent_evolve/application/paired_allocation_comparison.py +241 -0
- agent_evolve/application/paired_block_schedule.py +127 -0
- agent_evolve/application/parent_measurement.py +226 -0
- agent_evolve/application/pareto_archive.py +811 -0
- agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
- agent_evolve/application/portfolio_evolution.py +2950 -0
- agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
- agent_evolve/application/portfolio_memory_attribution.py +581 -0
- agent_evolve/application/portfolio_memory_dose.py +788 -0
- agent_evolve/application/portfolio_memory_matched_control.py +938 -0
- agent_evolve/application/portfolio_memory_transfer.py +297 -0
- agent_evolve/application/portfolio_optimization_memory.py +363 -0
- agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
- agent_evolve/application/portfolio_projection.py +335 -0
- agent_evolve/application/portfolio_recombination.py +2032 -0
- agent_evolve/application/post_evolution_reflection.py +834 -0
- agent_evolve/application/postcommit_rank_authority.py +245 -0
- agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
- agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
- agent_evolve/application/prequential_residual_exploration.py +343 -0
- agent_evolve/application/prequential_score_portfolio.py +954 -0
- agent_evolve/application/projections.py +292 -0
- agent_evolve/application/protected_action_committee.py +1027 -0
- agent_evolve/application/protected_branch_pilot.py +376 -0
- agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
- agent_evolve/application/provider_replay.py +910 -0
- agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
- agent_evolve/application/recombination_residual_expert.py +403 -0
- agent_evolve/application/reflection_workflow.py +571 -0
- agent_evolve/application/region_conditional_credit.py +911 -0
- agent_evolve/application/residual_campaign_runtime.py +531 -0
- agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
- agent_evolve/application/residual_headroom_ledger.py +1544 -0
- agent_evolve/application/residual_learning_transaction.py +396 -0
- agent_evolve/application/residual_portfolio_evolution.py +1228 -0
- agent_evolve/application/residual_reachability.py +749 -0
- agent_evolve/application/residual_stage_credit.py +499 -0
- agent_evolve/application/same_prefix_paired_audit.py +1580 -0
- agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
- agent_evolve/application/sequential_lineage_allocation.py +1017 -0
- agent_evolve/application/sequential_market_replay.py +1395 -0
- agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
- agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
- agent_evolve/application/single_score_action_allocation.py +299 -0
- agent_evolve/application/source_exposure_allocation.py +906 -0
- agent_evolve/application/staged_memory.py +210 -0
- agent_evolve/application/stratified_cold_start_allocation.py +732 -0
- agent_evolve/application/support_guarded_hurdle_score.py +549 -0
- agent_evolve/application/target_conditioned_action_forecast.py +595 -0
- agent_evolve/application/target_conditioned_campaign.py +566 -0
- agent_evolve/application/treatment_assignment.py +201 -0
- agent_evolve/application/trusted_objective_evidence.py +217 -0
- agent_evolve/application/two_stage_action_evolution.py +1131 -0
- agent_evolve/application/v8lite_allocation_policy.py +1083 -0
- agent_evolve/application/v9_candidate_policy.py +1303 -0
- agent_evolve/bootstrap.py +108 -0
- agent_evolve/campaign_presets.py +517 -0
- agent_evolve/campaign_profiles.py +452 -0
- agent_evolve/campaign_variation_topology.py +288 -0
- agent_evolve/campaign_workload.py +950 -0
- agent_evolve/cli.py +797 -0
- agent_evolve/contract.py +241 -0
- agent_evolve/core/__init__.py +91 -0
- agent_evolve/core/action_semantics.py +411 -0
- agent_evolve/core/authored.py +105 -0
- agent_evolve/core/formatting.py +286 -0
- agent_evolve/core/optimization_semantics.py +324 -0
- agent_evolve/core/problem.py +167 -0
- agent_evolve/core/results.py +323 -0
- agent_evolve/core/stats.py +70 -0
- agent_evolve/core/telemetry.py +100 -0
- agent_evolve/domain/__init__.py +89 -0
- agent_evolve/domain/artifact.py +162 -0
- agent_evolve/domain/durable_text.py +68 -0
- agent_evolve/domain/event.py +1454 -0
- agent_evolve/domain/finite_action_set.py +426 -0
- agent_evolve/domain/finite_variation.py +526 -0
- agent_evolve/domain/generative_emission.py +559 -0
- agent_evolve/domain/ids.py +163 -0
- agent_evolve/domain/inline_text.py +106 -0
- agent_evolve/domain/insight.py +27 -0
- agent_evolve/domain/lineage.py +737 -0
- agent_evolve/domain/llm_task_queue.py +960 -0
- agent_evolve/domain/outcome.py +96 -0
- agent_evolve/domain/patch.py +854 -0
- agent_evolve/domain/typed_json.py +542 -0
- agent_evolve/domain/variation_space.py +158 -0
- agent_evolve/driver.py +1014 -0
- agent_evolve/harness/__init__.py +29 -0
- agent_evolve/harness/base.py +242 -0
- agent_evolve/harness/directives.py +163 -0
- agent_evolve/harness/generative_seal.py +479 -0
- agent_evolve/harness/registry.py +41 -0
- agent_evolve/infrastructure/__init__.py +39 -0
- agent_evolve/infrastructure/artifacts/__init__.py +6 -0
- agent_evolve/infrastructure/artifacts/_verification.py +67 -0
- agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
- agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
- agent_evolve/infrastructure/asyncio_runtime.py +109 -0
- agent_evolve/infrastructure/authored_runtime.py +188 -0
- agent_evolve/infrastructure/authored_worker.py +171 -0
- agent_evolve/infrastructure/clock.py +53 -0
- agent_evolve/infrastructure/events/__init__.py +6 -0
- agent_evolve/infrastructure/events/_validation.py +89 -0
- agent_evolve/infrastructure/events/in_memory.py +56 -0
- agent_evolve/infrastructure/events/jsonl.py +193 -0
- agent_evolve/infrastructure/exception_provenance.py +215 -0
- agent_evolve/infrastructure/ids.py +118 -0
- agent_evolve/infrastructure/lineage_codec.py +1836 -0
- agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
- agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
- agent_evolve/infrastructure/resource_lease.py +370 -0
- agent_evolve/infrastructure/sanitization/__init__.py +8 -0
- agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
- agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
- agent_evolve/infrastructure/stream_liveness.py +383 -0
- agent_evolve/infrastructure/subprocess_boundary.py +136 -0
- agent_evolve/integrations/__init__.py +1 -0
- agent_evolve/integrations/botorch/__init__.py +28 -0
- agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
- agent_evolve/integrations/completion.py +242 -0
- agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
- agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
- agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
- agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
- agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
- agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
- agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
- agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
- agent_evolve/integrations/pydantic_ai/harness.py +159 -0
- agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
- agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
- agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
- agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
- agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
- agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
- agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
- agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
- agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
- agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
- agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
- agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
- agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
- agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
- agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
- agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
- agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
- agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
- agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
- agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
- agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
- agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
- agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
- agent_evolve/integrations/pymoo_adapter.py +242 -0
- agent_evolve/policies/__init__.py +17 -0
- agent_evolve/policies/check.py +469 -0
- agent_evolve/policies/emit_scaffold.py +451 -0
- agent_evolve/policies/feedback/__init__.py +37 -0
- agent_evolve/policies/feedback/held_out_asn.py +1325 -0
- agent_evolve/policies/genetic.py +607 -0
- agent_evolve/policies/llm_backoff.py +183 -0
- agent_evolve/policies/llm_chooser.py +226 -0
- agent_evolve/policies/llm_generator.py +1760 -0
- agent_evolve/policies/llm_init.py +267 -0
- agent_evolve/policies/llm_operator.py +109 -0
- agent_evolve/policies/llm_prior.py +194 -0
- agent_evolve/policies/llm_surrogate.py +334 -0
- agent_evolve/policies/measurement_evidence.py +704 -0
- agent_evolve/policies/memory/__init__.py +223 -0
- agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
- agent_evolve/policies/memory/compatibility_matching.py +593 -0
- agent_evolve/policies/memory/global_falsification.py +1841 -0
- agent_evolve/policies/memory/prompt_shape.py +503 -0
- agent_evolve/policies/memory/randomized_subset.py +714 -0
- agent_evolve/policies/memory/staged_causal.py +1270 -0
- agent_evolve/policies/memory/treatment_compliance.py +759 -0
- agent_evolve/policies/objective_resolution/__init__.py +17 -0
- agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
- agent_evolve/policies/operator_portfolio.py +407 -0
- agent_evolve/policies/reguidance.py +1133 -0
- agent_evolve/policies/reward/__init__.py +83 -0
- agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
- agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
- agent_evolve/policies/reward/affine_hypervolume.py +490 -0
- agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
- agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
- agent_evolve/policies/reward/frozen_archive.py +360 -0
- agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
- agent_evolve/policies/search_state.py +208 -0
- agent_evolve/policies/selection/__init__.py +345 -0
- agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
- agent_evolve/policies/selection/affine_frontier_context.py +330 -0
- agent_evolve/policies/selection/affine_frontier_target.py +473 -0
- agent_evolve/policies/selection/archive_elite.py +1346 -0
- agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
- agent_evolve/policies/selection/calibrated_slate.py +1394 -0
- agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
- agent_evolve/policies/selection/common_candidate_pool.py +685 -0
- agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
- agent_evolve/policies/selection/disjoint_pairs.py +479 -0
- agent_evolve/policies/selection/elite_explorer.py +719 -0
- agent_evolve/policies/selection/finite_action.py +187 -0
- agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
- agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
- agent_evolve/policies/selection/forecast_calibration.py +922 -0
- agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
- agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
- agent_evolve/policies/selection/full_support_slate.py +91 -0
- agent_evolve/policies/selection/meaningful_direction.py +240 -0
- agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
- agent_evolve/policies/selection/model_anchored_slate.py +826 -0
- agent_evolve/policies/selection/phenotype_recourse.py +979 -0
- agent_evolve/policies/selection/proposal_support.py +368 -0
- agent_evolve/policies/selection/random_portfolio.py +254 -0
- agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
- agent_evolve/policies/selection/residual_frontier.py +463 -0
- agent_evolve/policies/selection/residual_frontier_target.py +605 -0
- agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
- agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
- agent_evolve/policies/selection/target_conditioned_features.py +812 -0
- agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
- agent_evolve/policies/selection/task_keyed_palette.py +906 -0
- agent_evolve/policies/semantics.py +147 -0
- agent_evolve/policies/structure.py +362 -0
- agent_evolve/policies/structured_output_budget.py +62 -0
- agent_evolve/policies/surrogate.py +696 -0
- agent_evolve/policies/variation/__init__.py +1 -0
- agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
- agent_evolve/policies/variation/crossover_inheritance.py +575 -0
- agent_evolve/policies/variation/disjoint_recombination.py +611 -0
- agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
- agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
- agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
- agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
- agent_evolve/policies/variation/typed_patch.py +1981 -0
- agent_evolve/policies/weighted_prior.py +394 -0
- agent_evolve/ports/__init__.py +383 -0
- agent_evolve/ports/action_allocation.py +733 -0
- agent_evolve/ports/action_allocation_frame.py +1153 -0
- agent_evolve/ports/action_allocation_frame_commit.py +294 -0
- agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
- agent_evolve/ports/action_allocation_frame_v3.py +995 -0
- agent_evolve/ports/action_forecast.py +1568 -0
- agent_evolve/ports/action_metric_projection.py +165 -0
- agent_evolve/ports/agentic_generator.py +1561 -0
- agent_evolve/ports/archive_context.py +136 -0
- agent_evolve/ports/artifact_sanitizer.py +44 -0
- agent_evolve/ports/artifact_store.py +225 -0
- agent_evolve/ports/clock.py +13 -0
- agent_evolve/ports/contextual_search_allocation.py +827 -0
- agent_evolve/ports/decision_metric_projection.py +258 -0
- agent_evolve/ports/event_store.py +55 -0
- agent_evolve/ports/executable_hypothesis.py +557 -0
- agent_evolve/ports/finite_acquisition.py +377 -0
- agent_evolve/ports/finite_acquisition_batch.py +296 -0
- agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
- agent_evolve/ports/finite_acquisition_json.py +247 -0
- agent_evolve/ports/finite_acquisition_space.py +168 -0
- agent_evolve/ports/finite_action_selection.py +348 -0
- agent_evolve/ports/finite_action_set.py +256 -0
- agent_evolve/ports/frontier_target.py +396 -0
- agent_evolve/ports/generation_failure.py +43 -0
- agent_evolve/ports/hard_feasibility.py +233 -0
- agent_evolve/ports/id_factory.py +34 -0
- agent_evolve/ports/llm_task_queue.py +93 -0
- agent_evolve/ports/objective_resolution.py +419 -0
- agent_evolve/ports/paired_allocation_comparison.py +401 -0
- agent_evolve/ports/paired_block_schedule.py +475 -0
- agent_evolve/ports/parent_measurement.py +336 -0
- agent_evolve/ports/portfolio_memory_dose.py +643 -0
- agent_evolve/ports/portfolio_selection.py +3169 -0
- agent_evolve/ports/postcommit_rank_authority.py +467 -0
- agent_evolve/ports/presented_action_evidence.py +794 -0
- agent_evolve/ports/resource_lease.py +162 -0
- agent_evolve/ports/structured_generator.py +734 -0
- agent_evolve/ports/structured_output_budget.py +120 -0
- agent_evolve/ports/subprocess_boundary.py +138 -0
- agent_evolve/ports/treatment_assignment.py +466 -0
- agent_evolve/ports/variation_catalog.py +76 -0
- agent_evolve/ports/variation_source.py +226 -0
- agent_evolve/proposal_mode.py +157 -0
- agent_evolve/proposers/__init__.py +10 -0
- agent_evolve/proposers/random_proposer.py +188 -0
- agent_evolve/provider_accounting.py +163 -0
- agent_evolve/py.typed +0 -0
- agent_evolve/reference_method.py +1570 -0
- agent_evolve/session/__init__.py +11 -0
- agent_evolve/session/authorship.py +864 -0
- agent_evolve/session/evaluate.py +236 -0
- agent_evolve/session/fidelity.py +237 -0
- agent_evolve/session/genetic_loop.py +742 -0
- agent_evolve/session/loop.py +803 -0
- agent_evolve/session/screening.py +671 -0
- agent_evolve/settings.py +376 -0
- agent_evolve/workload_kit.py +368 -0
- agent_evolve/workload_prompt.py +398 -0
- agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
- agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
- agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
- agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
- agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
- agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"""Workload-neutral audit of proposed and evaluated variation topology.
|
|
2
|
+
|
|
3
|
+
The calibrated selector commits its original proposal slate and the engine's
|
|
4
|
+
evaluated subset in one authenticated result. This projection makes the
|
|
5
|
+
search-topology behavior directly comparable across workloads without
|
|
6
|
+
inspecting candidate fields, objective names, or model prose.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections import Counter
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
|
|
14
|
+
from agent_evolve.domain.finite_variation import FiniteVariationContract
|
|
15
|
+
from agent_evolve.domain.typed_json import thaw_json
|
|
16
|
+
from agent_evolve.policies.variation.compositional_finite_catalog import (
|
|
17
|
+
COMPOSITION_LEFT_OPTION_METADATA_KEY,
|
|
18
|
+
COMPOSITION_RIGHT_OPTION_METADATA_KEY,
|
|
19
|
+
COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY,
|
|
20
|
+
CompositionSelectionExposure,
|
|
21
|
+
)
|
|
22
|
+
from agent_evolve.ports.portfolio_selection import PortfolioSelectionResult
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
_HIERARCHICAL_ACTION_KINDS = frozenset({"atomic", "compose_r2"})
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def project_finite_contract_proposal_topology(
|
|
29
|
+
*,
|
|
30
|
+
source_contract: FiniteVariationContract,
|
|
31
|
+
proposal_contract: FiniteVariationContract,
|
|
32
|
+
) -> dict[str, object]:
|
|
33
|
+
"""Project an authenticated proposal surface without pretending it is LLM output."""
|
|
34
|
+
|
|
35
|
+
if type(source_contract) is not FiniteVariationContract or type(
|
|
36
|
+
proposal_contract
|
|
37
|
+
) is not FiniteVariationContract:
|
|
38
|
+
raise TypeError("source and proposal contracts must be exact")
|
|
39
|
+
source_contract.__post_init__()
|
|
40
|
+
proposal_contract.__post_init__()
|
|
41
|
+
source_by_identity = {
|
|
42
|
+
option.identity_sha256: option for option in source_contract.options
|
|
43
|
+
}
|
|
44
|
+
if any(
|
|
45
|
+
source_by_identity.get(option.identity_sha256) != option
|
|
46
|
+
for option in proposal_contract.options
|
|
47
|
+
):
|
|
48
|
+
raise ValueError("proposal topology escapes the source finite contract")
|
|
49
|
+
hierarchical = any(
|
|
50
|
+
COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY in dict(option.metadata)
|
|
51
|
+
for option in source_contract.options
|
|
52
|
+
)
|
|
53
|
+
members: list[dict[str, object]] = []
|
|
54
|
+
for rank, option in enumerate(proposal_contract.options, start=1):
|
|
55
|
+
metadata = dict(option.metadata)
|
|
56
|
+
exposure = metadata.get(COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY)
|
|
57
|
+
if exposure is not None and exposure != (
|
|
58
|
+
CompositionSelectionExposure.HIERARCHICAL_RANKED_UNION.value
|
|
59
|
+
):
|
|
60
|
+
raise ValueError("finite option declares an unknown hierarchy exposure")
|
|
61
|
+
if not hierarchical:
|
|
62
|
+
kind = "unclassified"
|
|
63
|
+
components: list[str] = []
|
|
64
|
+
elif exposure is None:
|
|
65
|
+
kind = "atomic"
|
|
66
|
+
components = []
|
|
67
|
+
else:
|
|
68
|
+
try:
|
|
69
|
+
components = sorted(
|
|
70
|
+
(
|
|
71
|
+
metadata[COMPOSITION_LEFT_OPTION_METADATA_KEY],
|
|
72
|
+
metadata[COMPOSITION_RIGHT_OPTION_METADATA_KEY],
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
except KeyError as error:
|
|
76
|
+
raise ValueError(
|
|
77
|
+
"hierarchical composite omitted its component options"
|
|
78
|
+
) from error
|
|
79
|
+
if (
|
|
80
|
+
len(components) != 2
|
|
81
|
+
or len(set(components)) != 2
|
|
82
|
+
or any(type(value) is not str or not value for value in components)
|
|
83
|
+
):
|
|
84
|
+
raise ValueError("hierarchical composite components are invalid")
|
|
85
|
+
kind = "compose_r2"
|
|
86
|
+
members.append(
|
|
87
|
+
{
|
|
88
|
+
"proposal_rank": rank,
|
|
89
|
+
"option_id": option.option_id,
|
|
90
|
+
"action_kind": kind,
|
|
91
|
+
"component_option_ids": components,
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
return {
|
|
95
|
+
"schema_version": 1,
|
|
96
|
+
"provenance": "engine_authenticated_finite_contract",
|
|
97
|
+
"source_contract_sha256": source_contract.identity_sha256,
|
|
98
|
+
"proposal_contract_sha256": proposal_contract.identity_sha256,
|
|
99
|
+
"members": members,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _proposal_members_from_audit(
|
|
104
|
+
payload: dict[str, object],
|
|
105
|
+
) -> tuple[list[dict[str, object]], str]:
|
|
106
|
+
original = payload.get("original_k8_response")
|
|
107
|
+
members = original.get("members") if type(original) is dict else None
|
|
108
|
+
if type(members) is list and members:
|
|
109
|
+
return members, "model_original_k8_response"
|
|
110
|
+
topology = payload.get("proposal_topology")
|
|
111
|
+
rows = topology.get("members") if type(topology) is dict else None
|
|
112
|
+
if type(rows) is not list or not rows:
|
|
113
|
+
raise ValueError("selector supplemental audit omitted proposal topology")
|
|
114
|
+
normalized: list[dict[str, object]] = []
|
|
115
|
+
for row in rows:
|
|
116
|
+
if type(row) is not dict:
|
|
117
|
+
raise TypeError("proposal topology member must be an object")
|
|
118
|
+
kind = row.get("action_kind")
|
|
119
|
+
if kind == "unclassified":
|
|
120
|
+
action = None
|
|
121
|
+
elif kind in _HIERARCHICAL_ACTION_KINDS:
|
|
122
|
+
action = {
|
|
123
|
+
"action_kind": kind,
|
|
124
|
+
"component_option_ids": row.get("component_option_ids", []),
|
|
125
|
+
}
|
|
126
|
+
else:
|
|
127
|
+
raise ValueError("proposal topology has an unknown action kind")
|
|
128
|
+
normalized.append(
|
|
129
|
+
{
|
|
130
|
+
"option_id": row.get("option_id"),
|
|
131
|
+
"hierarchical_action": action,
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
return normalized, "engine_authenticated_finite_contract"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@dataclass(frozen=True, slots=True)
|
|
138
|
+
class CampaignVariationTraceSummary:
|
|
139
|
+
"""Aggregate exact proposal-to-evaluation topology behavior."""
|
|
140
|
+
|
|
141
|
+
selector_call_count: int
|
|
142
|
+
proposal_member_count: int
|
|
143
|
+
evaluated_member_count: int
|
|
144
|
+
proposal_action_kind_counts: tuple[tuple[str, int], ...]
|
|
145
|
+
evaluated_action_kind_counts: tuple[tuple[str, int], ...]
|
|
146
|
+
hierarchical_call_count: int
|
|
147
|
+
model_original_proposal_call_count: int
|
|
148
|
+
engine_authenticated_proposal_call_count: int
|
|
149
|
+
required_composite_proposals: int | None
|
|
150
|
+
exact_required_composite_call_count: int
|
|
151
|
+
required_composite_capacity_available_call_count: int
|
|
152
|
+
capacity_projected_call_count: int
|
|
153
|
+
effective_composite_proposal_count_histogram: tuple[tuple[int, int], ...]
|
|
154
|
+
calls: tuple[dict[str, object], ...]
|
|
155
|
+
|
|
156
|
+
def __post_init__(self) -> None:
|
|
157
|
+
for name in (
|
|
158
|
+
"selector_call_count",
|
|
159
|
+
"proposal_member_count",
|
|
160
|
+
"evaluated_member_count",
|
|
161
|
+
"hierarchical_call_count",
|
|
162
|
+
"model_original_proposal_call_count",
|
|
163
|
+
"engine_authenticated_proposal_call_count",
|
|
164
|
+
"exact_required_composite_call_count",
|
|
165
|
+
"required_composite_capacity_available_call_count",
|
|
166
|
+
"capacity_projected_call_count",
|
|
167
|
+
):
|
|
168
|
+
value = getattr(self, name)
|
|
169
|
+
if type(value) is not int or value < 0:
|
|
170
|
+
raise ValueError(f"{name} must be a non-negative exact integer")
|
|
171
|
+
if self.required_composite_proposals is not None and (
|
|
172
|
+
type(self.required_composite_proposals) is not int
|
|
173
|
+
or not 1 <= self.required_composite_proposals < 8
|
|
174
|
+
):
|
|
175
|
+
raise ValueError("required_composite_proposals must lie in [1, 8)")
|
|
176
|
+
for name in (
|
|
177
|
+
"proposal_action_kind_counts",
|
|
178
|
+
"evaluated_action_kind_counts",
|
|
179
|
+
):
|
|
180
|
+
values = getattr(self, name)
|
|
181
|
+
if type(values) is not tuple or values != tuple(sorted(values)):
|
|
182
|
+
raise ValueError(f"{name} must be a canonical exact tuple")
|
|
183
|
+
if any(
|
|
184
|
+
type(key) is not str or not key or type(count) is not int or count < 0
|
|
185
|
+
for key, count in values
|
|
186
|
+
):
|
|
187
|
+
raise ValueError(f"{name} contains an invalid counter")
|
|
188
|
+
if type(self.calls) is not tuple or len(self.calls) != self.selector_call_count:
|
|
189
|
+
raise ValueError("calls must contain one record per selector call")
|
|
190
|
+
if (
|
|
191
|
+
self.model_original_proposal_call_count
|
|
192
|
+
+ self.engine_authenticated_proposal_call_count
|
|
193
|
+
> self.selector_call_count
|
|
194
|
+
):
|
|
195
|
+
raise ValueError("classified proposal surfaces exceed selector calls")
|
|
196
|
+
if (
|
|
197
|
+
self.exact_required_composite_call_count
|
|
198
|
+
> self.model_original_proposal_call_count
|
|
199
|
+
):
|
|
200
|
+
raise ValueError("exact hierarchy count exceeds model proposal calls")
|
|
201
|
+
if (
|
|
202
|
+
self.required_composite_capacity_available_call_count
|
|
203
|
+
> self.engine_authenticated_proposal_call_count
|
|
204
|
+
):
|
|
205
|
+
raise ValueError(
|
|
206
|
+
"available hierarchy capacity exceeds engine proposal calls"
|
|
207
|
+
)
|
|
208
|
+
if self.capacity_projected_call_count > self.hierarchical_call_count:
|
|
209
|
+
raise ValueError("capacity projection count exceeds hierarchical calls")
|
|
210
|
+
if (
|
|
211
|
+
type(self.effective_composite_proposal_count_histogram) is not tuple
|
|
212
|
+
or self.effective_composite_proposal_count_histogram
|
|
213
|
+
!= tuple(sorted(self.effective_composite_proposal_count_histogram))
|
|
214
|
+
or any(
|
|
215
|
+
type(count) is not int
|
|
216
|
+
or count < 0
|
|
217
|
+
or type(calls) is not int
|
|
218
|
+
or calls <= 0
|
|
219
|
+
for count, calls in self.effective_composite_proposal_count_histogram
|
|
220
|
+
)
|
|
221
|
+
):
|
|
222
|
+
raise ValueError("effective hierarchy histogram is not canonical")
|
|
223
|
+
|
|
224
|
+
def to_record(self) -> dict[str, object]:
|
|
225
|
+
self.__post_init__()
|
|
226
|
+
proposed = dict(self.proposal_action_kind_counts)
|
|
227
|
+
evaluated = dict(self.evaluated_action_kind_counts)
|
|
228
|
+
composite_proposed = proposed.get("compose_r2", 0)
|
|
229
|
+
composite_evaluated = evaluated.get("compose_r2", 0)
|
|
230
|
+
return {
|
|
231
|
+
"schema_version": 4,
|
|
232
|
+
"selector_call_count": self.selector_call_count,
|
|
233
|
+
"proposal_member_count": self.proposal_member_count,
|
|
234
|
+
"evaluated_member_count": self.evaluated_member_count,
|
|
235
|
+
"proposal_action_kind_counts": proposed,
|
|
236
|
+
"evaluated_action_kind_counts": evaluated,
|
|
237
|
+
"hierarchical_call_count": self.hierarchical_call_count,
|
|
238
|
+
"model_original_proposal_call_count": (
|
|
239
|
+
self.model_original_proposal_call_count
|
|
240
|
+
),
|
|
241
|
+
"engine_authenticated_proposal_call_count": (
|
|
242
|
+
self.engine_authenticated_proposal_call_count
|
|
243
|
+
),
|
|
244
|
+
"required_composite_proposals": self.required_composite_proposals,
|
|
245
|
+
"exact_required_composite_call_count": (
|
|
246
|
+
self.exact_required_composite_call_count
|
|
247
|
+
),
|
|
248
|
+
"required_composite_capacity_available_call_count": (
|
|
249
|
+
self.required_composite_capacity_available_call_count
|
|
250
|
+
),
|
|
251
|
+
"capacity_projected_call_count": self.capacity_projected_call_count,
|
|
252
|
+
"effective_composite_proposal_count_histogram": {
|
|
253
|
+
str(count): calls
|
|
254
|
+
for count, calls in self.effective_composite_proposal_count_histogram
|
|
255
|
+
},
|
|
256
|
+
"exact_required_composite_call_rate": (
|
|
257
|
+
None
|
|
258
|
+
if self.required_composite_proposals is None
|
|
259
|
+
or self.model_original_proposal_call_count == 0
|
|
260
|
+
else self.exact_required_composite_call_count
|
|
261
|
+
/ self.model_original_proposal_call_count
|
|
262
|
+
),
|
|
263
|
+
"required_composite_capacity_available_rate": (
|
|
264
|
+
None
|
|
265
|
+
if self.required_composite_proposals is None
|
|
266
|
+
or self.engine_authenticated_proposal_call_count == 0
|
|
267
|
+
else self.required_composite_capacity_available_call_count
|
|
268
|
+
/ self.engine_authenticated_proposal_call_count
|
|
269
|
+
),
|
|
270
|
+
"composite_proposal_count": composite_proposed,
|
|
271
|
+
"composite_evaluated_count": composite_evaluated,
|
|
272
|
+
"composite_proposal_evaluation_rate": (
|
|
273
|
+
None
|
|
274
|
+
if composite_proposed == 0
|
|
275
|
+
else composite_evaluated / composite_proposed
|
|
276
|
+
),
|
|
277
|
+
"calls": list(self.calls),
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def summarize_campaign_variation_trace(
|
|
282
|
+
results: tuple[PortfolioSelectionResult, ...],
|
|
283
|
+
*,
|
|
284
|
+
required_composite_proposals: int | None = None,
|
|
285
|
+
) -> CampaignVariationTraceSummary:
|
|
286
|
+
"""Join authenticated K8 proposals to their engine-selected subsets."""
|
|
287
|
+
|
|
288
|
+
if type(results) is not tuple or any(
|
|
289
|
+
type(value) is not PortfolioSelectionResult for value in results
|
|
290
|
+
):
|
|
291
|
+
raise TypeError("results must contain exact PortfolioSelectionResult values")
|
|
292
|
+
if required_composite_proposals is not None and (
|
|
293
|
+
type(required_composite_proposals) is not int
|
|
294
|
+
or not 1 <= required_composite_proposals < 8
|
|
295
|
+
):
|
|
296
|
+
raise ValueError("required_composite_proposals must lie in [1, 8)")
|
|
297
|
+
|
|
298
|
+
proposal_counts: Counter[str] = Counter()
|
|
299
|
+
evaluated_counts: Counter[str] = Counter()
|
|
300
|
+
proposal_member_count = 0
|
|
301
|
+
evaluated_member_count = 0
|
|
302
|
+
hierarchical_call_count = 0
|
|
303
|
+
model_original_call_count = 0
|
|
304
|
+
engine_authenticated_call_count = 0
|
|
305
|
+
exact_required_count = 0
|
|
306
|
+
required_capacity_available_count = 0
|
|
307
|
+
capacity_projected_call_count = 0
|
|
308
|
+
effective_composite_counts: Counter[int] = Counter()
|
|
309
|
+
call_records: list[dict[str, object]] = []
|
|
310
|
+
|
|
311
|
+
for result in results:
|
|
312
|
+
selected_ids = tuple(member.option_id for member in result.decision.members)
|
|
313
|
+
evaluated_member_count += len(selected_ids)
|
|
314
|
+
audit = result.supplemental_audit
|
|
315
|
+
if audit is None:
|
|
316
|
+
evaluated_counts.update({"unclassified": len(selected_ids)})
|
|
317
|
+
call_records.append(
|
|
318
|
+
{
|
|
319
|
+
"request_sha256": result.decision.request_sha256,
|
|
320
|
+
"topology": "direct_or_unclassified",
|
|
321
|
+
"proposal_option_ids": [],
|
|
322
|
+
"evaluated_option_ids": list(selected_ids),
|
|
323
|
+
"proposal_action_kinds": [],
|
|
324
|
+
"evaluated_action_kinds": ["unclassified" for _ in selected_ids],
|
|
325
|
+
}
|
|
326
|
+
)
|
|
327
|
+
continue
|
|
328
|
+
|
|
329
|
+
payload = thaw_json(audit.payload)
|
|
330
|
+
if type(payload) is not dict:
|
|
331
|
+
raise TypeError("selector supplemental audit payload must be an object")
|
|
332
|
+
members, proposal_provenance = _proposal_members_from_audit(payload)
|
|
333
|
+
option_ids: list[str] = []
|
|
334
|
+
kinds: list[str] = []
|
|
335
|
+
kind_by_option: dict[str, str] = {}
|
|
336
|
+
hierarchical_flags: list[bool] = []
|
|
337
|
+
for row in members:
|
|
338
|
+
if type(row) is not dict:
|
|
339
|
+
raise TypeError("selector proposal member must be an object")
|
|
340
|
+
option_id = row.get("option_id")
|
|
341
|
+
if type(option_id) is not str or not option_id:
|
|
342
|
+
raise ValueError("selector proposal member omitted option_id")
|
|
343
|
+
action = row.get("hierarchical_action")
|
|
344
|
+
hierarchical_flags.append(action is not None)
|
|
345
|
+
if action is None:
|
|
346
|
+
kind = "unclassified"
|
|
347
|
+
else:
|
|
348
|
+
if type(action) is not dict:
|
|
349
|
+
raise TypeError("hierarchical action must be an object")
|
|
350
|
+
kind = action.get("action_kind")
|
|
351
|
+
if kind not in _HIERARCHICAL_ACTION_KINDS:
|
|
352
|
+
raise ValueError("hierarchical action has an unknown kind")
|
|
353
|
+
components = action.get("component_option_ids", [])
|
|
354
|
+
if type(components) is not list:
|
|
355
|
+
raise TypeError("hierarchical components must be a list")
|
|
356
|
+
if kind == "atomic" and components:
|
|
357
|
+
raise ValueError("atomic hierarchical member declares components")
|
|
358
|
+
if kind == "compose_r2" and (
|
|
359
|
+
len(components) != 2 or len(set(components)) != 2
|
|
360
|
+
):
|
|
361
|
+
raise ValueError("radius-two member lacks two source atoms")
|
|
362
|
+
option_ids.append(option_id)
|
|
363
|
+
kinds.append(kind)
|
|
364
|
+
kind_by_option[option_id] = kind
|
|
365
|
+
if len(set(option_ids)) != len(option_ids):
|
|
366
|
+
raise ValueError("selector proposal repeats an option")
|
|
367
|
+
if not set(selected_ids).issubset(option_ids):
|
|
368
|
+
raise ValueError("evaluated selection escapes its original proposal")
|
|
369
|
+
if any(hierarchical_flags) and not all(hierarchical_flags):
|
|
370
|
+
raise ValueError("one selector call mixes hierarchical and flat members")
|
|
371
|
+
|
|
372
|
+
hierarchical = all(hierarchical_flags)
|
|
373
|
+
if hierarchical:
|
|
374
|
+
hierarchical_call_count += 1
|
|
375
|
+
observed_composites = kinds.count("compose_r2")
|
|
376
|
+
if proposal_provenance == "model_original_k8_response":
|
|
377
|
+
model_original_call_count += 1
|
|
378
|
+
else:
|
|
379
|
+
engine_authenticated_call_count += 1
|
|
380
|
+
if required_composite_proposals is not None:
|
|
381
|
+
if not hierarchical:
|
|
382
|
+
raise ValueError("required hierarchical trace lacks hierarchy actions")
|
|
383
|
+
effective_composite_counts[observed_composites] += 1
|
|
384
|
+
if proposal_provenance == "model_original_k8_response":
|
|
385
|
+
# Every model result has passed its dynamic exact-K8 schema.
|
|
386
|
+
# A different count is an authenticated K8 capacity projection.
|
|
387
|
+
exact_required_count += 1
|
|
388
|
+
if observed_composites != required_composite_proposals:
|
|
389
|
+
capacity_projected_call_count += 1
|
|
390
|
+
else:
|
|
391
|
+
# An engine screen may be wider than K8. Its relevant promise
|
|
392
|
+
# is availability, not equality with the model's K8 mix.
|
|
393
|
+
if observed_composites >= required_composite_proposals:
|
|
394
|
+
required_capacity_available_count += 1
|
|
395
|
+
else:
|
|
396
|
+
capacity_projected_call_count += 1
|
|
397
|
+
proposal_counts.update(kinds)
|
|
398
|
+
evaluated_kinds = [kind_by_option[value] for value in selected_ids]
|
|
399
|
+
evaluated_counts.update(evaluated_kinds)
|
|
400
|
+
proposal_member_count += len(option_ids)
|
|
401
|
+
call_records.append(
|
|
402
|
+
{
|
|
403
|
+
"request_sha256": result.decision.request_sha256,
|
|
404
|
+
"proposal_provenance": proposal_provenance,
|
|
405
|
+
"topology": "hierarchical_r2" if hierarchical else "flat_or_atomic",
|
|
406
|
+
"proposal_option_ids": option_ids,
|
|
407
|
+
"evaluated_option_ids": list(selected_ids),
|
|
408
|
+
"proposal_action_kinds": kinds,
|
|
409
|
+
"evaluated_action_kinds": evaluated_kinds,
|
|
410
|
+
"composite_proposal_count": observed_composites,
|
|
411
|
+
"composite_evaluated_count": evaluated_kinds.count("compose_r2"),
|
|
412
|
+
"preferred_composite_proposal_count": (required_composite_proposals),
|
|
413
|
+
"effective_composite_proposal_count": observed_composites,
|
|
414
|
+
"capacity_projected": (
|
|
415
|
+
required_composite_proposals is not None
|
|
416
|
+
and (
|
|
417
|
+
observed_composites != required_composite_proposals
|
|
418
|
+
if proposal_provenance == "model_original_k8_response"
|
|
419
|
+
else observed_composites < required_composite_proposals
|
|
420
|
+
)
|
|
421
|
+
),
|
|
422
|
+
}
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
return CampaignVariationTraceSummary(
|
|
426
|
+
selector_call_count=len(results),
|
|
427
|
+
proposal_member_count=proposal_member_count,
|
|
428
|
+
evaluated_member_count=evaluated_member_count,
|
|
429
|
+
proposal_action_kind_counts=tuple(sorted(proposal_counts.items())),
|
|
430
|
+
evaluated_action_kind_counts=tuple(sorted(evaluated_counts.items())),
|
|
431
|
+
hierarchical_call_count=hierarchical_call_count,
|
|
432
|
+
model_original_proposal_call_count=model_original_call_count,
|
|
433
|
+
engine_authenticated_proposal_call_count=engine_authenticated_call_count,
|
|
434
|
+
required_composite_proposals=required_composite_proposals,
|
|
435
|
+
exact_required_composite_call_count=exact_required_count,
|
|
436
|
+
required_composite_capacity_available_call_count=(
|
|
437
|
+
required_capacity_available_count
|
|
438
|
+
),
|
|
439
|
+
capacity_projected_call_count=capacity_projected_call_count,
|
|
440
|
+
effective_composite_proposal_count_histogram=tuple(
|
|
441
|
+
sorted(effective_composite_counts.items())
|
|
442
|
+
),
|
|
443
|
+
calls=tuple(call_records),
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
__all__ = [
|
|
448
|
+
"CampaignVariationTraceSummary",
|
|
449
|
+
"project_finite_contract_proposal_topology",
|
|
450
|
+
"summarize_campaign_variation_trace",
|
|
451
|
+
]
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Generic scalar archive-geometry port for pre-evaluation consequence models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import re
|
|
7
|
+
from typing import Mapping, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
10
|
+
from agent_evolve.domain.patch import require_sha256
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@runtime_checkable
|
|
17
|
+
class CandidateArchiveConsequenceUtilityPort(Protocol):
|
|
18
|
+
"""Measure prior archive utility and one hypothetical objective point.
|
|
19
|
+
|
|
20
|
+
The port receives only evaluated candidates and raw decision objectives.
|
|
21
|
+
It may implement fixed-reference hypervolume or another workload-defined
|
|
22
|
+
archive utility, while the consequence projector remains workload blind.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
utility_id: str
|
|
26
|
+
utility_version: int
|
|
27
|
+
definition_sha256: str
|
|
28
|
+
|
|
29
|
+
def utility(
|
|
30
|
+
self,
|
|
31
|
+
candidates: tuple[EvolutionCandidate, ...],
|
|
32
|
+
) -> float: ...
|
|
33
|
+
|
|
34
|
+
def marginal_utility(
|
|
35
|
+
self,
|
|
36
|
+
candidates: tuple[EvolutionCandidate, ...],
|
|
37
|
+
objective_point: Mapping[str, float],
|
|
38
|
+
) -> float: ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@runtime_checkable
|
|
42
|
+
class CandidateArchivePortfolioConsequenceUtilityPort(
|
|
43
|
+
CandidateArchiveConsequenceUtilityPort,
|
|
44
|
+
Protocol,
|
|
45
|
+
):
|
|
46
|
+
"""Measure the joint marginal value of hypothetical objective points.
|
|
47
|
+
|
|
48
|
+
This optional extension preserves the inverted workload boundary while
|
|
49
|
+
allowing a generic allocation policy to value Pareto-complementary sets
|
|
50
|
+
rather than summing member-wise scores. Implementations remain
|
|
51
|
+
authoritative for objective senses, normalization, and reference points.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def portfolio_marginal_utility(
|
|
55
|
+
self,
|
|
56
|
+
candidates: tuple[EvolutionCandidate, ...],
|
|
57
|
+
objective_points: tuple[Mapping[str, float], ...],
|
|
58
|
+
) -> float: ...
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def validate_candidate_archive_consequence_utility(
|
|
62
|
+
value: CandidateArchiveConsequenceUtilityPort,
|
|
63
|
+
) -> tuple[str, int, str]:
|
|
64
|
+
"""Validate and return an injected utility's public identity."""
|
|
65
|
+
|
|
66
|
+
if not isinstance(value, CandidateArchiveConsequenceUtilityPort):
|
|
67
|
+
raise TypeError(
|
|
68
|
+
"value must implement CandidateArchiveConsequenceUtilityPort"
|
|
69
|
+
)
|
|
70
|
+
identity = (
|
|
71
|
+
getattr(value, "utility_id", None),
|
|
72
|
+
getattr(value, "utility_version", None),
|
|
73
|
+
getattr(value, "definition_sha256", None),
|
|
74
|
+
)
|
|
75
|
+
if type(identity[0]) is not str or _TOKEN.fullmatch(identity[0]) is None:
|
|
76
|
+
raise ValueError("utility_id must use the closed token grammar")
|
|
77
|
+
if type(identity[1]) is not int or identity[1] <= 0:
|
|
78
|
+
raise ValueError("utility_version must be positive")
|
|
79
|
+
require_sha256(identity[2], "utility definition_sha256")
|
|
80
|
+
return identity # type: ignore[return-value]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def validate_candidate_archive_portfolio_consequence_utility(
|
|
84
|
+
value: CandidateArchivePortfolioConsequenceUtilityPort,
|
|
85
|
+
) -> tuple[str, int, str]:
|
|
86
|
+
"""Validate the joint-set extension and return its public identity."""
|
|
87
|
+
|
|
88
|
+
if not isinstance(
|
|
89
|
+
value,
|
|
90
|
+
CandidateArchivePortfolioConsequenceUtilityPort,
|
|
91
|
+
):
|
|
92
|
+
raise TypeError(
|
|
93
|
+
"value must implement "
|
|
94
|
+
"CandidateArchivePortfolioConsequenceUtilityPort"
|
|
95
|
+
)
|
|
96
|
+
return validate_candidate_archive_consequence_utility(value)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def candidate_archive_utility(
|
|
100
|
+
port: CandidateArchiveConsequenceUtilityPort,
|
|
101
|
+
candidates: tuple[EvolutionCandidate, ...],
|
|
102
|
+
) -> float:
|
|
103
|
+
"""Call an injected utility and enforce the normalized scalar contract."""
|
|
104
|
+
|
|
105
|
+
validate_candidate_archive_consequence_utility(port)
|
|
106
|
+
if (
|
|
107
|
+
type(candidates) is not tuple
|
|
108
|
+
or any(
|
|
109
|
+
type(candidate) is not EvolutionCandidate
|
|
110
|
+
for candidate in candidates
|
|
111
|
+
)
|
|
112
|
+
):
|
|
113
|
+
raise TypeError("candidates must be an exact candidate tuple")
|
|
114
|
+
for candidate in candidates:
|
|
115
|
+
candidate.__post_init__()
|
|
116
|
+
result = port.utility(candidates)
|
|
117
|
+
if type(result) is not float or not math.isfinite(result) or result < 0.0:
|
|
118
|
+
raise ValueError("archive utility must be finite and non-negative")
|
|
119
|
+
return result
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
__all__ = [
|
|
123
|
+
"CandidateArchiveConsequenceUtilityPort",
|
|
124
|
+
"CandidateArchivePortfolioConsequenceUtilityPort",
|
|
125
|
+
"candidate_archive_utility",
|
|
126
|
+
"validate_candidate_archive_portfolio_consequence_utility",
|
|
127
|
+
"validate_candidate_archive_consequence_utility",
|
|
128
|
+
]
|