void Restaurant::initializePatrons(void) { // how many patrons? if (assumingAdmixture == false) numPatrons = observationsPtr->getNumIndividuals(); else if (assumingAdmixture == true && individualsInRestaurant == -1) numPatrons = observationsPtr->getNumIndividuals() * observationsPtr->getTotalNumAlleleCopies(); else if (assumingAdmixture == true && individualsInRestaurant >= 0) numPatrons = observationsPtr->getTotalNumAlleleCopies(); // allocate the patrons patrons = new Patron*[numPatrons]; // set the index information for each patron if (assumingAdmixture == false) { for (int i=0; i<numPatrons; i++) { patrons[i] = new PatronIndividual( observationsPtr, i, observationsPtr->getNumLoci(), observationsPtr->getNumUniqueAlleles() ); patrons[i]->setIndex(i); patrons[i]->setIndividual(i); } } else if (assumingAdmixture == true && individualsInRestaurant == -1) { for (int i=0, m=0; i<observationsPtr->getNumIndividuals(); i++) { for (int j=0; j<observationsPtr->getNumLoci(); j++) { int ploidy = 1; if (observationsPtr->getIsDiploid(j) == true) ploidy = 2; for (int k=0; k<ploidy; k++) { patrons[m] = new PatronAllele( observationsPtr, m, i, j, k, observationsPtr->getNumUniqueAllelesAtLocus(j) ); m++; } } } } else if (assumingAdmixture == true && individualsInRestaurant >= 0) { for (int j=0, m=0; j<observationsPtr->getNumLoci(); j++) { int ploidy = 1; if (observationsPtr->getIsDiploid(j) == true) ploidy = 2; for (int k=0; k<ploidy; k++) { patrons[m] = new PatronAllele( observationsPtr, m, individualsInRestaurant, j, k, observationsPtr->getNumUniqueAllelesAtLocus(j) ); m++; } } } // set the data for each patron for (int i=0; i<numPatrons; i++) { Patron *p = patrons[i]; int elemIdx = p->getIndividual(); p->setData( observationsPtr->getPtrToIndividual(elemIdx) ); } // set the ln likelihood for each data element when placed in a population by itself for (int i=0; i<numPatrons; i++) { Patron *p = patrons[i]; double x = lnLikelihoodNewTable(p); p->setLnLikelihoodAlone(x); } }