#include <v_lib.h>

void vecDump(vector_t *v)
{
	u32_t i;
	for(i=0;i<v->size;i++)
	{
		printf("%g ",v->elements[i]);
	}
	puts("");
}

void matDump(matrix_t *m)
{
	u32_t i,j;
	for(i=0;i<m->rows;i++)
	{
		for(j=0;j<m->cols;j++)
			printf("%g ",m->cell[i][j]);
		puts("");
	}
}

int main()
{
#if 0
	u32_t w,h;
	u32_t i,j;
	matrix_p m,m1;
	timer_t t;
	w=1000;
	h=1000;
	m=matAlloc(h,w);
	for(i=0;i<h;i++)
		for(j=0;j<w;j++)
			m->cell[i][j]=i * w + j;
	m1=matDuplicate(m);
	matCopy(m,m1);
	free(m1);
	puts("INVERSE");
	timerStart(&t);
	m1=matInverse(m,false);
	printf("%d milliseconds\n",timerMilliseconds(&t));
	timerStop(&t);
	free(m1);
	
	printf("%d",sizeof(mvec_t));
#elif 0
	matrix_t *m=matAlloc(3,3);
	m->cell[0][0]=-1;
	m->cell[0][1]=0;
	m->cell[0][2]=2;
	m->cell[1][0]=0;
	m->cell[1][1]=0.001;
	m->cell[1][2]=0;
	m->cell[2][0]=1;
	m->cell[2][1]=0;
	m->cell[2][2]=-1;
	m=matInverse(m,false);
	if(!m)
	{
		puts("Singular !");
		return 0;
	}
	matDump(m);
	free(m);
#elif 0
	u32_t i,len=100000;
	vector_t *v;
	v=vecAlloc(len);
	for(i=0;i<v->size;i++)
		v->elements[i]=i + 1.0f;
	vecDump(v);
	free(v);
#else
	u32_t i,j,c;
	vector_t *v;
	matrix_t *m;
	mvec_t ms[]={1,	2,	3,	1,	2,	6,	1,	3,	4,	2,	1,	1,	4,	5,	1,	8};
	mvec_t vs[]={23,26,22,35};
	m=matAlloc(4,4);
	v=vecAlloc(4);
	for(i=0;i<v->size;i++)
		v->elements[i]=vs[i];
	c=0;
	for(i=0;i<m->rows;i++)
		for(j=0;j<m->cols;j++)
			m->cell[i][j]=ms[c++];
	matDump(m);
	v=matSolve(m,v,false);
	vecDump(v);	/* should be 3,2,5,1 */
	free(v);
#endif
	return 0;
}
