class_docstr: An subtask graph builder which build subtask graph for chunk graph based on passed band_resource.
  
  If push shuffle is used, this builder will validate predecessors orders consistency of ShuffleProxy between
  chunk graph and generated subtask graph.
code: def _iter_start_ops(cls, chunk_graph: ChunkGraph):
      visited = set()
      op_keys = set()
      start_chunks = deque(chunk_graph.iter_indep())
      stack = deque([start_chunks.popleft()])
  
      while stack:
          chunk = stack.popleft()
          if chunk not in visited:
              inp_chunks = chunk_graph.predecessors(chunk)
              if not inp_chunks or all(
                  inp_chunk in visited for inp_chunk in inp_chunks
              ):
                  if len(inp_chunks) == 0:
                      op_key = chunk.op.key
                      if op_key not in op_keys:
                          op_keys.add(op_key)
                          yield chunk.op
                  visited.add(chunk)
                  stack.extend(
                      c for c in chunk_graph[chunk] if c not in visited
                  )
              else:
                  stack.appendleft(chunk)
                  stack.extendleft(
                      reversed(
                          [
                              c
                              for c in chunk_graph.predecessors(chunk)
                              if c not in visited
                          ]
                      )
                  )
          if not stack and start_chunks:
              stack.appendleft(start_chunks.popleft())
  
imports: import itertools
  import logging
  from collections import deque, defaultdict
  from typing import Dict, List, Tuple, Type, Union
  from ....config import Config
  from ....core import ChunkGraph, ChunkType, enter_mode, DAG
  from ....core.operand import Fetch, VirtualOperand, LogicKeyGenerator, MapReduceOperand, OperandStage, ShuffleProxy, ShuffleFetchType
  from ....lib.ordered_set import OrderedSet
  from ....resource import Resource
  from ....typing import BandType, OperandType
  from ....utils import build_fetch, build_fetch_shuffle, tokenize
  from ...subtask import SubtaskGraph, Subtask
  from ..core import Task, new_task_id, MapReduceInfo
  from .assigner import AbstractGraphAssigner, GraphAssigner
  from .fusion import Coloring
label_desc: Use image node_id 3 for calling the GraphAnalyzer obj's underlying member method code with example usage: obj._iter_start_ops(cls, chunk_graph) without return types