rendered paste body// Note to self - Counted out! is followed by a core dump if encountered.
#include "main.h"
float *X,*Y,*Z;
sparse_matrix_arr* L;
sparse_vector **svb;
float *_vertexarr, *orgnl_va, precision, *eigs;
int *_facearr, *orgnl_fa, _nvertex, orgnl_nv, _nface, orgnl_nf;int memorized_thingies;
int main(int argc, char* argv[])
{
//int i,j,c;
// int count = 0;
srand( (unsigned)time( NULL ) );
memorized_thingies = 0; //todo: default inits?
if ( argc != 3 )
{
printf("KAKA!\n");
exit(1);
}
parse_from_file(argv[1]);
precision = (atof(argv[2]));
L = Laplacian(orgnl_fa, _nface, _nvertex);
matrix_shifting(L);
X = (float*) calloc( L->n , sizeof(float) );
Y = (float*) calloc( L->n , sizeof(float) );
Z = (float*) calloc( L->n , sizeof(float) );
svb = (sparse_vector**) calloc( L->n , sizeof(sparse_vector*) );
eigs = (float*) calloc( L->n , sizeof(float) );
printf("\n");
startLib();
return 0;
}
void parse_from_file(char *address)
{
char ch;
int i;
FILE *fp;
fp = fopen(address,"r");
free(orgnl_va); free(orgnl_va); // Could this be removed?
free(_vertexarr); free(_facearr);
while ( (ch = getc(fp)) != '\n' )
;
fscanf(fp,"%d ",&orgnl_nv);
fscanf(fp,"%d ",&orgnl_nf);
fscanf(fp,"%d\n",&i);
orgnl_va = (float*) calloc( orgnl_nv * 3 , sizeof(float) );
orgnl_fa = (int*) calloc( orgnl_nf * 3 , sizeof(int) );
for ( i = 0 ; i < (orgnl_nv * 3) ; i += 3 )
{
fscanf(fp,"%f ", &(orgnl_va[i + 0]));
fscanf(fp,"%f ", &(orgnl_va[i + 1]));
fscanf(fp,"%f\n", &(orgnl_va[i + 2]));
}
for ( i = 0 ; i < (orgnl_nf * 3) ; i += 3 )
{
fscanf(fp,"%c ",&ch); // Expected to be three.
fscanf(fp,"%d ", &(orgnl_fa[i + 0]));
fscanf(fp,"%d ", &(orgnl_fa[i + 1]));
fscanf(fp,"%d\n", &(orgnl_fa[i + 2]));
}
_nvertex = orgnl_nv;
_nface = orgnl_nf;
_vertexarr = orgnl_va;
_facearr = orgnl_fa;
fclose(fp);
}
/*
void parse_from_stdin()
{
char ch;
int i;
free(_vertexarr); free(_facearr);
while ( (ch = getchar()) != '\n' )
;
scanf("%d ",&_nvertex);
scanf("%d ",&_nface);
scanf("%d\n",&i);
_vertexarr = (float*) calloc( _nvertex * 3 , sizeof(float) );
_facearr = (int*) calloc( _nface * 3 , sizeof(int) );
for ( i = 0 ; i < (_nvertex * 3) ; i += 3 )
{
scanf("%f ", &(_vertexarr[i]));
scanf("%f ", &(_vertexarr[i + 1]));
scanf("%f\n", &(_vertexarr[i + 2]));
}
for ( i = 0 ; i < (_nface * 3) ; i += 3 )
{
scanf("%c ",&ch); // Expected to be three.
scanf("%d ", &(_facearr[i]));
scanf("%d ", &(_facearr[i + 1]));
scanf("%d\n", &(_facearr[i + 2]));
}
}
*/
void charge_arrays(float **vertexarr, int *nvertex,
int **facearr, int *nface)
{
*nvertex = _nvertex;
*nface = _nface;
*vertexarr = _vertexarr;
*facearr = _facearr;
}
void myexit()
{
free(_vertexarr);
free(_facearr);
}
void compute(int nbasis)
{
clock_t timer = clock();
int i,j,t;
if ( nbasis < 1 || nbasis > orgnl_nv )
{
printf("Throwing a tantrum - compute\n");
return;
}
else if ( memorized_thingies < nbasis )
{
our_gram_schmidt(L, precision , svb, eigs, nbasis, memorized_thingies);
for ( i = memorized_thingies ; i < nbasis ; i++ )
for ( j = 0 ; j < svb[i]->nnz ; j++ )
{
t = (svb[i]->indices)[j];
X[i] += orgnl_va[3*t+0] * (svb[i]->values)[j];
Y[i] += orgnl_va[3*t+1] * (svb[i]->values)[j];
Z[i] += orgnl_va[3*t+2] * (svb[i]->values)[j];
}
memorized_thingies = nbasis;
}
printf("nbasis was %d, the time compute needed was %d. Note to selves - should be in miliseonds.\n"
, nbasis , (int) (clock() - timer));
}
void compress(int ncoeff)
{
int i,j,k,t;
if ( ncoeff < 1 || ncoeff > memorized_thingies )
{
printf("Throwing a tantrum - compress\n");
return;
}
if ( _vertexarr != orgnl_va )
{
free(_vertexarr);
_vertexarr = (float*) calloc( 3 * _nvertex , sizeof(float) );
}
else
for ( i = 0 ; i < 3 * _nvertex ; i++ )
_vertexarr[i] = 0.0f;
for ( i = 0 ; i < ncoeff ; i++ )
{
for ( j = 0 ; j < svb[i]->nnz ; j++ )
{
//TODO: Rewrite!
t = (svb[i]->indices)[j];
_vertexarr[3*t+0] += X[i] * (svb[i]->values)[j];
_vertexarr[3*t+1] += Y[i] * (svb[i]->values)[j];
_vertexarr[3*t+2] += Z[i] * (svb[i]->values)[j];
}
}
}