code: def tile(cls, op: "LGBMAlign"):
      inputs = [
          d
          for d in [op.data, op.label, op.sample_weight, op.init_score]
          if d is not None
      ]
      data = op.data
  
      # check inputs to make sure no unknown chunk shape exists
      if has_unknown_shape(*inputs):
          yield
  
      if len(data.nsplits[1]) != 1:
          data = yield from recursive_tile(
              data.rechunk({1: data.shape[1]})
          )
      outputs = [data]
      for inp in inputs[1:]:
          if inp is not None:
              outputs.append(
                  (
                      yield from recursive_tile(
                          inp.rechunk((data.nsplits[0],))
                      )
                  )
              )
  
      kws = []
      for o in outputs:
          kw = o.params.copy()
          kw.update(dict(chunks=o.chunks, nsplits=o.nsplits))
          kws.append(kw)
  
      new_op = op.copy().reset_key()
      tileables = new_op.new_tileables(inputs, kws=kws)
  
      return tileables
  
file_path: mars/mars/learn/contrib/lightgbm/_align.py
imports: from ....None import opcodes
  from ....core import ExecutableTuple, get_output_types, recursive_tile
  from ....serialization.serializables import AnyField
  from ....utils import has_unknown_shape
  from ...operands import LearnOperand, LearnOperandMixin
label_desc: Use image node_id 9 for calling the LGBMAlign obj's underlying member method code with example usage: obj.tile(cls, op) and returns: tileables