diff --git a/app/harness/split_selection.py b/app/harness/split_selection.py new file mode 100644 index 0000000..c932e83 --- /dev/null +++ b/app/harness/split_selection.py @@ -0,0 +1,47 @@ +"""视频级切分选择:signal 分层、视频聚合、贪心联合约束选择(纯函数)。 + +结果驱动切分管线的核心:把诊断信号投影为多样性格子,供贪心选择器最大化覆盖。 +本模块起步定义 evolution_target 派生与多样性格子;后续追加 score_signal / +build_video_records / select_split。 +""" + +from __future__ import annotations + +_EVOLUTION_TARGET = { + "extraction_failure": "tool", + "search_failure": "skill", + "reasoning_failure": "skill", + "mixed": "system", +} + + +def evolution_target_of(error_type: str) -> str: + """由 error_type 确定性派生进化目标(tool/skill/system)。 + + 这是报告用的派生标注,非独立多样性轴(多样性主格子=task_type×error_type)。 + + 参数: + error_type: 诊断瀑布归因的错误类别(extraction/search/reasoning/mixed_failure)。 + + 返回: + 进化目标字符串 tool / skill / system。 + + 异常: + ValueError: error_type 不在已知集合内(不静默兜底)。 + """ + if error_type not in _EVOLUTION_TARGET: + raise ValueError(f"未知 error_type: {error_type}") + return _EVOLUTION_TARGET[error_type] + + +def cell_of(task_type: str, error_type: str) -> tuple[str, str]: + """构造多样性主格子 = (task_type, error_type)。 + + 参数: + task_type: 题型(12 类之一)。 + error_type: 错误类别(4 类之一)。 + + 返回: + (task_type, error_type) 二元组,作为覆盖计数的格子键。 + """ + return (task_type, error_type) diff --git a/tests/unit/test_split_selection.py b/tests/unit/test_split_selection.py new file mode 100644 index 0000000..1cb2c66 --- /dev/null +++ b/tests/unit/test_split_selection.py @@ -0,0 +1,12 @@ +from app.harness.split_selection import cell_of, evolution_target_of + + +def test_evolution_target_mapping(): + assert evolution_target_of("extraction_failure") == "tool" + assert evolution_target_of("search_failure") == "skill" + assert evolution_target_of("reasoning_failure") == "skill" + assert evolution_target_of("mixed") == "system" + + +def test_cell_is_task_type_x_error_type(): + assert cell_of("Counting Problem", "search_failure") == ("Counting Problem", "search_failure")