Skip to content

Feedback loop

Problem

You need to repeat a process or workflow multiple times, using the output from the previous iteration as the input to the next iteration.

Solution

Warning

This feature is experimental and may change in the future.

Use the recurse method on a process or workflow to execute it iteratively. In order to use this feature, the process or workflow must have identical input and output definitions, and any initial values must be Groovy values or value channels -- queue channels are not supported (yet).

You can use the times operator to perform a fixed number of iterations, or the until operator to iterate until some condition is satisfied.

Code

For an iterative process:

nextflow.preview.recursion=true

params.data = "$baseDir/data/hello.txt"

process foo {
  input:
    path 'input.txt'
  output:
    path 'result.txt'
  script:
    """
    cat input.txt > result.txt
    echo "Task ${task.index} was here" >> result.txt
    """
}

workflow {
  // perform a fixed number of iterations
  foo
    .recurse(file(params.data))
    .times(10)

  // iterate until some condition is satisfied
  foo
    .recurse(file(params.data))
    .until { it -> it.size() > 100 }

  foo
    .out
    .view(it -> it.text)
}

For an iterative workflow:

nextflow.preview.recursion=true

params.input = "$baseDir/data/hello.txt"

process tick {
  input:
    path 'input.txt'
  output:
    path 'result.txt'
  script:
    """
    cat input.txt > result.txt
    echo "Task ${task.index} : tick" >> result.txt
    """
}

process tock {
  input:
    path 'input.txt'
  output:
    path 'result.txt'
  script:
    """
    cat input.txt > result.txt
    echo "Task ${task.index} : tock" >> result.txt
    """
}

workflow clock {
  take: infile
  main:
    infile | tick | tock
  emit:
    tock.out
}

workflow {
  clock
    .recurse(file(params.input))
    .until { it -> it.size() > 100 }

  clock
    .out
    .view(it -> it.text)
}

Run it

Use the the following command to execute the example:

# iterative process
nextflow run nextflow-io/patterns/feedback-loop-process.nf

# iterative workflow
nextflow run nextflow-io/patterns/feedback-loop-workflow.nf