X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=503f64b21cfd0ae64ec7413c7bfc3dc993e7e2d3;hb=725a3d4ff2442c79bfde0a75ed3e0904edcf03b7;hp=4720df3cf0d968a84ba49c4af449b226a304c1cd;hpb=aba5f8811829037b0a3004ef33f0ad4ed5e5fcf8;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index 4720df3..503f64b 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -162,6 +162,8 @@ int DistanceCommand::execute(){ if (abort == true) { return 0; } + int startTime = time(NULL); + int numSeqs = alignDB.getNumSeqs(); cutoff += 0.005; @@ -193,43 +195,112 @@ int DistanceCommand::execute(){ //each process gets where it should start and stop in the file start = int (sqrt(float(pid)/float(processors)) * numSeqs); end = int (sqrt(float(pid+1)/float(processors)) * numSeqs); - - MPI_File outMPI; - int amode=MPI_MODE_CREATE|MPI_MODE_WRONLY; - - char filename[outputFile.length()]; - strcpy(filename, outputFile.c_str()); - - MPI_File_open(MPI_COMM_WORLD, filename, amode, MPI_INFO_NULL, &outMPI); - if (pid == 0) { //you are the root process - - //do your part - string outputMyPart; - driverMPI(start, end, outMPI, cutoff); + if (output != "lt") { + MPI_File outMPI; + int amode=MPI_MODE_CREATE|MPI_MODE_WRONLY; + + //char* filename = new char[outputFile.length()]; + //memcpy(filename, outputFile.c_str(), outputFile.length()); + + char filename[1024]; + strcpy(filename, outputFile.c_str()); + + MPI_File_open(MPI_COMM_WORLD, filename, amode, MPI_INFO_NULL, &outMPI); + //delete filename; + + if (pid == 0) { //you are the root process + + //do your part + string outputMyPart; + driverMPI(start, end, outMPI, cutoff); + + if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + + //wait on chidren + for(int i = 1; i < processors; i++) { + if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + + char buf[4]; + MPI_Recv(buf, 4, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + } + }else { //you are a child process + //do your part + driverMPI(start, end, outMPI, cutoff); + + if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } - //wait on chidren - for(int i = 1; i < processors; i++) { char buf[4]; - MPI_Recv(buf, 4, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + strcpy(buf, "done"); + //tell parent you are done. + MPI_Send(buf, 4, MPI_CHAR, 0, tag, MPI_COMM_WORLD); } - if (output == "lt") { - convertToLowerTriangle(outputFile); - } + MPI_File_close(&outMPI); - }else { //you are a child process - //do your part - driverMPI(start, end, outMPI, cutoff); - - char buf[4]; - strcpy(buf, "done"); + }else { //lower triangle format + if (pid == 0) { //you are the root process + + //do your part + string outputMyPart; + long mySize; + driverMPI(start, end, outputFile, mySize); + + if (m->control_pressed) { delete distCalculator; return 0; } + + int amode=MPI_MODE_APPEND|MPI_MODE_WRONLY|MPI_MODE_CREATE; // + MPI_File outMPI; + MPI_File inMPI; + + //char* filename = new char[outputFile.length()]; + //memcpy(filename, outputFile.c_str(), outputFile.length()); + + char filename[1024]; + strcpy(filename, outputFile.c_str()); + + MPI_File_open(MPI_COMM_SELF, filename, amode, MPI_INFO_NULL, &outMPI); + //delete filename; + + //wait on chidren + for(int b = 1; b < processors; b++) { + long fileSize; + + if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + + MPI_Recv(&fileSize, 1, MPI_LONG, b, tag, MPI_COMM_WORLD, &status); + + string outTemp = outputFile + toString(b) + ".temp"; + + char* buf = new char[outTemp.length()]; + memcpy(buf, outTemp.c_str(), outTemp.length()); + + MPI_File_open(MPI_COMM_SELF, buf, MPI_MODE_DELETE_ON_CLOSE|MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI); + delete buf; + + int count = 0; + while (count < fileSize) { + char buf2[1]; + MPI_File_read(inMPI, buf2, 1, MPI_CHAR, &status); + MPI_File_write(outMPI, buf2, 1, MPI_CHAR, &status); + count += 1; + } + + MPI_File_close(&inMPI); //deleted on close + } + + MPI_File_close(&outMPI); + }else { //you are a child process + //do your part + long size; + driverMPI(start, end, (outputFile + toString(pid) + ".temp"), size); + + if (m->control_pressed) { delete distCalculator; return 0; } - //tell parent you are done. - MPI_Send(buf, 4, MPI_CHAR, 0, tag, MPI_COMM_WORLD); + //tell parent you are done. + MPI_Send(&size, 1, MPI_LONG, 0, tag, MPI_COMM_WORLD); + } } - - MPI_File_close(&outMPI); + MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case #else #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) @@ -272,6 +343,14 @@ int DistanceCommand::execute(){ if (output == "square") { convertMatrix(outputFile); } + ifstream fileHandle; + fileHandle.open(outputFile.c_str()); + if(fileHandle) { + gobble(fileHandle); + if (fileHandle.eof()) { m->mothurOut(outputFile + " is blank. This can result if there are no distances below your cutoff."); m->mothurOutEndLine(); } + } + + #ifdef USE_MPI } #endif @@ -284,7 +363,7 @@ int DistanceCommand::execute(){ m->mothurOut("Output File Name: "); m->mothurOutEndLine(); m->mothurOut(outputFile); m->mothurOutEndLine(); m->mothurOutEndLine(); - + m->mothurOut("It took " + toString(time(NULL) - startTime) + " to calculate the distances for " + toString(numSeqs) + " sequences."); m->mothurOutEndLine(); return 0; } @@ -408,40 +487,106 @@ int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, flo if (output == "column") { outputString += (alignDB.get(i).getName() + ' ' + alignDB.get(j).getName() + ' ' + toString(dist) + '\n'); } } - if ((output == "square") || (output == "lt")){ //make a square column you can convert to square phylip + if (output == "square") { //make a square column you can convert to square phylip outputString += (alignDB.get(i).getName() + ' ' + alignDB.get(j).getName() + ' ' + toString(dist) + '\n'); outputString += (alignDB.get(j).getName() + ' ' + alignDB.get(i).getName() + ' ' + toString(dist) + '\n'); } - } if(i % 100 == 0){ - m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); + //m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); + cout << i << '\t' << (time(NULL) - startTime) << endl; } - if(i % 10 == 0){ //output to file - //send results to parent - int length = outputString.length(); - char buf[length]; - strcpy(buf, outputString.c_str()); - - MPI_File_write_shared(outMPI, buf, length, MPI_CHAR, &status); - outputString = ""; - } + + //send results to parent + int length = outputString.length(); + + char* buf = new char[length]; + memcpy(buf, outputString.c_str(), length); + + MPI_File_write_shared(outMPI, buf, length, MPI_CHAR, &status); + outputString = ""; + delete buf; } - m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); - if(outputString != ""){ //output to file - //send results to parent - int length = outputString.length(); - char buf[length]; - strcpy(buf, outputString.c_str()); + //m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); + cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; + return 1; + } + catch(exception& e) { + m->errorOut(e, "DistanceCommand", "driverMPI"); + exit(1); + } +} +/**************************************************************************************************/ +/////// need to fix to work with calcs and sequencedb +int DistanceCommand::driverMPI(int startLine, int endLine, string file, long& size){ + try { + MPI_Status status; + + MPI_File outMPI; + int amode=MPI_MODE_CREATE|MPI_MODE_WRONLY; + + //char* filename = new char[file.length()]; + //memcpy(filename, file.c_str(), file.length()); + + char filename[1024]; + strcpy(filename, file.c_str()); + + MPI_File_open(MPI_COMM_SELF, filename, amode, MPI_INFO_NULL, &outMPI); + //delete filename; + + int startTime = time(NULL); + + string outputString = ""; + size = 0; + + if((output == "lt") && startLine == 0){ outputString += toString(alignDB.getNumSeqs()) + "\n"; } + + for(int i=startLine;icontrol_pressed) { return 0; } - MPI_File_write_shared(outMPI, buf, length, MPI_CHAR, &status); - outputString = ""; + distCalculator->calcDist(alignDB.get(i), alignDB.get(j)); + double dist = distCalculator->getDist(); + + if (output == "lt") { outputString += toString(dist) + "\t"; } + } + + if (output == "lt") { outputString += "\n"; } + + + if(i % 100 == 0){ + //m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); + cout << i << '\t' << (time(NULL) - startTime) << endl; + } + + + //send results to parent + int length = outputString.length(); + char* buf = new char[length]; + memcpy(buf, outputString.c_str(), length); + + MPI_File_write(outMPI, buf, length, MPI_CHAR, &status); + size += outputString.length(); + outputString = ""; + delete buf; } + //m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); + cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; + MPI_File_close(&outMPI); + return 1; } catch(exception& e) {