首页 > 解决方案 > 没有歧义时的 AmbiguousRuleException

问题描述

在这个 Snakemake 脚本中,rule all定义了一个目标,还有其他三个规则将此目标声明为输出:

rule all:
    input:
         "target.txt"


rule from_non_existing_file:
    input:
        "non_existing_file.txt"
    output:
        "target.txt"


rule broad_input:
    output:
        "target.txt"


rule narrow_input:
    input:
        "optional_input.txt"
    output:
        "target.txt"

ruleorder: narrow_input > broad_input

文件non_existing_file.txt不存在,因此rule from_non_existing_fileSnakemake 不应将其视为。rule broad_input没有输入文件,所以它总是可以产生输出,并且只要rule narrow_input文件optional_input.txt存在就可以产生输出。为了解决宽输入和窄输入之间的歧义,定义了规则顺序。

只要文件optional_input.txt存在,脚本就会首选rule narrow_input

Job counts:
        count   jobs
        1       all
        1       narrow_input
        2

该脚本大部分时间都可以工作,但有时会失败:

AmbiguousRuleException:
Rules narrow_input and broad_input are ambiguous for the file target.txt.
Consider starting rule output with a unique prefix, constrain your wildcards, or use the ruleorder directive.
Wildcards:
        narrow_input:
        broad_input:
Expected input files:
        narrow_input: optional_input.txt
        broad_input: Expected output files:
        narrow_input: target.txt
        broad_input: target.txt

此处 Snakemake 忽略了指令已定义的事实ruleorder,并建议重新定义它。

为了确认这种行为,我设计了下面的测试脚本:

import os

def test_snakemake():
    for i in range(100):
        rcode = os.system("snakemake --cores=1 --printshellcmds --forceall --dry-run")
        assert(rcode == 0)

该测试在前 20 次迭代中以高置信度失败。

我进行了一些实验并得到了令人惊讶的结果:

这个问题在两台不同的 Windows 机器上得到确认,分别是 Snakemake 版本 5.7.4 和 6.5.3。

我的问题是这是否是 Snakemake 错误。这种行为还有另一种解释吗?

标签: snakemake

解决方案


推荐阅读