2023-09-03 13:52:45 +02:00
|
|
|
#include "tensor_test.h"
|
2023-03-15 16:13:37 +01:00
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_is_empty(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
|
|
|
|
/* Depends on tensor_init_zero */
|
|
|
|
|
uint32_t s[4] = {2, 5, 3, 7};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_zero(t2, s, 4);
|
|
|
|
|
|
|
|
|
|
tensor_assert(tensor_is_empty(t1), "(empty tensor not detected)");
|
|
|
|
|
tensor_assert(!tensor_is_empty(t2), "(non empty tensor not detected)");
|
2023-09-03 13:40:19 +02:00
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_is_equal(void)
|
2023-03-15 16:13:37 +01:00
|
|
|
{
|
|
|
|
|
/* Depends on tensor_cpy, tensor_is_equal, tensor_init_zero, tensor_init_rand */
|
2023-05-07 14:38:41 +02:00
|
|
|
uint32_t s[4] = {2, 5, 3, 7};
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
2023-09-03 09:45:20 +02:00
|
|
|
tensor_init_zero(t1, s, 4);
|
|
|
|
|
tensor_init_one(t2, s, 4);
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor_assert_ne(t1, t2);
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_init_rand(t1, s, 4, (dtype) 30);
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor_cpy(t2, t1);
|
|
|
|
|
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
2023-09-03 13:40:19 +02:00
|
|
|
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_check_size(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
|
|
|
|
uint32_t size[] = {3, 2, 5, 0};
|
|
|
|
|
tensor_assert(_tensor_check_size(size, 3), "(valid size declared as invalid)");
|
|
|
|
|
tensor_assert(!_tensor_check_size(size, 5), "(no dimension should be 0)");
|
|
|
|
|
tensor_assert(_tensor_check_size(size, 0), "(rank can be 0)");
|
|
|
|
|
tensor_assert(!_tensor_check_size(size, -3), "(rank should be non negative)");
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_set_size(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
|
|
|
|
uint32_t size[] = {3, 2, 7};
|
|
|
|
|
tensor t = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_assert(_tensor_set_size(t, size, 3), "(size should be set without error)");
|
|
|
|
|
tensor_assert(t->num_elem == 3 * 2 * 7, "(wrong number of elements)");
|
2023-09-03 13:40:19 +02:00
|
|
|
|
|
|
|
|
tensor_destroy(t);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_set(void)
|
2023-03-15 16:13:37 +01:00
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_init_zero, tensor_init_rand */
|
2023-05-07 14:38:41 +02:00
|
|
|
uint32_t s[4] = {2, 5, 3, 7};
|
|
|
|
|
uint32_t index[4] = {0, 0, 0, 0};
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_init_rand(t1, s, 4, (dtype) 30);
|
2023-09-03 09:45:20 +02:00
|
|
|
tensor_init_zero(t2, s, 4);
|
2023-03-15 16:13:37 +01:00
|
|
|
|
|
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
for (index[3] = 0; index[3] < s[3]; ++index[3]) {
|
|
|
|
|
tensor_assert(tensor_set(t1, index, 0), "mute");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
2023-09-03 13:40:19 +02:00
|
|
|
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_get(void)
|
2023-03-15 16:13:37 +01:00
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_set, tensor_init_zero, tensor_init_rand */
|
2023-09-03 13:02:55 +02:00
|
|
|
bool status;
|
2023-05-07 14:38:41 +02:00
|
|
|
uint32_t s[4] = {2, 5, 3, 7};
|
|
|
|
|
uint32_t index[4] = {0, 0, 0, 0};
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_init_rand(t1, s, 4, (dtype) 30);
|
2023-09-03 09:45:20 +02:00
|
|
|
tensor_init_zero(t2, s, 4);
|
2023-03-15 16:13:37 +01:00
|
|
|
|
|
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
for (index[3] = 0; index[3] < s[3]; ++index[3]) {
|
|
|
|
|
tensor_set(t2, index, tensor_get(t1, index, &status));
|
|
|
|
|
tensor_assert(status, "mute");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
2023-09-03 13:40:19 +02:00
|
|
|
|
2023-03-15 16:13:37 +01:00
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_init_one(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-03 13:40:19 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_set, tensor_init_rand */
|
|
|
|
|
uint32_t s[3] = {2, 5, 7};
|
|
|
|
|
uint32_t index[3] = {0, 0, 0};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_init_rand(t1, s, 3, (dtype) 30);
|
2023-09-03 13:40:19 +02:00
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
tensor_set(t1, index, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tensor_assert(tensor_init_one(t2, s, 3), "(there should be no error when initing)");
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_init_zero(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-03 13:40:19 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_set, tensor_init_rand */
|
|
|
|
|
uint32_t s[3] = {2, 5, 7};
|
|
|
|
|
uint32_t index[3] = {0, 0, 0};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_init_rand(t1, s, 3, (dtype) 30);
|
2023-09-03 13:40:19 +02:00
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
tensor_set(t1, index, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tensor_assert(tensor_init_zero(t2, s, 3), "(there should be no error when initing)");
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_init_rand(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-03 13:40:19 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_set, tensor_init_rand */
|
|
|
|
|
uint32_t s[3] = {2, 5, 7};
|
|
|
|
|
uint32_t index[3] = {0, 0, 0};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_assert(tensor_init_rand(t1, s, 3, (dtype) 30), "(there should be no error when initing)");
|
2023-09-03 13:40:19 +02:00
|
|
|
|
|
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
tensor_assert(tensor_set(t1, index, 0), "mute");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_cpy(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-03 13:40:19 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero */
|
|
|
|
|
uint32_t s[3] = {2, 5, 7};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_zero(t2, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor_assert(tensor_cpy(t1, t2), "(there should be no error when copying)");
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_add_inplace(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-04 16:41:07 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_set */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
uint32_t index[3] = {0, 0, 0};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_one(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
tensor_assert(tensor_set(t1, index, index[0] + index[1] + index[2]), "mute");
|
|
|
|
|
tensor_assert(tensor_set(t2, index, (s[0] + s[1] + s[2]) - (index[0] + index[1] + index[2])), "mute");
|
|
|
|
|
tensor_assert(tensor_set(t3, index, (s[0] + s[1] + s[2])), "mute");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tensor_add_inplace(t1, t2);
|
|
|
|
|
tensor_assert_eq(t1, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_sub_inplace(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-04 16:41:07 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_zero(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor_sub_inplace(t1, t2);
|
|
|
|
|
tensor_assert_eq(t1, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-07 14:48:12 +02:00
|
|
|
void tensor_test_mul_inplace(void)
|
|
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_rand(t1, s, 3, (dtype) 30);
|
|
|
|
|
tensor_init_zero(t2, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor_mul_inplace(t1, t2);
|
|
|
|
|
tensor_assert_eq(t1, t2);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void tensor_test_div_inplace(void)
|
|
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero, tensor_add_inplace */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_one(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor_add_inplace(t1, t3);
|
|
|
|
|
tensor_add_inplace(t1, t3);
|
|
|
|
|
tensor_add_inplace(t2, t3);
|
|
|
|
|
tensor_add_inplace(t2, t3);
|
|
|
|
|
|
|
|
|
|
tensor_div_inplace(t1, t2);
|
|
|
|
|
tensor_assert_eq(t1, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_add(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-04 16:41:07 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_set */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
uint32_t index[3] = {0, 0, 0};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_one(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
for (index[0] = 0; index[0] < s[0]; ++index[0]) {
|
|
|
|
|
for (index[1] = 0; index[1] < s[1]; ++index[1]) {
|
|
|
|
|
for (index[2] = 0; index[2] < s[2]; ++index[2]) {
|
|
|
|
|
tensor_assert(tensor_set(t1, index, index[0] + index[1] + index[2]), "mute");
|
|
|
|
|
tensor_assert(tensor_set(t2, index, (s[0] + s[1] + s[2]) - (index[0] + index[1] + index[2])), "mute");
|
|
|
|
|
tensor_assert(tensor_set(t3, index, (s[0] + s[1] + s[2])), "mute");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tensor t4 = tensor_add(t1, t2);
|
|
|
|
|
tensor_assert_eq(t4, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
|
|
|
|
tensor_destroy(t4);
|
2023-09-03 13:02:55 +02:00
|
|
|
}
|
|
|
|
|
|
2023-09-03 13:52:45 +02:00
|
|
|
void tensor_test_sub(void)
|
2023-09-03 13:02:55 +02:00
|
|
|
{
|
2023-09-04 16:41:07 +02:00
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
2023-09-03 13:02:55 +02:00
|
|
|
|
2023-09-04 16:41:07 +02:00
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_zero(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor t4 = tensor_sub(t1, t2);
|
|
|
|
|
tensor_assert_eq(t4, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
2023-09-07 14:48:12 +02:00
|
|
|
tensor_destroy(t4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void tensor_test_mul(void)
|
|
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_init_rand, tensor_init_zero */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_rand(t1, s, 3, (dtype) 100);
|
|
|
|
|
tensor_init_zero(t2, s, 3);
|
|
|
|
|
tensor_init_zero(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor t4 = tensor_mul(t1, t2);
|
|
|
|
|
tensor_assert_eq(t4, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
|
|
|
|
tensor_destroy(t4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void tensor_test_div(void)
|
|
|
|
|
{
|
|
|
|
|
/* Depends on tensor_is_equal, tensor_init_one, tensor_init_zero, tensor_add_inplace */
|
|
|
|
|
uint32_t s[3] = {3, 2, 4};
|
|
|
|
|
tensor t1 = tensor_new();
|
|
|
|
|
tensor t2 = tensor_new();
|
|
|
|
|
tensor t3 = tensor_new();
|
|
|
|
|
|
|
|
|
|
tensor_init_one(t1, s, 3);
|
|
|
|
|
tensor_init_one(t2, s, 3);
|
|
|
|
|
tensor_init_one(t3, s, 3);
|
|
|
|
|
|
|
|
|
|
tensor_add_inplace(t1, t3);
|
|
|
|
|
tensor_add_inplace(t1, t3);
|
|
|
|
|
tensor_add_inplace(t2, t3);
|
|
|
|
|
tensor_add_inplace(t2, t3);
|
|
|
|
|
|
|
|
|
|
tensor t4 = tensor_div(t1, t2);
|
|
|
|
|
tensor_assert_eq(t4, t3);
|
|
|
|
|
|
|
|
|
|
tensor_destroy(t1);
|
|
|
|
|
tensor_destroy(t2);
|
|
|
|
|
tensor_destroy(t3);
|
|
|
|
|
tensor_destroy(t4);
|
2023-09-04 16:41:07 +02:00
|
|
|
}
|