code: def decide_unify_split(*splits):
      # TODO (jisheng): In the future, we need more sophisticated way to decide the rechunk split
      # right now, for (2, 2) and (3, 1), we get the rechunk split as (2, 1, 1)
      if not splits:
          return ()
      raw_splits = splits
      # support broadcasting rules
      # decide_unify_splits((1,), (5,))  --> (5,)
      splits = set(
          s
          for s in splits
          if ((len(s) > 1) or (len(s) == 1 and s[0] != 1))
      )
      if len(splits) == 1:
          return splits.pop()
      if len(splits) == 0:
          return raw_splits[0]
  
      if any(np.isnan(sum(s)) for s in splits):
          raise ValueError(f"Tensor chunk sizes are unknown: {splits}")
      if len(set(sum(s) for s in splits)) > 1:
          raise ValueError(f"Splits not of same size: {splits}")
  
      q = [list(s) for s in splits]
      size = sum(q[0])
      cum = 0
  
      res = []
      while cum < size:
          m = min(s[0] for s in q)
          res.append(m)
          for s in q:
              s[0] -= m
              if s[0] == 0:
                  s.pop(0)
  
          cum += m
  
      return tuple(res)
  
imports: import inspect
  import itertools
  import operator
  from collections import OrderedDict
  from collections.abc import Iterable
  from functools import lru_cache, reduce, wraps
  from math import ceil
  from numbers import Integral
  from typing import Dict, List, Union
  import numpy
  from ..core import ExecutableTuple, recursive_tile
  from ..utils import lazy_import
  from ..lib.mmh3 import hash_from_buffer
label_desc: Use image node_id 19 for calling a global function with example usage: decide_unify_split() and returns: tuple, , splits, raw_splits