digraph Taskflow {
  subgraph cluster_error1 {
    label="error1: no source tasks"
    e1A[label="A" shape=diamond color=black fillcolor=aquamarine style=filled];
    e1B[label="B"];
    e1C[label="C"];
    e1A->e1A[style=dashed label="0"];
    e1A->e1B[style=dashed label="1"];
    e1A->e1C[style=dashed label="2"];
  }
  subgraph cluster_fix1 {
    label="fix1: adds a source"
    f1S[label="S"];
    f1A[label="A" shape=diamond color=black fillcolor=aquamarine style=filled];
    f1B[label="B"];
    f1C[label="C"];
    f1S->f1A;
    f1A->f1A[style=dashed label="0"];
    f1A->f1B[style=dashed label="1"];
    f1A->f1C[style=dashed label="2"];
  }
  subgraph cluster_error2 {
    label="error2: race on D"
    e2C[label="C" shape=diamond color=black fillcolor=aquamarine style=filled];
    e2D[label="D"];
    e2F[label="F"];
    e2E[label="E"];
    e2E->e2D;
    e2C->e2D[style=dashed label="0"];
    e2C->e2F[style=dashed label="1"];
  }
  subgraph cluster_fix2 {
    label="fix2: adds an auxiliary task"
    f2C[label="C" shape=diamond color=black fillcolor=aquamarine style=filled];
    f2D[label="D"];
    f2Daux[label="D-aux"]
    f2F[label="F"];
    f2E[label="E"];
    f2E->f2D;
    f2C->f2Daux[style=dashed label="0"];
    f2C->f2F[style=dashed label="1"];
    f2Daux->f2D
  }
  subgraph cluster_risky{
    label="risky: X might be raced"
    rP[label="P" shape=diamond color=black fillcolor=aquamarine style=filled];
    rM[label="M" shape=diamond color=black fillcolor=aquamarine style=filled];
    rQ[label="Q"]
    rX[label="X"]
    rN[label="N"]
    rP->rX[style=dashed label="1"]
    rM->rX[style=dashed label="0"]
    rM->rN[style=dashed label="1"]
    rP->rQ[style=dashed label="0"]
  }
}
