code: private <E> Collection<Block<S, L>> initialize(UniversalGraph<S, E, ?, L> graph,
                                                     Collection<? extends S> initialNodes) {
          Iterable<? extends S> origStates;
          if (initialNodes == null || initialNodes.isEmpty()) {
              origStates = graph.getNodes();
          } else {
              origStates = GraphTraversal.depthFirstOrder(graph, initialNodes);
          }
  
          Map<L, TransitionLabel<S, L>> transitionMap = new HashMap<>();
  
          stateStorage = graph.createStaticNodeMapping();
  
          int numStates = 0;
          for (S origState : origStates) {
              State<S, L> state = new State<>(numStates++, origState);
              stateStorage.put(origState, state);
              stateList.add(state);
          }
  
          InitialPartitioning<S, L> initPartitioning = new HashMapInitialPartitioning<>(graph);
  
          for (State<S, L> state : stateList) {
              S origState = state.getOriginalState();
  
              Block<S, L> block = initPartitioning.getBlock(origState);
              block.addState(state);
  
              for (E edge : graph.getOutgoingEdges(origState)) {
                  S origTarget = graph.getTarget(edge);
                  State<S, L> target = stateStorage.get(origTarget);
                  L label = graph.getEdgeProperty(edge);
                  TransitionLabel<S, L> transition = transitionMap.computeIfAbsent(label, TransitionLabel::new);
                  Edge<S, L> edgeObj = new Edge<>(state, target, transition);
                  state.addOutgoingEdge(edgeObj);
                  target.addIncomingEdge(edgeObj);
              }
          }
          stateList.quickClear();
  
          return initPartitioning.getInitialBlocks();
      }
docs: Builds the initial data structures and performs the initial partitioning.