snakemake - 没有歧义时的 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_file
Snakemake 不应将其视为。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 次迭代中以高置信度失败。
我进行了一些实验并得到了令人惊讶的结果:
- 如果optional_input.txt不存在则测试通过
- 如果三个规则中的任何一个被删除,则测试通过
这个问题在两台不同的 Windows 机器上得到确认,分别是 Snakemake 版本 5.7.4 和 6.5.3。
我的问题是这是否是 Snakemake 错误。这种行为还有另一种解释吗?
解决方案
推荐阅读
- html - 滚动导航栏右侧透明?
- firebase - 如何按当前日期从 Cloud Firestore 获取数据?
- angular - 服务和构建命令的 Angular CLI 问题
- php - 用年份 php 对数组进行排序
- .net-core - 与连接到现有总线的消费者一起阅读消息
- xaml - 如何将这三个按钮放在底部的中心?
- python - 为什么我不断收到错误 root 无法找到由“1cccee45d6e7”标识的修订版?
- ios - 尝试使用 Xcode 构建应用程序时出现 React-native 错误
- python - 使用 keras 时,BN 层如何在 DCGAN 中工作?
- javascript - 如何使用 JSON 数据创建所需的 UI