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,363 @@
|
|
|
1
|
+
"""Workload-neutral score authorities for sealed materialized actions.
|
|
2
|
+
|
|
3
|
+
These scorers preserve two hypotheses that should not be collapsed into a
|
|
4
|
+
transferred learned model:
|
|
5
|
+
|
|
6
|
+
* the proposal engine's native within-expert semantic ordering; and
|
|
7
|
+
* strictly prior target-campaign empirical archive return.
|
|
8
|
+
|
|
9
|
+
Both implement the same opaque prequential score port used by learned,
|
|
10
|
+
numerical, proxy, and future optimizer-engine authorities.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
import hashlib
|
|
17
|
+
import json
|
|
18
|
+
import math
|
|
19
|
+
import re
|
|
20
|
+
|
|
21
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
22
|
+
EMPIRICAL_RETURN_ESTIMATOR_DEFINITION_SHA256,
|
|
23
|
+
MATERIALIZED_ACTION_BROKER_DEFINITION_SHA256,
|
|
24
|
+
MaterializedActionDescriptor,
|
|
25
|
+
MaterializedActionEvidenceLedger,
|
|
26
|
+
RegretBrokeredMaterializedActionPolicy,
|
|
27
|
+
)
|
|
28
|
+
from agent_evolve.application.prequential_score_portfolio import (
|
|
29
|
+
MaterializedActionScore,
|
|
30
|
+
MaterializedActionScoreBatch,
|
|
31
|
+
)
|
|
32
|
+
from agent_evolve.application.residual_portfolio_evolution import (
|
|
33
|
+
MaterializedActionProposalBatch,
|
|
34
|
+
ResidualPortfolioDecisionRequest,
|
|
35
|
+
)
|
|
36
|
+
from agent_evolve.domain.patch import require_sha256
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
NATIVE_RANK_ACTION_SCORER_VERSION = 1
|
|
40
|
+
TARGET_EMPIRICAL_RETURN_ACTION_SCORER_VERSION = 1
|
|
41
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
42
|
+
_NATIVE_DEFINITION_DOMAIN = (
|
|
43
|
+
b"agent-evolve:native-rank-action-score-authority:v1\x00"
|
|
44
|
+
)
|
|
45
|
+
_NATIVE_EVIDENCE_DOMAIN = (
|
|
46
|
+
b"agent-evolve:native-rank-action-score-evidence:v1\x00"
|
|
47
|
+
)
|
|
48
|
+
_EMPIRICAL_DEFINITION_DOMAIN = (
|
|
49
|
+
b"agent-evolve:target-empirical-return-score-authority:v1\x00"
|
|
50
|
+
)
|
|
51
|
+
_EMPIRICAL_EVIDENCE_DOMAIN = (
|
|
52
|
+
b"agent-evolve:target-empirical-return-score-evidence:v1\x00"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _canonical_json(value: object) -> bytes:
|
|
57
|
+
return json.dumps(
|
|
58
|
+
value,
|
|
59
|
+
allow_nan=False,
|
|
60
|
+
ensure_ascii=True,
|
|
61
|
+
separators=(",", ":"),
|
|
62
|
+
sort_keys=True,
|
|
63
|
+
).encode("ascii", errors="strict")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
67
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _token(value: str, *, name: str) -> None:
|
|
71
|
+
if type(value) is not str or _TOKEN.fullmatch(value) is None:
|
|
72
|
+
raise ValueError(f"{name} must use the closed token grammar")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _sealed_universe(
|
|
76
|
+
request: ResidualPortfolioDecisionRequest,
|
|
77
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
78
|
+
) -> tuple[
|
|
79
|
+
tuple[str, ...],
|
|
80
|
+
tuple[MaterializedActionDescriptor, ...],
|
|
81
|
+
]:
|
|
82
|
+
if type(request) is not ResidualPortfolioDecisionRequest:
|
|
83
|
+
raise TypeError("request must be exact")
|
|
84
|
+
request.__post_init__()
|
|
85
|
+
if type(proposals) is not tuple or not proposals:
|
|
86
|
+
raise ValueError("proposals must be a non-empty exact tuple")
|
|
87
|
+
for proposal in proposals:
|
|
88
|
+
if type(proposal) is not MaterializedActionProposalBatch:
|
|
89
|
+
raise TypeError("proposals must contain exact batches")
|
|
90
|
+
proposal.__post_init__()
|
|
91
|
+
proposal.require_request(request)
|
|
92
|
+
proposal_sha256s = tuple(
|
|
93
|
+
sorted(value.proposal_sha256 for value in proposals)
|
|
94
|
+
)
|
|
95
|
+
actions = tuple(
|
|
96
|
+
action for proposal in proposals for action in proposal.actions
|
|
97
|
+
)
|
|
98
|
+
if len(actions) != len({value.action_sha256 for value in actions}):
|
|
99
|
+
raise ValueError("proposal union repeats an action identity")
|
|
100
|
+
if any(
|
|
101
|
+
value.context.decision_index != request.decision_index
|
|
102
|
+
for value in actions
|
|
103
|
+
):
|
|
104
|
+
raise ValueError("action context crosses the decision cutoff")
|
|
105
|
+
return proposal_sha256s, actions
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@dataclass(frozen=True, slots=True)
|
|
109
|
+
class NativeRankMaterializedActionScorer:
|
|
110
|
+
"""Retain the engine's native rank as an independent cold-start lane."""
|
|
111
|
+
|
|
112
|
+
scorer_id: str = "provider_native_rank"
|
|
113
|
+
scorer_version: int = NATIVE_RANK_ACTION_SCORER_VERSION
|
|
114
|
+
definition_sha256: str = field(init=False)
|
|
115
|
+
|
|
116
|
+
def __post_init__(self) -> None:
|
|
117
|
+
_token(self.scorer_id, name="scorer_id")
|
|
118
|
+
if (
|
|
119
|
+
type(self.scorer_version) is not int
|
|
120
|
+
or self.scorer_version <= 0
|
|
121
|
+
):
|
|
122
|
+
raise ValueError("scorer_version must be positive")
|
|
123
|
+
object.__setattr__(
|
|
124
|
+
self,
|
|
125
|
+
"definition_sha256",
|
|
126
|
+
_hash(
|
|
127
|
+
_NATIVE_DEFINITION_DOMAIN,
|
|
128
|
+
{
|
|
129
|
+
"schema_version": 1,
|
|
130
|
+
"scorer_id": self.scorer_id,
|
|
131
|
+
"scorer_version": self.scorer_version,
|
|
132
|
+
"score": "reciprocal_positive_exact_native_rank",
|
|
133
|
+
"cross_expert_calibration_claimed": False,
|
|
134
|
+
"candidate_outcomes_observed": False,
|
|
135
|
+
"workload_model_provider_branches": False,
|
|
136
|
+
},
|
|
137
|
+
),
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
async def score(
|
|
141
|
+
self,
|
|
142
|
+
request: ResidualPortfolioDecisionRequest,
|
|
143
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
144
|
+
) -> MaterializedActionScoreBatch:
|
|
145
|
+
self.__post_init__()
|
|
146
|
+
proposal_sha256s, raw_actions = _sealed_universe(
|
|
147
|
+
request,
|
|
148
|
+
proposals,
|
|
149
|
+
)
|
|
150
|
+
actions = tuple(raw_actions)
|
|
151
|
+
scores = tuple(
|
|
152
|
+
sorted(
|
|
153
|
+
(
|
|
154
|
+
MaterializedActionScore(
|
|
155
|
+
action_sha256=action.action_sha256,
|
|
156
|
+
value=float(1.0 / action.native_rank),
|
|
157
|
+
)
|
|
158
|
+
for action in actions
|
|
159
|
+
),
|
|
160
|
+
key=lambda value: value.action_sha256,
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
evidence_sha256 = _hash(
|
|
164
|
+
_NATIVE_EVIDENCE_DOMAIN,
|
|
165
|
+
{
|
|
166
|
+
"scorer_definition_sha256": self.definition_sha256,
|
|
167
|
+
"residual_request_sha256": request.request_sha256,
|
|
168
|
+
"proposal_sha256s": list(proposal_sha256s),
|
|
169
|
+
"native_ranks": [
|
|
170
|
+
{
|
|
171
|
+
"action_sha256": action.action_sha256,
|
|
172
|
+
"expert_id": action.expert_id,
|
|
173
|
+
"native_rank": action.native_rank,
|
|
174
|
+
}
|
|
175
|
+
for action in sorted(
|
|
176
|
+
actions,
|
|
177
|
+
key=lambda value: value.action_sha256,
|
|
178
|
+
)
|
|
179
|
+
],
|
|
180
|
+
"candidate_outcomes_observed": False,
|
|
181
|
+
},
|
|
182
|
+
)
|
|
183
|
+
return MaterializedActionScoreBatch(
|
|
184
|
+
scorer_id=self.scorer_id,
|
|
185
|
+
scorer_version=self.scorer_version,
|
|
186
|
+
scorer_definition_sha256=self.definition_sha256,
|
|
187
|
+
residual_request_sha256=request.request_sha256,
|
|
188
|
+
proposal_sha256s=proposal_sha256s,
|
|
189
|
+
scores=scores,
|
|
190
|
+
candidate_outcomes_observed=False,
|
|
191
|
+
evidence_sha256=evidence_sha256,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@dataclass(frozen=True, slots=True)
|
|
196
|
+
class TargetEmpiricalReturnMaterializedActionScorer:
|
|
197
|
+
"""Rank by target-campaign empirical return with native-rank cold start."""
|
|
198
|
+
|
|
199
|
+
broker: RegretBrokeredMaterializedActionPolicy = field(
|
|
200
|
+
repr=False,
|
|
201
|
+
compare=False,
|
|
202
|
+
)
|
|
203
|
+
scorer_id: str = "target_empirical_return"
|
|
204
|
+
native_rank_tie_scale: float = 1e-6
|
|
205
|
+
scorer_version: int = TARGET_EMPIRICAL_RETURN_ACTION_SCORER_VERSION
|
|
206
|
+
definition_sha256: str = field(init=False)
|
|
207
|
+
|
|
208
|
+
def __post_init__(self) -> None:
|
|
209
|
+
_token(self.scorer_id, name="scorer_id")
|
|
210
|
+
if (
|
|
211
|
+
type(self.scorer_version) is not int
|
|
212
|
+
or self.scorer_version <= 0
|
|
213
|
+
):
|
|
214
|
+
raise ValueError("scorer_version must be positive")
|
|
215
|
+
if type(self.broker) is not RegretBrokeredMaterializedActionPolicy:
|
|
216
|
+
raise TypeError("broker must be exact")
|
|
217
|
+
self.broker.__post_init__()
|
|
218
|
+
if self.broker.return_value is not None:
|
|
219
|
+
raise ValueError(
|
|
220
|
+
"target empirical authority cannot contain a transfer prior"
|
|
221
|
+
)
|
|
222
|
+
if type(self.broker.ledger) is not MaterializedActionEvidenceLedger:
|
|
223
|
+
raise TypeError("broker ledger must be exact")
|
|
224
|
+
if (
|
|
225
|
+
type(self.native_rank_tie_scale) is not float
|
|
226
|
+
or not math.isfinite(self.native_rank_tie_scale)
|
|
227
|
+
or not 0.0 < self.native_rank_tie_scale < 1e-3
|
|
228
|
+
):
|
|
229
|
+
raise ValueError(
|
|
230
|
+
"native_rank_tie_scale must be a finite float in (0, 1e-3)"
|
|
231
|
+
)
|
|
232
|
+
object.__setattr__(
|
|
233
|
+
self,
|
|
234
|
+
"definition_sha256",
|
|
235
|
+
_hash(
|
|
236
|
+
_EMPIRICAL_DEFINITION_DOMAIN,
|
|
237
|
+
{
|
|
238
|
+
"schema_version": 1,
|
|
239
|
+
"scorer_id": self.scorer_id,
|
|
240
|
+
"scorer_version": self.scorer_version,
|
|
241
|
+
"broker_definition_sha256": (
|
|
242
|
+
MATERIALIZED_ACTION_BROKER_DEFINITION_SHA256
|
|
243
|
+
),
|
|
244
|
+
"return_estimator_definition_sha256": (
|
|
245
|
+
EMPIRICAL_RETURN_ESTIMATOR_DEFINITION_SHA256
|
|
246
|
+
),
|
|
247
|
+
"hierarchical_kappa_hex": (
|
|
248
|
+
self.broker.hierarchical_kappa.hex()
|
|
249
|
+
),
|
|
250
|
+
"score": (
|
|
251
|
+
"empirical_return_mean_plus_remaining_unit_interval_"
|
|
252
|
+
"times_native_rank_tie"
|
|
253
|
+
),
|
|
254
|
+
"native_rank_tie_scale_hex": (
|
|
255
|
+
self.native_rank_tie_scale.hex()
|
|
256
|
+
),
|
|
257
|
+
"candidate_outcomes_observed": False,
|
|
258
|
+
"strictly_prior_target_outcomes_only": True,
|
|
259
|
+
"workload_model_provider_branches": False,
|
|
260
|
+
},
|
|
261
|
+
),
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
def _validate_cutoff(
|
|
265
|
+
self,
|
|
266
|
+
request: ResidualPortfolioDecisionRequest,
|
|
267
|
+
) -> None:
|
|
268
|
+
for outcome in self.broker.ledger.outcomes:
|
|
269
|
+
if (
|
|
270
|
+
outcome.action.context.decision_index
|
|
271
|
+
>= request.decision_index
|
|
272
|
+
):
|
|
273
|
+
raise ValueError(
|
|
274
|
+
"empirical return ledger crosses the decision cutoff"
|
|
275
|
+
)
|
|
276
|
+
for credit in self.broker.ledger.delayed_credits:
|
|
277
|
+
if credit.available_at_decision_index > request.decision_index:
|
|
278
|
+
raise ValueError(
|
|
279
|
+
"delayed credit is unavailable at the decision cutoff"
|
|
280
|
+
)
|
|
281
|
+
for resolved in self.broker.ledger.resolved_returns:
|
|
282
|
+
if resolved.available_at_decision_index > request.decision_index:
|
|
283
|
+
raise ValueError(
|
|
284
|
+
"resolved return is unavailable at the decision cutoff"
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
async def score(
|
|
288
|
+
self,
|
|
289
|
+
request: ResidualPortfolioDecisionRequest,
|
|
290
|
+
proposals: tuple[MaterializedActionProposalBatch, ...],
|
|
291
|
+
) -> MaterializedActionScoreBatch:
|
|
292
|
+
self.__post_init__()
|
|
293
|
+
proposal_sha256s, raw_actions = _sealed_universe(
|
|
294
|
+
request,
|
|
295
|
+
proposals,
|
|
296
|
+
)
|
|
297
|
+
self._validate_cutoff(request)
|
|
298
|
+
actions = tuple(raw_actions)
|
|
299
|
+
rows: list[dict[str, object]] = []
|
|
300
|
+
scores: list[MaterializedActionScore] = []
|
|
301
|
+
for action in sorted(
|
|
302
|
+
actions,
|
|
303
|
+
key=lambda value: value.action_sha256,
|
|
304
|
+
):
|
|
305
|
+
broker_score = self.broker.score(action)
|
|
306
|
+
empirical_mean = broker_score.return_estimate.mean
|
|
307
|
+
value = empirical_mean + (
|
|
308
|
+
(1.0 - empirical_mean)
|
|
309
|
+
* self.native_rank_tie_scale
|
|
310
|
+
/ action.native_rank
|
|
311
|
+
)
|
|
312
|
+
scores.append(
|
|
313
|
+
MaterializedActionScore(
|
|
314
|
+
action_sha256=action.action_sha256,
|
|
315
|
+
value=float(value),
|
|
316
|
+
)
|
|
317
|
+
)
|
|
318
|
+
rows.append(
|
|
319
|
+
{
|
|
320
|
+
"action_sha256": action.action_sha256,
|
|
321
|
+
"native_rank": action.native_rank,
|
|
322
|
+
"empirical_mean_hex": empirical_mean.hex(),
|
|
323
|
+
"score_hex": value.hex(),
|
|
324
|
+
"broker_score": broker_score.to_record(),
|
|
325
|
+
}
|
|
326
|
+
)
|
|
327
|
+
evidence_sha256 = _hash(
|
|
328
|
+
_EMPIRICAL_EVIDENCE_DOMAIN,
|
|
329
|
+
{
|
|
330
|
+
"scorer_definition_sha256": self.definition_sha256,
|
|
331
|
+
"residual_request_sha256": request.request_sha256,
|
|
332
|
+
"proposal_sha256s": list(proposal_sha256s),
|
|
333
|
+
"ledger_counts": {
|
|
334
|
+
"outcomes": len(self.broker.ledger.outcomes),
|
|
335
|
+
"delayed_credits": len(
|
|
336
|
+
self.broker.ledger.delayed_credits
|
|
337
|
+
),
|
|
338
|
+
"resolved_returns": len(
|
|
339
|
+
self.broker.ledger.resolved_returns
|
|
340
|
+
),
|
|
341
|
+
},
|
|
342
|
+
"rows": rows,
|
|
343
|
+
"candidate_outcomes_observed": False,
|
|
344
|
+
},
|
|
345
|
+
)
|
|
346
|
+
return MaterializedActionScoreBatch(
|
|
347
|
+
scorer_id=self.scorer_id,
|
|
348
|
+
scorer_version=self.scorer_version,
|
|
349
|
+
scorer_definition_sha256=self.definition_sha256,
|
|
350
|
+
residual_request_sha256=request.request_sha256,
|
|
351
|
+
proposal_sha256s=proposal_sha256s,
|
|
352
|
+
scores=tuple(scores),
|
|
353
|
+
candidate_outcomes_observed=False,
|
|
354
|
+
evidence_sha256=evidence_sha256,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
__all__ = [
|
|
359
|
+
"NATIVE_RANK_ACTION_SCORER_VERSION",
|
|
360
|
+
"TARGET_EMPIRICAL_RETURN_ACTION_SCORER_VERSION",
|
|
361
|
+
"NativeRankMaterializedActionScorer",
|
|
362
|
+
"TargetEmpiricalReturnMaterializedActionScorer",
|
|
363
|
+
]
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Workload-neutral structural identities for parent-relative finite actions.
|
|
2
|
+
|
|
3
|
+
Option identifiers are intentionally opaque and need not remain stable across
|
|
4
|
+
parents. Search policies that learn or diversify across parent lanes therefore
|
|
5
|
+
need an identity derived from the action itself rather than from its label.
|
|
6
|
+
This module exposes exact changed JSON paths and the coarser ``(family, paths)``
|
|
7
|
+
signature from sealed configurations. It contains no workload names, objective
|
|
8
|
+
values, evaluator outcomes, or prompt text.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from agent_evolve.domain.finite_variation import FiniteVariationContract
|
|
14
|
+
from agent_evolve.domain.ids import CandidateId
|
|
15
|
+
from agent_evolve.domain.patch import ArrayIndex, JsonPath, ObjectKey
|
|
16
|
+
from agent_evolve.policies.variation.typed_patch import derive_patch
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
ActionStructuralSignature = tuple[str, tuple[str, ...]]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _path_text(path: JsonPath) -> str:
|
|
23
|
+
parts = ["$"]
|
|
24
|
+
for segment in path.segments:
|
|
25
|
+
if type(segment) is ObjectKey:
|
|
26
|
+
parts.append(f".{segment.value}")
|
|
27
|
+
elif type(segment) is ArrayIndex:
|
|
28
|
+
parts.append(f"[{segment.value}]")
|
|
29
|
+
else: # pragma: no cover - JsonPath closes the segment union.
|
|
30
|
+
raise AssertionError("unsupported JSON-path segment")
|
|
31
|
+
return "".join(parts)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def parent_relative_changed_paths_by_option(
|
|
35
|
+
contract: FiniteVariationContract,
|
|
36
|
+
) -> dict[str, tuple[str, ...]]:
|
|
37
|
+
"""Return canonical changed-path sets for every action in ``contract``."""
|
|
38
|
+
|
|
39
|
+
typed_paths = parent_relative_changed_json_paths_by_option(contract)
|
|
40
|
+
return {
|
|
41
|
+
option_id: tuple(sorted(_path_text(path) for path in paths))
|
|
42
|
+
for option_id, paths in typed_paths.items()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def parent_relative_changed_json_paths_by_option(
|
|
47
|
+
contract: FiniteVariationContract,
|
|
48
|
+
) -> dict[str, tuple[JsonPath, ...]]:
|
|
49
|
+
"""Return exact typed parent-relative paths for every sealed action.
|
|
50
|
+
|
|
51
|
+
Keeping this typed projection public lets structural controllers compare
|
|
52
|
+
path overlap once without repeatedly revalidating a large finite contract
|
|
53
|
+
or relying on ambiguous rendered JSON-path strings.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
if type(contract) is not FiniteVariationContract:
|
|
57
|
+
raise TypeError("contract must be an exact FiniteVariationContract")
|
|
58
|
+
contract.__post_init__()
|
|
59
|
+
base = CandidateId("candidate_action_signature_parent")
|
|
60
|
+
target = CandidateId("candidate_action_signature_child")
|
|
61
|
+
return {
|
|
62
|
+
option.option_id: tuple(
|
|
63
|
+
sorted(
|
|
64
|
+
(
|
|
65
|
+
operation.path
|
|
66
|
+
for operation in derive_patch(
|
|
67
|
+
contract.parent_configuration,
|
|
68
|
+
option.child_configuration,
|
|
69
|
+
base_candidate_id=base,
|
|
70
|
+
target_candidate_id=target,
|
|
71
|
+
).operations
|
|
72
|
+
),
|
|
73
|
+
key=lambda path: path.schema_identity,
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
for option in contract.options
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def parent_relative_path_sets_are_disjoint(
|
|
81
|
+
left: tuple[JsonPath, ...],
|
|
82
|
+
right: tuple[JsonPath, ...],
|
|
83
|
+
) -> bool:
|
|
84
|
+
"""Return whether two already-derived typed patch path sets are disjoint."""
|
|
85
|
+
|
|
86
|
+
if type(left) is not tuple or type(right) is not tuple or not left or not right:
|
|
87
|
+
raise ValueError("path sets must be non-empty exact tuples")
|
|
88
|
+
if any(type(value) is not JsonPath for value in (*left, *right)):
|
|
89
|
+
raise TypeError("path sets must contain exact JsonPath values")
|
|
90
|
+
return not any(
|
|
91
|
+
left_path.segments == right_path.segments[: len(left_path.segments)]
|
|
92
|
+
or right_path.segments == left_path.segments[: len(right_path.segments)]
|
|
93
|
+
for left_path in left
|
|
94
|
+
for right_path in right
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def action_structural_signatures_by_option(
|
|
99
|
+
contract: FiniteVariationContract,
|
|
100
|
+
) -> dict[str, ActionStructuralSignature]:
|
|
101
|
+
"""Return canonical family-plus-path identities for every sealed action."""
|
|
102
|
+
|
|
103
|
+
paths = parent_relative_changed_paths_by_option(contract)
|
|
104
|
+
return {
|
|
105
|
+
option.option_id: (option.family, paths[option.option_id])
|
|
106
|
+
for option in contract.options
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
__all__ = [
|
|
111
|
+
"ActionStructuralSignature",
|
|
112
|
+
"action_structural_signatures_by_option",
|
|
113
|
+
"parent_relative_changed_json_paths_by_option",
|
|
114
|
+
"parent_relative_changed_paths_by_option",
|
|
115
|
+
"parent_relative_path_sets_are_disjoint",
|
|
116
|
+
]
|