class_docstr: The optimizer for logical operators.
code: def rules(self) -> List[Rule]:
      rules = add_user_provided_logical_rules(DEFAULT_LOGICAL_RULES)
      return [rule_cls() for rule_cls in rules]
  
file_path: ray/python/ray/data/_internal/logical/optimizers.py
imports: from typing import List
  from ray.data._internal.logical.interfaces import LogicalPlan, Optimizer, PhysicalPlan, Rule
  from ray.data._internal.logical.rules._user_provided_optimizer_rules import add_user_provided_logical_rules, add_user_provided_physical_rules
  from ray.data._internal.logical.rules.inherit_target_max_block_size import InheritTargetMaxBlockSizeRule
  from ray.data._internal.logical.rules.operator_fusion import OperatorFusionRule
  from ray.data._internal.logical.rules.randomize_blocks import ReorderRandomizeBlocksRule
  from ray.data._internal.logical.rules.set_read_parallelism import SetReadParallelismRule
  from ray.data._internal.logical.rules.zero_copy_map_fusion import EliminateBuildOutputBlocks
  from ray.data._internal.planner.planner import Planner
label_desc: Use image node_id 1 for calling the LogicalOptimizer obj's underlying member method code with example usage: obj.rules() and returns: unknown