2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "libavutil/lls.h"
23 #define randomize_buffer(buf) \
25 double bmg[2], stddev = 10.0; \
27 for (size_t i = 0; i < MAX_VARS_ALIGN; i += 2) { \
28 av_bmg_get(&checkasm_lfg, bmg); \
29 buf[i] = bmg[0] * stddev; \
30 buf[i + 1] = bmg[1] * stddev; \
34 static void test_update(LLSModel
*lls
, const double *var
)
36 double refcovar
[MAX_VARS
][MAX_VARS
];
37 declare_func(void, LLSModel
*, const double *);
41 for (size_t i
= 0; i
< MAX_VARS
; i
++)
42 for (size_t j
= 0; j
< MAX_VARS
; j
++)
43 refcovar
[i
][j
] = lls
->covariance
[i
][j
];
45 memset(lls
->covariance
, 0, sizeof (lls
->covariance
));
48 for (size_t i
= 0; i
< lls
->indep_count
; i
++)
49 for (size_t j
= i
; j
< lls
->indep_count
; j
++) {
50 double eps
= FFMAX(2 * DBL_EPSILON
* fabs(refcovar
[i
][j
]),
52 if (!double_near_abs_eps(refcovar
[i
][j
], lls
->covariance
[i
][j
],
54 fprintf(stderr
, "%zu, %zu: %- .12f - %- .12f = % .12g\n", i
, j
,
55 refcovar
[i
][j
], lls
->covariance
[i
][j
],
56 refcovar
[i
][j
] - lls
->covariance
[i
][j
]);
64 static void test_evaluate(LLSModel
*lls
, const double *param
, int order
)
66 double refprod
, newprod
, eps
;
67 declare_func_float(double, LLSModel
*, const double *, int);
69 refprod
= call_ref(lls
, param
, order
);
70 newprod
= call_new(lls
, param
, order
);
72 eps
= FFMAX(2 * DBL_EPSILON
* fabs(refprod
), 0.2);
74 if (!double_near_abs_eps(refprod
, newprod
, eps
)) {
75 fprintf(stderr
, "%- .12f - %- .12f = % .12g\n",
76 refprod
, newprod
, refprod
- newprod
);
80 if (order
== lls
->indep_count
)
81 bench_new(lls
, param
, order
);
84 void checkasm_check_lls(void)
86 static const unsigned char counts
[] = { 8, 12, MAX_VARS
, };
88 for (size_t i
= 0; i
< FF_ARRAY_ELEMS(counts
); i
++) {
89 LOCAL_ALIGNED_32(double, var
, [MAX_VARS_ALIGN
]);
90 LOCAL_ALIGNED_32(double, param
, [FFALIGN(MAX_VARS
+2,4)]);
93 avpriv_init_lls(&lls
, counts
[i
]);
94 randomize_buffer(var
);
95 randomize_buffer(param
);
97 if (check_func(lls
.update_lls
, "update_lls_%d", counts
[i
]))
98 test_update(&lls
, var
);
99 for (size_t j
= 0; j
<= i
; j
++)
100 if (check_func(lls
.evaluate_lls
, "evaluate_lls_%d_%d", counts
[i
],
102 test_evaluate(&lls
, param
+ 1, counts
[j
]);