code: def _all_successor_head_pushdown(
      self, successors: List[TileableType]
  ):
      for succ in successors:
          push_down_rule_types = [
              rule_type
              for rule_type in self._rule_type_to_op_types
              if issubclass(rule_type, HeadPushDown)
              and isinstance(
                  succ.op, tuple(self._rule_type_to_op_types[rule_type])
              )
          ]
          if not push_down_rule_types:
              return False
  
          for rule_type in push_down_rule_types:
              rule = self._cached_rule(rule_type)
              if not rule._can_push_down(succ.op):
                  return False
      return True
  
file_path: mars/mars/optimization/logical/common/head.py
imports: from typing import List
  from ....core import OperandType, TileableType, CHUNK_TYPE
  from ....dataframe.base.value_counts import DataFrameValueCounts
  from ....dataframe.datasource.core import HeadOptimizedDataSource
  from ....dataframe.sort.core import DataFrameSortOperand
  from ....dataframe.utils import parse_index
  from ....utils import implements
  from ..core import OperandBasedOptimizationRule, OptimizationRecord, OptimizationRecordType
label_desc: Use image node_id 2 for calling the HeadPushDown obj's underlying member method code with example usage: obj._all_successor_head_pushdown(successors) and returns: True, False, False