xref: /third_party/ffmpeg/libavutil/tests/pca.c (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * principal component analysis (PCA)
3cabdff1aSopenharmony_ci * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "libavutil/pca.c"
23cabdff1aSopenharmony_ci#include "libavutil/lfg.h"
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#undef printf
26cabdff1aSopenharmony_ci#include <stdio.h>
27cabdff1aSopenharmony_ci#include <stdlib.h>
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ciint main(void){
30cabdff1aSopenharmony_ci    PCA *pca;
31cabdff1aSopenharmony_ci    int i, j, k;
32cabdff1aSopenharmony_ci#define LEN 8
33cabdff1aSopenharmony_ci    double eigenvector[LEN*LEN];
34cabdff1aSopenharmony_ci    double eigenvalue[LEN];
35cabdff1aSopenharmony_ci    AVLFG prng;
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci    av_lfg_init(&prng, 1);
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ci    pca= ff_pca_init(LEN);
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci    for(i=0; i<9000000; i++){
42cabdff1aSopenharmony_ci        double v[2*LEN+100];
43cabdff1aSopenharmony_ci        double sum=0;
44cabdff1aSopenharmony_ci        int pos = av_lfg_get(&prng) % LEN;
45cabdff1aSopenharmony_ci        int v2  = av_lfg_get(&prng) % 101 - 50;
46cabdff1aSopenharmony_ci        v[0]    = av_lfg_get(&prng) % 101 - 50;
47cabdff1aSopenharmony_ci        for(j=1; j<8; j++){
48cabdff1aSopenharmony_ci            if(j<=pos) v[j]= v[0];
49cabdff1aSopenharmony_ci            else       v[j]= v2;
50cabdff1aSopenharmony_ci            sum += v[j];
51cabdff1aSopenharmony_ci        }
52cabdff1aSopenharmony_ci/*        for(j=0; j<LEN; j++){
53cabdff1aSopenharmony_ci            v[j] -= v[pos];
54cabdff1aSopenharmony_ci        }*/
55cabdff1aSopenharmony_ci//        sum += av_lfg_get(&prng) % 10;
56cabdff1aSopenharmony_ci/*        for(j=0; j<LEN; j++){
57cabdff1aSopenharmony_ci            v[j] -= sum/LEN;
58cabdff1aSopenharmony_ci        }*/
59cabdff1aSopenharmony_ci//        lbt1(v+100,v+100,LEN);
60cabdff1aSopenharmony_ci        ff_pca_add(pca, v);
61cabdff1aSopenharmony_ci    }
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci    ff_pca(pca, eigenvector, eigenvalue);
65cabdff1aSopenharmony_ci    for(i=0; i<LEN; i++){
66cabdff1aSopenharmony_ci        pca->count= 1;
67cabdff1aSopenharmony_ci        pca->mean[i]= 0;
68cabdff1aSopenharmony_ci
69cabdff1aSopenharmony_ci//        (0.5^|x|)^2 = 0.5^2|x| = 0.25^|x|
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci//        pca.covariance[i + i*LEN]= pow(0.5, fabs
73cabdff1aSopenharmony_ci        for(j=i; j<LEN; j++){
74cabdff1aSopenharmony_ci            printf("%f ", pca->covariance[i + j*LEN]);
75cabdff1aSopenharmony_ci        }
76cabdff1aSopenharmony_ci        printf("\n");
77cabdff1aSopenharmony_ci    }
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci    for(i=0; i<LEN; i++){
80cabdff1aSopenharmony_ci        double v[LEN];
81cabdff1aSopenharmony_ci        double error=0;
82cabdff1aSopenharmony_ci        memset(v, 0, sizeof(v));
83cabdff1aSopenharmony_ci        for(j=0; j<LEN; j++){
84cabdff1aSopenharmony_ci            for(k=0; k<LEN; k++){
85cabdff1aSopenharmony_ci                v[j] += pca->covariance[FFMIN(k,j) + FFMAX(k,j)*LEN] * eigenvector[i + k*LEN];
86cabdff1aSopenharmony_ci            }
87cabdff1aSopenharmony_ci            v[j] /= eigenvalue[i];
88cabdff1aSopenharmony_ci            error += fabs(v[j] - eigenvector[i + j*LEN]);
89cabdff1aSopenharmony_ci        }
90cabdff1aSopenharmony_ci        printf("%f ", error);
91cabdff1aSopenharmony_ci    }
92cabdff1aSopenharmony_ci    printf("\n");
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci    for(i=0; i<LEN; i++){
95cabdff1aSopenharmony_ci        for(j=0; j<LEN; j++){
96cabdff1aSopenharmony_ci            printf("%9.6f ", eigenvector[i + j*LEN]);
97cabdff1aSopenharmony_ci        }
98cabdff1aSopenharmony_ci        printf("  %9.1f %f\n", eigenvalue[i], eigenvalue[i]/eigenvalue[0]);
99cabdff1aSopenharmony_ci    }
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci    return 0;
102cabdff1aSopenharmony_ci}
103