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,164 @@
|
|
|
1
|
+
"""Strict JSON codecs for finite acquisition slate scoring."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agent_evolve.ports.finite_acquisition_batch import (
|
|
8
|
+
FiniteAcquisitionBatchScoreDecision,
|
|
9
|
+
FiniteAcquisitionBatchScoreRequest,
|
|
10
|
+
FiniteAcquisitionSlate,
|
|
11
|
+
FiniteAcquisitionSlateScore,
|
|
12
|
+
)
|
|
13
|
+
from agent_evolve.ports.finite_acquisition_json import (
|
|
14
|
+
finite_acquisition_request_from_record,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _object(value: object, *, name: str, keys: set[str]) -> dict[str, Any]:
|
|
19
|
+
if type(value) is not dict or set(value) != keys:
|
|
20
|
+
raise ValueError(f"{name} must be an exact JSON object with canonical fields")
|
|
21
|
+
return value
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _list(value: object, *, name: str) -> list[Any]:
|
|
25
|
+
if type(value) is not list:
|
|
26
|
+
raise TypeError(f"{name} must be an exact JSON array")
|
|
27
|
+
return value
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _string(value: object, *, name: str) -> str:
|
|
31
|
+
if type(value) is not str:
|
|
32
|
+
raise TypeError(f"{name} must be an exact JSON string")
|
|
33
|
+
return value
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _integer(value: object, *, name: str) -> int:
|
|
37
|
+
if type(value) is not int:
|
|
38
|
+
raise TypeError(f"{name} must be an exact JSON integer")
|
|
39
|
+
return value
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _hex_float(value: object, *, name: str) -> float:
|
|
43
|
+
text = _string(value, name=name)
|
|
44
|
+
try:
|
|
45
|
+
parsed = float.fromhex(text)
|
|
46
|
+
except ValueError as error:
|
|
47
|
+
raise ValueError(f"{name} must be a canonical hexadecimal float") from error
|
|
48
|
+
if parsed.hex() != text:
|
|
49
|
+
raise ValueError(f"{name} must use Python's canonical float.hex form")
|
|
50
|
+
return parsed
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _slate_from_record(value: object, *, name: str) -> FiniteAcquisitionSlate:
|
|
54
|
+
record = _object(value, name=name, keys={"candidate_ids"})
|
|
55
|
+
return FiniteAcquisitionSlate(
|
|
56
|
+
tuple(
|
|
57
|
+
_string(item, name=f"{name}.candidate_id")
|
|
58
|
+
for item in _list(record["candidate_ids"], name=f"{name}.candidate_ids")
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def finite_acquisition_batch_score_request_from_record(
|
|
64
|
+
value: object,
|
|
65
|
+
) -> FiniteAcquisitionBatchScoreRequest:
|
|
66
|
+
record = _object(
|
|
67
|
+
value,
|
|
68
|
+
name="finite acquisition batch-score request",
|
|
69
|
+
keys={"schema_version", "base_request", "slates", "request_sha256"},
|
|
70
|
+
)
|
|
71
|
+
if record["schema_version"] != 1:
|
|
72
|
+
raise ValueError("unsupported finite acquisition batch-score request schema")
|
|
73
|
+
base = finite_acquisition_request_from_record(record["base_request"])
|
|
74
|
+
request = FiniteAcquisitionBatchScoreRequest(
|
|
75
|
+
campaign_scope_sha256=base.campaign_scope_sha256,
|
|
76
|
+
cutoff_index=base.cutoff_index,
|
|
77
|
+
seed=base.seed,
|
|
78
|
+
objectives=base.objectives,
|
|
79
|
+
observations=base.observations,
|
|
80
|
+
candidates=base.candidates,
|
|
81
|
+
slates=tuple(
|
|
82
|
+
_slate_from_record(raw, name=f"slate[{index}]")
|
|
83
|
+
for index, raw in enumerate(_list(record["slates"], name="slates"))
|
|
84
|
+
),
|
|
85
|
+
)
|
|
86
|
+
if request.request_sha256 != _string(
|
|
87
|
+
record["request_sha256"], name="request_sha256"
|
|
88
|
+
):
|
|
89
|
+
raise ValueError("finite acquisition batch-score request authentication failed")
|
|
90
|
+
return request
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def finite_acquisition_batch_score_decision_from_record(
|
|
94
|
+
value: object,
|
|
95
|
+
) -> FiniteAcquisitionBatchScoreDecision:
|
|
96
|
+
record = _object(
|
|
97
|
+
value,
|
|
98
|
+
name="finite acquisition batch-score decision",
|
|
99
|
+
keys={
|
|
100
|
+
"schema_version",
|
|
101
|
+
"request_sha256",
|
|
102
|
+
"policy",
|
|
103
|
+
"scores",
|
|
104
|
+
"diagnostics",
|
|
105
|
+
"decision_sha256",
|
|
106
|
+
},
|
|
107
|
+
)
|
|
108
|
+
if record["schema_version"] != 1:
|
|
109
|
+
raise ValueError("unsupported finite acquisition batch-score decision schema")
|
|
110
|
+
policy = _object(
|
|
111
|
+
record["policy"],
|
|
112
|
+
name="policy",
|
|
113
|
+
keys={"policy_id", "policy_version", "definition_sha256"},
|
|
114
|
+
)
|
|
115
|
+
scores: list[FiniteAcquisitionSlateScore] = []
|
|
116
|
+
for index, raw in enumerate(_list(record["scores"], name="scores")):
|
|
117
|
+
row = _object(
|
|
118
|
+
raw,
|
|
119
|
+
name=f"score[{index}]",
|
|
120
|
+
keys={"slate", "log_acquisition_value_hex"},
|
|
121
|
+
)
|
|
122
|
+
scores.append(
|
|
123
|
+
FiniteAcquisitionSlateScore(
|
|
124
|
+
slate=_slate_from_record(row["slate"], name=f"score[{index}].slate"),
|
|
125
|
+
log_acquisition_value=_hex_float(
|
|
126
|
+
row["log_acquisition_value_hex"],
|
|
127
|
+
name=f"score[{index}].log_acquisition_value_hex",
|
|
128
|
+
),
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
diagnostics: list[tuple[str, str]] = []
|
|
132
|
+
for index, raw in enumerate(_list(record["diagnostics"], name="diagnostics")):
|
|
133
|
+
row = _object(
|
|
134
|
+
raw,
|
|
135
|
+
name=f"diagnostic[{index}]",
|
|
136
|
+
keys={"key", "value"},
|
|
137
|
+
)
|
|
138
|
+
diagnostics.append(
|
|
139
|
+
(
|
|
140
|
+
_string(row["key"], name="diagnostic key"),
|
|
141
|
+
_string(row["value"], name="diagnostic value"),
|
|
142
|
+
)
|
|
143
|
+
)
|
|
144
|
+
decision = FiniteAcquisitionBatchScoreDecision(
|
|
145
|
+
request_sha256=_string(record["request_sha256"], name="request_sha256"),
|
|
146
|
+
policy_id=_string(policy["policy_id"], name="policy_id"),
|
|
147
|
+
policy_version=_integer(policy["policy_version"], name="policy_version"),
|
|
148
|
+
policy_definition_sha256=_string(
|
|
149
|
+
policy["definition_sha256"], name="definition_sha256"
|
|
150
|
+
),
|
|
151
|
+
scores=tuple(scores),
|
|
152
|
+
diagnostics=tuple(diagnostics),
|
|
153
|
+
)
|
|
154
|
+
if decision.decision_sha256 != _string(
|
|
155
|
+
record["decision_sha256"], name="decision_sha256"
|
|
156
|
+
):
|
|
157
|
+
raise ValueError("finite acquisition batch-score decision authentication failed")
|
|
158
|
+
return decision
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
__all__ = [
|
|
162
|
+
"finite_acquisition_batch_score_decision_from_record",
|
|
163
|
+
"finite_acquisition_batch_score_request_from_record",
|
|
164
|
+
]
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"""Strict JSON codecs for the finite-acquisition ask/tell boundary."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agent_evolve.ports.finite_acquisition import (
|
|
8
|
+
FiniteAcquisitionCandidate,
|
|
9
|
+
FiniteAcquisitionDecision,
|
|
10
|
+
FiniteAcquisitionObjective,
|
|
11
|
+
FiniteAcquisitionObservation,
|
|
12
|
+
FiniteAcquisitionRequest,
|
|
13
|
+
FiniteAcquisitionSelection,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _object(value: object, *, name: str, keys: set[str]) -> dict[str, Any]:
|
|
18
|
+
if type(value) is not dict or set(value) != keys:
|
|
19
|
+
raise ValueError(f"{name} must be an exact JSON object with canonical fields")
|
|
20
|
+
return value
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _list(value: object, *, name: str) -> list[Any]:
|
|
24
|
+
if type(value) is not list:
|
|
25
|
+
raise TypeError(f"{name} must be an exact JSON array")
|
|
26
|
+
return value
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _string(value: object, *, name: str) -> str:
|
|
30
|
+
if type(value) is not str:
|
|
31
|
+
raise TypeError(f"{name} must be an exact JSON string")
|
|
32
|
+
return value
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _integer(value: object, *, name: str) -> int:
|
|
36
|
+
if type(value) is not int:
|
|
37
|
+
raise TypeError(f"{name} must be an exact JSON integer")
|
|
38
|
+
return value
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _hex_float(value: object, *, name: str) -> float:
|
|
42
|
+
text = _string(value, name=name)
|
|
43
|
+
try:
|
|
44
|
+
parsed = float.fromhex(text)
|
|
45
|
+
except ValueError as error:
|
|
46
|
+
raise ValueError(f"{name} must be a canonical hexadecimal float") from error
|
|
47
|
+
if parsed.hex() != text:
|
|
48
|
+
raise ValueError(f"{name} must use Python's canonical float.hex form")
|
|
49
|
+
return parsed
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def finite_acquisition_request_from_record(
|
|
53
|
+
value: object,
|
|
54
|
+
) -> FiniteAcquisitionRequest:
|
|
55
|
+
"""Reconstruct and authenticate a request from its canonical JSON record."""
|
|
56
|
+
|
|
57
|
+
record = _object(
|
|
58
|
+
value,
|
|
59
|
+
name="finite acquisition request",
|
|
60
|
+
keys={
|
|
61
|
+
"schema_version",
|
|
62
|
+
"campaign_scope_sha256",
|
|
63
|
+
"cutoff_index",
|
|
64
|
+
"batch_size",
|
|
65
|
+
"seed",
|
|
66
|
+
"objectives",
|
|
67
|
+
"observations",
|
|
68
|
+
"candidates",
|
|
69
|
+
"request_sha256",
|
|
70
|
+
},
|
|
71
|
+
)
|
|
72
|
+
if record["schema_version"] != 1:
|
|
73
|
+
raise ValueError("unsupported finite acquisition request schema")
|
|
74
|
+
objectives = []
|
|
75
|
+
for index, raw in enumerate(_list(record["objectives"], name="objectives")):
|
|
76
|
+
row = _object(
|
|
77
|
+
raw,
|
|
78
|
+
name=f"objective[{index}]",
|
|
79
|
+
keys={"metric_id", "sense", "ideal_hex", "reference_hex"},
|
|
80
|
+
)
|
|
81
|
+
objectives.append(
|
|
82
|
+
FiniteAcquisitionObjective(
|
|
83
|
+
metric_id=_string(row["metric_id"], name="metric_id"),
|
|
84
|
+
sense=_string(row["sense"], name="sense"),
|
|
85
|
+
ideal=_hex_float(row["ideal_hex"], name="ideal_hex"),
|
|
86
|
+
reference=_hex_float(row["reference_hex"], name="reference_hex"),
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
observations = []
|
|
90
|
+
for index, raw in enumerate(
|
|
91
|
+
_list(record["observations"], name="observations")
|
|
92
|
+
):
|
|
93
|
+
row = _object(
|
|
94
|
+
raw,
|
|
95
|
+
name=f"observation[{index}]",
|
|
96
|
+
keys={
|
|
97
|
+
"candidate_id",
|
|
98
|
+
"configuration_sha256",
|
|
99
|
+
"features_hex",
|
|
100
|
+
"objectives",
|
|
101
|
+
},
|
|
102
|
+
)
|
|
103
|
+
objective_values = []
|
|
104
|
+
for metric_index, raw_metric in enumerate(
|
|
105
|
+
_list(row["objectives"], name="observation objectives")
|
|
106
|
+
):
|
|
107
|
+
metric = _object(
|
|
108
|
+
raw_metric,
|
|
109
|
+
name=f"observation[{index}].objective[{metric_index}]",
|
|
110
|
+
keys={"metric_id", "value_hex"},
|
|
111
|
+
)
|
|
112
|
+
objective_values.append(
|
|
113
|
+
(
|
|
114
|
+
_string(metric["metric_id"], name="metric_id"),
|
|
115
|
+
_hex_float(metric["value_hex"], name="value_hex"),
|
|
116
|
+
)
|
|
117
|
+
)
|
|
118
|
+
observations.append(
|
|
119
|
+
FiniteAcquisitionObservation(
|
|
120
|
+
candidate_id=_string(row["candidate_id"], name="candidate_id"),
|
|
121
|
+
configuration_sha256=_string(
|
|
122
|
+
row["configuration_sha256"], name="configuration_sha256"
|
|
123
|
+
),
|
|
124
|
+
features=tuple(
|
|
125
|
+
_hex_float(item, name="feature")
|
|
126
|
+
for item in _list(row["features_hex"], name="features_hex")
|
|
127
|
+
),
|
|
128
|
+
objectives=tuple(objective_values),
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
candidates = []
|
|
132
|
+
for index, raw in enumerate(_list(record["candidates"], name="candidates")):
|
|
133
|
+
row = _object(
|
|
134
|
+
raw,
|
|
135
|
+
name=f"candidate[{index}]",
|
|
136
|
+
keys={"candidate_id", "configuration_sha256", "features_hex"},
|
|
137
|
+
)
|
|
138
|
+
candidates.append(
|
|
139
|
+
FiniteAcquisitionCandidate(
|
|
140
|
+
candidate_id=_string(row["candidate_id"], name="candidate_id"),
|
|
141
|
+
configuration_sha256=_string(
|
|
142
|
+
row["configuration_sha256"], name="configuration_sha256"
|
|
143
|
+
),
|
|
144
|
+
features=tuple(
|
|
145
|
+
_hex_float(item, name="feature")
|
|
146
|
+
for item in _list(row["features_hex"], name="features_hex")
|
|
147
|
+
),
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
request = FiniteAcquisitionRequest(
|
|
151
|
+
campaign_scope_sha256=_string(
|
|
152
|
+
record["campaign_scope_sha256"], name="campaign_scope_sha256"
|
|
153
|
+
),
|
|
154
|
+
cutoff_index=_integer(record["cutoff_index"], name="cutoff_index"),
|
|
155
|
+
batch_size=_integer(record["batch_size"], name="batch_size"),
|
|
156
|
+
seed=_integer(record["seed"], name="seed"),
|
|
157
|
+
objectives=tuple(objectives),
|
|
158
|
+
observations=tuple(observations),
|
|
159
|
+
candidates=tuple(candidates),
|
|
160
|
+
)
|
|
161
|
+
if request.request_sha256 != _string(
|
|
162
|
+
record["request_sha256"], name="request_sha256"
|
|
163
|
+
):
|
|
164
|
+
raise ValueError("finite acquisition request authentication failed")
|
|
165
|
+
return request
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def finite_acquisition_decision_from_record(
|
|
169
|
+
value: object,
|
|
170
|
+
) -> FiniteAcquisitionDecision:
|
|
171
|
+
"""Reconstruct and authenticate a decision from its canonical JSON record."""
|
|
172
|
+
|
|
173
|
+
record = _object(
|
|
174
|
+
value,
|
|
175
|
+
name="finite acquisition decision",
|
|
176
|
+
keys={
|
|
177
|
+
"schema_version",
|
|
178
|
+
"request_sha256",
|
|
179
|
+
"policy",
|
|
180
|
+
"selected",
|
|
181
|
+
"diagnostics",
|
|
182
|
+
"decision_sha256",
|
|
183
|
+
},
|
|
184
|
+
)
|
|
185
|
+
if record["schema_version"] != 1:
|
|
186
|
+
raise ValueError("unsupported finite acquisition decision schema")
|
|
187
|
+
policy = _object(
|
|
188
|
+
record["policy"],
|
|
189
|
+
name="policy",
|
|
190
|
+
keys={"policy_id", "policy_version", "definition_sha256"},
|
|
191
|
+
)
|
|
192
|
+
selected = []
|
|
193
|
+
for index, raw in enumerate(_list(record["selected"], name="selected")):
|
|
194
|
+
row = _object(
|
|
195
|
+
raw,
|
|
196
|
+
name=f"selection[{index}]",
|
|
197
|
+
keys={
|
|
198
|
+
"candidate_id",
|
|
199
|
+
"configuration_sha256",
|
|
200
|
+
"acquisition_value_hex",
|
|
201
|
+
},
|
|
202
|
+
)
|
|
203
|
+
selected.append(
|
|
204
|
+
FiniteAcquisitionSelection(
|
|
205
|
+
candidate_id=_string(row["candidate_id"], name="candidate_id"),
|
|
206
|
+
configuration_sha256=_string(
|
|
207
|
+
row["configuration_sha256"], name="configuration_sha256"
|
|
208
|
+
),
|
|
209
|
+
acquisition_value=_hex_float(
|
|
210
|
+
row["acquisition_value_hex"], name="acquisition_value_hex"
|
|
211
|
+
),
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
diagnostics = []
|
|
215
|
+
for index, raw in enumerate(_list(record["diagnostics"], name="diagnostics")):
|
|
216
|
+
row = _object(
|
|
217
|
+
raw,
|
|
218
|
+
name=f"diagnostic[{index}]",
|
|
219
|
+
keys={"key", "value"},
|
|
220
|
+
)
|
|
221
|
+
diagnostics.append(
|
|
222
|
+
(
|
|
223
|
+
_string(row["key"], name="diagnostic key"),
|
|
224
|
+
_string(row["value"], name="diagnostic value"),
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
decision = FiniteAcquisitionDecision(
|
|
228
|
+
request_sha256=_string(record["request_sha256"], name="request_sha256"),
|
|
229
|
+
policy_id=_string(policy["policy_id"], name="policy_id"),
|
|
230
|
+
policy_version=_integer(policy["policy_version"], name="policy_version"),
|
|
231
|
+
policy_definition_sha256=_string(
|
|
232
|
+
policy["definition_sha256"], name="definition_sha256"
|
|
233
|
+
),
|
|
234
|
+
selected=tuple(selected),
|
|
235
|
+
diagnostics=tuple(diagnostics),
|
|
236
|
+
)
|
|
237
|
+
if decision.decision_sha256 != _string(
|
|
238
|
+
record["decision_sha256"], name="decision_sha256"
|
|
239
|
+
):
|
|
240
|
+
raise ValueError("finite acquisition decision authentication failed")
|
|
241
|
+
return decision
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
__all__ = [
|
|
245
|
+
"finite_acquisition_decision_from_record",
|
|
246
|
+
"finite_acquisition_request_from_record",
|
|
247
|
+
]
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""Outcome-blind workload boundary for a finite acquisition reservoir.
|
|
2
|
+
|
|
3
|
+
The workload owns legality, materialization, and a normalized feature codec.
|
|
4
|
+
The search controller supplies only cutoff identity, exclusions, pool size,
|
|
5
|
+
and a deterministic seed. Objective values never cross this boundary; they
|
|
6
|
+
are joined later by the generic acquisition-envelope application service.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from typing import Protocol, runtime_checkable
|
|
16
|
+
|
|
17
|
+
from agent_evolve.domain.patch import require_sha256
|
|
18
|
+
from agent_evolve.domain.typed_json import (
|
|
19
|
+
FrozenJsonObject,
|
|
20
|
+
freeze_json,
|
|
21
|
+
typed_json_sha256,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,127}$")
|
|
26
|
+
_REQUEST_DOMAIN = b"agent-evolve:finite-acquisition-space-request:v1\x00"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _canonical_json(value: object) -> bytes:
|
|
30
|
+
return json.dumps(
|
|
31
|
+
value,
|
|
32
|
+
allow_nan=False,
|
|
33
|
+
ensure_ascii=True,
|
|
34
|
+
separators=(",", ":"),
|
|
35
|
+
sort_keys=True,
|
|
36
|
+
).encode("ascii", errors="strict")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class FiniteAcquisitionSpaceRequest:
|
|
41
|
+
campaign_scope_sha256: str
|
|
42
|
+
cutoff_index: int
|
|
43
|
+
pool_size: int
|
|
44
|
+
seed: int
|
|
45
|
+
observed_configurations: tuple[FrozenJsonObject, ...]
|
|
46
|
+
excluded_configuration_sha256s: tuple[str, ...]
|
|
47
|
+
request_sha256: str = field(init=False, default="")
|
|
48
|
+
|
|
49
|
+
def __post_init__(self) -> None:
|
|
50
|
+
require_sha256(self.campaign_scope_sha256, "campaign_scope_sha256")
|
|
51
|
+
if type(self.cutoff_index) is not int or self.cutoff_index < 1:
|
|
52
|
+
raise ValueError("cutoff_index must be positive")
|
|
53
|
+
if type(self.pool_size) is not int or self.pool_size < 1:
|
|
54
|
+
raise ValueError("pool_size must be positive")
|
|
55
|
+
if type(self.seed) is not int or self.seed < 0:
|
|
56
|
+
raise ValueError("seed must be a non-negative exact integer")
|
|
57
|
+
if type(self.observed_configurations) is not tuple or not (
|
|
58
|
+
self.observed_configurations
|
|
59
|
+
):
|
|
60
|
+
raise ValueError("observed_configurations must be a non-empty exact tuple")
|
|
61
|
+
observed_identities: list[str] = []
|
|
62
|
+
for value in self.observed_configurations:
|
|
63
|
+
if type(value) is not FrozenJsonObject or freeze_json(value) is not value:
|
|
64
|
+
raise TypeError(
|
|
65
|
+
"observed configurations must be frozen typed-JSON objects"
|
|
66
|
+
)
|
|
67
|
+
observed_identities.append(typed_json_sha256(value))
|
|
68
|
+
if tuple(observed_identities) != tuple(sorted(set(observed_identities))):
|
|
69
|
+
raise ValueError("observed configurations must be unique and hash-sorted")
|
|
70
|
+
if type(self.excluded_configuration_sha256s) is not tuple:
|
|
71
|
+
raise TypeError("excluded configuration identities must be an exact tuple")
|
|
72
|
+
for value in self.excluded_configuration_sha256s:
|
|
73
|
+
require_sha256(value, "excluded_configuration_sha256")
|
|
74
|
+
if self.excluded_configuration_sha256s != tuple(
|
|
75
|
+
sorted(set(self.excluded_configuration_sha256s))
|
|
76
|
+
):
|
|
77
|
+
raise ValueError("excluded configuration identities must be canonical")
|
|
78
|
+
if not set(observed_identities) <= set(
|
|
79
|
+
self.excluded_configuration_sha256s
|
|
80
|
+
):
|
|
81
|
+
raise ValueError("observed configurations must be excluded from the pool")
|
|
82
|
+
record = self._unsigned_record()
|
|
83
|
+
computed = hashlib.sha256(
|
|
84
|
+
_REQUEST_DOMAIN + _canonical_json(record)
|
|
85
|
+
).hexdigest()
|
|
86
|
+
if self.request_sha256 not in ("", computed):
|
|
87
|
+
raise ValueError("request_sha256 does not authenticate the request")
|
|
88
|
+
object.__setattr__(self, "request_sha256", computed)
|
|
89
|
+
|
|
90
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
91
|
+
return {
|
|
92
|
+
"schema_version": 1,
|
|
93
|
+
"campaign_scope_sha256": self.campaign_scope_sha256,
|
|
94
|
+
"cutoff_index": self.cutoff_index,
|
|
95
|
+
"pool_size": self.pool_size,
|
|
96
|
+
"seed": self.seed,
|
|
97
|
+
"observed_configuration_sha256s": [
|
|
98
|
+
typed_json_sha256(value) for value in self.observed_configurations
|
|
99
|
+
],
|
|
100
|
+
"excluded_configuration_sha256s": list(
|
|
101
|
+
self.excluded_configuration_sha256s
|
|
102
|
+
),
|
|
103
|
+
"outcome_access": False,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
def to_record(self) -> dict[str, object]:
|
|
107
|
+
self.__post_init__()
|
|
108
|
+
return {**self._unsigned_record(), "request_sha256": self.request_sha256}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@runtime_checkable
|
|
112
|
+
class FiniteAcquisitionSpace(Protocol):
|
|
113
|
+
"""Enumerate legal configurations and encode any legal configuration."""
|
|
114
|
+
|
|
115
|
+
space_id: str
|
|
116
|
+
space_version: int
|
|
117
|
+
definition_sha256: str
|
|
118
|
+
|
|
119
|
+
def candidates(
|
|
120
|
+
self,
|
|
121
|
+
request: FiniteAcquisitionSpaceRequest,
|
|
122
|
+
) -> tuple[FrozenJsonObject, ...]: ...
|
|
123
|
+
|
|
124
|
+
def features(self, configuration: FrozenJsonObject) -> tuple[float, ...]: ...
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def validate_finite_acquisition_space_identity(
|
|
128
|
+
space: FiniteAcquisitionSpace,
|
|
129
|
+
) -> tuple[str, int, str]:
|
|
130
|
+
if not isinstance(space, FiniteAcquisitionSpace):
|
|
131
|
+
raise TypeError("space must implement FiniteAcquisitionSpace")
|
|
132
|
+
if type(space.space_id) is not str or _TOKEN.fullmatch(space.space_id) is None:
|
|
133
|
+
raise ValueError("finite acquisition space_id has invalid syntax")
|
|
134
|
+
if type(space.space_version) is not int or space.space_version <= 0:
|
|
135
|
+
raise ValueError("finite acquisition space_version must be positive")
|
|
136
|
+
require_sha256(space.definition_sha256, "finite acquisition space definition")
|
|
137
|
+
return space.space_id, space.space_version, space.definition_sha256
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def validate_finite_acquisition_space_candidates(
|
|
141
|
+
*,
|
|
142
|
+
request: FiniteAcquisitionSpaceRequest,
|
|
143
|
+
candidates: tuple[FrozenJsonObject, ...],
|
|
144
|
+
) -> None:
|
|
145
|
+
if type(request) is not FiniteAcquisitionSpaceRequest:
|
|
146
|
+
raise TypeError("request must be exact")
|
|
147
|
+
FiniteAcquisitionSpaceRequest.__post_init__(request)
|
|
148
|
+
if type(candidates) is not tuple or len(candidates) != request.pool_size:
|
|
149
|
+
raise ValueError("acquisition space must return the exact requested pool")
|
|
150
|
+
excluded = set(request.excluded_configuration_sha256s)
|
|
151
|
+
identities: list[str] = []
|
|
152
|
+
for value in candidates:
|
|
153
|
+
if type(value) is not FrozenJsonObject or freeze_json(value) is not value:
|
|
154
|
+
raise TypeError("acquisition candidates must be frozen typed-JSON objects")
|
|
155
|
+
identity = typed_json_sha256(value)
|
|
156
|
+
if identity in excluded:
|
|
157
|
+
raise ValueError("acquisition space returned an excluded configuration")
|
|
158
|
+
identities.append(identity)
|
|
159
|
+
if len(set(identities)) != len(identities):
|
|
160
|
+
raise ValueError("acquisition space returned duplicate configurations")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
__all__ = [
|
|
164
|
+
"FiniteAcquisitionSpace",
|
|
165
|
+
"FiniteAcquisitionSpaceRequest",
|
|
166
|
+
"validate_finite_acquisition_space_candidates",
|
|
167
|
+
"validate_finite_acquisition_space_identity",
|
|
168
|
+
]
|