From 921f4f715e3814fc2e22a4f6527ff62e066cc5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Mon, 6 Sep 2021 21:59:08 +0200 Subject: [PATCH] perf: improve job selection performance in case of potential ambiguity that is resolved by comprehensive ruleorder statements. (#1147) * perf: improve job selection performance in case of potential ambiguity that is resolved by comprehensive ruleorder statements. * fmt * improve order checking optimization after correct remarks from @dkuzminov. --- snakemake/dag.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/snakemake/dag.py b/snakemake/dag.py index 44e4081d0..dbd6081fe 100755 --- a/snakemake/dag.py +++ b/snakemake/dag.py @@ -735,7 +735,18 @@ def update( exceptions = list() cycles = list() - for job in jobs: + # check if all potential producers are strictly ordered + jobs = sorted(jobs, reverse=True) + discarded_jobs = set() + + def is_strictly_higher_ordered(pivot_job): + return all( + pivot_job > job + for job in jobs + if job is not pivot_job and job not in discarded_jobs + ) + + for i, job in enumerate(jobs): logger.dag_debug(dict(status="candidate", job=job)) if file in job.input: cycles.append(job) @@ -753,9 +764,11 @@ def update( progress=progress, create_inventory=create_inventory, ) - # TODO this might fail if a rule discarded here is needed - # elsewhere producers.append(job) + if is_strictly_higher_ordered(job): + # All other jobs are either discarded or strictly less given + # any defined ruleorder. + break except ( MissingInputException, CyclicGraphException, @@ -763,6 +776,7 @@ def update( WorkflowError, ) as ex: exceptions.append(ex) + discarded_jobs.add(job) except RecursionError as e: raise WorkflowError( e,