Я использую snakemake в контексте машинного обучения. У меня есть два правила (process_x_only
и process_x_and_y
), которые processed_x.txt
качестве целевого вывода и, следовательно, неоднозначны. Смотрите следующий код:
rule process_x_only:
input:
'x.txt',
output:
'processed_x.txt'
rule process_x_and_y:
input:
'x.txt',
'y.txt'
output:
'processed_x.txt',
'processed_y.txt'
ruleorder: process_x_only > process_x_and_y
rule refit_model:
input:
'processed_x.txt',
'processed_y.txt'
output:
'predictions_refit.txt'
rule predict_model:
input:
'processed_x.txt'
output:
'predictions.txt'
Следуя документации snakemake, я использую инструкцию ruleorder
чтобы указать, что желательно обрабатывать только x (т.е. Только тогда, когда y нужно обрабатывать process_x_and_y
нужно запустить, в противном случае достаточно просто обработать x и process_x_only
можно запустить.). Это устраняет проблему двусмысленности, но представляет собой еще одну проблему. Когда я выполняю:
snakemake predictions_refit.txt
snakemake сначала выполнить process_x_only
, а затем process_x_and_y
, в то время как в этом случае я только хочу process_x_and_y
быть выполнена. Как заставить snakemake создавать DAG, где выполняется только process_x_and_y
?
Чтобы уточнить: Это большое упрощение моей реальной проблемы. Я знаю, что изменение ограничений моего оператора проблемы решит проблему, но меня интересует, как решить, что snakemake выполняет оба правила в ruleorder.
Чтобы добавить: при выполнении refit model
правил отображается следующее предупреждение:
Warning: the following output files of rule process_x_only were not
present when the DAG was created:
{'processed_x.txt'}
Это интересный вопрос. Я не знал, что snakemake не сможет решить это самостоятельно. Хотелось бы сказать snakemake, какое правило создает файлы для refit_model
rule refit_model:
input:
rules.process_x_and_y.output
output:
'predictions_refit.txt'
Тем не менее, вы все еще можете столкнуться с трудностями в более сложном snakemake refit_model predict_model
, или если вы попытаетесь запустить snakemake refit_model predict_model
. Помогает ли вам решить проблему?
Для реального решения я думаю, что snakemake придется обрезать DAG после его создания. Я предлагаю вам открыть новый вопрос здесь.