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,17 @@
|
|
|
1
|
+
"""Scientific policies for turning raw measurements into decision values."""
|
|
2
|
+
|
|
3
|
+
from agent_evolve.policies.objective_resolution.fixed_grid import (
|
|
4
|
+
FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_ID,
|
|
5
|
+
FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_VERSION,
|
|
6
|
+
FixedGridMetricSpec,
|
|
7
|
+
FixedGridObjectiveResolution,
|
|
8
|
+
FixedGridRoundingLaw,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_ID",
|
|
13
|
+
"FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_VERSION",
|
|
14
|
+
"FixedGridMetricSpec",
|
|
15
|
+
"FixedGridObjectiveResolution",
|
|
16
|
+
"FixedGridRoundingLaw",
|
|
17
|
+
]
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"""Workload-neutral fixed-decimal-grid objective resolution.
|
|
2
|
+
|
|
3
|
+
Evaluators retain authority over raw physical measurements. This policy only
|
|
4
|
+
defines the coarser values on which optimization decisions are made. Each
|
|
5
|
+
metric has a prospectively declared decimal origin, positive decimal quantum,
|
|
6
|
+
and nearest-neighbour tie law. Candidate configuration and objective goal are
|
|
7
|
+
deliberately outside the transform, so neither can silently change resolution.
|
|
8
|
+
|
|
9
|
+
The implementation uses exact integer arithmetic. It first interprets a
|
|
10
|
+
finite Python float through its shortest round-trip decimal text, then rounds
|
|
11
|
+
the resulting exact rational grid index. It therefore does not depend on the
|
|
12
|
+
process-global :mod:`decimal` context.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import hashlib
|
|
18
|
+
import json
|
|
19
|
+
import math
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from decimal import Decimal
|
|
22
|
+
from enum import Enum
|
|
23
|
+
|
|
24
|
+
from agent_evolve.domain.typed_json import FrozenJsonObject, freeze_json
|
|
25
|
+
from agent_evolve.ports.objective_resolution import (
|
|
26
|
+
ObjectiveResolutionRequest,
|
|
27
|
+
ObjectiveResolutionResult,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_ID = "fixed_decimal_grid_objectives"
|
|
32
|
+
FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_VERSION = 1
|
|
33
|
+
|
|
34
|
+
_DEFINITION_DOMAIN = b"agent-evolve:fixed-decimal-grid-objectives:def:v1\x00"
|
|
35
|
+
_FLOAT_DECIMAL_CONVERSION = "python_float_shortest_round_trip_decimal_text_v1"
|
|
36
|
+
_CONFIGURATION_DEPENDENCE = "none"
|
|
37
|
+
_MAX_DECIMAL_DIGITS = 128
|
|
38
|
+
_MAX_DECIMAL_ABS_EXPONENT = 1_024
|
|
39
|
+
_MAX_METRIC_ID_BYTES = 512
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _canonical_json(value: object) -> bytes:
|
|
43
|
+
return json.dumps(
|
|
44
|
+
value,
|
|
45
|
+
allow_nan=False,
|
|
46
|
+
ensure_ascii=True,
|
|
47
|
+
separators=(",", ":"),
|
|
48
|
+
sort_keys=True,
|
|
49
|
+
).encode("ascii", errors="strict")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _metric_sort_key(metric_id: str) -> bytes:
|
|
53
|
+
return metric_id.encode("utf-8", errors="strict")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _require_metric_id(value: object) -> str:
|
|
57
|
+
if type(value) is not str or not value or value != value.strip():
|
|
58
|
+
raise ValueError("metric_id must be a non-empty canonical string")
|
|
59
|
+
try:
|
|
60
|
+
encoded = value.encode("utf-8", errors="strict")
|
|
61
|
+
except UnicodeEncodeError as exc:
|
|
62
|
+
raise ValueError("metric_id must be valid UTF-8 text") from exc
|
|
63
|
+
if len(encoded) > _MAX_METRIC_ID_BYTES:
|
|
64
|
+
raise ValueError("metric_id exceeds the bounded identifier policy")
|
|
65
|
+
return value
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _require_decimal(value: object, *, name: str) -> Decimal:
|
|
69
|
+
if type(value) is not Decimal or not value.is_finite():
|
|
70
|
+
raise TypeError(f"{name} must be an exact finite Decimal")
|
|
71
|
+
decimal_tuple = value.as_tuple()
|
|
72
|
+
if (
|
|
73
|
+
len(decimal_tuple.digits) > _MAX_DECIMAL_DIGITS
|
|
74
|
+
or type(decimal_tuple.exponent) is not int
|
|
75
|
+
or not (
|
|
76
|
+
-_MAX_DECIMAL_ABS_EXPONENT
|
|
77
|
+
<= decimal_tuple.exponent
|
|
78
|
+
<= _MAX_DECIMAL_ABS_EXPONENT
|
|
79
|
+
)
|
|
80
|
+
):
|
|
81
|
+
raise ValueError(f"{name} exceeds the bounded decimal policy")
|
|
82
|
+
return value
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _decimal_components(value: Decimal) -> tuple[int, int]:
|
|
86
|
+
"""Return exact ``coefficient, exponent`` with trailing zeros removed."""
|
|
87
|
+
|
|
88
|
+
decimal_tuple = value.as_tuple()
|
|
89
|
+
exponent = decimal_tuple.exponent
|
|
90
|
+
if type(exponent) is not int: # already rejected at the public boundary
|
|
91
|
+
raise TypeError("finite Decimal exponent must be an exact integer")
|
|
92
|
+
coefficient = 0
|
|
93
|
+
for digit in decimal_tuple.digits:
|
|
94
|
+
coefficient = coefficient * 10 + digit
|
|
95
|
+
if decimal_tuple.sign:
|
|
96
|
+
coefficient = -coefficient
|
|
97
|
+
if coefficient == 0:
|
|
98
|
+
return 0, 0
|
|
99
|
+
while coefficient % 10 == 0:
|
|
100
|
+
coefficient //= 10
|
|
101
|
+
exponent += 1
|
|
102
|
+
return coefficient, exponent
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _canonical_decimal_text(value: Decimal) -> str:
|
|
106
|
+
coefficient, exponent = _decimal_components(value)
|
|
107
|
+
if coefficient == 0:
|
|
108
|
+
return "0"
|
|
109
|
+
sign = "-" if coefficient < 0 else ""
|
|
110
|
+
digits = str(abs(coefficient))
|
|
111
|
+
if exponent >= 0:
|
|
112
|
+
return sign + digits + "0" * exponent
|
|
113
|
+
point = len(digits) + exponent
|
|
114
|
+
if point > 0:
|
|
115
|
+
return sign + digits[:point] + "." + digits[point:]
|
|
116
|
+
return sign + "0." + "0" * (-point) + digits
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _decimal_from_components(coefficient: int, exponent: int) -> Decimal:
|
|
120
|
+
if coefficient == 0:
|
|
121
|
+
return Decimal(0)
|
|
122
|
+
sign = 1 if coefficient < 0 else 0
|
|
123
|
+
digits = tuple(int(digit) for digit in str(abs(coefficient)))
|
|
124
|
+
return Decimal((sign, digits, exponent))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _common_integer_components(
|
|
128
|
+
*values: Decimal,
|
|
129
|
+
) -> tuple[tuple[int, ...], int]:
|
|
130
|
+
components = tuple(_decimal_components(value) for value in values)
|
|
131
|
+
common_exponent = min(exponent for _, exponent in components)
|
|
132
|
+
integers = tuple(
|
|
133
|
+
coefficient * 10 ** (exponent - common_exponent)
|
|
134
|
+
for coefficient, exponent in components
|
|
135
|
+
)
|
|
136
|
+
return integers, common_exponent
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class FixedGridRoundingLaw(str, Enum):
|
|
140
|
+
"""Closed nearest-grid tie semantics.
|
|
141
|
+
|
|
142
|
+
Both laws choose the nearest grid point away from exact ties. At an exact
|
|
143
|
+
half-grid boundary, ``NEAREST_TIES_TO_EVEN`` chooses an even integer grid
|
|
144
|
+
index while ``NEAREST_TIES_AWAY_FROM_ZERO`` increases its magnitude.
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
NEAREST_TIES_TO_EVEN = "nearest_ties_to_even"
|
|
148
|
+
NEAREST_TIES_AWAY_FROM_ZERO = "nearest_ties_away_from_zero"
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@dataclass(frozen=True, slots=True)
|
|
152
|
+
class FixedGridMetricSpec:
|
|
153
|
+
"""One metric's exact benchmark-declared decision grid."""
|
|
154
|
+
|
|
155
|
+
metric_id: str
|
|
156
|
+
decimal_origin: Decimal
|
|
157
|
+
decimal_quantum: Decimal
|
|
158
|
+
rounding_law: FixedGridRoundingLaw
|
|
159
|
+
|
|
160
|
+
def __post_init__(self) -> None:
|
|
161
|
+
_require_metric_id(self.metric_id)
|
|
162
|
+
_require_decimal(self.decimal_origin, name="decimal_origin")
|
|
163
|
+
quantum = _require_decimal(self.decimal_quantum, name="decimal_quantum")
|
|
164
|
+
if quantum <= 0:
|
|
165
|
+
raise ValueError("decimal_quantum must be strictly positive")
|
|
166
|
+
if type(self.rounding_law) is not FixedGridRoundingLaw:
|
|
167
|
+
raise TypeError("rounding_law must be an exact FixedGridRoundingLaw")
|
|
168
|
+
|
|
169
|
+
def revalidate(self) -> None:
|
|
170
|
+
if type(self) is not FixedGridMetricSpec:
|
|
171
|
+
raise TypeError("metric grid must be an exact FixedGridMetricSpec")
|
|
172
|
+
FixedGridMetricSpec.__post_init__(self)
|
|
173
|
+
|
|
174
|
+
def to_record(self) -> dict[str, str]:
|
|
175
|
+
self.revalidate()
|
|
176
|
+
return {
|
|
177
|
+
"metric_id": self.metric_id,
|
|
178
|
+
"decimal_origin": _canonical_decimal_text(self.decimal_origin),
|
|
179
|
+
"decimal_quantum": _canonical_decimal_text(self.decimal_quantum),
|
|
180
|
+
"rounding_law": self.rounding_law.value,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _rounded_grid_index(
|
|
185
|
+
*,
|
|
186
|
+
value: Decimal,
|
|
187
|
+
spec: FixedGridMetricSpec,
|
|
188
|
+
) -> int:
|
|
189
|
+
integers, _ = _common_integer_components(
|
|
190
|
+
value,
|
|
191
|
+
spec.decimal_origin,
|
|
192
|
+
spec.decimal_quantum,
|
|
193
|
+
)
|
|
194
|
+
value_integer, origin_integer, quantum_integer = integers
|
|
195
|
+
numerator = value_integer - origin_integer
|
|
196
|
+
sign = -1 if numerator < 0 else 1
|
|
197
|
+
magnitude, remainder = divmod(abs(numerator), quantum_integer)
|
|
198
|
+
twice_remainder = 2 * remainder
|
|
199
|
+
if twice_remainder > quantum_integer:
|
|
200
|
+
magnitude += 1
|
|
201
|
+
elif twice_remainder == quantum_integer:
|
|
202
|
+
if spec.rounding_law is FixedGridRoundingLaw.NEAREST_TIES_AWAY_FROM_ZERO:
|
|
203
|
+
magnitude += 1
|
|
204
|
+
elif magnitude % 2 == 1:
|
|
205
|
+
magnitude += 1
|
|
206
|
+
return sign * magnitude
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _grid_value(spec: FixedGridMetricSpec, grid_index: int) -> Decimal:
|
|
210
|
+
integers, common_exponent = _common_integer_components(
|
|
211
|
+
spec.decimal_origin,
|
|
212
|
+
spec.decimal_quantum,
|
|
213
|
+
)
|
|
214
|
+
origin_integer, quantum_integer = integers
|
|
215
|
+
return _decimal_from_components(
|
|
216
|
+
origin_integer + grid_index * quantum_integer,
|
|
217
|
+
common_exponent,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
@dataclass(frozen=True, slots=True)
|
|
222
|
+
class FixedGridObjectiveResolution:
|
|
223
|
+
"""Resolve every declared objective onto a fixed decimal measurement grid.
|
|
224
|
+
|
|
225
|
+
``metric_specs`` use UTF-8 bytewise metric order. At resolution time they
|
|
226
|
+
must cover exactly the request's objective IDs. Decision values always
|
|
227
|
+
follow the objective declaration order required by the port.
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
metric_specs: tuple[FixedGridMetricSpec, ...]
|
|
231
|
+
policy_id: str = field(
|
|
232
|
+
init=False,
|
|
233
|
+
default=FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_ID,
|
|
234
|
+
)
|
|
235
|
+
policy_version: int = field(
|
|
236
|
+
init=False,
|
|
237
|
+
default=FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_VERSION,
|
|
238
|
+
)
|
|
239
|
+
definition_sha256: str = field(init=False, default="")
|
|
240
|
+
|
|
241
|
+
def __post_init__(self) -> None:
|
|
242
|
+
if type(self.metric_specs) is not tuple or not self.metric_specs:
|
|
243
|
+
raise ValueError("metric_specs must be a non-empty exact tuple")
|
|
244
|
+
if any(type(spec) is not FixedGridMetricSpec for spec in self.metric_specs):
|
|
245
|
+
raise TypeError("metric_specs must contain exact FixedGridMetricSpec values")
|
|
246
|
+
for spec in self.metric_specs:
|
|
247
|
+
spec.revalidate()
|
|
248
|
+
metric_ids = tuple(spec.metric_id for spec in self.metric_specs)
|
|
249
|
+
if len(set(metric_ids)) != len(metric_ids):
|
|
250
|
+
raise ValueError("metric_specs cannot repeat a metric_id")
|
|
251
|
+
if metric_ids != tuple(sorted(metric_ids, key=_metric_sort_key)):
|
|
252
|
+
raise ValueError("metric_specs must use canonical UTF-8 metric order")
|
|
253
|
+
definition = {
|
|
254
|
+
"schema_version": 1,
|
|
255
|
+
"policy_id": self.policy_id,
|
|
256
|
+
"policy_version": self.policy_version,
|
|
257
|
+
"float_decimal_conversion": _FLOAT_DECIMAL_CONVERSION,
|
|
258
|
+
"configuration_dependence": _CONFIGURATION_DEPENDENCE,
|
|
259
|
+
"metric_specs": [spec.to_record() for spec in self.metric_specs],
|
|
260
|
+
}
|
|
261
|
+
computed = hashlib.sha256(
|
|
262
|
+
_DEFINITION_DOMAIN + _canonical_json(definition)
|
|
263
|
+
).hexdigest()
|
|
264
|
+
if self.definition_sha256 not in ("", computed):
|
|
265
|
+
raise ValueError("definition_sha256 differs from the fixed-grid policy")
|
|
266
|
+
object.__setattr__(self, "definition_sha256", computed)
|
|
267
|
+
|
|
268
|
+
def revalidate(self) -> None:
|
|
269
|
+
if type(self) is not FixedGridObjectiveResolution:
|
|
270
|
+
raise TypeError("policy must be an exact FixedGridObjectiveResolution")
|
|
271
|
+
FixedGridObjectiveResolution.__post_init__(self)
|
|
272
|
+
|
|
273
|
+
def to_record(self) -> dict[str, object]:
|
|
274
|
+
self.revalidate()
|
|
275
|
+
return {
|
|
276
|
+
"policy_id": self.policy_id,
|
|
277
|
+
"policy_version": self.policy_version,
|
|
278
|
+
"definition_sha256": self.definition_sha256,
|
|
279
|
+
"float_decimal_conversion": _FLOAT_DECIMAL_CONVERSION,
|
|
280
|
+
"configuration_dependence": _CONFIGURATION_DEPENDENCE,
|
|
281
|
+
"metric_specs": [spec.to_record() for spec in self.metric_specs],
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
def resolve(
|
|
285
|
+
self,
|
|
286
|
+
request: ObjectiveResolutionRequest,
|
|
287
|
+
) -> ObjectiveResolutionResult:
|
|
288
|
+
self.revalidate()
|
|
289
|
+
if type(request) is not ObjectiveResolutionRequest:
|
|
290
|
+
raise TypeError("request must be an exact ObjectiveResolutionRequest")
|
|
291
|
+
ObjectiveResolutionRequest.__post_init__(request)
|
|
292
|
+
requested_ids = tuple(objective.name for objective in request.objectives)
|
|
293
|
+
configured_ids = tuple(spec.metric_id for spec in self.metric_specs)
|
|
294
|
+
requested_set = set(requested_ids)
|
|
295
|
+
configured_set = set(configured_ids)
|
|
296
|
+
if requested_set != configured_set:
|
|
297
|
+
missing = sorted(requested_set - configured_set, key=_metric_sort_key)
|
|
298
|
+
extra = sorted(configured_set - requested_set, key=_metric_sort_key)
|
|
299
|
+
details: list[str] = []
|
|
300
|
+
if missing:
|
|
301
|
+
details.append("missing=" + ",".join(missing))
|
|
302
|
+
if extra:
|
|
303
|
+
details.append("extra=" + ",".join(extra))
|
|
304
|
+
raise ValueError(
|
|
305
|
+
"metric_specs must cover every objective exactly ("
|
|
306
|
+
+ "; ".join(details)
|
|
307
|
+
+ ")"
|
|
308
|
+
)
|
|
309
|
+
spec_by_metric = {spec.metric_id: spec for spec in self.metric_specs}
|
|
310
|
+
raw_by_metric = dict(request.raw_objectives)
|
|
311
|
+
decision_values: list[tuple[str, float]] = []
|
|
312
|
+
metric_evidence: list[dict[str, object]] = []
|
|
313
|
+
for metric_id in requested_ids:
|
|
314
|
+
spec = spec_by_metric[metric_id]
|
|
315
|
+
raw_value = raw_by_metric[metric_id]
|
|
316
|
+
input_decimal = Decimal(str(raw_value))
|
|
317
|
+
grid_index = _rounded_grid_index(value=input_decimal, spec=spec)
|
|
318
|
+
resolved_decimal = _grid_value(spec, grid_index)
|
|
319
|
+
decision_value = float(resolved_decimal)
|
|
320
|
+
if not math.isfinite(decision_value):
|
|
321
|
+
raise ValueError(
|
|
322
|
+
f"resolved grid value for {metric_id!r} is not a finite float"
|
|
323
|
+
)
|
|
324
|
+
if resolved_decimal.is_zero():
|
|
325
|
+
decision_value = 0.0
|
|
326
|
+
decision_values.append((metric_id, decision_value))
|
|
327
|
+
metric_evidence.append(
|
|
328
|
+
{
|
|
329
|
+
**spec.to_record(),
|
|
330
|
+
"raw_value_hex": raw_value.hex(),
|
|
331
|
+
"input_decimal": _canonical_decimal_text(input_decimal),
|
|
332
|
+
"grid_index": str(grid_index),
|
|
333
|
+
"resolved_decimal": _canonical_decimal_text(resolved_decimal),
|
|
334
|
+
"decision_value_hex": decision_value.hex(),
|
|
335
|
+
"changed": raw_value.hex() != decision_value.hex(),
|
|
336
|
+
}
|
|
337
|
+
)
|
|
338
|
+
evidence = freeze_json(
|
|
339
|
+
{
|
|
340
|
+
"schema_version": 1,
|
|
341
|
+
"policy_id": self.policy_id,
|
|
342
|
+
"policy_version": self.policy_version,
|
|
343
|
+
"definition_sha256": self.definition_sha256,
|
|
344
|
+
"float_decimal_conversion": _FLOAT_DECIMAL_CONVERSION,
|
|
345
|
+
"configuration_dependence": _CONFIGURATION_DEPENDENCE,
|
|
346
|
+
"metrics": metric_evidence,
|
|
347
|
+
}
|
|
348
|
+
)
|
|
349
|
+
if type(evidence) is not FrozenJsonObject:
|
|
350
|
+
raise TypeError("fixed-grid evidence must freeze to an object")
|
|
351
|
+
return ObjectiveResolutionResult(
|
|
352
|
+
request_sha256=request.request_sha256,
|
|
353
|
+
decision_objectives=tuple(decision_values),
|
|
354
|
+
evidence=evidence,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
__all__ = [
|
|
359
|
+
"FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_ID",
|
|
360
|
+
"FIXED_GRID_OBJECTIVE_RESOLUTION_POLICY_VERSION",
|
|
361
|
+
"FixedGridMetricSpec",
|
|
362
|
+
"FixedGridObjectiveResolution",
|
|
363
|
+
"FixedGridRoundingLaw",
|
|
364
|
+
]
|