class_docstr: Tensor data source base class, provide universal tile logic,
  subclass can overwrite tile method.
code: def tile(cls, op):
      tensor = op.outputs[0]
  
      chunk_size = (
          tensor.extra_params.raw_chunk_size or options.chunk_size
      )
      chunk_size = decide_chunk_sizes(
          tensor.shape, chunk_size, tensor.dtype.itemsize
      )
      chunk_size_idxes = (range(len(size)) for size in chunk_size)
  
      out_chunks = []
      for chunk_shape, chunk_idx in zip(
          itertools.product(*chunk_size),
          itertools.product(*chunk_size_idxes),
      ):
          chunk_op = op.to_chunk_op(chunk_shape, chunk_idx, chunk_size)
          out_chunk = chunk_op.new_chunk(
              None,
              shape=chunk_shape,
              index=chunk_idx,
              order=tensor.order,
          )
          out_chunks.append(out_chunk)
  
      new_op = op.copy()
      return new_op.new_tensors(
          op.inputs,
          tensor.shape,
          chunks=out_chunks,
          nsplits=chunk_size,
          order=tensor.order,
          **tensor.extra_params,
      )
  
imports: import itertools
  import numpy
  from ...config import options
  from ...serialization.serializables import FieldTypes, StringField, TupleField
  from ..utils import normalize_shape, decide_chunk_sizes
  from ..core import TensorOrder
  from ..operands import TensorOperand, TensorOperandMixin
label_desc: Use image node_id 2 for calling the TensorDataSource obj's underlying member method code with example usage: obj.tile(cls, op) and returns: new_op