private void upWalk() {
    for (int currentNodeIndex = myDownIndex; currentNodeIndex >= myUpIndex; currentNodeIndex--) {
      if (nodeIsVisible(currentNodeIndex)) {
        int nearlyDown = Integer.MAX_VALUE;
        int minAdjNumber = Integer.MAX_VALUE;
        for (int downNode : myLiteDelegateGraph.getNodes(currentNodeIndex, NodeFilter.DOWN)) {
          if (downNode > myDownIndex) {
            addEdgeOrArrow(currentNodeIndex, downNode, false);
            continue;
          }

          if (nodeIsVisible(downNode)) {
            minAdjNumber = Math.min(minAdjNumber, myNumbers.getNumber(downNode));
          } else {
            nearlyDown = Math.min(nearlyDown, myNumbers.getNumber(downNode));
          }
        }

        if (nearlyDown == minAdjNumber || nearlyDown == Integer.MAX_VALUE) {
          myNumbers.setNumber(currentNodeIndex, minAdjNumber);
        } else {
          addDottedEdge(currentNodeIndex, nearlyDown);
          myNumbers.setNumber(currentNodeIndex, nearlyDown);
        }
      } else {
        // node currentNodeIndex invisible

        int nearlyDown = Integer.MAX_VALUE;
        for (int downNode : myLiteDelegateGraph.getNodes(currentNodeIndex, NodeFilter.DOWN)) {
          if (nodeIsVisible(downNode)) {
            nearlyDown = Math.min(nearlyDown, downNode);
          } else {
            if (downNode <= myDownIndex)
              nearlyDown = Math.min(nearlyDown, myNumbers.getNumber(downNode));
          }
        }
        myNumbers.setNumber(currentNodeIndex, nearlyDown);
      }
    }
  }
  private void downWalk() {
    for (int currentNodeIndex = myUpIndex; currentNodeIndex <= myDownIndex; currentNodeIndex++) {
      if (nodeIsVisible(currentNodeIndex)) {
        int nearlyUp = Integer.MIN_VALUE;
        int maxAdjNumber = Integer.MIN_VALUE;
        for (int upNode : myLiteDelegateGraph.getNodes(currentNodeIndex, NodeFilter.UP)) {
          if (upNode < myUpIndex) {
            addEdgeOrArrow(currentNodeIndex, upNode, true);
            continue;
          }

          if (nodeIsVisible(upNode)) {
            maxAdjNumber = Math.max(maxAdjNumber, myNumbers.getNumber(upNode));
          } else {
            nearlyUp = Math.max(nearlyUp, myNumbers.getNumber(upNode));
          }
        }

        if (nearlyUp == maxAdjNumber || nearlyUp == Integer.MIN_VALUE) {
          myNumbers.setNumber(currentNodeIndex, maxAdjNumber);
        } else {
          addDottedEdge(currentNodeIndex, nearlyUp);
          myNumbers.setNumber(currentNodeIndex, nearlyUp);
        }
      } else {
        // node currentNodeIndex invisible

        int nearlyUp = Integer.MIN_VALUE;
        for (int upNode : myLiteDelegateGraph.getNodes(currentNodeIndex, NodeFilter.UP)) {
          if (nodeIsVisible(upNode)) {
            nearlyUp = Math.max(nearlyUp, upNode);
          } else {
            if (upNode >= myUpIndex) nearlyUp = Math.max(nearlyUp, myNumbers.getNumber(upNode));
          }
        }
        myNumbers.setNumber(currentNodeIndex, nearlyUp);
      }
    }
  }
 private void cleanup() {
   for (int currentNodeIndex = myUpIndex; currentNodeIndex <= myDownIndex; currentNodeIndex++) {
     myNumbers.setNumber(currentNodeIndex, Integer.MAX_VALUE);
   }
 }