/* testStorage.c */
#include "../../ETree.h"
#include "../../SymbFac.h"
#include "../../timings.h"
/*--------------------------------------------------------------------*/
int
main ( int argc, char *argv[] )
/*
----------------------------------------------------
read in an ETree object.
read in a Graph object.
get the symbolic factorization IVL object.
compute the storage profiles for the general sparse,
forward sparse and multifrontal methods.
created -- 96oct03, cca
----------------------------------------------------
*/
{
char *inETreeFileName, *inGraphFileName ;
double elapsed, nfops1, t1, t2 ;
double *FSvec, *GSvec, *MFvec, *backwardops, *forwardops, *vmetric ;
DV *vmetricDV ;
Graph *graph ;
int J, msglvl, nfent1, nfind1, nfront, nleaves1, nnode1, rc ;
IVL *symbfacIVL ;
ETree *etree ;
FILE *msgFile ;
Tree *tree ;
if ( argc != 5 ) {
fprintf(stdout,
"\n\n usage : %s msglvl msgFile inETreeFile inGraphFile "
"\n msglvl -- message level"
"\n msgFile -- message file"
"\n inETreeFile -- input file, must be *.etreef or *.etreeb"
"\n inGraphFile -- input file, must be *.graphf or *.graphb"
"\n", argv[0]) ;
return(0) ;
}
msglvl = atoi(argv[1]) ;
if ( strcmp(argv[2], "stdout") == 0 ) {
msgFile = stdout ;
} else if ( (msgFile = fopen(argv[2], "a")) == NULL ) {
fprintf(stderr, "\n fatal error in %s"
"\n unable to open file %s\n",
argv[0], argv[2]) ;
return(-1) ;
}
inETreeFileName = argv[3] ;
inGraphFileName = argv[4] ;
fprintf(msgFile,
"\n %s "
"\n msglvl -- %d"
"\n msgFile -- %s"
"\n inETreeFile -- %s"
"\n inGraphFile -- %s"
"\n",
argv[0], msglvl, argv[2],
inETreeFileName, inGraphFileName) ;
fflush(msgFile) ;
/*
------------------------
read in the ETree object
------------------------
*/
if ( strcmp(inETreeFileName, "none") == 0 ) {
fprintf(msgFile, "\n no file to read from") ;
exit(0) ;
}
etree = ETree_new() ;
MARKTIME(t1) ;
rc = ETree_readFromFile(etree, inETreeFileName) ;
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : read in etree from file %s",
t2 - t1, inETreeFileName) ;
if ( rc != 1 ) {
fprintf(msgFile, "\n return value %d from ETree_readFromFile(%p,%s)",
rc, etree, inETreeFileName) ;
exit(-1) ;
}
fprintf(msgFile, "\n\n after reading ETree object from file %s",
inETreeFileName) ;
if ( msglvl > 2 ) {
ETree_writeForHumanEye(etree, msgFile) ;
} else {
ETree_writeStats(etree, msgFile) ;
}
ETree_leftJustify(etree) ;
fprintf(msgFile, "\n\n %d LU entries", ETree_nFactorEntries(etree, 2)) ;
fflush(msgFile) ;
/*
------------------------
read in the Graph object
------------------------
*/
if ( strcmp(inGraphFileName, "none") == 0 ) {
fprintf(msgFile, "\n no file to read from") ;
exit(0) ;
}
graph = Graph_new() ;
MARKTIME(t1) ;
rc = Graph_readFromFile(graph, inGraphFileName) ;
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : read in graph from file %s",
t2 - t1, inGraphFileName) ;
if ( rc != 1 ) {
fprintf(msgFile, "\n return value %d from Graph_readFromFile(%p,%s)",
rc, graph, inGraphFileName) ;
exit(-1) ;
}
fprintf(msgFile, "\n\n after reading Graph object from file %s",
inGraphFileName) ;
if ( msglvl > 2 ) {
Graph_writeForHumanEye(graph, msgFile) ;
} else {
Graph_writeStats(graph, msgFile) ;
}
fflush(msgFile) ;
/*
----------------------
compute the statistics
----------------------
*/
tree = etree->tree ;
nfront = etree->nfront ;
nnode1 = etree->tree->n ;
nfind1 = ETree_nFactorIndices(etree) ;
nfent1 = ETree_nFactorEntries(etree, 1) ;
nfops1 = ETree_nFactorOps(etree, SPOOLES_REAL, SPOOLES_SYMMETRIC) ;
nleaves1 = Tree_nleaves(etree->tree) ;
fprintf(msgFile, "\n root front %d has %d vertices",
etree->tree->root,
etree->nodwghtsIV->vec[etree->tree->root]) ;
fprintf(msgFile, "\n %d fronts, %d indices, %d entries, %.0f ops",
nfront, nfind1, nfent1, nfops1) ;
/*
--------------------------------------------
create the symbolic factorization IVL object
--------------------------------------------
*/
symbfacIVL = SymbFac_initFromGraph(etree, graph) ;
fprintf(msgFile,
"\n\n symbolic factorization IVL object in old ordering") ;
if ( msglvl > 2 ) {
IVL_writeForHumanEye(symbfacIVL, msgFile) ;
} else {
IVL_writeStats(symbfacIVL, msgFile) ;
}
fflush(msgFile) ;
/*
--------------------------
get the operations profile
--------------------------
*/
vmetricDV = ETree_backwardOps(etree, SPOOLES_REAL, SPOOLES_SYMMETRIC,
graph->vwghts, symbfacIVL) ;
vmetric = DV_entries(vmetricDV) ;
backwardops = DVinit(nfront, 0.0) ;
elapsed = 0.0 ;
for ( J = Tree_postOTfirst(etree->tree) ;
J != -1 ;
J = Tree_postOTnext(etree->tree, J) ) {
elapsed += vmetric[J] ;
backwardops[J] = elapsed ;
}
if ( msglvl > 0 ) {
fprintf(msgFile, "\n\n sum of backward ops = %.0f",
DV_sum(vmetricDV)) ;
}
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n backward ops") ;
DVfprintf(msgFile, nfront, backwardops) ;
}
DV_free(vmetricDV) ;
vmetricDV = ETree_forwardOps(etree, SPOOLES_REAL, SPOOLES_SYMMETRIC) ;
vmetric = DV_entries(vmetricDV) ;
forwardops = DVinit(nfront, 0.0) ;
elapsed = 0.0 ;
for ( J = Tree_postOTfirst(etree->tree) ;
J != -1 ;
J = Tree_postOTnext(etree->tree, J) ) {
elapsed += vmetric[J] ;
forwardops[J] = elapsed ;
}
if ( msglvl > 0 ) {
fprintf(msgFile, "\n\n sum of forward ops = %.0f",
DV_sum(vmetricDV)) ;
}
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n forward ops") ;
DVfprintf(msgFile, nfront, forwardops) ;
}
DV_free(vmetricDV) ;
/*
--------------------------------------
get the general sparse storage profile
--------------------------------------
*/
GSvec = DVinit(nfront, 0.0) ;
ETree_GSstorageProfile(etree, SPOOLES_SYMMETRIC,
symbfacIVL, graph->vwghts, GSvec) ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n GSvec storage") ;
DVfprintf(msgFile, nfront, GSvec) ;
}
/*
--------------------------------------
get the forward sparse storage profile
--------------------------------------
*/
FSvec = DVinit(nfront, 0.0) ;
ETree_FSstorageProfile(etree, SPOOLES_SYMMETRIC, symbfacIVL, FSvec) ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n FSvec storage") ;
DVfprintf(msgFile, nfront, FSvec) ;
}
/*
------------------------------------
get the multifrontal storage profile
------------------------------------
*/
MFvec = DVinit(nfront, 0.0) ;
ETree_MFstackProfile(etree, SPOOLES_SYMMETRIC, MFvec) ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n MFvec storage") ;
DVfprintf(msgFile, nfront, MFvec) ;
}
if ( msglvl > 0 ) {
fprintf(msgFile,
"\n %% five columns of data"
"\n %% backward-ops GS-storage forward-ops FS-storage MF-storage") ;
fprintf(msgFile, "\n data = [ ...") ;
for ( J = Tree_postOTfirst(tree) ;
J != -1 ;
J = Tree_postOTnext(tree, J) ) {
/*
fprintf(msgFile, "\n %12.0f %12.0f %12.0f %12.0f %12.0f",
backwardops[J], FSvec[J], forwardops[J], MGSvec[J], Fvec[J]) ;
*/
fprintf(msgFile, "\n %12.0f %12.4e %12.0f, %12.4e %12.4e",
backwardops[J], GSvec[J]/nfent1,
forwardops[J], FSvec[J]/nfent1, MFvec[J]/nfent1) ;
}
fprintf(msgFile,
" ] ;"
"\n bops = data(:,1) ;"
"\n gs = data(:,2) ;"
"\n fops = data(:,3) ;"
"\n fs = data(:,4) ;"
"\n mf = data(:,5) ;"
"\n\n plot( bops, gs, '-o', fops, fs, '-v', fops, mf, '-s') ; "
"\n xmax = max(bops) ;"
"\n ymax = max( [ max(gs) max(fs) max(mf) ] ) ;"
"\n axis([0, xmax, 0, ymax]) ;"
"\n xlabel(' elapsed operations') ;"
"\n ylabel(' fraction of total factor storage') ;"
"\n title(' workspace profile, ""x"" GS, ""o"" FS, ""*"" MF') ;"
"\n text( 0.1*xmax, 0.9*ymax, 'circle -- general sparse') ;"
"\n text( 0.1*xmax, 0.8*ymax, 'triangle -- forward sparse') ;"
"\n text( 0.1*xmax, 0.7*ymax, 'square -- multifrontal') ;" ) ;
}
/*
----------------
free the objects
----------------
*/
ETree_free(etree) ;
Graph_free(graph) ;
IVL_free(symbfacIVL) ;
DVfree(GSvec) ;
DVfree(MFvec) ;
DVfree(forwardops) ;
DVfree(backwardops) ;
fprintf(msgFile, "\n") ;
fclose(msgFile) ;
return(-1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1