---
include: rocblas_common.yaml
include: known_bugs.yaml

Definitions:
  - &N_range
    - [ -1, 0, 5, 10, 500, 1000, 1024, 1025, 7111, 10000, 33792 ]

  - &incx_range_small
    - [1, 2]

  - &incx_range
    - [-1, 0, 1, 2]

  - &incx_incy_range
    - { incx:  1, incy:  1 }
    - { incx:  1, incy:  2 }
    - { incx:  2, incy:  1 }
    - { incx:  1, incy: -1 }
    - { incx: -1, incy:  1 }
    - { incx: -1, incy: -1 }
    - { incx:  0, incy:  1 }
    - { incx:  0, incy:  0 }
    # - { incx:  1, incy:  0 } # Indeterminate when y is output

  - &incx_incy_range_x_y_output
    - { incx:  1, incy:  1 }
    - { incx:  1, incy:  2 }
    - { incx:  2, incy:  1 }
    - { incx:  1, incy: -1 }
    - { incx: -1, incy:  1 }
    - { incx: -1, incy: -1 }
    # - { incx:  0, incy:  0 } # Indeterminate for swap
    # - { incx:  0, incy:  1 } # Indeterminate when x is output (swap)
    # - { incx:  1, incy:  0 } # Indeterminate when y is output

  - &incx_incy_range_y_output
    - { incx:  1, incy:  1 }
    - { incx:  1, incy:  2 }
    - { incx:  2, incy:  1 }
    - { incx:  1, incy: -1 }
    - { incx: -1, incy:  1 }
    - { incx: -1, incy: -1 }
    - { incx:  0, incy:  1 }
    # - { incx:  0, incy:  0 } # Indeterminate for axpy
    # - { incx:  1, incy:  0 } # Indeterminate when y is output

  - &incx_incy_range_small
    - { incx: 1, incy: 1 }
    - { incx: -2, incy: -2 }

  - &alpha_beta_range
    - { alpha:  1.0, beta:  0.0 }
    - { alpha:  2.0, beta: -1.0 }
    - { alpha:  0.0, beta:  0.0 }

  - &alphai_betai_range
    - { alphai: 0.0 }
    - { alphai: 1.0}
    - { alphai: 2.0 }

  - &complex_alpha_range_small
    - { alpha: 4.0, alphai:  0.0 }
    - { alpha: 0.0, alphai:  4.0 }
    - { alpha: 3.0, alphai: -2.0 }

Tests:

# All functions with no parameters to scan over

  - name: blas1
    category: quick
    fortran: [ true, false ]
    function:
      - rotg:  *rotg_precisions
      - rotmg: *single_double_precisions

  - name: blas1_batched
    category: quick
    batch_count: [-1, 0, 5]
    fortran: [ true, false ]
    function:
      - rotg_batched: *rotg_precisions
      - rotmg_batched: *single_double_precisions

  - name: blas1_strided_batched
    category: quick
    batch_count: [-1, 0, 5]
    stride_scale: [ 1.5 ]
    fortran: [ true, false ]
    function:
      - rotg_strided_batched: *rotg_precisions
      - rotmg_strided_batched: *single_double_precisions

# All functions with alpha and incx and incy

# fortran
  - name: blas1_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    fortran: true
    function:
      - axpy: *half_single_precisions_complex_real
      - axpy_ex: *half_single_double_complex_real_precisions

  - name: blas1_batched_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    fortran: true
    function:
      - axpy_batched: *half_single_precisions_complex_real
      - axpy_batched_ex: *half_single_double_complex_real_precisions

  - name: blas1_strided_batched_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    stride_scale: [1, 2]
    fortran: true
    function:
      - axpy_strided_batched: *half_single_precisions_complex_real
      - axpy_strided_batched_ex: *half_single_double_complex_real_precisions

