use hodu_cpu_kernels::*;
#[test]
fn test_concat_f32_dim0() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 8];
let output_shape = vec![4, 2];
let concat_dim = 0;
let num_dims = 2;
let num_inputs = 2;
let num_els = 8;
let input_shapes = vec![2, 2, 2, 2];
let input_strides = vec![2, 1, 2, 1];
let input_offsets = vec![0, 0];
let input_buffer_offsets = vec![0, 4];
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&output_shape);
metadata.push(concat_dim);
metadata.push(num_inputs);
metadata.extend(&input_shapes);
metadata.extend(&input_strides);
metadata.extend(&input_offsets);
metadata.extend(&input_buffer_offsets);
call_concat(
concat::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]);
}
#[test]
fn test_concat_f32_dim1() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 8];
let output_shape = vec![2, 4];
let concat_dim = 1;
let num_dims = 2;
let num_inputs = 2;
let num_els = 8;
let input_shapes = vec![2, 2, 2, 2];
let input_strides = vec![2, 1, 2, 1];
let input_offsets = vec![0, 0];
let input_buffer_offsets = vec![0, 4];
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&output_shape);
metadata.push(concat_dim);
metadata.push(num_inputs);
metadata.extend(&input_shapes);
metadata.extend(&input_strides);
metadata.extend(&input_offsets);
metadata.extend(&input_buffer_offsets);
call_concat(
concat::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1.0, 2.0, 5.0, 6.0, 3.0, 4.0, 7.0, 8.0]);
}
#[test]
fn test_concat_i32_dim0() {
let input = [1i32, 2, 3, 4, 5, 6, 7, 8];
let mut output = vec![0i32; 8];
let output_shape = vec![4, 2];
let concat_dim = 0;
let num_dims = 2;
let num_inputs = 2;
let num_els = 8;
let input_shapes = vec![2, 2, 2, 2];
let input_strides = vec![2, 1, 2, 1];
let input_offsets = vec![0, 0];
let input_buffer_offsets = vec![0, 4];
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&output_shape);
metadata.push(concat_dim);
metadata.push(num_inputs);
metadata.extend(&input_shapes);
metadata.extend(&input_strides);
metadata.extend(&input_offsets);
metadata.extend(&input_buffer_offsets);
call_concat(
concat::I32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1, 2, 3, 4, 5, 6, 7, 8]);
}
#[test]
fn test_concat_3_tensors() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0];
let mut output = vec![0.0f32; 12];
let output_shape = vec![6, 2];
let concat_dim = 0;
let num_dims = 2;
let num_inputs = 3;
let num_els = 12;
let input_shapes = vec![2, 2, 2, 2, 2, 2];
let input_strides = vec![2, 1, 2, 1, 2, 1];
let input_offsets = vec![0, 0, 0];
let input_buffer_offsets = vec![0, 4, 8];
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&output_shape);
metadata.push(concat_dim);
metadata.push(num_inputs);
metadata.extend(&input_shapes);
metadata.extend(&input_strides);
metadata.extend(&input_offsets);
metadata.extend(&input_buffer_offsets);
call_concat(
concat::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(
output,
vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
);
}
#[test]
fn test_split_f32_dim0() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 4];
let input_shape = vec![4, 2];
let strides = vec![2, 1];
let split_dim = 0;
let output_size_on_dim = 2; let split_offset = 0; let num_dims = 2;
let num_els = 4;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0); metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1.0, 2.0, 3.0, 4.0]);
}
#[test]
fn test_split_f32_dim0_offset() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 4];
let input_shape = vec![4, 2];
let strides = vec![2, 1];
let split_dim = 0;
let output_size_on_dim = 2;
let split_offset = 2; let num_dims = 2;
let num_els = 4;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0);
metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![5.0, 6.0, 7.0, 8.0]);
}
#[test]
fn test_split_f32_dim1() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 4];
let input_shape = vec![2, 4];
let strides = vec![4, 1];
let split_dim = 1;
let output_size_on_dim = 2; let split_offset = 0; let num_dims = 2;
let num_els = 4;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0);
metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1.0, 2.0, 5.0, 6.0]);
}
#[test]
fn test_split_f32_dim1_offset() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
let mut output = vec![0.0f32; 4];
let input_shape = vec![2, 4];
let strides = vec![4, 1];
let split_dim = 1;
let output_size_on_dim = 2;
let split_offset = 2; let num_dims = 2;
let num_els = 4;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0);
metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![3.0, 4.0, 7.0, 8.0]);
}
#[test]
fn test_split_i32_dim0() {
let input = [1i32, 2, 3, 4, 5, 6, 7, 8];
let mut output = vec![0i32; 4];
let input_shape = vec![4, 2];
let strides = vec![2, 1];
let split_dim = 0;
let output_size_on_dim = 2;
let split_offset = 0;
let num_dims = 2;
let num_els = 4;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0);
metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::I32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1, 2, 3, 4]);
}
#[test]
fn test_split_3d_tensor() {
let input = [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0];
let mut output = vec![0.0f32; 8];
let input_shape = vec![2, 3, 2];
let strides = vec![6, 2, 1];
let split_dim = 1;
let output_size_on_dim = 2; let split_offset = 0;
let num_dims = 3;
let num_els = 8;
let mut metadata = Vec::new();
metadata.push(num_els);
metadata.push(num_dims);
metadata.extend(&input_shape);
metadata.extend(&strides);
metadata.push(0);
metadata.push(split_dim);
metadata.push(output_size_on_dim);
metadata.push(split_offset);
call_split(
split::F32,
input.as_ptr() as *const core::ffi::c_void,
output.as_mut_ptr() as *mut core::ffi::c_void,
&metadata,
)
.unwrap();
assert_eq!(output, vec![1.0, 2.0, 3.0, 4.0, 7.0, 8.0, 9.0, 10.0]);
}