#snakemake #ruleorder
Вопрос:
В этом скрипте rule all
Snakemake определяется цель, и есть три других правила, которые утверждают, что эта цель является результатом:
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
Змееподобный не должен рассматриваться. У 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.
Мой вопрос в том, является ли это ошибкой Змеиного змея. Есть ли другое объяснение такому поведению?
Комментарии:
1. Ваша проблема может быть связана с этим: github.com/snakemake/snakemake/issues/970