eval-framework 0.9.1__tar.gz → 0.10.0__tar.gz
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.
- {eval_framework-0.9.1 → eval_framework-0.10.0}/PKG-INFO +6 -5
- {eval_framework-0.9.1 → eval_framework-0.10.0}/pyproject.toml +19 -8
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/context/determined.py +12 -17
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/context/eval.py +0 -15
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/context/local.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/code_assertion.py +2 -2
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/minerva_math_utils.py +9 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/response_generator.py +8 -17
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/run.py +6 -46
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/run_direct.py +0 -3
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/base.py +61 -60
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/arc.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -1
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/arc_ellamind.py +72 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/copa.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/csqa.py +0 -1
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/csqa_ellamind.py +95 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/drop.py +0 -3
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -4
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/gpqa_ellamind.py +114 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -1
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/gsm8k_ellamind.py +87 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/hellaswag_ellamind.py +73 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/hendrycks_math_ellamind.py +119 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/hle_ellamind.py +101 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/humaneval_ellamind.py +65 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/mbpp.py +1 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/mbpp_ellamind.py +172 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/medqa.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -5
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -4
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -2
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/piqa.py +0 -1
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/piqa_ellamind.py +95 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/sciq.py +0 -2
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/simpleqa_ellamind.py +94 -0
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/siqa_ellamind.py +92 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/squad.py +0 -2
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -1
- eval_framework-0.10.0/src/eval_framework/tasks/benchmarks/winogrande_ellamind.py +140 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/eval_config.py +0 -2
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/hf-dataset-revisions.json +13 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/registry.py +22 -48
- eval_framework-0.10.0/src/eval_framework/tasks/task_loader.py +89 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/task_names.py +144 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/task_style.py +0 -1
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/utils.py +12 -210
- eval_framework-0.9.1/src/eval_framework/tasks/perturbation.py +0 -83
- eval_framework-0.9.1/src/eval_framework/tasks/task_loader.py +0 -81
- {eval_framework-0.9.1 → eval_framework-0.10.0}/LICENSE +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/README.md +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/base_config.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/context/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/evaluation_generator.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/exceptions.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/drop_process_results.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/ifeval_impl/README.md +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/aleph_alpha.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/base.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/huggingface.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/models.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/llm/openai.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/logger.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/main.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/base.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/csv_format.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/f1.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/format_checker.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/ifeval.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/json_format.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/language_checker.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/length_control.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/repetition.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/completion/text_counter.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/base.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/language.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/models.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/llm/utils.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/py.typed +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/result_processors/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/result_processors/base.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/result_processors/hf_uploader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/result_processors/result_processor.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/shared/types.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/suite.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/humaneval.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/dataset_revisions.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/markdown_doc.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/constants.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/file_ops.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/helpers.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/logging.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/packaging.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/utils/tqdm_handler.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/template_formatting/README.md +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/template_formatting/__init__.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/template_formatting/formatter.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/template_formatting/mistral_formatter.py +0 -0
- {eval_framework-0.9.1 → eval_framework-0.10.0}/src/template_formatting/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: eval-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: Evaluation Framework
|
|
5
5
|
Author: Aleph Alpha Research
|
|
6
6
|
License: Apache License
|
|
@@ -208,6 +208,8 @@ Classifier: Operating System :: OS Independent
|
|
|
208
208
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
209
209
|
Classifier: Programming Language :: Python
|
|
210
210
|
Classifier: Programming Language :: Python :: 3.12
|
|
211
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
212
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
211
213
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
212
214
|
Classifier: Topic :: Software Development :: Libraries
|
|
213
215
|
Classifier: Typing :: Typed
|
|
@@ -216,12 +218,11 @@ Requires-Dist: xmltodict>=1.0.4,<1.1
|
|
|
216
218
|
Requires-Dist: pydantic>=2.13.4,<3
|
|
217
219
|
Requires-Dist: datasets>=5.0.1,<6
|
|
218
220
|
Requires-Dist: pycountry>=26.2.16,<27
|
|
219
|
-
Requires-Dist: nltk>=3.10.
|
|
221
|
+
Requires-Dist: nltk>=3.10.2,<4
|
|
220
222
|
Requires-Dist: python-dotenv>=1.2.2,<2
|
|
221
223
|
Requires-Dist: lingua-language-detector>=2.2.0,<3
|
|
222
224
|
Requires-Dist: google-crc32c>=1.8.0,<2
|
|
223
225
|
Requires-Dist: langdetect>=1.0.9,<2
|
|
224
|
-
Requires-Dist: spacy>=3.8.14,<4
|
|
225
226
|
Requires-Dist: jsonschema>=4.26.0,<5
|
|
226
227
|
Requires-Dist: mysql-connector-python>=26.7.0,<27
|
|
227
228
|
Requires-Dist: psycopg2-binary>=2.9.12,<3
|
|
@@ -232,7 +233,7 @@ Requires-Dist: lxml>=6.1.1,<7
|
|
|
232
233
|
Requires-Dist: python-iso639>=2026.7.23
|
|
233
234
|
Requires-Dist: wandb>=0.28.1,<1
|
|
234
235
|
Requires-Dist: boto3>=1.43.19,<2
|
|
235
|
-
Requires-Dist: numpy>=2.5.
|
|
236
|
+
Requires-Dist: numpy>=2.5.2
|
|
236
237
|
Requires-Dist: antlr4-python3-runtime==4.11.0
|
|
237
238
|
Requires-Dist: scipy>=1.18.0,<2
|
|
238
239
|
Requires-Dist: accelerate ; extra == 'accelerate'
|
|
@@ -248,7 +249,7 @@ Requires-Dist: jinja2>=3.1.6,<4 ; extra == 'optional'
|
|
|
248
249
|
Requires-Dist: transformers>=4.45.2,<5 ; extra == 'transformers'
|
|
249
250
|
Requires-Dist: torch>=2.13.0,<3 ; extra == 'transformers'
|
|
250
251
|
Requires-Dist: accelerate>=1.14.0,<2 ; extra == 'transformers'
|
|
251
|
-
Requires-Python: >=3.12, <3.
|
|
252
|
+
Requires-Python: >=3.12, <3.15
|
|
252
253
|
Project-URL: repository, https://github.com/Aleph-Alpha-Research/eval-framework
|
|
253
254
|
Provides-Extra: accelerate
|
|
254
255
|
Provides-Extra: all
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "eval-framework"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.10.0"
|
|
4
4
|
description = "Evaluation Framework"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
7
|
-
requires-python = ">=3.12,<3.
|
|
7
|
+
requires-python = ">=3.12,<3.15"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name = "Aleph Alpha Research" }
|
|
10
10
|
]
|
|
@@ -13,6 +13,8 @@ classifiers = [
|
|
|
13
13
|
"License :: OSI Approved :: Apache Software License",
|
|
14
14
|
"Programming Language :: Python",
|
|
15
15
|
"Programming Language :: Python :: 3.12",
|
|
16
|
+
"Programming Language :: Python :: 3.13",
|
|
17
|
+
"Programming Language :: Python :: 3.14",
|
|
16
18
|
"Programming Language :: Python :: 3 :: Only",
|
|
17
19
|
"Topic :: Software Development :: Libraries",
|
|
18
20
|
"Typing :: Typed",
|
|
@@ -23,12 +25,11 @@ dependencies = [
|
|
|
23
25
|
"pydantic>=2.13.4,<3",
|
|
24
26
|
"datasets>=5.0.1,<6",
|
|
25
27
|
"pycountry>=26.2.16,<27",
|
|
26
|
-
"nltk>=3.10.
|
|
28
|
+
"nltk>=3.10.2,<4",
|
|
27
29
|
"python-dotenv>=1.2.2,<2",
|
|
28
30
|
"lingua-language-detector>=2.2.0,<3",
|
|
29
31
|
"google-crc32c>=1.8.0,<2",
|
|
30
32
|
"langdetect>=1.0.9,<2", # required by the original ifeval implementation
|
|
31
|
-
"spacy>=3.8.14,<4",
|
|
32
33
|
"jsonschema>=4.26.0,<5",
|
|
33
34
|
"mysql-connector-python>=26.7.0,<27", # required for sql-related tasks
|
|
34
35
|
"psycopg2-binary>=2.9.12,<3", # required for sql-related tasks
|
|
@@ -39,7 +40,7 @@ dependencies = [
|
|
|
39
40
|
"python-iso639>=2026.7.23",
|
|
40
41
|
"wandb>=0.28.1,<1",
|
|
41
42
|
"boto3>=1.43.19,<2",
|
|
42
|
-
"numpy>=2.5.
|
|
43
|
+
"numpy>=2.5.2",
|
|
43
44
|
# is a dependency of sympy, but not explicitly listed in the requirements.txt
|
|
44
45
|
# https://github.com/sympy/sympy/blob/0204fa34e8f6f6f8ccb4de01209be9a2345c9d6e/doc/src/contributing/dependencies.md?plain=1#L125
|
|
45
46
|
"antlr4-python3-runtime==4.11.0",
|
|
@@ -89,10 +90,10 @@ dev = [
|
|
|
89
90
|
"pytest-xdist>=3.8.0,<4",
|
|
90
91
|
"pytest-sugar>1.1,<2",
|
|
91
92
|
"types-pyyaml>=6.0.12.20260724,<7",
|
|
92
|
-
"types-python-dateutil>=2.9.0.
|
|
93
|
+
"types-python-dateutil>=2.9.0.20260807,<3",
|
|
93
94
|
"types-requests>=2.33.0.20260712,<3",
|
|
94
95
|
"plotly>=6.9.0,<7",
|
|
95
|
-
"ruff>=0.16.
|
|
96
|
+
"ruff>=0.16.2",
|
|
96
97
|
"pip-licenses>=5.5.5",
|
|
97
98
|
]
|
|
98
99
|
flash-attn = [
|
|
@@ -137,6 +138,16 @@ known-third-party = ["wandb"]
|
|
|
137
138
|
|
|
138
139
|
[tool.ruff.lint.extend-per-file-ignores]
|
|
139
140
|
"__init__.py" = ["F401"]
|
|
141
|
+
# Prompt strings are too long for:
|
|
142
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_csqa_ellamind.py" = ["E501"]
|
|
143
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_gpqa_ellamind.py" = ["E501"]
|
|
144
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_gsm8k_ellamind.py" = ["E501"]
|
|
145
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_hendrycks_math_ellamind.py" = ["E501"]
|
|
146
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_hle_ellamind.py" = ["E501"]
|
|
147
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_mbpp_ellamind.py" = ["E501"]
|
|
148
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_piqa_ellamind.py" = ["E501"]
|
|
149
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_siqa_ellamind.py" = ["E501"]
|
|
150
|
+
"tests/tests_eval_framework/tasks/benchmarks/test_winogrande_ellamind.py" = ["E501"]
|
|
140
151
|
|
|
141
152
|
[tool.mypy]
|
|
142
153
|
plugins = "pydantic.mypy"
|
|
@@ -147,7 +158,7 @@ files = ["src", "utils"]
|
|
|
147
158
|
[tool.pytest.ini_options]
|
|
148
159
|
testpaths = ["./tests"]
|
|
149
160
|
minversion = 8.0
|
|
150
|
-
addopts = "-p 'no:legacypath' --doctest-modules"
|
|
161
|
+
addopts = "-p 'no:legacypath' --doctest-modules -n auto"
|
|
151
162
|
markers = [
|
|
152
163
|
"gpu: needs a GPU runner, otherwise test can not be run",
|
|
153
164
|
"cpu_slow: runs for a long time (on CPU)",
|
|
@@ -12,7 +12,6 @@ from eval_framework.context.eval import EvalContext
|
|
|
12
12
|
from eval_framework.context.local import _load_model
|
|
13
13
|
from eval_framework.llm.base import BaseLLM
|
|
14
14
|
from eval_framework.tasks.eval_config import EvalConfig
|
|
15
|
-
from eval_framework.tasks.perturbation import PerturbationConfig
|
|
16
15
|
from eval_framework.tasks.registry import validate_task_name
|
|
17
16
|
from eval_framework.tasks.task_loader import load_extra_tasks
|
|
18
17
|
|
|
@@ -31,7 +30,6 @@ class TaskArgs(BaseModel):
|
|
|
31
30
|
task_subjects: list[str] | None = None
|
|
32
31
|
hf_revision: str | None = None
|
|
33
32
|
user_prompt_suffix: str | None = None
|
|
34
|
-
perturbation_config: PerturbationConfig | None = None
|
|
35
33
|
repeats: int | None = None
|
|
36
34
|
|
|
37
35
|
|
|
@@ -48,7 +46,7 @@ class Hyperparameters(BaseModel):
|
|
|
48
46
|
description: str | None = None
|
|
49
47
|
task_args: TaskArgs
|
|
50
48
|
llm_args: dict[str, Any] | None = {}
|
|
51
|
-
|
|
49
|
+
extra_tasks_dir: str | None = None
|
|
52
50
|
delete_output_dir_after_upload: bool | None = None
|
|
53
51
|
|
|
54
52
|
|
|
@@ -67,19 +65,18 @@ class DeterminedContext(EvalContext):
|
|
|
67
65
|
raise RuntimeError("Failed to retrieve cluster info.")
|
|
68
66
|
|
|
69
67
|
# Load extra tasks if specified first
|
|
70
|
-
|
|
71
|
-
if
|
|
72
|
-
name = "
|
|
68
|
+
extra_tasks_dir = info.trial.hparams.get("extra_tasks_dir", None)
|
|
69
|
+
if extra_tasks_dir:
|
|
70
|
+
name = "extra_tasks_dir"
|
|
73
71
|
val_cli = getattr(self, name, None)
|
|
74
|
-
val_hparams =
|
|
75
|
-
if val_hparams:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
load_extra_tasks(val_hparams)
|
|
72
|
+
val_hparams = extra_tasks_dir
|
|
73
|
+
if val_cli and val_hparams and val_cli != val_hparams:
|
|
74
|
+
logger.info(
|
|
75
|
+
f"CLI argument {name} ({val_cli}) is being overridden by hyperparameters:"
|
|
76
|
+
f"({val_hparams}). If it fails due to duplicate task names, remove the CLI argument and"
|
|
77
|
+
"consolidate as a determined hyperparameter instead."
|
|
78
|
+
)
|
|
79
|
+
load_extra_tasks(val_hparams)
|
|
83
80
|
|
|
84
81
|
self.hparams = Hyperparameters(**info.trial.hparams)
|
|
85
82
|
|
|
@@ -112,7 +109,6 @@ class DeterminedContext(EvalContext):
|
|
|
112
109
|
"user_prompt_suffix",
|
|
113
110
|
"judge_model_name",
|
|
114
111
|
"judge_model_args",
|
|
115
|
-
"perturbation_config",
|
|
116
112
|
"repeats",
|
|
117
113
|
]:
|
|
118
114
|
val_cli = getattr(self, name, None)
|
|
@@ -145,7 +141,6 @@ class DeterminedContext(EvalContext):
|
|
|
145
141
|
task_subjects=self.hparams.task_args.task_subjects,
|
|
146
142
|
hf_revision=self.hparams.task_args.hf_revision or self.hf_revision,
|
|
147
143
|
user_prompt_suffix=user_prompt_suffix,
|
|
148
|
-
perturbation_config=self.hparams.task_args.perturbation_config or self.perturbation_config,
|
|
149
144
|
output_dir=self.hparams.output_dir,
|
|
150
145
|
llm_judge_class=llm_judge_class,
|
|
151
146
|
judge_model_args=self.hparams.task_args.judge_model_args or self.judge_model_args,
|
|
@@ -9,7 +9,6 @@ from typing import Any
|
|
|
9
9
|
import eval_framework
|
|
10
10
|
from eval_framework.llm.base import BaseLLM
|
|
11
11
|
from eval_framework.tasks.eval_config import EvalConfig
|
|
12
|
-
from eval_framework.tasks.perturbation import PerturbationConfig
|
|
13
12
|
|
|
14
13
|
|
|
15
14
|
def import_models(models_file: PathLike | str) -> dict[str, type[BaseLLM]]:
|
|
@@ -72,9 +71,6 @@ class EvalContext(AbstractContextManager):
|
|
|
72
71
|
judge_model_args: dict[str, Any] | None = None,
|
|
73
72
|
batch_size: int | None = None,
|
|
74
73
|
description: str | None = None,
|
|
75
|
-
perturbation_type: str | None = None,
|
|
76
|
-
perturbation_probability: float | None = None,
|
|
77
|
-
perturbation_seed: int | None = None,
|
|
78
74
|
randomize_judge_order: bool = False,
|
|
79
75
|
delete_output_dir_after_upload: bool | None = None,
|
|
80
76
|
repeats: int | None = None,
|
|
@@ -105,17 +101,6 @@ class EvalContext(AbstractContextManager):
|
|
|
105
101
|
self.randomize_judge_order = randomize_judge_order
|
|
106
102
|
self.delete_output_dir_after_upload = delete_output_dir_after_upload
|
|
107
103
|
self.repeats = repeats
|
|
108
|
-
if perturbation_type or perturbation_probability is not None:
|
|
109
|
-
perturbation = {
|
|
110
|
-
"type": perturbation_type,
|
|
111
|
-
"probability": perturbation_probability,
|
|
112
|
-
"seed": perturbation_seed,
|
|
113
|
-
}
|
|
114
|
-
self.perturbation_config: PerturbationConfig | None = PerturbationConfig(
|
|
115
|
-
**{k: v for k, v in perturbation.items() if v is not None}
|
|
116
|
-
)
|
|
117
|
-
else:
|
|
118
|
-
self.perturbation_config = None
|
|
119
104
|
|
|
120
105
|
self.config: EvalConfig | None = None
|
|
121
106
|
|
|
@@ -48,7 +48,6 @@ class LocalContext(EvalContext):
|
|
|
48
48
|
num_samples=self.num_samples,
|
|
49
49
|
max_tokens=self.max_tokens,
|
|
50
50
|
num_fewshot=self.num_fewshot,
|
|
51
|
-
perturbation_config=self.perturbation_config,
|
|
52
51
|
task_name=self.task_name,
|
|
53
52
|
task_subjects=self.task_subjects,
|
|
54
53
|
hf_revision=self.hf_revision,
|
|
@@ -2,7 +2,7 @@ from llm_sandbox.exceptions import SandboxTimeoutError
|
|
|
2
2
|
|
|
3
3
|
from eval_framework.metrics.base import BaseMetric, MetricResult
|
|
4
4
|
from eval_framework.shared.types import Completion
|
|
5
|
-
from eval_framework.tasks.utils import run_python_code
|
|
5
|
+
from eval_framework.tasks.utils import DockerReturnedEmptyOutput, run_python_code
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class CodeCompletionAssertion(BaseMetric[Completion]):
|
|
@@ -16,7 +16,7 @@ class CodeCompletionAssertion(BaseMetric[Completion]):
|
|
|
16
16
|
code = response.completion
|
|
17
17
|
try:
|
|
18
18
|
output = run_python_code(code, image="python:3.12-slim", runtime_configs={"mem_limit": "512m"})
|
|
19
|
-
except SandboxTimeoutError:
|
|
19
|
+
except (SandboxTimeoutError, DockerReturnedEmptyOutput):
|
|
20
20
|
# The submitted code timed out (e.g. an infinite loop) -- a failing sample, not an infra
|
|
21
21
|
# problem.
|
|
22
22
|
import traceback
|
|
@@ -350,8 +350,17 @@ def strip_string_hendrycks(string: str) -> str:
|
|
|
350
350
|
return string
|
|
351
351
|
|
|
352
352
|
|
|
353
|
+
# MATH gold answers stay under ~80 chars.
|
|
354
|
+
_PLAUSIBLE_ANSWER_LEN = 128
|
|
355
|
+
|
|
356
|
+
|
|
353
357
|
def is_equiv_minerva(x1: str, x2: str, timeout_seconds: int = 5) -> bool:
|
|
354
358
|
"""Sympy-based equivalence (Minerva)."""
|
|
359
|
+
# extract_answers can fall back to the whole completion; sympy grinds on such
|
|
360
|
+
# 1000+ char strings until the timeout. A side far longer than the other can't
|
|
361
|
+
# be an equivalent final answer, so refuse it before parsing.
|
|
362
|
+
if max(len(x1), len(x2)) > max(_PLAUSIBLE_ANSWER_LEN, 3 * min(len(x1), len(x2))):
|
|
363
|
+
return False
|
|
355
364
|
|
|
356
365
|
def _timeout_handler(signum: Any, frame: Any) -> None:
|
|
357
366
|
raise TimeoutError()
|
|
@@ -26,7 +26,7 @@ from eval_framework.shared.types import (
|
|
|
26
26
|
Loglikelihood,
|
|
27
27
|
RawLoglikelihood,
|
|
28
28
|
)
|
|
29
|
-
from eval_framework.tasks.base import Language, ResponseType, Sample
|
|
29
|
+
from eval_framework.tasks.base import RANDOM_SEED, Language, ResponseType, Sample
|
|
30
30
|
from eval_framework.tasks.eval_config import EvalConfig
|
|
31
31
|
from eval_framework.tasks.utils import raise_errors
|
|
32
32
|
from eval_framework.utils.constants import RED, RESET
|
|
@@ -60,21 +60,13 @@ class ResponseGenerator:
|
|
|
60
60
|
self.num_samples = config.num_samples
|
|
61
61
|
self.save_intermediate_results = config.save_intermediate_results
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
)
|
|
71
|
-
else:
|
|
72
|
-
self.task = registry()[config.task_name].create(
|
|
73
|
-
config.num_fewshot,
|
|
74
|
-
config.task_subjects,
|
|
75
|
-
config.hf_revision,
|
|
76
|
-
user_prompt_suffix=config.user_prompt_suffix,
|
|
77
|
-
)
|
|
63
|
+
self.task = registry()[config.task_name].create(
|
|
64
|
+
config.num_fewshot,
|
|
65
|
+
config.task_subjects,
|
|
66
|
+
config.hf_revision,
|
|
67
|
+
user_prompt_suffix=config.user_prompt_suffix,
|
|
68
|
+
seed=RANDOM_SEED,
|
|
69
|
+
)
|
|
78
70
|
|
|
79
71
|
self.response_type = self.task.get_response_type()
|
|
80
72
|
|
|
@@ -339,7 +331,6 @@ class ResponseGenerator:
|
|
|
339
331
|
"num_samples",
|
|
340
332
|
"llm_name",
|
|
341
333
|
"llm_args",
|
|
342
|
-
"perturbation_config",
|
|
343
334
|
"repeats",
|
|
344
335
|
"user_prompt_suffix",
|
|
345
336
|
]
|
|
@@ -42,11 +42,11 @@ def parse_args() -> argparse.Namespace:
|
|
|
42
42
|
help="The path to the Python module file containing model classes.",
|
|
43
43
|
)
|
|
44
44
|
parser.add_argument(
|
|
45
|
-
"--extra-
|
|
46
|
-
|
|
47
|
-
default=
|
|
45
|
+
"--extra-tasks-dir",
|
|
46
|
+
type=Path,
|
|
47
|
+
default=None,
|
|
48
48
|
required=False,
|
|
49
|
-
help="
|
|
49
|
+
help="Directory containing additional task plugin modules to load.",
|
|
50
50
|
)
|
|
51
51
|
parser.add_argument(
|
|
52
52
|
"--llm-name",
|
|
@@ -102,37 +102,6 @@ def parse_args() -> argparse.Namespace:
|
|
|
102
102
|
help="Randomize the order of answers presented to the LLM judge to mitigate position bias.",
|
|
103
103
|
)
|
|
104
104
|
|
|
105
|
-
# Perturbation arguments
|
|
106
|
-
parser.add_argument(
|
|
107
|
-
"--perturbation-type",
|
|
108
|
-
type=str,
|
|
109
|
-
required=False,
|
|
110
|
-
choices=[
|
|
111
|
-
"editor",
|
|
112
|
-
"permute",
|
|
113
|
-
"replace",
|
|
114
|
-
"delete",
|
|
115
|
-
"uppercase",
|
|
116
|
-
],
|
|
117
|
-
help=(
|
|
118
|
-
"The type of perturbation to apply. Note that this may not make sense for some prompts, for example those "
|
|
119
|
-
"containing math and code."
|
|
120
|
-
),
|
|
121
|
-
)
|
|
122
|
-
parser.add_argument(
|
|
123
|
-
"--perturbation-probability",
|
|
124
|
-
type=float,
|
|
125
|
-
required=False,
|
|
126
|
-
default=None,
|
|
127
|
-
help="The probability of applying a perturbation to each word or character (between 0.0 and 1.0).",
|
|
128
|
-
)
|
|
129
|
-
parser.add_argument(
|
|
130
|
-
"--perturbation-seed",
|
|
131
|
-
type=int,
|
|
132
|
-
required=False,
|
|
133
|
-
default=42,
|
|
134
|
-
help="Random seed controlling perturbations.",
|
|
135
|
-
)
|
|
136
105
|
parser.add_argument(
|
|
137
106
|
"--task-subjects",
|
|
138
107
|
type=str,
|
|
@@ -313,12 +282,6 @@ def parse_args() -> argparse.Namespace:
|
|
|
313
282
|
|
|
314
283
|
args.judge_model_args = judge_model_args
|
|
315
284
|
|
|
316
|
-
# if args.extra_task_modules:
|
|
317
|
-
# # Convert the comma-separated string into a list
|
|
318
|
-
# args.extra_task_modules = [file_or_dir.strip() for file_or_dir in args.extra_task_modules.split(",")]
|
|
319
|
-
# else:
|
|
320
|
-
# args.extra_task_modules = None
|
|
321
|
-
|
|
322
285
|
if args.task_suite and args.task_name:
|
|
323
286
|
parser.error("--task-suite and --task-name are mutually exclusive.")
|
|
324
287
|
|
|
@@ -336,8 +299,8 @@ def _run_single_task(kwargs: dict) -> None:
|
|
|
336
299
|
now = datetime.datetime.now()
|
|
337
300
|
logger.info(f"starting time: {now}")
|
|
338
301
|
|
|
339
|
-
if kwargs.get("
|
|
340
|
-
load_extra_tasks(kwargs["
|
|
302
|
+
if kwargs.get("extra_tasks_dir"):
|
|
303
|
+
load_extra_tasks(kwargs["extra_tasks_dir"])
|
|
341
304
|
|
|
342
305
|
context_name = kwargs.pop("context")
|
|
343
306
|
|
|
@@ -366,9 +329,6 @@ def _run_single_task(kwargs: dict) -> None:
|
|
|
366
329
|
judge_model_args=kwargs["judge_model_args"],
|
|
367
330
|
batch_size=kwargs["batch_size"],
|
|
368
331
|
description=kwargs["description"],
|
|
369
|
-
perturbation_type=kwargs["perturbation_type"],
|
|
370
|
-
perturbation_probability=kwargs["perturbation_probability"],
|
|
371
|
-
perturbation_seed=kwargs["perturbation_seed"],
|
|
372
332
|
randomize_judge_order=kwargs["randomize_judge_order"],
|
|
373
333
|
delete_output_dir_after_upload=kwargs["delete_output_dir_after_upload"],
|
|
374
334
|
# save_logs=kwargs["save_logs"],
|
|
@@ -129,10 +129,6 @@ class BaseTask[SubjectType](Task):
|
|
|
129
129
|
# inherited implicitly (a subclass in another package would otherwise resolve the wrong file).
|
|
130
130
|
REVISION_LOCKFILE: Path | None
|
|
131
131
|
|
|
132
|
-
# Words in _get_instruction_text() not to be perturbed. List of words is case insensitive. No special characters
|
|
133
|
-
# or whitespace should be included.
|
|
134
|
-
PERTURBATION_UNMODIFIABLE_WORDS: list[str] | None
|
|
135
|
-
|
|
136
132
|
# The language (or languages) tested by the benchmark. Accepts a single string, a dictionary specifying
|
|
137
133
|
# language by subtopic, or `None` (for tasks not specific to a single language).
|
|
138
134
|
LANGUAGE: Language | dict[str, Language] | dict[str, tuple[Language, Language]] | None
|
|
@@ -147,6 +143,7 @@ class BaseTask[SubjectType](Task):
|
|
|
147
143
|
self.stop_sequences: list[str] | None = None
|
|
148
144
|
self.max_tokens: int | None = None
|
|
149
145
|
self.hf_revision: str | None = self._apply_hf_revision()
|
|
146
|
+
self.rnd: random.Random | None = None
|
|
150
147
|
|
|
151
148
|
def _apply_hf_revision(self, custom_hf_revision: str | None = None) -> str | None:
|
|
152
149
|
# Precedence: CLI/config override > REVISION_LOCKFILE pin.
|
|
@@ -167,72 +164,27 @@ class BaseTask[SubjectType](Task):
|
|
|
167
164
|
custom_subjects: list[str] | None,
|
|
168
165
|
custom_hf_revision: str | None,
|
|
169
166
|
user_prompt_suffix: str | None = None,
|
|
167
|
+
seed: int | None = RANDOM_SEED,
|
|
170
168
|
) -> Self:
|
|
171
169
|
instance = cls(num_fewshot=num_fewshot)
|
|
172
170
|
if user_prompt_suffix is not None and instance.get_response_type() != ResponseType.COMPLETION:
|
|
173
171
|
raise ValueError("user_prompt_suffix is only supported for completion tasks.")
|
|
174
172
|
instance.user_prompt_suffix = user_prompt_suffix
|
|
175
|
-
|
|
173
|
+
instance.rnd = random.Random(seed)
|
|
176
174
|
# If custom subjects were provided during initialization, they take precedence over the class-level SUBJECTS.
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
175
|
+
if custom_subjects:
|
|
176
|
+
filtered_subjects = resolve_overwrite_subjects(
|
|
177
|
+
custom_subjects=custom_subjects,
|
|
178
|
+
accepted_subjects=instance.SUBJECTS,
|
|
179
|
+
task_name=instance.display_name(),
|
|
180
|
+
)
|
|
181
|
+
logger.info(f"Setting SUBJECTS to `{filtered_subjects}` for the task {instance.display_name()}")
|
|
182
|
+
instance.SUBJECTS = filtered_subjects
|
|
181
183
|
|
|
182
184
|
instance.hf_revision = instance._apply_hf_revision(custom_hf_revision)
|
|
183
185
|
|
|
184
186
|
return instance
|
|
185
187
|
|
|
186
|
-
def _filter_task_subjects(self, custom_subjects: list[str] | None) -> list[str] | list[tuple] | None:
|
|
187
|
-
"""Process custom subjects passed from EvalConfig. Check and returns restricted task subjects if specified."""
|
|
188
|
-
if not custom_subjects:
|
|
189
|
-
return None
|
|
190
|
-
|
|
191
|
-
assert hasattr(self, "SUBJECTS") and len(self.SUBJECTS) > 0
|
|
192
|
-
if isinstance(self.SUBJECTS[0], tuple):
|
|
193
|
-
# subjects are specified as comma-separated strings but tuple positions may each hold a
|
|
194
|
-
# different type (e.g. tuple[str, int, str]). Infer the expected type per position from an
|
|
195
|
-
# actual subject and cast each part back to it, so it compares equal to the real values
|
|
196
|
-
# below instead of just their str() form. "*" is a wildcard sentinel and stays a string.
|
|
197
|
-
num_items = len(self.SUBJECTS[0])
|
|
198
|
-
position_types = [type(self.SUBJECTS[0][i]) for i in range(num_items)]
|
|
199
|
-
|
|
200
|
-
def cast(raw: str, i: int) -> Any:
|
|
201
|
-
raw = raw.strip()
|
|
202
|
-
return raw if raw == "*" else position_types[i](raw)
|
|
203
|
-
|
|
204
|
-
filters = []
|
|
205
|
-
for custom_subject in custom_subjects:
|
|
206
|
-
parts = custom_subject.split(",")
|
|
207
|
-
assert len(parts) == num_items, (
|
|
208
|
-
f"Subject '{custom_subject}' has {len(parts)} parts, expected {num_items} for "
|
|
209
|
-
f"task {self.display_name()}"
|
|
210
|
-
)
|
|
211
|
-
filters.append(tuple(cast(part, i) for i, part in enumerate(parts)))
|
|
212
|
-
|
|
213
|
-
# check if all parts of custom subjects exists (* is a wildcard)
|
|
214
|
-
legal_values = [
|
|
215
|
-
set([s[i] for s in self.SUBJECTS if isinstance(s, tuple)] + ["*"]) for i in range(num_items)
|
|
216
|
-
]
|
|
217
|
-
|
|
218
|
-
for tpl in filters:
|
|
219
|
-
for i, v in enumerate(tpl):
|
|
220
|
-
assert v in legal_values[i], f"Subject part {v} not found in task {self.__class__.__name__}"
|
|
221
|
-
|
|
222
|
-
# filter task subjects. * is a supported wildcard for a specific item in a tuple, e.g. "DE_DE, *"
|
|
223
|
-
chosen_subjects: list[tuple] = []
|
|
224
|
-
for subject in self.SUBJECTS:
|
|
225
|
-
subject_tuple = subject if isinstance(subject, tuple) else tuple(str(subject).split(","))
|
|
226
|
-
for filter in filters:
|
|
227
|
-
if all(filter[i] == "*" or filter[i] == subject_tuple[i] for i in range(num_items)):
|
|
228
|
-
chosen_subjects.append(subject_tuple)
|
|
229
|
-
break
|
|
230
|
-
return chosen_subjects
|
|
231
|
-
else:
|
|
232
|
-
for cs in custom_subjects:
|
|
233
|
-
assert cs in self.SUBJECTS, f"Subject {cs} not found in task {self.__class__.__name__}"
|
|
234
|
-
return custom_subjects
|
|
235
|
-
|
|
236
188
|
def _load_hf_dataset(self, **kwargs: Any) -> Any:
|
|
237
189
|
cache_dir: str = os.environ.get("HF_DATASET_CACHE_DIR", f"{Path.home()}/.cache/huggingface/datasets")
|
|
238
190
|
download_config = DownloadConfig(cache_dir=cache_dir, max_retries=5)
|
|
@@ -244,8 +196,8 @@ class BaseTask[SubjectType](Task):
|
|
|
244
196
|
)
|
|
245
197
|
|
|
246
198
|
def _shuffle_splits(self, hf_dataset: DatasetDict) -> dict[str, Any]:
|
|
199
|
+
assert self.rnd is not None, "Task RNG is unseeded; build tasks via `with_overwrite`."
|
|
247
200
|
dataset = {}
|
|
248
|
-
self.rnd = random.Random(RANDOM_SEED)
|
|
249
201
|
|
|
250
202
|
for split, data in hf_dataset.items():
|
|
251
203
|
if split not in [self.SAMPLE_SPLIT, self.FEWSHOT_SPLIT]:
|
|
@@ -413,6 +365,7 @@ class BaseTask[SubjectType](Task):
|
|
|
413
365
|
return None
|
|
414
366
|
|
|
415
367
|
def _sample_fewshot_examples(self, item: dict[str, Any]) -> list[dict]:
|
|
368
|
+
assert self.rnd is not None, "Task RNG is unseeded; build tasks via `with_overwrite`."
|
|
416
369
|
if self.FEWSHOT_SPLIT == self.SAMPLE_SPLIT:
|
|
417
370
|
# If the fewshot and sample splits are the same, we risk including the current eval item
|
|
418
371
|
# as a fewshot example (leaking the answer). To prevent this, sample one extra example,
|
|
@@ -546,3 +499,51 @@ class BaseTask[SubjectType](Task):
|
|
|
546
499
|
|
|
547
500
|
def display_name(self) -> str:
|
|
548
501
|
return self.NAME
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def _subject_parts(subject: object) -> tuple[str, ...]:
|
|
505
|
+
"""A subject as its stringified parts: tuple subjects keep their fields, scalars are a single part.
|
|
506
|
+
|
|
507
|
+
Comparing string forms means tuple fields of any type work (e.g. tuple[str, int, str]) without
|
|
508
|
+
having to parse the CLI token into each field's native type.
|
|
509
|
+
"""
|
|
510
|
+
return tuple(str(field) for field in subject) if isinstance(subject, tuple) else (str(subject),)
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def resolve_overwrite_subjects[SubjectType](
|
|
514
|
+
custom_subjects: list[str], accepted_subjects: list[SubjectType], task_name: str
|
|
515
|
+
) -> list[SubjectType]:
|
|
516
|
+
"""Restrict `accepted_subjects` to the ones requested via --task-subjects.
|
|
517
|
+
|
|
518
|
+
A subject matches a token when their parts agree position by position, where "*" matches any one
|
|
519
|
+
part -- so "DE_DE,*" selects every German subject and "*" selects every scalar subject.
|
|
520
|
+
"""
|
|
521
|
+
if not accepted_subjects:
|
|
522
|
+
raise ValueError(f"Task {task_name} has no SUBJECTS defined")
|
|
523
|
+
|
|
524
|
+
filters = {token: tuple(part.strip() for part in token.split(",")) for token in custom_subjects}
|
|
525
|
+
|
|
526
|
+
# Select and validate in one pass. Every filter is tried against every subject (no early exit), so
|
|
527
|
+
# a filter still counts as used when its subjects were already selected by an earlier filter --
|
|
528
|
+
# e.g. "a,*" after "a,1" is valid, not unused.
|
|
529
|
+
chosen_subjects: list[SubjectType] = []
|
|
530
|
+
used_filters: set[str] = set()
|
|
531
|
+
for subject in accepted_subjects:
|
|
532
|
+
fields = _subject_parts(subject)
|
|
533
|
+
matching = [
|
|
534
|
+
token
|
|
535
|
+
for token, parts in filters.items()
|
|
536
|
+
if len(parts) == len(fields) and all(p in ("*", f) for p, f in zip(parts, fields))
|
|
537
|
+
]
|
|
538
|
+
if matching:
|
|
539
|
+
chosen_subjects.append(subject)
|
|
540
|
+
used_filters.update(matching)
|
|
541
|
+
|
|
542
|
+
for token in custom_subjects:
|
|
543
|
+
if token not in used_filters:
|
|
544
|
+
raise ValueError(
|
|
545
|
+
f"Subject '{token}' not found in task {task_name}. Subjects are matched by their "
|
|
546
|
+
f"string form, so check number and enum formatting."
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
return chosen_subjects
|
|
@@ -25,7 +25,6 @@ class ARC(BaseTask[str]):
|
|
|
25
25
|
RESPONSE_TYPE = ResponseType.LOGLIKELIHOODS
|
|
26
26
|
METRICS = [AccuracyLoglikelihood, AccuracyNormLoglikelihood, BitsPerByteLoglikelihood]
|
|
27
27
|
SUBJECTS = ["ARC-Easy", "ARC-Challenge"]
|
|
28
|
-
PERTURBATION_UNMODIFIABLE_WORDS = ["Question"] + get_n_letters(5)
|
|
29
28
|
LANGUAGE = Language.ENG
|
|
30
29
|
|
|
31
30
|
def __init__(self, num_fewshot: int = 0) -> None:
|
{eval_framework-0.9.1 → eval_framework-0.10.0}/src/eval_framework/tasks/benchmarks/arc_de.py
RENAMED
|
@@ -22,7 +22,6 @@ class ARC_DE(BaseTask[str]):
|
|
|
22
22
|
RESPONSE_TYPE = ResponseType.LOGLIKELIHOODS
|
|
23
23
|
METRICS = [AccuracyLoglikelihood, AccuracyNormLoglikelihood, BitsPerByteLoglikelihood]
|
|
24
24
|
SUBJECTS = [NO_SUBJECT]
|
|
25
|
-
PERTURBATION_UNMODIFIABLE_WORDS = ["Frage"] + get_n_letters(5)
|
|
26
25
|
LANGUAGE = Language.DEU
|
|
27
26
|
|
|
28
27
|
def __init__(self, num_fewshot: int = 0) -> None:
|