# quick
  - name: blas1_with_alpha_HMM
    category: HMM
    N: [ -1, 0, 5, 33792 ]
    incx_incy: *incx_incy_range_y_output
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy:  *half_single_precisions_complex_real
    HMM: true

  - name: blas1_with_alpha
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx_incy: *incx_incy_range_y_output
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy:  *half_single_precisions_complex_real
      - axpy_ex: *half_single_double_complex_real_precisions

  - name: axpy_ex_compute_check
    category: quick
    N: [1]
    incx: 1
    incy: 1
    alpha: -1.001
    function:
      - axpy_ex: *hpa_half_precision

  - name: blas1_batched_with_alpha
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx_incy: *incx_incy_range_y_output
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    function:
      - axpy_batched:  *half_single_precisions_complex_real
      - axpy_batched_ex: *half_single_double_complex_real_precisions

  - name: blas1_strided_batched_with_alpha
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx_incy: *incx_incy_range_y_output
    batch_count: [-1, 0, 5]
    stride_scale: [ 1 ]
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy_strided_batched: *half_single_precisions_complex_real
      - axpy_strided_batched_ex: *half_single_double_complex_real_precisions

# pre_checkin
  - name: blas1_axpy_large_batch
    category: pre_checkin
    N: [ 7, 1000 ]
    incx_incy: *incx_incy_range_small
    alpha: [ 0, 1 ]
    batch_count: [ 8193 ]
    stride_scale: [ 1 ]
    function:
      - axpy_batched: *single_precision
      - axpy_strided_batched: *single_precision

  - name: blas1_with_alpha
    category: pre_checkin
    N: [ 50007, 1049600 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy_ex: *half_single_double_complex_real_precisions

  - name: blas1_batched_with_alpha
    category: pre_checkin
    N: [ 50000, 1049600 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [2]
    function:
      - axpy_batched_ex: *half_single_double_complex_real_precisions

  - name: blas1_strided_batched_with_alpha
    category: pre_checkin
    N: [ 50000, 1049600 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [2]
    stride_scale: [ 2 ]
    function:
      - axpy_strided_batched_ex: *half_single_double_complex_real_precisions

  - name: axpy_multi_gpu
    category: multi_gpu
    N: [ 50007, 1049600 ]
    incx_incy: *incx_incy_range_small
    threads_streams: *common_threads_streams
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    devices: [0, 2, 4]
    function:
      - axpy_ex: *half_single_double_complex_real_precisions

# nightly
  - name: blas1_with_alpha
    category: nightly
    N: [ 4000000 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy_ex: *half_single_double_complex_real_precisions

  - name: axpy_multi_threads_streams
    category: nightly
    N: [ 50007, 1049600 ]
    incx_incy: *incx_incy_range_small
    threads_streams: *common_threads_streams
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - axpy_ex: *half_single_double_complex_real_precisions

  - name: blas1_batched_with_alpha
    category: nightly
    N: [ 400000 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [ 2, 4, 10, 12 ]
    function:
      - axpy_batched_ex: *half_single_double_complex_real_precisions

  - name: blas1_strided_batched_with_alpha
    category: nightly
    N: [ 400000 ]
    incx_incy: *incx_incy_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [ 2, 4, 10, 12 ]
    stride_scale: [ 1 ]
    function:
      - axpy_strided_batched_ex: *half_single_double_complex_real_precisions

# All functions with alpha and incx but no incy

# fortran
  - name: scal_blas1_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx: *incx_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    fortran: true
    function:
      - scal:  *single_double_precisions_complex_real
      - scal:  *scal_single_double_complex_real_alpha_complex_out
      - scal_ex: *single_double_precisions_complex_real
      - scal_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex: *hpa_half_half_precisions
#

  - name: blas1_batched_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx: *incx_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    fortran: true
    function:
      - scal_batched:  *single_double_precisions_complex_real
      - scal_batched:  *scal_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *single_double_precisions_complex_real
      - scal_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *hpa_half_half_precisions

  - name: blas1_strided_batched_with_alpha
    category: quick
    N: [ -1, 0, 64 ]
    incx: *incx_range_small
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    stride_scale: [1, 2]
    fortran: true
    function:
      - scal_strided_batched:  *single_double_precisions_complex_real
      - scal_strided_batched:  *scal_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions

# quick
  - name: blas1_with_alpha
    category: quick
    N: *N_range
    incx: *incx_range
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    function:
      - scal:  *single_double_precisions_complex_real
      - scal:  *scal_single_double_complex_real_alpha_complex_out
      - scal_ex: *single_double_precisions_complex_real
      - scal_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex: *hpa_half_half_precisions

  - name: blas1_batched
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx: *incx_range
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    function:
      - scal_batched: *single_double_precisions_complex_real
      - scal_batched: *scal_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *single_double_precisions_complex_real
      - scal_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *hpa_half_half_precisions

  - name: blas1_strided_batched
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx: *incx_range
    alpha_beta: *alpha_beta_range
    alphai_betai: *alphai_betai_range
    batch_count: [-1, 0, 5]
    stride_scale: [ 1.5 ]
    function:
      - scal_strided_batched: *single_double_precisions_complex_real
      - scal_strided_batched: *scal_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions

# pre_checkin
  - name: blas1
    category: pre_checkin
    N: [ 50000, 1049600 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    function:
      - scal_ex: *single_double_precisions_complex_real
      - scal_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex: *hpa_half_half_precisions

  - name: blas1_batched
    category: pre_checkin
    N: [ 1048576 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [2]
    function:
      - scal_batched_ex: *single_double_precisions_complex_real
      - scal_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *hpa_half_half_precisions

  - name: blas1_strided_batched
    category: pre_checkin
    N: [ 1048576 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [2]
    stride_scale: [ 1.5 ]
    function:
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions

# nightly
  - name: blas1_batched
    category: nightly
    N: [ 4000000 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [ 2 ]
    function:
      - scal_ex: *single_double_precisions_complex_real
      - scal_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex: *hpa_half_half_precisions

  - name: blas1_batched
    category: nightly
    N: [ 10 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [ 4000 ]
    function:
      - scal_batched_ex: *single_double_precisions_complex_real
      - scal_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *hpa_half_half_precisions

  - name: blas1_strided_batched
    category: nightly
    N: [ 4000000 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [ 2 ]
    stride_scale: [ 1.2 ]
    function:
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions

  - name: blas1_strided_batched
    category: nightly
    N: [ 10 ]
    incx: *incx_range_small
    alpha_beta: *complex_alpha_range_small
    batch_count: [ 4000 ]
    stride_scale: [ 2 ]
    function:
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions

# All functions with incx, no incy, no alpha
# nrm2,asum,iamax,iamin all variants

#fortran
  - name: blas1
    category: quick
    N: [-1, 0, 1024]
    incx: *incx_range_small
    fortran: true
    function:
      - asum: *single_double_precisions_complex_real
      - nrm2: *single_double_precisions_complex_real
      - nrm2_ex: *nrm2_ex_precisions
      - iamax: *single_double_precisions_complex_real
      - iamin: *single_double_precisions_complex_real

  - name: blas1_batched
    category: quick
    N: [-1, 0, 1024]
    incx: *incx_range_small
    batch_count: [ -1, 0, 5 ]
    fortran: true
    function:
      - asum_batched:  *single_double_precisions_complex_real
      - nrm2_batched:  *single_double_precisions_complex_real
      - nrm2_batched_ex:  *nrm2_ex_precisions
      - iamax_batched: *single_double_precisions_complex_real
      - iamin_batched: *single_double_precisions_complex_real

  - name: blas1_strided_batched
    category: quick
    N: [-1, 0, 1024]
    incx: *incx_range_small
    batch_count: [ -1, 0, 5 ]
    stride_scale: [ 1, 2 ]
    fortran: true
    function:
      - asum_strided_batched:  *single_double_precisions_complex_real
      - nrm2_strided_batched:  *single_double_precisions_complex_real
      - nrm2_strided_batched_ex:  *nrm2_ex_precisions
      - iamax_strided_batched: *single_double_precisions_complex_real
      - iamin_strided_batched: *single_double_precisions_complex_real

# quick
  - name: blas1
    category: quick
    N: *N_range
    incx: *incx_range
    function:
      - nrm2:  *single_double_precisions_complex_real
      - nrm2_ex:  *nrm2_ex_precisions
      - asum:  *single_double_precisions_complex_real
      - iamax: *single_double_precisions_complex_real
      - iamin: *single_double_precisions_complex_real

  - name: blas1_batched
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx: *incx_range
    batch_count: [-1, 0, 257]
    function:
      - asum_batched: *single_double_precisions_complex_real
      - nrm2_batched: *single_double_precisions_complex_real
      - nrm2_batched_ex: *nrm2_ex_precisions
      - iamax_batched: *single_double_precisions_complex_real
      - iamin_batched: *single_double_precisions_complex_real

  - name: blas1_strided_batched
    category: quick
    N: [ -1, 0, 5, 33792 ]
    incx: *incx_range
    batch_count: [-1, 0, 257]
    stride_scale: [ 1.5 ]
    function:
      - asum_strided_batched: *single_double_precisions_complex_real
      - nrm2_strided_batched: *single_double_precisions_complex_real
      - nrm2_strided_batched_ex: *nrm2_ex_precisions
      - iamax_strided_batched: *single_double_precisions_complex_real
      - iamin_strided_batched: *single_double_precisions_complex_real

# pre_checkin
  - name: blas1
    category: pre_checkin
    N: [ 50000, 1049600 ]
    incx: *incx_range_small
    function:
      # for large N nrm2 and asum drop single precision tolerance comparisions.
      # nrm2_ex uses nrm2 code, no need to test interface again, so only using
      # the superset code of nrm2_ex.
      - nrm2_ex:  *nrm2_ex_precisions_double
      - asum:  *double_precision_complex_real
      - iamax: *single_double_precisions_complex_real
      - iamin: *single_double_precisions_complex_real

  - name: blas1_batched
    category: pre_checkin
    N: [ 1048576 ]
    incx: *incx_range_small
    batch_count: [2]
    function:
      - asum_batched: *double_precision_complex_real
      - nrm2_batched_ex: *nrm2_ex_precisions_double
      - iamax_batched: *double_precision_complex_real
      - iamin_batched: *double_precision_complex_real

  - name: blas1_strided_batched
    category: pre_checkin
    N: [ 1048576 ]
    incx: *incx_range_small
    batch_count: [2]
    stride_scale: [ 1.5 ]
    function:
      - asum_strided_batched: *double_precision_complex_real
      - nrm2_strided_batched_ex: *nrm2_ex_precisions_double
      - iamax_strided_batched: *double_precision_complex_real
      - iamin_strided_batched: *double_precision_complex_real

# nightly
  - name: blas1
    category: nightly
    N: [ 300001 ]
    incx: *incx_range_small
    function:
      - nrm2_ex:  *nrm2_ex_precisions_double
      - asum:  *double_precision_complex_real
      - iamax:  *double_precision_complex_real
      - iamin:  *double_precision_complex_real

  - name: blas1_batched
    category: nightly
    N: [ 300001 ]
    incx: *incx_range_small
    batch_count: [ 65 ]
    function:
      - asum_batched: *double_precision_complex_real
      - nrm2_batched_ex: *nrm2_ex_precisions_double
      - iamax_batched: *double_precision_complex_real
      - iamin_batched: *double_precision_complex_real

  - name: blas1_strided_batched
    category: nightly
    N: [ 300001 ]
    incx: *incx_range_small
    batch_count: [ 65 ]
    stride_scale: [ 1 ]
    function:
      - asum_strided_batched: *double_precision_complex_real
      - nrm2_strided_batched_ex: *nrm2_ex_precisions_double
      - iamax_strided_batched: *double_precision_complex_real
      - iamin_strided_batched: *double_precision_complex_real

# All functions with incx, incy, no alpha

# fortran
  - name: blas1
    category: quick
    N: [ -1, 0, 1025]
    incx_incy: *incx_incy_range_small
    fortran: true
    function:
      - copy: *single_double_precisions_complex_real
      - dot:   *half_bfloat_single_double_complex_real_precisions
      - dotc:  *single_double_precisions_complex
      - dot_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_ex: *half_bfloat_single_double_complex_real_precisions
      - swap: *single_double_precisions_complex_real
      - rot:   *rot_precisions
      - rot_ex: *rot_ex_precisions
      - rotm:  *single_double_precisions


  - name: blas1_batched
    category: quick
    N: [ -1, 0, 1025]
    incx_incy: *incx_incy_range_small
    batch_count: [-1, 0, 5]
    fortran: true
    function:
      - copy_batched: *single_double_precisions_complex_real
      - dot_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_batched:  *single_double_precisions_complex
      - dot_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - swap_batched: *single_double_precisions_complex_real
      - rot_batched:   *rot_precisions
      - rot_batched_ex: *rot_ex_precisions
      - rotm_batched:  *single_double_precisions

  - name: blas1_strided_batched
    category: quick
    N: [ -1, 0, 1025]
    incx_incy: *incx_incy_range_small
    batch_count: [-1, 0, 5]
    stride_scale: [1, 2]
    fortran: true
    function:
      - copy_strided_batched: *single_double_precisions_complex_real
      - dot_strided_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched:  *single_double_precisions_complex
      - dotc_strided_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - swap_strided_batched: *single_double_precisions_complex_real
      - rot_strided_batched:   *rot_precisions
      - rot_strided_batched_ex: *rot_ex_precisions
      - rotm_strided_batched:  *single_double_precisions


# quick
  - name: blas1_HMM
    category: HMM
    N: [ -1, 0, 1025]
    incx_incy: *incx_incy_range
    function:
      - dot:   *half_bfloat_single_double_complex_real_precisions
    HMM: true

  - name: blas1
    category: quick
    N: [ -1, 0, 1025, 13000]
    incx_incy: *incx_incy_range
    function:
      - copy: *single_double_precisions_complex_real
      - dot:   *half_bfloat_single_double_complex_real_precisions
      - dotc:  *single_double_precisions_complex
      - dot_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_ex:   *half_bfloat_single_double_complex_real_precisions

  - name: blas1_batched
    category: quick
    N: [ -1, 0, 1025, 13000]
    incx_incy: *incx_incy_range
    batch_count: [-1, 0, 257]
    function:
      - copy_batched: *single_double_precisions_complex_real
      - dot_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_batched:  *single_double_precisions_complex
      - dot_batched_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_batched_ex:   *half_bfloat_single_double_complex_real_precisions

  - name: blas1_strided_batched
    category: quick
    N: [ -1, 0, 1025, 13000]
    incx_incy: *incx_incy_range
    batch_count: [-1, 0, 257]
    stride_scale: [ 1 ]
    function:
      - copy_strided_batched:  *single_double_precisions_complex_real
      - dot_strided_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched:  *single_double_precisions_complex
      - dot_strided_batched_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched_ex:   *half_bfloat_single_double_complex_real_precisions

# quick dot one block transitions (halfs excluded)
  - name: blas1
    category: quick
    N: [ 10001, 13001, 16001, 33000 ]
    incx_incy: *incx_incy_range_small
    function:
      - dot:   *single_double_precisions_complex
      - dotc:  *single_double_precisions_complex
      - dot_ex:   *single_double_precisions_complex
      - dotc_ex:   *single_double_precisions_complex

# quick
# dot alt algorithm, algo=1 forces x*x with incx=incy to test special case kernel
  - name: blas1
    category: quick
    N: [ -1, 0, 1025, 16001]
    incx_incy: *incx_incy_range_small
    algo: 1
    function:
      - dot:   *half_bfloat_single_double_complex_real_precisions
      - dotc:  *single_double_precisions_complex
      - dot_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_ex:   *half_bfloat_single_double_complex_real_precisions

  - name: blas1_batched
    category: quick
    N: [ -1, 0, 1025, 16000]
    incx_incy: *incx_incy_range_small
    batch_count: [-1, 0, 257]
    algo: 1
    function:
      - dot_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_batched:  *single_double_precisions_complex
      - dot_batched_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_batched_ex:   *half_bfloat_single_double_complex_real_precisions

  - name: blas1_strided_batched
    category: quick
    N: [ -1, 0, 1025, 15999]
    incx_incy: *incx_incy_range_small
    batch_count: [-1, 0, 257]
    stride_scale: [ 1 ]
    algo: 1
    function:
      - dot_strided_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched:  *single_double_precisions_complex
      - dot_strided_batched_ex:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched_ex:   *half_bfloat_single_double_complex_real_precisions

# pre_checkin
  - name: blas1
    category: pre_checkin
    N: [ 5000, 800000 ]
    incx_incy: *incx_incy_range_small
    function:
      # dot_ex uses dot code, so only testing superset code of dot_ex for pre-checkin and nightly.
      # we should be sure to keep testing the dot API in quick tests as done above.
      # similarly with rot
      - swap: *single_double_precisions_complex_real
      - copy: *single_double_precisions_complex_real
      - dot_ex:   *double_precision_complex_real
      - dotc_ex:  *double_precision_complex_real
      - rot_ex: *rot_ex_precisions
      - rotm:  *single_double_precisions

  - name: blas1_batched
    category: pre_checkin
    N: [ 5000, 800000 ]
    incx_incy: *incx_incy_range_small
    batch_count: [1, 7]
    function:
      - swap_batched: *single_double_precisions_complex_real
      - copy_batched: *single_double_precisions_complex_real
      - dot_batched_ex:   *double_precision_complex_real
      - dotc_batched_ex:  *double_precision_complex_real
      - rot_batched_ex: *rot_ex_precisions
      - rotm_batched:  *single_double_precisions

  - name: blas1_strided_batched
    category: pre_checkin
    N: [ 5000, 800000 ]
    incx_incy: *incx_incy_range_small
    batch_count: [1, 7]
    stride_scale: [ 1 ]
    function:
      - swap_strided_batched: *single_double_precisions_complex_real
      - copy_strided_batched:  *single_double_precisions_complex_real
      - dot_strided_batched_ex:   *double_precision_complex_real
      - dotc_strided_batched_ex:  *double_precision_complex_real
      - rot_strided_batched_ex: *rot_ex_precisions
      - rotm_strided_batched:  *single_double_precisions

  - name: dot_multi_gpu
    category: multi_gpu
    N: [ 5000, 800000 ]
    incx_incy: *incx_incy_range_small
    function:
      - dot:   *double_precision_complex_real
    threads_streams: *common_threads_streams
    devices: [0, 2, 4]

# nightly
  - name: blas1
    category: nightly
    N: [ 4000000 ]
    incx_incy: *incx_incy_range_small
    function:
      - swap: *single_double_precisions_complex_real
      - copy: *single_double_precisions_complex_real
      - dot_ex:  *double_precision_complex_real
      - dotc_ex: *double_precision_complex_real
      - rot_ex: *rot_ex_precisions
      - rotm:  *single_double_precisions

  - name: dot_multi_threads_stream
    category: nightly
    N: [ 5000, 800000 ]
    incx_incy: *incx_incy_range_small
    function:
      - dot:   *double_precision_complex_real
    threads_streams: *common_threads_streams

  - name: blas1_batched
    category: nightly
    N: [ 4000000 ]
    incx_incy: *incx_incy_range_small
    batch_count: [1, 7]
    function:
      - swap_batched: *single_double_precisions_complex_real
      - copy_batched:  *single_double_precisions_complex_real
      - dot_batched_ex:   *double_precision_complex_real
      - dotc_batched_ex:  *double_precision_complex_real
      - rot_batched_ex: *rot_ex_precisions
      - rotm_batched:  *single_double_precisions

  - name: blas1_strided_batched
    category: nightly
    N: [ 4000000 ]
    incx_incy: *incx_incy_range_small
    batch_count: [1, 7]
    stride_scale: [ 1 ]
    function:
      - swap_strided_batched: *single_double_precisions_complex_real
      - copy_strided_batched:  *single_double_precisions_complex_real
      - dot_strided_batched_ex:   *double_precision_complex_real
      - dotc_strided_batched_ex:  *double_precision_complex_real
      - rot_strided_batched_ex: *rot_ex_precisions
      - rotm_strided_batched:  *single_double_precisions

# Swap, rot, and rotm get their own for quick tests as they write to x and y

# quick
  - name: blas1
    category: quick
    N: [ -1, 0, 32, 1025]
    incx_incy: *incx_incy_range_x_y_output
    batch_count: [1, 7]
    stride_scale: [ 1 ]
    function:
      - swap: *single_double_precisions_complex_real
      - swap_batched: *single_double_precisions_complex_real
      - swap_strided_batched: *single_double_precisions_complex_real
      - rot:   *rot_precisions
      - rot_batched:   *rot_precisions
      - rot_strided_batched:   *rot_precisions
      - rot_ex: *rot_ex_precisions
      - rot_batched_ex: *rot_ex_precisions
      - rot_strided_batched_ex: *rot_ex_precisions
      - rotm:  *single_double_precisions
      - rotm_batched:  *single_double_precisions
      - rotm_strided_batched:  *single_double_precisions

# all functions NaN_check
  - name: blas1_nan_check
    category: pre_checkin
    N: [ 5 ]
    batch_count: [ 3 ]
    incx: [ 1, 2 ]
    incy: [ 2, 1 ]
    alpha: .NaN
    stride_scale: [ 1 ]
    function:
      - nrm2:  *single_double_precisions_complex_real
      - nrm2_batched:  *single_double_precisions_complex_real
      - nrm2_strided_batched:  *single_double_precisions_complex_real
      - nrm2_ex: *nrm2_ex_precisions
      - nrm2_batched_ex: *nrm2_ex_precisions
      - nrm2_strided_batched_ex: *nrm2_ex_precisions
      - asum:  *single_double_precisions_complex_real
      - asum_batched:  *single_double_precisions_complex_real
      - asum_strided_batched:  *single_double_precisions_complex_real
      - iamax: *single_double_precisions_complex_real
      - iamax_batched: *single_double_precisions_complex_real
      - iamax_strided_batched: *single_double_precisions_complex_real
      - iamin: *single_double_precisions_complex_real
      - iamin_batched: *single_double_precisions_complex_real
      - iamin_strided_batched: *single_double_precisions_complex_real
      - axpy:  *half_single_precisions_complex_real
      - axpy_batched: *half_single_precisions_complex_real
      - axpy_strided_batched: *half_single_precisions_complex_real
      - axpy_ex: *half_single_double_complex_real_precisions
      - axpy_batched_ex: *half_single_double_complex_real_precisions
      - axpy_strided_batched_ex: *half_single_double_complex_real_precisions
      - copy:  *single_double_precisions_complex_real
      - copy_batched:  *single_double_precisions_complex_real
      - copy_strided_batched:  *single_double_precisions_complex_real
      - dot:   *half_bfloat_single_double_complex_real_precisions
      - dot_batched:   *half_bfloat_single_double_complex_real_precisions
      - dot_strided_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc:  *single_double_precisions_complex
      - dotc_batched:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched:   *half_bfloat_single_double_complex_real_precisions
      - dot_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_ex: *half_bfloat_single_double_complex_real_precisions
      - dot_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dot_strided_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - scal:  *single_double_precisions_complex_real
      - scal:  *scal_single_double_complex_real_alpha_complex_out
      - scal_ex: *single_double_precisions_complex_real
      - scal_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex: *hpa_half_half_precisions
      - scal_batched:  *single_double_precisions_complex_real
      - scal_batched:  *scal_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *single_double_precisions_complex_real
      - scal_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex: *hpa_half_half_precisions
      - scal_strided_batched:  *single_double_precisions_complex_real
      - scal_strided_batched:  *scal_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *single_double_precisions_complex_real
      - scal_strided_batched_ex: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex: *hpa_half_half_precisions
      - swap:  *single_double_precisions_complex_real
      - swap_batched:  *single_double_precisions_complex_real
      - swap_strided_batched:  *single_double_precisions_complex_real

      #TODO: - Tests bypass the unit_check_general in ROTG,ROTMG,ROTM when NaN is input for alpha as this is not expected

      - rot:   *rot_precisions
      - rot_ex: *rot_ex_precisions
      - rotg:  *rotg_precisions
      - rotm:  *single_double_precisions
      - rotmg: *single_double_precisions
      - rot_batched:   *rot_precisions
      - rot_batched_ex: *rot_ex_precisions
      - rotg_batched:  *rotg_precisions
      - rotm_batched:  *single_double_precisions
      - rotmg_batched: *single_double_precisions
      - rot_strided_batched:   *rot_precisions
      - rot_strided_batched_ex: *rot_ex_precisions
      - rotg_strided_batched:  *rotg_precisions
      - rotm_strided_batched:  *single_double_precisions
      - rotmg_strided_batched: *single_double_precisions


# all functions bad arg
# for bad_arg no arguments should be used by test code
  - name: blas1_bad_arg
    category: pre_checkin
    # fortran: [ false, true ]
    function:
      - nrm2_bad_arg:  *single_double_precisions_complex_real
      - nrm2_batched_bad_arg:  *single_double_precisions_complex_real
      - nrm2_strided_batched_bad_arg:  *single_double_precisions_complex_real
      - nrm2_ex_bad_arg: *nrm2_ex_precisions
      - nrm2_batched_ex_bad_arg: *nrm2_ex_precisions
      - nrm2_strided_batched_ex_bad_arg: *nrm2_ex_precisions
      - asum_bad_arg:  *single_double_precisions_complex_real
      - asum_batched_bad_arg:  *single_double_precisions_complex_real
      - asum_strided_batched_bad_arg:  *single_double_precisions_complex_real
      - iamax_bad_arg: *single_double_precisions_complex_real
      - iamax_batched_bad_arg: *single_double_precisions_complex_real
      - iamax_strided_batched_bad_arg: *single_double_precisions_complex_real
      - iamin_bad_arg: *single_double_precisions_complex_real
      - iamin_batched_bad_arg: *single_double_precisions_complex_real
      - iamin_strided_batched_bad_arg: *single_double_precisions_complex_real
      - axpy_bad_arg:  *half_single_precisions_complex_real
      - axpy_batched_bad_arg: *half_single_precisions_complex_real
      - axpy_strided_batched_bad_arg: *half_single_precisions_complex_real
      - axpy_ex_bad_arg: *half_single_double_complex_real_precisions
      - axpy_batched_ex_bad_arg: *half_single_double_complex_real_precisions
      - axpy_strided_batched_ex_bad_arg: *half_single_double_complex_real_precisions
      - copy_bad_arg:  *single_double_precisions_complex_real
      - copy_batched_bad_arg:  *single_double_precisions_complex_real
      - copy_strided_batched_bad_arg:  *single_double_precisions_complex_real
      - dot_bad_arg:   *half_bfloat_single_double_complex_real_precisions
      - dot_batched_bad_arg:   *half_bfloat_single_double_complex_real_precisions
      - dot_strided_batched_bad_arg:   *half_bfloat_single_double_complex_real_precisions
      - dotc_bad_arg:  *single_double_precisions_complex
      - dotc_batched_bad_arg:   *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched_bad_arg:   *half_bfloat_single_double_complex_real_precisions
      - dot_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_ex: *half_bfloat_single_double_complex_real_precisions
      - dot_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dot_strided_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - dotc_strided_batched_ex: *half_bfloat_single_double_complex_real_precisions
      - scal_bad_arg:  *single_double_precisions_complex_real
      - scal_bad_arg:  *scal_single_double_complex_real_alpha_complex_out
      - scal_ex_bad_arg: *single_double_precisions_complex_real
      - scal_ex_bad_arg: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_ex_bad_arg: *hpa_half_half_precisions
      - scal_batched_bad_arg:  *single_double_precisions_complex_real
      - scal_batched_bad_arg:  *scal_single_double_complex_real_alpha_complex_out
      - scal_batched_ex_bad_arg: *single_double_precisions_complex_real
      - scal_batched_ex_bad_arg: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_batched_ex_bad_arg: *hpa_half_half_precisions
      - scal_strided_batched_bad_arg:  *single_double_precisions_complex_real
      - scal_strided_batched_bad_arg:  *scal_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex_bad_arg: *single_double_precisions_complex_real
      - scal_strided_batched_ex_bad_arg: *scal_ex_single_double_complex_real_alpha_complex_out
      - scal_strided_batched_ex_bad_arg: *hpa_half_half_precisions
      - swap_bad_arg:  *single_double_precisions_complex_real
      - swap_batched_bad_arg:  *single_double_precisions_complex_real
      - swap_strided_batched_bad_arg:  *single_double_precisions_complex_real
      - rot_bad_arg:   *rot_precisions
      - rot_ex_bad_arg: *rot_ex_precisions
      - rotg_bad_arg:  *rotg_precisions
      - rotm_bad_arg:  *single_double_precisions
      - rotmg_bad_arg: *single_double_precisions
      - rot_batched_bad_arg:   *rot_precisions
      - rot_batched_ex_bad_arg: *rot_ex_precisions
      - rotg_batched_bad_arg:  *rotg_precisions
      - rotm_batched_bad_arg:  *single_double_precisions
      - rotmg_batched_bad_arg: *single_double_precisions
      - rot_strided_batched_bad_arg:   *rot_precisions
      - rot_strided_batched_ex_bad_arg: *rot_ex_precisions
      - rotg_strided_batched_bad_arg:  *rotg_precisions
      - rotm_strided_batched_bad_arg:  *single_double_precisions
      - rotmg_strided_batched_bad_arg: *single_double_precisions


...
