Permalink
Browse files

-further improved the function for computing the likelihoods of trees

-it will now evaluate the likelihoods of all trees contained in the file passed via -t
-the operations are fully checkpointed
-one can chose between -f e and -f E
-the -f e option will do a fast tree evalutaion, just optimizing the likelihood model parames for the
 first tree in the file and the just optimizing branch lengths for all subsequent files
-the -f E option will re-optimize likelihood model parameters for each tree
  • Loading branch information...
1 parent 5a68186 commit a749868bed8a829c780c873d7cee6d894dfe1939 @stamatak committed Mar 7, 2013
Showing with 366 additions and 55 deletions.
  1. +5 −0 examl/354.trees
  2. +338 −42 examl/axml.c
  3. +8 −4 examl/axml.h
  4. +2 −1 examl/globalVariables.h
  5. +4 −2 examl/optimizeModel.c
  6. +8 −6 examl/searchAlgo.c
  7. BIN testData/354.binary
  8. +1 −0 testData/354.tree
View
5 examl/354.trees
5 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
380 examl/axml.c
@@ -175,6 +175,23 @@ void printBothOpen(const char* format, ... )
}
}
+static void printBothOpenDifferentFile(char *fileName, const char* format, ... )
+{
+ if(processID == 0)
+ {
+ FILE
+ *f = myfopen(fileName, "ab");
+
+ va_list
+ args;
+
+ va_start(args, format);
+ vfprintf(f, format, args );
+ va_end(args);
+
+ fclose(f);
+ }
+}
@@ -782,6 +799,18 @@ static void printMinusFUsage(void)
printf("\n");
+ printf(" \"-f e\": compute the likelihood of a bunch of trees passed via -t\n");
+ printf(" this option will do a quick and dirty optimization without re-optimizng\n");
+ printf(" the model parameters for each tree\n");
+
+ printf("\n");
+
+ printf(" \"-f E\": compute the likelihood of a bunch of trees passed via -t\n");
+ printf(" this option will do a thorough optimization that re-optimizes\n");
+ printf(" the model parameters for each tree\n");
+
+ printf("\n");
+
printf(" \"-f o\": old and slower rapid hill-climbing without heuristic cutoff\n");
printf("\n");
@@ -812,7 +841,7 @@ static void printREADME(void)
printf(" [-c numberOfCategories]\n");
printf(" [-D]\n");
printf(" [-e likelihoodEpsilon] \n");
- printf(" [-f d|o]\n");
+ printf(" [-f d|e|E|o]\n");
printf(" [-h] \n");
printf(" [-i initialRearrangementSetting] \n");
printf(" [-M]\n");
@@ -1034,6 +1063,11 @@ static void get_args(int argc, char *argv[], analdef *adef, tree *tr)
{
case 'e':
adef->mode = TREE_EVALUATION;
+ tr->fastTreeEvaluation = TRUE;
+ break;
+ case 'E':
+ adef->mode = TREE_EVALUATION;
+ tr->fastTreeEvaluation = FALSE;
break;
case 'd':
adef->mode = BIG_RAPID_MODE;
@@ -1186,16 +1220,19 @@ static void makeFileNames(void)
strcpy(logFileName, workdir);
strcpy(infoFileName, workdir);
strcpy(binaryCheckpointName, workdir);
+ strcpy(modelFileName, workdir);
strcat(resultFileName, "ExaML_result.");
strcat(logFileName, "ExaML_log.");
strcat(infoFileName, "ExaML_info.");
strcat(binaryCheckpointName, "ExaML_binaryCheckpoint.");
+ strcat(modelFileName, "ExaML_modelFile.");
strcat(resultFileName, run_id);
strcat(logFileName, run_id);
strcat(infoFileName, run_id);
strcat(binaryCheckpointName, run_id);
+ strcat(modelFileName, run_id);
infoFileExists = filexists(infoFileName);
@@ -1257,7 +1294,7 @@ static void printModelAndProgramInfo(tree *tr, analdef *adef, int argc, char *ar
printBoth(infoFile, "\nExaML rapid hill-climbing mode\n\n");
break;
case TREE_EVALUATION:
- printBoth(infoFile, "\nExaML tree evaluation mode\n\n");
+ printBoth(infoFile, "\nExaML %s tree evaluation mode\n\n", (tr->fastTreeEvaluation)?"fast":"slow");
break;
default:
assert(0);
@@ -1516,9 +1553,180 @@ void getDataTypeString(tree *tr, int model, char typeOfData[1024])
assert(0);
}
}
+static void printRatesDNA_BIN(int n, double *r, char **names, char *fileName)
+{
+ int i, j, c;
+
+ for(i = 0, c = 0; i < n; i++)
+ {
+ for(j = i + 1; j < n; j++)
+ {
+ if(i == n - 2 && j == n - 1)
+ printBothOpenDifferentFile(fileName, "rate %s <-> %s: %f\n", names[i], names[j], 1.0);
+ else
+ printBothOpenDifferentFile(fileName, "rate %s <-> %s: %f\n", names[i], names[j], r[c]);
+ c++;
+ }
+ }
+}
+static void printRatesRest(int n, double *r, char **names, char *fileName)
+{
+ int i, j, c;
+
+ for(i = 0, c = 0; i < n; i++)
+ {
+ for(j = i + 1; j < n; j++)
+ {
+ printBothOpenDifferentFile(fileName, "rate %s <-> %s: %f\n", names[i], names[j], r[c]);
+ c++;
+ }
+ }
+}
+static double branchLength(int model, double *z, tree *tr)
+{
+ double x;
+
+ x = z[model];
+ assert(x > 0);
+ if (x < zmin)
+ x = zmin;
+
+
+ assert(x <= zmax);
+
+ if(tr->numBranches == 1)
+ x = -log(x) * tr->fracchange;
+ else
+ x = -log(x) * tr->fracchanges[model];
+
+ return x;
+
+}
+static double treeLengthRec(nodeptr p, tree *tr, int model)
+{
+ double
+ x = branchLength(model, p->z, tr);
+
+ if(isTip(p->number, tr->mxtips))
+ return x;
+ else
+ {
+ double acc = 0;
+ nodeptr q;
+
+ q = p->next;
+
+ while(q != p)
+ {
+ acc += treeLengthRec(q->back, tr, model);
+ q = q->next;
+ }
+
+ return acc + x;
+ }
+}
+
+static double treeLength(tree *tr, int model)
+{
+ return treeLengthRec(tr->start->back, tr, model);
+}
+
+static void printFreqs(int n, double *f, char **names, char *fileName)
+{
+ int k;
+
+ for(k = 0; k < n; k++)
+ printBothOpenDifferentFile(fileName, "freq pi(%s): %f\n", names[k], f[k]);
+}
+
+static void printModelParams(tree *tr, analdef *adef, int treeIteration)
+{
+ int
+ model;
+
+ double
+ *f = (double*)NULL,
+ *r = (double*)NULL;
+
+ char
+ fileName[2048],
+ buf[64];
+
+ strcpy(fileName, modelFileName);
+ strcat(fileName, ".");
+ sprintf(buf, "%d", treeIteration);
+ strcat(fileName, buf);
+
+ for(model = 0; model < tr->NumberOfModels; model++)
+ {
+ double tl;
+ char typeOfData[1024];
+
+ getDataTypeString(tr, model, typeOfData);
+
+ printBothOpenDifferentFile(fileName, "\n\n");
+
+ printBothOpenDifferentFile(fileName, "Model Parameters of Partition %d, Name: %s, Type of Data: %s\n",
+ model, tr->partitionData[model].partitionName, typeOfData);
+
+ if(tr->rateHetModel == GAMMA)
+ printBothOpenDifferentFile(fileName, "alpha: %f\n", tr->partitionData[model].alpha);
+
+
+ if(adef->perGeneBranchLengths)
+ tl = treeLength(tr, model);
+ else
+ tl = treeLength(tr, 0);
+
+ printBothOpenDifferentFile(fileName, "Tree-Length: %f\n", tl);
+
+ f = tr->partitionData[model].frequencies;
+ r = tr->partitionData[model].substRates;
+
+ switch(tr->partitionData[model].dataType)
+ {
+ case AA_DATA:
+ {
+ char *freqNames[20] = {"A", "R", "N ","D", "C", "Q", "E", "G",
+ "H", "I", "L", "K", "M", "F", "P", "S",
+ "T", "W", "Y", "V"};
+
+ printRatesRest(20, r, freqNames, fileName);
+ printBothOpenDifferentFile(fileName, "\n");
+ printFreqs(20, f, freqNames, fileName);
+ }
+ break;
+ case DNA_DATA:
+ {
+ char *freqNames[4] = {"A", "C", "G", "T"};
+
+ printRatesDNA_BIN(4, r, freqNames, fileName);
+ printBothOpenDifferentFile(fileName, "\n");
+ printFreqs(4, f, freqNames, fileName);
+ }
+ break;
+ case BINARY_DATA:
+ {
+ char *freqNames[2] = {"0", "1"};
+
+ printRatesDNA_BIN(2, r, freqNames, fileName);
+ printBothOpenDifferentFile(fileName, "\n");
+ printFreqs(2, f, freqNames, fileName);
+ }
+ break;
+ default:
+ assert(0);
+ }
+
+ printBothOpenDifferentFile(fileName, "\n");
+ }
+
+ printBothOpenDifferentFile(fileName, "\n");
+}
+
static void finalizeInfoFile(tree *tr, analdef *adef)
{
@@ -1540,8 +1748,11 @@ static void finalizeInfoFile(tree *tr, analdef *adef)
printBothOpen("Execution Log File written to: %s\n", logFileName);
printBothOpen("Execution information file written to: %s\n",infoFileName);
break;
- case TREE_EVALUATION:
- printBothOpen("\n\nOverall Time for tree evaluation %f\n", t);
+ case TREE_EVALUATION:
+ printBothOpen("\n\nOverall Time for evaluating the likelihhod of %d trees: %f secs\n\n", tr->numberOfTrees, t);
+ printBothOpen("\n\nThe model parameters of the trees have been written to files called %s.i\n", modelFileName);
+ printBothOpen("where i is the number of the tree\n\n");
+ printBothOpen("Note that, in case of a restart from a checkpoint, some tree model files will have been produced by previous runs!\n\n");
break;
default:
assert(0);
@@ -2151,6 +2362,127 @@ static void initializeTree(tree *tr, analdef *adef)
}
+static int getNumberOfTrees(char *fileName, boolean getOffsets, long *treeOffsets)
+{
+ FILE
+ *f = myfopen(fileName, "r");
+
+ int
+ trees = 0,
+ ch;
+
+ if(getOffsets)
+ treeOffsets[trees] = 0;
+
+ while((ch = fgetc(f)) != EOF)
+ {
+ if(ch == ';')
+ {
+ trees++;
+ if(getOffsets)
+ treeOffsets[trees] = ftell(f) + 1;
+ }
+ }
+
+ assert(trees > 0);
+
+ fclose(f);
+
+ return trees;
+}
+
+static void optimizeTrees(tree *tr, double likelihoodEpsilon, analdef *adef)
+{
+ long
+ *treeOffsets;
+
+ int
+ i;
+
+ tr->numberOfTrees = getNumberOfTrees(tree_file, FALSE, (long *)NULL);
+
+
+ if(processID == 0)
+ accumulatedTime = 0.0;
+
+ treeOffsets = (long *)malloc(sizeof(long) * (tr->numberOfTrees + 1));
+
+ tr->likelihoods = (double *)malloc(sizeof(double) * tr->numberOfTrees);
+
+ getNumberOfTrees(tree_file, TRUE, treeOffsets);
+
+ if(processID == 0)
+ printBothOpen("\n\nFound %d trees to evaluate\n\n", tr->numberOfTrees);
+
+ i = 0;
+
+ if(adef->useCheckpoint)
+ {
+ restart(tr, adef);
+
+ i = ckp.treeIteration;
+
+ if(tr->fastTreeEvaluation && i > 0)
+ treeEvaluate(tr, 2);
+ else
+ modOpt(tr, 0.1, adef, i);
+
+ tr->likelihoods[i] = tr->likelihood;
+
+ if(processID == 0)
+ printModelParams(tr, adef, i);
+
+ i++;
+ }
+
+ for(; i < tr->numberOfTrees; i++)
+ {
+ FILE
+ *treeFile = myfopen(tree_file, "rb");
+
+ if(fseek(treeFile, treeOffsets[i], SEEK_SET) != 0)
+ assert(0);
+
+ tr->likelihood = unlikely;
+
+ treeReadLen(treeFile, tr, FALSE, FALSE, FALSE);
+
+ fclose(treeFile);
+
+ tr->start = tr->nodep[1];
+
+ if(i > 0)
+ resetBranches(tr);
+
+ evaluateGeneric(tr, tr->start, TRUE);
+
+ if(tr->fastTreeEvaluation && i > 0)
+ {
+ ckp.state = MOD_OPT;
+
+ ckp.treeIteration = i;
+
+ writeCheckpoint(tr);
+
+ treeEvaluate(tr, 2);
+ }
+ else
+ {
+ treeEvaluate(tr, 1);
+ modOpt(tr, 0.1, adef, i);
+ }
+
+ tr->likelihoods[i] = tr->likelihood;
+
+ if(processID == 0)
+ printModelParams(tr, adef, i);
+ }
+
+ if(processID == 0)
+ for(i = 0; i < tr->numberOfTrees; i++)
+ printBothOpen("Likelihood tree %d: %f \n", i, tr->likelihoods[i]);
+}
+
int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
@@ -2205,44 +2537,8 @@ int main (int argc, char *argv[])
switch(adef->mode)
{
- case TREE_EVALUATION:
- if(adef->useCheckpoint)
- {
- /* read checkpoint file */
- restart(tr, adef);
-
- modOpt(tr, 0.1, adef);
- }
- else
- {
- /* not important, only used to keep track of total accumulated exec time
- when checkpointing and restarts were used */
-
- if(processID == 0)
- accumulatedTime = 0.0;
-
- /* get the starting tree: here we just parse the tree passed via the command line
- and do an initial likelihood computation traversal
- which we maybe should skip, TODO */
-
- getStartingTree(tr);
-
- /*
- here we do an initial full tree traversal on the starting tree using the Felsenstein pruning algorithm
- This should basically be the first call to the library that actually computes something :-)
- */
-
- evaluateGeneric(tr, tr->start, TRUE);
-
- treeEvaluate(tr, 1);
-
- modOpt(tr, 0.1, adef);
- }
-
- if(processID == 0)
- printBothOpen("final likelihood: %f\n", tr->likelihood);
-
- /* now start the ML search algorithm */
+ case TREE_EVALUATION:
+ optimizeTrees(tr, 0.1, adef);
break;
case BIG_RAPID_MODE:
View
12 examl/axml.h
@@ -602,6 +602,7 @@ typedef struct {
/* modOpt */
int catOpt;
+ int treeIteration;
} checkPointState;
@@ -764,6 +765,12 @@ typedef struct {
char bits_in_16bits [0x1u << 16];
boolean useMedian;
+
+ int numberOfTrees;
+
+ double *likelihoods;
+
+ boolean fastTreeEvaluation;
} tree;
@@ -953,7 +960,7 @@ extern void doAllInOne ( tree *tr, analdef *adef );
extern void classifyML(tree *tr, analdef *adef);
extern void resetBranches ( tree *tr );
-extern void modOpt ( tree *tr, double likelihoodEpsilon, analdef *adef);
+extern void modOpt ( tree *tr, double likelihoodEpsilon, analdef *adef, int treeIteration);
@@ -1028,7 +1035,6 @@ extern void treeReadTopologyString(char *treeString, tree *tr);
extern boolean treeReadLenMULT ( FILE *fp, tree *tr, analdef *adef );
extern void getStartingTree ( tree *tr);
-extern double treeLength(tree *tr, int model);
extern void computeBootStopOnly(tree *tr, char *bootStrapFileName, analdef *adef);
extern boolean bootStop(tree *tr, hashtable *h, int numberOfTrees, double *pearsonAverage, unsigned int **bitVectors, int treeVectorLength, unsigned int vectorLength);
@@ -1122,8 +1128,6 @@ extern int getIncrement(tree *tr, int model);
-extern FILE *getNumberOfTrees(tree *tr, char *fileName, analdef *adef);
-
extern void writeBinaryModel(tree *tr);
extern void readBinaryModel(tree *tr);
extern void treeEvaluateRandom (tree *tr, double smoothFactor);
View
3 examl/globalVariables.h
@@ -54,7 +54,8 @@ char run_id[128] = "",
proteinModelFileName[1024] = "",
binaryCheckpointName[1024] = "",
binaryCheckpointInputName[1024] = "",
- byteFileName[1024] = "";
+ byteFileName[1024] = "",
+ modelFileName[1024] = "";
char *protModels[NUM_PROT_MODELS] = {"DAYHOFF", "DCMUT", "JTT", "MTREV", "WAG", "RTREV", "CPREV", "VT", "BLOSUM62", "MTMAM", "LG", "MTART", "MTZOA", "PMB",
"HIVB", "HIVW", "JTTDCMUT", "FLU", "AUTO","GTR"};
View
6 examl/optimizeModel.c
@@ -2895,7 +2895,7 @@ static void autoProtein(tree *tr)
-void modOpt(tree *tr, double likelihoodEpsilon, analdef *adef)
+void modOpt(tree *tr, double likelihoodEpsilon, analdef *adef, int treeIteration)
{
int
i,
@@ -2933,7 +2933,9 @@ void modOpt(tree *tr, double likelihoodEpsilon, analdef *adef)
{
ckp.state = MOD_OPT;
- ckp.catOpt = catOpt;
+ ckp.catOpt = catOpt;
+
+ ckp.treeIteration = treeIteration;
writeCheckpoint(tr);
}
View
14 examl/searchAlgo.c
@@ -1127,13 +1127,14 @@ void writeCheckpoint(tree *tr)
myfwrite(&(tr->partitionData[model].autoProtModels), sizeof(int), 1, f);
}
-
+ if(ckp.state == MOD_OPT)
+ myfwrite(tr->likelihoods, sizeof(double), tr->numberOfTrees, f);
writeTree(tr, f);
fclose(f);
- printBothOpen("\nCheckpoint written to: %s likelihood: %f\n", extendedName, tr->likelihood);
+ /* printBothOpen("\nCheckpoint written to: %s likelihood: %f\n", extendedName, tr->likelihood); */
}
static void readTree(tree *tr, FILE *f)
@@ -1316,7 +1317,8 @@ static void readCheckpoint(tree *tr)
myfread(&(tr->partitionData[model].autoProtModels), sizeof(int), 1, f);
}
-
+ if(ckp.state == MOD_OPT)
+ myfread(tr->likelihoods, sizeof(double), tr->numberOfTrees, f);
updatePerSiteRates(tr, FALSE);
@@ -1588,7 +1590,7 @@ void computeBIGRAPID (tree *tr, analdef *adef, boolean estimateModel)
if(!adef->useCheckpoint)
{
if(estimateModel)
- modOpt(tr, 10.0, adef);
+ modOpt(tr, 10.0, adef, 0);
else
treeEvaluate(tr, 2);
}
@@ -1632,7 +1634,7 @@ void computeBIGRAPID (tree *tr, analdef *adef, boolean estimateModel)
/* optimize model params more thoroughly or just optimize branch lengths */
if(estimateModel)
- modOpt(tr, 5.0, adef);
+ modOpt(tr, 5.0, adef, 0);
else
treeEvaluate(tr, 1);
}
@@ -1929,7 +1931,7 @@ void computeBIGRAPID (tree *tr, analdef *adef, boolean estimateModel)
alone */
if(estimateModel)
- modOpt(tr, 1.0, adef);
+ modOpt(tr, 1.0, adef, 0);
else
treeEvaluate(tr, 1.0);
View
BIN testData/354.binary
Binary file not shown.
View
1 testData/354.tree
@@ -0,0 +1 @@
+((((bn_001BGTue,((ac002MorArb,bn_002BGTue),((bf_005BGTue,(bf_002BGTue,st_001BGTue)),st_002BGTue))),((er101AA26384W,(er002MorArb,(er003MorArb,(er108AA26384W,er005MorArb)))),(ol037MorArb,(((si_006MorArb,ol111PRChina),si_003MorArb),(am111TS17259W,(((ja157TS17319W,ja117TS17319W),ja144TS17319W),((((ps209TS16075W,(ps202TS16075W,(ps117TS16020W,(ps120TS16020W,(ps211TS16075W,ps115TS16020W))))),ps121TS16020W),(pa005BGTue,pa006BGTue)),(((fl017MorArb,fl010MorArb),((wa125For29653E,(wa224Kin20879E,(wa112For29653E,am110TS17259W))),(ol039MorArb,(fl114PRChina,fl103PRChina)))),(((laevigatumSH,(cc009MorArb,cc004MorArb)),am104TS17259W),(sh109TS17342W,(sh_001aureum,(sh108TS17342W,sh106TS17342W)))))))))))),(((sterculiaceumSH,(db_038BGTue,(franchetiiSH,(db_021BGTue,db_025BGTue)))),(((cd018BGTue,(cd001BGTue,(cd127AragwiVGeo,(cd125AragwiVGeo,cd126AragwiVGeo)))),((my_005MorArb,my_009MorArb),((mo202ShenHubei,((mo203ShenHubei,(mo106ShenHubei,((mo324LongHubei,mo303LongHubei),mo103ShenHubei))),((pl1501SSweden,(pl_403Germany,pl1426SkeenS)),(ok103Sun4194W,(ok105Sun4194W,(tr_024BGTue,(ok112Sun4194W,(mo519TS16041W,(mo413TS16017W,(mo518TS16041W,(tr_002BGTue,(mo420TS16017W,(mo505TS16041W,mo415TS16017W))))))))))))),(ca1507EAustria,(ca1913QuilanF,(ca2111StAnastF,(ca2103StAnastF,(ca3102VdLlobrE,((ca30b10VdHeraultF,(ca2407VdCisseF,ca2905CsseNoirF)),((ca2835GdlJonteF,ca2837GdlJonteF),((((ca2804GdlJonteF,ca306PdCissaI),(ca1616EBulgaria,((ca301PdCissaI,(ca2912CsseNoirF,(ca2858GdlJonteF,(ca2114StAnastF,(ca2207BurgEltzD,(ca2212BurgEltzD,ca2102StAnastF)))))),ca1633EBulgaria))),ca2422VdlCisseF),(ca1407VeynesF,((ca27a66_2707loc1F,(ca2302MuehltLUX,(ca1801SWGer,(ca2303MuehltLUX,(ca30b04VdHeraultF,((ca3010VdHeraultF,ca2856GdlJonteF),((ca2807GdlJonteF,ca2808GdlJonteF),(ca3101VdLlobrE,ca3110VdLlobrE)))))))),ca2803GdlJonteF))))))))))))),(mp307SCalif,((mp103SequoiaNP,mp101SequoiaNP),mp001BGTue)))),((((gl_104BryceCyn,(gl_111BryceCyn,(gl_105BryceCyn,(gl_113BryceCyn,(gl_110BryceCyn,gl_114BryceCyn))))),(((((ts102TS17304W,(ko105TS16025W,(cb014MorArb,cb017MorArb))),(tegmentosumSH,((pe110NEStates,pe107NEStates),((((cp023BGTue,(cp021BGTue,(da121PRChina,(gs101BGTue,gs102BGTue)))),da220ZhejiangBG),(cr043BGTue,(cr101TS17261W,(cr041BGTue,(cr103TS17261W,(cr105TS17261W,caudatifoliumSH)))))),(cp107TS17302W,((cp101TS17302W,gs011BGTue),cp102TS17302W)))))),ds115TS17313W),(Di307XishTrBotG,(np102MtSankaiJ,(np107MtSankajJ,np101MtSankaiJ)))),((mt_105PRChina,((sp_001BGTue,(sp_005BGTue,(sp_003BGTue,(sp_002BGTue,sp_008BGTue)))),(uk_020MorArb,uk_004MorArb))),((he112BGTue,(he111BGTue,((cs103MorArb,cs009BGTue),he005BGTue))),((ne203NEStates,ne201NEStates),(ne1038ZionNP,(ne708NUtah,(ne704NUtah,(ne801EscalNM,(ne907ZionNP,ne806EscalNM)))))))))),((((tv101Georgia,(ve303SirinRudIRN,(ve202VazIRN,(tv112Georgia,(ve308SirinRudIRN,(ve150AssalamIRN,(tv111Georgia,(tv102Georgia,((ve112AssalamIRN,ve306MazanIRN),(ve240VazIRN,((ve115AssalamIRN,(ve209VazIRN,(ve153AssalamIRN,((ve207VazIRN,ve312SirinRudIRN),ve144AssalamIRN)))),((hd218CGreece,hd223CGreece),(tv110Georgia,((hd252CGreece,hd247CGreece),ve140AssalamIRN)))))))))))))),(((((gd116EmigUtah,(gd035MorArb,((gd241ZionNP,(gd126EmigUtah,gd114EmigUtah)),gd025MorArb))),(fd102FloridaCavSP,(fd119FloridaCavSP,(sc140RenssCoNY,(ni101AlbanyNY,(ni209AlbanyNY,ni206AlbanyNY)))))),((ms408BdlHerreriaE,(ms1908VaucluseF,((ms714VdCeleF,((ms903VdCeleF,(ms703VdCeleF,ms814VdCeleF)),ms718VdCeleF)),(ms2131GordesF,((ms1704GdlNesqueF,ms1705GdNesqueF),(ms1226GdlJonteF,((ms1315GdlJonteF,(ms1305GdlJonteF,(ms921VdCeleF,ms512VdCeleF))),ms411BdlHerreriaE))))))),((((((ib113AlpadGEO,hy102Iran),ib303NorawARM),ib402AlpadGEO),ib111AlpadGEO),(hy153Iran,hy133Iran)),(ib108AlpadGEO,ib403AlpadGEO)))),(((pp4004VdHeraultF,pp3012LdAydatF),(pp2804QuilanF,(pp3008LdAydatF,(pp3502GdJonteF,(pp2704Luxembg,((pp2209Hungary,pp2829QuilanF),(pp2247BudapestH,(pp3013LdAydatF,(pp2517Luxembg,(pp3405GdTarnF,(pp4007VdHeraultF,(pp3911cultSWGer,(pp3801CseSauvetF,(pp1702natBGTue,pp3009LdAydatF)))))))))))))),((us1104LovecBUL,us1109LovecBUL),(sv4a2DiktiCrete,(of110Cyprus,(((sv4a5DiktiCrete,(sv207Crete,(sv201Crete,sv204Crete))),sv102Crete),(sv4a3DiktiCrete,sv124Crete))))))),((ot103BGTue,(ot207AetnaSicily,(op1227GdJonteF,(ot202AetnaSicily,(op502CaussolsF,ot105BGTue))))),(op1201GdJonteF,(op702ArezzoI,(op509CaussolsF,(op1228GdJonteF,(op1607CseNoirF,(op816VdAudeF,((op1203GdJonteF,(op1374GdTarnF,op1432VdLotF)),((op1516CseNoirF,(op1334GdTarnF,op407StVallierF)),op404StVallierF))))))))))),(((se_025BGTue,se_021BGTue),((tt109NovosRus,tt_008BGTue),(tt107NovosRus,(us1201cultSENebr,(gi_021BGTue,(tt_014BGTue,(az123AA37692bW,(az112AA37692bW,(gi104ZhejiangBG,(us_903AlterBG,gi_022BGTue)))))))))),(cf_127BGTue,((cf_004BGTue,cf_001BGTue),cf_002BGTue)))),((cm001MorArb,(cm002MorArb,cm004MorArb)),(ga154ShenHubei,(ga122ShenHubei,ga131ShenHubei))))),((((la124Indonesia,(la107Indonesia,la102Indonesia)),la105Indonesia),((py002SeattleArb,py009SeattleArb),(ru_103NEStates,(ru_007BGTue,(ru_025BGTue,((sa_421SENebr,sa_424SENebr),(sa_406SENebr,(sa_109wieri,(sa_105wieri,sa_403SENebr))))))))),((pi108MtMNurs,pi105MtMNurs),((((pt109MunechMat,pt103MuenchMat),(ma102TS16051W,(ma103TS16051W,(ma104TS16051W,ma105TS16051W)))),((mx047MorArb,(mx053MorArb,((mx007MorArb,mx019MorArb),(mx017MorArb,mx001MorArb)))),((gr015BGTue,gr118PRChina),(tf_004MorArb,(tf_003MorArb,(gr128PRChina,(gr007BGTue,(gr001BGTue,gr002BGTue)))))))),((bu326ZhejiangBG,((bu301ZhejiangBG,(bu004BGTue,(bu324ZhejiangBG,bu328ZhejiangBG))),(bu015BGTue,(bu040BGTue,bu045BGTue)))),(ob114Taiwan,(co011ZhejiangBG,(co017ZhejiangBG,(co031ZhejiangBG,ob106Taiwan))))))))))),Di145BGTue,Di106BGTue);

0 comments on commit a749868

Please sign in to comment.