static boolean isInformative(tree *tr, int dataType, int site) { int informativeCounter = 0, check[256], j, undetermined = getUndetermined(dataType); const unsigned int *bitVector = getBitVector(dataType); unsigned char nucleotide; for(j = 0; j < 256; j++) check[j] = 0; for(j = 1; j <= tr->mxtips; j++) { nucleotide = tr->yVector[j][site]; check[nucleotide] = check[nucleotide] + 1; assert(bitVector[nucleotide] > 0); } for(j = 0; j < undetermined; j++) { if(check[j] > 0) informativeCounter++; } if(informativeCounter <= 1) return FALSE; else { for(j = 0; j < undetermined; j++) { if(check[j] > 1) return TRUE; } } return FALSE; }
void fixModelIndices(tree *tr, int endsite, boolean fixRates) { int model, i; assert(tr->NumberOfModels > 0); tr->partitionData[0].lower = 0; model = tr->model[0]; i = 1; while(i < endsite) { if(tr->model[i] != model) { tr->partitionData[model].upper = i; tr->partitionData[model + 1].lower = i; model = tr->model[i]; } i++; } tr->partitionData[tr->NumberOfModels - 1].upper = endsite; for(model = 0; model < tr->NumberOfModels; model++) tr->partitionData[model].width = tr->partitionData[model].upper - tr->partitionData[model].lower; #ifndef _USE_PTHREADS for(model = 0; model < tr->NumberOfModels; model++) { int j, lower = tr->partitionData[model].lower; /* SOS what about sumBuffer? */ /* tr->partitionData[model].sumBuffer = &tr->sumBuffer[offset]; */ tr->partitionData[model].perSiteLL = &tr->perSiteLL[lower]; tr->partitionData[model].wgt = &tr->cdta->aliaswgt[lower]; tr->partitionData[model].invariant = &tr->invariant[lower]; tr->partitionData[model].rateCategory = &tr->cdta->rateCategory[lower]; for(j = 1; j <= tr->mxtips; j++) tr->partitionData[model].yVector[j] = &(tr->yVector[j][tr->partitionData[model].lower]); { int width = tr->partitionData[model].width, undetermined = getUndetermined(tr->partitionData[model].dataType), j; tr->partitionData[model].gapVectorLength = ((int)width / 32) + 1; memset(tr->partitionData[model].gapVector, 0, tr->partitionData[model].initialGapVectorSize); for(j = 1; j <= tr->mxtips; j++) for(i = 0; i < width; i++) if(tr->partitionData[model].yVector[j][i] == undetermined) tr->partitionData[model].gapVector[tr->partitionData[model].gapVectorLength * j + i / 32] |= mask32[i % 32]; } } #else masterBarrier(THREAD_FIX_MODEL_INDICES, tr); #endif if(fixRates) updatePerSiteRates(tr, TRUE); }