code: def print_chain(self):
      print(
          "[input]",
          self.chain.x[0],
          self.chain.xbar[0],
          self.chain.ftmp[0],
          self.chain.btmp[0],
      )
      for idx in range(len(self.node_list) - 1):
          print(
              self.node_list[idx],
              self.chain.x[idx + 1],
              self.chain.xbar[idx + 1],
              self.chain.ftmp[idx],
              self.chain.btmp[idx],
          )
      print(f"Chain = {self.chain}")
  
imports: from copy import deepcopy
  from typing import Any, List, Tuple
  from torch import Tensor
  from torch.fx import Graph, Node
  from colossalai.auto_parallel.passes.runtime_apply_pass import runtime_apply, runtime_comm_spec_apply
  from colossalai.fx.codegen.activation_checkpoint_codegen import _find_nested_ckpt_regions
  from colossalai.fx.profiler import activation_size, calculate_bwd_time, calculate_fwd_out, calculate_fwd_time, calculate_fwd_tmp
  from colossalai.logging import get_dist_logger
  from .ckpt_solver_base import CheckpointSolverBase
  from .operation import Backward, Chain, ForwardCheck, ForwardEnable, ForwardNograd, Loss, Sequence
label_desc: Use image node_id 3 for calling the CheckpointSolverRotor obj's underlying member method code with example usage: obj.print_chain() without return types