В моем графике рабочего процесса я объединяю один или несколько входных файлов на основе суффикса. В случаях, когда для данного суффикса существует только один файл, операция слияния тривиальна и может выполняться локально. В случае, если существует несколько таких файлов для слияния, операция слияния должна выполняться в кластере и занимает часы.
Есть ли способ указать / выбрать использование определенного правила, если я заранее знаю все входные файлы? Другими словами, есть ли способ выразить приоритет правила на основе количества входов в правило?
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}.txt
и merged_trivial_{sample}.txt
), но это существенно портит каждое правило, которое работает с объединенными данными, с утомительными функциями ввода
Если бы кто-нибудь мог предоставить рецепт динамического изменения графика рабочего процесса, это было бы здорово.