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,531 @@
|
|
|
1
|
+
"""Generic transactional campaign stage for residual portfolio evolution.
|
|
2
|
+
|
|
3
|
+
The runtime composes four independent boundaries:
|
|
4
|
+
|
|
5
|
+
1. workload-owned proposal experts materialize candidate actions;
|
|
6
|
+
2. a workload/model/provider-blind broker selects expensive evaluations;
|
|
7
|
+
3. a workload-owned archive port prepares the resulting state transition; and
|
|
8
|
+
4. conserved broker and lineage learning publish through one aggregate state.
|
|
9
|
+
|
|
10
|
+
The archive port follows the same prepare/commit/abort rule as the learning
|
|
11
|
+
store: preparation may perform work, while commit is synchronous, no-I/O, and
|
|
12
|
+
must not fail for its own validated preparation. This keeps the application
|
|
13
|
+
core generic without pretending that archive ownership belongs to the broker.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import hashlib
|
|
19
|
+
import json
|
|
20
|
+
import math
|
|
21
|
+
import re
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
from typing import Protocol, runtime_checkable
|
|
24
|
+
|
|
25
|
+
from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
|
|
26
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
27
|
+
MaterializedActionExplorationPort,
|
|
28
|
+
MaterializedActionReturnValuePort,
|
|
29
|
+
MaterializedSlateFeasibilityPort,
|
|
30
|
+
MaterializedSlateValuePort,
|
|
31
|
+
RegretBrokeredMaterializedActionPolicy,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.application.prequential_residual_exploration import (
|
|
34
|
+
PrequentialLowDiscrepancyResidualExploration,
|
|
35
|
+
)
|
|
36
|
+
from agent_evolve.application.residual_learning_transaction import (
|
|
37
|
+
ResidualLearningPublicationCommit,
|
|
38
|
+
ResidualLearningPublicationPreparation,
|
|
39
|
+
TransactionalResidualLearningStore,
|
|
40
|
+
)
|
|
41
|
+
from agent_evolve.application.residual_portfolio_evolution import (
|
|
42
|
+
MaterializedActionAllocationPolicyPort,
|
|
43
|
+
MaterializedActionProposalExpertPort,
|
|
44
|
+
ResidualPortfolioDecisionRequest,
|
|
45
|
+
ResidualPortfolioEvolution,
|
|
46
|
+
ResidualPortfolioEvolutionResult,
|
|
47
|
+
)
|
|
48
|
+
from agent_evolve.domain.patch import require_sha256
|
|
49
|
+
from agent_evolve.domain.typed_json import (
|
|
50
|
+
FrozenJsonObject,
|
|
51
|
+
freeze_json,
|
|
52
|
+
thaw_json,
|
|
53
|
+
typed_json_sha256,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
RESIDUAL_CAMPAIGN_RUNTIME_ID = "transactional_residual_portfolio_campaign"
|
|
58
|
+
RESIDUAL_CAMPAIGN_RUNTIME_VERSION = 3
|
|
59
|
+
RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256 = hashlib.sha256(
|
|
60
|
+
b"agent-evolve:transactional-residual-portfolio-campaign:v3;"
|
|
61
|
+
b"flow=expert-propose-optional-async-allocation-global-broker-selected-only-evaluate;"
|
|
62
|
+
b"archive=injected-prepare-commit-abort-port;"
|
|
63
|
+
b"learning=atomic-conserved-broker-and-earned-lineage-state;"
|
|
64
|
+
b"commit-order=fully-prepare-archive-and-learning-then-no-io-publication;"
|
|
65
|
+
b"broker-cutoff=prior-learning-state-only;"
|
|
66
|
+
b"exploration=prequential-low-discrepancy-protected-actions;"
|
|
67
|
+
b"workload-model-provider-branches=false"
|
|
68
|
+
).hexdigest()
|
|
69
|
+
|
|
70
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
71
|
+
_ARCHIVE_PREPARATION_DOMAIN = (
|
|
72
|
+
b"agent-evolve:residual-archive-transition-preparation:v1\x00"
|
|
73
|
+
)
|
|
74
|
+
_ARCHIVE_COMMIT_DOMAIN = b"agent-evolve:residual-archive-transition-commit:v1\x00"
|
|
75
|
+
_STAGE_RECEIPT_DOMAIN = b"agent-evolve:residual-campaign-stage-receipt:v1\x00"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _canonical_json(value: object) -> bytes:
|
|
79
|
+
return json.dumps(
|
|
80
|
+
value,
|
|
81
|
+
allow_nan=False,
|
|
82
|
+
ensure_ascii=True,
|
|
83
|
+
separators=(",", ":"),
|
|
84
|
+
sort_keys=True,
|
|
85
|
+
).encode("ascii", errors="strict")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
89
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _token(value: str, *, name: str) -> None:
|
|
93
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
94
|
+
raise ValueError(f"{name} must use the closed token grammar")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@dataclass(frozen=True, slots=True)
|
|
98
|
+
class ResidualArchiveTransitionPreparation:
|
|
99
|
+
"""Workload-owned archive transition frozen before publication."""
|
|
100
|
+
|
|
101
|
+
archive_id: str
|
|
102
|
+
archive_version: int
|
|
103
|
+
archive_definition_sha256: str
|
|
104
|
+
residual_result_sha256: str
|
|
105
|
+
pre_snapshot: ArchiveUtilitySnapshot
|
|
106
|
+
post_snapshot: ArchiveUtilitySnapshot
|
|
107
|
+
evidence: FrozenJsonObject
|
|
108
|
+
preparation_sha256: str = field(init=False)
|
|
109
|
+
|
|
110
|
+
def __post_init__(self) -> None:
|
|
111
|
+
_token(self.archive_id, name="archive_id")
|
|
112
|
+
if type(self.archive_version) is not int or self.archive_version <= 0:
|
|
113
|
+
raise ValueError("archive_version must be positive")
|
|
114
|
+
require_sha256(
|
|
115
|
+
self.archive_definition_sha256,
|
|
116
|
+
"archive_definition_sha256",
|
|
117
|
+
)
|
|
118
|
+
require_sha256(self.residual_result_sha256, "residual_result_sha256")
|
|
119
|
+
if type(self.pre_snapshot) is not ArchiveUtilitySnapshot:
|
|
120
|
+
raise TypeError("pre_snapshot must be exact")
|
|
121
|
+
if type(self.post_snapshot) is not ArchiveUtilitySnapshot:
|
|
122
|
+
raise TypeError("post_snapshot must be exact")
|
|
123
|
+
self.pre_snapshot.__post_init__()
|
|
124
|
+
self.post_snapshot.__post_init__()
|
|
125
|
+
if (
|
|
126
|
+
self.pre_snapshot.utility_id,
|
|
127
|
+
self.pre_snapshot.utility_version,
|
|
128
|
+
self.pre_snapshot.definition_sha256,
|
|
129
|
+
self.pre_snapshot.generation,
|
|
130
|
+
self.pre_snapshot.benchmark_sha256,
|
|
131
|
+
) != (
|
|
132
|
+
self.post_snapshot.utility_id,
|
|
133
|
+
self.post_snapshot.utility_version,
|
|
134
|
+
self.post_snapshot.definition_sha256,
|
|
135
|
+
self.post_snapshot.generation,
|
|
136
|
+
self.post_snapshot.benchmark_sha256,
|
|
137
|
+
):
|
|
138
|
+
raise ValueError("archive transition snapshots are not comparable")
|
|
139
|
+
if self.pre_snapshot.archive_sha256 == self.post_snapshot.archive_sha256:
|
|
140
|
+
raise ValueError("archive transition must advance its state receipt")
|
|
141
|
+
if (
|
|
142
|
+
type(self.evidence) is not FrozenJsonObject
|
|
143
|
+
or freeze_json(self.evidence) is not self.evidence
|
|
144
|
+
):
|
|
145
|
+
raise TypeError("archive evidence must be an exact frozen object")
|
|
146
|
+
object.__setattr__(
|
|
147
|
+
self,
|
|
148
|
+
"preparation_sha256",
|
|
149
|
+
_hash(_ARCHIVE_PREPARATION_DOMAIN, self._unsigned_record()),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
153
|
+
return {
|
|
154
|
+
"schema_version": 1,
|
|
155
|
+
"archive": {
|
|
156
|
+
"archive_id": self.archive_id,
|
|
157
|
+
"archive_version": self.archive_version,
|
|
158
|
+
"definition_sha256": self.archive_definition_sha256,
|
|
159
|
+
},
|
|
160
|
+
"residual_result_sha256": self.residual_result_sha256,
|
|
161
|
+
"pre_snapshot_sha256": self.pre_snapshot.snapshot_sha256,
|
|
162
|
+
"post_snapshot_sha256": self.post_snapshot.snapshot_sha256,
|
|
163
|
+
"evidence_sha256": typed_json_sha256(self.evidence),
|
|
164
|
+
"publication_performed": False,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
def to_record(self, *, include_evidence: bool = False) -> dict[str, object]:
|
|
168
|
+
self.__post_init__()
|
|
169
|
+
record = {
|
|
170
|
+
**self._unsigned_record(),
|
|
171
|
+
"pre_snapshot": self.pre_snapshot.to_record(),
|
|
172
|
+
"post_snapshot": self.post_snapshot.to_record(),
|
|
173
|
+
"preparation_sha256": self.preparation_sha256,
|
|
174
|
+
}
|
|
175
|
+
if include_evidence:
|
|
176
|
+
record["evidence"] = thaw_json(self.evidence)
|
|
177
|
+
return record
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
@dataclass(frozen=True, slots=True)
|
|
181
|
+
class ResidualArchiveTransitionCommit:
|
|
182
|
+
"""Typed receipt from the archive port's no-I/O publication."""
|
|
183
|
+
|
|
184
|
+
preparation_sha256: str
|
|
185
|
+
committed_archive_sha256: str
|
|
186
|
+
evidence: FrozenJsonObject
|
|
187
|
+
commit_sha256: str = field(init=False)
|
|
188
|
+
|
|
189
|
+
def __post_init__(self) -> None:
|
|
190
|
+
require_sha256(self.preparation_sha256, "preparation_sha256")
|
|
191
|
+
require_sha256(
|
|
192
|
+
self.committed_archive_sha256,
|
|
193
|
+
"committed_archive_sha256",
|
|
194
|
+
)
|
|
195
|
+
if (
|
|
196
|
+
type(self.evidence) is not FrozenJsonObject
|
|
197
|
+
or freeze_json(self.evidence) is not self.evidence
|
|
198
|
+
):
|
|
199
|
+
raise TypeError("commit evidence must be an exact frozen object")
|
|
200
|
+
object.__setattr__(
|
|
201
|
+
self,
|
|
202
|
+
"commit_sha256",
|
|
203
|
+
_hash(_ARCHIVE_COMMIT_DOMAIN, self._unsigned_record()),
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
207
|
+
return {
|
|
208
|
+
"schema_version": 1,
|
|
209
|
+
"preparation_sha256": self.preparation_sha256,
|
|
210
|
+
"committed_archive_sha256": self.committed_archive_sha256,
|
|
211
|
+
"evidence_sha256": typed_json_sha256(self.evidence),
|
|
212
|
+
"publication": "synchronous_no_io_prevalidated",
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
def to_record(self, *, include_evidence: bool = False) -> dict[str, object]:
|
|
216
|
+
self.__post_init__()
|
|
217
|
+
record = {**self._unsigned_record(), "commit_sha256": self.commit_sha256}
|
|
218
|
+
if include_evidence:
|
|
219
|
+
record["evidence"] = thaw_json(self.evidence)
|
|
220
|
+
return record
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@runtime_checkable
|
|
224
|
+
class ResidualArchiveTransitionPort(Protocol):
|
|
225
|
+
"""Prepare and publish a workload-owned archive transition."""
|
|
226
|
+
|
|
227
|
+
archive_id: str
|
|
228
|
+
archive_version: int
|
|
229
|
+
definition_sha256: str
|
|
230
|
+
|
|
231
|
+
async def prepare(
|
|
232
|
+
self,
|
|
233
|
+
result: ResidualPortfolioEvolutionResult,
|
|
234
|
+
) -> ResidualArchiveTransitionPreparation: ...
|
|
235
|
+
|
|
236
|
+
def commit(
|
|
237
|
+
self,
|
|
238
|
+
preparation: ResidualArchiveTransitionPreparation,
|
|
239
|
+
) -> ResidualArchiveTransitionCommit: ...
|
|
240
|
+
|
|
241
|
+
def abort(self, preparation: ResidualArchiveTransitionPreparation) -> None: ...
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def _archive_identity(
|
|
245
|
+
value: ResidualArchiveTransitionPort,
|
|
246
|
+
) -> tuple[str, int, str]:
|
|
247
|
+
if not isinstance(value, ResidualArchiveTransitionPort):
|
|
248
|
+
raise TypeError("archive must implement ResidualArchiveTransitionPort")
|
|
249
|
+
identity = (
|
|
250
|
+
getattr(value, "archive_id", None),
|
|
251
|
+
getattr(value, "archive_version", None),
|
|
252
|
+
getattr(value, "definition_sha256", None),
|
|
253
|
+
)
|
|
254
|
+
_token(identity[0], name="archive_id")
|
|
255
|
+
if type(identity[1]) is not int or identity[1] <= 0:
|
|
256
|
+
raise ValueError("archive_version must be positive")
|
|
257
|
+
require_sha256(identity[2], "archive definition_sha256")
|
|
258
|
+
return identity # type: ignore[return-value]
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
@dataclass(frozen=True, slots=True)
|
|
262
|
+
class ResidualCampaignStageReceipt:
|
|
263
|
+
"""Complete trace join for one committed residual campaign decision."""
|
|
264
|
+
|
|
265
|
+
result: ResidualPortfolioEvolutionResult
|
|
266
|
+
archive_preparation: ResidualArchiveTransitionPreparation
|
|
267
|
+
archive_commit: ResidualArchiveTransitionCommit
|
|
268
|
+
learning_preparation: ResidualLearningPublicationPreparation
|
|
269
|
+
learning_commit: ResidualLearningPublicationCommit
|
|
270
|
+
runtime_definition_sha256: str = RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256
|
|
271
|
+
receipt_sha256: str = field(init=False)
|
|
272
|
+
|
|
273
|
+
def __post_init__(self) -> None:
|
|
274
|
+
if type(self.result) is not ResidualPortfolioEvolutionResult:
|
|
275
|
+
raise TypeError("result must be exact")
|
|
276
|
+
self.result.__post_init__()
|
|
277
|
+
if type(self.archive_preparation) is not ResidualArchiveTransitionPreparation:
|
|
278
|
+
raise TypeError("archive_preparation must be exact")
|
|
279
|
+
self.archive_preparation.__post_init__()
|
|
280
|
+
if type(self.archive_commit) is not ResidualArchiveTransitionCommit:
|
|
281
|
+
raise TypeError("archive_commit must be exact")
|
|
282
|
+
self.archive_commit.__post_init__()
|
|
283
|
+
if (
|
|
284
|
+
type(self.learning_preparation)
|
|
285
|
+
is not ResidualLearningPublicationPreparation
|
|
286
|
+
):
|
|
287
|
+
raise TypeError("learning_preparation must be exact")
|
|
288
|
+
self.learning_preparation.__post_init__()
|
|
289
|
+
if type(self.learning_commit) is not ResidualLearningPublicationCommit:
|
|
290
|
+
raise TypeError("learning_commit must be exact")
|
|
291
|
+
self.learning_commit.__post_init__()
|
|
292
|
+
require_sha256(
|
|
293
|
+
self.runtime_definition_sha256,
|
|
294
|
+
"runtime_definition_sha256",
|
|
295
|
+
)
|
|
296
|
+
if (
|
|
297
|
+
self.archive_preparation.residual_result_sha256
|
|
298
|
+
!= self.result.result_sha256
|
|
299
|
+
or self.learning_preparation.projection.residual_result_sha256
|
|
300
|
+
!= self.result.result_sha256
|
|
301
|
+
):
|
|
302
|
+
raise ValueError("campaign stage products name different results")
|
|
303
|
+
if (
|
|
304
|
+
self.archive_commit.preparation_sha256
|
|
305
|
+
!= self.archive_preparation.preparation_sha256
|
|
306
|
+
or self.archive_commit.committed_archive_sha256
|
|
307
|
+
!= self.archive_preparation.post_snapshot.archive_sha256
|
|
308
|
+
):
|
|
309
|
+
raise ValueError("archive commit differs from its preparation")
|
|
310
|
+
if (
|
|
311
|
+
self.learning_commit.preparation_sha256
|
|
312
|
+
!= self.learning_preparation.preparation_sha256
|
|
313
|
+
or self.learning_commit.committed_state_sha256
|
|
314
|
+
!= self.learning_preparation.next_state.state_sha256
|
|
315
|
+
):
|
|
316
|
+
raise ValueError("learning commit differs from its preparation")
|
|
317
|
+
object.__setattr__(
|
|
318
|
+
self,
|
|
319
|
+
"receipt_sha256",
|
|
320
|
+
_hash(_STAGE_RECEIPT_DOMAIN, self._unsigned_record()),
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
324
|
+
return {
|
|
325
|
+
"schema_version": 1,
|
|
326
|
+
"runtime": {
|
|
327
|
+
"runtime_id": RESIDUAL_CAMPAIGN_RUNTIME_ID,
|
|
328
|
+
"runtime_version": RESIDUAL_CAMPAIGN_RUNTIME_VERSION,
|
|
329
|
+
"definition_sha256": self.runtime_definition_sha256,
|
|
330
|
+
},
|
|
331
|
+
"result_sha256": self.result.result_sha256,
|
|
332
|
+
"archive_preparation_sha256": (
|
|
333
|
+
self.archive_preparation.preparation_sha256
|
|
334
|
+
),
|
|
335
|
+
"archive_commit_sha256": self.archive_commit.commit_sha256,
|
|
336
|
+
"learning_preparation_sha256": (
|
|
337
|
+
self.learning_preparation.preparation_sha256
|
|
338
|
+
),
|
|
339
|
+
"learning_commit_sha256": self.learning_commit.commit_sha256,
|
|
340
|
+
"workload_model_provider_fields_present": False,
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
def to_record(self) -> dict[str, object]:
|
|
344
|
+
self.__post_init__()
|
|
345
|
+
return {
|
|
346
|
+
**self._unsigned_record(),
|
|
347
|
+
"result": self.result.to_record(
|
|
348
|
+
include_allocation_evidence=True,
|
|
349
|
+
),
|
|
350
|
+
"archive_transition": {
|
|
351
|
+
"preparation": self.archive_preparation.to_record(),
|
|
352
|
+
"commit": self.archive_commit.to_record(),
|
|
353
|
+
},
|
|
354
|
+
"learning_transaction": {
|
|
355
|
+
"preparation": self.learning_preparation.to_record(),
|
|
356
|
+
"commit": self.learning_commit.to_record(),
|
|
357
|
+
},
|
|
358
|
+
"receipt_sha256": self.receipt_sha256,
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
async def commit_residual_campaign_stage(
|
|
363
|
+
*,
|
|
364
|
+
archive: ResidualArchiveTransitionPort,
|
|
365
|
+
learning: TransactionalResidualLearningStore,
|
|
366
|
+
result: ResidualPortfolioEvolutionResult,
|
|
367
|
+
) -> ResidualCampaignStageReceipt:
|
|
368
|
+
"""Atomically publish one already-evaluated generic residual result.
|
|
369
|
+
|
|
370
|
+
This transaction boundary is deliberately independent of how the
|
|
371
|
+
proposal/evaluation slate was produced. Single-wave and sequential
|
|
372
|
+
pilot-gated search therefore share exactly the same archive and learning
|
|
373
|
+
publication semantics.
|
|
374
|
+
"""
|
|
375
|
+
|
|
376
|
+
archive_identity = _archive_identity(archive)
|
|
377
|
+
if type(learning) is not TransactionalResidualLearningStore:
|
|
378
|
+
raise TypeError("learning must be an exact transactional store")
|
|
379
|
+
learning.__post_init__()
|
|
380
|
+
if type(result) is not ResidualPortfolioEvolutionResult:
|
|
381
|
+
raise TypeError("result must be exact")
|
|
382
|
+
result.__post_init__()
|
|
383
|
+
|
|
384
|
+
archive_preparation = await archive.prepare(result)
|
|
385
|
+
if type(archive_preparation) is not ResidualArchiveTransitionPreparation:
|
|
386
|
+
raise TypeError("archive returned a foreign preparation")
|
|
387
|
+
archive_preparation.__post_init__()
|
|
388
|
+
if (
|
|
389
|
+
archive_preparation.archive_id,
|
|
390
|
+
archive_preparation.archive_version,
|
|
391
|
+
archive_preparation.archive_definition_sha256,
|
|
392
|
+
) != archive_identity:
|
|
393
|
+
raise ValueError("archive preparation has a foreign definition")
|
|
394
|
+
if archive_preparation.residual_result_sha256 != result.result_sha256:
|
|
395
|
+
raise ValueError("archive prepared a different residual result")
|
|
396
|
+
|
|
397
|
+
learning_preparation: ResidualLearningPublicationPreparation | None = None
|
|
398
|
+
archive_committed = False
|
|
399
|
+
try:
|
|
400
|
+
learning_preparation = learning.prepare(
|
|
401
|
+
pre_snapshot=archive_preparation.pre_snapshot,
|
|
402
|
+
post_snapshot=archive_preparation.post_snapshot,
|
|
403
|
+
result=result,
|
|
404
|
+
)
|
|
405
|
+
archive_commit = archive.commit(archive_preparation)
|
|
406
|
+
if type(archive_commit) is not ResidualArchiveTransitionCommit:
|
|
407
|
+
raise TypeError("archive returned a foreign commit")
|
|
408
|
+
archive_commit.__post_init__()
|
|
409
|
+
archive_committed = True
|
|
410
|
+
learning_commit = learning.commit(learning_preparation)
|
|
411
|
+
except BaseException:
|
|
412
|
+
if learning_preparation is not None and not archive_committed:
|
|
413
|
+
learning.abort(learning_preparation)
|
|
414
|
+
if not archive_committed:
|
|
415
|
+
archive.abort(archive_preparation)
|
|
416
|
+
raise
|
|
417
|
+
return ResidualCampaignStageReceipt(
|
|
418
|
+
result=result,
|
|
419
|
+
archive_preparation=archive_preparation,
|
|
420
|
+
archive_commit=archive_commit,
|
|
421
|
+
learning_preparation=learning_preparation,
|
|
422
|
+
learning_commit=learning_commit,
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
@dataclass(frozen=True, slots=True)
|
|
427
|
+
class ResidualPortfolioCampaignStageRuntime:
|
|
428
|
+
"""Run and transactionally close one generic residual campaign stage."""
|
|
429
|
+
|
|
430
|
+
experts: tuple[MaterializedActionProposalExpertPort, ...]
|
|
431
|
+
archive: ResidualArchiveTransitionPort = field(repr=False, compare=False)
|
|
432
|
+
learning: TransactionalResidualLearningStore = field(
|
|
433
|
+
repr=False,
|
|
434
|
+
compare=False,
|
|
435
|
+
)
|
|
436
|
+
slate_value: MaterializedSlateValuePort = field(repr=False, compare=False)
|
|
437
|
+
slate_feasibility: MaterializedSlateFeasibilityPort = field(
|
|
438
|
+
repr=False,
|
|
439
|
+
compare=False,
|
|
440
|
+
)
|
|
441
|
+
allocation_policy: MaterializedActionAllocationPolicyPort | None = field(
|
|
442
|
+
default=None,
|
|
443
|
+
repr=False,
|
|
444
|
+
compare=False,
|
|
445
|
+
)
|
|
446
|
+
return_value: MaterializedActionReturnValuePort | None = field(
|
|
447
|
+
default=None,
|
|
448
|
+
repr=False,
|
|
449
|
+
compare=False,
|
|
450
|
+
)
|
|
451
|
+
exploration_policy: MaterializedActionExplorationPort | None = field(
|
|
452
|
+
default_factory=PrequentialLowDiscrepancyResidualExploration,
|
|
453
|
+
repr=False,
|
|
454
|
+
compare=False,
|
|
455
|
+
)
|
|
456
|
+
hierarchical_kappa: float = 4.0
|
|
457
|
+
confidence_width: float = 1.0
|
|
458
|
+
exact_combination_limit: int = 250_000
|
|
459
|
+
beam_width: int = 512
|
|
460
|
+
|
|
461
|
+
def __post_init__(self) -> None:
|
|
462
|
+
if type(self.experts) is not tuple or not self.experts:
|
|
463
|
+
raise ValueError("experts must be a non-empty exact tuple")
|
|
464
|
+
_archive_identity(self.archive)
|
|
465
|
+
if type(self.learning) is not TransactionalResidualLearningStore:
|
|
466
|
+
raise TypeError("learning must be an exact transactional store")
|
|
467
|
+
self.learning.__post_init__()
|
|
468
|
+
if self.exploration_policy is not None and not isinstance(
|
|
469
|
+
self.exploration_policy,
|
|
470
|
+
MaterializedActionExplorationPort,
|
|
471
|
+
):
|
|
472
|
+
raise TypeError(
|
|
473
|
+
"exploration_policy must implement "
|
|
474
|
+
"MaterializedActionExplorationPort"
|
|
475
|
+
)
|
|
476
|
+
if self.allocation_policy is not None and not isinstance(
|
|
477
|
+
self.allocation_policy,
|
|
478
|
+
MaterializedActionAllocationPolicyPort,
|
|
479
|
+
):
|
|
480
|
+
raise TypeError(
|
|
481
|
+
"allocation_policy must implement "
|
|
482
|
+
"MaterializedActionAllocationPolicyPort"
|
|
483
|
+
)
|
|
484
|
+
for name in ("hierarchical_kappa", "confidence_width"):
|
|
485
|
+
value = getattr(self, name)
|
|
486
|
+
if type(value) is not float or not math.isfinite(value) or value <= 0.0:
|
|
487
|
+
raise ValueError(f"{name} must be a positive finite exact float")
|
|
488
|
+
for name in ("exact_combination_limit", "beam_width"):
|
|
489
|
+
value = getattr(self, name)
|
|
490
|
+
if type(value) is not int or value <= 0:
|
|
491
|
+
raise ValueError(f"{name} must be a positive exact integer")
|
|
492
|
+
|
|
493
|
+
async def run(
|
|
494
|
+
self,
|
|
495
|
+
request: ResidualPortfolioDecisionRequest,
|
|
496
|
+
) -> ResidualCampaignStageReceipt:
|
|
497
|
+
self.__post_init__()
|
|
498
|
+
runtime = ResidualPortfolioEvolution(
|
|
499
|
+
experts=self.experts,
|
|
500
|
+
broker=RegretBrokeredMaterializedActionPolicy(
|
|
501
|
+
ledger=self.learning.state.broker_evidence,
|
|
502
|
+
return_value=self.return_value,
|
|
503
|
+
exploration_policy=self.exploration_policy,
|
|
504
|
+
hierarchical_kappa=self.hierarchical_kappa,
|
|
505
|
+
confidence_width=self.confidence_width,
|
|
506
|
+
exact_combination_limit=self.exact_combination_limit,
|
|
507
|
+
beam_width=self.beam_width,
|
|
508
|
+
),
|
|
509
|
+
slate_value=self.slate_value,
|
|
510
|
+
slate_feasibility=self.slate_feasibility,
|
|
511
|
+
allocation_policy=self.allocation_policy,
|
|
512
|
+
)
|
|
513
|
+
result = await runtime.run(request)
|
|
514
|
+
return await commit_residual_campaign_stage(
|
|
515
|
+
archive=self.archive,
|
|
516
|
+
learning=self.learning,
|
|
517
|
+
result=result,
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
__all__ = [
|
|
522
|
+
"RESIDUAL_CAMPAIGN_RUNTIME_DEFINITION_SHA256",
|
|
523
|
+
"RESIDUAL_CAMPAIGN_RUNTIME_ID",
|
|
524
|
+
"RESIDUAL_CAMPAIGN_RUNTIME_VERSION",
|
|
525
|
+
"ResidualArchiveTransitionCommit",
|
|
526
|
+
"ResidualArchiveTransitionPort",
|
|
527
|
+
"ResidualArchiveTransitionPreparation",
|
|
528
|
+
"ResidualCampaignStageReceipt",
|
|
529
|
+
"ResidualPortfolioCampaignStageRuntime",
|
|
530
|
+
"commit_residual_campaign_stage",
|
|
531
|
+
]
|