/* testSymbFac.c */
#include "../spoolesMPI.h"
#include "../../Drand.h"
#include "../../timings.h"
/*--------------------------------------------------------------------*/
int
main ( int argc, char *argv[] )
/*
---------------------------------------------------
created -- 98may16, cca
---------------------------------------------------
*/
{
char *buffer, *inETreeFileName, *inGraphFileName ;
double t1, t2 ;
Drand *drand ;
ETree *frontETree ;
InpMtx *inpmtx ;
int firsttag, ient, ii, jent, J, length, myid, msglvl, nent,
nerror, nfront, nproc, nvtx, rc, seed, sizeJ1, sizeJ2,
v, vsize ;
int stats[4], tstats[4] ;
int *frontOwners, *indicesJ1, *indicesJ2, *ivec1, *ivec2,
*vadj, *vtxToFront ;
IV *frontOwnersIV, *oldToNewIV ;
IVL *symbfac1, *symbfac2 ;
FILE *msgFile ;
Graph *graph ;
MPI_Status status ;
/*
---------------------------------------------------------------
find out the identity of this process and the number of process
---------------------------------------------------------------
*/
MPI_Init(&argc, &argv) ;
MPI_Comm_rank(MPI_COMM_WORLD, &myid) ;
MPI_Comm_size(MPI_COMM_WORLD, &nproc) ;
fprintf(stdout, "\n process %d of %d, argc = %d", myid, nproc, argc) ;
fflush(stdout) ;
if ( argc != 6 ) {
fprintf(stdout,
"\n\n usage : %s msglvl msgFile inGraphFile inETreeFile seed"
"\n msglvl -- message level"
"\n msgFile -- message file"
"\n inGraphFile -- name of Graph file"
"\n inETreeFile -- name of ETree file"
"\n seed -- random number seed"
"\n", argv[0]) ;
return(0) ;
}
msglvl = atoi(argv[1]) ;
if ( strcmp(argv[2], "stdout") == 0 ) {
msgFile = stdout ;
} else {
length = strlen(argv[2]) + 1 + 4 ;
buffer = CVinit(length, '\0') ;
sprintf(buffer, "%s.%d", argv[2], myid) ;
if ( (msgFile = fopen(buffer, "w")) == NULL ) {
fprintf(stderr, "\n fatal error in %s"
"\n unable to open file %s\n",
argv[0], argv[2]) ;
return(-1) ;
}
CVfree(buffer) ;
}
inGraphFileName = argv[3] ;
inETreeFileName = argv[4] ;
seed = atoi(argv[5]) ;
fprintf(msgFile,
"\n %s "
"\n msglvl -- %d"
"\n msgFile -- %s"
"\n inGraphFile -- %s"
"\n inETreeFile -- %s"
"\n seed -- %d"
"\n",
argv[0], msglvl, argv[2], inGraphFileName,
inETreeFileName, seed) ;
fflush(msgFile) ;
/*
----------------------------------
create the random number generator
----------------------------------
*/
drand = Drand_new() ;
Drand_setSeed(drand, seed) ;
/*
------------------------
read in the Graph object
------------------------
*/
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) ;
nvtx = graph->nvtx ;
/*
------------------------
read in the ETree object
------------------------
*/
frontETree = ETree_new() ;
MARKTIME(t1) ;
rc = ETree_readFromFile(frontETree, inETreeFileName) ;
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : read in frontETree from file %s",
t2 - t1, inETreeFileName) ;
if ( rc != 1 ) {
fprintf(msgFile, "\n return value %d from ETree_readFromFile(%p,%s)",
rc, frontETree, inETreeFileName) ;
exit(-1) ;
}
fprintf(msgFile, "\n\n after reading ETree object from file %s",
inETreeFileName) ;
if ( msglvl > 2 ) {
ETree_writeForHumanEye(frontETree, msgFile) ;
} else {
ETree_writeStats(frontETree, msgFile) ;
}
fflush(msgFile) ;
nfront = ETree_nfront(frontETree) ;
vtxToFront = ETree_vtxToFront(frontETree) ;
/*
-----------------------------------------
create an InpMtx object to hold the graph
-----------------------------------------
*/
inpmtx = InpMtx_new() ;
InpMtx_init(inpmtx, INPMTX_BY_ROWS, INPMTX_INDICES_ONLY, 0, 0) ;
for ( v = 0 ; v < nvtx ; v++ ) {
Graph_adjAndSize(graph, v, &vsize, &vadj) ;
InpMtx_inputRow(inpmtx, v, vsize, vadj) ;
}
InpMtx_sortAndCompress(inpmtx) ;
fprintf(msgFile, "\n\n InpMtx made from graph") ;
if ( msglvl > 2 ) {
InpMtx_writeForHumanEye(inpmtx, msgFile) ;
} else {
InpMtx_writeStats(inpmtx, msgFile) ;
}
/*
----------------------------------------------
get the permutation vector from the front tree
----------------------------------------------
*/
oldToNewIV = ETree_oldToNewVtxPerm(frontETree) ;
fprintf(msgFile, "\n\n old-to-new permutation vector") ;
if ( msglvl > 2 ) {
IV_writeForHumanEye(oldToNewIV, msgFile) ;
} else {
IV_writeStats(oldToNewIV, msgFile) ;
}
/*
--------------------------------------
permute the vertices in the front tree
--------------------------------------
*/
ETree_permuteVertices(frontETree, oldToNewIV) ;
fprintf(msgFile, "\n\n front tree after permutation") ;
if ( msglvl > 2 ) {
ETree_writeForHumanEye(frontETree, msgFile) ;
} else {
ETree_writeStats(frontETree, msgFile) ;
}
/*
-------------------------------------------------
permute the rows and columns in the InpMtx object
and convert to chevron format
-------------------------------------------------
*/
InpMtx_permute(inpmtx, IV_entries(oldToNewIV), IV_entries(oldToNewIV)) ;
InpMtx_changeCoordType(inpmtx, INPMTX_BY_CHEVRONS) ;
InpMtx_changeStorageMode(inpmtx, INPMTX_BY_VECTORS) ;
fprintf(msgFile, "\n\n InpMtx after permutation") ;
if ( msglvl > 2 ) {
InpMtx_writeForHumanEye(inpmtx, msgFile) ;
} else {
InpMtx_writeStats(inpmtx, msgFile) ;
}
/*
-------------------------------------------------------------
compute the symbolic factorization using the entire structure
-------------------------------------------------------------
*/
symbfac1 = SymbFac_initFromInpMtx(frontETree, inpmtx) ;
fprintf(msgFile, "\n\n symbolic factorization from global data") ;
if ( msglvl > 2 ) {
IVL_writeForHumanEye(symbfac1, msgFile) ;
} else {
IVL_writeStats(symbfac1, msgFile) ;
}
/*
---------------------
generate a random map
---------------------
*/
MARKTIME(t1) ;
Drand_setSeed(drand, seed + 1) ;
Drand_setUniform(drand, 0.0, (double) nproc) ;
frontOwnersIV = IV_new() ;
IV_init(frontOwnersIV, nfront, NULL) ;
frontOwners = IV_entries(frontOwnersIV) ;
for ( J = 0 ; J < nfront ; J++ ) {
frontOwners[J] = (int) Drand_value(drand) ;
}
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : random map set", t2 - t1) ;
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n frontOwners") ;
IV_writeForHumanEye(frontOwnersIV, msgFile) ;
fflush(msgFile) ;
}
/*
---------------------------
throw away unowned chevrons
---------------------------
*/
InpMtx_changeStorageMode(inpmtx, INPMTX_RAW_DATA) ;
nent = InpMtx_nent(inpmtx) ;
ivec1 = InpMtx_ivec1(inpmtx) ;
ivec2 = InpMtx_ivec2(inpmtx) ;
for ( ient = jent = 0 ; ient < nent ; ient++ ) {
v = ivec1[ient] ;
J = vtxToFront[v] ;
if ( frontOwners[J] == myid ) {
ivec1[jent] = ivec1[ient] ;
ivec2[jent] = ivec2[ient] ;
jent++ ;
}
}
InpMtx_setNent(inpmtx, jent) ;
InpMtx_changeStorageMode(inpmtx, INPMTX_BY_VECTORS) ;
fprintf(msgFile, "\n\n InpMtx after dropping unowned entries") ;
if ( msglvl > 2 ) {
InpMtx_writeForHumanEye(inpmtx, msgFile) ;
} else {
InpMtx_writeStats(inpmtx, msgFile) ;
}
/*
------------------------------------------------
compute the symbolic factorization cooperatively
------------------------------------------------
*/
firsttag = 47 ;
symbfac2 = SymbFac_MPI_initFromInpMtx(frontETree, frontOwnersIV, inpmtx,
stats, msglvl, msgFile, firsttag, MPI_COMM_WORLD) ;
fprintf(msgFile, "\n\n symbolic factorization from cooperation") ;
if ( msglvl > 2 ) {
IVL_writeForHumanEye(symbfac2, msgFile) ;
} else {
IVL_writeStats(symbfac2, msgFile) ;
}
/*
----------------------------------------
check that the supported part of the
second symbolic factorization is correct
----------------------------------------
*/
for ( J = 0, nerror = 0 ; J < nfront ; J++ ) {
IVL_listAndSize(symbfac2, J, &sizeJ2, &indicesJ2) ;
if ( sizeJ2 > 0 ) {
IVL_listAndSize(symbfac1, J, &sizeJ1, &indicesJ1) ;
if ( sizeJ1 != sizeJ2 ) {
fprintf(msgFile, "\n error, J = %d, sizeJ1 = %d, sizeJ2 = %d",
J, sizeJ1, sizeJ2) ;
nerror++ ;
} else {
for ( ii = 0 ; ii < sizeJ1 ; ii++ ) {
if ( indicesJ1[ii] != indicesJ2[ii] ) {
fprintf(msgFile, "\n error, J = %d", J) ;
fprintf(msgFile, "\n indicesJ1") ;
IVfprintf(msgFile, sizeJ1, indicesJ1) ;
fprintf(msgFile, "\n indicesJ2") ;
IVfprintf(msgFile, sizeJ1, indicesJ2) ;
nerror++ ;
break ;
}
}
}
}
}
fprintf(msgFile, "\n\n %d errors in symbolic factorization", nerror) ;
/*
----------------
free the objects
----------------
*/
IV_free(frontOwnersIV) ;
IV_free(oldToNewIV) ;
InpMtx_free(inpmtx) ;
ETree_free(frontETree) ;
Drand_free(drand) ;
MPI_Finalize() ;
fprintf(msgFile, "\n") ;
fclose(msgFile) ;
return(0) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1