code: def _multi_mode_dot_data(draw):
      t1_dtype, t1, shape_t1 = draw(
          helpers.dtype_and_values(
              available_dtypes=helpers.get_dtypes("valid"),
              ret_shape=True,
              min_num_dims=2,
              large_abs_safety_factor=20,
              small_abs_safety_factor=20,
              safety_factor_scale="log",
          )
      )
      modes = [*range(len(shape_t1))]
      skip = draw(
          st.lists(
              helpers.ints(min_value=0, max_value=len(shape_t1) - 1)
          )
      )
      t2 = []
      t2_dtype = []
      for i in modes:
          mode_dimsize = shape_t1[i]
          rows = draw(helpers.ints(min_value=1, max_value=4))
          shape = draw(
              st.sampled_from([(mode_dimsize,), (rows, mode_dimsize)])
          )
          mat_or_vec_dtype, mat_or_vec = draw(
              helpers.dtype_and_values(
                  dtype=t1_dtype,
                  shape=shape,
                  large_abs_safety_factor=20,
                  small_abs_safety_factor=20,
                  safety_factor_scale="log",
              )
          )
          t2.append(mat_or_vec[0])
          t2_dtype.append(mat_or_vec_dtype[0])
  
      return t1_dtype + t2_dtype, t1[0], t2, modes, skip
  
imports: import math
  from hypothesis import strategies
  from hypothesis import assume
  import numpy
  import pytest
  import itertools
  import ivy_tests.test_ivy.helpers
  from ivy_tests.test_ivy.helpers import handle_test, BackendHandler
  import ivy
label_desc: Use image node_id 15 for calling a global function with example usage: _multi_mode_dot_data(draw) and returns: unknown,  t1,  t2,  modes,  skip