/* testStats.c */
#include "../../SymbFac.h"
#include "../../ETree.h"
#include "../../InpMtx.h"
#include "../../timings.h"
/*--------------------------------------------------------------------*/
int
main ( int argc, char *argv[] )
/*
-------------------------------------------
(1) read in an ETree object.
(2) read in a Graph object.
(3) draw a tree picture of the distribution
of some metric across the fronts
created -- 99jan22, cca
-------------------------------------------
*/
{
char coordflag, heightflag ;
char *inETreeFileName, *inGraphFileName, *outEPSfileName ;
double fontscale, rmax, rscale, t1, t2 ;
double bbox[4], frame[4] ;
double *radius ;
DV *radiusDV, *xDV, *yDV ;
Graph *graph ;
int J, labelflag, metricType, msglvl, nfront, nvtx, rc ;
int *metric, *vwghts ;
IV *metricIV ;
ETree *etree ;
FILE *msgFile ;
Tree *tree ;
if ( argc != 12 ) {
fprintf(stdout,
"\n\n usage : %s msglvl msgFile inETreeFile inGraphFile outEPSfile "
"\n metricType heightflag coordflag rscale labelflag fontscale"
"\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 outEPSfile -- output file for tree picture, must be *.eps"
"\n metricType -- metric type"
"\n 0 -- no metric"
"\n 1 -- # of nodes in front"
"\n 2 -- # of original matrix entries in front"
"\n 3 -- # of factor matrix entries in front"
"\n 4 -- # of forward factor ops in front"
"\n 5 -- # of backward factor ops in front"
"\n heightflag -- flag for type of height"
"\n 'D' -- nodes placed by depth in tree"
"\n 'H' -- nodes placed by height in tree"
"\n coordflag -- flag for type of coordinate"
"\n 'C' -- cartesian (x,y) placement"
"\n 'P' -- polar (r,theta) placement"
"\n rmax -- maximum radius in pts"
"\n labelflag -- flag for type of labels"
"\n 1 -- draw labels"
"\n otherwise -- do not draw labels"
"\n fontscale -- scaling parameter for fonts when labels drawed"
"\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] ;
outEPSfileName = argv[5] ;
metricType = atoi(argv[6]) ;
heightflag = *argv[7] ;
coordflag = *argv[8] ;
rmax = atof(argv[9]) ;
labelflag = atoi(argv[10]) ;
fontscale = atof(argv[11]) ;
fprintf(msgFile,
"\n %s "
"\n msglvl -- %d"
"\n msgFile -- %s"
"\n inETreeFile -- %s"
"\n inGraphFile -- %s"
"\n outEPSfile -- %s"
"\n metricType -- %d"
"\n heightflag -- %c"
"\n coordflag -- %c"
"\n rmax -- %f"
"\n labelflag -- %d"
"\n fontscale -- %f"
"\n",
argv[0], msglvl, argv[2], inETreeFileName, inGraphFileName,
outEPSfileName, metricType, heightflag, coordflag, rmax,
labelflag, fontscale) ;
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) ;
}
ETree_leftJustify(etree) ;
fprintf(msgFile, "\n\n after reading ETree object from file %s",
inETreeFileName) ;
if ( msglvl > 2 ) {
ETree_writeForHumanEye(etree, msgFile) ;
} else {
ETree_writeStats(etree, msgFile) ;
}
fflush(msgFile) ;
nfront = ETree_nfront(etree) ;
tree = ETree_tree(etree) ;
/*
------------------------
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) ;
nvtx = graph->nvtx ;
vwghts = graph->vwghts ;
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
----------------------
*/
metricIV = IV_new() ;
IV_init(metricIV, nfront, NULL) ;
metric = IV_entries(metricIV) ;
switch ( metricType ) {
case 0 : {
/*
---------
no metric
---------
*/
IVfill(nfront, metric, 1) ;
} break ;
case 1 : {
/*
-----------
front sizes
-----------
*/
IVcopy(nfront, metric, ETree_nodwghts(etree)) ;
} break ;
case 2 : {
/*
----------------------------------------------
number of original matrix entries in the front
----------------------------------------------
*/
int I, ii, J, v, vsize, w ;
int *vadj, *vtxToFront ;
vtxToFront = ETree_vtxToFront(etree) ;
for ( v = 0 ; v < nvtx ; v++ ) {
I = vtxToFront[v] ;
Graph_adjAndSize(graph, v, &vsize, &vadj) ;
for ( ii = 0 ; ii < vsize ; ii++ ) {
w = vadj[ii] ;
J = vtxToFront[w] ;
if ( I <= J ) {
if ( vwghts == NULL ) {
metric[I]++ ;
} else {
metric[I] += vwghts[v]*vwghts[w] ;
}
} else {
if ( vwghts == NULL ) {
metric[J]++ ;
} else {
metric[J] += vwghts[v]*vwghts[w] ;
}
}
}
}
} break ;
case 3 : {
/*
--------------------------------------------
number of factor matrix entries in the front
--------------------------------------------
*/
int *nzf ;
IV *nzfIV ;
nzfIV = ETree_factorEntriesIV(etree, SPOOLES_SYMMETRIC) ;
nzf = IV_entries(nzfIV) ;
for ( J = 0 ; J < nfront ; J++ ) {
metric[J] = nzf[J] ;
}
IV_free(nzfIV) ;
} break ;
case 4 : {
/*
------------------------------------------------
number of forward factor operations in the front
------------------------------------------------
*/
double *ops ;
DV *opsDV ;
opsDV = ETree_forwardOps(etree, SPOOLES_REAL, SPOOLES_SYMMETRIC) ;
ops = DV_entries(opsDV) ;
for ( J = 0 ; J < nfront ; J++ ) {
metric[J] = ops[J] ;
}
DV_free(opsDV) ;
} break ;
case 5 : {
/*
-------------------------------------------------
number of backward factor operations in the front
-------------------------------------------------
*/
double *ops ;
DV *opsDV ;
IVL *symbfacIVL ;
symbfacIVL = SymbFac_initFromGraph(etree, graph) ;
opsDV = ETree_backwardOps(etree, SPOOLES_REAL, SPOOLES_SYMMETRIC,
graph->vwghts, symbfacIVL) ;
ops = DV_entries(opsDV) ;
for ( J = 0 ; J < nfront ; J++ ) {
metric[J] = ops[J] ;
}
DV_free(opsDV) ;
IVL_free(symbfacIVL) ;
} break ;
default :
fprintf(stderr, "\n error in testStats"
"\n metricType %d not supported", metricType) ;
exit(-1) ;
}
if ( msglvl > 1 ) {
fprintf(msgFile, "\n\n metric vector") ;
IV_writeForHumanEye(metricIV, msgFile) ;
fflush(msgFile) ;
}
/*
---------------------
set the radius vector
---------------------
*/
radiusDV = DV_new() ;
DV_init(radiusDV, nfront, NULL) ;
radius = DV_entries(radiusDV) ;
for ( J = 0 ; J < nfront ; J++ ) {
radius[J] = sqrt(0.318309886*metric[J]) ;
}
rscale = rmax / DVmax(nfront, radius, &J) ;
if ( msglvl > 1 ) {
fprintf(msgFile, "\n\n radius vector") ;
DV_writeForHumanEye(radiusDV, msgFile) ;
fflush(msgFile) ;
}
/*
------------------------
get the tree coordinates
------------------------
*/
xDV = DV_new() ;
yDV = DV_new() ;
rc = Tree_getSimpleCoords(tree, heightflag, coordflag, xDV, yDV) ;
if ( rc != 1 ) {
fprintf(stderr, "\n error return %d from Tree_getSimpleCoords()",rc);
exit(-1) ;
}
if ( msglvl > 1 ) {
fprintf(msgFile, "\n\n x-coordinates") ;
DV_writeForHumanEye(xDV, msgFile) ;
fprintf(msgFile, "\n\n y-coordinates") ;
DV_writeForHumanEye(yDV, msgFile) ;
fprintf(msgFile, "\n\n radius") ;
DV_writeForHumanEye(radiusDV, msgFile) ;
fflush(msgFile) ;
}
/*
-------------
draw the tree
-------------
*/
bbox[0] = 50 ;
bbox[1] = 50 ;
bbox[2] = 550 ;
bbox[3] = 550 ;
frame[0] = 60 ;
frame[1] = 60 ;
frame[2] = 540 ;
frame[3] = 540 ;
rc = Tree_drawToEPS(tree, outEPSfileName, xDV, yDV, rscale, radiusDV,
labelflag, fontscale, NULL, bbox, frame, NULL) ;
if ( rc != 1 ) {
fprintf(stderr, "\n error return %d from Tree_drawToEPSfile()", rc) ;
exit(-1) ;
}
/*
----------------
free the objects
----------------
*/
ETree_free(etree) ;
Graph_free(graph) ;
IV_free(metricIV) ;
DV_free(radiusDV) ;
fprintf(msgFile, "\n") ;
fclose(msgFile) ;
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1