code: def checkJobGraphAcylic(self):
          
          #Get the root jobs
          roots = self.getRootJobs()
          if len(roots) == 0:
              raise JobGraphDeadlockException("Graph contains no root jobs due to cycles")
  
          #Get implied edges
          extraEdges = self._getImpliedEdges(roots)
  
          #Check for directed cycles in the augmented graph
          visited = set()
          for root in roots:
              root._checkJobGraphAcylicDFS([], visited, extraEdges)
docs: :raises toil.job.JobGraphDeadlockException: if the connected component \
          of jobs containing this job contains any cycles of child/followOn dependencies \
          in the *augmented job graph* (see below). Such cycles are not allowed \
          in valid job graphs.
  
          A follow-on edge (A, B) between two jobs A and B is equivalent \
          to adding a child edge to B from (1) A, (2) from each child of A, \
          and (3) from the successors of each child of A. We call each such edge \
          an edge an "implied" edge. The augmented job graph is a job graph including \
          all the implied edges.
  
          For a job graph G = (V, E) the algorithm is ``O(|V|^2)``. It is ``O(|V| + |E|)`` for \
          a graph with no follow-ons. The former follow-on case could be improved!