code: def tile(cls, op):
      tensor = op.outputs[0]
      chunk_size = (
          tensor.extra_params.raw_chunk_size or options.chunk_size
      )
      nsplits = decide_chunk_sizes(
          tensor.shape[:-1], chunk_size, tensor.dtype.itemsize
      )
      nsplits += ((len(op.alpha),),)
  
      idxes = list(itertools.product(*[range(len(s)) for s in nsplits]))
      seeds = gen_random_seeds(
          len(idxes), np.random.RandomState(op.seed)
      )
  
      out_chunks = []
      for seed, idx, shape in zip(
          seeds, idxes, itertools.product(*nsplits)
      ):
          inputs = [inp.cix[idx] for inp in op.inputs]
          size = shape[:-1]
  
          chunk_op = op.copy().reset_key()
          chunk_op._state = None
          chunk_op.seed = seed
          chunk_op.size = size
          out_chunk = chunk_op.new_chunk(inputs, shape=shape, index=idx)
          out_chunks.append(out_chunk)
  
      new_op = op.copy()
      return new_op.new_tensors(
          op.inputs, tensor.shape, chunks=out_chunks, nsplits=nsplits
      )
  
file_path: mars/mars/tensor/random/dirichlet.py
imports: import itertools
  from collections.abc import Iterable
  import numpy
  from ...None import opcodes
  from ...serialization.serializables import TupleField
  from ...config import options
  from ..utils import decide_chunk_sizes, gen_random_seeds
  from .core import TensorRandomOperandMixin, TensorDistribution
label_desc: Use image node_id 3 for calling the TensorDirichlet obj's underlying member method code with example usage: obj.tile(cls, op) and returns: new_op