X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=parsimony.h;h=51c0496b1405c43793ba2c47c7557c6b0c43630f;hp=bf0e0d4f90198ef353c2c1899414f699454c8a7e;hb=cf9987b67aa49777a4c91c2d21f96e58bf17aa82;hpb=6c2b1e530a5c0bb87040e58a3e410097acdfcc3d diff --git a/parsimony.h b/parsimony.h index bf0e0d4..51c0496 100644 --- a/parsimony.h +++ b/parsimony.h @@ -38,7 +38,91 @@ class Parsimony : public TreeCalculator { EstOutput driver(Tree*, vector< vector >, int, int, CountTable*); EstOutput createProcesses(Tree*, vector< vector >, CountTable*); }; - /***********************************************************************/ +struct parsData { + int start; + int num; + MothurOut* m; + EstOutput results; + vector< vector > namesOfGroupCombos; + Tree* t; + CountTable* ct; + + parsData(){} + parsData(MothurOut* mout, int st, int en, vector< vector > ngc, Tree* tree, CountTable* count) { + m = mout; + start = st; + num = en; + namesOfGroupCombos = ngc; + t = tree; + ct = count; + } +}; + +/**************************************************************************************************/ +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) +#else +static DWORD WINAPI MyParsimonyThreadFunction(LPVOID lpParam){ + parsData* pDataArray; + pDataArray = (parsData*)lpParam; + try { + + pDataArray->results.resize(pDataArray->num); + + Tree* copyTree = new Tree(pDataArray->ct); + int count = 0; + + for (int h = pDataArray->start; h < (pDataArray->start+pDataArray->num); h++) { + + if (pDataArray->m->control_pressed) { delete copyTree; return 0; } + + int score = 0; + + //groups in this combo + vector groups = pDataArray->namesOfGroupCombos[h]; + + //copy users tree so that you can redo pgroups + copyTree->getCopy(pDataArray->t); + + //create pgroups that reflect the groups the user want to use + for(int i=copyTree->getNumLeaves();igetNumNodes();i++){ + copyTree->tree[i].pGroups = (copyTree->mergeUserGroups(i, groups)); + } + + for(int i=copyTree->getNumLeaves();igetNumNodes();i++){ + + if (pDataArray->m->control_pressed) { return 0; } + + int lc = copyTree->tree[i].getLChild(); + int rc = copyTree->tree[i].getRChild(); + + int iSize = copyTree->tree[i].pGroups.size(); + int rcSize = copyTree->tree[rc].pGroups.size(); + int lcSize = copyTree->tree[lc].pGroups.size(); + + //if isize are 0 then that branch is to be ignored + if (iSize == 0) { } + else if ((rcSize == 0) || (lcSize == 0)) { } + //if you have more groups than either of your kids then theres been a change. + else if(iSize > rcSize || iSize > lcSize){ + score++; + } + } + + pDataArray->results[count] = score; + count++; + } + + delete copyTree; + + return 0; + + } + catch(exception& e) { + pDataArray->m->errorOut(e, "Parsimony", "MyParsimonyThreadFunction"); + exit(1); + } +} +#endif #endif