class_docstr: The classic Sugiyama layout aka layered layout.
  
  - See https://en.wikipedia.org/wiki/Layered_graph_drawing
  - Excellent explanation: https://www.youtube.com/watch?v=Z0RGCWxvCxA
  
  
  **Attributes**
      - dirvh (int): the current aligment state for alignment policy:
               dirvh=0 -> dirh=+1, dirv=-1: leftmost upper
               dirvh=1 -> dirh=-1, dirv=-1: rightmost upper
               dirvh=2 -> dirh=+1, dirv=+1: leftmost lower
               dirvh=3 -> dirh=-1, dirv=+1: rightmost lower
      - order_iter (int): the default number of layer placement iterations
      - order_attr (str): set attribute name used for layer ordering
      - xspace (int): horizontal space between vertices in a layer
      - yspace (int): vertical space between layers
      - dw (int): default width of a vertex
      - dh (int): default height of a vertex
      - g (GraphBase): the graph component reference
      - layers (list[sugiyama.layer.Layer]): the list of layers
      - layoutVertices (dict): associate vertex (possibly dummy) with their sugiyama attributes
      - ctrls (dict): associate edge with all its vertices (including dummies)
      - dag (bool): the current acyclic state
      - init_done (bool): True if things were initialized
  
  **Example**
  
      ::
  
          g = nx.generators.connected_watts_strogatz_graph(1000, 2, 0.3)
          # render
          SugiyamaLayout.draw(g)
          # positions
          positions_dictionary = SugiyamaLayout.arrange(g)
docstr: Inner edges are edges between dummy nodes
  
  - type 0 is regular crossing regular (or sharing vertex)
  - type 1 is inner crossing regular (targeted crossings)
  - type 2 is inner crossing inner (avoided by reduce_crossings phase)
docstr_tok: ["Inner","edges","are","edges","between","dummy","nodes","-","type","0","is","regular","crossing","regular","(","or","sharing","vertex",")","-","type","1","is","inner","crossing","regular","(","targeted","crossings",")","-","type","2","is","inner","crossing","inner","(","avoided","by","reduce_crossings","phase",")"]
code: def _detect_alignment_conflicts(self):
      """
  
      Inner edges are edges between dummy nodes
  
      - type 0 is regular crossing regular (or sharing vertex)
      - type 1 is inner crossing regular (targeted crossings)
      - type 2 is inner crossing inner (avoided by reduce_crossings phase)
  
      """
      curvh = self.dirvh  # save current dirvh value
      self.dirvh = 0
      self.conflicts = []
      for layer in self.layers:
          last = len(layer) - 1
          prev = layer.prevlayer()
          if not prev:
              continue
          k0 = 0
          k1_init = len(prev) - 1
          level = 0
          for l1, v in enumerate(layer):
              if not self.layoutVertices[v].dummy:
                  continue
              if l1 == last or v.inner(-1):
                  k1 = k1_init
                  if v.inner(-1):
                      k1 = self.layoutVertices[v.neighbors(-1)[-1]].pos
                  for vl in layer[level : l1 + 1]:
                      for vk in layer.neighbors(vl):
                          k = self.layoutVertices[vk].pos
                          if k < k0 or k > k1:
                              self.conflicts.append((vk, vl))
                  level = l1 + 1
                  k0 = k1
      self.dirvh = curvh
  
imports: import pandas, typing
  from sys import getrecursionlimit, setrecursionlimit
  from graphistry.layout.graph import Vertex, GraphBase, Graph, Edge
  from graphistry.layout.utils import DummyVertex, LayoutVertex, Rectangle, size_median
  from graphistry.layout.utils.layer import Layer
label_desc: Use image node_id 27 for calling the SugiyamaLayout obj's underlying member method code with example usage: obj._detect_alignment_conflicts() without return types