根据可能的输入数实现动态规则优先级?(蛇制)



在我的工作流程图中,我根据后缀合并一个或多个输入文件。在给定后缀只有一个文件的情况下,合并操作很简单,可以在本地完成。如果有多个此类文件要合并,则合并操作需要在群集上运行,并且需要数小时。

如果我提前知道所有输入文件,有没有办法指定/选择应该使用特定规则?换句话说,有没有办法根据规则的输入数量来表示规则优先级?

def _all_files_for_the_sample(wildcards):
# lookup all known files and return list
# of files matching wildcards.sample
...
# these two rules effectively have the same structure.
# I am omitting the implementation
rule super_fast_local_merge:
input: _all_files_for_the_sample
output: merged_{sample}.txt
...
rule super_slow_merge:
input: _all_files_for_the_sample
output: merged_{sample}.txt
...

现在,我也有对上述任一规则的输出执行计算的规则。手册提到,当链接多个规则链时,直接引用全局规则中的符号更有效(例如,声明rules.super_slow_merge.output而不是在不同的规则中复制merged_{sample}.txt)。我被引导相信,通过锯齿特定规则的输出,我将能够影响图形的形状:

def _choose_merged_file(wildcards):
all_inputs = _all_files_for_the_sample(wildcards.sample)
if len(all_inputs) <= 1:
# use trivial merge
return rules.super_fast_local_merge.output
else:
# fallback to slow merge
return rules.super_slow_merge.output
rule work_on_merged_data:
input: _choose_merged_file,
output: final_result_{sample}.txt
...

如果我在这里运行类似上面的东西,那么 Snakemake 抱怨规则模棱两可。有没有办法修改_choose_merged_file输入函数来克服这个限制?有没有其他方法可以直接为我想要的规则添加别名?

注意:我设法通过使每个实现返回不同的文件名(例如merged_slow_{sample}.txtmerged_trivial_{sample}.txt),但这样做基本上会玷污每个使用繁琐输入函数处理合并数据的规则

如果有人可以提供动态更改工作流图的配方,那就太好了。

我很遗憾地说,目前没有合理的方法来实现这一目标。但是,在不久的将来会有一个解决方案,即作业分组功能。它将允许您根据通配符、输入文件等来决定是否应将某些连接的作业一起提交(提交到群集上的同一节点)。这样,您可以将快速合并作业与运行时间更长的内容分组在一起。

最新更新