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,499 @@
|
|
|
1
|
+
"""Conserved stage closure for mixed-expert residual evolution.
|
|
2
|
+
|
|
3
|
+
The proposal market deliberately ends immediately after the broker-selected
|
|
4
|
+
slate has been evaluated. This module owns the next, workload-neutral
|
|
5
|
+
boundary: authenticate the actual pre/post archive utility receipts, allocate
|
|
6
|
+
their realized joint gain exactly over the evaluated slate, and compile the
|
|
7
|
+
append-only evidence consumed by the broker and earned-lineage ledgers.
|
|
8
|
+
|
|
9
|
+
No proposal expert is allowed to grade itself. Archive utility and admission
|
|
10
|
+
remain inverted ports, while the core sees only objective mappings, immutable
|
|
11
|
+
identities, and real evaluator receipts.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import hashlib
|
|
17
|
+
import json
|
|
18
|
+
import math
|
|
19
|
+
from dataclasses import dataclass, field
|
|
20
|
+
from typing import Protocol, runtime_checkable
|
|
21
|
+
|
|
22
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
23
|
+
from agent_evolve.application.earned_lineage import (
|
|
24
|
+
CandidateConservedCredit,
|
|
25
|
+
CandidateProposalProvenance,
|
|
26
|
+
ConservedStageCreditReceipt,
|
|
27
|
+
ProposalLineageRole,
|
|
28
|
+
)
|
|
29
|
+
from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
|
|
30
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
31
|
+
MaterializedActionOutcome,
|
|
32
|
+
)
|
|
33
|
+
from agent_evolve.application.residual_portfolio_evolution import (
|
|
34
|
+
ResidualPortfolioEvolutionResult,
|
|
35
|
+
)
|
|
36
|
+
from agent_evolve.domain.patch import require_sha256
|
|
37
|
+
from agent_evolve.policies.reward.contextual_marginal_utility import (
|
|
38
|
+
CONTEXTUAL_SHAPLEY_UTILITY_PROJECTOR_DEFINITION_SHA256,
|
|
39
|
+
JointUtilitySnapshot,
|
|
40
|
+
ReplayableArchiveUtility,
|
|
41
|
+
exact_coalition_shapley_values,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
RESIDUAL_STAGE_CREDIT_PROJECTOR_ID = "mixed_expert_exact_coalition_stage_credit"
|
|
46
|
+
RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION = 1
|
|
47
|
+
RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256 = hashlib.sha256(
|
|
48
|
+
b"agent-evolve:mixed-expert-exact-coalition-stage-credit:v1;"
|
|
49
|
+
b"cutoff=authenticated-pre-and-post-archive-utility-snapshots;"
|
|
50
|
+
b"players=broker-selected-real-evaluations-only;"
|
|
51
|
+
b"admission=injected-workload-neutral-policy;"
|
|
52
|
+
b"credit=exact-coalition-shapley-joint-archive-gain;"
|
|
53
|
+
b"conservation=post-minus-pre-utility;"
|
|
54
|
+
b"broker-feedback=immediate-realized-feasibility-and-conserved-gain;"
|
|
55
|
+
b"provenance=sealed-proposal-expert-operator-parents-and-cutoff;"
|
|
56
|
+
b"positive-credit=counterfactual-coalition-admission-not-final-front-retention;"
|
|
57
|
+
b"workload-model-provider-branches=false"
|
|
58
|
+
).hexdigest()
|
|
59
|
+
|
|
60
|
+
STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID = "strict_evaluated_candidate_admission"
|
|
61
|
+
STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION = 1
|
|
62
|
+
STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256 = hashlib.sha256(
|
|
63
|
+
b"agent-evolve:strict-evaluated-candidate-admission:v1;"
|
|
64
|
+
b"admissible=valid-and-operator-compliant-and-evidence-compliant;"
|
|
65
|
+
b"objective-contract=archive-utility-replay;"
|
|
66
|
+
b"workload-model-provider-branches=false"
|
|
67
|
+
).hexdigest()
|
|
68
|
+
|
|
69
|
+
_PROJECTION_DOMAIN = b"agent-evolve:conserved-residual-stage-projection:v1\x00"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _canonical_json(value: object) -> bytes:
|
|
73
|
+
return json.dumps(
|
|
74
|
+
value,
|
|
75
|
+
allow_nan=False,
|
|
76
|
+
ensure_ascii=True,
|
|
77
|
+
separators=(",", ":"),
|
|
78
|
+
sort_keys=True,
|
|
79
|
+
).encode("ascii", errors="strict")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
83
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@runtime_checkable
|
|
87
|
+
class ResidualCandidateAdmissionPort(Protocol):
|
|
88
|
+
"""Decide whether one real outcome enters the archive coalition game."""
|
|
89
|
+
|
|
90
|
+
admission_id: str
|
|
91
|
+
admission_version: int
|
|
92
|
+
definition_sha256: str
|
|
93
|
+
|
|
94
|
+
def admissible(self, candidate: EvolutionCandidate) -> bool: ...
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@dataclass(frozen=True, slots=True)
|
|
98
|
+
class StrictResidualCandidateAdmission:
|
|
99
|
+
"""Default archive gate matching the strict Pareto admission policy."""
|
|
100
|
+
|
|
101
|
+
admission_id: str = field(
|
|
102
|
+
init=False,
|
|
103
|
+
default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID,
|
|
104
|
+
)
|
|
105
|
+
admission_version: int = field(
|
|
106
|
+
init=False,
|
|
107
|
+
default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION,
|
|
108
|
+
)
|
|
109
|
+
definition_sha256: str = field(
|
|
110
|
+
init=False,
|
|
111
|
+
default=STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def admissible(self, candidate: EvolutionCandidate) -> bool:
|
|
115
|
+
if type(candidate) is not EvolutionCandidate:
|
|
116
|
+
raise TypeError("candidate must be an exact EvolutionCandidate")
|
|
117
|
+
EvolutionCandidate.__post_init__(candidate)
|
|
118
|
+
return bool(
|
|
119
|
+
candidate.valid
|
|
120
|
+
and candidate.operator_compliant
|
|
121
|
+
and candidate.evidence_compliant
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _validate_admission_port(value: ResidualCandidateAdmissionPort) -> None:
|
|
126
|
+
if not isinstance(value, ResidualCandidateAdmissionPort):
|
|
127
|
+
raise TypeError("admission must implement ResidualCandidateAdmissionPort")
|
|
128
|
+
if type(value.admission_id) is not str or not value.admission_id:
|
|
129
|
+
raise ValueError("admission_id must be a non-empty exact string")
|
|
130
|
+
if type(value.admission_version) is not int or value.admission_version <= 0:
|
|
131
|
+
raise ValueError("admission_version must be positive")
|
|
132
|
+
require_sha256(value.definition_sha256, "admission definition_sha256")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@dataclass(frozen=True, slots=True)
|
|
136
|
+
class ConservedResidualStageProjection:
|
|
137
|
+
"""Pure, authenticated evidence prepared before ledger publication."""
|
|
138
|
+
|
|
139
|
+
residual_result_sha256: str
|
|
140
|
+
pre_archive_utility_snapshot_sha256: str
|
|
141
|
+
post_archive_utility_snapshot_sha256: str
|
|
142
|
+
admission_id: str
|
|
143
|
+
admission_version: int
|
|
144
|
+
admission_definition_sha256: str
|
|
145
|
+
stage_credit: ConservedStageCreditReceipt
|
|
146
|
+
action_outcomes: tuple[MaterializedActionOutcome, ...]
|
|
147
|
+
candidate_provenance: tuple[CandidateProposalProvenance, ...]
|
|
148
|
+
projector_definition_sha256: str = (
|
|
149
|
+
RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256
|
|
150
|
+
)
|
|
151
|
+
projection_sha256: str = field(init=False)
|
|
152
|
+
|
|
153
|
+
def __post_init__(self) -> None:
|
|
154
|
+
for name in (
|
|
155
|
+
"residual_result_sha256",
|
|
156
|
+
"pre_archive_utility_snapshot_sha256",
|
|
157
|
+
"post_archive_utility_snapshot_sha256",
|
|
158
|
+
"admission_definition_sha256",
|
|
159
|
+
"projector_definition_sha256",
|
|
160
|
+
):
|
|
161
|
+
require_sha256(getattr(self, name), name)
|
|
162
|
+
if type(self.admission_id) is not str or not self.admission_id:
|
|
163
|
+
raise ValueError("admission_id must be a non-empty exact string")
|
|
164
|
+
if type(self.admission_version) is not int or self.admission_version <= 0:
|
|
165
|
+
raise ValueError("admission_version must be positive")
|
|
166
|
+
if type(self.stage_credit) is not ConservedStageCreditReceipt:
|
|
167
|
+
raise TypeError("stage_credit must be exact")
|
|
168
|
+
ConservedStageCreditReceipt.__post_init__(self.stage_credit)
|
|
169
|
+
if type(self.action_outcomes) is not tuple or not self.action_outcomes:
|
|
170
|
+
raise ValueError("action_outcomes must be a non-empty exact tuple")
|
|
171
|
+
for value in self.action_outcomes:
|
|
172
|
+
if type(value) is not MaterializedActionOutcome:
|
|
173
|
+
raise TypeError("action_outcomes must contain exact values")
|
|
174
|
+
value.__post_init__()
|
|
175
|
+
if not value.realized:
|
|
176
|
+
raise ValueError("stage closure cannot contain unrealized outcomes")
|
|
177
|
+
if type(self.candidate_provenance) is not tuple:
|
|
178
|
+
raise TypeError("candidate_provenance must be an exact tuple")
|
|
179
|
+
for value in self.candidate_provenance:
|
|
180
|
+
if type(value) is not CandidateProposalProvenance:
|
|
181
|
+
raise TypeError("candidate_provenance must contain exact values")
|
|
182
|
+
CandidateProposalProvenance.__post_init__(value)
|
|
183
|
+
|
|
184
|
+
outcome_ids = tuple(
|
|
185
|
+
value.action.target_candidate_id.value for value in self.action_outcomes
|
|
186
|
+
)
|
|
187
|
+
if len(set(outcome_ids)) != len(outcome_ids):
|
|
188
|
+
raise ValueError("stage closure repeats a candidate outcome")
|
|
189
|
+
credit_ids = tuple(
|
|
190
|
+
value.candidate_id.value for value in self.stage_credit.candidate_credits
|
|
191
|
+
)
|
|
192
|
+
provenance_ids = tuple(
|
|
193
|
+
value.candidate_id.value for value in self.candidate_provenance
|
|
194
|
+
)
|
|
195
|
+
if tuple(sorted(outcome_ids)) != credit_ids:
|
|
196
|
+
raise ValueError("stage credit does not exactly cover action outcomes")
|
|
197
|
+
if provenance_ids != credit_ids:
|
|
198
|
+
raise ValueError("candidate provenance does not exactly cover stage credit")
|
|
199
|
+
credit_by_id = {
|
|
200
|
+
value.candidate_id: value for value in self.stage_credit.candidate_credits
|
|
201
|
+
}
|
|
202
|
+
for outcome in self.action_outcomes:
|
|
203
|
+
credit = credit_by_id[outcome.action.target_candidate_id]
|
|
204
|
+
if (
|
|
205
|
+
outcome.feasible != credit.admitted_to_archive
|
|
206
|
+
or outcome.normalized_archive_gain != credit.contribution
|
|
207
|
+
):
|
|
208
|
+
raise ValueError("broker outcome differs from conserved candidate credit")
|
|
209
|
+
object.__setattr__(
|
|
210
|
+
self,
|
|
211
|
+
"projection_sha256",
|
|
212
|
+
_hash(_PROJECTION_DOMAIN, self._unsigned_record()),
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
216
|
+
return {
|
|
217
|
+
"schema_version": 1,
|
|
218
|
+
"projector": {
|
|
219
|
+
"projector_id": RESIDUAL_STAGE_CREDIT_PROJECTOR_ID,
|
|
220
|
+
"projector_version": RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION,
|
|
221
|
+
"definition_sha256": self.projector_definition_sha256,
|
|
222
|
+
},
|
|
223
|
+
"residual_result_sha256": self.residual_result_sha256,
|
|
224
|
+
"pre_archive_utility_snapshot_sha256": (
|
|
225
|
+
self.pre_archive_utility_snapshot_sha256
|
|
226
|
+
),
|
|
227
|
+
"post_archive_utility_snapshot_sha256": (
|
|
228
|
+
self.post_archive_utility_snapshot_sha256
|
|
229
|
+
),
|
|
230
|
+
"admission": {
|
|
231
|
+
"admission_id": self.admission_id,
|
|
232
|
+
"admission_version": self.admission_version,
|
|
233
|
+
"definition_sha256": self.admission_definition_sha256,
|
|
234
|
+
},
|
|
235
|
+
"stage_credit_receipt_sha256": self.stage_credit.receipt_sha256,
|
|
236
|
+
"action_outcome_sha256s": [
|
|
237
|
+
value.outcome_sha256 for value in self.action_outcomes
|
|
238
|
+
],
|
|
239
|
+
"candidate_provenance_sha256s": [
|
|
240
|
+
value.provenance_sha256 for value in self.candidate_provenance
|
|
241
|
+
],
|
|
242
|
+
"credit_semantics": (
|
|
243
|
+
"counterfactual_archive_coalition_contribution;"
|
|
244
|
+
"final_front_retention_is_delayed_credit"
|
|
245
|
+
),
|
|
246
|
+
"coalition_value_definition_sha256": (
|
|
247
|
+
CONTEXTUAL_SHAPLEY_UTILITY_PROJECTOR_DEFINITION_SHA256
|
|
248
|
+
),
|
|
249
|
+
"workload_model_provider_fields_present": False,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
def to_record(self) -> dict[str, object]:
|
|
253
|
+
self.__post_init__()
|
|
254
|
+
return {
|
|
255
|
+
**self._unsigned_record(),
|
|
256
|
+
"stage_credit": self.stage_credit.to_record(),
|
|
257
|
+
"action_outcomes": [
|
|
258
|
+
value.to_record() for value in self.action_outcomes
|
|
259
|
+
],
|
|
260
|
+
"candidate_provenance": [
|
|
261
|
+
value.to_record() for value in self.candidate_provenance
|
|
262
|
+
],
|
|
263
|
+
"projection_sha256": self.projection_sha256,
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@dataclass(frozen=True, slots=True)
|
|
268
|
+
class ResidualStageCreditProjector:
|
|
269
|
+
"""Project one evaluated residual slate into conserved learning evidence."""
|
|
270
|
+
|
|
271
|
+
archive_utility: ReplayableArchiveUtility = field(repr=False, compare=False)
|
|
272
|
+
admission: ResidualCandidateAdmissionPort = field(
|
|
273
|
+
default_factory=StrictResidualCandidateAdmission,
|
|
274
|
+
repr=False,
|
|
275
|
+
compare=False,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
def __post_init__(self) -> None:
|
|
279
|
+
if not isinstance(self.archive_utility, ReplayableArchiveUtility):
|
|
280
|
+
raise TypeError("archive_utility must replay utility snapshots")
|
|
281
|
+
_validate_admission_port(self.admission)
|
|
282
|
+
|
|
283
|
+
def project(
|
|
284
|
+
self,
|
|
285
|
+
*,
|
|
286
|
+
pre_snapshot: ArchiveUtilitySnapshot,
|
|
287
|
+
post_snapshot: ArchiveUtilitySnapshot,
|
|
288
|
+
result: ResidualPortfolioEvolutionResult,
|
|
289
|
+
) -> ConservedResidualStageProjection:
|
|
290
|
+
self.__post_init__()
|
|
291
|
+
if type(pre_snapshot) is not ArchiveUtilitySnapshot:
|
|
292
|
+
raise TypeError("pre_snapshot must be exact")
|
|
293
|
+
if type(post_snapshot) is not ArchiveUtilitySnapshot:
|
|
294
|
+
raise TypeError("post_snapshot must be exact")
|
|
295
|
+
pre_snapshot.__post_init__()
|
|
296
|
+
post_snapshot.__post_init__()
|
|
297
|
+
if type(result) is not ResidualPortfolioEvolutionResult:
|
|
298
|
+
raise TypeError("result must be exact")
|
|
299
|
+
result.__post_init__()
|
|
300
|
+
if (
|
|
301
|
+
pre_snapshot.utility_id,
|
|
302
|
+
pre_snapshot.utility_version,
|
|
303
|
+
pre_snapshot.definition_sha256,
|
|
304
|
+
pre_snapshot.generation,
|
|
305
|
+
pre_snapshot.benchmark_sha256,
|
|
306
|
+
) != (
|
|
307
|
+
post_snapshot.utility_id,
|
|
308
|
+
post_snapshot.utility_version,
|
|
309
|
+
post_snapshot.definition_sha256,
|
|
310
|
+
post_snapshot.generation,
|
|
311
|
+
post_snapshot.benchmark_sha256,
|
|
312
|
+
):
|
|
313
|
+
raise ValueError("pre/post archive utility snapshots are not comparable")
|
|
314
|
+
if pre_snapshot.generation != result.request.decision_index:
|
|
315
|
+
raise ValueError("archive utility generation differs from residual decision")
|
|
316
|
+
if pre_snapshot.archive_sha256 == post_snapshot.archive_sha256:
|
|
317
|
+
# A zero-gain stage still records new candidate decisions, so the
|
|
318
|
+
# authenticated archive state (including its ledger) must advance.
|
|
319
|
+
raise ValueError("post archive cutoff did not advance")
|
|
320
|
+
if (
|
|
321
|
+
pre_snapshot.scalar_utility_hex is None
|
|
322
|
+
or post_snapshot.scalar_utility_hex is None
|
|
323
|
+
):
|
|
324
|
+
raise ValueError("conserved stage credit requires scalar utility receipts")
|
|
325
|
+
pre_utility = float.fromhex(pre_snapshot.scalar_utility_hex)
|
|
326
|
+
post_utility = float.fromhex(post_snapshot.scalar_utility_hex)
|
|
327
|
+
replayed = self.archive_utility.require_snapshot(pre_snapshot)
|
|
328
|
+
if not isinstance(replayed, JointUtilitySnapshot):
|
|
329
|
+
raise TypeError("archive utility returned no joint-gain snapshot")
|
|
330
|
+
|
|
331
|
+
proposal_by_expert = {
|
|
332
|
+
value.expert_id: value for value in result.proposals
|
|
333
|
+
}
|
|
334
|
+
selected = result.broker_decision.selected_actions
|
|
335
|
+
evaluations = result.evaluations
|
|
336
|
+
if len(selected) != len(evaluations): # Defensive; result closes this.
|
|
337
|
+
raise RuntimeError("broker slate differs from real evaluation count")
|
|
338
|
+
|
|
339
|
+
rows: list[
|
|
340
|
+
tuple[
|
|
341
|
+
str,
|
|
342
|
+
int,
|
|
343
|
+
EvolutionCandidate,
|
|
344
|
+
bool,
|
|
345
|
+
]
|
|
346
|
+
] = []
|
|
347
|
+
for index, evaluation in enumerate(evaluations):
|
|
348
|
+
candidate = evaluation.candidate
|
|
349
|
+
admissible = self.admission.admissible(candidate)
|
|
350
|
+
if type(admissible) is not bool:
|
|
351
|
+
raise TypeError("admission port must return an exact bool")
|
|
352
|
+
rows.append(
|
|
353
|
+
(
|
|
354
|
+
candidate.candidate_id.value,
|
|
355
|
+
index,
|
|
356
|
+
candidate,
|
|
357
|
+
admissible,
|
|
358
|
+
)
|
|
359
|
+
)
|
|
360
|
+
rows.sort(key=lambda value: value[0])
|
|
361
|
+
if len({value[0] for value in rows}) != len(rows):
|
|
362
|
+
raise ValueError("stage credit cannot repeat a candidate")
|
|
363
|
+
players = tuple(value for value in rows if value[3])
|
|
364
|
+
credits = exact_coalition_shapley_values(
|
|
365
|
+
replayed,
|
|
366
|
+
tuple(value[2].objective_map for value in players),
|
|
367
|
+
)
|
|
368
|
+
credit_by_candidate_id = {
|
|
369
|
+
value[2].candidate_id: credit
|
|
370
|
+
for value, credit in zip(players, credits, strict=True)
|
|
371
|
+
}
|
|
372
|
+
joint_gain = replayed.joint_gain(
|
|
373
|
+
tuple(value[2].objective_map for value in players)
|
|
374
|
+
)
|
|
375
|
+
if type(joint_gain) is not float or not math.isfinite(joint_gain):
|
|
376
|
+
raise TypeError("joint archive gain must be a finite exact float")
|
|
377
|
+
tolerance = 16.0 * math.ulp(max(1.0, pre_utility, post_utility))
|
|
378
|
+
if abs((post_utility - pre_utility) - joint_gain) > tolerance:
|
|
379
|
+
raise ValueError(
|
|
380
|
+
"observed post archive utility differs from the evaluated coalition"
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
candidate_credits = tuple(
|
|
384
|
+
CandidateConservedCredit(
|
|
385
|
+
candidate_id=candidate.candidate_id,
|
|
386
|
+
contribution=float(
|
|
387
|
+
credit_by_candidate_id.get(candidate.candidate_id, 0.0)
|
|
388
|
+
),
|
|
389
|
+
# This means admission to at least the counterfactual
|
|
390
|
+
# coalition game, not survival on the final stage front.
|
|
391
|
+
admitted_to_archive=admissible,
|
|
392
|
+
outcome_receipt_sha256=(
|
|
393
|
+
result.evaluations[index].evaluation_sha256
|
|
394
|
+
),
|
|
395
|
+
)
|
|
396
|
+
for _candidate_id, index, candidate, admissible in rows
|
|
397
|
+
)
|
|
398
|
+
stage_credit = ConservedStageCreditReceipt(
|
|
399
|
+
generation=result.request.decision_index,
|
|
400
|
+
utility_id=pre_snapshot.utility_id,
|
|
401
|
+
utility_version=pre_snapshot.utility_version,
|
|
402
|
+
utility_definition_sha256=pre_snapshot.definition_sha256,
|
|
403
|
+
pre_archive_sha256=pre_snapshot.archive_sha256,
|
|
404
|
+
post_archive_sha256=post_snapshot.archive_sha256,
|
|
405
|
+
pre_utility=pre_utility,
|
|
406
|
+
post_utility=post_utility,
|
|
407
|
+
contribution_policy_id=RESIDUAL_STAGE_CREDIT_PROJECTOR_ID,
|
|
408
|
+
contribution_policy_version=RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION,
|
|
409
|
+
contribution_policy_definition_sha256=(
|
|
410
|
+
RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256
|
|
411
|
+
),
|
|
412
|
+
candidate_credits=candidate_credits,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
admissible_by_candidate_id = {
|
|
416
|
+
candidate.candidate_id: admissible
|
|
417
|
+
for _candidate_id, _index, candidate, admissible in rows
|
|
418
|
+
}
|
|
419
|
+
action_outcomes = tuple(
|
|
420
|
+
MaterializedActionOutcome(
|
|
421
|
+
action=action,
|
|
422
|
+
realized=True,
|
|
423
|
+
feasible=admissible_by_candidate_id[
|
|
424
|
+
evaluation.candidate.candidate_id
|
|
425
|
+
],
|
|
426
|
+
normalized_archive_gain=float(
|
|
427
|
+
credit_by_candidate_id.get(
|
|
428
|
+
evaluation.candidate.candidate_id,
|
|
429
|
+
0.0,
|
|
430
|
+
)
|
|
431
|
+
),
|
|
432
|
+
positive_marginal_utility=(
|
|
433
|
+
credit_by_candidate_id.get(
|
|
434
|
+
evaluation.candidate.candidate_id,
|
|
435
|
+
0.0,
|
|
436
|
+
)
|
|
437
|
+
> 0.0
|
|
438
|
+
),
|
|
439
|
+
)
|
|
440
|
+
for action, evaluation in zip(selected, evaluations, strict=True)
|
|
441
|
+
)
|
|
442
|
+
candidate_provenance = tuple(
|
|
443
|
+
CandidateProposalProvenance(
|
|
444
|
+
candidate_id=evaluation.candidate.candidate_id,
|
|
445
|
+
configuration_sha256=(
|
|
446
|
+
evaluation.candidate.occurrence.configuration_hash
|
|
447
|
+
),
|
|
448
|
+
generation=evaluation.candidate.generation,
|
|
449
|
+
source_role=(
|
|
450
|
+
ProposalLineageRole.BACKBONE
|
|
451
|
+
if action.reference_action
|
|
452
|
+
else ProposalLineageRole.CHALLENGER
|
|
453
|
+
),
|
|
454
|
+
proposal_expert_id=action.expert_id,
|
|
455
|
+
proposal_expert_version=(
|
|
456
|
+
proposal_by_expert[action.expert_id].expert_version
|
|
457
|
+
),
|
|
458
|
+
proposal_expert_definition_sha256=(
|
|
459
|
+
proposal_by_expert[
|
|
460
|
+
action.expert_id
|
|
461
|
+
].expert_definition_sha256
|
|
462
|
+
),
|
|
463
|
+
operator_id=action.operator_id,
|
|
464
|
+
parent_candidate_ids=action.parent_ids,
|
|
465
|
+
decision_cutoff_sha256=result.request.prior_state_sha256,
|
|
466
|
+
source_receipt_sha256=(
|
|
467
|
+
proposal_by_expert[action.expert_id].proposal_sha256
|
|
468
|
+
),
|
|
469
|
+
)
|
|
470
|
+
for action, evaluation in sorted(
|
|
471
|
+
zip(selected, evaluations, strict=True),
|
|
472
|
+
key=lambda value: value[1].candidate.candidate_id.value,
|
|
473
|
+
)
|
|
474
|
+
)
|
|
475
|
+
return ConservedResidualStageProjection(
|
|
476
|
+
residual_result_sha256=result.result_sha256,
|
|
477
|
+
pre_archive_utility_snapshot_sha256=pre_snapshot.snapshot_sha256,
|
|
478
|
+
post_archive_utility_snapshot_sha256=post_snapshot.snapshot_sha256,
|
|
479
|
+
admission_id=self.admission.admission_id,
|
|
480
|
+
admission_version=self.admission.admission_version,
|
|
481
|
+
admission_definition_sha256=self.admission.definition_sha256,
|
|
482
|
+
stage_credit=stage_credit,
|
|
483
|
+
action_outcomes=action_outcomes,
|
|
484
|
+
candidate_provenance=candidate_provenance,
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
__all__ = [
|
|
489
|
+
"RESIDUAL_STAGE_CREDIT_PROJECTOR_DEFINITION_SHA256",
|
|
490
|
+
"RESIDUAL_STAGE_CREDIT_PROJECTOR_ID",
|
|
491
|
+
"RESIDUAL_STAGE_CREDIT_PROJECTOR_VERSION",
|
|
492
|
+
"STRICT_RESIDUAL_CANDIDATE_ADMISSION_DEFINITION_SHA256",
|
|
493
|
+
"STRICT_RESIDUAL_CANDIDATE_ADMISSION_ID",
|
|
494
|
+
"STRICT_RESIDUAL_CANDIDATE_ADMISSION_VERSION",
|
|
495
|
+
"ConservedResidualStageProjection",
|
|
496
|
+
"ResidualCandidateAdmissionPort",
|
|
497
|
+
"ResidualStageCreditProjector",
|
|
498
|
+
"StrictResidualCandidateAdmission",
|
|
499
|
+
]
|