code: def tile(cls, op):
      x = op.input
      norm = op.norm
      axis = op.axis
  
      if len(x.chunks) == 1:
          return cls._tile_one_chunk(op)
  
      if cls._need_tile_into_chunks(op):
          return cls._tile_chunks(op)
      else:
          if norm == "l1":
              norms = mt.abs(x).sum(axis=axis)
          elif norm == "l2":
              norms = mt.sqrt((x**2).sum(axis=axis))
          else:
              assert norm == "max"
              # sparse.max will still be a sparse,
              # force to convert to dense
              norms = mt.max(x, axis=axis).todense()
          norms = mt.where(mt.equal(norms, 0.0), 1.0, norms)
          if axis == 1:
              x = x / norms[:, mt.newaxis]
          else:
              x = x / norms[mt.newaxis, :]
  
          ret = [(yield from recursive_tile(x))]
          if op.return_norm:
              ret.append((yield from recursive_tile(norms)))
  
          new_op = op.copy()
          kws = [out.params for out in op.outputs]
          for i, r in enumerate(ret):
              kws[i]["chunks"] = r.chunks
              kws[i]["nsplits"] = r.nsplits
          return new_op.new_tensors(op.inputs, kws=kws)
  
imports: import numpy
  from ...None import opcodes
  from ...core import ExecutableTuple, recursive_tile
  from ...serialization.serializables import KeyField, StringField, Int32Field, BoolField
  from ...tensor.operands import TensorOperand, TensorOperandMixin
  from ...tensor.core import TensorOrder
  from ...tensor.array_utils import as_same_device, device, sparse, issparse
  from ...None import tensor
  from ..utils import check_array
label_desc: Use image node_id 13 for calling the TensorNormalize obj's underlying member method code with example usage: obj.tile(cls, op) and returns: cls, cls, new_op