#include "validate.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
static int predicate(double real, double imag, void *arg)
{
    if (0.0 < real)
        return 1;
    return 0;
}
 
int main()
{
    const int n = 3000; 
 
    srand((unsigned) time(NULL));
 
    
 
    int ldA = ((n/8)+1)*8, ldC = ((n/8)+1)*8;
    double *A = malloc(n*ldA*sizeof(double));
    double *C = malloc(n*ldC*sizeof(double));
    for (int j = 0; j < n; j++)
        for (int i = 0; i < n; i++)
            A[j*ldA+i] = C[j*ldC+i] = 2.0*rand()/RAND_MAX - 1.0;
 
    
 
    int ldQ = ((n/8)+1)*8;
    double *Q = malloc(n*ldA*sizeof(double));
    for (int j = 0; j < n; j++)
        for (int i = 0; i < n; i++)
            Q[j*ldQ+i] = i == j ? 1.0 : 0.0;
 
    double *X = NULL; int ldX = 0;
 
    
 
    double *real = malloc(n*sizeof(double));
    double *imag = malloc(n*sizeof(double));
    int *select = malloc(n*sizeof(int));
 
    
    
    
 
 
    
 
    printf("Reduce...\n");
        n, A, ldA, Q, ldQ, real, imag, NULL, NULL, NULL, NULL);
 
    
    
 
    int num_selected;
    printf("Selected %d eigenvalues out of %d.\n", num_selected, n);
 
    ldX = ((n/8)+1)*8;
    X = malloc(num_selected*ldX*sizeof(double));
 
    
 
    printf("Eigenvectors...\n");
 
    
 
 
    
 
    check_residual(n, ldQ, ldA, ldQ, ldC, Q, A, Q, C);
 
    
 
    check_orthogonality(n, ldQ, Q);
 
    
 
    free(A);
    free(C);
    free(Q);
    free(X);
 
    free(real);
    free(imag);
    free(select);
 
    return 0;
}