agentinputlab 0.1.0a1__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.
- agentinputlab/__init__.py +28 -0
- agentinputlab/algorithms/__init__.py +6 -0
- agentinputlab/algorithms/acquire/__init__.py +145 -0
- agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
- agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
- agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
- agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
- agentinputlab/algorithms/acquire/hyde.py +296 -0
- agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
- agentinputlab/algorithms/acquire/hyde_external.py +148 -0
- agentinputlab/algorithms/acquire/ircot.py +28 -0
- agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
- agentinputlab/algorithms/acquire/ircot_native.py +355 -0
- agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
- agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
- agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
- agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
- agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
- agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
- agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
- agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
- agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
- agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
- agentinputlab/algorithms/clarify/__init__.py +61 -0
- agentinputlab/algorithms/clarify/_structured.py +64 -0
- agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
- agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
- agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
- agentinputlab/algorithms/clarify/future_turns.py +379 -0
- agentinputlab/algorithms/clarify/udcs.py +255 -0
- agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
- agentinputlab/algorithms/curate/__init__.py +65 -0
- agentinputlab/algorithms/curate/acon/__init__.py +27 -0
- agentinputlab/algorithms/curate/acon/common.py +284 -0
- agentinputlab/algorithms/curate/acon/common_support.py +136 -0
- agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
- agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
- agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
- agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
- agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
- agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
- agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
- agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
- agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
- agentinputlab/algorithms/curate/recomp/external.py +1129 -0
- agentinputlab/algorithms/curate/recomp/selective.py +304 -0
- agentinputlab/algorithms/decompose/__init__.py +107 -0
- agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
- agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
- agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
- agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
- agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
- agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
- agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
- agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
- agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
- agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
- agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
- agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
- agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
- agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
- agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
- agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
- agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
- agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
- agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
- agentinputlab/algorithms/reformulate/__init__.py +85 -0
- agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
- agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
- agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
- agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
- agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
- agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
- agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
- agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
- agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
- agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
- agentinputlab/algorithms/reformulate/rrr.py +696 -0
- agentinputlab/annotation/__init__.py +5 -0
- agentinputlab/annotation/independent.py +428 -0
- agentinputlab/annotation/server.py +233 -0
- agentinputlab/annotation/static/app.js +121 -0
- agentinputlab/annotation/static/index.html +60 -0
- agentinputlab/annotation/static/review.css +2 -0
- agentinputlab/annotation/static/review.html +10 -0
- agentinputlab/annotation/static/review.js +11 -0
- agentinputlab/annotation/static/styles.css +55 -0
- agentinputlab/annotation/store.py +444 -0
- agentinputlab/api.py +368 -0
- agentinputlab/artifacts/__init__.py +15 -0
- agentinputlab/artifacts/json_file.py +104 -0
- agentinputlab/artifacts/manifest.py +98 -0
- agentinputlab/artifacts/store.py +157 -0
- agentinputlab/backends/__init__.py +98 -0
- agentinputlab/backends/embedding/__init__.py +25 -0
- agentinputlab/backends/embedding/base.py +145 -0
- agentinputlab/backends/embedding/callable.py +75 -0
- agentinputlab/backends/embedding/replay.py +129 -0
- agentinputlab/backends/llm/__init__.py +31 -0
- agentinputlab/backends/llm/base.py +149 -0
- agentinputlab/backends/llm/callable.py +108 -0
- agentinputlab/backends/llm/decomp_completion.py +88 -0
- agentinputlab/backends/llm/final_content_stop.py +72 -0
- agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
- agentinputlab/backends/llm/openai_compatible.py +332 -0
- agentinputlab/backends/llm/transformers.py +171 -0
- agentinputlab/backends/retrieval/__init__.py +35 -0
- agentinputlab/backends/retrieval/base.py +50 -0
- agentinputlab/backends/retrieval/dense.py +777 -0
- agentinputlab/backends/retrieval/memory.py +119 -0
- agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
- agentinputlab/backends/user/__init__.py +15 -0
- agentinputlab/backends/user/base.py +66 -0
- agentinputlab/backends/user/callable.py +54 -0
- agentinputlab/backends/user/replay.py +89 -0
- agentinputlab/backends/vector.py +38 -0
- agentinputlab/benchmarks/__init__.py +246 -0
- agentinputlab/benchmarks/acquisition.py +106 -0
- agentinputlab/benchmarks/ale.py +540 -0
- agentinputlab/benchmarks/appworld_ul.py +669 -0
- agentinputlab/benchmarks/assets.py +226 -0
- agentinputlab/benchmarks/base.py +68 -0
- agentinputlab/benchmarks/beir_archive.py +235 -0
- agentinputlab/benchmarks/beir_sample.py +269 -0
- agentinputlab/benchmarks/bfcl_native.py +245 -0
- agentinputlab/benchmarks/bfcl_v3.py +607 -0
- agentinputlab/benchmarks/cache.py +218 -0
- agentinputlab/benchmarks/clariq.py +203 -0
- agentinputlab/benchmarks/data/registry.json +321 -0
- agentinputlab/benchmarks/data/smoke_assets.json +511 -0
- agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
- agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
- agentinputlab/benchmarks/execution.py +1111 -0
- agentinputlab/benchmarks/interactive.py +257 -0
- agentinputlab/benchmarks/ir_query.py +204 -0
- agentinputlab/benchmarks/longbench.py +203 -0
- agentinputlab/benchmarks/paired_replay.py +479 -0
- agentinputlab/benchmarks/preprocess.py +2313 -0
- agentinputlab/benchmarks/production.py +236 -0
- agentinputlab/benchmarks/qa.py +963 -0
- agentinputlab/benchmarks/registry.py +110 -0
- agentinputlab/benchmarks/retrieval.py +459 -0
- agentinputlab/benchmarks/runtime.py +509 -0
- agentinputlab/benchmarks/statebench.py +938 -0
- agentinputlab/benchmarks/tau3.py +725 -0
- agentinputlab/benchmarks/toolsandbox.py +626 -0
- agentinputlab/benchmarks/trec_dl_sample.py +263 -0
- agentinputlab/campaign.py +654 -0
- agentinputlab/campaign_runner.py +953 -0
- agentinputlab/cli/__init__.py +6 -0
- agentinputlab/cli/main.py +933 -0
- agentinputlab/connectors/__init__.py +46 -0
- agentinputlab/connectors/knowledge/__init__.py +4 -0
- agentinputlab/connectors/tools/__init__.py +30 -0
- agentinputlab/connectors/tools/base.py +57 -0
- agentinputlab/connectors/tools/mcp.py +222 -0
- agentinputlab/connectors/tools/memory.py +41 -0
- agentinputlab/connectors/tools/openapi.py +695 -0
- agentinputlab/connectors/tools/schema.py +102 -0
- agentinputlab/contracts/__init__.py +91 -0
- agentinputlab/contracts/availability.py +24 -0
- agentinputlab/contracts/dependency.py +58 -0
- agentinputlab/contracts/enums.py +82 -0
- agentinputlab/contracts/errors.py +63 -0
- agentinputlab/contracts/evidence.py +43 -0
- agentinputlab/contracts/intent.py +110 -0
- agentinputlab/contracts/lifecycle.py +164 -0
- agentinputlab/contracts/patch.py +167 -0
- agentinputlab/contracts/serialization.py +93 -0
- agentinputlab/contracts/state.py +127 -0
- agentinputlab/contracts/trace.py +59 -0
- agentinputlab/contracts/worker.py +42 -0
- agentinputlab/core/__init__.py +7 -0
- agentinputlab/data/__init__.py +32 -0
- agentinputlab/data/checksums.py +9 -0
- agentinputlab/data/downloader.py +235 -0
- agentinputlab/data/http.py +171 -0
- agentinputlab/data/index.py +21 -0
- agentinputlab/data/overlap.py +28 -0
- agentinputlab/data/preprocess.py +32 -0
- agentinputlab/data/storage.py +57 -0
- agentinputlab/data/trec_sample.py +427 -0
- agentinputlab/evaluation/__init__.py +5 -0
- agentinputlab/evaluation/outcomes.py +32 -0
- agentinputlab/experiments/__init__.py +278 -0
- agentinputlab/experiments/analysis.py +981 -0
- agentinputlab/experiments/artifacts.py +687 -0
- agentinputlab/experiments/automatic_measurement.py +678 -0
- agentinputlab/experiments/auxiliary_matrix.py +203 -0
- agentinputlab/experiments/bindings.py +430 -0
- agentinputlab/experiments/blueprints.py +147 -0
- agentinputlab/experiments/builders/__init__.py +45 -0
- agentinputlab/experiments/builders/executable_external_payload.py +423 -0
- agentinputlab/experiments/builders/external_process_arena.py +1018 -0
- agentinputlab/experiments/builders/registry_intervention.py +463 -0
- agentinputlab/experiments/cli.py +158 -0
- agentinputlab/experiments/controls.py +340 -0
- agentinputlab/experiments/driver_guard.py +205 -0
- agentinputlab/experiments/drivers/__init__.py +89 -0
- agentinputlab/experiments/drivers/external_arena.py +2908 -0
- agentinputlab/experiments/drivers/method_process.py +662 -0
- agentinputlab/experiments/drivers/parity_process.py +1484 -0
- agentinputlab/experiments/drivers/static_production.py +1574 -0
- agentinputlab/experiments/executor.py +448 -0
- agentinputlab/experiments/loader.py +605 -0
- agentinputlab/experiments/measurement.py +675 -0
- agentinputlab/experiments/paper_analysis.py +1818 -0
- agentinputlab/experiments/parity_identity.py +605 -0
- agentinputlab/experiments/plan.py +277 -0
- agentinputlab/experiments/production_builders.py +3739 -0
- agentinputlab/experiments/readiness.py +432 -0
- agentinputlab/experiments/schema.py +514 -0
- agentinputlab/experiments/secrets.py +177 -0
- agentinputlab/experiments/stateful_analysis.py +1738 -0
- agentinputlab/experiments/transfer_analysis.py +1316 -0
- agentinputlab/experiments/unseen_analysis.py +1025 -0
- agentinputlab/integrations/__init__.py +1 -0
- agentinputlab/integrations/action_space/__init__.py +1 -0
- agentinputlab/integrations/external_workers/__init__.py +76 -0
- agentinputlab/integrations/external_workers/ace.py +431 -0
- agentinputlab/integrations/external_workers/base.py +181 -0
- agentinputlab/integrations/external_workers/decomp_live.py +249 -0
- agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
- agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
- agentinputlab/integrations/external_workers/ircot.py +576 -0
- agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
- agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
- agentinputlab/integrations/external_workers/method.py +314 -0
- agentinputlab/integrations/external_workers/process.py +678 -0
- agentinputlab/integrations/external_workers/supervisor.py +1071 -0
- agentinputlab/integrations/full_architecture/__init__.py +1 -0
- agentinputlab/integrations/full_architecture/hyde.py +212 -0
- agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
- agentinputlab/integrations/live_history.py +222 -0
- agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
- agentinputlab/integrations/training/__init__.py +1 -0
- agentinputlab/metrics/__init__.py +50 -0
- agentinputlab/metrics/catalog.py +313 -0
- agentinputlab/metrics/harm.py +95 -0
- agentinputlab/metrics/paired.py +40 -0
- agentinputlab/metrics/qa.py +76 -0
- agentinputlab/metrics/text.py +33 -0
- agentinputlab/metrics/third_party.py +161 -0
- agentinputlab/models/__init__.py +4 -0
- agentinputlab/observability/__init__.py +56 -0
- agentinputlab/observability/budget.py +316 -0
- agentinputlab/observability/instrumentation.py +754 -0
- agentinputlab/observability/models.py +403 -0
- agentinputlab/observability/monitor.py +380 -0
- agentinputlab/optimizers/__init__.py +1 -0
- agentinputlab/optimizers/clarify/__init__.py +12 -0
- agentinputlab/optimizers/context/__init__.py +22 -0
- agentinputlab/optimizers/decompose/__init__.py +64 -0
- agentinputlab/optimizers/evidence/__init__.py +22 -0
- agentinputlab/optimizers/rewrite/__init__.py +30 -0
- agentinputlab/parity/__init__.py +5 -0
- agentinputlab/parity/base.py +206 -0
- agentinputlab/production_campaign.py +763 -0
- agentinputlab/py.typed +1 -0
- agentinputlab/recipes/__init__.py +333 -0
- agentinputlab/recipes/ace.py +418 -0
- agentinputlab/recipes/ace_bfcl.py +273 -0
- agentinputlab/recipes/ace_common_support.py +169 -0
- agentinputlab/recipes/ace_native_plan.py +322 -0
- agentinputlab/recipes/ace_online.py +711 -0
- agentinputlab/recipes/ace_retrieval.py +330 -0
- agentinputlab/recipes/ace_statebench.py +382 -0
- agentinputlab/recipes/ace_tau.py +463 -0
- agentinputlab/recipes/ace_toolsandbox.py +432 -0
- agentinputlab/recipes/acon_guideline.py +22 -0
- agentinputlab/recipes/adaptive_rag.py +822 -0
- agentinputlab/recipes/llmlingua2_inference.py +146 -0
- agentinputlab/recipes/llmlingua2_training.py +796 -0
- agentinputlab/recipes/mce.py +1486 -0
- agentinputlab/recipes/mce_final.py +335 -0
- agentinputlab/recipes/mce_text_fit.py +499 -0
- agentinputlab/recipes/mce_text_only.py +298 -0
- agentinputlab/recipes/qrag.py +729 -0
- agentinputlab/recipes/qrag_inference.py +364 -0
- agentinputlab/recipes/r2ag_features.py +236 -0
- agentinputlab/recipes/r2ag_inference.py +503 -0
- agentinputlab/recipes/r2ag_training.py +948 -0
- agentinputlab/recipes/recomp_abstractive.py +592 -0
- agentinputlab/recipes/recomp_extractive.py +525 -0
- agentinputlab/recipes/reformer.py +17 -0
- agentinputlab/recipes/rqrag.py +1516 -0
- agentinputlab/recipes/rqrag_common_support.py +193 -0
- agentinputlab/recipes/rqrag_completion.py +147 -0
- agentinputlab/recipes/skillopt.py +462 -0
- agentinputlab/recipes/skillopt_common_support.py +154 -0
- agentinputlab/recipes/skillopt_environment.py +165 -0
- agentinputlab/recipes/skillopt_environment_cli.py +5 -0
- agentinputlab/recipes/skillopt_retrieval.py +188 -0
- agentinputlab/recipes/smartsearch.py +897 -0
- agentinputlab/recipes/smartsearch_curriculum.py +283 -0
- agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
- agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
- agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
- agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
- agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
- agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
- agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
- agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
- agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
- agentinputlab/recipes/smartsearch_inference.py +524 -0
- agentinputlab/recipes/smartsearch_native_data.py +172 -0
- agentinputlab/recipes/smartsearch_policy.py +616 -0
- agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
- agentinputlab/recipes/smartsearch_sampling.py +232 -0
- agentinputlab/recipes/smartsearch_teacher.py +203 -0
- agentinputlab/recipes/smartsearch_training.py +265 -0
- agentinputlab/registry/__init__.py +46 -0
- agentinputlab/registry/beta.py +727 -0
- agentinputlab/registry/data/algorithms.json +1959 -0
- agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
- agentinputlab/registry/loader.py +100 -0
- agentinputlab/registry/result_manifest.py +184 -0
- agentinputlab/registry/runtime.py +195 -0
- agentinputlab/registry/schema.py +449 -0
- agentinputlab/runner/__init__.py +30 -0
- agentinputlab/runner/balance.py +248 -0
- agentinputlab/runner/cache.py +135 -0
- agentinputlab/runner/composite.py +130 -0
- agentinputlab/runner/engine.py +285 -0
- agentinputlab/runner/runtime_guard.py +268 -0
- agentinputlab/runner/worker.py +80 -0
- agentinputlab/runtime_bootstrap.py +288 -0
- agentinputlab/selectors/__init__.py +196 -0
- agentinputlab/selectors/advanced.py +1514 -0
- agentinputlab/selectors/artifacts.py +1087 -0
- agentinputlab/selectors/base.py +112 -0
- agentinputlab/selectors/campaigns.py +1893 -0
- agentinputlab/selectors/catalog.py +86 -0
- agentinputlab/selectors/discovery.py +1860 -0
- agentinputlab/selectors/evaluation.py +1348 -0
- agentinputlab/selectors/features.py +383 -0
- agentinputlab/selectors/learned.py +502 -0
- agentinputlab/selectors/no_op.py +28 -0
- agentinputlab/selectors/outcome_table.py +475 -0
- agentinputlab/selectors/producer.py +853 -0
- agentinputlab/selectors/rules.py +109 -0
- agentinputlab/selectors/runtime.py +420 -0
- agentinputlab/studies/__init__.py +16 -0
- agentinputlab/studies/design.py +165 -0
- agentinputlab/studies/paired.py +322 -0
- agentinputlab/studio/__init__.py +6 -0
- agentinputlab/studio/campaigns.py +819 -0
- agentinputlab/studio/engine.py +1408 -0
- agentinputlab/studio/model_backends.py +425 -0
- agentinputlab/studio/prepared.py +410 -0
- agentinputlab/studio/server.py +613 -0
- agentinputlab/studio/static/app.js +397 -0
- agentinputlab/studio/static/campaigns.html +175 -0
- agentinputlab/studio/static/campaigns.js +426 -0
- agentinputlab/studio/static/index.html +192 -0
- agentinputlab/studio/static/result.html +103 -0
- agentinputlab/studio/static/result.js +273 -0
- agentinputlab/studio/static/styles.css +467 -0
- agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
- agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
- agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
- agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
- agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
- agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
- agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
- agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
- agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
- workers/README.md +94 -0
- workers/ace/README.md +261 -0
- workers/ace/__init__.py +1 -0
- workers/ace/compatibility_manifest.json +39 -0
- workers/ace/driver.py +1682 -0
- workers/acon/README.md +215 -0
- workers/acon/__init__.py +5 -0
- workers/acon/compatibility_manifest.json +93 -0
- workers/acon/driver.py +1859 -0
- workers/acon/fitted.py +395 -0
- workers/acon/guideline.py +470 -0
- workers/acon/guideline_source_manifest.json +20 -0
- workers/adaptive_rag/README.md +96 -0
- workers/adaptive_rag/__init__.py +15 -0
- workers/adaptive_rag/compatibility_manifest.json +61 -0
- workers/adaptive_rag/driver.py +1470 -0
- workers/adaptive_rag/fixture_runtime.py +163 -0
- workers/adaptive_rag/runtime.py +252 -0
- workers/ask_or_assume/README.md +124 -0
- workers/ask_or_assume/__init__.py +1 -0
- workers/ask_or_assume/compatibility_manifest.json +36 -0
- workers/ask_or_assume/driver.py +1227 -0
- workers/decomp/README.md +133 -0
- workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
- workers/decomp/__init__.py +5 -0
- workers/decomp/compatibility_manifest.json +205 -0
- workers/decomp/driver.py +1015 -0
- workers/decomp/live.py +137 -0
- workers/decomp/runtime.py +231 -0
- workers/infocqr/README.md +106 -0
- workers/infocqr/__init__.py +1 -0
- workers/infocqr/compatibility_manifest.json +84 -0
- workers/infocqr/driver.py +1766 -0
- workers/ircot/README.md +167 -0
- workers/ircot/__init__.py +7 -0
- workers/ircot/compatibility_manifest.json +121 -0
- workers/ircot/controlled.py +457 -0
- workers/ircot/driver.py +1373 -0
- workers/ircot/fixture_bindings.json +39 -0
- workers/ircot/fixture_config.json +48 -0
- workers/ircot/fixture_prompt.txt +2 -0
- workers/ircot/native_qa.py +398 -0
- workers/ircot/qa_compatibility_manifest.json +57 -0
- workers/ircot/runtime.py +97 -0
- workers/llmcompiler/README.md +160 -0
- workers/llmcompiler/__init__.py +1 -0
- workers/llmcompiler/compatibility_manifest.json +45 -0
- workers/llmcompiler/driver.py +1514 -0
- workers/llmcompiler/export_prompts.py +74 -0
- workers/llmcompiler/live.py +174 -0
- workers/llmcompiler/patch_manifest.json +147 -0
- workers/mce/README.md +198 -0
- workers/mce/__init__.py +29 -0
- workers/mce/compatibility_manifest.json +115 -0
- workers/mce/driver.py +2585 -0
- workers/mce/final_eval.py +173 -0
- workers/official_arenas/README.md +25 -0
- workers/official_arenas/__init__.py +1 -0
- workers/official_arenas/capture_records.py +110 -0
- workers/official_arenas/driver.py +619 -0
- workers/official_arenas/protocol.py +334 -0
- workers/official_arenas/providers/__init__.py +1 -0
- workers/official_arenas/providers/_live_history.py +228 -0
- workers/official_arenas/providers/_message_compat.py +77 -0
- workers/official_arenas/providers/appworld_ul.py +196 -0
- workers/official_arenas/providers/fixture.py +112 -0
- workers/official_arenas/providers/statebench.py +960 -0
- workers/official_arenas/providers/tau3.py +1672 -0
- workers/official_arenas/providers/tau_retail.py +586 -0
- workers/official_arenas/providers/toolsandbox.py +1321 -0
- workers/official_arenas/providers/tooltalk.py +699 -0
- workers/official_arenas/retail_capture.py +188 -0
- workers/official_arenas/retail_driver.py +275 -0
- workers/qrag/README.md +172 -0
- workers/qrag/__init__.py +1 -0
- workers/qrag/compatibility_manifest.json +64 -0
- workers/qrag/driver.py +673 -0
- workers/r2ag/README.md +154 -0
- workers/r2ag/__init__.py +5 -0
- workers/r2ag/compatibility_manifest.json +55 -0
- workers/r2ag/driver.py +1287 -0
- workers/r2ag/feature_schema.json +8 -0
- workers/r2ag/runtime.py +589 -0
- workers/recomp/README.md +120 -0
- workers/recomp/__init__.py +1 -0
- workers/recomp/compatibility_manifest.json +43 -0
- workers/recomp/driver.py +1653 -0
- workers/reformer/README.md +125 -0
- workers/reformer/__init__.py +1 -0
- workers/reformer/compatibility_manifest.json +68 -0
- workers/reformer/driver.py +1459 -0
- workers/reformer/induction.py +457 -0
- workers/rrr/README.md +126 -0
- workers/rrr/__init__.py +1 -0
- workers/rrr/compatibility_manifest.json +57 -0
- workers/rrr/driver.py +1133 -0
- workers/smartsearch/README.md +331 -0
- workers/smartsearch/__init__.py +1 -0
- workers/smartsearch/compatibility_manifest.json +41 -0
- workers/smartsearch/driver.py +1643 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"""Build selector training rows from audited, full-information arm outcomes.
|
|
2
|
+
|
|
3
|
+
Feature observations are produced before interventions run and joined by the
|
|
4
|
+
frozen state hash. Evaluator outcomes enter only this offline table-building
|
|
5
|
+
boundary; they are never passed to a selector at inference time.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import math
|
|
11
|
+
import re
|
|
12
|
+
from collections.abc import Mapping, Sequence
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from statistics import fmean
|
|
15
|
+
from types import MappingProxyType
|
|
16
|
+
|
|
17
|
+
from agentinputlab.contracts.enums import SemanticFamily, StrEnum
|
|
18
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
19
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
20
|
+
|
|
21
|
+
from .learned import SelectorExample
|
|
22
|
+
from .runtime import FeatureObservation
|
|
23
|
+
|
|
24
|
+
_SHA256 = re.compile(r"^[0-9a-f]{64}$")
|
|
25
|
+
_ACTIONS = frozenset(
|
|
26
|
+
{
|
|
27
|
+
SemanticFamily.NO_OP,
|
|
28
|
+
SemanticFamily.REFORMULATE,
|
|
29
|
+
SemanticFamily.DECOMPOSE,
|
|
30
|
+
SemanticFamily.ACQUIRE,
|
|
31
|
+
SemanticFamily.CLARIFY,
|
|
32
|
+
SemanticFamily.CURATE,
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class EvaluatedArmStatus(StrEnum):
|
|
38
|
+
SUCCEEDED = "succeeded"
|
|
39
|
+
ALGORITHM_FAILURE = "algorithm_failure"
|
|
40
|
+
STRUCTURAL_INELIGIBLE = "structural_ineligible"
|
|
41
|
+
INFRASTRUCTURE_MISSING = "infrastructure_missing"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True, slots=True)
|
|
45
|
+
class EvaluatedArmOutcome:
|
|
46
|
+
"""One evaluator result for a frozen state, action, seed, and runtime stratum."""
|
|
47
|
+
|
|
48
|
+
example_id: str
|
|
49
|
+
group_id: str
|
|
50
|
+
state_hash: str
|
|
51
|
+
split: str
|
|
52
|
+
benchmark_id: str
|
|
53
|
+
family: SemanticFamily
|
|
54
|
+
release_id: str
|
|
55
|
+
seed: int
|
|
56
|
+
backend_hash: str
|
|
57
|
+
comparison_profile_hash: str
|
|
58
|
+
status: EvaluatedArmStatus
|
|
59
|
+
metrics: Mapping[str, float] = field(default_factory=dict)
|
|
60
|
+
cost: float = 0.0
|
|
61
|
+
risk: float = 0.0
|
|
62
|
+
|
|
63
|
+
def __post_init__(self) -> None:
|
|
64
|
+
for label in ("example_id", "group_id", "split", "benchmark_id", "release_id"):
|
|
65
|
+
value = getattr(self, label)
|
|
66
|
+
if not isinstance(value, str) or not value.strip() or value != value.strip():
|
|
67
|
+
raise ValidationError(f"selector arm {label} must be trimmed and non-empty")
|
|
68
|
+
for label in ("state_hash", "backend_hash", "comparison_profile_hash"):
|
|
69
|
+
value = getattr(self, label)
|
|
70
|
+
if not isinstance(value, str) or not _SHA256.fullmatch(value):
|
|
71
|
+
raise ValidationError(f"selector arm {label} must be a lowercase SHA-256")
|
|
72
|
+
if self.family not in _ACTIONS:
|
|
73
|
+
raise ValidationError("selector arm family must be NO_OP or a core intervention family")
|
|
74
|
+
if not isinstance(self.status, EvaluatedArmStatus):
|
|
75
|
+
raise ValidationError("selector arm status must be EvaluatedArmStatus")
|
|
76
|
+
if isinstance(self.seed, bool) or not isinstance(self.seed, int) or self.seed < 0:
|
|
77
|
+
raise ValidationError("selector arm seed must be a non-negative integer")
|
|
78
|
+
metrics = dict(self.metrics)
|
|
79
|
+
if any(
|
|
80
|
+
not isinstance(name, str)
|
|
81
|
+
or not name.strip()
|
|
82
|
+
or name != name.strip()
|
|
83
|
+
or isinstance(value, bool)
|
|
84
|
+
or not isinstance(value, (int, float))
|
|
85
|
+
or not math.isfinite(value)
|
|
86
|
+
for name, value in metrics.items()
|
|
87
|
+
):
|
|
88
|
+
raise ValidationError("selector arm metrics require trimmed names and finite numbers")
|
|
89
|
+
if self.status is EvaluatedArmStatus.SUCCEEDED and not metrics:
|
|
90
|
+
raise ValidationError("succeeded selector arms require evaluator metrics")
|
|
91
|
+
if self.status is EvaluatedArmStatus.STRUCTURAL_INELIGIBLE:
|
|
92
|
+
if self.family is SemanticFamily.NO_OP:
|
|
93
|
+
raise ValidationError("NO_OP cannot be structurally ineligible")
|
|
94
|
+
if metrics:
|
|
95
|
+
raise ValidationError("structurally ineligible arms cannot carry outcome metrics")
|
|
96
|
+
if (
|
|
97
|
+
isinstance(self.cost, bool)
|
|
98
|
+
or not isinstance(self.cost, (int, float))
|
|
99
|
+
or not math.isfinite(self.cost)
|
|
100
|
+
or self.cost < 0
|
|
101
|
+
):
|
|
102
|
+
raise ValidationError("selector arm cost must be finite and non-negative")
|
|
103
|
+
if (
|
|
104
|
+
isinstance(self.risk, bool)
|
|
105
|
+
or not isinstance(self.risk, (int, float))
|
|
106
|
+
or not math.isfinite(self.risk)
|
|
107
|
+
or not 0 <= self.risk <= 1
|
|
108
|
+
):
|
|
109
|
+
raise ValidationError("selector arm risk must be finite and in [0, 1]")
|
|
110
|
+
if self.family is SemanticFamily.NO_OP and self.release_id != "baseline.no_op":
|
|
111
|
+
raise ValidationError("NO_OP selector arms must use baseline.no_op")
|
|
112
|
+
object.__setattr__(self, "metrics", freeze_mapping(metrics))
|
|
113
|
+
object.__setattr__(self, "cost", float(self.cost))
|
|
114
|
+
object.__setattr__(self, "risk", float(self.risk))
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@dataclass(frozen=True, slots=True)
|
|
118
|
+
class UtilityDefinition:
|
|
119
|
+
"""Pre-registered conversion from evaluator records to selector utility."""
|
|
120
|
+
|
|
121
|
+
utility_metric: str
|
|
122
|
+
algorithm_failure_utility: float = 0.0
|
|
123
|
+
aggregate: str = "mean"
|
|
124
|
+
|
|
125
|
+
def __post_init__(self) -> None:
|
|
126
|
+
if (
|
|
127
|
+
not isinstance(self.utility_metric, str)
|
|
128
|
+
or not self.utility_metric.strip()
|
|
129
|
+
or self.utility_metric != self.utility_metric.strip()
|
|
130
|
+
):
|
|
131
|
+
raise ValidationError("utility_metric must be trimmed and non-empty")
|
|
132
|
+
if (
|
|
133
|
+
isinstance(self.algorithm_failure_utility, bool)
|
|
134
|
+
or not isinstance(self.algorithm_failure_utility, (int, float))
|
|
135
|
+
or not math.isfinite(self.algorithm_failure_utility)
|
|
136
|
+
):
|
|
137
|
+
raise ValidationError("algorithm_failure_utility must be finite")
|
|
138
|
+
if self.aggregate != "mean":
|
|
139
|
+
raise ValidationError("selector utility aggregation currently supports mean only")
|
|
140
|
+
object.__setattr__(
|
|
141
|
+
self,
|
|
142
|
+
"algorithm_failure_utility",
|
|
143
|
+
float(self.algorithm_failure_utility),
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def definition_hash(self) -> str:
|
|
148
|
+
return content_hash(self)
|
|
149
|
+
|
|
150
|
+
def value(self, outcome: EvaluatedArmOutcome) -> float:
|
|
151
|
+
if outcome.status is EvaluatedArmStatus.ALGORITHM_FAILURE:
|
|
152
|
+
return self.algorithm_failure_utility
|
|
153
|
+
if outcome.status is not EvaluatedArmStatus.SUCCEEDED:
|
|
154
|
+
raise ValidationError(f"cannot derive utility from arm status {outcome.status.value}")
|
|
155
|
+
try:
|
|
156
|
+
return float(outcome.metrics[self.utility_metric])
|
|
157
|
+
except KeyError as exc:
|
|
158
|
+
raise ValidationError(
|
|
159
|
+
f"succeeded selector arm lacks utility metric {self.utility_metric!r}"
|
|
160
|
+
) from exc
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass(frozen=True, slots=True)
|
|
164
|
+
class SelectorTrainingTable:
|
|
165
|
+
"""Immutable rows and provenance consumed by selector fit/calibration APIs."""
|
|
166
|
+
|
|
167
|
+
examples: tuple[SelectorExample, ...]
|
|
168
|
+
representative_by_family: Mapping[SemanticFamily, str]
|
|
169
|
+
group_split_digests: Mapping[str, str]
|
|
170
|
+
extractor_id: str
|
|
171
|
+
extractor_revision: str
|
|
172
|
+
feature_table_sha256: str
|
|
173
|
+
outcome_table_sha256: str
|
|
174
|
+
utility_definition_sha256: str
|
|
175
|
+
|
|
176
|
+
def __post_init__(self) -> None:
|
|
177
|
+
examples = tuple(self.examples)
|
|
178
|
+
if not examples or any(not isinstance(row, SelectorExample) for row in examples):
|
|
179
|
+
raise ValidationError("selector training table requires SelectorExample rows")
|
|
180
|
+
ids = [row.example_id for row in examples]
|
|
181
|
+
if len(ids) != len(set(ids)):
|
|
182
|
+
raise ValidationError("selector training table example IDs must be unique")
|
|
183
|
+
representatives = _validate_representatives(self.representative_by_family)
|
|
184
|
+
digests = dict(self.group_split_digests)
|
|
185
|
+
if not digests or any(
|
|
186
|
+
not isinstance(split, str)
|
|
187
|
+
or not split.strip()
|
|
188
|
+
or not isinstance(digest, str)
|
|
189
|
+
or not _SHA256.fullmatch(digest)
|
|
190
|
+
for split, digest in digests.items()
|
|
191
|
+
):
|
|
192
|
+
raise ValidationError("selector group split digests must be keyed SHA-256 values")
|
|
193
|
+
for label in ("extractor_id", "extractor_revision"):
|
|
194
|
+
value = getattr(self, label)
|
|
195
|
+
if not isinstance(value, str) or not value.strip():
|
|
196
|
+
raise ValidationError(f"selector training table {label} must be non-empty")
|
|
197
|
+
for label in (
|
|
198
|
+
"feature_table_sha256",
|
|
199
|
+
"outcome_table_sha256",
|
|
200
|
+
"utility_definition_sha256",
|
|
201
|
+
):
|
|
202
|
+
if not _SHA256.fullmatch(getattr(self, label)):
|
|
203
|
+
raise ValidationError(f"selector training table {label} must be SHA-256")
|
|
204
|
+
object.__setattr__(self, "examples", examples)
|
|
205
|
+
object.__setattr__(
|
|
206
|
+
self,
|
|
207
|
+
"representative_by_family",
|
|
208
|
+
MappingProxyType(representatives),
|
|
209
|
+
)
|
|
210
|
+
object.__setattr__(self, "group_split_digests", MappingProxyType(digests))
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def table_hash(self) -> str:
|
|
214
|
+
return content_hash(self)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def build_selector_training_table(
|
|
218
|
+
outcomes: Sequence[EvaluatedArmOutcome],
|
|
219
|
+
observations: Mapping[str, FeatureObservation],
|
|
220
|
+
*,
|
|
221
|
+
utility_definition: UtilityDefinition,
|
|
222
|
+
representative_by_family: Mapping[SemanticFamily, str],
|
|
223
|
+
) -> SelectorTrainingTable:
|
|
224
|
+
"""Validate, aggregate, and join pre-action features with paired outcomes."""
|
|
225
|
+
|
|
226
|
+
rows = tuple(outcomes)
|
|
227
|
+
if not rows or any(not isinstance(row, EvaluatedArmOutcome) for row in rows):
|
|
228
|
+
raise ValidationError("selector outcome table requires EvaluatedArmOutcome rows")
|
|
229
|
+
if not isinstance(utility_definition, UtilityDefinition):
|
|
230
|
+
raise TypeError("utility_definition must be UtilityDefinition")
|
|
231
|
+
representatives = _validate_representatives(representative_by_family)
|
|
232
|
+
if any(row.status is EvaluatedArmStatus.INFRASTRUCTURE_MISSING for row in rows):
|
|
233
|
+
raise ValidationError(
|
|
234
|
+
"infrastructure-missing outcomes invalidate the selector table; "
|
|
235
|
+
"they cannot be converted to utility"
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
feature_by_state = dict(observations)
|
|
239
|
+
if not feature_by_state or any(
|
|
240
|
+
not isinstance(state_hash, str)
|
|
241
|
+
or not _SHA256.fullmatch(state_hash)
|
|
242
|
+
or not isinstance(observation, FeatureObservation)
|
|
243
|
+
or observation.state_hash != state_hash
|
|
244
|
+
for state_hash, observation in feature_by_state.items()
|
|
245
|
+
):
|
|
246
|
+
raise ValidationError(
|
|
247
|
+
"selector observations must map state hashes to matching FeatureObservation values"
|
|
248
|
+
)
|
|
249
|
+
missing_features = sorted({row.state_hash for row in rows} - set(feature_by_state))
|
|
250
|
+
if missing_features:
|
|
251
|
+
raise ValidationError("selector outcomes are missing pre-action feature observations")
|
|
252
|
+
extractor_identities = {
|
|
253
|
+
(
|
|
254
|
+
feature_by_state[row.state_hash].extractor_id,
|
|
255
|
+
feature_by_state[row.state_hash].extractor_revision,
|
|
256
|
+
)
|
|
257
|
+
for row in rows
|
|
258
|
+
}
|
|
259
|
+
if len(extractor_identities) != 1:
|
|
260
|
+
raise ValidationError("selector feature table must use one extractor identity")
|
|
261
|
+
extractor_id, extractor_revision = next(iter(extractor_identities))
|
|
262
|
+
|
|
263
|
+
group_owner: dict[str, str] = {}
|
|
264
|
+
example_owner: dict[tuple[str, str], tuple[str, str, str]] = {}
|
|
265
|
+
state_owner: dict[str, tuple[str, str, str, str]] = {}
|
|
266
|
+
group_ids_by_split: dict[str, set[str]] = {}
|
|
267
|
+
for row in rows:
|
|
268
|
+
previous = group_owner.setdefault(row.group_id, row.split)
|
|
269
|
+
if previous != row.split:
|
|
270
|
+
raise ValidationError(
|
|
271
|
+
f"selector group {row.group_id!r} crosses splits {previous!r} and {row.split!r}"
|
|
272
|
+
)
|
|
273
|
+
example_key = (row.benchmark_id, row.example_id)
|
|
274
|
+
example_binding = (row.split, row.group_id, row.state_hash)
|
|
275
|
+
previous_example_binding = example_owner.setdefault(
|
|
276
|
+
example_key,
|
|
277
|
+
example_binding,
|
|
278
|
+
)
|
|
279
|
+
if previous_example_binding != example_binding:
|
|
280
|
+
raise ValidationError(
|
|
281
|
+
"selector source example is bound to multiple states, groups, or splits"
|
|
282
|
+
)
|
|
283
|
+
state_binding = (
|
|
284
|
+
row.split,
|
|
285
|
+
row.group_id,
|
|
286
|
+
row.benchmark_id,
|
|
287
|
+
row.example_id,
|
|
288
|
+
)
|
|
289
|
+
previous_state_binding = state_owner.setdefault(row.state_hash, state_binding)
|
|
290
|
+
if previous_state_binding != state_binding:
|
|
291
|
+
raise ValidationError(
|
|
292
|
+
"selector state hash is bound to multiple source examples, groups, or splits"
|
|
293
|
+
)
|
|
294
|
+
group_ids_by_split.setdefault(row.split, set()).add(row.group_id)
|
|
295
|
+
|
|
296
|
+
cells: dict[
|
|
297
|
+
tuple[str, str, str, str, str],
|
|
298
|
+
list[EvaluatedArmOutcome],
|
|
299
|
+
] = {}
|
|
300
|
+
for row in rows:
|
|
301
|
+
key = (
|
|
302
|
+
row.state_hash,
|
|
303
|
+
row.group_id,
|
|
304
|
+
row.split,
|
|
305
|
+
row.backend_hash,
|
|
306
|
+
row.comparison_profile_hash,
|
|
307
|
+
)
|
|
308
|
+
cells.setdefault(key, []).append(row)
|
|
309
|
+
|
|
310
|
+
examples: list[SelectorExample] = []
|
|
311
|
+
for key in sorted(cells):
|
|
312
|
+
state_hash, group_id, split, backend_hash, profile_hash = key
|
|
313
|
+
cell_rows = cells[key]
|
|
314
|
+
source_example_ids = {row.example_id for row in cell_rows}
|
|
315
|
+
benchmark_ids = {row.benchmark_id for row in cell_rows}
|
|
316
|
+
if len(source_example_ids) != 1 or len(benchmark_ids) != 1:
|
|
317
|
+
raise ValidationError(
|
|
318
|
+
"one selector state/runtime cell must have one source example and benchmark"
|
|
319
|
+
)
|
|
320
|
+
by_family: dict[SemanticFamily, list[EvaluatedArmOutcome]] = {}
|
|
321
|
+
for row in cell_rows:
|
|
322
|
+
by_family.setdefault(row.family, []).append(row)
|
|
323
|
+
if SemanticFamily.NO_OP not in by_family:
|
|
324
|
+
raise ValidationError("every selector training cell requires an explicit NO_OP arm")
|
|
325
|
+
|
|
326
|
+
baseline_rows = by_family[SemanticFamily.NO_OP]
|
|
327
|
+
_validate_family_replicates(
|
|
328
|
+
SemanticFamily.NO_OP,
|
|
329
|
+
baseline_rows,
|
|
330
|
+
expected_release="baseline.no_op",
|
|
331
|
+
)
|
|
332
|
+
baseline_seeds = {row.seed for row in baseline_rows}
|
|
333
|
+
if any(row.status is EvaluatedArmStatus.STRUCTURAL_INELIGIBLE for row in baseline_rows):
|
|
334
|
+
raise ValidationError("NO_OP cannot be structurally ineligible")
|
|
335
|
+
|
|
336
|
+
utilities: dict[SemanticFamily, float] = {
|
|
337
|
+
SemanticFamily.NO_OP: fmean(utility_definition.value(row) for row in baseline_rows)
|
|
338
|
+
}
|
|
339
|
+
costs: dict[SemanticFamily, float] = {}
|
|
340
|
+
risks: dict[SemanticFamily, float] = {}
|
|
341
|
+
for family in sorted(
|
|
342
|
+
(item for item in by_family if item is not SemanticFamily.NO_OP),
|
|
343
|
+
key=lambda item: item.value,
|
|
344
|
+
):
|
|
345
|
+
family_rows = by_family[family]
|
|
346
|
+
try:
|
|
347
|
+
expected_release = representatives[family]
|
|
348
|
+
except KeyError as exc:
|
|
349
|
+
raise ValidationError(
|
|
350
|
+
f"selector family {family.value} has no frozen representative"
|
|
351
|
+
) from exc
|
|
352
|
+
_validate_family_replicates(
|
|
353
|
+
family,
|
|
354
|
+
family_rows,
|
|
355
|
+
expected_release=expected_release,
|
|
356
|
+
)
|
|
357
|
+
family_seeds = {row.seed for row in family_rows}
|
|
358
|
+
if family_seeds != baseline_seeds:
|
|
359
|
+
raise ValidationError(f"selector family {family.value} seed set differs from NO_OP")
|
|
360
|
+
structural = [
|
|
361
|
+
row.status is EvaluatedArmStatus.STRUCTURAL_INELIGIBLE for row in family_rows
|
|
362
|
+
]
|
|
363
|
+
if any(structural):
|
|
364
|
+
if not all(structural):
|
|
365
|
+
raise ValidationError(
|
|
366
|
+
f"selector family {family.value} mixes structural ineligibility "
|
|
367
|
+
"with evaluated replicates"
|
|
368
|
+
)
|
|
369
|
+
continue
|
|
370
|
+
utilities[family] = fmean(utility_definition.value(row) for row in family_rows)
|
|
371
|
+
costs[family] = fmean(row.cost for row in family_rows)
|
|
372
|
+
risks[family] = fmean(row.risk for row in family_rows)
|
|
373
|
+
|
|
374
|
+
example_id = "selector_" + content_hash(
|
|
375
|
+
{
|
|
376
|
+
"state_hash": state_hash,
|
|
377
|
+
"group_id": group_id,
|
|
378
|
+
"split": split,
|
|
379
|
+
"backend_hash": backend_hash,
|
|
380
|
+
"comparison_profile_hash": profile_hash,
|
|
381
|
+
}
|
|
382
|
+
)
|
|
383
|
+
examples.append(
|
|
384
|
+
SelectorExample(
|
|
385
|
+
example_id=example_id,
|
|
386
|
+
features=feature_by_state[state_hash].features,
|
|
387
|
+
utilities=utilities,
|
|
388
|
+
split=split,
|
|
389
|
+
costs=costs,
|
|
390
|
+
risks=risks,
|
|
391
|
+
)
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
ordered_rows = tuple(sorted(rows, key=_outcome_sort_key))
|
|
395
|
+
feature_table_sha256 = content_hash(
|
|
396
|
+
[
|
|
397
|
+
{
|
|
398
|
+
"state_hash": state_hash,
|
|
399
|
+
"feature_hash": feature_by_state[state_hash].feature_hash,
|
|
400
|
+
}
|
|
401
|
+
for state_hash in sorted({row.state_hash for row in rows})
|
|
402
|
+
]
|
|
403
|
+
)
|
|
404
|
+
outcome_table_sha256 = content_hash(ordered_rows)
|
|
405
|
+
group_split_digests = {
|
|
406
|
+
split: content_hash({"split": split, "group_ids": sorted(group_ids)})
|
|
407
|
+
for split, group_ids in sorted(group_ids_by_split.items())
|
|
408
|
+
}
|
|
409
|
+
return SelectorTrainingTable(
|
|
410
|
+
examples=tuple(sorted(examples, key=lambda row: row.example_id)),
|
|
411
|
+
representative_by_family=representatives,
|
|
412
|
+
group_split_digests=group_split_digests,
|
|
413
|
+
extractor_id=extractor_id,
|
|
414
|
+
extractor_revision=extractor_revision,
|
|
415
|
+
feature_table_sha256=feature_table_sha256,
|
|
416
|
+
outcome_table_sha256=outcome_table_sha256,
|
|
417
|
+
utility_definition_sha256=utility_definition.definition_hash,
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
def _validate_family_replicates(
|
|
422
|
+
family: SemanticFamily,
|
|
423
|
+
rows: Sequence[EvaluatedArmOutcome],
|
|
424
|
+
*,
|
|
425
|
+
expected_release: str,
|
|
426
|
+
) -> None:
|
|
427
|
+
releases = {row.release_id for row in rows}
|
|
428
|
+
if releases != {expected_release}:
|
|
429
|
+
raise ValidationError(
|
|
430
|
+
f"selector family {family.value} release differs from its frozen representative"
|
|
431
|
+
)
|
|
432
|
+
seeds = [row.seed for row in rows]
|
|
433
|
+
if len(seeds) != len(set(seeds)):
|
|
434
|
+
raise ValidationError(f"selector family {family.value} contains duplicate seed outcomes")
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def _validate_representatives(
|
|
438
|
+
value: Mapping[SemanticFamily, str],
|
|
439
|
+
) -> dict[SemanticFamily, str]:
|
|
440
|
+
copied = dict(value)
|
|
441
|
+
if any(
|
|
442
|
+
not isinstance(family, SemanticFamily)
|
|
443
|
+
or family in {SemanticFamily.NO_OP, SemanticFamily.COMPOSITE}
|
|
444
|
+
or not isinstance(release, str)
|
|
445
|
+
or not release.strip()
|
|
446
|
+
or release != release.strip()
|
|
447
|
+
for family, release in copied.items()
|
|
448
|
+
):
|
|
449
|
+
raise ValidationError(
|
|
450
|
+
"selector representatives require core intervention families and release IDs"
|
|
451
|
+
)
|
|
452
|
+
return copied
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def _outcome_sort_key(
|
|
456
|
+
row: EvaluatedArmOutcome,
|
|
457
|
+
) -> tuple[str, str, str, str, str, str, int]:
|
|
458
|
+
return (
|
|
459
|
+
row.split,
|
|
460
|
+
row.group_id,
|
|
461
|
+
row.state_hash,
|
|
462
|
+
row.backend_hash,
|
|
463
|
+
row.comparison_profile_hash,
|
|
464
|
+
row.family.value,
|
|
465
|
+
row.seed,
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
__all__ = [
|
|
470
|
+
"EvaluatedArmOutcome",
|
|
471
|
+
"EvaluatedArmStatus",
|
|
472
|
+
"SelectorTrainingTable",
|
|
473
|
+
"UtilityDefinition",
|
|
474
|
+
"build_selector_training_table",
|
|
475
|
+
]
|