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,475 @@
|
|
|
1
|
+
"""Provider- and method-neutral contracts for paired benchmark block schedules.
|
|
2
|
+
|
|
3
|
+
The request surface is deliberately closed. It binds only benchmark/task
|
|
4
|
+
identity, a finite contract and partition layout, an exact eligibility mask,
|
|
5
|
+
public seed material, canonical block identities, and one replicate index.
|
|
6
|
+
There is no metadata escape hatch through which a method, treatment, provider,
|
|
7
|
+
prompt, or observed outcome can influence assignment.
|
|
8
|
+
|
|
9
|
+
The application layer owns the deterministic hash ranking. These value
|
|
10
|
+
objects authenticate the complete no-replacement schedule separately from the
|
|
11
|
+
selected block, so every replicate can share one schedule receipt while
|
|
12
|
+
retaining its own replayable selection receipt.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
import hashlib
|
|
19
|
+
import json
|
|
20
|
+
import re
|
|
21
|
+
|
|
22
|
+
from agent_evolve.domain.patch import require_sha256
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
_IDENTIFIER = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
|
|
26
|
+
ELIGIBLE_ROW_MASK_DOMAIN = "agent-evolve:finite-contract-eligible-mask:v1"
|
|
27
|
+
_ELIGIBLE_ROW_MASK_FRAMING = ELIGIBLE_ROW_MASK_DOMAIN.encode("ascii") + b"\x00"
|
|
28
|
+
_POLICY_BINDING_FRAMING = b"agent-evolve:paired-block-schedule-policy:v1\x00"
|
|
29
|
+
_BLOCK_IDENTITY_FRAMING = b"agent-evolve:paired-block-identity:v1\x00"
|
|
30
|
+
_REQUEST_FRAMING = b"agent-evolve:paired-block-schedule-request:v2\x00"
|
|
31
|
+
_FULL_SCHEDULE_FRAMING = b"agent-evolve:paired-block-full-schedule:v2\x00"
|
|
32
|
+
_SELECTED_BLOCK_FRAMING = (
|
|
33
|
+
b"agent-evolve:paired-block-selection-receipt:v2\x00"
|
|
34
|
+
)
|
|
35
|
+
_UINT64_MAX = (1 << 64) - 1
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _canonical_json(value: object) -> bytes:
|
|
39
|
+
return json.dumps(
|
|
40
|
+
value,
|
|
41
|
+
allow_nan=False,
|
|
42
|
+
ensure_ascii=True,
|
|
43
|
+
separators=(",", ":"),
|
|
44
|
+
sort_keys=True,
|
|
45
|
+
).encode("ascii")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _hash(domain: bytes, value: object) -> str:
|
|
49
|
+
return hashlib.sha256(domain + _canonical_json(value)).hexdigest()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _require_identifier(value: object, name: str) -> str:
|
|
53
|
+
if type(value) is not str or _IDENTIFIER.fullmatch(value) is None:
|
|
54
|
+
raise ValueError(f"{name} must use the canonical lowercase identifier grammar")
|
|
55
|
+
return value
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
59
|
+
class ExactEligibleRowMask:
|
|
60
|
+
"""Exact global finite-contract rows eligible for downstream selection."""
|
|
61
|
+
|
|
62
|
+
finite_contract_identity_sha256: str
|
|
63
|
+
eligible_global_row_indices: tuple[int, ...]
|
|
64
|
+
|
|
65
|
+
def __post_init__(self) -> None:
|
|
66
|
+
require_sha256(
|
|
67
|
+
self.finite_contract_identity_sha256,
|
|
68
|
+
"finite_contract_identity_sha256",
|
|
69
|
+
)
|
|
70
|
+
if type(self.eligible_global_row_indices) is not tuple:
|
|
71
|
+
raise TypeError("eligible_global_row_indices must be an exact tuple")
|
|
72
|
+
if any(type(value) is not int for value in self.eligible_global_row_indices):
|
|
73
|
+
raise TypeError("eligible global rows must be exact integers")
|
|
74
|
+
if any(value < 0 for value in self.eligible_global_row_indices):
|
|
75
|
+
raise ValueError("eligible global rows cannot be negative")
|
|
76
|
+
if self.eligible_global_row_indices != tuple(
|
|
77
|
+
sorted(set(self.eligible_global_row_indices))
|
|
78
|
+
):
|
|
79
|
+
raise ValueError("eligible global rows must be unique and canonically sorted")
|
|
80
|
+
|
|
81
|
+
def payload_record(self) -> dict[str, object]:
|
|
82
|
+
self.__post_init__()
|
|
83
|
+
return {
|
|
84
|
+
"schema_version": 1,
|
|
85
|
+
"finite_contract_identity_sha256": (
|
|
86
|
+
self.finite_contract_identity_sha256
|
|
87
|
+
),
|
|
88
|
+
"eligible_global_row_indices": list(
|
|
89
|
+
self.eligible_global_row_indices
|
|
90
|
+
),
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def payload_sha256(self) -> str:
|
|
95
|
+
return hashlib.sha256(_canonical_json(self.payload_record())).hexdigest()
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def mask_sha256(self) -> str:
|
|
99
|
+
return _hash(_ELIGIBLE_ROW_MASK_FRAMING, self.payload_record())
|
|
100
|
+
|
|
101
|
+
def to_record(self) -> dict[str, object]:
|
|
102
|
+
return {
|
|
103
|
+
"domain": ELIGIBLE_ROW_MASK_DOMAIN,
|
|
104
|
+
"payload": self.payload_record(),
|
|
105
|
+
"payload_sha256": self.payload_sha256,
|
|
106
|
+
"digest_sha256": self.mask_sha256,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
def __eq__(self, other: object) -> bool:
|
|
110
|
+
return (
|
|
111
|
+
type(other) is ExactEligibleRowMask
|
|
112
|
+
and self.mask_sha256 == other.mask_sha256
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
__hash__ = None
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
119
|
+
class PairedBlockSchedulePolicyBinding:
|
|
120
|
+
"""Exact public algorithm and rank-domain identity used by a schedule."""
|
|
121
|
+
|
|
122
|
+
policy_id: str
|
|
123
|
+
policy_version: int
|
|
124
|
+
policy_definition_sha256: str
|
|
125
|
+
rank_domain: str
|
|
126
|
+
|
|
127
|
+
def __post_init__(self) -> None:
|
|
128
|
+
_require_identifier(self.policy_id, "policy_id")
|
|
129
|
+
if type(self.policy_version) is not int or self.policy_version <= 0:
|
|
130
|
+
raise ValueError("policy_version must be a positive exact integer")
|
|
131
|
+
require_sha256(self.policy_definition_sha256, "policy_definition_sha256")
|
|
132
|
+
_require_identifier(self.rank_domain, "rank_domain")
|
|
133
|
+
|
|
134
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
135
|
+
self.__post_init__()
|
|
136
|
+
return {
|
|
137
|
+
"schema_version": 1,
|
|
138
|
+
"policy_id": self.policy_id,
|
|
139
|
+
"policy_version": self.policy_version,
|
|
140
|
+
"policy_definition_sha256": self.policy_definition_sha256,
|
|
141
|
+
"rank_domain": self.rank_domain,
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def binding_sha256(self) -> str:
|
|
146
|
+
return _hash(_POLICY_BINDING_FRAMING, self._unsigned_record())
|
|
147
|
+
|
|
148
|
+
def to_record(self) -> dict[str, object]:
|
|
149
|
+
return {**self._unsigned_record(), "binding_sha256": self.binding_sha256}
|
|
150
|
+
|
|
151
|
+
def __eq__(self, other: object) -> bool:
|
|
152
|
+
return (
|
|
153
|
+
type(other) is PairedBlockSchedulePolicyBinding
|
|
154
|
+
and self.binding_sha256 == other.binding_sha256
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
__hash__ = None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
161
|
+
class CanonicalBlockIdentity:
|
|
162
|
+
"""One canonical, contiguous block in a complete benchmark partition."""
|
|
163
|
+
|
|
164
|
+
block_index: int
|
|
165
|
+
block_spec_sha256: str
|
|
166
|
+
global_row_start: int
|
|
167
|
+
global_row_stop: int
|
|
168
|
+
|
|
169
|
+
def __post_init__(self) -> None:
|
|
170
|
+
if type(self.block_index) is not int or self.block_index < 0:
|
|
171
|
+
raise ValueError("block_index must be a non-negative exact integer")
|
|
172
|
+
require_sha256(self.block_spec_sha256, "block_spec_sha256")
|
|
173
|
+
if type(self.global_row_start) is not int or self.global_row_start < 0:
|
|
174
|
+
raise ValueError(
|
|
175
|
+
"global_row_start must be a non-negative exact integer"
|
|
176
|
+
)
|
|
177
|
+
if (
|
|
178
|
+
type(self.global_row_stop) is not int
|
|
179
|
+
or self.global_row_stop <= self.global_row_start
|
|
180
|
+
):
|
|
181
|
+
raise ValueError("global_row_stop must be greater than global_row_start")
|
|
182
|
+
|
|
183
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
184
|
+
self.__post_init__()
|
|
185
|
+
return {
|
|
186
|
+
"schema_version": 1,
|
|
187
|
+
"block_index": self.block_index,
|
|
188
|
+
"block_spec_sha256": self.block_spec_sha256,
|
|
189
|
+
"global_row_start": self.global_row_start,
|
|
190
|
+
"global_row_stop": self.global_row_stop,
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
@property
|
|
194
|
+
def identity_sha256(self) -> str:
|
|
195
|
+
return _hash(_BLOCK_IDENTITY_FRAMING, self._unsigned_record())
|
|
196
|
+
|
|
197
|
+
def to_record(self) -> dict[str, object]:
|
|
198
|
+
return {
|
|
199
|
+
**self._unsigned_record(),
|
|
200
|
+
"block_identity_sha256": self.identity_sha256,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
def __eq__(self, other: object) -> bool:
|
|
204
|
+
return (
|
|
205
|
+
type(other) is CanonicalBlockIdentity
|
|
206
|
+
and self.identity_sha256 == other.identity_sha256
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
__hash__ = None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
213
|
+
class PairedBlockScheduleRequest:
|
|
214
|
+
"""Closed, method-independent input for one replicate's block assignment."""
|
|
215
|
+
|
|
216
|
+
benchmark_id: str
|
|
217
|
+
task_sha256: str
|
|
218
|
+
finite_contract_identity_sha256: str
|
|
219
|
+
partition_layout_sha256: str
|
|
220
|
+
policy: PairedBlockSchedulePolicyBinding
|
|
221
|
+
eligible_mask: ExactEligibleRowMask
|
|
222
|
+
public_seed: int
|
|
223
|
+
public_seed_source_sha256: str
|
|
224
|
+
blocks: tuple[CanonicalBlockIdentity, ...]
|
|
225
|
+
replicate_index: int
|
|
226
|
+
|
|
227
|
+
def __post_init__(self) -> None:
|
|
228
|
+
_require_identifier(self.benchmark_id, "benchmark_id")
|
|
229
|
+
require_sha256(self.task_sha256, "task_sha256")
|
|
230
|
+
require_sha256(
|
|
231
|
+
self.finite_contract_identity_sha256,
|
|
232
|
+
"finite_contract_identity_sha256",
|
|
233
|
+
)
|
|
234
|
+
require_sha256(self.partition_layout_sha256, "partition_layout_sha256")
|
|
235
|
+
if type(self.policy) is not PairedBlockSchedulePolicyBinding:
|
|
236
|
+
raise TypeError(
|
|
237
|
+
"policy must be an exact PairedBlockSchedulePolicyBinding"
|
|
238
|
+
)
|
|
239
|
+
self.policy.__post_init__()
|
|
240
|
+
if type(self.eligible_mask) is not ExactEligibleRowMask:
|
|
241
|
+
raise TypeError("eligible_mask must be an exact ExactEligibleRowMask")
|
|
242
|
+
self.eligible_mask.__post_init__()
|
|
243
|
+
if (
|
|
244
|
+
self.eligible_mask.finite_contract_identity_sha256
|
|
245
|
+
!= self.finite_contract_identity_sha256
|
|
246
|
+
):
|
|
247
|
+
raise ValueError("eligible mask names another finite contract")
|
|
248
|
+
if (
|
|
249
|
+
type(self.public_seed) is not int
|
|
250
|
+
or self.public_seed < 0
|
|
251
|
+
or self.public_seed > _UINT64_MAX
|
|
252
|
+
):
|
|
253
|
+
raise ValueError("public_seed must be an unsigned 64-bit exact integer")
|
|
254
|
+
require_sha256(
|
|
255
|
+
self.public_seed_source_sha256,
|
|
256
|
+
"public_seed_source_sha256",
|
|
257
|
+
)
|
|
258
|
+
if type(self.blocks) is not tuple or not self.blocks:
|
|
259
|
+
raise ValueError("blocks must be a non-empty exact tuple")
|
|
260
|
+
if any(type(value) is not CanonicalBlockIdentity for value in self.blocks):
|
|
261
|
+
raise TypeError("blocks must contain exact CanonicalBlockIdentity values")
|
|
262
|
+
for value in self.blocks:
|
|
263
|
+
value.__post_init__()
|
|
264
|
+
|
|
265
|
+
canonical = tuple(sorted(self.blocks, key=lambda value: value.block_index))
|
|
266
|
+
if len({value.identity_sha256 for value in canonical}) != len(canonical):
|
|
267
|
+
raise ValueError("canonical block identities cannot repeat")
|
|
268
|
+
cursor = 0
|
|
269
|
+
for expected_index, block in enumerate(canonical):
|
|
270
|
+
if block.block_index != expected_index:
|
|
271
|
+
raise ValueError("block indices must be contiguous canonical positions")
|
|
272
|
+
if block.global_row_start != cursor:
|
|
273
|
+
raise ValueError("blocks must provide gap-free, overlap-free coverage")
|
|
274
|
+
cursor = block.global_row_stop
|
|
275
|
+
object.__setattr__(self, "blocks", canonical)
|
|
276
|
+
|
|
277
|
+
if any(
|
|
278
|
+
value >= cursor
|
|
279
|
+
for value in self.eligible_mask.eligible_global_row_indices
|
|
280
|
+
):
|
|
281
|
+
raise ValueError("eligible mask contains a row outside the block partition")
|
|
282
|
+
if (
|
|
283
|
+
type(self.replicate_index) is not int
|
|
284
|
+
or self.replicate_index < 0
|
|
285
|
+
or self.replicate_index >= len(canonical)
|
|
286
|
+
):
|
|
287
|
+
raise ValueError(
|
|
288
|
+
"replicate_index must be an exact integer within the no-replacement schedule"
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
@property
|
|
292
|
+
def block_count(self) -> int:
|
|
293
|
+
return len(self.blocks)
|
|
294
|
+
|
|
295
|
+
def schedule_basis_record(self) -> dict[str, object]:
|
|
296
|
+
self.__post_init__()
|
|
297
|
+
return {
|
|
298
|
+
"schema_version": 2,
|
|
299
|
+
"benchmark_id": self.benchmark_id,
|
|
300
|
+
"task_sha256": self.task_sha256,
|
|
301
|
+
"finite_contract_identity_sha256": (
|
|
302
|
+
self.finite_contract_identity_sha256
|
|
303
|
+
),
|
|
304
|
+
"partition_layout_sha256": self.partition_layout_sha256,
|
|
305
|
+
"eligible_mask_sha256": self.eligible_mask.mask_sha256,
|
|
306
|
+
"public_seed": self.public_seed,
|
|
307
|
+
"block_count": self.block_count,
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
311
|
+
return {
|
|
312
|
+
"schema_version": 2,
|
|
313
|
+
"policy": self.policy.to_record(),
|
|
314
|
+
"schedule_basis": self.schedule_basis_record(),
|
|
315
|
+
"eligible_mask": self.eligible_mask.to_record(),
|
|
316
|
+
"public_seed_source_sha256": self.public_seed_source_sha256,
|
|
317
|
+
"canonical_blocks": [value.to_record() for value in self.blocks],
|
|
318
|
+
"replicate_index": self.replicate_index,
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
@property
|
|
322
|
+
def request_sha256(self) -> str:
|
|
323
|
+
return _hash(_REQUEST_FRAMING, self._unsigned_record())
|
|
324
|
+
|
|
325
|
+
def to_record(self) -> dict[str, object]:
|
|
326
|
+
return {**self._unsigned_record(), "request_sha256": self.request_sha256}
|
|
327
|
+
|
|
328
|
+
def __eq__(self, other: object) -> bool:
|
|
329
|
+
return (
|
|
330
|
+
type(other) is PairedBlockScheduleRequest
|
|
331
|
+
and self.request_sha256 == other.request_sha256
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
__hash__ = None
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
@dataclass(frozen=True, slots=True)
|
|
338
|
+
class RankedBlockIdentity:
|
|
339
|
+
"""One block's immutable position in a hash-ranked full schedule."""
|
|
340
|
+
|
|
341
|
+
schedule_position: int
|
|
342
|
+
block: CanonicalBlockIdentity
|
|
343
|
+
rank_digest_sha256: str
|
|
344
|
+
|
|
345
|
+
def __post_init__(self) -> None:
|
|
346
|
+
if type(self.schedule_position) is not int or self.schedule_position < 0:
|
|
347
|
+
raise ValueError(
|
|
348
|
+
"schedule_position must be a non-negative exact integer"
|
|
349
|
+
)
|
|
350
|
+
if type(self.block) is not CanonicalBlockIdentity:
|
|
351
|
+
raise TypeError("block must be an exact CanonicalBlockIdentity")
|
|
352
|
+
self.block.__post_init__()
|
|
353
|
+
require_sha256(self.rank_digest_sha256, "rank_digest_sha256")
|
|
354
|
+
|
|
355
|
+
def to_record(self) -> dict[str, object]:
|
|
356
|
+
self.__post_init__()
|
|
357
|
+
return {
|
|
358
|
+
"schema_version": 1,
|
|
359
|
+
"schedule_position": self.schedule_position,
|
|
360
|
+
"block": self.block.to_record(),
|
|
361
|
+
"rank_digest_sha256": self.rank_digest_sha256,
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
366
|
+
class PairedBlockScheduleResult:
|
|
367
|
+
"""Authenticated complete schedule and one replicate's selected block."""
|
|
368
|
+
|
|
369
|
+
request: PairedBlockScheduleRequest
|
|
370
|
+
ranked_blocks: tuple[RankedBlockIdentity, ...]
|
|
371
|
+
|
|
372
|
+
def __post_init__(self) -> None:
|
|
373
|
+
if type(self.request) is not PairedBlockScheduleRequest:
|
|
374
|
+
raise TypeError("request must be an exact PairedBlockScheduleRequest")
|
|
375
|
+
self.request.__post_init__()
|
|
376
|
+
if type(self.ranked_blocks) is not tuple or len(self.ranked_blocks) != (
|
|
377
|
+
self.request.block_count
|
|
378
|
+
):
|
|
379
|
+
raise ValueError("ranked_blocks must cover the complete block schedule")
|
|
380
|
+
if any(type(value) is not RankedBlockIdentity for value in self.ranked_blocks):
|
|
381
|
+
raise TypeError("ranked_blocks must contain exact RankedBlockIdentity values")
|
|
382
|
+
for expected_position, value in enumerate(self.ranked_blocks):
|
|
383
|
+
value.__post_init__()
|
|
384
|
+
if value.schedule_position != expected_position:
|
|
385
|
+
raise ValueError("ranked blocks must use canonical schedule positions")
|
|
386
|
+
if tuple(
|
|
387
|
+
sorted(value.block.identity_sha256 for value in self.ranked_blocks)
|
|
388
|
+
) != tuple(sorted(value.identity_sha256 for value in self.request.blocks)):
|
|
389
|
+
raise ValueError("ranked blocks differ from the complete request partition")
|
|
390
|
+
if tuple(
|
|
391
|
+
(value.rank_digest_sha256, value.block.block_index)
|
|
392
|
+
for value in self.ranked_blocks
|
|
393
|
+
) != tuple(
|
|
394
|
+
sorted(
|
|
395
|
+
(
|
|
396
|
+
value.rank_digest_sha256,
|
|
397
|
+
value.block.block_index,
|
|
398
|
+
)
|
|
399
|
+
for value in self.ranked_blocks
|
|
400
|
+
)
|
|
401
|
+
):
|
|
402
|
+
raise ValueError("ranked blocks are not in canonical hash-rank order")
|
|
403
|
+
|
|
404
|
+
@property
|
|
405
|
+
def block_schedule(self) -> tuple[int, ...]:
|
|
406
|
+
return tuple(value.block.block_index for value in self.ranked_blocks)
|
|
407
|
+
|
|
408
|
+
def full_schedule_record(self) -> dict[str, object]:
|
|
409
|
+
self.__post_init__()
|
|
410
|
+
return {
|
|
411
|
+
"schema_version": 2,
|
|
412
|
+
"policy": self.request.policy.to_record(),
|
|
413
|
+
"schedule_basis": self.request.schedule_basis_record(),
|
|
414
|
+
"public_seed_source_sha256": (
|
|
415
|
+
self.request.public_seed_source_sha256
|
|
416
|
+
),
|
|
417
|
+
"ranked_blocks": [value.to_record() for value in self.ranked_blocks],
|
|
418
|
+
"block_schedule": list(self.block_schedule),
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def full_schedule_sha256(self) -> str:
|
|
423
|
+
return _hash(_FULL_SCHEDULE_FRAMING, self.full_schedule_record())
|
|
424
|
+
|
|
425
|
+
@property
|
|
426
|
+
def selected_ranked_block(self) -> RankedBlockIdentity:
|
|
427
|
+
return self.ranked_blocks[self.request.replicate_index]
|
|
428
|
+
|
|
429
|
+
def selected_block_record(self) -> dict[str, object]:
|
|
430
|
+
selected = self.selected_ranked_block
|
|
431
|
+
return {
|
|
432
|
+
"schema_version": 2,
|
|
433
|
+
"request_sha256": self.request.request_sha256,
|
|
434
|
+
"full_schedule_sha256": self.full_schedule_sha256,
|
|
435
|
+
"replicate_index": self.request.replicate_index,
|
|
436
|
+
"schedule_position": selected.schedule_position,
|
|
437
|
+
"selected_block": selected.block.to_record(),
|
|
438
|
+
"rank_digest_sha256": selected.rank_digest_sha256,
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
@property
|
|
442
|
+
def selected_block_receipt_sha256(self) -> str:
|
|
443
|
+
return _hash(_SELECTED_BLOCK_FRAMING, self.selected_block_record())
|
|
444
|
+
|
|
445
|
+
def to_record(self) -> dict[str, object]:
|
|
446
|
+
return {
|
|
447
|
+
"schema_version": 2,
|
|
448
|
+
"request": self.request.to_record(),
|
|
449
|
+
"full_schedule": self.full_schedule_record(),
|
|
450
|
+
"full_schedule_sha256": self.full_schedule_sha256,
|
|
451
|
+
"selection": self.selected_block_record(),
|
|
452
|
+
"selected_block_receipt_sha256": (
|
|
453
|
+
self.selected_block_receipt_sha256
|
|
454
|
+
),
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
def __eq__(self, other: object) -> bool:
|
|
458
|
+
return (
|
|
459
|
+
type(other) is PairedBlockScheduleResult
|
|
460
|
+
and self.selected_block_receipt_sha256
|
|
461
|
+
== other.selected_block_receipt_sha256
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
__hash__ = None
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
__all__ = [
|
|
468
|
+
"CanonicalBlockIdentity",
|
|
469
|
+
"ELIGIBLE_ROW_MASK_DOMAIN",
|
|
470
|
+
"ExactEligibleRowMask",
|
|
471
|
+
"PairedBlockSchedulePolicyBinding",
|
|
472
|
+
"PairedBlockScheduleRequest",
|
|
473
|
+
"PairedBlockScheduleResult",
|
|
474
|
+
"RankedBlockIdentity",
|
|
475
|
+
]
|