X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=unweighted.cpp;h=30c54b69d2021acb5ed7b24f34971b52ce0cea77;hb=60928795782d8f8648ec373d6a96b53032a77429;hp=431323f066665bd07edce8da80c32dadb1600cf2;hpb=55386dddad84cc1140d736cabaf4dd0ae16f2e01;p=mothur.git diff --git a/unweighted.cpp b/unweighted.cpp index 431323f..30c54b6 100644 --- a/unweighted.cpp +++ b/unweighted.cpp @@ -15,7 +15,9 @@ EstOutput Unweighted::getValues(Tree* t, int p, string o) { try { processors = p; outputDir = o; - + + CountTable* ct = t->getCountTable(); + //if the users enters no groups then give them the score of all groups int numGroups = m->getNumGroups(); @@ -34,9 +36,9 @@ EstOutput Unweighted::getValues(Tree* t, int p, string o) { vector groups; if (numGroups == 0) { //get score for all users groups - for (int i = 0; i < (tmap->getNamesOfGroups()).size(); i++) { - if ((tmap->getNamesOfGroups())[i] != "xxx") { - groups.push_back((tmap->getNamesOfGroups())[i]); + for (int i = 0; i < (ct->getNamesOfGroups()).size(); i++) { + if ((ct->getNamesOfGroups())[i] != "xxx") { + groups.push_back((ct->getNamesOfGroups())[i]); } } namesOfGroupCombos.push_back(groups); @@ -47,31 +49,22 @@ EstOutput Unweighted::getValues(Tree* t, int p, string o) { namesOfGroupCombos.push_back(groups); } } + + lines.clear(); + int remainingPairs = namesOfGroupCombos.size(); + int startIndex = 0; + for (int remainingProcessors = processors; remainingProcessors > 0; remainingProcessors--) { + int numPairs = remainingPairs; //case for last processor + if (remainingProcessors != 1) { numPairs = ceil(remainingPairs / remainingProcessors); } + lines.push_back(linePair(startIndex, numPairs)); //startIndex, numPairs + startIndex = startIndex + numPairs; + remainingPairs = remainingPairs - numPairs; + } + + data = createProcesses(t, namesOfGroupCombos, ct); - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - if(processors == 1){ - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size()); - }else{ - int numPairs = namesOfGroupCombos.size(); - - int numPairsPerProcessor = numPairs / processors; - - for (int i = 0; i < processors; i++) { - int startPos = i * numPairsPerProcessor; - - if(i == processors - 1){ - numPairsPerProcessor = numPairs - i * numPairsPerProcessor; - } - - lines.push_back(linePair(startPos, numPairsPerProcessor)); - } - data = createProcesses(t, namesOfGroupCombos); - lines.clear(); - } - #else - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size()); - #endif - + lines.clear(); + return data; } catch(exception& e) { @@ -81,13 +74,14 @@ EstOutput Unweighted::getValues(Tree* t, int p, string o) { } /**************************************************************************************************/ -EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfGroupCombos) { +EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfGroupCombos, CountTable* ct) { try { -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - int process = 1; + int process = 1; vector processIDS; EstOutput results; +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + //loop through and create all the processes you want while (process != processors) { @@ -98,15 +92,15 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG process++; }else if (pid == 0){ EstOutput myresults; - myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num); + myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num, ct); if (m->control_pressed) { exit(0); } - m->mothurOut("Merging results."); m->mothurOutEndLine(); + //m->mothurOut("Merging results."); m->mothurOutEndLine(); //pass numSeqs to parent ofstream out; - string tempFile = outputDir + toString(getpid()) + ".unweighted.results.temp"; + string tempFile = outputDir + m->mothurGetpid(process) + ".unweighted.results.temp"; m->openOutputFile(tempFile, out); out << myresults.size() << endl; for (int i = 0; i < myresults.size(); i++) { out << myresults[i] << '\t'; } out << endl; @@ -120,7 +114,7 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG } } - results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num); + results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, ct); //force parent to wait until all the processes are done for (int i=0;i<(processors-1);i++) { @@ -153,11 +147,47 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG in.close(); m->mothurRemove(s); } +#else + //fill in functions + vector pDataArray; + DWORD dwThreadIdArray[processors-1]; + HANDLE hThreadArray[processors-1]; + vector cts; + vector trees; + + //Create processor worker threads. + for( int i=1; icopy(ct); + Tree* copyTree = new Tree(copyCount); + copyTree->getCopy(t); + + cts.push_back(copyCount); + trees.push_back(copyTree); + + unweightedData* tempweighted = new unweightedData(m, lines[i].start, lines[i].num, namesOfGroupCombos, copyTree, copyCount, includeRoot); + pDataArray.push_back(tempweighted); + processIDS.push_back(i); + + hThreadArray[i-1] = CreateThread(NULL, 0, MyUnWeightedThreadFunction, pDataArray[i-1], 0, &dwThreadIdArray[i-1]); + } + + results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, ct); - m->mothurOut("DONE."); m->mothurOutEndLine(); m->mothurOutEndLine(); + //Wait until all threads have terminated. + WaitForMultipleObjects(processors-1, hThreadArray, TRUE, INFINITE); - return results; -#endif + //Close all thread handles and free memory allocations. + for(int i=0; i < pDataArray.size(); i++){ + for (int j = 0; j < pDataArray[i]->results.size(); j++) { results.push_back(pDataArray[i]->results[j]); } + delete cts[i]; + delete trees[i]; + CloseHandle(hThreadArray[i]); + delete pDataArray[i]; + } + +#endif + return results; } catch(exception& e) { m->errorOut(e, "Unweighted", "createProcesses"); @@ -165,7 +195,7 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG } } /**************************************************************************************************/ -EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num) { +EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num, CountTable* ct) { try { @@ -173,10 +203,7 @@ EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombo int count = 0; int total = num; - int twentyPercent = (total * 0.20); - if (twentyPercent == 0) { twentyPercent = 1; } - - + for (int h = start; h < (start+num); h++) { if (m->control_pressed) { return results; } @@ -238,12 +265,7 @@ EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombo } count++; - //report progress - //if((count % twentyPercent) == 0) { float tempOut = (count / (float)total); if (isnan(tempOut) || isinf(tempOut)) { tempOut = 0.0; } m->mothurOut("Percentage complete: " + toString((int(tempOut) * 100.0))); m->mothurOutEndLine(); } - } - - //report progress - //if((count % twentyPercent) != 0) { float tempOut = (count / (float)total); if (isnan(tempOut) || isinf(tempOut)) { tempOut = 0.0; } m->mothurOut("Percentage complete: " + toString((int(tempOut) * 100.0))); m->mothurOutEndLine(); } + } return results; } @@ -259,6 +281,8 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB, int p, st processors = p; outputDir = o; + CountTable* ct = t->getCountTable(); + //if the users enters no groups then give them the score of all groups int numGroups = m->getNumGroups(); @@ -277,9 +301,9 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB, int p, st vector groups; if (numGroups == 0) { //get score for all users groups - for (int i = 0; i < (tmap->getNamesOfGroups()).size(); i++) { - if ((tmap->getNamesOfGroups())[i] != "xxx") { - groups.push_back((tmap->getNamesOfGroups())[i]); + for (int i = 0; i < (ct->getNamesOfGroups()).size(); i++) { + if ((ct->getNamesOfGroups())[i] != "xxx") { + groups.push_back((ct->getNamesOfGroups())[i]); } } namesOfGroupCombos.push_back(groups); @@ -290,31 +314,20 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB, int p, st namesOfGroupCombos.push_back(groups); } } + + lines.clear(); + int numPairs = namesOfGroupCombos.size(); + int numPairsPerProcessor = ceil(numPairs / processors); + + for (int i = 0; i < processors; i++) { + int startPos = i * numPairsPerProcessor; + if(i == processors - 1){ numPairsPerProcessor = numPairs - i * numPairsPerProcessor; } + lines.push_back(linePair(startPos, numPairsPerProcessor)); + } + + data = createProcesses(t, namesOfGroupCombos, true, ct); + lines.clear(); - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - if(processors == 1){ - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), true); - }else{ - int numPairs = namesOfGroupCombos.size(); - - int numPairsPerProcessor = numPairs / processors; - - for (int i = 0; i < processors; i++) { - int startPos = i * numPairsPerProcessor; - if(i == processors - 1){ - numPairsPerProcessor = numPairs - i * numPairsPerProcessor; - } - lines.push_back(linePair(startPos, numPairsPerProcessor)); - } - - data = createProcesses(t, namesOfGroupCombos, true); - - lines.clear(); - } - #else - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), true); - #endif - return data; } catch(exception& e) { @@ -324,14 +337,14 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB, int p, st } /**************************************************************************************************/ -EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfGroupCombos, bool usingGroups) { +EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfGroupCombos, bool usingGroups, CountTable* ct) { try { -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - int process = 1; + int process = 1; vector processIDS; EstOutput results; - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + //loop through and create all the processes you want while (process != processors) { int pid = fork(); @@ -341,13 +354,13 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG process++; }else if (pid == 0){ EstOutput myresults; - myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num, usingGroups); + myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num, usingGroups, ct); if (m->control_pressed) { exit(0); } //pass numSeqs to parent ofstream out; - string tempFile = outputDir + toString(getpid()) + ".unweighted.results.temp"; + string tempFile = outputDir + m->mothurGetpid(process) + ".unweighted.results.temp"; m->openOutputFile(tempFile, out); out << myresults.size() << endl; for (int i = 0; i < myresults.size(); i++) { out << myresults[i] << '\t'; } out << endl; @@ -361,7 +374,7 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG } } - results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, usingGroups); + results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, usingGroups, ct); //force parent to wait until all the processes are done for (int i=0;i<(processors-1);i++) { @@ -395,9 +408,51 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG in.close(); m->mothurRemove(s); } +#else + //for some reason it doesn't seem to be calculating hte random trees scores. all scores are the same even though copytree appears to be randomized. + + /* + //fill in functions + vector pDataArray; + DWORD dwThreadIdArray[processors-1]; + HANDLE hThreadArray[processors-1]; + vector cts; + vector trees; + + //Create processor worker threads. + for( int i=1; icopy(ct); + Tree* copyTree = new Tree(copyCount); + copyTree->getCopy(t); + + cts.push_back(copyCount); + trees.push_back(copyTree); + + unweightedData* tempweighted = new unweightedData(m, lines[i].start, lines[i].num, namesOfGroupCombos, copyTree, copyCount, includeRoot); + pDataArray.push_back(tempweighted); + processIDS.push_back(i); + + hThreadArray[i-1] = CreateThread(NULL, 0, MyUnWeightedRandomThreadFunction, pDataArray[i-1], 0, &dwThreadIdArray[i-1]); + } - return results; -#endif + results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, usingGroups, ct); + + //Wait until all threads have terminated. + WaitForMultipleObjects(processors-1, hThreadArray, TRUE, INFINITE); + + //Close all thread handles and free memory allocations. + for(int i=0; i < pDataArray.size(); i++){ + for (int j = 0; j < pDataArray[i]->results.size(); j++) { results.push_back(pDataArray[i]->results[j]); } + delete cts[i]; + delete trees[i]; + CloseHandle(hThreadArray[i]); + delete pDataArray[i]; + } */ + + results = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), usingGroups, ct); +#endif + return results; } catch(exception& e) { m->errorOut(e, "Unweighted", "createProcesses"); @@ -405,14 +460,14 @@ EstOutput Unweighted::createProcesses(Tree* t, vector< vector > namesOfG } } /**************************************************************************************************/ -EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num, bool usingGroups) { +EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num, bool usingGroups, CountTable* ct) { try { EstOutput results; results.resize(num); int count = 0; - Tree* copyTree = new Tree(tmap); + Tree* copyTree = new Tree(ct); for (int h = start; h < (start+num); h++) { @@ -477,7 +532,7 @@ EstOutput Unweighted::driver(Tree* t, vector< vector > namesOfGroupCombo if (isnan(UW) || isinf(UW)) { UW = 0; } results[count] = UW; - } + } count++; }