summaryrefslogtreecommitdiff
path: root/fw/cdc-dials/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_inverse_tests.c
blob: 372ac1d0e0c761c2511d79a18460a824162630e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "jtest.h"
#include "matrix_test_data.h"
#include "arr_desc.h"
#include "arm_math.h"           /* FUTs */
#include "ref.h"                /* Reference Functions */
#include "test_templates.h"
#include "matrix_templates.h"
#include "type_abbrev.h"

JTEST_DEFINE_TEST(arm_mat_inverse_f32_test, arm_mat_inverse_f32)
{
    TEMPLATE_DO_ARR_DESC(
        mat_idx, arm_matrix_instance_f32 *, mat_ptr, matrix_f32_invertible_inputs
        ,
        JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n",                
                 (int)mat_ptr->numRows,                         
                 (int)mat_ptr->numCols); 
      
        if (MATRIX_TEST_VALID_SQUARE_DIMENSIONS(arm_matrix_instance_f32 *, mat_ptr))
        {
            MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(arm_matrix_instance_f32 *, mat_ptr);

            /* arm_mat_inverse_f32() modifies its source input. Use the scratch
             * buffer to store a copy of the intended input. */
            {
                float32_t * original_pdata_ptr = mat_ptr->pData;

                memcpy(matrix_output_scratch,
                       mat_ptr->pData,
                       mat_ptr->numRows * mat_ptr->numCols * sizeof(float32_t));
                mat_ptr->pData = (void*) &matrix_output_scratch;

                JTEST_COUNT_CYCLES(arm_mat_inverse_f32(mat_ptr, &matrix_output_fut));
                mat_ptr->pData = original_pdata_ptr;
            }

            ref_mat_inverse_f32(mat_ptr, &matrix_output_ref);

            MATRIX_SNR_COMPARE_INTERFACE(arm_matrix_instance_f32,
                                         float32_t);
        });

    return JTEST_TEST_PASSED;
}

JTEST_DEFINE_TEST(arm_mat_inverse_f64_test, arm_mat_inverse_f64)
{
    TEMPLATE_DO_ARR_DESC(
        mat_idx, arm_matrix_instance_f64 *, mat_ptr, matrix_f64_invertible_inputs
        ,
        JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n",                
                         (int)mat_ptr->numRows,                         
                         (int)mat_ptr->numCols);    
                         
        if (MATRIX_TEST_VALID_SQUARE_DIMENSIONS(arm_matrix_instance_f64 *, mat_ptr))
        {
            MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(arm_matrix_instance_f64 *, mat_ptr);

            /* arm_mat_inverse_f64() modifies its source input. Use the scratch
             * buffer to store a copy of the intended input. */
            {
                float64_t * original_pdata_ptr = mat_ptr->pData;

                memcpy(matrix_output_scratch,
                       mat_ptr->pData,
                       mat_ptr->numRows * mat_ptr->numCols * sizeof(float64_t));
                mat_ptr->pData = (void*) &matrix_output_scratch;

                JTEST_COUNT_CYCLES(arm_mat_inverse_f64(mat_ptr, &matrix_output_fut64));
                mat_ptr->pData = original_pdata_ptr;
            }

            ref_mat_inverse_f64(mat_ptr, &matrix_output_ref64);

            MATRIX_DBL_SNR_COMPARE_INTERFACE(arm_matrix_instance_f64);
        });

    return JTEST_TEST_PASSED;
}

/*--------------------------------------------------------------------------------*/
/* Collect all tests in a group. */
/*--------------------------------------------------------------------------------*/

JTEST_DEFINE_GROUP(mat_inverse_tests)
{
    /*
      To skip a test, comment it out.
    */
    JTEST_TEST_CALL(arm_mat_inverse_f32_test);
    JTEST_TEST_CALL(arm_mat_inverse_f64_test);
}