|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "layer/copyto.h" |
|
#include "testutil.h" |
|
|
|
static ncnn::Mat IntArrayMat(int a0) |
|
{ |
|
ncnn::Mat m(1); |
|
int* p = m; |
|
p[0] = a0; |
|
return m; |
|
} |
|
|
|
static ncnn::Mat IntArrayMat(int a0, int a1) |
|
{ |
|
ncnn::Mat m(2); |
|
int* p = m; |
|
p[0] = a0; |
|
p[1] = a1; |
|
return m; |
|
} |
|
|
|
static ncnn::Mat IntArrayMat(int a0, int a1, int a2) |
|
{ |
|
ncnn::Mat m(3); |
|
int* p = m; |
|
p[0] = a0; |
|
p[1] = a1; |
|
p[2] = a2; |
|
return m; |
|
} |
|
|
|
static ncnn::Mat IntArrayMat(int a0, int a1, int a2, int a3) |
|
{ |
|
ncnn::Mat m(4); |
|
int* p = m; |
|
p[0] = a0; |
|
p[1] = a1; |
|
p[2] = a2; |
|
p[3] = a3; |
|
return m; |
|
} |
|
|
|
static void print_int_array(const ncnn::Mat& a) |
|
{ |
|
const int* pa = a; |
|
|
|
fprintf(stderr, "["); |
|
for (int i = 0; i < a.w; i++) |
|
{ |
|
fprintf(stderr, " %d", pa[i]); |
|
} |
|
fprintf(stderr, " ]"); |
|
} |
|
|
|
static int test_copyto(const ncnn::Mat& self, const ncnn::Mat& src, const ncnn::Mat& starts, const ncnn::Mat& axes) |
|
{ |
|
ncnn::ParamDict pd; |
|
pd.set(9, starts); |
|
pd.set(11, axes); |
|
|
|
std::vector<ncnn::Mat> weights(0); |
|
|
|
std::vector<ncnn::Mat> as(2); |
|
as[0] = self; |
|
as[1] = src; |
|
|
|
int ret = test_layer<ncnn::CopyTo>("CopyTo", pd, weights, as, 1); |
|
if (ret != 0) |
|
{ |
|
fprintf(stderr, "test_copyto failed self.dims=%d self=(%d %d %d %d) src.dims=%d src=(%d %d %d %d)", self.dims, self.w, self.h, self.d, self.c, src.dims, src.w, src.h, src.d, src.c); |
|
fprintf(stderr, " starts="); |
|
print_int_array(starts); |
|
fprintf(stderr, " axes="); |
|
print_int_array(axes); |
|
fprintf(stderr, "\n"); |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
static int test_copyto_0() |
|
{ |
|
ncnn::Mat a[] = { |
|
RandomMat(112), |
|
RandomMat(126), |
|
RandomMat(127) |
|
}; |
|
ncnn::Mat b[] = { |
|
RandomMat(33), |
|
RandomMat(36), |
|
RandomMat(64) |
|
}; |
|
|
|
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) |
|
{ |
|
for (int j = 0; j < sizeof(b) / sizeof(b[0]); j++) |
|
{ |
|
const ncnn::Mat& self = a[i]; |
|
const ncnn::Mat& src = b[j]; |
|
|
|
int ret = 0 |
|
|| test_copyto(self, src, IntArrayMat(0), IntArrayMat(0)) |
|
|| test_copyto(self, src, IntArrayMat(13), IntArrayMat(-1)) |
|
|| test_copyto(self, src, IntArrayMat(28), IntArrayMat(0)) |
|
|| test_copyto(self, src, IntArrayMat(32), ncnn::Mat()); |
|
|
|
if (ret != 0) |
|
return ret; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
static int test_copyto_1() |
|
{ |
|
ncnn::Mat a[] = { |
|
RandomMat(72, 112), |
|
RandomMat(87, 126), |
|
RandomMat(64, 127) |
|
}; |
|
ncnn::Mat b[] = { |
|
RandomMat(14, 33), |
|
RandomMat(24, 36), |
|
RandomMat(16, 64), |
|
RandomMat(14), |
|
RandomMat(24), |
|
RandomMat(16) |
|
}; |
|
|
|
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) |
|
{ |
|
for (int j = 0; j < sizeof(b) / sizeof(b[0]); j++) |
|
{ |
|
const ncnn::Mat& self = a[i]; |
|
const ncnn::Mat& src = b[j]; |
|
|
|
int ret = 0 |
|
|| test_copyto(self, src, IntArrayMat(0, 0), IntArrayMat(0, 1)) |
|
|| test_copyto(self, src, IntArrayMat(13, 1), IntArrayMat(-2, -1)) |
|
|| test_copyto(self, src, IntArrayMat(28, 3), IntArrayMat(0, 1)) |
|
|| test_copyto(self, src, IntArrayMat(32, 10), IntArrayMat(0, 1)); |
|
|
|
if (ret != 0) |
|
return ret; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
static int test_copyto_2() |
|
{ |
|
ncnn::Mat a[] = { |
|
RandomMat(32, 42, 81), |
|
RandomMat(33, 57, 80), |
|
RandomMat(36, 34, 88) |
|
}; |
|
ncnn::Mat b[] = { |
|
RandomMat(1, 14, 23), |
|
RandomMat(12, 1, 28), |
|
RandomMat(11, 8, 32), |
|
RandomMat(1, 14), |
|
RandomMat(12, 1), |
|
RandomMat(11, 8), |
|
RandomMat(1), |
|
RandomMat(12), |
|
RandomMat(11) |
|
}; |
|
|
|
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) |
|
{ |
|
for (int j = 0; j < sizeof(b) / sizeof(b[0]); j++) |
|
{ |
|
const ncnn::Mat& self = a[i]; |
|
const ncnn::Mat& src = b[j]; |
|
|
|
int ret = 0 |
|
|| test_copyto(self, src, IntArrayMat(0, 0, 0), IntArrayMat(0, 1, 2)) |
|
|| test_copyto(self, src, IntArrayMat(13, 1, 0), IntArrayMat(-3, -2, -1)) |
|
|| test_copyto(self, src, IntArrayMat(28, 3, 4), IntArrayMat(0, 1, 2)) |
|
|| test_copyto(self, src, IntArrayMat(32, 0, 5), IntArrayMat(0, 1, 2)); |
|
|
|
if (ret != 0) |
|
return ret; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
static int test_copyto_3() |
|
{ |
|
ncnn::Mat a[] = { |
|
RandomMat(12, 42, 7, 81), |
|
RandomMat(13, 57, 5, 80), |
|
RandomMat(16, 34, 6, 88) |
|
}; |
|
ncnn::Mat b[] = { |
|
RandomMat(1, 14, 2, 23), |
|
RandomMat(12, 1, 3, 28), |
|
RandomMat(11, 8, 1, 32), |
|
RandomMat(1, 14, 2), |
|
RandomMat(12, 1, 3), |
|
RandomMat(11, 8, 1), |
|
RandomMat(1, 14), |
|
RandomMat(12, 1), |
|
RandomMat(11, 8), |
|
RandomMat(1), |
|
RandomMat(12), |
|
RandomMat(11) |
|
}; |
|
|
|
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) |
|
{ |
|
for (int j = 0; j < sizeof(b) / sizeof(b[0]); j++) |
|
{ |
|
const ncnn::Mat& self = a[i]; |
|
const ncnn::Mat& src = b[j]; |
|
|
|
int ret = 0 |
|
|| test_copyto(self, src, IntArrayMat(0, 0, 0, 0), IntArrayMat(0, 1, 2, 3)) |
|
|| test_copyto(self, src, IntArrayMat(13, 1, 1, 0), IntArrayMat(-4, -3, 2, 3)) |
|
|| test_copyto(self, src, IntArrayMat(28, 0, 3, 4), IntArrayMat(0, 1, 2, 3)) |
|
|| test_copyto(self, src, IntArrayMat(32, 2, 0, 5), IntArrayMat(0, 1, 2, 3)); |
|
|
|
if (ret != 0) |
|
return ret; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
int main() |
|
{ |
|
SRAND(776757); |
|
|
|
return 0 |
|
|| test_copyto_0() |
|
|| test_copyto_1() |
|
|| test_copyto_2() |
|
|| test_copyto_3(); |
|
} |
|
|