Неоднозначное исключение, когда нет двусмысленности

#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