X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=parsimony.cpp;h=b12ca1fe742240a4c80e96d0d82bcb2ef612fa18;hp=49a73505c3df0c77b4ff3fe0b6e71f038eb5f13c;hb=df7e3ff9f68ef157b0328a2d353c3258c5d45d89;hpb=55386dddad84cc1140d736cabaf4dd0ae16f2e01 diff --git a/parsimony.cpp b/parsimony.cpp index 49a7350..b12ca1f 100644 --- a/parsimony.cpp +++ b/parsimony.cpp @@ -15,6 +15,7 @@ EstOutput Parsimony::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 vector mGroups = m->getGroups(); @@ -37,7 +38,7 @@ EstOutput Parsimony::getValues(Tree* t, int p, string o) { vector groups; if (numGroups == 0) { //get score for all users groups - vector tGroups = tmap->getNamesOfGroups(); + vector tGroups = ct->getNamesOfGroups(); for (int i = 0; i < tGroups.size(); i++) { if (tGroups[i] != "xxx") { groups.push_back(tGroups[i]); @@ -53,31 +54,18 @@ EstOutput Parsimony::getValues(Tree* t, int p, string o) { namesOfGroupCombos.push_back(groups); } } - - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - if(processors == 1){ - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size()); - }else{ - lines.clear(); - 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); - } - #else - data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size()); - #endif + + lines.clear(); + 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, ct); return data; @@ -89,14 +77,15 @@ EstOutput Parsimony::getValues(Tree* t, int p, string o) { } /**************************************************************************************************/ -EstOutput Parsimony::createProcesses(Tree* t, vector< vector > namesOfGroupCombos) { +EstOutput Parsimony::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) { int pid = fork(); @@ -106,7 +95,7 @@ EstOutput Parsimony::createProcesses(Tree* t, vector< vector > namesOfGr 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); } @@ -126,7 +115,7 @@ EstOutput Parsimony::createProcesses(Tree* t, vector< vector > namesOfGr } } - 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 > namesOfGr 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); + + parsData* temppars = new parsData(m, lines[i].start, lines[i].num, namesOfGroupCombos, copyTree, copyCount); + pDataArray.push_back(temppars); + processIDS.push_back(i); + + hThreadArray[i-1] = CreateThread(NULL, 0, MyParsimonyThreadFunction, pDataArray[i-1], 0, &dwThreadIdArray[i-1]); + } + + results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, 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]; + } - return results; #endif + return results; } catch(exception& e) { m->errorOut(e, "Parsimony", "createProcesses"); @@ -169,12 +196,12 @@ EstOutput Parsimony::createProcesses(Tree* t, vector< vector > namesOfGr } } /**************************************************************************************************/ -EstOutput Parsimony::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num) { +EstOutput Parsimony::driver(Tree* t, vector< vector > namesOfGroupCombos, int start, int num, CountTable* ct) { try { EstOutput results; results.resize(num); - Tree* copyTree = new Tree(tmap); + Tree* copyTree = new Tree(ct); int count = 0; for (int h = start; h < (start+num); h++) {