#include <stdio.h>
#include <rc/math.h>
#define DIM 3
int main()
{
rc_matrix_t A = RC_MATRIX_INITIALIZER;
rc_matrix_t Ainv= RC_MATRIX_INITIALIZER;
rc_matrix_t AA = RC_MATRIX_INITIALIZER;
rc_matrix_t L = RC_MATRIX_INITIALIZER;
rc_matrix_t U = RC_MATRIX_INITIALIZER;
rc_matrix_t P = RC_MATRIX_INITIALIZER;
rc_matrix_t Q = RC_MATRIX_INITIALIZER;
rc_matrix_t R = RC_MATRIX_INITIALIZER;
rc_vector_t b = RC_VECTOR_INITIALIZER;
rc_vector_t x = RC_VECTOR_INITIALIZER;
rc_vector_t y = RC_VECTOR_INITIALIZER;
printf("Let's test some linear algebra functions....\n\n");
printf("\nNew Random Matrix A:\n");
rc_matrix_random(&A,DIM,DIM);
rc_matrix_print(A);
printf("\nAinverse:\n");
rc_algebra_invert_matrix(A,&Ainv);
rc_matrix_print(Ainv);
printf("\nA times A_inverse:\n");
rc_matrix_multiply(A,Ainv,&AA);
rc_matrix_print(AA);
printf("\ninvert A again inplace\n");
rc_algebra_invert_matrix_inplace(&Ainv);
rc_matrix_print(Ainv);
printf("\nLUP decomposition of A\n");
rc_algebra_lup_decomp(A,&L,&U,&P);
printf("L:\n");
rc_matrix_print(L);
printf("U:\n");
rc_matrix_print(U);
printf("P:\n");
rc_matrix_print(P);
printf("\nQR Decomposition of A\n");
rc_algebra_qr_decomp(A,&Q,&R);
printf("Q:\n");
rc_matrix_print(Q);
printf("R:\n");
rc_matrix_print(R);
printf("\nGaussian Elimination solution x to the equation Ax=b:\n");
printf("equivalent to A\\b in MATLAB\n");
rc_vector_random(&b,DIM);
rc_algebra_lin_system_solve(A,b,&x);
rc_vector_print(x);
printf("\nQR solution x to the equation Ax=b:\n");
printf("equivalent to A\\b in MATLAB\n");
rc_algebra_lin_system_solve_qr(A,b,&y);
rc_vector_print(y);
rc_matrix_free(&A);
rc_matrix_free(&Ainv);
rc_matrix_free(&AA);
rc_matrix_free(&L);
rc_matrix_free(&U);
rc_matrix_free(&P);
rc_matrix_free(&Q);
rc_matrix_free(&R);
rc_vector_free(&b);
rc_vector_free(&x);
rc_vector_free(&y);
printf("\nDONE\n");
return 0;
}