phangorn/0000755000176200001440000000000014156232262012071 5ustar liggesusersphangorn/NAMESPACE0000644000176200001440000001503514155651123013314 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",phyDat) S3method("[",splits) S3method(AICc,pml) S3method(BIC,pml) S3method(addConfidences,multiPhylo) S3method(addConfidences,networx) S3method(addConfidences,phylo) S3method(addConfidences,splits) S3method(anova,pml) S3method(as.AAbin,phyDat) S3method(as.DNAbin,phyDat) S3method(as.Matrix,splits) S3method(as.MultipleAlignment,phyDat) S3method(as.bitsplits,splits) S3method(as.character,phyDat) S3method(as.data.frame,phyDat) S3method(as.matrix,splits) S3method(as.networx,phylo) S3method(as.networx,splits) S3method(as.phyDat,DNAbin) S3method(as.phyDat,MultipleAlignment) S3method(as.phyDat,alignment) S3method(as.phyDat,character) S3method(as.phyDat,data.frame) S3method(as.phyDat,factor) S3method(as.phyDat,matrix) S3method(as.phylo,splits) S3method(as.prop.part,splits) S3method(as.splits,bitsplits) S3method(as.splits,multiPhylo) S3method(as.splits,networx) S3method(as.splits,phylo) S3method(as.splits,prop.part) S3method(c,phyDat) S3method(c,splits) S3method(cbind,phyDat) S3method(cophenetic,networx) S3method(cophenetic,splits) S3method(identify,networx) S3method(image,phyDat) S3method(logLik,pml) S3method(logLik,pmlMix) S3method(logLik,pmlPart) S3method(midpoint,multiPhylo) S3method(midpoint,phylo) S3method(plot,codonTest) S3method(plot,networx) S3method(plot,pml) S3method(plot,pmlCluster) S3method(plot,pmlPart) S3method(print,SOWH) S3method(print,codonTest) S3method(print,phyDat) S3method(print,pml) S3method(print,pmlMix) S3method(print,pmlPart) S3method(print,splits) S3method(print,summary.clanistics) S3method(reorder,networx) S3method(simSeq,phylo) S3method(simSeq,pml) S3method(subset,phyDat) S3method(summary,SOWH) S3method(summary,clanistics) S3method(unique,dist) S3method(unique,phyDat) S3method(unique,splits) S3method(update,pml) S3method(vcov,pml) export(AICc) export(Ancestors) export(CI) export(Children) export(Descendants) export(KF.dist) export(NJ) export(RF.dist) export(RI) export(SH.test) export(SOWH.test) export(SPR.dist) export(Siblings) export(UNJ) export(acctran) export(acgt2ry) export(add.tips) export(addConfidences) export(addTrivialSplits) export(allCircularSplits) export(allCompat) export(allDescendants) export(allSitePattern) export(allSplits) export(allTrees) export(ancestral.pars) export(ancestral.pml) export(as.Matrix) export(as.MultipleAlignment) export(as.networx) export(as.phyDat) export(as.splits) export(bab) export(baseFreq) export(bootstrap.phyDat) export(bootstrap.pml) export(c.phyDat) export(cbind.phyDat) export(cladePar) export(coalSpeciesTree) export(codon2dna) export(codonTest) export(compatible) export(consensusNet) export(coords) export(createLabel) export(delta.score) export(densiTree) export(designSplits) export(designTree) export(dfactorial) export(discrete.gamma) export(dist.hamming) export(dist.logDet) export(dist.ml) export(dist.p) export(distanceHadamard) export(distinct.splits) export(diversity) export(dna2codon) export(edQt) export(fhm) export(fitch) export(genlight2phyDat) export(getClans) export(getClips) export(getDiversity) export(getRoot) export(getSlices) export(h2st) export(h4st) export(hadamard) export(ldfactorial) export(lento) export(lli) export(map_duplicates) export(mast) export(matchSplits) export(maxCladeCred) export(mcc) export(midpoint) export(modelTest) export(mrca.phylo) export(multiphyDat2pmlPart) export(neighborNet) export(nni) export(nnls.networx) export(nnls.phylo) export(nnls.splits) export(nnls.tree) export(optim.parsimony) export(optim.pml) export(pace) export(parsimony) export(path.dist) export(phyDat) export(phyDat2MultipleAlignment) export(phyDat2alignment) export(plotAnc) export(plotBS) export(plotRates) export(plot_gamma_plus_inv) export(pml) export(pml.control) export(pml.fit) export(pml.free) export(pml.init) export(pmlCluster) export(pmlMix) export(pmlPart) export(pmlPart2multiPhylo) export(pmlPen) export(pratchet) export(presenceAbsence) export(pruneTree) export(rNNI) export(rSPR) export(random.addition) export(read.aa) export(read.nexus.dist) export(read.nexus.networx) export(read.nexus.splits) export(read.phyDat) export(readDist) export(removeTrivialSplits) export(removeUndeterminedSites) export(sankoff) export(simSeq) export(splitsNetwork) export(sprdist) export(superTree) export(threshStateC) export(treedist) export(upgma) export(wRF.dist) export(wpgma) export(write.nexus.dist) export(write.nexus.networx) export(write.nexus.splits) export(write.phyDat) export(write.splits) export(writeDist) import(Rcpp) import(ape) import(methods) import(parallel) importFrom(Matrix,Matrix) importFrom(Matrix,crossprod) importFrom(Matrix,solve) importFrom(Matrix,spMatrix) importFrom(Matrix,sparseMatrix) importFrom(fastmatch,fmatch) importFrom(grDevices,adjustcolor) importFrom(grDevices,col2rgb) importFrom(grDevices,hcl.colors) importFrom(grDevices,rgb) importFrom(graphics,abline) importFrom(graphics,axis) importFrom(graphics,barplot) importFrom(graphics,curve) importFrom(graphics,hist) importFrom(graphics,identify) importFrom(graphics,image) importFrom(graphics,legend) importFrom(graphics,locator) importFrom(graphics,matplot) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,plot.default) importFrom(graphics,plot.new) importFrom(graphics,plot.window) importFrom(graphics,points) importFrom(graphics,rug) importFrom(graphics,segments) importFrom(graphics,strwidth) importFrom(graphics,text) importFrom(graphics,title) importFrom(igraph,decompose) importFrom(igraph,graph) importFrom(igraph,graph_from_adjacency_matrix) importFrom(igraph,layout_nicely) importFrom(igraph,shortest_paths) importFrom(igraph,topo_sort) importFrom(igraph,vcount) importFrom(quadprog,solve.QP) importFrom(quadprog,solve.QP.compact) importFrom(stats,AIC) importFrom(stats,BIC) importFrom(stats,aggregate) importFrom(stats,as.dist) importFrom(stats,constrOptim) importFrom(stats,cophenetic) importFrom(stats,dgamma) importFrom(stats,ecdf) importFrom(stats,hclust) importFrom(stats,lm.fit) importFrom(stats,logLik) importFrom(stats,model.matrix) importFrom(stats,na.omit) importFrom(stats,optim) importFrom(stats,optimize) importFrom(stats,pchisq) importFrom(stats,pgamma) importFrom(stats,qbeta) importFrom(stats,qgamma) importFrom(stats,quantile) importFrom(stats,reorder) importFrom(stats,reshape) importFrom(stats,runif) importFrom(stats,sd) importFrom(stats,stepfun) importFrom(stats,update) importFrom(stats,xtabs) importFrom(utils,combn) importFrom(utils,download.file) importFrom(utils,installed.packages) importFrom(utils,packageDescription) importFrom(utils,read.table) importFrom(utils,stack) importFrom(utils,write.table) useDynLib(phangorn, .registration = TRUE) phangorn/README.md0000644000176200001440000000455713764534743013400 0ustar liggesusers[![R-CMD-check](https://github.com/KlausVigo/phangorn/workflows/R-CMD-check/badge.svg)](https://github.com/KlausVigo/phangorn/actions) [![CRAN Status Badge](http://www.r-pkg.org/badges/version/phangorn)](https://cran.r-project.org/package=phangorn) [![CRAN Downloads](http://cranlogs.r-pkg.org/badges/phangorn)](https://cran.r-project.org/package=phangorn) [![Research software impact](http://depsy.org/api/package/cran/phangorn/badge.svg)](http://depsy.org/package/r/phangorn) [![codecov.io](https://codecov.io/github/KlausVigo/phangorn/coverage.svg?branch=master)](https://codecov.io/github/KlausVigo/phangorn?branch=master) [![Coverage Status](https://coveralls.io/repos/github/KlausVigo/phangorn/badge.svg?branch=master)](https://coveralls.io/github/KlausVigo/phangorn?branch=master) # phangorn phangorn is a package for phylogenetic reconstruction and analysis in the R language. phangorn offers the possibility of reconstructing phylogenies with distance based methods, maximum parsimony or maximum likelihood (ML) and performing Hadamard conjugation. Extending the general ML framework, this package provides the possibility of estimating mixture and partition models. Furthermore, phangorn offers several functions for comparing trees, phylogenetic models or splits, simulating character data and performing congruence analyses. You can install - the latest released version `install.packages("phangorn")` - the latest development version `remotes::install_github("KlausVigo/phangorn")` To install the development version you may need to install the Biostrings and seqLogo package from bioconductor first: ``` if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install(c("Biostrings", "seqLogo")) ``` Also the development version usually depends on the latest ape development version and information to download can be found [here](http://ape-package.ird.fr/ape_installation.html). Additionally you may need to install on windows [Rtools](https://cran.r-project.org/bin/windows/Rtools/) and on mac [XCode](https://developer.apple.com/xcode/) and [GFortran](https://gcc.gnu.org/wiki/GFortranBinaries). If you use phangorn please cite: Schliep K.P. 2011. phangorn: phylogenetic analysis in R. Bioinformatics, 27(4) 592-593 License ------- phangorn is licensed under the GPLv2. phangorn/data/0000755000176200001440000000000013707232051012777 5ustar liggesusersphangorn/data/chloroplast.RData0000644000176200001440000005227413707232051016260 0ustar liggesusers7zXZi"6!XT])TW"nRʟX\qjnj-&aN ˺T֠5 _2bg Ҫp3{]²|1xǀf11w ?WԪqQlrprEdb6oÓErz #;ͥиxA{/ju,ox 금zt*ͻ #N,~<M8o1 j)d1KG(}i:hj!%s䉄ZWGF3 bD RY.x G]WoPةt_Ekv_QCRC(HC5QǸ+@ Q'ZCj<[[*ۻ+*lj8^dKW55MKI|9:Lku*+,)RK( J^p44Wܕ= \" OuY+𪅹3ɻs){v:CA&bڅhjezE\FҀ^3L5y^6}ocݾX^ZOmԜ[@[3؂d/v\.לxadch1,<)|4ܲ8<\_icW~8ӻ'ͭ4כ]Rc` X9 GN[70oCz{-zExAks(&G 1*UryXέeΑ0vHC o  rsҰa PvV,b֡DϾxjn5  @=:3-Gk^0'(C++?gOKJVZx?|Iߣ* ՁL80@vG59\&/FBB!3ٶ~d ufWkXʯ8ƘX`i3ckggõT."4Yݢf_R4˦G%+^슧T.EKK"u4s*;d>2]9(cV@]Ub-mRՖ d'ԍMt1ް8%gR}d-D<_f$j8Iͣ=.Gxaxv]{U[ Fչ7\@5+HJi #ԇb`;# 8+7D^oS*!dm@y+:Llk'^ȫːz7_t19+&+~WeQ+i@>h"<14jذe'?"·'d`r*D*d@E!Et鍡9iBӣBbQWb[@Q]Fzm N!. !̮Vky'rjS>-utq6(BA&ΉX|Ի9hFc׺{(FZa aUwAkKƍf!(2'CقZu0~KUʈZ'qG/fJίңL*iUˁsuf7rB((n;>DR!PFeoM Ir/(c9`̷Ō4w4AZmF"P-Y%Ib.ʹqU1vR׳z=Mߑ9OQt_  f a}<G:$G5شJ#x!`LPCϐ? eZBNZ*׻`')]̉I|yT#.W1Oc-P_`2胷UX$-J*9Œ辪'U T\Q+v>x [DoyB +3Nꤘ`l$S>bqt͂." eΡOT|G^Ѭ,$ά=`! 龜^q^XϺj@5SH*Mo,?(34q evY11;8QTcBme+1P^,KQVN)['[4T9;Mџ )ӣ G-IފEJZFw W$/8͟0b=rtǍOvQYTk q}ۂTFa"X(xP85JhY|Tkfi]C_ >.a.Ⱋ~j pL\=cWtdK%j!sQ|V^̸Fi\3Ȇ C6yI]76F4at1.:8կb=$+UօK sC]?bTxʭиįOuo):'oG/"qhKFqEÓC($BA6h;ԅCcPo}eKbI/gѨ? h\b-58U3i)exK qyg(!XI^XGFL抇_Ba;p*j JOLqŞ] ItzsnggꮂZCk(m8EcÏ1<{!Uz/T2^R6-[Lp؛+u:D0CCX+IiPT'A3 c7&wWM E__%Sfǂ@7!3~*̿|ff9/g8n#l?kUJԤ `-s4dhlrIyEk< tih0oc/n8?-USSktU!D/T| WGHmJ=pt^J2Ι^lrK 6R⫐1ERKkکdGyV^ HErsH ^\$) 0o$-ۿlʐd# [ai#ba*}1l6_<ʚǩ+ʑeGfP'_B_`P链"ryH]wm|yLNx`kW4vR?f^s,J%$[7J坩YjB?WkdTo'G̓V(1ԦoFZ&pT?8!Y;++0l0J=AVCDsh$m`m5r^e'%ŝ¿)b'<-jr$R9۩,b@]cta‹1^ /7/\0ۆ(ž#K!|8߬|9FkHabJXE늙. kK•`uC.)H{<;y|vԑj}y|ڭ'9쑎Ң >Dz?>|/;}G.Ouĝb%6<i Z KƍT;g p[JWz\LH X.fzyX;i#)*RXmBXkhq7!04Y L*FX69oPF>DIpm:.]~c' i#gfV բ{᪲]H3Ls@{⏮u WGA6ǻd!xl%Ml׃yXBzm nz>A4RMsd 9v}4d\$g}!TKcS''T2'^2K<0Ökn^`LcWhEo= p%TrN# Kk^.q b{",N "8VgA鏚#4 I_C%"Up-OQD-i*wQ̾`ɀXSce.7b[{{+{ι.BI  MP\1[Vv"H.3QBb[6 e! d!ܦ<:֤zɍ%W(? mh!$8;ր+=| &.|@sH*++ߺ: E;aEuMH@2Dz剓}Y'j=9Ia(pވ='6o3}8SD kx˛Ԣ\S <#H2jەJCR(G>FRkAII$r F!Iq*$\6e|ba3  4$^q%uO:q8p!WQSMu] ;P6NiP2'V1}Zl_ks qRZm$8 @F`BGxZo`-hƫ.!)W脊R+x5WY )j%*~`5c an:+>ls1s(Bh)){tEojلt{{dNmMe>^?B] ?Gd(9we4?nQ I7B^p'$?@37\/G %ؽ0Ҡd8DnzӰ|kD-qCjlW00 TSŇ/&SMZmW5n. iv"H^ŵ?{M!-j U0;؄H 48aӔ-8-^Eh[)W_۩Ji-`MIC}X}9F 7^</gyۧ!jSR0rR`Z5y=qgq:4XM[!< .ӝr"5OBldbRNVx 99LJEO>HW\Qgص!&Ȟ,chB>[.|8K\R@fZ%LpnřtR/5A3aSa 5$^.T5SλƋyqXԺ?f^̶BaM2xok;4 N7S #+9bq5ŗJšAuJ<˒*v&Հ q_nzp'=Ww2?P@xr#zk:&NF6Yf>嵝I#i8&{1h,>SW\G'H@5Fp%Ɠgl!%@I1!Ʌ%;b;zoGj怋,tV2vMHkʑ,(ebQc3;߿fʰ9 g1qP)"nn 293Y@ۑRZ*I1َZbEr(ya!8R5"V5Y]]EpCQ2+R',`:p4J۔0y!i\;Dj&VW;UW~F9׮1k7O"eաqy1,$zPLZ"Pf%aG[uUtH%kuSUB0Wi_jox<_,Ĭ7 VuCSB%]hASd#=VfE !_*W>!NaEUʰV6v I3 \dxPq-ΛRsՋ5BYJ,ь|xו`'z9X7YޣP?U|*@9|50iD ̇]y@ۨqbϬߣ72NeNA̢:ڰ|GÇ Eƨa*(J\^/Ts˰D<tN8?EBNehUՓlC0E*aWcǏ }\&f+*;ry/@{0B6%0M(9nմț'߅6mpcZZ8}(~xWdƺM)deΊpۂ)8e=gxxMO-{;`82:C1X Nk={|WNVK2 _2D">p' YҚ([m[Hi^0n)4ZBU+|9@CCo>񣴢BU1}%LQ`EǁHwQ-lӉ|ek[8C@رrݱa S=Qz$ꏓn׭hhf)(##[7[aH~6FObWXKi& =$5ar8(MUfyPTF1E=#fl{~8 s Lgá-/MNyR[J %I1ܹiF琢 G[֎1<#Y~PZ>x(}ܜ(zƚDhB^IX[:{8,2l-\H`bJ)u?=ixΩYWrCOڧMNQ:.W}4vK~Qas&wxyUKLu+GL9:Ycv/4҂IrזS7+rd\bN!QrcTM"n̼q 4y"fxѿϞw)R6@B8lߴv oG$7EC,y~u[K,+R^JVegFjڌ<6>pjɅPMٚ%QO)dZMSyPoPNϘRs!,`KGq_4vj5O8 *[mP.:B.,Tr A]-^¢?\ !.c_L:۬dh@4O-C5dVEڛ Sp[EJJDtQ$3H +͸;qSOU/W(Bgi&}P)XAL%$ l8<(4J2X61 vNX_yjy 3 nB W @m.d0 $|eHAu%D" , aS؇E 2&H+KĩXȹcӅˍ CIj-pqYsXaz%ٗ~EuBɺ߅yǥw풑N @i|u2GaiGak/Cbx;GShO\l N1a<4ԿXr:/-ShI$75dc]Z;dl/-XzT(G͓C~ӹB՘ 4BV[GXXʈ2nu9Iz51(4n%i,0ͥY?-Z`Np" mjm:Ƶ89.\^˝2c1gzL83E"y4ʊB'>u`TCHD0Ft2Jr>p&xwp'N层4@x©xC!Յjب-!C\MTFI6_Àܺoj[96JSDF{OU{?Hth֟dQ|!P~"g %68T(~@N, }(Iٍf>%AoahTكt5Jn6Ό$yāg!"uCLf["; ^36<@/HJoS@ pPXh78*7ZOUYE,Pz!CLa@_= pzNbv:ZN@f UKu-=~Q 5BtW30.VǢ4OC29,v3 dJDqH!<XyLC.jq:vp$K:/zvZvuUsE/Q5{(# twO GJgSgxFkEM?DڸHGPg.53)fU)}>[o~EuN%]Ÿ^ZtxvWK1E}eFw;BC;>exFk92LW32qW!5Ɍ‽fWo{;;u03:4 bb.ҍ&@-E˱"[xS壏i˫ ɾs(E͂uM;NmqHo"WzUKy3[o >}`5EЍLφ 0=47 %"}fv!.A-;D&8g'<0sI;یUBc8H 7O\B1}yLY]bgogMI:KF6 t}lK{k y"5 u4#)}02ۭm]qBQ ;-2]A{ ]a9U?Z[/.BPRUc|Ι$3+P9tUμ(Kg+V stw;fFl!3S8d|v,Ƈ7LpH xh~WDnss<P"ZBl3XJ˚ .Q7$csȽp״^ܿAuL`p1N;YCJ[iO-c\v|ILu-zf߳JY #47Wnw̭4AFF1:J?j/]?}hFqӟ(9VzS~EZ韬$5 x|9,F˱ްl*@T4XswWc..m~TW狭&PjgF`\X_:g ?a}ܷ ԍW\)o;%zV~Sv+'k񝘿pOEZr38I̹Dۊ$6~s+cl"ifnc>}Fr_2NU#/b{ϧ%!|V>bҩ}k(KByPaMI\dzK_B~:0 |?FsǸ(၌ ZU!zYD^0+XV桀frw!_-}6]mT7Uh6|u/+ROU>}Z9B rg?Q{ݯfkLuTzgYN@kv$O ɵ= 0#Zj܊zf@*! oڹmu#)/@$?~A_e B{y4r"feM{_F!p@Ň}iDb"0&?xo=/%D(<Ӭ+gV.^&SP L'O0jmg`r):>Y$ Wl˸h0q[ŗg4j9EC:b\:{y&{9 AlRRYQAC` Xz!41D?Q-;VI >2d/!2NF_C,4oթ%6`-ob /ռXf M\'2kZǔ e;g)iB # :d⼃Yqsau%kձ)+YNLKZS9&:xeètѩyO§q&m;B!z$VK/xK/+Awgi18(u⚂ +6[7@4|!9խg6xEfvG|M(%;I~'5tlPQ=p[Cf~ ǧt 9aʱn5prqn#gO\UwGgr ^b=qx;" Pd'Wi!Ry}vi(o7.VCԜ-eE(x@#`*EMl(LP]k ^V:W/a?g8r$A-vL&x_g!ڜɳxFlϓ dz*P#=F7 Rg< mS>rNݗQ4K0 #.|Gބ)ɪ/5  v2ɍ`4~bEWˡ[4;LF9lOɼu٘ `ƎN􎸂.g oˠcX3L"X 7Y t AUz,4QyZiT7[F,{ $˧L|M8.)W"?UI .{ο%\VB *(yeu&B9')Sf[|ڶn.wirIU]F- F i<":%4f9TFې1ñG(k|cgtܩHIgKP-&Y˒=t(;*SiC駷4{7st[8U t+[ێ;ᣟɩ=]:{_+_jK[b} q>64?D'Ɲ0k4ӥbw_c2tQ0Zf.&AntQ5<ͧ_9˱!ntOgm;y{vv$V.4vR yaiFVVA[Z!쪝K$NCA D@xp4 Z0^vP**&hG.AhThˢcѹ0? _( *`q}ݺh{2q#Rcr{Qka49} iX聽ʫlAQO6X-;W uHW A)]sfp?c _7>bh+; krMCkeՋxk'gS&hCY|')G5N #79`T/ӯHRT;: tmQS*>:'?W^~U',4moYd'ҍ6D^ސrS;iceR}&.~qr&tkj>x p ek/筠Ȣ:x0 DcR;ɾscjEHF)\j.2Il0#}2Ju*ル{)_7&؋NnkVy/I.a5o^qiBNdiXpI `v E;D$6278$bZDUyӨiTBY!IuYnt˂p=91e{d"N^HK-E8W_(ť_ @\H,-Q4/ȈͤjAt*#IhDfW"Տ*bƕ΋>\;0㖶+27K )#3@ ŽɇkLr+w}yId* S,& y264Gcaybg|uRkR2%컛[mR0K>wn]Du%Zv5u~PEY> ynz5iN.(ByRNP0w#;"gUN wvYĠ6$DPevЪ=z#ɴ |:5=\EߕW;[\6߅yMZ?^F_ˎ}/?TOmC0'9aJuuoBY.̠ph6s_x- k Z !{dQ3MkK]:I[Ĩ$7/! V/D @"IO A$b8zJÝ6ܒy%"fv9Ҿ[w_GUU F zaWM(`~l3;#yOkZ.%űp5B27-\kGlv^Ċ[ÿ,[efW_}b]BJ@v)VG,] aq$I|QT}#՝nŢԕh%mjҝFqo]<,r vR/v{mYtK|ơ/&PXS%_6cy]9m].EDPIt4\bW@ @yEAXurH`):%J`UVM%hqgQ(:hx%xRK{JM*~͜I7q >a[ZO|@̊/R=['WTLUAp^Vʆ rQ pr0\0 C3"ωTVWN;DVslI%J1rX78f ^VR|jByS2d0]4Ў\mޯiOýlЁKӓ(?&ЬR] ~/b >euh0ď=<mX6\U#TOTkl$?Yy1r,LQKթ;z$kR{5zkr…M,)Z+"}!`E)ü,Ĉ,92I19=N6Mv1; we<~5<3hI+b:.);AlM HD6P 2zYg H^8 /~D* |mWEw}͋?дR==vD_fiQ*#{9Rwߨ3\s? q.{ܯG1c>c>+.8Q짋2`Qoj]#A@2h!0oe/otû(`v 7紇W3X~r>3&Uo{HiJ@oNqfzmNL*VPTu읇 SI~rjXPI^$=gQȱ)NeL騶I"҈u|Av/Ko ڟFj8MtN)gRaL@r ufP3!E 2XnAOߨ`"1_dRuXow`ˏ-?!G 5l/"]37߬3J8nlh#<:$&QV )p,)wt>ȵ1#Uc茹 z*X1sR 2"G\;JYhHDyM D*KK5MjmH7\k@mW(,.Ϋ:?ת/T7wזp7:`Ȑ9}m0z2o `Fs Tq'\bgƩVʗ9oʀDZ. Z{g_`4UQPXS,|,=up)d+wژ6 2p9WU~%m|3x= ?8G殐կi)'mP/o]zA Z4pW߂/8O OZ8BIUR%Eޘ?YC5+ߵCR`^j{m׶3#@y7p]>N}PD#zZY[?562lby=zs"2%1%\ 3m4$B0cXEPaYq.[t\bJgjJ!l~l.0~ʅ&zTH.o4I'+ ZA%jt/&9纮R=\S\^jf}3b-"1.M, ukְ|2=Jc-<8|!Ph&;bΝB[f IZgLCU(oiʆ\CEvܰEd@Q Yg<5<Hc4 Lqռ[ݮ-jo @KNp4+H}Ga}`:81S=/ic-<0_wgyeGU* /x֜k^wR/8&pQtʆJuS+N!a݂Y癁d/kwKy$R+G n)v*gܽmorD|?|>r2$0XBtP_SA kiR4N\=Jbл5U:j[z]9L,m¯΅ [A Cwk]z@{v*w[Yε-:׶K/v>z\sqZdհN:\Y~lrjX7.y8U<]Vh[?fO b N(X;q+]uݼyS-WLWVB)kWyf7?}aжvv4'13uikz(5s'di*K29J:W"l<,axJjN?ֹ`]DTy3)FRDej5p@9M5=7O 2&X_TO69l(\Ȭ^zHRN tOXsNXn>MTƩwYb,Rۑ۱Tfw'4w+E1ZȾ $ ghדc2Q%,Z2h-ֳv* .lkR[0KUn WAot^%Sԭtq&dh#]DOC@jŽ'0is9  w}'} [RZ\.tr.3S5J8\g%۲bd(& 'd, !9h;;"Yc;V5=ϏHpЯa&_zwljrZʺ۩4DH&"mFSI7pK\_;f=!J"9AW؉X5f6G,V?0$c쩴m;#SA v>Wo q8B|ٺYQ/ˌ"11 ҧ͗oY3lƧh ]G>׿E+c刲sѨW$̞Hix|kcV^.7)OW8XxS-)pmT:b oAM>6yY\4j0Mwj2#{ˬq5 cl画='?$ KKj =ҋf^wݙKߥKa%@X2(E h8} S}&[3wM!../3;MK1~6@捫$pikW%3VԒbvG6ZRMd-s<"!ՌPr 4ys*d,K0/$YSo\V 8+:{\0e/m99K)ԉY4DFL~H-ړ pL>0 YZphangorn/data/yeast.RData0000644000176200001440000046427413707232051015062 0ustar liggesusers7zXZi"6!X])TW"nRʟX\qjnj-&d k9oP66R Rw yXg!qP_?DSՆX]OB`_dR۹ajvRS O%TJ|qxK Ne6J*M8% Vō1}m :P?6kdFs|pKwFqY}HƧB,>ž(:kPhŖ-7\Z"Ӎ@<Y@HM; 9y"O+qt]I'/T-0U˝('2!+l)p|T凸mP'P|hW|r4n(ʡ\+15v8exgc%-=<^ϑթC_ x=9`MR9~(7b*V(t_~*pc{{?KiuLb1B%#wSzS;*QP{]zVnSs{taSְqO n=S;҉|8ZZo]\زuR6!&HKΎDͯ<(c6vg|MBقrݩvBo;*F7I*؀FP{$ަ_>1-/##(c~2w Hsvš2NI\nbyNz\!Uc!4s5\@L#mkt^\c0exO4oDzvE)< rN拑&4C<=0QeuЊN#;ܾ=ڎSҚo K&s2Sp7|bf/81r_avRRBfdhCC- 7H;1r-G( ӥ Za7mܥVFz[$'f:t-og,̂TYэЃg{ܷ'AwF:M5jk}AY $)uԌ7,-ٵ1PS#@A= p 锎`"ZY[G$}48_} Y@SBy or{?ѕv;bN{ &5汦|eKg N(R. \b2gZ}6-^5705Ҵդ~}< u3aœzbp}j8 ~ccF"#>̌w-oeŁC'OT4'EmGekfS\U_OI:inuĺŰ_uU3tbvRIp}kBQְ nJڵ]>멂2Iӑ~ƞrc a&sy]a/* P|D𙯩)AHuZ:oZa?&eszЄ;c?:*: if$EvUIoԨ;' R@G*֩BJSMӍ4q+n}0ލ:1N8-R F[lZy"hjY/;temd'~+8-DRmz^ :M|:q#1 G IErc4oɰ ϿWFM5K2]9NsC0Vw7 pVUR @"1;-CaKB@X^T|oZq=5Ny+n l2X,E>#j-ͲהpSFLKH6V1{Mek]86XN A]Vdg.*0pr#g'l scH6n%ӳ9j[5/`'Rj,2XG\7Eg&̞k?x 7~*3l~g!Ӎ <àlV(E>0wdk$D,‾G4 [ż;4.4 VYIZo#ZUsH0EǍK翃ˮf1t ߩt6&jl{.$u3r;g諠W>ĸ[4RǺ̷@lq'= 0ủ_Ew;+P,-y-jPwj|X5d\x4n9pNﹸq' Xw jLll kQnw2esEUh\z3jd8( *xjā_a^6#$݉O c;Yp>et%?H{>$|mGm*e_*mDKCq a&J%Ovnl9A,E#9Sł+*\7,X«w' ϶-o}"6.*]G"o "p|"딮jj1ybVLz;GaB,3y9 UUgX~e7l,ZCQi5V4nɛ;>{uD5Z#9-$+zmS=jSC`:Zd־^e%8#U) "EM:S v_! nu~WJz < % ^嬂fy !qvFV8-|n@VcR { /()&Q1Dye$h՞=dΕ\ $}p T{>gm;uWGDp?y" |-_o}EX,>18&&ⲁG%y0R=;7gJO.kbr=BϭSO{Yv}_͊`G>0x{/m}_q4sIW={bR8 1M-[t^ ! .3, RE 4/9kkPraA&8B3J]e"<2V[۪ (ہjZkd~[ '>L3qϏ-HAu[u-bt(TGb ƲDqiM⁴kv*D->ygl}'-H*F |"?3q] b\v(f;Ɂ\~hD?۬ї&C|Gta d.߄0@-w{l( ZY5v>GLNsMR#R)R;Xo|&.k#,%VghjDB 8D ?K nSO²uFr|+_gFۜ,T_fYi } DB2] @ 5q IcJOܿi󣡓,u$Bbtm ~zq{"  .}'SoW˘R h16}'k"k<3l6PaIpKCsmp9?C[U1(w렸~=';KF> {ziጘ[7،:v(N :WL1?d[ ( OwM3Y"K҇1꿖V5AepG(KNRv$do W/*.n5Vln4'U/ Śc <%BC M[/_0RڱUC*z2νo!*%V4ҧXӟ} #*U=DJ»v] 1_gCUT!yH%%fVW[?z.F"nh ]L8NkQz }C~oU]GW^[Ԝ#GF~76(+DٙϪGpLCrG[i}p4䂴PEKp|5!qU)`r! L`\B Bxdkn9w#ա\hͽ'bQZmg5o2+X^@JY iR#"dmY*j]$6mhhu8E&*e 6q2L*ut.nh}KlK$[p(%z58a̤" R胢.Гث7׮]&e^Pe$L=t{6WV JgL RG!se=np>QxpVدo1a/3qN 9V{0(Gw#-ݛ4c8faG[4cAN07 n6,\PM/ppJ֯8讪ɗH0J[3%1),Y c>;r 3AH=6v9#VOvqW-x֭r'k˘nna m4TDVr':S}ɿ3GP740҉FU6RmbYD Bd൉yͳmV!jNStO`5аiOg,Hg< Fǀc":U.EЛ!P)6{:q͈N9`GHJTGx؆Lb͎ĿnGl.ֿ F-ӒK.-uU!5_>:<t5r(d*-ވ] oVXf8sAŊpPPݠ+}_Q+6X_ї3})7 8z!gS*UŅ^*kRpK_{RT^j[ӑ Uf̯H]B=B!al#0Thע? 1JD2}̙ |06V%ecI>虗7 5D(V8O1 bK͜ Ȑ: +3E>FQo2152&])\~#z+JpBI'шYejtZ @1}BPo,Z4:"ЉBE;Z:}JB+ 6p}='C܌l>R#)%$ 0DyCdS[1lcwˣܾdyNDH GvVĉ'Zmb3EYL.n}h@U%4R9jj;|u7gՠI[vx pifx=|KbLZ^μ^u=4:ewfT)=cN?[L>`G<~9KV-~"RJ]yB-HLlYC.Gf/mC-xHOmցwzQDfɯz9ޓ'b 5脧.7 -/D[L4ϗ7Y- ǴTҳ"_;G|Lv]~z}Q E c**ё#I+60Z:K@guvUJΠ%]kNmWI Z\1+QAj (BxªvwȭVdd~ LXeO9 +SJ<4ԏǘUڏR;90kP^ņW4h< _F5XĿoxZݿlBQ!8KwT{='4K_FyYeۏvkRn_?\f#̹JF6`D2YR4|8M-RI<1]xT#XĔDfGUW켿yT]-Ooo0Ble\"AdgsQEr*T6sHtb&IWN߁}΍{]=-ՍT.HX9SNX0͜/tsԯl>]XQ;Ez2FM"$%N!69;ǏN"8ݸ0T3Cm4bebSPSoMࣃBEzR!^0TBSt$|j_$Z`d6.䣺T]. t eh;ew"Ur&NSh#c$j )ʆ wSBA㡜ɽzr ::Y@;OhEX{!g쬲H0j0p9ɫΦ,V&bLO!IX k;uth;L?]T RdgPFA-i{82j'aCF[Gb(7ԀsR &TmVK=鷤󿊱rd |2|Lv8NW$4}#"<cȫVئ\msDw#]b^F/~ƀk+=7P[" X1 7kٽ84ת!akrjS0̪4.I}xDqWUޮm?1oF,4EnL¶h//v5i#AFḻAch8ՠ@|А\ pbg?߽5ǎ, {.I}0ZN 3>{Q(:+ r؝GVn7SȲ3Q#ЮCP9":G,b84rc-踢.Pu1mF:t(s&I<%䫛JH<6}Fe4s*14x*DY/Bf$ڛ +Ed[e9z5CY tqtiv,°!59m p;_Ѳ ikS JD| 'R!6IB"ZoLMe-/̻8\0?}:&wg6Ef 5&(5H7V.+P }= -L -5l1rק@h[\*F\/e8$=aoocw3)ڨnú =e1Sdӹx^xC}ikxU|5C!Wpu*v.o3ԇf :i--RHh'?֌\aeG7^@ -d2$m<3d%$9,>dLS\ï.[iLHEN&fC '2[z+oq:qX^\/Ӛw11 ]绽*:-Tw } YX0Sk?Cz0Ƃ斈V&mUH/8S/-%m' SJsP>)\CZNg[vPtY,ENe []S(ag_𭵊1z씜 QDMKZu^IuM¶(?9*$nK\jQ,Z /P,<޽%{XzePɖ8?ZUX@t6\d:;+qcz%y x_ºک S=vOv@8S:`*lh\(YE#͋OYӗc_Xc h:[]2ɆpjN1R.BMKprɉ形LnFSuArN:|L;iH?P9wtxܷѯ$z eoS]6id;Yn}eԅ/y{ڬa).3jP7/Κ^c#n>𘡍־{/<7Ew>W~H=Z $Cy@春&im*(4"<8LT σ^SR8:nm{!V#?i<6D&a?4K*GʱYFWPy2[* ZMw 2v(9~h:C)huTy(I_ĺ fZhϗVw۹칏K;er%1.Ӊ< Xdy)1ZH`r ʞyŁ>Eiw SBwvX½B^&^sx#xxtg%hݔA'SLh˚Bm-KXBשaȡvAAFriRe1\A&W%Aa Wju =nB}8P c!fqaV YT 8c`4&? 4{x+(S `s;a >!&h~6Ѷg+h%gaXQgm|H rCS&؍SZ1-> L+vO.^$JlsqC7$4uؠW1R%A8 8jsA Kro]Cq#Ԣ-h3QtH\bQBì0yʘoγ>^}eQ4՞o{vAMWwKn)Jׄ2&Utu)iwUooɮ̼F nib˲2 k(6Ʒ/#9U{m<7&yb[a.Ŗۦgdk#"8M(>x樲?W8"T  }C%L&Ւi>8B :i^2}gZHr &֙ᤂEa&Ujy\ve4gWt iE hͤcA,6o%rJ )@?R2'/AiY2fEcJ̓ K2Y"zPN'K#3-=RC1X'Hv/EV`I ;?Ab ;xfP3Y JJ%?2vdS闣_>`\C&RǭzxvCZ~` (U9़T}4wf_͂R߯k Dq WY2ơȱY#ys y}[L|AP6~PuH rBtj6z69s.IJDZ JxIc0g ~M6  (줐ҢqŬiϩ|G:4 d7F|i|ڡHU )ϒFEj\2zߎ-=<bZ]ݳnbQb`!B;1bhucJL+'$P1(S!m/ci0 WÜi`4,Y4!Naf.iMG #XHPh\c [ , mI`O cު{ez:rki=̫k[ %jУd;/|_BxbQSİ [\D(nweqД'<(,[Ѽ)tz#9EtSQzh/2]f ʺPߍHo\"1`8)IToI`bTÿ. MҚ t qgUNY-įf!Cp(To斒ٵûaw*քI %7'.Mkfkys6;Cn%௯!r򽑹ۥl$f awj^|^!dc6ۣ1{V09+r eV8QV4ԼJ*pi֊ FنS%Wsȧ=xi9e;jFVa]WŴdyՇp.G(<߾tA(|4]SKyo!ln\Bd±\OBLVG2*Zk$P:/ż{CZ=&=!͇1'ۙ@7V,^Ks.p.4$5+LR Jԙ,,ʙۯ qi=_N[̰+8Qv[k>|I&*;i #\|3e Vwq}&4>8 _Aݖ_pc UAt,FD?pRiFfSObѽg&ym͵Mj=j7qT,dyfdVR4۠ +(uqVؑIA.X5Quu~bekx0{%;3\I./-53@1=)oBN*Ig`f=dHAu3Tk cMүr2kB1aIg3-Ea1Y+| 5.]&3Ua ;`5ݪzP(2‰j,*h뙳) ܌0"Q]kij`{SmH<8ABl@t8Ml'>$_EVCZj3EMm: .?.V>{\4̢2=yPdz/ 6SEU5<ݹ{q TF3#ZgpQBmQd@8J̷fS'HDt.B8 1 2YӉ2? Y'x#:,xO"= 96]1 _r"h`fX${ T<6Ǐ',߁Hd ֧%%̳ަE%39@ \ [ϞN!JFZ絢W g8A 8.}uUf\k}SNݳzLOASF|ӞW)[֟8gUy\HLOI8N@f: o;>]ޞ1ܜ)[+<ٙx .ᛂoL +7AǙb]Ph vJwV)Ĝ0ccK߶?@i#CUs-H8{<^;n[Y 27MDCMrRiga|#'0vÝW /K+ѡyov-<E"IWRߕj.F!_dH:؈ٕ.zz7a .%m2s (9x!ɔIV䈙C~ %wyAYe aKAMi6Kz|ҕ Pj %y^N JVm،ԓ_Yd?ɷv⋝ ^PA &B!odm^Bn0pIck/PL%nόqV`jBO`iM|STx jv\PE|K$&4$&;jѐ=Z x\Ad=^׍KPlyτIõBwR^R_. p2HHh.Fr2*NJc]WaX~͊*ʼn98Y  ;bJFRONFCwKzL [(Rjp ={31 Xi .eU,DHm W'hY4]kf\xQnVadƽ mʫ X DD[gHd0+$C9z㜯L,+c%U&$q /? 'kE}bȷ`%n^Za5ۧ8 m~t(%+o) &N?4!Ho<.u _WRA *1Y.`)u{O ~]GgwW3d0(--;&WAu[u.Ͳ_2o_K@[35fs?6"yD5r}AxVЅ6Ox\DU2PJU/n{6{MEAY:92~qѡD$pQzƕŋCIn$`+@FT*V_de2{vye|`*0'A۱RBHȘ\/h vw[2rSzDznok4ckl }$60JXINFXT WEQb" lU5ܯ7HSySju 88Xݦ">>ua%4T:ԲS2&S"'8 SrdSU[и q)5mtFUϡ ۠T3W{('3Ks$9F%YebNY<`}uCe îRq{wlxi/> bou|+uq5Шf5}- &TZ{LvtCB~MAJSx=`21K ljGgm;7j}Lkaf{̓]@yJbcɰK   fYv ScN?2iiDc1L݀LJ$4+ VQ [($~ Zքa/2rs2k8] f>_yC[}s̷|i>;>}jqT bNf@St#qy>X#{vL5 f4`c&~?>rtƂԘ?$(Ϥ2}f/[/ YhjA~)|r5.2p֕+͸tn*_"ۤX8}Gɯ->Gc^&A)4ϳG%,Mk"GST7 (iBUߝ˪mL+,ASGٕYGK`<5?7FB;̎Zԇ D6u +2mt Z fCh/~K2Oi@xD{ᕭڡ$}KƷ`;RY"oj--HOȾz96tS$ykwêy&Op@(]yP!K+kNs-.f#5L~# f'࣌8e7;a nd2, ׸Rk31ib)r)EUͽpygiKu JR]+* :Gn>)/狀I^鉓{~"̏}{IĐpOy%#cte=fvyN_XJQ0XAivr6R@ ހr MK,[}}w۴vHڷn}L"=A1o\)W$Lst{bq'<&ચyw^E <ߡ-UB豫P(IC۹{=ߐ'MSK9@K-<ȓpLtLZA-rKdntw(19ۅ.`|~uBqCnk<5-7h _;4}iƭq]si}d2+?= Q'v:ڟqyR.1o%B?_q;58=98%Nzz%r=lUjefupx?6 LIr+=0mH x}(nDC-gRn?6,ꃯx;QݨWn*ǧG2yʟgc^,-+<<KlI!hc%e$k~^放Vfm7V~.N\U#qc{#r!mL.|[v:wsr})a}4(i%Ȍv<8-5d[(FtB(<^(ۂ , D❏^'-܆e> wyzL*sPgaڝIG2 p~ς514a2:oH1#JPP p+gNbnY"G rÓ:]tE$mOɂLd xoQyʀ뢌Z*FT* f䒶 kygȖx%C29z=y?Lcc-+4FwF|~Y粕,nPR+iQuC9̂Q˿pbqC.!̴&ZGdUsԤ PXNomjTYs\42+":'qs}Q"hR새^*h)cO恇-qrbywLYCjE戨 8d̃xo#%=#.qRzwwiƯFX_SʖZգיCPf[-u#e MCN e@HhcحtD5T$췳 fI#9)I7_^!~,Z QDa>x eu0]t3t~@̈́+U26X"_2,!?cUQ( m[ =Y;`%zVBJ{GKNW`Wr;~x.l@`',kk%*u|Q@H!aD;F"# W cF3iK2kgQj3[l g*n^"X2ޗJc 11FEacu90F5Z[?a1/  BFw6dӝNտ93RX%`7FVcRfΏHX(^͕[g%Scכ?zT2auP[=q wzDvȄ2 [Ek+ zl=(f]-x j׻bb֐McQY(흽 sS(Q*3jk'FXĈVԥt1"ג Q)3kM½h=W->2 eƭ0ifcHC`7(X_E}E`5k02UЦѝΘIj@KA[u֗ڌt6vv=~q}R媿hN$p}r8pC; !l?%@|g'᷑[vqW5QoH{ `E$0"LͰk4;"YwD @O)>qҊuv_=V#?b9e@-tfԛhm#MgAUuh[:.z.@զ0緎Dko~[kMY *l4*JE.np 4٨@@M'hS}<|X)t2 y?TݾVwP>`Rߍ2xHf$0*02 fb!EgVϰ!H~_!g@hk';ʢadQz)f#v1H^42jBPbp_Yzt2[~g+Nye[g_' q6@Z4T(r$J-$q/&P;<^[_ y{vA$7:w\fݻ䨪ax/E?ܛUGO/,X|م~}?J.?"_i21_ lLPgF."GZ%lgLTCL%e;ߝ m'D4jN%˘XHߗ& ˓+`YAmWS6IwbԵDYyBxC O/xG6O4VD w~1K:OOO4{^楤oB҃46/h\=Q`lz/4-$6H##,G>CWd53n8NnM:Q+Uؼ:\ݹ2tOÇŚhhcheJ}3y.u?Gjy| /.r`*o^=T ޴~Xyrʸ팕#(YTp f+7N3Oͺ`F @C# Ec~ ۧS[#~a\Lzz hQ~ً-s0fZv/9.d*ȗgMMEzn$ Z*R+P9F<$x33ΰ>6oRwh9ۂ9k|,"W2 r序=PL#Mɻ|*x_U[ pA[5jH}&9>֐ ׮.BD\*ga@=R_XC`P-껋e P2Yn3)@2=st a+.*hlu/r[ y3E|U;i6G2rjǜjnqھwWJ7،BExR_HӚ;Ƀ<((abq&z]8hp4?ݓ]7 6qNPx"!Ux"k "uK.kh imF-Ԍ:|tܮ+r#[::I<ּ~DŽ*$m-+pҬ1#vS+ie@(f#' ݙՋ \ﰞ,< _#>g"?| a@qRPj^c2oxݻaC6Q# E V0,f*m06i+v1/:q2Ķ2&O13$V)6AD=/:`y>#ijoȢ2@qYPe5CʔId0  --&qS('b[mYS)JY݈e! ,S"W#0ⅪAh/?ٛj^qʞNy XvMTƜ `e똏)6j&1P"[-4uvc>;3CeѓTuYaIE 0 xЋ=_b6kI]$TC PdmjAn?434?uxQ$d*;AzC#Qu2>v'vb+`\LJ=j{%=)yj}.[2ގx$)I>zD¶EI>Sܵ2UuLpǓw${F^ 8:>8+$rcT) +c"d] 5iFK}axh^U/v:xd^hvbT GެG*4"Wm3>>n[a}h;{P.a6)AGG1rk!д,LZm~F_2°0^Afږ8ө\MzrD[۞Ҝ5RTf mrZ-1P\߈=F\wRʮf2o <+*a ҅3jd@4+dw^KZ`_$eNT2{m-xG8$r_`vnܟމD~,2b<ئ-0ſVD P*K){hPBDJ3t]4O(TŸvb ;;pdٓdv,^Qͥ 8 H)~l]  ?C8Qh mEQfx˙TbxTa qJG<ǿxhԵ<Av C ژorqIWE_^8!?ނ岝n7Lh<uhm. oaOGr#Ho(Tk9DϗOAlaHb:rN;;2a|(%9 u΋#FPܛ80s#1[! `H[VhC@pC*Q*dr![TX)Xݒ=\eYj_ꍵiY[t?FȒ,Sso0k \dKyyD4p-1Yu\:}![{.>գ&/-CAqh}ڝdL4ft8'̩@y:J8,|JTgTM ؉vtR Su{6nC+>j"p=|{=WNFWY>$~ytZȯwO| joObIst2."t27!q+3xA^a2;y61gUZr*΃`?Ѫ IK$R`Αw? Ю;̛ZZBy٥oZv$sQrė+=PMazEtFtj˝:MַJ%8 \81$ۈnjfh Kh8Ԓ62|5[yZ]p 1CѲސXhB"y\\B6̠ В~ 1\*8RݞAIt痞S_ߣ*ukK g.NRe ~A/c^g@(3.wuWg&m[1C(UgfߙZ̋EF 55sOw TS[5祍5C5L X |h B Xע."4^3k''}&6~EZ*~8 l[rl:/rHqGR4ƥWFcѷ/͞sOXmͩ@4kKMq0лk $<3e/Ux3[RJ堖mcGeħfpG#M!4ڏ1f=Rvm_H~'˖FZm>Mex)EùztQtOе 0u/cKmA+z}#;H,;ݻKQqړeXeFz-Ļ?UY~lHGWMpٽNy(VE)L`_>s;"H_!t^/v.'%A .Tޫ|kS]IM%z4@Fi)H)=XD&QONB/udS-+g>JJ/wEX2gЦVY0Wڟcz͓@p24L>g|U&J;v^!d7~ 9;'?,Ha~F Іa\ցTbከr|!',l} ĭ!~BV罈?y1Bj|akiXa0i+`4y.u_&c<-'p}L+x||( Z-L7"^=ݘsG^'{L2Iz܃d zCvykM'okUt*d.iH9s~U F.ە)M+z8PQHyIϒ"@lT}ꂙOc܄@X襤]}rJ2kdO_oY~]lEu-hw$RjNkbg z<{DL(ޜ+qN}S~[.)ߒ%*"*9ۃ` 倃 ;_oDiKI?@@n;mXkJfܛaw5g)ClP_lrhq {פ _}H!O]^ZS.-4Yl=ǂzٚx^'by2htuq c@k~_s^+A?})<*Dg%}GjSv1x2ΉFt/i6"t"0pVⰵB?@N=GmLKuY4H6iReS.] zb|ϐ+Kz-Hw?B\ CPTGxURs YS6U  aZ[To~ yrȭcFS^-MLFh$Nϧ'Gl˜sM҇w[5AKPQ({hLFgp-ޙ/Hzc۳5lkzw_AȹR}-XUs6^w <4)#Ќ'BWLmT>ZM'D֥VUz!OD U+{s\).Y 7|b@Yՙa]mXBz\# VX,ڒSR(oXFd@~0_r7k[k:3 UfaQngPB8^DRsF3[B"hӇ/V։@sCfLrQ~lpaH)Dy/mB=s&ȍ;R 8zb'^Կ0emݟeFf /u[DJkAJgKA;#HZi80,Uju26Z5ivF2tJȘ{eJ{9*̖~q8&zwu=@T5 v?٢^DuEMz/?Դ "#g)*rZGm7kJ5lL>o~Q .j4p _.Fm t @m\53 Sb/d]W[0yUnPgl"sq!8!Ň>UW92zh5s}}w Hwø5S앓ݻK]Fbs$ߡ2M0aд@ +\"+VZvUn}"ڭa-@?"xb{A<'" ,IWU6+ r 'G36o]!Q~" ",+F+ Sߖc0,3}HeB%Ih_cLH9A?A.%ܑX4CQiKVPY۞'|P5 Xia*E>**1FDT]ڊ,X8 : ~=Ȓ~a;y|a !rf֣&0EnQﲫSu΃dueDpbux4%NfDy(.ɋẃ= fʱs/% D Y!,q_LW(khQ,Qރ݃^~%`Pf ( "fꭈ1CgQ2G*x{8 '&:acD*1= h 81Y~'~ D~_3}/o?A5]뙁\XK[ 7z?lY*+BaV-ptHC^D:fv@D{av ! ٺ ͛ބ=Ys#S㟲НpJZL(oIw[(l[=An%5^QwL䨞Fs"A-v0 <\nbiA+\jgl><ө|vw9mdWZ+H;$WFyE ~Y Y2Ҽ"X݋'T<3Bkpƅ׫ޅ蚚,-AGtF=^Sc^mۻZwhإIDVlJŐ[<`u#y;"MH+)p^=^[je3+3$)~yLR6h{%bo` ZAlV'Ep ~,*Ldj>͙.-hPjeRo}O{<.kŒYF0}bO [^}#@ –3B%$h K#k0gU;|^Sܻ)#˚y[ptR8"y|9ΈA~5!oIyߗ$ߞBb)D&R.RJ.U_bLML _.`k.sƌ(G1ʹ=̩Q2]S%'Dwy %jZAbCbEu+(ɦU\G"0 s.PǸ q^EsI @ MS @䭨w3 HҪd&هkz}kp]H DQ~%|k(x52ZM50f\2;,`ztX:V]CCmQOlr1_&ٿ3jlCHCŝv1lfÀ12NwXqWz@+c x5Vi[5UX=on8 96aGߏE`O3) y,W̶)fdʦ;_s"2X# nvkD696?8sI}Tzxp (!-z*Lq/VKpxBSۤ)&wBHi-3,-9ZZ>~sO"NQVt2KrL?kU_;ߔ1JѓcT(\{ϣV[1_tw%][V" kf=(]tEyG3XY&ZfMm@i%7Iq8 Jg/T(:?@];G1Rbkka)cy =R>jB(&U&F1H\\kKD(H#Gm_@ԦT9=r! xl'M^):,x[r'C4"" rOky[Ћ(K93I޴ojԢiK"&Dg'lѫR޸F۷~yIpQ1˹['Ӈ8,~LK}a+v(EٕXiQnn<'_$zGD,|(K*P3J3 |U'ܣl(%8I[LlcoEüϋM]kDI{ł?? 2;աvqEʧPW2mrཿM ֒Z~rwuIZ}3!I=X32JԃN 9ì $5'42LJAi^ZZ VM[iv}Z> )oU^È.$(Zo:Ud26g%ΚRlƍCzRP,;(4Qdn݌N ipCY 4#|Itߐ*nSohM8Emt7@Ycie!s{O x #QF%۷sM` !7ZW,ZiuB{Yew9I<=TU5R$6hvd~7J楖Go<9̗%66w> s/%zM&;NXt(MA6"2~"9E`lڳQBqx˭{|#h@dtdD[rF>.bbM )50 pVWJ3o V`L{BzEf( >`ЀU'ژb t4 ޭ ܯ`دʗnԯs/R!H:0+j]`*W&ϧr;̱C}FifhO?|O]sf'GU7.;>;F4)=mV!z 󷫆;fpz,Y ~^ i/'֮A2!':'@'+8 aG+ċow3~[]mYtU3TzI$` w]x0|92ua,Z\169KEҌK88` TN󭊵{ p1t{ˆǤB4DDԾ!>_#He}zL%{A`qUU+8Y:KI4!O5P $*=f!t30KIɍܩAƱhC)l%+aN'cH9_4cо ' +ҔȌFyݾ86Ovw)/+) y[ALrĖeM}sDSrͻoN!yWFsJܮp J?An }A/公Z+|As[AW dKݿ6]g`hl ?]GP|NtY~HwvY(ڸpHQJ<Y!Rͷ?\Po.X au1# j#w!wydqm?Lm#4e~Y5? @ɂ]3<p3"NGXR0\duPGJktI"<.aI$:u} OfWahYӹA"ɩ()m`aUR5sL#'\gt8 %Q X^]/Sc bdHc4g$e-]"@8vWJYG|Bg#sעuyXsO;މtύE_åj- ڋ嫅.9|N/3~<#)xglQ… Ff AU=6.ʦ]*"TJ4Sg;`NS,S{&Ƞ{?u osa.c6ǘhIS[K^(ĥu5,Պ 횐=m1cŲ4RptCK<˫3t0Y9yz2:]$*b;jl+3WQTո@6OOD{[j sb!i%eBh,k[K)\|KLgLJ;+B@+R[޷W0.a:W!&*[mY3u_(V,l>3tݕB$Cv,E|SS] )!f|y;M'A'(.ub~N# S||&*$e 1b+^LBc~tc $˖'(y$VװHЏѿks"L%Ě y#6ͱEwfa&V6 ґ'sl 3l'9klH<{Ӯ\xc @sliw`GFg-&:0wV^[[' !(.:ALl y1ig3O',8}ckGRe)> >DZnG({rE"DmY="=xGLr>2icelq%P?ma&PpFua\y.2Gł+[\swKt^@4RF;\.WgvaRռ9-@ĒBD}u:SC yO;U u'޺T̺oUhzhX3Jb=mbev+<Ȉx}@:e),6fAD<--|21[(; gC6E]%?I[4TFhT3,wA#^&nVHO`@B ì=h~Ы3sTl RḲe3p>o:@]yvbRBiQ޷tDy˩s"ԗSdDO$v`56wvSNc79l^enw.ʂQ!\v "͟s[ȔI(!Xx4k/ G/-$Rԟx+eg7O[i,8-O&y׾"nY}_;R 5ô>q: ^꒞zb앻>Im]Hp5!']( j Qaؤ~N?Sn؞zP0esfJ,^O f`ސ0dw!PLJ>M6 1&Tt/h5Ke& RQl5b;D󦺳`6/cu&A6[w9Qۊ^,>fu*ur==:U+҂73C ( s*=£ E^W!moѾNimGj˜>9c0k5\-BEۑ_l<.D k,%CrQ$RuKoƂ鼰 lcy[b*A FGIbÏ 7+ŢBP|Ք =;؈kKjnј=@61훃 >(FVtp@pֽit[L%"'J5(\*iJ0eR#qκ2AO7{\ȎS|њT(sՑUw jB Z"lj{_tJL0DA?#h:UDRd1LQȳ&m Zq';•ױ"xc A{}atܞ5Lhꞇ3u<iVIFQacS' %#'3ŵE]t.R S!kI(=3Jk Wf&QlӖ;6MM/NX,5gLso'g_޾$ A}6@ۯr=FA<)EQcn u B$[D9QmkMBXq{V%C6_wͫy>`,ĩj ' SӸE>Jk&Kn /+I*:vMbWy0=&ֶI;<)7$u4xPA`v&xR4sXz${690iAIjk&5KS}ih?'ϖ5 C,{ 4+~<@}7G$ón.uA Vg=;2\?'S[hCT߼l<7!&WAwcO(fEQ<\x+ij0GYL|h.v+|r*drijEҘ#Ԏ# ŠhR@a.[jkjPt>p8"zщPΑw2m\/cWn-s xU4tzi'ʦ3Lxj+n$uϝ/z -(F#J8^Ew 1_N=U8 ؎?~LQtatKՇI'˰n 5 akJp_N,FO{‘cع I*poStM fj[q舸@y|쮃Th'~7󎥨ӈŴq3|Y݁-GR09 K95zNxyP.81р@5l)8^]RZOb3Mw@p?73wiZ#{pb DB/ Oc*is<#홓 bO a|u_'ԈT,\oحc v; 䝔H4Hy6Nq0Vטeۿ "oNfad{$Ţ!zH=79hW|F}4߃RgHU`MJuU!ϤTNVͫj`ii!o9*4݌Vj-tʷb~5@5C;dì1jk6ԚlJ͂z/vWtKuꗘmQC _ߙ vDM;YOJFٳq9 d{R gѾxq *}#ISnVtw u 8Yp9BÄ>mDD!K>VP4+@` L;CwS(W\))BZ'ӌlQ)--K΃|:cł.A˓f( 94~|yQ#1Rrp&E 6$BCj >@zd.#hSwVľ-WRIݣ6^Z;slΦ`.1W˿}yˀ5dbۘ-K˃v̜_@ɩ+8fJJ)E_rpR@|mV^s տs eĺ?[΅,Lkx,gCE^*UPg㘤¡{f\: v90NQRLLQ"8(\E>WgD9MMJaM]stPtV ]zͱ9 ]Ng܃-u>n5}oZ ,pK @*ؑJ1օKÛo9%}S*Ԡ<ڷs&6HPbV-HX$YCW7RKGDHeT3(F_.sH9v,xJ(0ˌ}~WevQ/T : QgD|s^7I+8:>TC nr:<׿j@.7{d;6: A h,\pa03.ˏī]5F \!6^ѧ[2 "Ylm W&ӧiw o]'=2P="% u3J8ڕ[hܗB'@rةM  !s)fvpW-Af߾5: */O:ăT&\(ɯ{~'F-9@8jm}P(ieYv",`q_ 'Q0IaI㥲EY(L7wʮCIfv0PH}h|c\e%HH Mq X ID9BU; ۔:2Dʡ1^C)*#h .8$sUF:LwBn2O9'7}PpKWJ{.lIY XTяm?@'.(Etqy)K]CbXf@@ީ_g܍Ӂ]{\! ~>!ѷIF _]`޼B$4.k AS!v6Ҡ]%丄!C/V=R:~vl ߼#լ[g :~ kl,F4<~DŽ/V[6)_Ī 9ܜVf'eԹYL%.ߥ.EBipт "Mx:[߀պ15r' +@2[S$W0BؙSPwOWv~ hǩKA}mU 6nyRI\f'mj: ܨVk7Z tHI2 CT|1l8oCAÙs;rqP&>jGl%wX pdl-6OfAl.[wA뫟P ҇us%S#OmeUfG%Cm86IƤSvfz~aj>1Q>)"pp@ħ'^տ;`_vtrcwηZ'zsB9;^oZ^(n $xN. >q:-xG/x >*Ā /<_-x{yhO"H11_N5Ukc# lk F,?o H#vFѠ="8}iMRѷ{X?%N ҉#=1נhR ?@;35; qLb7zE4b̜eO9&o툭@ï<PېղLW!/EE2al/"{yMYE/LH)a(#(XhYppbFvPDh 3@דᎻE~ QvS:Ή)kQ:M۠ [C6QL lT!7~LZ6A~¦"N:]=:+a ,-sW5{MX_hz-W.~nZ@3vާ#i;q˔|[*p=X!]Jj%>.eOTe5Y𡵪 Kb\{83OЎs_.Mm 1֕H|nUGE{/`mRbez"%FvlfGj`0#^F'}] /UTح/bk[2F'cU1q#b+0E6CR"ZLVrd. (Hn>Ͽ,-jtI JCDg@NWңN">c>u62?&fGtyn/Z/WB&w$D}/Ռ&.(s 8@d1g"7g8z7yדEz)TGp>@) ƄJ^ٔCD:O+t9z<籼/V{mb|"1R-q YY;F& fXPo6lW 6U)M;QaDZD~PhCfkse[ ݶ}Ycvk_#QAT|ݣL^7opڣ9ٱf!FAM>H1 T*8tcNQ!٦EMʇNg0L?֜΁  Z}Y:s#OZ@F}/?REsl) ka:?Y|!nqEaOUn_+!ѵ 9Ҽ&ۈv܋rLw5ٔ zgB,@5,xx{ U ,Rv%NMn(Law!4v3\ju/f{JijU" srLNrG ܌ӷf[ZɐoDޒAL|y3-Ӻ;U,<4s"qR̤.6h_R`)eZ,kWƯX`LXYuǂG,hT߉¤c/;mx"z<  8E<&U3MX'axcً\;럟E3]L cTo5a%7|VWuއ{GAYAbd++;T98Ey-Uޏ$4Z%<8Ik`?oHrr=y+n3hB|j^JZi:H yȮzaqנl5q^Z-0A;/*3z e)ʟOxZ@Ogh*k~0*3H?ʙ u:HH9!^hlq>̓f7Qfr{fN+@1LKԞz ٚ,{2;5yK=0aѪGfB`dm-.,W[o5t%of[hkC9p1Og×+I,HD/9@5AC"W'K_9!}?t`K :2sYiNҦ'`&4oAuSq뙊73˲՘;Y$xU(R6!_=dsN7)_8+%Ʊ[EP'#\ә.Q)$7.K>u/(Nmg@2y=t h) 7f4"T!_Ԍ+nnt Їdaa!Ni0Tj>ma+oP$ϴ{*;,[GyUSqGtnfn#vʩJuI xb=龋b#dMm1}ke>R5! (||2c ;H V Ɇez% t={ ;ZSot(4<aG-5qRy٠~_= 53^n1\o42ݡvwo%3}Io%KHnUѯ(CuaO G҆*h}s Qmf<@fފQK ?/'(h$lA̓cv jh,熇fAp3f$YDI 5A־%IČ#ː㨇z_A^M;aT0?<(| Lc+WC.9A9ș7aLH"d-c`q: !Tսx7w=;FWkiotWkZգ #"KK> 0: ٛj<6ЁiD|ȅJ7G\uuD{oVbXcq#1lJSvr4`Ĵ4V~RxZQ>/WA%u,=T"90-{ ȝ (r3rS+(Zp7 D ؼq> %E2;8VY^r/:7;u4 qK/?-Ja0OC>gК.дW!%4%U|b+\b|tx|i^a˻*4 3Ւ-5 4J^'Y"ZBȀ9DjweJ6,&i-6[@!S%i*4, i2nq$r|;e?Q\?6ױ{*m0BpgVs5ߜI`EǻN[pr!p 2\--#e&{TWj!! #1\Hւ;FEkmoBoU@qP V*΂6g; پ~؛zW`%G}& j à.@r ߹\9?iXct29Lq7RU$*EuS/j57UrrRCf4hW.FKÿ0S 7^/0q\͖Xv*Bt ) <ۇA\C;h㯐o܉'U!*ʯRo_b>-:>~dJS`03!|muD$U0;Gi}VNLOpEe]ȁ|]P'>|<&SnĔsX}xXӣHK HT-]5plEVAU(k]Ra:78yILgBKۍfq= 9B\wS!żS1C@>*y|.њﶂZ"kO381FxB+:6-#PufC9~ӡMY];R{T7zM|&˭=!NUnΙy WX baoD%fHF1QχWԦy % :YIԃd<~oy$ojqV#s'[kYwfc} _%#*2HF̝j ߈m(X$@,,$ 'wS]w>iQ!oaj=ɰ΅$[3*k* Wo1[.2(AAglzhr%/no|lat n 6oK4??I,PT>S!iOvG!@ߵeM#{e# L|E5{S$rb eYHlv¤ИY*:G ^ ]YsZS,u{4yHTUP˓n4~@t"HCg &5s:$'[ӗ^uqtyy'80W>0fg2x v` fGלsc79 ]So/7]ޝ"9tH52EOHrm9)vYO 9Rl"_9\}6l>QT2{+|& JcP?HMn;>&tI8ņ!+&s# ޲mhF;Qx6An9;LTLنSƸ'GSb.$Ÿ}],KW?9\ù]:,]Z׈d<|}%.-&kNx7akyYd85gN+)ʭP}x҅0ܕ.w|EyvsdO40gVOf;ST)}P4H ]>z,\]|D`Uٚ{7PXt(p% @z_\L E :H,`d@Ymf%leC)aiH+QVƛw3:蹩<]%t? d7=t)KH:O{NEYۊZdX7G5:`n}_RnB-p'-RkV}yDNo-eb%M: jSXr7D? 5bj %31 GMe4/m L[F/<]0sa!cs\΅:jb jvS'!^L~R*6X{NED?/!WQ8ޏ= -z>>",c݈r-/&rĉd+&$?*BJκ""{#I㿶CVK}kI1Te9(⑤LHˊ9Y\/$IdB.dh|L-cw\>7 _JF)Ǘ|[t׮DJeE"< dDV4 *YUpk9{:][gQX:0%p_+*IPuj?[P ++(ܣjD@c 4qGE YM'^~gjX'8k\IWF+ t<r~kJzrTas\9 VRyYyVDhahkɔ%q(Hvd;M(jn2EY حQ‘nT^:CY~&9Vs$ԣuo_ð~Ω.DZzJ}uw'lD]m5_h# P(s&-UM.hE[ _ /DH55 9y})9#jGh|\3c-Y_~5vU\$I붼IjDT]p ?=>6P;qhFp]th# b>""U%7/ ݉lFfclEz|С;yX D&D2A.ԠkIޢu7=eYs5o=x}tD tb|YZ:p(euzAu&ɔO>ѰpAKwBʲ/,*DoY2,ԸEfA[V%PSpzank^]xȧ e0!;3sxSVȾR5i ӶG4Q E]:ٌ_uΗK.0@Sݐ&\_Nj5t+YDŽZXD.5#^x+:XÎBrt2 B17SUn̯EyDx Sߔ_Iɛ\Oos .=;dO0QxK+Xn8CJ00 wt@["MfݺH\ʍw WR gku15A]ٺ;ɩP'*NٲLZ+lP] .IJ02ٮץځ4A$נI =QEvcw"rǑ[hdQ1m) t&UMb6אvRY=88F?5X-dlϭbDzd7.]H)TBﷂ #pk`]n Oz)vFu˃WSlԖy._FmNް9~x,]{}`&rdc"}ڛ|?ޞqd78d}#ژ"1JEШlE&<_Nv5z_5>o;i!~r"mٴ??:kvp-e(1֡Q++}en {-"qo=fC˅dDH%4Vo%鱲QTz8&q2/*jXlAu'Q[Qkm-mm4 ޜ5$=K(g4N)z ]6j`2^ bjG0-K~'z| DJ7삕b8L1)x.Qo V0,b-yhr((F;Z |kMj?Zrp $ 7$ Si%9dV7] sٸJO"`hZ  ql|jk{1RʥQq=Y'Ej ''_7{P#(6/YUĊ'\vE`ƴ Ģ|(J_dk ƀi3LTKWʾvWSOu1Q>ݶ#>$UA6;;(; w3S; Pg>-'73-y K+K_Pd#HP4PL˯v ?tHS+G x[;00~I{]f]tV͓㡘ܸg*ퟦlع: 3 )S?Y~^$+惑 .^*Zg Kf)Ԣ4f8žβ-]m-u[M^' *R#Hg{%lXԔ2Sfk3U1}sgw ҟӌS9((38%ù\jU5$zIS؈=1K~;oݷT.}xyTE)nDQU,eFNU9b Gz/r ʿԢ1Zן#߭y1: "}ŒVKWäKwh<:k?p{da!9|qOYBPvݷH4K&NMřh8C)Z5z̢Q]j/Aˣ4e,/El[^BS=6~ӂE^@.cw2zc]@uM%'<9)BEMͻ0->ѠI%oP{#b[VޠJQ?r 5i>rRJ?4mk2Fwǥ&xKz&y{Rs8G ZdBel4騱/>V-UrSjθJ&u>ElW(فjR6id4V>LM*#-LTÄZ\~Nah )[ճ?Zbwnb ,MbpgӛZfmB1:39GBp?({b<#i̎6敐 _ 1V*{ٲ;Vq@D5<3R%M#X}r@I9!]$KLڭڙw8Nϣ'LP{@M䀶60Y)/.uN8jnd,oqr]̟v(nf8 halO;JϝstXc6=¬XZ uĪ_p&^FJ>)95~f9=wJjHyKPg*WwV.<'K7`Flm[75O&p=h*0?}d$MٟVCª dD5Ie6Ojڼl0rrLICOH",vuB< Y]02;WV}$: r؞5ق וBˢfh^s t|pe-k /, %/v},y&Ʊٱ.:Rv* G(Ux'mT;Ȼ0&8lHc*/ g:j ~L !N h : ^!U˒4ZߌÓYȡ\2mIQSS5hq34cT^gPi-fo_ĜW ژ0=?W^;kygA7d/=0\@OMo1;qᾕ[UGLs7I}KpSWXmHMݢC!oՎD\P5FaUid(n>"%JV&޸n<Ƈ1 mj/gk,t;C4(;\7chaItU%ol"-x#F)c0!ZByyҞ, uȿS /*&XpQ!,p'YQ8ҿ*{WtKßztU2&4HT%;B|6/UQ'>﹋7۸hU$07}娠*3<\t1ޮ1 IW*wOnD@* 9xzA =jf J!\r+ 5zlҼGPAGV7-#bBMpTNi.ޙfp \+}s%.=-!p06h(J=I1S= ߬F E=6f78 USyliΑwNEjޓg;х)P*LBI*i(Z[,8®pbQܩ爗gZ7]Y<^)o^@0C6?dz!};>2OBMZa@L\DRL  ݂LqIF=?/-s%̥K[i{B"f&k3p)u|_Wmp#pcU<9U{h@lbaK+PEׇAKc|+Đ^¦C,9/؄ӹ- 0h*Z";cm|K5 _`f% ;W$ V YrZ;Db_RXGJYJ-JeC]n)M'9?2k'H^q_y<{bWKfW%8R~KEɅ,Nɫ&>CwHqwE0| +Et9p?7@ֻrr89K/fղgVC1@r/q:t³W'p+ mŔI-X? ǣQgh4@CTxY g&Iy Kn6/u]'&vP8u`,5q˚"ppJ?p|vfUaûf̭[֞\;.{6hzSm$:#diܬȨѬ`P;E9h#uXO˫% $7J*w@4P4qʏPNtT&;Կ2`r| LhƣDadu|ܓ<ԟ}`9zu sҶ!38@Iq@8[b(_|~uӱbVB"V(χ Y|(ZMKCZ>z>.l4r;'HOp:ĝiS@]`iҭoh7Yj1%Pø'TPM%k^jgEh>7=7?ϧ~n\;~ǶJ:ӊ=짿*.@2 R U7VƬ-x_U?Әlwfʗak-9u"OJRIx];QURe={A.Guy4Kqg:S9 7c^_<&h7Uh2^:څwpqit|A5ۃ؅HB@en\]uPowN[ߓ@Evj~o:-nr{ZY:>HӆvLeD&_Z/9 y#J{ Dg XU5IUu3Ś'XDAِX`m [[5sJ;w!K<6)=³6X>Ќs\.+}O> 1Lb]Mv}Z=5ʴufKcz;-iV=i"KB("}gqbk2[)p)?}r:jL&W私e&Cxw]@Q%BbO ÓA6;AZd0C-]MF=تRԡEb3#op!yW.b&=ccDK) WT\lw8]#JJZF }Fi/sHGֿ9}Z--x_S7|ٞtǞ}_Ċ+ Kar[ɽ6 !lrʘ97$*Eꤞpo0+hrCEy ߞi TrNt;F( T~!T&/{~ylrԙ2{' #mq˿Uړ}Zv ^f0Ǟk,@!Ԟlzǖzkl_}IBN|6gd@28"1kq_W{+/Y5]^[fFsnhcᡗ3J{C JԡE#FaT@BҸ?6/Kh7X!bk ”x3}FFH Y#+U_ԪRm9ZR&ʉ{r$:I_Lb>E>pS$Ğ;kyp(cպ ‹Iٗ6gtY^QT0=۱m֢4m;2Y-u,G~NvЗWvBN*h·[P'^ o J eFFїthB*Rƞ;0ܛ9ZiܔS3bD"/a&waʙK׌s|v%(+0N~:Vpc /0ʼKX#VLsBm"Րy&}\ahV,ݭBs *MC,;{7-LJT_bUb Rt"KW(y%!o:IIk?[vsPewb1ԑ(W>Y~ |sOʋ9u6Kh:.>R0P8AvP% i}NrXtx{8Dz951%r^'TB*8GRA(zԓ!<9)EVR ၣ1˯#QT¸o_[Z%S.,[Ia1vyz>!X:MVk/dHFZꨗgZt/#͆18P̪@Cl4N,g$h^J,\KbATlK w' >F-/d 㨚pSQ6Wnj}"7PK3Tj ꪪ{زF%.6<['&jȓ$؏V:`*Jy'XEĤ\29(lM&[8o0 -Š%tP~lSX;^H3OPYiRqٱ9mgCZ(f6DN~kj *RD匆AWF\lHlRMmM:Wm jI0oUG]{y|pnV*i^#ǧGzs(z?Z'7/A}Ĺ_>o% Ab5[XIhPJyuPIf}Hj?X2_:@Dbg N개06i C%'I]:+ϣu(>:YcR;y{H/4}JS5t1m讔R!FмVxAI pkĦ"hk(ʚ׏;sexH0Rn x۶}@VMrKU%j+1;鱐Ǝi o{6%.)~n0p u:V)6bS2lTd’s̒ dW (y (޲BGݏ; Uv޽;WH& #٧944(j}~46*X6S9 /6(;?zJp֌H𻃭'M'}Jt>G{AK-:^7s$eW ĺ^%?!,J>3=g3"4zP;յC٠58ؙ^1Ta:`5+s`$ϯwgW Q=N̪?)۶tҲh09՗ָl>8PO_4I\x`{};G-<8.K 3l*Rk.9IЃp{G_#8L5iF=8b/Tq(4oGl& #b[tb5J~8xNh\ ֍8Gx]z Is+M\VKņOe 0%l{)??k%i( ?LAaǤ;DŽsFwvJVdh]I :n͕v_ l뽺j-1hu V݅LQ1 z5!?aq5JsL*Trc}6 [[ݮT6itr9Bx*u 25yu_\D 2ZeB1#os ʻO&.[|׷ڐxmL]GR-ycEU iS0Ŗf;ٿZd)!`l>g|h5Ebz&YOx7 V(__'Q WP4{Z,q8T'7:[N><یI$F*iG5Ge12-9U39 Gxh6͑7IEdGZZ_}űJ0 mf`êLA2xM#%J4q?ȖɅ62M})! wA ;Z9֗q}xLȹSU"` G0zH)=zwHs# AB/?=T#h:˙pд}Pi?Zq7C.6"Q#sYUB."OL T] 4@%fYikX'X4;sxP0̈́gpz7C ޓF+t.MȖ7GiH[hHY3D= ׆o]gmOlQ|{sqx$fL,Qk.BWsD╋ʵc^\~KYʹJi]?}?L1H&7t)ݮk3+o17s)i24J/T-Ir `c:=hۇqe7t_ʶbxd|*/4 j."Y"Pݵ[h:#D~Uv33b 6'JbG!stzGr5S6bO" b?d%v_u Z6hrK=kIZuJ wOsY" >r)qqf̔ ,'5y.q,D xs~}. ov)@{0uAGτ ne/O`3RpL3KscX>S*xrGPa!ƹ@F^pZ)_v=y׮DWWKqIz,dm#bi7z2>IύjEV?񯽀gYPY%v, 1a; |Zf0BPXEp7c`E&KqNvgCʹn)W׹J9"ysLfHob/&jp.!]$eE"|h@%nxQC *зl3i4MZDc! d!6F98+bj@Oܤjz`վ `Ù+}]L2A>;\e\5. M.?0nRCGz񥈈عA)sA}H|Z@=Y&_uMpźie%Rv-ϒIC2,P)}W,Ii* &2+ fy%W2֛ h-- PY=@tH!BFu3 bKO2cw_mmR ¥M6#@GҞcvp3:9Yý7N3/DzlF ̼^(*pؼ>"0=ю—0)a?Ku1Uwyw&>ΣM*.O}y=i6(֓$ϵ`D hAX0AβbVKFumn%M+.:@ȂHi|2 ؙ]\u=Mu%0Efj+A ާEz?˜:j"Ig~rH K^ZԣϘѣN* xT~823UZ벺Hzb 2HF5A.wk"Ďy˸"&gַ++X"jȱX[F;x F'q2QVޱ[ǩ1 UZ7cj7&'O3 p MB0i"a c8a7GVM37c$Ԝq¥v+%]CkC<$ZXƥT:dcka:\k~rFmK &Koj +*CǽH[0"!kcW,# Oʋ0Xn8Ki.%bs7Ttc,Zӳ_jTH+6y@K TU#xbJsr_G* q-PɪV} ff_F*p[Zv^6m, ^3[,-C*r |n0]78xV+sQK}.8M|WHrHD[{#KH HH5$n*|{ C e-^ܣ50>mxu4{էB"F g2؊/aaCU 0b qЇz~v pR:;*89y'./"JRPTnCD*>dT|ѱ\N l<ȥO Q̓ ;$5瑳sS(TP&sCr|/v e`uocdOR!S0͊Sr&vpl=ӡ" Ldnq$TBA?S ֓] OzN #-h{(M,kt|f|q0O¬5T]gND.~ W*q5]Gz~{% TqA1cSn PQ 2IIBAxV%/yYoSv3xec5|0_p `zJS q0/8(Vutڑ e)4@`A 0i+69~'z5Y"\Te6ERcPAdK`.PťcH 1CP4XM &Xk $O13=?nH]ϹO-=Ԩ2DJU mwMy 7i sEon2X?_7T1&,O![+1jYnp:f(=s/tC?C#e߭}oLdևȶ 9#"0̡+Zkaz7=zP3Гae`rB4*ɢguL(x肃Vnj'o eCufM/Fտc O^B @"zd:y4;'E4&6 mW@* P@: R!=gakJ-t_w5SofC#3ʠkl*h/Gt{d i.f[)c18er7 -Q;? YgRmfLv1+]An$(AXAHcg6OrW@\/wO=I6NDڕndT96AUF),?< vm%BZUK r%; 2JX8$27=dAwvj=d N T»Gf+SzCS{>eݍ>ksmQ i()>l"h ̖-q)(,\Ӎ(^Ӽo־И'ҌUf{u]h;JCo:eφ q>uR1:+Q 1l,b0r9&|14 k2Ǒ>icHOmg2aH5$0ϜqY攅BԺO4بO*O!3Yd[9sI,mP#?YN WcZ6`DX;I]d[.C<+ώ.x/!d`%Vdw;޿2`m$MA)eGqϑ@70(|5ydƺާKEXWg Zh595#Tb}-l||cJ3W6aL8 Ofjb\ ,K{ ϓ7 >:64 &b{y J>v!>QABo@*ZNnh(W)ĉh/T[&`wV ^ֱ ,.m$DKpIE(o20HDopٖ*iF \$[gdPhhܒ: Әc1| RLxbayi'm]o}&@pΦI^I<~U jSV `$>rxJSwLKPAa2N$ewlpFI4zlh2w0tczۤ-F@X{vAr]Gu|gd "LM(s-Jq6TC+1k3e܇6J,QD. h~jUKh} (yذHlL ?z;/CސZ'HMF  SpgsErUE "X]D{zS ɯdu~vzY=L=|pH!R(c{l%K2$R$EX006`tuye%v5[W1w^c*"v5Υ3Xݡ u 8+*.rz&ef3G'O@6Rf XƓ l~V:LiK̼QTGHqաFAQZV"O"zIע;Z;kn?h@,u*'O.>򯅨^glE`6{\ȱvPb[p(g?=qCdrl/62Wk3_\g{Rs XaoI L_^זҩa|uޚ\$ܮCjCp}rbgH8>iW~npI7)3lOZ uᲦLH\~/nbAcT8ɏ~A "ALX`u4Xn%YjAgg6y>2\b<1sEMӄ>FꦆH?_Kd9o_lR5'{CL5~/OGaX ~^ɨ$U 5;g[M-.pޠ[& H(ôIyr9>#ETQD$5cX@زn϶L8? R'GG7"&\ܚJBLi `<08VhrnApc{W^mw/ 2ȝ"vzۭcI 6o";XW5$U\i6+8ֵ6o g>~tM5JqH=l4~_,Z(B&c2!L{U.V@ٺT|}D3OQwx~C`m;3P\]A8a{\~v&BcXhw>։^31D[sX2IEW,i99Ϥ#EA697ŶzM(8)ZCD' V*Zd"YQyϥ'P#ms2CT\XжVvnwwRJY]]Oرu.Pڧ ªuW5#5߸J%~!Œ(/m^Ccx&>;Fkՠak(M9FXNz*eX1hV/l9&ڃě@Ir# ir6~KCXɓ'􇏕)fLٕ!FՑ+KM$_*zՠ҉ fNYdPnvfةyK7îƒZIfː]ȫݸ۠ĕ,?:Ug3vf>A0ۜ^)P 3, د ̵1^s vAe`^|@Ri/tp㪩,oNbhyO'w#,vXTLw.HY_:?{(oqo,Kr+cƢVcFV?%liHSW&i\K 1e rxmVD;[^W$Q4 8F !o(Cₙa9OTO3mUq0m$ XEQ~;q_RIAB&%BQ%tao34Y_:͂3:`6ԣ1FG<^lį/n0$( x3 1~_꓎YR@pRDQ`G'{HL$R+*G1ʙFg1Ô!< $]l8nϲ(ô*زds">&I.8Y&1I!h.icB ޴Obz[*5o4'toO*K)At'ڜ)s@Ib$d"%.5aEe2. vMS7:D\ܨbJ,6F~|mOԙBPL2쾊5[̥lR嚛9pqS DʴWVC:r*f? ۛW"/&]1F yM<  EN K:z]ooWog3t8h{= ;[z\[Έy1\X+ϫ[qP.;8srnSanhh}SOkJ ҤR24tRG"fYvOxzxh<+pۧO;(O,G-mG<5$Y4 9e` : cSG&nK\[~27R{dvQTNogE8JU6[٬Wdkub=#O Sz(&\< }1‹ *eAY~ڡ2yg@6Mu(!h `sNV*ReTSR-:(*ͤsQ*\Њ9)C>Gm(8_|h"w/ҝVG\Jeq4ytl8|$;`XI r"[Nmo}Rs?F͊"_4`zʡ35>4~EJ$}TTDW{ۜx͊D'Zu֮(x\>z6՘bU2\!Hgxh/ Ŷsnj;0& Tw)%Bp 'NSoUvXYۘ4Ikes? &2uh(n2ZgB%btRTLK"Ei~bij>R7흠Apg?H MceLȶ6˽ML QK?iA 9 ("ZϨ#=yFݮp+joCZ9w}yAUU)p .1z8B,_ YRmokE:!}HVgJu Z ~^5PƲTO҅5PԴ>e KSlCJ)s!y:aPtx&<~iݽhw\a_Bm&\@~ޮ$djݾϲyl%\'wI4)ec†"fjL3ɠKb߃_x՞.MY6hizimfANTEh܍-coUs$Reˈ=]+/ȮY BD"x?Sq>RŷTœPl*y[Ș!OWr˝HSǥai#Ky^{-i! AOi*Y\ճ-YP -l,'ط8C78Q/*n!J?$}/n˄M<ԟ9e٣nw1DKG LxRY]8qZ(D%jA:f.=uƭ"[ #UI]|btR&TdM?;fzMgIU{"2H}]+@_)B:yOxWߣsm 튅T=C˒ RFlhDAv^j ^EF"ߛ֘l8v|*tUp̌EEbmG`ߧ xSB%,!{]&rV-.>Bd/ DX5MsZ;[) 8džzNҋ3m˲ ^U9"@.s鐟Jv) kn/a9xSfg2wIyγ|o _~| 3Siv4OKsQ nY)/ajڷV/:!"i [x$g{53r/ JK, ߶t#҇O{jru_;~9?$;)1FE*+T{C B+42LG-Wl#7Yu9\uJ{c85k?s4RUx@5Ok26rbZ8Bn+Zi4T"is" dk3݈R`YgUX=Ȱ!FK'E coI4wcJ 'U" +TH# "}w"@+Cʑޠa;\-yHҽlqj@GJ3 5Ma&SV(3hrhY<Ч;$RTSp)fQ'ht xv=+}?pCÃ@rqDQ|1 !;lS6#@$V=뭷nZ|]` ziq,- ߼! זd8~n'Hi}oWol)(~zkwr ,94`}- 9R2&]\Qo%X1_Dr1'n.(i!VjKyP v t6K-]9LB] ] dS/Oaat /yq'wf}x]JţqI{*rDk@'g?T61q ]:rqXv\ )S原1?T:* 0+023 R 0ƊN3W3o❶Nfy h[*?e>LCǝ<*]ܱBk4eӦ5,2_܈v0ƇU8c\D[%/rDW.W{H*E[k,(>R BAr=ys19l $x.Ll82xQ)y'L!?tASs4__ 20f %T1Xky;^n-k#SK>7Rg$OXg&Z. qc<('U)cb9b ?vj!rzsY(!đL #6U'@x_~WްY"?d¢gdeKQ9 Pes ԱmBV38`~)[7"C#)=kd5I(&0m'G$IH,+r1[@O b > w o>->$%4"IX'mZ YvIsD,| ӒwL8[r/p`- i <("N3?Az7?ÃxKr-W9.itl>Ob+?L3̳=A3ЄʾdC+Q$CTNʊ~>&z-q RSC94F+6~"=PO+I"[j쬀6){siRx8PZԔ/8GQv`7#1SxO=^!/fhQ'27Y~:+P5Nu/V}.4임9fR 6ߟ:AE{y_}L,滫(yzlW ÝȪ6,;g؉|?*0{ib쭆n]f%9B S6zSh6ŊKanW9,"/4N(n1(<DVTœ5(Z;%|8@Ѯ*g"Pa&K*HQS X(`,y%_$FDžD)iqMn2tIJ,QvdQc5`ߡ7y6ZIP7l^PQFSW[@,*rM1!xcWp/,}jT.2egҞD]YWځ}ɒt=/ nFk@N{'@/;-j 6r19cMcEw#vHAID`0F!X(K[ sA4v!'@3Sm̘R1CԾ`u&h6%8Y᧬jǩ`u Հ70I HNբc: JP3d˄G.p{rxiv @;D\W,^W0w)a:&Ri?)fMF448$I(}7\ 7 &O1S:NQG"]ާQY)763K:" h*z`"rK^[v敫=ٻuS TUz;" QGYDcQ։nh̡jR]KD^1i0|)t}ʍ>6K:3L e yɎxB s)VV:Xͫb˜D;,(isrRώ̄2|C,iEbM- =oKmoq`oi1݇T\"E}`kgq41m-ʖxdnSС¼=X4y-?UŮu~8x"'9 Pt(o3쭼m->Jb]~79QgɯNa(0ذ`BqAk|9%~Dܝq{-(2lZ#R)fӍq牶Bžz.'|U.or?X&:DTzZSaIoȦmOb~*Y[we71Tw&Կpz >qOM 8RǂDyX4 m1$`[G#zCw Vnwf׋tB33||D Wdxb&WVY*LLCrHfL qӸ{fXi, : )su{k곦>"l;Ry_{ޘsv/˟DӖN<)eȪ}(U,lv^\sSO >4*҉Xɔ& GE͝ 1Nȯ..3YDkmpvmڽvex : [' \͝\ERCTD{˝ d:E[륕3Q% AKɧڭb68$ùMXҗ_1r{`} ט9=r+Z{H7cl 6sJ0utI dݧ|2ʑGo̺҃Cg5ٟ" Z6<| ؁"lnB*Dd'IJ Mfh)h=dVWwKcN.֯X41?>iJ ULcAR]tyRUw=ڻrp)b-7䃅ys1N)_]Mho?\{kȬa"sÆ)[bC(vwE bS |1Y5o|wn!0]: K8qnk?yǝO!L!h Cr 0Nr*7JG@ ^a,Zvau[ N R.KZ44B0is#NMW`Pn) yΆ[)c[ W1ʞuNmWAjwN F8ɆU?၌Nf9QqڪQUc)V-aZcjI8I{Ѧ.A_Ŭ uuØL3,.r0Tx:;ډb6!̍au*աGF"J@o4~mP [GF;A[UIUJDͼ&V;)sJl & #Zj-sO&  ;hC>i1Qv@{Y%<&Q9̑ێ-ZR[5P;ǃH]Ԫ⠽,ϯl 1n`N.  =OʹuEvC{oqaC+$q#UP3A[*8ܴVm*HZ/ fLđdo Df (xaJEYvcM"E@ĽW_D-Tm2"ưSqY!r) Mj 8nR~3 |Gr Gt\ғՒ-|;aa&_֒-2 j#)7:ȩNq]F^[47Ey^cʎ@\QŭX':wkg-."~Q]R  oMٔ,2A$sp 4JFfvl?#uO@ ]j1N<ᙏ۞6qvw2Jvb#6r5HMҫg>Ux06D{~⟶eWrڦv-6ju2-apthyn4t&CRXg*?Xy.ȉ=1}̼FoE_|-Zd61k[G+rJw4א!$|/Nr`$Le5gӊcdHiRue$+ r~v\$AODDp4_y i}:ZЃsrEδ -p37~QcI7rά-^ͯi\W1N=J0ZJ/.B%c1Gf,6|>PlC7-!ê-3Kߓ\0tx|H@>t0wgE!$~|A> S[Wܭ'eSa3+hU|T#M9yY egy@:k&=YɓmާzU\Hu+:^k1ecCkKeBϚkz2ԴP v[#9~eC\dznM)6a;0 wuX4 !0h"_L&6iEn F X ] p5vǍsO -KrDvd)ܝĽOx kju jUKW%H~ en s|,BdDU0d"r.D q'O)7\[7;NvOnUnK(51fh[@zkI@#ܯ4MB^,AraU84u%sAE~7Р鵞&L1Shĭ(NT셃#Bŵ^bea֒|D2/S}ǁ4|(SBp2 A1HR`'Z4iXّa |q7ZCp.>9c-^,{'6dL@5x7@Md0(C"٤'(՟%˧;>FWaI4S۴6C1EW[s?}* ;QXfQ夼])Bl"K=m]͏'4uZvw}j)i2J|JItwԺFVOPvpm3kqzN_R$Trr1]c-3%!\{L(X7`k-"b:Ί4/Rs\[hAZnSk.eڕ X岷y!_|X(!)*ي!6Uq= ӕQОͥ5LTohYxW 9>j^wz$o`d^XXzN=:0(58).(o6_^_$ii݋}D{ 6у2rKGa4Id3Y\wj|7z3TU"=. /&pt=d?Ɉ3<ke{%VYVv+=z}X>!2/,5>g\Cn^*ugi#܃"KRx"rؔM627e請2\1wh}:@59K,Er*+@eN'[)'-"MM*ȏWFT|rlP9HfT((HY*g O21MZK ~j}_Nؚ\6rVgMUzXZ;y9v۩R?oQP30k$l$jPC+mPk0]\FFIIȶu平Qp?Qi=\!ĕoWI.c`eGbblTdO}VKO2}!` u[/ϴ7\?_uw,Db'&-Վ!.a:A-Jo =X A|YaD}1!᳑BqgB/Z|e mnI3@W45-9/ڕ U ˚0 .‘Rp`ƍpZUX:ңz x((CrmѻY̦η]Z "@0)6GPzPMykwPMN't+AT].Ϥf $uEhXR۬ K](J·"9>Us"(ɺPAY!e6f{1i`z 0pȱ >5$Y+0 A9J_DD G"ݴaw :0ĭ'z莑 ^^s@iCy@\)IЯ`aQLի=G5q|xEP`9%/ )Wt@9s^R6i*yxGb+EC-(ε{`6람YB>EH=#^!%NϕFKg N2Xq]QrJ|$->[ݵP } ![u"uȼ!BMzkrC:Oa8~EFѵ7ikHt_ک<;L@R H"S&/Hh{K4iXU<Ր Qgxk{y3&仭PmoD,٠_DuLKnCL9~V}(Ӊz >sCpD03?weuNp& bEPuD–Y ;O2J{A3͛+7irX?zڝR?Wx|ԣYUX%gxhx_kOl7^Mw:A20MXg`PZK80dpk. aE|d\r(- _h-'=ʓUjHzyq]"X --$ Q8XABjw8#y"ACYkfTvkޱ|G?1N/kг]~<$sJ޾Z:Ŗj.$Mk=q8s '3KHl,LlEw?>:o8S.B^W*{ xĻhE.06ܿ=pý )Rj̭OZd 3ѠӦ*7XSZwĤңmJY^9ʁ(lwf֛Ӛ v1;UsǍ+F 4HFx&=^=0/щ},ijU-yDwr̎FЩH\flU<!q2xA!Px4S;WL"W>Yi,B1K%t~UvP=P?f#Rc7ے|`p(W4&2{0/*vb~۵Sw|XClP^JGͧD&H~$^N ە8JbōʓtSϟ^gRWsl}[D㘘x[MS5E%9rwΊUe01 ߑe{&xB>J {W$dcW~4 X  d1ӫwFkcd"3IIiY:*m9o|VC`p5ᗫPO%ħcٚȫ]h'ʭ]cB&Z|^3BS6Tɝ,Fݠ&D+ѝ&̜K{801t=ԕD;? #H9_2΅+s9*gqQ2\k]q+hM ݏҸg&Pex.o>qx -q}S*)]{%^P5xԿ4C:= j1 %҃r?V)tq;^}jˠiqdecF"Q?6ݳ26|!]IY7$~ɴ"RXo {AE> bv'dRYDZ攛ŰM!(=X#@$ӱL, J~Auk2K#ah)Xm('(N) Qz3pfzT )P p0.ߝ燜OMѲ>h'ӢXRK  filbу1cɐmr8&~6BKU`DT'C8DLj xpXtm|~1g&\cs/JV Xs sPK"D7 ͸!Jc魁`&TWLH W Mܬ A-<5xdDoPxl['5 (o8W s(zKN[t5z`sjZ/'*NFnM7RiYI#=Z,_)tg`ZF]VED#y ʸ)w]%iͪܙ;1!-C?|dyd:YΦkOGx}S` ù Lx 6(p*N$uZčF2›٢nfy$5R7LYgke|_A;a<G?bUt@#I.X:1n##"W|̴Ví0Xi,Xr*N-%#kpz`@|@@wj^C=9f ~C5Ӷop[4F:]+N-W10忍{1 `jKE.uD\1Y1u~tPə09"Ye~E߰9!`S;B]`@hP.Vjh>e #Ro|[tM dtG ios7Aͳ!6 L᫘b; xO:sNMg+|U,K}+czbf@Nȁ JLNZo΄7cmgW@}IlL j'y<1GZKV6~ ,LvZqJ؞83(= H}.uDe2o=oT쬵$vZX:6|-H25X!}6Vu!zD7P Q/Dwy 6 npH؂sef2uzhӾY|"{%s$AǞ̇pq崷G,xFCW @7 QNvOQ]NB1`8TCpE {l!6ǐvFswOR b_0ʹݩ!9&ȁ=tFP& gC^aJ>ؼhey?LS@ ~<d> q 'Ğ/*slҧonn5-Liũd54ǬQΟ'F 2_]B\k*H*ZLjF;pN{pt8]e Y%6LYȈ\!dȯ`fېv~*Pܒ; @trCl3$LU: , N:lcf%bq3 dU=rFj֋QLwؘz>ݟwOtZM TRFa 79*A)4;+V1+&w5sTO% -㉞]- jlV{̕SJ gK6Y99;@rdV*mr &Ql/ ݌;s..Z[8x\lK֌0$ NK'!(Az#%f8]+֘&8Q_״Lcru:?ةEϏ =c@Ptǒc'd po3;PggƹS)>C05 fR=Yr'/+[o6E#kIWr ū L y hw8E㽯bOtY-O(.Z'VO$4q?}dL1-&$]գNӕ×g[4R&1 ,Vڼh=Hғw!w+8/*XեC&Mp/TGWa\<};Qe)XԖSgD3nkl=>ȠHⶊQ[lrw8MJ$8zkHM2{_] 2r5H4akB/r:.)%&] ֨_ E4p`4>Fگ% cI!Fj⺗| `OPO4ÁqrN"9sK(oh<*w[uv6;| 8ybq[ x=b֬XBÝߊMC|zˣ(]?= f\Vvo<9gx{>n̩_aA'DIWߓs9),QgK_@c3l"r 9$[2gf#ϿDrk{Bj}0Qg%s>$Zz+O!k96uPw]ʅ6Ii?>P@N}_̀L] bц/yx1|#ADjB1eN0 ƗXz/,^!z?߄7,fBGγu2-8KzQq)sumiS$o˲ΨF=Z6/ "MES%k:h 2`aKQJ~Wwu6s׉ |W#9v"m5=ZgnlViK%_z2:L5y$a,T!rV'r(+jDP@pbk!傊KT!y{%[g  iL5VySLyϊ7#ʑXdr9$+Hs}ɪU/l)lMDg'Clrbrn&-;;СC,)m1P,/"ہ5 jwSf![䱿$\"Vog}R4LaT)4xPn.XA!rl:9e2WvN A=?)!{: @ϋa[Gk#[wm3Cg9$c,c_TyCF`zTIs6LVBZhJqkJS}YWVuw^t7LuxM%^'ZE#Xvj֙ϛzpXazUZX1L{ .):HeN|xhE .Tڙ~-ַ9'B=WhBƔEGH}YS-/lЇ/ H.U%mU $}@m~Qa ``w f\u+)d kYL9'G%Ov=-bxU٨Nm N% ؗʸYoһw85MH7OOB#_c|QKp2#o9lO)Ib ɦr4NL<3` p5 1r pۥQ'-Zs>S|0oKXΌ,"F(cTRc{ dU}'oKb/b(Itf,ۉ(Zmp]tPM\4>)6t~J7nGFid@MMm0]e&00UȐfjhkX,,ojqQ4Y~*I_F+@S [;#L8&B[x :6Ȳ2'cTN7KJ>3PxS=i2>ٻj{s3̴yoͨ2K ^0qGr~sq𘩪wjx | Kdk' 73|X:n(A+Ȧc5 낋t{ODOT 8q7?#j+aՕkcJvf7 $pj-^9<@')?"H3H~h. k};!t>8dfĢq ƽwN*1 зjO,enJyr/R1!'3W$NoE$ USGa4mPYa qa=5d7g=ZAc ;*pܒ5,qۦOHibk zh!$q$PSFފf L=OJu]/=YJٲ8gi6f.bK6%s`>Z:(.mKm*` n]YD?\mrk-P',YfrV=kP+쇳ZԮ&..G?h >8z^Z,Ֆ)+]7 A}֥Lf&5F`6:4e 㶇(,!K%z< #"gkWO(#@fזuL]*'8CPdz_7 ; ]:53jdf_zE ?Xx=sx6ooq*0qG^4/ Z'zvc'E3TjʺzX{rgֈVf TT/x:W@-x#A4QXI*Q6Ėjy星 VLh)I7 ggv!җdZ 1Gt4؉2tWׅ53訜( 9K>:F=üp4nRHjL&rUPgzNV-N u$.dZMܑmݝ-g87T*$rBڑLڭ}7>b#`am4,YY+E*Sϑ()IW2@ `*I>hS_Qp%`}s xK=L.A' x|FGւ@5 -sE+ٍ̄  s af+AVCD?ж_W~Hd!.o(ڋ&CE~43ua8'ع/FeVRJ;q7t=Btmg&ʜe7JSq5!Uk j~Hu4e ݋Yo `Rۼ͹^H% nH,#`;>;nT_Cbz1i Q(P5qC:TO]|_[؁ -O>Pnw kd(ly/}HA70Z%/ݹΤ'[Ɖ:zTs^ uH\* zu2YKl(*;9 y_,E:Ԟ>^fɤ#:v?6gC>nw Q."!؎2[;ShCAC=|`Zo8c~7Gֺ;I߃K^i;kmd MB&f5qW!r5Kp[hs rCw/MY\9 -don${nAVmoJi~U@lvnq(xt-ްՁ~2ߴywuz%BFԂL$4gh'kD*s\sH8aR^ib$I*{jZ~\/NU pS\]z\9UUگWT/b6D ppk,,Z G̗l5j%b ao^)j&doe,wi -$cO[{(,DT=TFL|A"B1ol CU\zTP }&k鴤|m-G4Cp=*vxe?׆LBҤw+~rb{FclZ~IlNO"G!'d&$7T MsHQ.P$@7MWMX07&[RPy;¿6Y5a$u9کDmh_}"14Noxr BSMl<=VH;+qc;NVL_Xmއw30MRB gkHCoe 0\:~#kXZc%xL55[nxԁ^.|gOt;rPFe3 1^x{(S>qvS}NB o0@a>`dbM"=<eړn9v蛎e?S9=<[N)~mMD T7nm!Qd/#(R{~;^lc.'!ԛ=Yo߻5i8r;($RYsR[WrG;mOv8_Qaʫ!Q`~e5d?n2Gl$[Ip|+;'hleQ61]!)na\0Us"Ll3̵y'J,auqpiZE萌DGªf`-WYCxuKP{ NS+yaLp_,=4QO$qy霅vT  ['Z=[f7ǽ9O>({_Ot <9!bPu71_3⽶Y|H!nWufd"q iSե4V_Uudgi˸YwWUa 0\kFGb4cp_T27ǹܳ. Τqk !Bv/ʉf0}tv82葐9+ŕ~į ֧_nS,xSPnPhޯT(yiZ!򹜔8DB\a .};/h.{0fV4 >S9Ĕi ZUE S X~O͖~pPex稵XڥKk#=@ݟrekY2FR YZԾY/"Ċ[InPt&Hssb:l)sGWiPҴLK5s"62/H>DLΙ{n{S7N- ɀ\P68NOp쬾nFmh{LSÙļOEKdDs6/G9[_Q\ Co۽AA ΍n pijLNF]ܤw9M& 2\[.y*wXf=Rh[Č Nuv1g-~0јG_z %|OE #n71~Ζՙ]d[n&Sftd-EW]שTtNQڻQ ru(W7o$:.Z5UAY`D'8b9 /3_.fBv;4SP_ɿ|F -f U Mzj@զ~C'}Oj>m=r62jglWaNn2#o;Wg H\_3C{uq$'1`XE1;춅WA'2N]QȤvG`s]S5qQ(nqV-gft+DuhLW^E&MJ]s>uc a_uD!jog 'P\R:G?cۥcV,Ng #/ro3۞J_Y~X%d*#xd:Zbk \=:n`b#CIsLLexkWPm z>\Q]k9VԺF]=Nrg=Z fUhEcjDgbI_ :LD-щ}9掛8!2Ă/PݩRjw@`[IC_UaBe|@zU@D""6gMgV<|h&l:s|}X|fYS3wyOF3J{M8Q۞-oFGԣ.[!>4~pİu\˝R N\m";x@ -t|dh`VUvv`TIpP ?h4^VOgMŞ kXo&d9)[g~&6Te'u|7Xuuy~G^ r|+%M ?O#RJ}hΎ7OsBEG۟B7**eKXƃDLG|5}!&J)lNafxңDdr~afO~c-ץNG1Tg).;z^Л[)LSt A=OP~>X5G)P,DH5:xF_ѱwԕ zn1ؽ;9X-V *oLaxB.4^( ܀jn.ۦot"5Ռ *5..]#ML mb:d~*YQI((,A p35./_]as6J#w"Y82۶4M&jfRA"reWU].hDMoQZܫ\;AH9fyWHuvC8$C6>z<6ę\tD~ikL =HqpŌ y}/I2y-E~a!IqMUw3P#D*Ys\*)-Y,3RL4EImA}fd {KZz5ثev@Kbm0aV2[=ҧ;-Q<3tQ|"j4 Qշ lP>4=,kg CV zP!WOQ$),s[ZCe,TP*'iz'`o>}DM5-x^sQOFcI&vLKM:/8yZ<1'Flvy1Y9cYJy#qE&kǟP/E/ɪ!pjdk+p NF9\G;E.1MB)ف PCpy⮘8f?*C+(@ʬ,;PЍ]ey7)*5z1{n1}ۍݾ/3T 6kCvUiۖXhl9] rAr8|,v|љe@y?rν+q+]atMߠ<5;>F1K(QbACE ֆJFBLPE.r+ң#uL-?/Cۗ(t`_uk;B\I?ױgAU3 1͙ D,߾myR:$K,PtC4LA'WBugy[K"/1t1{Zᕫm HӱDB tMc~6z5g{) 5x`VJO0Pv6Ǔ6C`Ԧu%y5IcB%Wn7߽?l;(ͺ%.gkk:RiŴ8SS܃osmp nsrCesгR"WL#Mg197S{¢2-xGȠ_e@[q6GTPqW$I 2 VtuCMU w˔oT-/KVJn0miFO3"dq,7KR 0[߯=NLN{'!"]P$_S.TF&Ƥ ~!C`ḋfyB?ǰq&y D&~lŇ~D?YzWp nvC@&*l _"CpS{81&V(5aPƣdֳ7ae0(;5eh׫eӸm3{,.K9 hq8#3 !I-K{(֑A:rHD :ހ xm?rleJ=ZŴ̰1J._ GY"ciQ| '=U;&7|nβ!{h(7[.ʽfKPˎQ Pp+Sr%!&3k9HZae5&?B2SܸASE˿|5YO@R ]\M$`!e|JN2AX&v煯-!G[:AEG\^liqg$4XվUU_#^:Q;\/C׀,һ=~Nl1g` !h_83 >qRК/m<, EKy9|̘ m*0ڵk1G~z<ߙ0B94a)aOWHwK3o2`afKo56f6w3zxߨ,~'p/Nɰ =j0(k/ւfkg9SSy1;<. _G7{27#C|4U4,tOPJ+H.2ŇGư~nnF U95^`۰Asд@%ӷ8PZ/,Ϸ.ֆL- 9\VdmTj'^C#2R7˰(A^f7f=.ׯ愥;E>6E=\)Ko\6[|4J Жu!>.8Nh,B(6M{2rBV+/: ŭSʟbEh,j(6kjކe{[D|kF c-VԜզz9$©W;ɴl:w\p}9@ @ZTL L+GaeҞ jL(O"]gZ)DZU0Cat !5czE4aj6rڍ밭pw~lt~"u}%m]0fXrmR s# %aTy6SԷS _s\̀T>\CJݳ pka#׵нGߨa U$Se#u]45{myTXǷ%ī+6+"3DX#+K*E8Th rk""5)Me5:㠢OAx^nqP h2.j:MK`fր-Q^nrWŠK%Lɓ~ v"91EC@xlNH8Ҿw=i`|ZQ<0<U?3K"\Gcg$J~BF`SWt^7?RJ74Sd7ꆠa z'nPR5]aX̽z;ՅbT,|%d$c[FHҢb"JtΖRĠx 4UgoQGwX޶%&'Ƙ%ZtnuH)5~fv_?owWZv1$mK}{%!TUF#%YSl,_ayNHrBCYRBՅa4yi" L #yToPw-uE,8hi IP_uNe$C m^ f0,I@ap%0oE_2$6ngiܮFpp&zrf!"_y ?)FuFW؈ЅHiUa=N Ğ'>K"x@ $z~VRT9 WbHA1Fq*#hy%aDLB㦣_,H p GAu p_JYC~cO mԔrD`& M$1}]pj͖vA_:ZUNk73Q m< "LbrCp zR >pn0*nxf>Q+#t9P:"mIAnjQ>[sźFqt-!HMTam!4Nj QIEtnǭGQņ*QQ"~Vg3P|]r;#g)|sHLJ5-\q,&!6~^J<,0vC5k @0B-wYe`?㨑2Ak穟&+V4 aħfYV7/#ݮ%<͑=9WqTfȫN6"1by M_ȷl$hU? |X&g'AhkMy׽2hv",>%.Kw,BPYpl-›I7 &Me3Zǎ^[NF;L\ 2/f7Ąk,ƓމD༿ pqJis;gO-d(")L\νqRv)R0"x8njmQm㈹=X,+h1lyuQ Dק$`'L#0=uGa9,ʧw;vQqoLG'^k=+-ɸV#LÒ]{p,*9?5J)y-wru\}gkmfe+X=E cY%(b1M}u6 8k~YZKg!WZ/DRbpy.8'[Y㒝qC./ =p?ڴ " yvkSu8_t!|\agx]usͥ"OTH3N[ aߗH#)/!Ba>V(?D[A3汎n Bc R|ub 8Vk-Qz=2l+ '8 T\1]ȇ拦NtfmGvM9|+)ے&)xKK[);sh3\ff>D,}ȴh~o&{wu[Pٳt#f:5/%o3e"S9G-^u^Ů@gIQHg/ԪܩZ8LhӜ$^t(l?c9oM4=%eW*  f^YtpCWs`+d_S̛r߃` sWgF<w7s8՝:_뼐`Gve ?1 8E$C_#&OX9yd~?Xz̋ =b" ޤGz<>,Q5>BMPMyN9a2"e m`YTD}p"CFI;:ьi3PF_Qr9*ǯꗽm$?vq+#6~xGB,7mLPȃH}Af/F& 1Sօ]xrfC`6!!\t"98E0P=RH~-$+Xe-[@kO滑3ڝ 1*OdɤyGEQea5gsUe00Dw{B{nnؾ@?󋮑REO5ܥg"^w?BS}qGmdL,Gx4z ?!RŖ/\ގ|2$^j;V4j0;v+R&qߗo?d<}auhh`%U ^B&MKE 3_Xr\B-sKJ\}m*I[#ٯfܫ8AL.~5U#"@PrtN3iAr@=f:T(یҪ\ k{Ye R/c4?Xx];\I$irvAGw$ςLe 1[~T9Cg :vpr/ 'E4啽 0C1C:wy*9GeG~Q2]`ڔzJ-3GWgygDDW^/ T2eU)KTM(V{=pĭٰ YRvpkGUA0634@=Fcvm%?n5v(L,6xf0$|GbE$JChUSPt׈}i.a/( 6sX}cG)ij%*,Dݐ1Ĵĵȣa:vj(gz#ĮXZ3"258«QHShVn-l+TOP%՘8V銾rF#ᙹ+KATcmA^AGo28qӵG~`|zK sU'2%&S"'0 2R4c&b;u ߘ(z V^ʇŅZ44FS}^%"?[Z乧 Hi- r0WVv&눛Cr~OrCa&E>\xf5HΆu6rQ>hG2ѣC_}E>pa{ޗA{%+ e; Z[}rb9׋9l&Ձ@m4~eGK;?8WSk@il [|4f~a0N-B2Xriَhu)V?`;9; 5x㎾1|& o>5feTGrޤf,LJP]~> d CZ8O=y蕏 vY#&qPJAJqDGkΉ,OR@hȊPF^\DO/QhoN8jJM/Beً,퇪MxQozLvoo~I!olؤF1P, %Ss}RsZQaۍV\qcǝеP>\Ϛ?=,'+Y]h")|Ccr4b)I3)'8'C}/k98ĂUA&X_:=Üj4~Лrg*xsZ2oeèi>m #dw_})vsj `$79M }۔Vb#;W^&mpI,'Nj"${bP9ٰ)Ffq (2rTPmjpȌrX`U} -կcBj\S&F/BqdY;;/(&SQr:%a-q[x΋q$ߦmW IVkk M;P:Mˏ]ܮ߸3RM-)Օ4oҾTռuyJl'w͝v1q\-Ao(ڊ5e*tR*B;Cf{rXȄ3\t 3qNj4{U%%P\h>ޚΘ@EdX^/ 瘮Zl8}ojB| kl+?|PYsxČj@a*e}R&ܺx܆ ^g٢dY풶Qm\4 V) Al*C7δ I_w x'3l4n򊨈`a]1ghup3R]-1]7:w~le'I?Ư)mM 9 M2mxe CTpBD^¢0b:V+Jʍ".s}4poC\.i7zJH,-r F$@V =j0;F\Г͓Ku_݈}r1edsHnXPYFxCQGfhqf&8l-Xزcn)fpY*2xXER|zV?';8'p4{|tc65OUa?ZJQeUyO)*+SH;(\tx5#`|+2N3b @ϡm; ^2Æ,N'w*xii.W.Ypn7 J*)htB㝾UCV aWt;u6@Z H ͌rHAETaQ]٠P9ZQUrUTsi69|xdY5#{NƳd'8??1 ʍGadE!~v$?SQ?O7O~{$l<~IJ?GbYO7#VX5&,O 34{' IjѨb7Aj!PJGϺ8{P_ 8.KZ$* DJmY8DS.S8?AofN1Br&i(oaYQHSް4e G8.EZ.[7=hRE^RL(v´B3elyw,,>bRA**O(7&ߕVΉY'ǚ!ؘٞZF:\s,Ҕ+$o+qn,ٺ4 (6_J"Ŷתq@{(3re3JK#z[~hxmS]W:P O//R,%Df*.qZ a"! WOCH43G 7M_6u?rP"zH{T Kmta>>O%IR=H*/,1l8TUq)Z>?EI] N WD!XO%z)^VU\Zb9+No*a2~1'xKqr~H"$PrB/ c"~k"{)3ԕOte#MT,}әߕٗ0ZU/+(ts*_fu,GM`HnȨN[ÉN^ztyMҌ%{кQԷZ${ʯu}gKo;DP[2SR=vл/X'2V ?vhA7_L +fD"dx m&FWeV-m)~ePܞ [\ܜ.hΊGa&l/vTrN%T8)Ц}KЌ54l\j(bA$}x5(J+r_s; B븣RZȎ7J"PRaz~!4 ,)CPóXيd ]6"Z P%T,~N+!ed@Ḳћ"tٍ6O_dE>EzU.rn_][ՐFpG;Mr=LKO>V3Zaw~O7vNm1RZ9grVDUJY!pվEbpKSԈ-T޲9HVRMUI;ok>E1?oH5iafJ= 8vm6bڽ*L}O^I5:nؠna)Sr$^Co]`-L2^x軐e!HX+[2r\;h Pt}Op~h'rnD6zb_M2D 7u黊:tc:}V "6w?Q`!s# NIZX.%܌75 w5 tԢ-R}AKFZ K Y]q4c攗A&Clux<{%5b<-x\ |-`/ab"Ss_ng0?+^. NahCɷܣMX@2<[=S ] H|'sHvjUԠyR T RtpNŐs/\ Ow&9=f˫@IIzCC XGpd*}uVsI;Q7xbpd, ˇCH;j/]3Dq[kerGqL"\m7 ?f`Պ2?Ѷf#7 o͕~W1X*+T/ʤaDuc<`Q=@gaNtMOQ~q5]jm\ۜ,k39:(."i@ "^V҈YJ1xgaƖ5gUG CeA!vq$ĶsD |fDD@$a哢4N{>O#;?cHS-tM xHejGH<2|l"-vK*MpF 7f L3N# `2%$ \ s1I. UNSZ(Q)]Epf0rYSG~~)HpˆJlk EycDEfsQy{Ptk*(e0S5LEFQ69YUn1gSMw$= -=edGsR 1w7Ho?p_P\SzC^j/)Jz1^4yeC0 Ca&Ń|wsa#T0 |LYߓG@\IZX.,Ĩfx_nRV~l6"= w D5AIE$ͧ ^\?U{2de>1[콛)U@ݜ+~?+cPEL_N\>z?JU"'GhҒH(=,`px^筽PH- Jf Bô-zzF/-tfbېQtt畈cyږ0/П~+.WG2 eؚTCZ١r>Rr 0Hp*lPUe`]:F:`nBFzA Ua#>U-׌דz'N^cqGcy ,JpԒ BCa W3*]/_NHA6+lG@Fg?\6 ܑ!&6[ Eq-W[hoM7 X<=f3cM~XuC{ ` UYp\pj -"T$Xp:ERoȫ2T)_g7,!͹Ur_ă40L5Es$KH  $-:/f_!#. !"޳ɱ1Z'Nҥ 0;I[ꮨ'*-taW(el jԈJr.%kXIM %2눧$"xQTO6SM~Plޱ +³#V!e4wCIE*нf ]R0^/q;ד|1ݜAE4TZԚt+ׯh>_vm#Put9(JĚ|7wS"s`uFNe$mq^Q7M;}nkaaeN;ZFqsR"T}(r,ͻG jM3?|tTfI‘DaE/5t { 6SΉMJӧ`ww%&l[l4NY+JخOx|؞uwCa4=&I7B,@Z6QDZ6 ܴG_yNjZʄ>"*tnhen )E_*yQct,fP#CS"Tjl}^e?hT;&F@AE DgѪwG/lj>&@:װSOajÿD869!'n^ȑOxdho@*&^e ٌ 3|5{lo * Oeag@\-ȱ 4W\\@M{^n|]AtvzZ1W]1(둣Pk4*.n(PfWs&oT݃i4uU/;q]w C<הHYL/_{Qevr#Y>Qݦ\ɪ-V3퓲 f /x߶WYS:##|$z,y]hܖ&UKoc?vxncR7ћ( ׃aox-oRxBL 9!\#^YgIDIxpɔ1'ZJ񚇡D9`Q0Ũc{L:%f.!ԥgZN"BTTevE4r]-Ԡ`A;=$ltI(Z/^cnfw!w&$} w`g_ꚷ1ŷbdlҺ<;:޷`ˀD2T^ʨF[`[҅3qam1'WH cuĉgvV.t*p\b xb5qf;0,!|z=^Lcا1,,'n` 3r(%lFl,CQ^*'jz[Z`m&~:vǓ7-AB^zDL>(,,P"I.cށJdh /g.dѬ:~KxZ,/: cGǢb"΃ы w.PoC}]Vc譤Ji@vڵolX_tc6kIa `Oj~mpɒSNBE Y(f)tJٹ&j5B:]5nO>j;pSU 2DX, <٦<ZplK!ܘ 꿴VI\a׳ss@_-B(s!]*@~:-hqt3 [|SOGU R ,a?Z]nx8eSoLZ`oU81O0kH7)w" ,54{P? -lOJXL;T(,M116'꬘hո ] &2Aioo !8ʿlR_98S;pt'e9m{xຑs|7pc Oa9*Gr65sZ++:Ej/&YH7Ҁ`k6"𻂒tsGS sP:UeӶ" u, / >REC5שu{ԫ/k~Yp"!]ZPJO6Pk5N ! YʒH;"@yp̵͸r7νa.ݲ')^_3/l=v9^oy%`ZBef9":McN0 ր q'ԱJz\ f,7j& uRPj2gOF>bzV,@ TEuV2aSNO'f_NT]*[rH"Ij_}r* yur% dOf$nVܺz_%|.LT2$4=8F!!ijq?vDU<lObsd'I[*+3r./lƹFq3r[Ş! cIpfYd\T-[ŀ?:8 9z~bYrF(X |ك={7nh!{ekӜ5_ZALmUgE"j>Bsdy`a/dT ՝SZc# rs7ρ \+~u7p`a_Tcy:{@މl#5K}ORXv<IH~@ʅ_r,`9/: *G?O%}իVgg {}Z~h M ڞ;֖‡]Hp}3>/"7e%_gVq@}YZ_)[Uj iq~鮎@;*B$>)F(5d!>>Bꨗɽz`RZa`oJG8u|L'!se2w5uHڢP9A$h(x<3S>H ^)awY͗Dr Dt*Ik%禆D`JT2K``_Xpʰ) Z6ƧGHw2K$:bkE?>HXےC>kˎw&!ŀj-ˁE!kT Ypl\BAy^~;QsK7~2ꝨHC<|<8b[y dt[RR=jZ0QpwiCmJCyJK|Iw*“E Q脴(7O:Pƫ=[jkm?ݾH}tR6 HS dcB<{oRD# ӈ3nU t;g5Bc\&錧K@guFrRH]‡h|,P\~ok!a+뿍Oq.7!ά&*`EsKm$ 'Ba ah =\ʾR(_QXnՉggJ8 L&wGZV:eʵ':hsFS&KԛaT:5²#J%J6y8珼 m1oQX8[_-(=JHq@Ev([0<O1:(KG^\I^ۻڬL3Pɸ )Ck-4m믌!EhD#1ЫƖu.};vse֘fQܹ/UNqI7vR>8"}zdK3<=T^y7hj;Bd9ʌVPڰu꾂jp=H1,)tW{Et{c]4mB R@ `[VN͏QS+/FvO\9"?T})؁Yh&u+du;lP(4^'VZ#*1aU[7v:=f%ҨpU"&#)7P&ÛlX#U{HǷU F {z2ݳyTzG86{j;g*!)͵$@3 ڴ)JQg n_3 ?ټL}?4%&1_cwYkV'x؟ p25mr@UMkPCTf?NyL\ 6A&:yCi 6KMFC-q3N B\biI;b^[[c2`-`4g:JXZYUCX=,|,7O4JoO)[1r=܎\̺ZWj@##fSu$Fxs28k+ {"d o5]գp; QkDiڌ$ Lm,^L5+R' ȃqEwVĝ5+׭W$QfwL+8@v/#`PYd_嬱e$\Nț8M΀Mx[{tQbe7ȇk9fRzVx9X)F0EXjngROxOЯQu;PIf;&b"ClZWa Ɵd,X%5g8:{1^66CPqԚ#lP4LKͻpHNg<2%2+sFtJ`&`/9$r}1[\MDU: BmriNAR;LHذyj_wNX\~( ]9tdKj]h,uT!MjdcOSey nh߾# Ef2@͵";|ekc\6~bFʗ2 =ʒҼfZx#SU#;7 ]kI$a/@cP@Ē\)շ{3qڈIDc͎FxzF WO6"Kr8~RXD8]9X<3]eK1κ˧H6u$Ǝf'o Gџ(M)8ҠRnkA(6@`eSYdi"}"vw"Clg wm"d].ܠ-Nl2"d# kH,~qǔWw&k>T+Ϫ?iw_;qЩ-aHˎ;+FjۣxȤ;?1D#fE;Y az0{Zb:UX݋n\"feKÎeM{og[),B.@:ڝ`@F9M#H_jfSońBfeh{!aZͅS`ejMP#ǝT<7\jF({[hW)BIohU!|'Ȥ'R#Z0~4uT9 >?B~\ptyãbd Y?3c a޴8c,SBZѠ /$\0&G6l޼• ؁<*XF\7$u'zv[ x›u, 0vM?vti Q7KEUD=X.خI^O|8~<6 i(D ŠڊS0C[n>~WjC/^TOq*u"w׺Sڸ!Ą$lV7#}$|]yzZ5?"ho*;y/v =z#mʔ^h56# @$j"4L#LW4GR$.܅{eM@B`^L~n jR pPs=sP),~o w(? *9);饴S}iMHa-}!hbÞ/SsԨ \1:y~e:9I$95 Tt b[,'\ 'O-e$7ҭkvKx#_'R(po vHb_DWDnnn78OV͎cj>ET_*ǮC?TO2a`?v+BTo0fA7P`tSEhP?¤7 8pn!| BA*z  ̩2J͒PѼ02ヤgdn Mb$lҾjLj\5rA5:!ЭywBBzP: j0N=3IeD5=}"&RlEWl*ޟ ȗ?}z>d4u[ln_0sb6LV훝B1;0pq'vZi+n-!3v||Fd<HlplnT> _o 媳>$~1è0DK/TM8T.w;lմqC7Ņ䕑6?\ LUSRNp!Axqz^YS=BOsk%%6W9jݑjzsfG$P_MDT7U}9BN\ݭo%.P͎Ô~~E|wa(/CA7i< L->C.ݕ.bJE9a\'pI#Ǟ$-HL&o' fIYhÇ^@x3E-*a^Yl8M\_BdI؜'i:\ĻCNt%if}uVoP6VɪL8l1Eqǜc8B3hN)~Z/i!7)-N^NpnY7F ޮ% {_#\e|Yt[w\WzMnACd0DI/ApdHj{aL$[y;BI{Zf0&Ȧɗ&{_jo0lhrV>hDslnߧ+5k9:`ᬃtS#Eg7-SF' tB[`f%_/Ӌ}O7sݷ!?޶7`r =(hmZVY@E.R05%pPeۘ騗ӳb TwÝXVAoc(enwȬ,Il28n=4 d YJiƄfuo Y7!QP,_v鸂LO\!S5GVqȠ% 7''h,lX칋ߺMR+Ӣ/^ӃA3蘩䐉f4"<je  ΣAB)EFh8s(@ A4ܴZWdbwC X $)U=|ԱφGiv=_V1MBXW5!O+oEͿ*x!w{ u,U1yaU5 g{ჷDdw@>x'cԌ s5+.jH~8q{}|hhLTDe{D9%V(ܕDOX,Yzy aEl_U])"Q,pOz}?瞸;e4c2ƸZ{ojM&zŀv*Iu?6ih ޣh+*}y p~nq_ V%Hm r7X[x@qXw5Hha[EM!7u#z5]jO`^*t˟]h7*mke|OߏЀ&Ej֛Jgv癒ҥt'x5mg8a(q0V9졁q!^Т=OW(?YM[ >7}pkn m<5] NGQX82t_@9;?cǕ`LZ9gCeuE2b8c=T^ $ UX]@E){G)eymӀG/j{"/^xVKec1䠗Bdf[KJŌ]8+f} -B0W25: QVFQ/9Ծ|xR8%|dTW@1-E%ӿϩ[;KbMC9Àu|'彯bJF+l" ©Ј7rjf!wg! $om%[t}Q=, U(@ ~T^D{!|pGYAKw]qZ[l{gm`hIK5EuCK08Ti?p _嚶^0қd%|t^q*Bx 3Y`=/+lL֍MW6^YEhXsxTpnckXyR6uxw| 뭗ÁYD'w+.J>(jY TmF nzO9--yYih.ᮘE;Th. qn$&UZQ`7{}񋎼$r'[J :$ŊgW ]“TX DsE!ֿ wd' i-۶)xKr5 y"?svVˢܺ_#cW+9m)Q}["vV׾ `#͜mHt0|10U2d>U*$‘){PabIL=FӺj@]x;.RZȂC_x@ _&Aɻ߆163v<잆`K# 9:֍/&a p~z |o?P~ jͿHX+Bs!0t/4#q''"oֈўK<$aj UC5H,U@ԓ(T}RՙdEޢ}uC""`gt:$D/Y", mHDm|vB븕XFWڍT껃(̃?1:6˓;0̑ 1D#O׽֎ ]CKeձ? `Ā#qDvnO|eҶy=5.H g}Sa㑛f)~2B d␉ݷb_ 9ah0:&5D3RϱsSܴf 0ԃ[h227^w.sSJD9H6t\.s񵹆JɋGE>pgBN{y#Vc$p 2EE5؇hX|8Io`2#S{y*/E ,mߵmie8J;8ՇH w$FaxW_̯ XtRO}zR:`CC/:[S+䃵g} 0!ΫY@na%D3o7TXx±pjfD]X9F=AKя?H3k3^\{5{|W pV Ġy-EZ:9vlr h|#L)o/S}0՞{=dYQ>׺khcVdjS,Tȃ Ɨqʘ}?t5]e!!1i)=T$n{t8;9,0g11uu tGxO' 6>;Lɝ萪dQߩ@C}deHM=񦁆;D74AcJqt@`@?w ΂Ə(l|?\B*"] 6Bq";ujHZfPIJI?Z69+KQ({Ms 3,0ox~YrǷPh 89K{^S.6F^LQ4:W4*S,ywo\2 8>X!Ma 'cl>61#K"[\F* <$VRZd)bJzԥ[e|m3A{2]RW:ADT@6}YŻQFAI/Aۧ sERs;ieJ~䳩VԶ<*>9[,DSX랱T.za6B-69kj"#ؠHpE ^/~U Uu-, pԅ';f80i|2l-~%^?*}j3Fm~=aݫ7/~A?;->PJb+ל8Ŗ6\%q֦8Bϡsz̋A`A!8r^:čcLVqv0R8ULCv@θ7]SP35ΟI̖JIuvIPR_hE܈ypOWu]q e׎ο6РKK1T㮈uxYKK`dC Ude9/^Z0zzJp_/vfGEx1UYa[5 4@ G9aSSFM__j#V+='yqfL<`Y}^ v:r;Jh=*GJfHȴ.W֣&.o G$\kKG.$Z 9}9+f"D1HD-5 .h向!f> >ek%WIaoԋJ,̋8F'E@Ag-ɴPE~a]3Zg,ۼɫa7-N!q3hNy:ɘVX`%#&F˝ j)99ށ.o<|wtkR{4^MM[iiacIkP|qn$9yNٍլk->6A@0}lZ)Zixe7t )>vҸPˊo5pZk('d[B]T(Ƃҷ Yo [UH=vnֈP3K4!~$MK;Ch:dBk|S?{dBsfaׯhs/ 'G9W[̢%q>KCGDH _ibpp!!'gx1#!]&+[dn0f6W3sӶ .Us7*L%w`uNA,? Y1۠wh<Wz(ZYX_2$Hڠ1H|NOݑ:X[Վa5F1+)>2칦jsGQOY3!o9I%k'⌴LwL{qލvc]58*7BX׮qgfIeΨjB9.Wq@1SZN;tn59MkE?ۄ-̒ >ooN85eY*\G96b4R$LGp5b .q79vNi-1$fU)?Wt.hNGףwEC|!9*߶<A'q;  @< mdǝ-t9FM?}:ًP6 bʲJ۬R$/mA H/*iCZg^;fb‚W*kH:9W J}82m:t)B=?OGwܝ~k7mNFi`43+(KW:Au@ϛK["thwS6J*2wXH?S|(20L=Gl_;MV.:rpRFot8nxP ޕkn178b" 7_ ʂV:\9vIqA$SM0rɕY=dLQ&}d(TYavff/}t`\YA0I2-%]"cKMĀ}ZAwv8%dU~~D)f_o1}Gbg<]&0z/$פx=J]4wңOm2呀O ^ ]%x_WzrZch=#6Z>-M}xxcxIС :5IGc_IP(̠'VL{HT7"k݇#M5LZh`ܬF/Ŵ@^d<1?[ KLψfDΘ,Bl{~8µOqܳyNߍh?y zBr{gj)ܮy7+/>,wkGd+)ڡb2GaA3{b?&4j)9XM.K4,s'c$>獿ձ;;c/<`3&L`˭!P]$R$zjYą̯&<`ztpT9u!l c$AtК mT|> Yc>&G7qXNL(Z*ҙTFֈZ۳:2e9qZLD<<ՃD0 dzdH}NH&ȵg@Uϙ>$Eh![7h1= [^^gX`wߚ-Eu9GRX(*MK̻3ս$'A= tb#)OE-?:%&,'g]U-R[%/s /~Z1!+u^ j$?QsOKe0Q,\H58 M?0d9YnQ$ATȃSx0iWhCil`(u q`%;BMF^unyGniڴʻE&qdx$UlΗ3i^V 'Q&Qy-m!XEuJ^ϭޖW.oXh!)r{YI{# G/y6յftW]@O Vjжw&CDfXBX_K l;rӣ}! [)0RYr&x>A Z };.\М<uV^q~B椝Fă_bGPxE w8\AuVT>Lq%z6 ^K\}U hq#"OPG-=vJ# ±[I69 bc2/ė8MS֝"3GL{*] ~ߘ( " `y51}H#+Ybpo/8֐_ɭ#[hma$lF2mvK$I~,E)EqSR% V@+cG͟ʥws94QwCn/vb- z`WȐtF FrsU\:ZVI;.CP mЀUCUF%l*~K9GV(Bs^DAHQ?\UcxBTzsoN'K@ⳊVǰ[WUjöx>@҄U=V?Z m'X`[nx ʎgϑcRF[h` C.orfqHb78NjS6Ő"݊QvU0?p򍹔3&#L }f<\X'1v'|QOӶs L k"e݊ba6. bXʲZjvxet1񖭈OgvGa(BPwdx ؑkH%cxRڡ;k,eo@wotN3 vr)02:= Kmzsڍ=&ޅ"m2rbLîWN7V4Ԍw[,Оg.\OiONd0G2F;mOYNC<@TsT@ں;ÎA4tvFܥHK:rpR48"fB=:/A3|T#J9뱮y8V\2X4b)2wn%:?WקIjm OPh"KOɽ'-Oh;@Oܥ٢kD['ʐh>/mB~סqԓG[od:|$lBU4# }?]`KrqqJF T|xZ)Be*-)S;)G>oWuEJhYE##ʝK2ʑg@=6Ơ%[:IS_& ֡}ͱ]0#Rvxs`~,nIB?z a[tNXXda2^6cN뙬X瀐JEao%L y/|5:V ŏqBQ˧&Ց>O,1Ҩj\v?,ZLG {k]a]">6lHS۾XKc?YZ}i]awi* z<[iq˄ֲrhbիqFP 8q,ͳW`1슚S V͝EhAc u7ZAI*/^G{0^:аJbJ"^Wib 1~7?αFH6t  ۃ^ !kkLvU 2&aM|By?Z-B"08= v?ͪ%!vvCmΕWastu>eX-DЙv@?MrEdmQ*I{->.Qp\t ah&-)clnWש_yYx~V@rM "w#~1.DTyD<z|1'AP&`)jtp/ʸ pI7[]WOs'Ӈ)L5bW,QCK\k롧kuPB=ʴ+V8tfѤk,?r<50jhE6z:\ݖDyhȬ^$&BaKQR v:Byr$̨q~|oS#-et-@6aPԷ1[=Oa/ 3qm Oa@)eT-S<8.dľPc,`vP?UcWC{segӣi~k1|E ӫ2dmڱ>Ѫ8fBRjv|BA-8 M)^RnjRX'uAr^T5t ;ոe%WK)k*/=5qOM RIUge}E#X!ղsQ3 8F1]v&xhkD>Y#6aڈ=>賄0Bf}c1自hT\t|H 6;0%:'x^rZDX`n5^aj5uL{x4vkRGVVuBU;s, M|k(ɹ:T3Û}'雤ڈNN]q~ |uDVh*N+0tN`*$ L7X66%F%ڿ=+Po3-jrX(wKJZun ? ~Ή7̿W.X`;3 c0+LdV1k[63<| c}?Yi_-^Pm( Z\hLC|%$qL"[Uˮ>,G!,p$A.Cbk$Y!EW]2@>G0Wf{:_f e)α \y!qC^Sq3#f~, !.RƱOt+$&ztN /F1^NCb ښ{BnPUq| G4.L xKAz 7e ^Il}r/dcAeHiC>v:}ڔ}jmYLuNȐyʰڤJ51O+'a=EtbP͙C8rDğsГ'l)nU7o#5+Gy!shd ՘ oM x"0iɑH~ ._*F ~mMNjZwk*^KW B1,s<^47 lo ])/* !(JE4%5?iĒ+xS:1F":ff4%n:xwo#TI0-hS ~CrjE;teVӜV"o]oл %Xm~/9 a{dSt&6b,7F}տ'Q1xA JeKczYM8[S ]q<- U[PLlx$wϝ*Qr^0^tS9EzS0 榆dY;-OOU-&0\P_UA_`IrSy Tu&z:S1,tQ%Jìm\FaO rOͫ2VK@`Ul܂`gB%>q56茀3j9\X)Z ĺˆSO2!eܞki/;N IrX{hDĉhJRWؗvh@-*Xh:na!6VT.gY#OOДݢޞ~E]}e Ph~Q^.? NFU>2x[te7Ie}HZօL[ 2(! I+XW%Y/A_ir~ۖ_~04pm_ *ӕ 0766  X ;%x+O}ͼ8aܫX|m!]h5v)/rW3Bup14zDv51X4n7=_ ˸ۚRsoun!">]IGxGQl[ts#ur[C] E[f|VmUVlz'.2Ə"* +hG.1J!ؽ/od~apXTvE){jhق-UWy=֞ atF \ʬ?iͶ1@^>_:UZ{xБ( 4`/ bH0qP}h=ٽP"KG:W `1ll'Z?Ż;d񆆔&mGT_ 82O$r2TψpDrT D rX9vגPTOv`ԥM`J܎\Wڕ"r= W3YlTRgYEL_3$N>=?(bY⼼*e)W ]A!({-@ vrMUoV%x}-bش(4 Du5cxIo-Nݢ& > +Ԓ7)՟wlV߰6J:dJL:[S c8%)O v^T;>|cvIiEř\)Ŵ^;aK[KmzĻU Hqޮ-yM FRkzH[m+`Zg4.Pu1G6DgI#72Tڬ` &嫯 w5G k/%xɆHx$\JwQ%=so>w(Ϡ;᫚go~@Gpj] `Mb7RhH?9mh;|մa ʒmҔs8"~YDV=^7-Frj3FPajEѿ?^EKy]o#QJze?e3|~9 4"M -.ӷЁn?ca͂ TjWL,%?7(JgLz{\s!l:iKݸ-8^4^ş֘a|ң6 Rzl=/l*衅Y}@e!;hOG 15u$*CCe[J?O68n[ؓ(@-לj5hNU$B#AEZy ̝Mș(y\tB*dYy?:ďa&%sdV@\k]*}"5i[S\N"*}VGR/:Ϣ(a;ȔSoڨ|jk/on~[-y7Q㾿iE"#yGlL{}'Ք|;&*C;Mof٬tS,m| Vt$_L%r[ꤤ~[qB&"iS#C* IuXf0]( }g8L.FMqJآnNAXep~*-gf tә5$ vDSi.|ϱX:ߛoFx\ɹSҀ,N5E|&OH!@wɂi,=+%Z.?! ԒoK5B\h1N*_94RQ]hMN[E(EFUB`-c4HVޚ/W;^gzY6ۑ:GSө^{+W</j ;0ʹ GhW%؃ DSy 02E>GvGa]ݬ4ST7? QEtC{t($')l9 ɱ9e-О T%Jfp^AJ5'_гѡ9UKryIjmf"`2,} 0CWA,`dTUt{K:Iz-ăcgڧk'MLI,E\+u TYEXr q -\c16kkTR=MF88SRnl6m#˗/vfH͟ JO &?XYq(,]n+mR,O-Nm A ;U/v^= |1L!a3]ok'[엊` |)%";(oe%m8i8Xmq8Iq<>|X2~zܶ17ybk(2RMCg$vdcU.m99?B[b@PWL.v.*\:ƫڌ*TrX){"^CV"vo`z|EXRcD04u9C+]U/8%"QY޼ԏzA)H$++oсM"w|en锈J -ǡ NX\v=+y `1˰ؿHhU=K;,VD1ApSƚ|?J,+!"C}5ܽ7M;9<>$?.#Tݳu-2Bjg[Nы\ 491|Lz^ǟT >gK}BpG*%X6-S/EI=@'~(63i8wXl~c+- gS7!)%,('&*;hiڋMPc{6 &-*նAh^S &&|ˇ:pR 'jŪ&,7k }5. H}x+ UWs@km:yƭD-ݟ)_5 }>ep#n!VrFi5>#otXp.`I[GKڧϰ.L|olU7U rInѧ+[;YnN(ʦ C^S%ggbka2wVus%Gqa(fatИkհLQ:fe -VO(XcNL*!_ d V.lpP5k}ѵotvB4ss@3Y"kfA(&P*LnMLg7;!ȂISnIGĩ2C6WfaHTz_f^˘uАdlHX Tyb2$Y߽9͒hTH3|]W@К8J+b4_JVTBߐB \l}O\wD3 14pK9t A'zyCˈ'o8Ϙ0qX 撁ID&޸S>8Q:1V&w%8?JA#KEl"VA{F {'T`LgswP TJA jщJ%Y{[0>Po$x97>6ڎ9A-Wi,o5$ߡ=B`'qn 'KDv Mu3~#[bGf>:F>LHА @po*x lFW]YwX9W# , U 27Y!y~KܥrT@))|gN$Q;㓴!#e7lw'\N<^#+>;qKQ{繨._ *̯C Op dr`_8^`)pF:` 3aLB"G  Oz+nt|)uSqd t۽5G0;/r!8p i68%UQ-_f}ލi9> T%y6%ȖHf|%i\Pt=)5J,$R x]s$Gx \06υ}e4e~s|&ւtT"u_ng"nfʒBZiK/1;^!iH{"!VRuC/A:>p,#IZzSluQM4 tqԠRXA=2GD#5:V& Kv_$1>.q^0_;J-uhl 6dgpy"5v>7sۊ:e.Is2W*nvک!rw@rQL@筓u+4Ab.UCrIx) 3x6?}!Uz%Q } !*B>d m;Vrw5ˆу\ftJtJ6KK^LТ p8Wj'W܇T3lRH M`(Pޱ`Am]H ˾e/;sߕdC¨$-`jX*;cOZx 72zZ_ k{;543Y֩ZTrL ;[(JÉ%}mZ7Fi^yh نl}"HĈ&YP{_V׺ zW>lD׆|d4?[*d rB}jaBo D{:N(1O~{8ے*fBu^ͷY?D?^UU;lUFr"5g@-Gi>IJP)鎬8YF4TXmY*Ťo5<$+ggD6 ^߭ !Vb27ܯ +Zb$kDMA ;.1n-)ѣ]3o) &HE=ŝ#Y WwG0 K)b:jGarnO&Ծҵ ߶cv#-tWшZ*,1m4C423KrB]r:bDlIp4xfAy`ܬdwWnW"*y >H2{n`ϣ,QWpuX}M[9T\~D Q>@,L7_&2w(rȹ=6L$(m/p"7~~jKOJإK*g9Œk}5۟VzȤJ $LJړw -c[x:/Pe6Ƙ;?yH*7xQ-\`ڔ>ٵ",OWe4oTI$4R<>/,+GՃ~R6ż}bZ7#huo#nKܒ!g6d+%%TMaXdG?y JJA-sx/ĉz9Ԟ$P?݅|۶hВ]ea}3XeA heUJq4h{+J~ruъ_Rk-;'kW'lpcCS6on_C5bEոe_9xkMHl|F &0r~t{х $-?촐Xј1CY]FT!5j(a sh9x&\X?W:MĶCH!eXHTJ@a]K7v.i\'xkgqm/9^ב΂l KvKO|+0(4J᛹stj]geO#Upf@i9&аu+)8n;OSO`a8+t#8n&}&#k k!1DqhCՀDy?η\)467 }9`xūHA͹C^ MjTJ]OkyD9˄J$mޥ#h}2Ral ˠh1T!J˝fTN S!2JD,=)[Cd=D]P߰];d!$uYƫSkG`1Q(1no#ZbGLJ'j<`xk-C %7p=ОJƬ_,urVrqo( >Cv#DDdܦY50#gGOtqQv0j?&5,E8pi R TQ"p9uĴ?an'X 'q PFA=yA,G O=o,Xkk$dJL`S d,O|Nig-5L>kLӧx1`(d"5;zwz{~Lcp5ZH5h矑`E 0bEPy:fl=)xbM$Zo%?a$%6~Lp_=vi&oG*Y`)O#WP9L$k("z'ijA'D(GE/X-mȊӪ~zGOd;F:a)x /4x\j4sTx +XrƟ&9|.= nK|b>7ijnEX~{͟u:'oµ)hUFj?S%~ay/ǩtpy81xkhEj2o[whn`|xUXZ̿+$̏x-J_l. e kAXKZ+3LVV LrwjOvAMeI!2 26M"Tv.ux:8PhXbN`54Wc`o" 5/[ꓘ`.AR&8Okq=GaĚJhP'O]cMD=xm ~/Ee,I>|넼k>j%m:z9^Z T*w̯b\/urMb„fЃ ˛ɑ.ъ/mtG' k"h7rrF#|[c "l7 \SB NP +kg2gU*I>u^ؽKj[rؚTҫk\}~uO0lx,=Aڅ4:^E'oGPQ ?"4O )u;N=lL,U_r+|z%&pi2QO^dOq(L5c'lB(ޓ/by%,4.D"-h4Вc7Z2%WsJ˼&ߚ!!L)oa"U+67j&DQɠߌCLNGBAK,h?k0 0W#Dȕ>J)3ܥLҍ^ȥV=gU4z.&QK\pXqYRůb0G頾=]^g)1tA3))%uc)!0MF5^ !{8 YmǛu\oƪ SZ#E{礹6+Dg2ӞwҾ;Wn&<_D UWu]~NL 2WxY}M7Vg{F'l  0Xٚ˴UЭxMϔ(j\hIw.dw* kEZ;M"vJ`ur掗ZSޕo"w]@ (rr0H&.&uwI~ eS踫lq)F! 2M[F0$C2TKDw|}o},TLaF p0Uz%A$Ir3nhPտO.׉8l$Lb%ِV2Uv6;ѴƬoA׿3θrbEzRQq&+~ Qƺ ƈaôԋ=%0"uֺ vU/{~+nUEQ_y:erh&>&LՁCZ Oܰ'Ԁ6bWC>[_ Jz. hl%$4u;: __[0Q-nuZn@ncEhFZ/Y0ә*$UH\@?=<}9 FܸhwہY)/F =_ct5;ix_=_MEॱT/0z2cbQמ%{-! 괃<'㵯ҜPwzD;/4u4G(&U;MUZaA,nyZ!ūs'[ACG!2 1vd(oF. +C"̊-U?IA5ߏ-)FTHIp3ΌN~=mƣ4e充r/6iH.I]6P 4_*p}O=U2\޼d2?=lHU'y0_wE a|0AziN^sP9pHBa_JSc C UVsAO^@+垮I 1W\֮O:pE􏂆yOeVy)ֹRl>#I^b7} g-nyܫA|=6.UtB%a|0PV%G lȶctU1UMt {\+ԀM22Lv*r"nMHn `T-Rvg0 Cᓈ_;]R/|O__kfVz~7`О2i?/eMW%G!EL[Iw{AoLew> A0qGk˰q5$qD߄tBG/{hGޡ?iλu'DHDB{HSxr)~F 3ܲTNy8mwf&(TNW w>Iʫe?j(oIlaHA2tuY ՟@?4VT$+6%*Ъw-Oq1 ^K~[~qp^<}; +FhI#\˭HnU۔TPqUZ%=XB(R4=Ͷ2ǜ -aꠏH?Ϟ{F(p߀*-\ %8gS- .dB@ULSqlEzP7>a5Mb@3s)A̠0*P (yh?Q3$<]sž}%H&%Y:92!cάB ǹN[N-츿DSTyfvUhwℭ.CMJ(=۸-~(>ʄC,˿̗e]mN#a; u( &== *mSJ6}%IQ!7h&2!_ķ--|L-m_ b\ ǹCLp?Ti)G"nwMhm}tK"I_A?m͔-&fSOmb;Ib2M0-/ΔѶ+3aɃapD^O/8z0?mwbpm>`x1ޮcȗsEBk+XwDL5)=)8A*eggQieې28qӵ<&1{kmV\ʸ*XαVt  1Ó5h[a|V3چ>CNkΛ.D? ef`J-f`BR `6Rw]#s⎭T}eZLrNYmgkvY2Tk\dY c2ۍ>yeDV#DrG57MC"G84wTR]%cy^P=˞d硘4eҙF:y>բubzj^ДVGjv=5@)o!$2f^.Me0jw+$lBR,r/i~WT7I 1F}Ҁ83 37]N;^цSǴnfWgha>C$XLOu);&za44ÁV`kE'l)j!g09!V@$lN*|o6HgpQ ar^gVW =X.**f/Q?70IݥxnBqB7 b6=WFgބOIn.>}+Ma! FC} k[dY LHzy@pP*NK{KTew:I-(ɹΎ>0^"vģ@Ws f { Oe҇dڜ,}JR͗. Yu:*DvxO\ŝ;8}^lSs3*cC|(}'n]h"dxWXGovSTK x1,2ڣbml)!(,ľTƣ`̔$#EE(-{=~َGXz_5?Q#(`f\ɁIEh\gnj^'y1ԓ~m w3L|tym0Wjg~9RDl7Q0EՍ8b%- K/vF 7@oEgp:Aߵhq J= >Eϫ:ZDMHQh˛{]X)um%耒D"G pL>!]ptD^R<}~3\U@ĒHޯj\.A[z}xTp!69#Rd~]^A}E+H` o իtC.+ HQx&rWR%,=uX  oW?-{vN`QۯtSw/?˩Z} `e>6L pYk^he/=cac׶̇<0zN}}ܐmǞM.t2na6M+n} jUlHno@ljVE^.( 9d(uF7nn&i|t%T$=v;Inys#Rpf#R;ڪw q^ |USB O]i-yP;'.sUR#mxӧ Qb<>0 YZphangorn/data/Laurasiatherian.RData0000644000176200001440000003716413707232051017043 0ustar liggesusers7zXZi"6!X>8])TW"nRʟX\qjnj-&;"֬S[ׂnzKfeNy$_U1[|(i;ҡ 9{ʥ KR1vfv!oXڝ[^#~4D*MT}Oh۳Աnw9y-OoTRxdr{CCex{P‰W3 9N9sDN'ZHIjmܞ:pqASӥNůK:c. Q);'y x`g7tMHkrLF0QLϒBVA/߈D/z~Ad^Pq ИCOx8}B<8[s:HT%s3u:3]E͵e~&6xQ +H]Ԍt~[2П??oZhzLv7ˉ56t ѻ[]Oqd^3۟N*W0Eh&IĂcWtAeی ^ #4``G06komBa ~1^ `?#)z/cΐ?~0)XWbTt˧R3!k@i<of=aRUo?g>Θ` b+r ele=(IfWնN̈́.zDI'@C9yB? BMzA:H> d({_y<د'Hlfߔy/H Yη F%f"͏:qS(+OD@"P0R:":N.n~o09TR@eY;~K9U{Mh[=xH|^غ|9d BZ=|v 摤^"Yp G˘(66y"76k{7J:w|iXݢ7g3Tm$HG*keޗ7qкU0HC OU(k<Q\ ]&GDPNQ^xz՘ ?mǨ(8\/+vUP Pf@CSK|P=^ UM.LVW^peOՕ]v#mDCsB7nnOjc{;B(1#pigHo#xAwX ɹNLk{I/Q?}@E ýn!Kp-ܯ;eM9T"zctCD8 (V|jR,ĵl.Ly ]R~QaU 4VswcEVo+>݁Yz}L:p?l뢸uy 8 ?ѥPh JTL &DUL\_rAZU (URG\P^5m<9U!k/z+( ${_LD;D:l*Z\5֐$@eUl 6E,50UBfCaQ_`sbIRL'FLHǢ~#ϪkڜܑE\ FPx(6EhkaBK&zl|wut7vH%&^i#4msJ'myFm=$U"<ǻ-OTEg֞{EmcpOa#GW[4EF=8WvXU"C") Gq4:0Ay].RUs?~Z37ߞtyio4 q[?9k7z,6`myMa[Dш}Ii{frGA ĆLkZၸg( ]74jWX|F-YoX_t_jG"_*@t AZZI׿T+sw_I I=yKs*eݟ2OATr^{ڲW~E * @h,Vbɷ^uеYvW"}Іύw3A0V*žȯF ! .*{ID HtJKw)FPMX7_4C\bE{+p{[ChĎr "Ky 0ACA- }O fhl ̮^>Q|"rqS %yA$̸/M&As-[M2Y!-$dKb!v׼,e%.hhn~r Eh{뷵dmҾ="5SQfy2A@oWvtϠ]j~m%$p gH /$^Y^ BCE9IgL!(qa,p34ck!n44d9}F92g"6LF498"kdLSAqL,g{nVAl ^GpY@|^e32⫫V=?9Rz 7IqO) Ʈ,؄\ Bτkսp1i:ATQS wIijZ'tq)j`A`.2sFvݔJ?*Q 0"TR8}Acs #E:`שX,Eaa !݅*0LȻ1cjuYS o'vAIɾj7u*NM-%Q1%5*"2dIK~oi.afձɫKn8ƍGL=l@;:a$ؼF.3C6k˺}I@!7,$Pս"FAWbxz攒4ɐ%8;iT7;V? &7bb q4ܬfmdg^sIDCx!읹`S@YtmKg-u2mS 6Kwv;>,ZrdE2މG\.Ȇ\̇•X簔6F.zٕk`uY):O!Dҟ5\ F_J` g3xVZW󥅅>0ڢ?na2 ^|j>+ަ"o]D$Ul U^Vn?![ʚʤFˣט6,EőN?&щf?} s KZ;8VZmo1k㎋ѣ  1ֱ&)#wxnpNwi"Ɖ]>.j0I4旙O<-#om2^G-k ank4=NXȇK[7Re;,٧w.lݎ[ž.M7c]:+9e^8QN`b_0ʶ _/XU֝f .LKtC9,Wo]N[.rE/y ޮ2L;Uvrye#(ɚ MWφC{E7fZí8T/*-MT:`Y̮#CL:=J^X(J4W[9]e4ŏb3%R'g&W 'T pdY* |@USQ9_4$-*󖩤jהRyѓoyiڏG$J!wk,]IMbsj}W&[#~Q|o[K-S8:KG*"UizqAk%P {M8o*:'uNeDPLOr`4&_=AApXJLt@y.-PUUW9dTa1B!} {׭_4"1 H ڝ6uh{ m| EN ih$='lKDY:m~B/K12 ]BB?GY35eZWTU${QڄRqaoy]`hopZ.mv֌W`@;M ":mD>:)N<M1*j]l_CL%5!cI! -ɷdfvm O $ٺ"YU 'U/oHo\vXYXUS)|tU :"̪ b4g!;<+n2jBFJjC.4)K ։4xѯ &DAM<0tS;.R>z "OMGlC1@iUߊ5GrM<a< 0Ï\dn|12VyMG?'M:뒛_.\gk(!99.N>5I/nPN#%VidwRE.W?xayD;ԉvDe4~@ Gm uba6|߂m JϢ(9*ySѪ؇8+dMf(i]BQ*_0NN-59Nf7g S\GKĽÅw@m=oX'YY7-p >T5 @^Ǒo:>gzߓmZ\xTY;Q)lg #R[\}=QQɵYE_xY$n0@ΊR{tSE^1;ˮiax=Y r/cP6FF&dlr}$v.p,*kzC< f=Gub^9˱,eMI▃O>-Ѫp5:5,̹RH "-eMn>y="xTO1.aA} a &xtզO2c~ڭnpΝjzGג8œte3ѪS@7HJbL/G "X0_~G@/T'e}5 U8chŕCՇ{{4ʅum%.k"L)ذ`865:1ȊOnQ4UXj}`mR(|mX>k1Z!/o}3ys$Ѐ# O[Kbs3 k=sFE啝\;&wSwjv`C(\kknIZ Iz56e?w,,%XwǴv87W?nbgг -`hegUGC~'Q}}˪""m*hGis_̕MS"甆Ѯf ]R?^ R;rR]D2k̴}xcv6gÏ-@nOvgrck(^Ck) `S8[ _^NC MS\9WXfA3ْ ydRJ e\=fGzel cOm)0V6-v'+ԹEzF\r^F =f*=5W*UE[>יz4p16?kRҸ,!!1t[*?YwӸxE77fU2V`U ,Z,oMy'FV1̶*K䃠c[*UG 4Ny O@bP iN0@Xl> \e(Jӣٍ,plשCu5:J>ڽ&p ;BH. rI'31tiT.VnY.43uY!֯;YT#>ScC#:*%Hƴnޝud .?1 y*p ^/sD>9Q[e-w1YʤGvs!.Zh@bRCUկ- rҼ̙ ːKű}Eeh6=FhMhK(P,.t/QA7 ƊХ?˄1+*"B>tՉ `Z} 8}rrX-e[?YV︟u{_2Z[TOG&'. 9.1*jr0#tL>>R87a紶K{/ǂKJod_Fj4+iH~) u`) W{DOT%eHS{؝ `״v/JYS2Q:4نQm|m#FB\\ Z`?o񥑇"X+즎}ݱ LYԪ_>OT_@%Das JL MU92T΅8 \Wjl?~ˊHWQiGN.%ozk73ahkReK^_aK-*$Zpk+Wj! +^ZB2i`W~pTѵ~9V_ ZZ*@Ru)gTuDfqA} @*UD .d`}禰+jN v`PXOi 齌#FB! B/}.gICIeQ^^"YrYSʪe=ě 9/ j;jGNk*Bk673ݲ&kۯiqo1~o2<;{|d3φҒڮ<8V^.+mC|)~I78QofyWJ>7!6߷Q^eV툺F)2qT]{h*7T/ܸ͢YBILS;_:HS)Yruz$ @V4*J=`eWeOCƒ7 wGr|^Jtvs--C>DG 5xDDVŚ<;t3&HsÂ{:a]vӢoEqvi̙}pδl;>3aN.X8{J9NTCڔr@%fnKjcbźŕC |FC됂mwV+)OѲF]M^TD԰۪o#^XnsƢ<#4ȊbI20O.=*`xh L~eb XLW{+%n۫}z+}a J!si.UehGG@ԥeW!-;fdM6!T:MG]bQ,&%^س:\=NDž-ڔ1L>7~: _v TSE`Tk)&1D`e,r?XbF՝'.?Ȅ#.\=!$'N57-wDL-Rm,ʅGX)˄1heK8J~dd`rF xC&4po\|c!_%cVΌjJ8S֢ 0FgDɉ +\@֋ Zo>SKA^IcW`e`p'<#yx %@c&~#gDTF&#حT I vfp] N,:K <<4!s+yiٍ0-֐#!MTN4Ȧ + #YٛO?aQ| =7SRB ^?0u?ˍىhgoK&r@y\e>H \MgWz}9?,汤lPEQim @v7?(yr_)0 M0]c5W3j9;^m7t%D<+ڥQXOeFང@Kkx nJfׅYWhv&To,j*2lO9(p rxv[zlS-7!VCƜi2EVӵ`Jh`jw@pNx`d.r}Hoqg ѮE7C@.|dw9EYW}GPwr;> dC)Pj$Zngy=\84) >-AI-$U]J)]Qx.y#NJRwCiѕ6@R?+HxK &M= pF4TIefR8+Dj`c)*ړ=әk0J:A|a{gS@ 6q}R bf~1Bh!"~gh}Xܗ]6Qڜ'~pI3~{= P2ghܥum+iFILi|j _>pv;O?l #cBb t'%1e.n] GJZ݃=XQT&HGMx1{ҁ6.3 +鈔x"Wӫ4 Y(vN׻GnAWo25G&p$$:s؁ #ڕc'Ka L>i.6'+ىbE뵢vXC5ː B,67,*;20I鴬nbwp'A$bh1@oy'e!u#1{L99)@DAtc }NM-PvoY*Rs#̕"PEMi_U8@mYW[]\7y NTsef 1#-@'1;@=VF:vſ<B Ia. k!{80F). -eĻ]Ag,2W̟k ^@HF(!be !4!u ]S6tW/MMBtM-U00G j@( t;Q@ԱIi%F7C,5fȆr Wü@su[ 8d F'c\ +Ȧټ(pGuVO|UC'SNف18̅~[!tS7{qǶ|SR9l.u`SɴJ?БlQ 8ˈp͐%B-V:66s,wE<$؄zdZNh*8BqG/V_wك%R5a(fVʇ>!z}6iROO'CʃH\el185DK_xhYX\^{4!GD ]USVꍽ9%leBRbp\2oI,,-Vq i x.rm=vعb&.+a&kQ&y^儦ݟr%\U):jLm魱 *q,p:qKGNscl^*zSSNÜ;aɓ*!a(6}qn e),KxǷt0T)A\|/YUK{uY_pPaZ-tΣEV QWI6nl9cA?5,Ǝ׽I\9 4˖kkDnNx舑uE~)4lcb^:F#$6ѳA"a0Os 5aeJ2j0!ҥҜPӽQ: Z7? a Wg Sr>u\th"m5aQ7\%p39Z>R:=[4j+m"%y/PL=a[_ȉLXOt5Ҥ\xq-_TI\DZ't(IH%M O%T/Csg- e6/RŶ D]eYClWYb9YP wV%K14[ܪ6M$aד̫Z; @͋D%R2iM wM ؘ5߫o w>nY`ZdeLcaF^(/b[Cbp)׆s.PˑY;܂ax"r.qL[:]R1   1/b*β*4拺JqLdQ N*801 \ݳ  {xbLFS`Ac*mH@uۆxFh\qd~(PD1MqtQ"΀k뵃7Bh-10'tyN$:s08>&gef TQ)DHy=_Qp$%,].֓d楒ZC~9?wf[ rh8S^t{$R ƀoL{ͯAɊ*u?-bsEٸ4=Y N{ BJNվ\CMWqX_cYKsV{CFJ^wRAEÙl톯Vn%ysAw":K{mov\e;Oc1WG0!p Χ9oOSV+^ݥ0fI98q *j\OYz@2s4LP0BR(#xaOzJ8ofNϠ"OJm) cHȦbWR-%zGZԑWdJѓ__ww)EG. 1=ڧ=!D, BR )C80 YZphangorn/man/0000755000176200001440000000000014140463604012643 5ustar liggesusersphangorn/man/read.aa.Rd0000644000176200001440000000325513766736055014452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyDat.R \name{read.aa} \alias{read.aa} \title{Read Amino Acid Sequences in a File} \usage{ read.aa(file, format = "interleaved", skip = 0, nlines = 0, comment.char = "#", seq.names = NULL) } \arguments{ \item{file}{a file name specified by either a variable of mode character, or a double-quoted string.} \item{format}{a character string specifying the format of the DNA sequences. Three choices are possible: \code{"interleaved"}, \code{"sequential"}, or \code{"fasta"}, or any unambiguous abbreviation of these.} \item{skip}{the number of lines of the input file to skip before beginning to read data.} \item{nlines}{the number of lines to be read (by default the file is read until its end).} \item{comment.char}{a single character, the remaining of the line after this character is ignored.} \item{seq.names}{the names to give to each sequence; by default the names read in the file are used.} } \value{ a matrix of amino acid sequences. } \description{ This function reads amino acid sequences in a file, and returns a matrix list of DNA sequences with the names of the taxa read in the file as row names. } \references{ % Anonymous. FASTA format description. % \url{https://en.wikipedia.org/wiki/FASTA_format} Felsenstein, J. (1993) Phylip (Phylogeny Inference Package) version 3.5c. Department of Genetics, University of Washington. \url{https://evolution.genetics.washington.edu/phylip/phylip.html} } \seealso{ \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{IO} phangorn/man/consensusNet.Rd0000644000176200001440000000355513707232051015627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{consensusNet} \alias{consensusNet} \title{Computes a consensusNetwork from a list of trees Computes a \code{networx} object from a collection of splits.} \usage{ consensusNet(obj, prob = 0.3, ...) } \arguments{ \item{obj}{An object of class multiPhylo.} \item{prob}{the proportion a split has to be present in all trees to be represented in the network.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{consensusNet} returns an object of class networx. This is just an intermediate to plot phylogenetic networks with igraph. } \description{ Computes a consensusNetwork, i.e. an object of class \code{networx} from a list of trees, i.e. an class of class \code{multiPhylo}. Computes a \code{networx} object from a collection of splits. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), bs=50) cnet <- consensusNet(bs, .3) plot(cnet) \dontrun{ library(rgl) open3d() plot(cnet, type = "3D", show.tip.label=FALSE, show.nodes=TRUE) plot(cnet, type = "equal angle", show.edge.label=TRUE) tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) trees <- read.tree(tmpfile) cnet_woodmouse <- consensusNet(trees, .3) plot(cnet_woodmouse, type = "equal angle", show.edge.label=TRUE) } } \references{ Holland B.R., Huber K.T., Moulton V., Lockhart P.J. (2004) Using consensus networks to visualize contradictory evidence for species phylogeny. \emph{Molecular Biology and Evolution}, \bold{21}, 1459--61 } \seealso{ \code{\link{splitsNetwork}}, \code{\link{neighborNet}}, \code{\link{lento}}, \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, \code{\link{maxCladeCred}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{hplot} phangorn/man/allTrees.Rd0000644000176200001440000000147613707232051014713 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{allTrees} \alias{allTrees} \title{Compute all trees topologies.} \usage{ allTrees(n, rooted = FALSE, tip.label = NULL) } \arguments{ \item{n}{Number of tips (<=10).} \item{rooted}{Rooted or unrooted trees (default: rooted).} \item{tip.label}{Tip labels.} } \value{ an object of class \code{multiPhylo}. } \description{ \code{allTrees} computes all tree topologies for rooted or unrooted trees with up to 10 tips. \code{allTrees} returns bifurcating trees. } \examples{ trees <- allTrees(5) old.par <- par(no.readonly = TRUE) par(mfrow = c(3,5)) for(i in 1:15)plot(trees[[i]]) par(old.par) } \seealso{ \code{\link[ape]{rtree}}, \code{\link{nni}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/writeDist.Rd0000644000176200001440000000361013707232051015106 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distSeq.R \name{writeDist} \alias{writeDist} \alias{write.nexus.dist} \alias{readDist} \alias{read.nexus.dist} \alias{unique.dist} \title{Writing and reading distances in phylip and nexus format} \usage{ writeDist(x, file = "", format = "phylip", ...) write.nexus.dist(x, file = "", append = FALSE, upper = FALSE, diag = TRUE, digits = getOption("digits"), taxa = !append) readDist(file, format = "phylip") read.nexus.dist(file) \method{unique}{dist}(x, incomparables, ...) } \arguments{ \item{x}{A \code{dist} object.} \item{file}{A file name.} \item{format}{file format, default is "phylip", only other option so far is "nexus".} \item{\dots}{Further arguments passed to or from other methods.} \item{append}{logical. If TRUE the nexus blocks will be added to a file.} \item{upper}{logical value indicating whether the upper triangle of the distance matrix should be printed.} \item{diag}{logical value indicating whether the diagonal of the distance matrix should be printed.} \item{digits}{passed to format inside of \code{write.nexus.dist}.} \item{taxa}{logical. If TRUE a taxa block is added.} \item{incomparables}{Not used so far.} } \value{ an object of class \code{dist} } \description{ \code{readDist}, \code{writeDist} and \code{write.nexus.dist} are useful to exchange distance matrices with other phylogenetic programs. } \examples{ data(yeast) dm <- dist.ml(yeast) writeDist(dm) write.nexus.dist(dm) } \references{ Maddison, D. R., Swofford, D. L. and Maddison, W. P. (1997) NEXUS: an extensible file format for systematic information. \emph{Systematic Biology}, \bold{46}, 590--621. } \seealso{ To compute distance matrices see \code{\link{dist.ml}} \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise polymorphism p-distances } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/SOWH.test.Rd0000644000176200001440000000414713707232051014674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/SOWH.R \name{SOWH.test} \alias{SOWH.test} \title{Swofford-Olsen-Waddell-Hillis Test} \usage{ SOWH.test(x, n = 100, restricted = list(optNni = FALSE), optNni = TRUE, trace = 1, ...) } \arguments{ \item{x}{an object of class \code{"pml"}.} \item{n}{the number of bootstrap replicates.} \item{restricted}{list of restricted parameter settings.} \item{optNni}{Logical value indicating whether topology gets optimized (NNI).} \item{trace}{Show output during computations.} \item{\dots}{Further arguments passed to \code{"optim.pml"}.} } \value{ an object of class SOWH. That is a list with three elements, one is a matrix containing for each bootstrap replicate the (log-) likelihood of the restricted and unrestricted estimate and two pml objects of the restricted and unrestricted model. } \description{ This function computes the Swofford--Olsen--Waddell--Hillis (SOWH) test, a parametric bootstrap test. The function is computational very demanding and likely to be very slow. } \details{ \code{SOWH.test} performs a parametric bootstrap test to compare two trees. It makes extensive use \code{simSeq} and \code{optim.pml} and can take quite long. } \examples{ # in real analysis use larger n, e.g. 500 preferably more \dontrun{ data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree <- NJ(dm) fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit, TRUE) set.seed(6) tree <- rNNI(fit$tree, 1) fit <- update(fit, tree = tree) (res <- SOWH.test(fit, n=100)) summary(res) } } \references{ Goldman, N., Anderson, J. P., and Rodrigo, A. G. (2000) Likelihood -based tests of topologies in phylogenetics. \emph{Systematic Biology} \bold{49} 652-670. Swofford, D.L., Olsen, G.J., Waddell, P.J. and Hillis, D.M. (1996) Phylogenetic Inference in Hillis, D.M., Moritz, C. and Mable, B.K. (Eds.) \emph{Molecular Systematics} (2nd ed.) 407-514, Sunderland, MA: Sinauer } \seealso{ \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, \code{\link{simSeq}}, \code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{models} phangorn/man/ancestral.pml.Rd0000644000176200001440000000544213707232051015700 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ancestral_pml.R \name{ancestral.pml} \alias{ancestral.pml} \alias{ancestral.pars} \alias{pace} \alias{plotAnc} \title{Ancestral character reconstruction.} \usage{ ancestral.pml(object, type = "marginal", return = "prob") ancestral.pars(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") pace(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") plotAnc(tree, data, i = 1, site.pattern = TRUE, col = NULL, cex.pie = par("cex"), pos = "bottomright", ...) } \arguments{ \item{object}{an object of class pml} \item{type}{method used to assign characters to internal nodes, see details.} \item{return}{return a \code{phyDat} object or matrix of probabilities.} \item{tree}{a tree, i.e. an object of class pml} \item{data}{an object of class phyDat} \item{cost}{A cost matrix for the transitions between two states.} \item{i}{plots the i-th site pattern of the \code{data}.} \item{site.pattern}{logical, plot i-th site pattern or i-th site} \item{col}{a vector containing the colors for all possible states.} \item{cex.pie}{a numeric defining the size of the pie graphs} \item{pos}{a character string defining the position of the legend} \item{\dots}{Further arguments passed to or from other methods.} } \value{ %A matrix containing the the estimates character states. An object of class "phyDat", containing the ancestral states of all nodes. } \description{ Marginal reconstruction of the ancestral character states. } \details{ The argument "type" defines the criterion to assign the internal nodes. For \code{ancestral.pml} so far "ml" and (empirical) "bayes" and for \code{ancestral.pars} "MPR" and "ACCTRAN" are possible. With parsimony reconstruction one has to keep in mind that there will be often no unique solution. For further details see vignette("Ancestral"). } \examples{ example(NJ) fit <- pml(tree, Laurasiatherian) anc.ml <- ancestral.pml(fit, type = "ml") anc.p <- ancestral.pars(tree, Laurasiatherian) \dontrun{ require(seqLogo) seqLogo( t(subset(anc.ml, 48, 1:20)[[1]]), ic.scale=FALSE) seqLogo( t(subset(anc.p, 48, 1:20)[[1]]), ic.scale=FALSE) } # plot the first site pattern plotAnc(tree, anc.ml, 1) # plot the third character plotAnc(tree, anc.ml, attr(anc.ml, "index")[3]) } \references{ Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Swofford, D.L., Maddison, W.P. (1987) Reconstructing ancestral character states under Wagner parsimony. \emph{Math. Biosci.} \bold{87}: 199--229 Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University Press, Oxford. } \seealso{ \code{\link{pml}}, \code{\link{parsimony}}, \code{\link[ape]{ace}}, \code{\link[ape]{root}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/dfactorial.Rd0000644000176200001440000000123013707232051015234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{ldfactorial} \alias{ldfactorial} \alias{dfactorial} \title{Arithmetic Operators} \usage{ ldfactorial(x) dfactorial(x) } \arguments{ \item{x}{a numeric scalar or vector} } \value{ \code{dfactorial(x)} returns the double factorial, that is \eqn{x\!\! = 1 * 3 * 5 * \ldots * x } and \code{ldfactorial(x)} is the natural logarithm of it. } \description{ double factorial function } \examples{ dfactorial(1:10) } \seealso{ \code{\link[base:Special]{factorial}}, \code{\link[ape]{howmanytrees}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{classif} phangorn/man/plot.networx.Rd0000644000176200001440000000741313707232051015620 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{plot.networx} \alias{plot.networx} \title{plot phylogenetic networks} \usage{ \method{plot}{networx}(x, type = "equal angle", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "black", edge.color = "black", edge.width = 3, edge.lty = 1, split.color = NULL, split.width = NULL, split.lty = NULL, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) } \arguments{ \item{x}{an object of class \code{"networx"}} \item{type}{"3D" to plot using rgl or "2D" in the normal device.} \item{use.edge.length}{a logical indicating whether to use the edge weights of the network to draw the branches (the default) or not.} \item{show.tip.label}{a logical indicating whether to show the tip labels on the graph (defaults to \code{TRUE}, i.e. the labels are shown).} \item{show.edge.label}{a logical indicating whether to show the tip labels on the graph.} \item{edge.label}{an additional vector of edge labels (normally not needed).} \item{show.node.label}{a logical indicating whether to show the node labels (see example).} \item{node.label}{an additional vector of node labels (normally not needed).} \item{show.nodes}{a logical indicating whether to show the nodes (see example).} \item{tip.color}{the colors used for the tip labels.} \item{edge.color}{the colors used to draw edges.} \item{edge.width}{the width used to draw edges.} \item{edge.lty}{a vector of line types.} \item{split.color}{the colors used to draw edges.} \item{split.width}{the width used to draw edges.} \item{split.lty}{a vector of line types.} \item{font}{an integer specifying the type of font for the labels: 1 (plain text), 2 (bold), 3 (italic, the default), or 4 (bold italic).} \item{cex}{a numeric value giving the factor scaling of the labels.} \item{cex.node.label}{a numeric value giving the factor scaling of the node labels.} \item{cex.edge.label}{a numeric value giving the factor scaling of the edge labels.} \item{col.node.label}{the colors used for the node labels.} \item{col.edge.label}{the colors used for the edge labels.} \item{font.node.label}{the font used for the node labels.} \item{font.edge.label}{the font used for the edge labels.} \item{\dots}{Further arguments passed to or from other methods.} } \description{ So far not all parameters behave the same on the the \code{rgl} \code{"3D"} and basic graphic \code{"2D"} device. } \details{ Often it is easier and safer to supply vectors of graphical parameters for splits (e.g. splits.color) than for edges. These overwrite values edge.color. } \note{ The internal representation is likely to change. } \examples{ set.seed(1) tree1 <- rtree(20, rooted=FALSE) sp <- as.splits(rNNI(tree1, n=10)) net <- as.networx(sp) plot(net) \dontrun{ # also see example in consensusNet example(consensusNet) } } \references{ Dress, A.W.M. and Huson, D.H. (2004) Constructing Splits Graphs \emph{IEEE/ACM Transactions on Computational Biology and Bioinformatics (TCBB)}, \bold{1(3)}, 109--115 Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{consensusNet}}, \code{\link{neighborNet}}, \code{\link{splitsNetwork}}, \code{\link{hadamard}}, \code{\link{distanceHadamard}}, \code{\link{as.networx}}, \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}}, \code{\link{densiTree}}, \code{\link[ape]{nodelabels}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/pmlPart.Rd0000644000176200001440000000466514006563476014575 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlPart.R \name{multiphyDat2pmlPart} \alias{multiphyDat2pmlPart} \alias{pmlPart2multiPhylo} \alias{pmlPart} \title{Partition model.} \usage{ multiphyDat2pmlPart(x, rooted = FALSE, ...) pmlPart2multiPhylo(x) pmlPart(formula, object, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), model = NULL, rooted = FALSE, ...) } \arguments{ \item{x}{an object of class \code{pmlPart}} \item{rooted}{Are the gene trees rooted (ultrametric) or unrooted.} \item{\dots}{Further arguments passed to or from other methods.} \item{formula}{a formula object (see details).} \item{object}{an object of class \code{pml} or a list of objects of class \code{pml} .} \item{control}{A list of parameters for controlling the fitting process.} \item{model}{A vector containing the models containing a model for each partition.} } \value{ \code{kcluster} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees during the optimization.} \item{object}{an object of class \code{"pml"} or \code{"pmlPart"}} } \description{ Model to estimate phylogenies for partitioned data. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all partitions, on the right the parameter which are optimized specific to each partition. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameters can be used only once in the formula. \code{"rate"} is only available for the right side of the formula. For partitions with different edge weights, but same topology, \code{pmlPen} can try to find more parsimonious models (see example). \code{pmlPart2multiPhylo} is a convenience function to extract the trees out of a \code{pmlPart} object. } \examples{ data(yeast) dm <- dist.logDet(yeast) tree <- NJ(dm) fit <- pml(tree,yeast) fits <- optim.pml(fit) weight=xtabs(~ index+genes,attr(yeast, "index"))[,1:10] sp <- pmlPart(edge ~ rate + inv, fits, weight=weight) sp \dontrun{ sp2 <- pmlPart(~ edge + inv, fits, weight=weight) sp2 AIC(sp2) sp3 <- pmlPen(sp2, lambda = 2) AIC(sp3) } } \seealso{ \code{\link{pml}},\code{\link{pmlCluster}},\code{\link{pmlMix}},\code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/pmlCluster.Rd0000644000176200001440000000506013707232051015263 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlPart.R \name{pmlCluster} \alias{pmlCluster} \title{Stochastic Partitioning} \usage{ pmlCluster(formula, fit, weight, p = 1:5, part = NULL, nrep = 10, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), ...) } \arguments{ \item{formula}{a formula object (see details).} \item{fit}{an object of class \code{pml}.} \item{weight}{\code{weight} is matrix of frequency of site patterns for all genes.} \item{p}{number of clusters.} \item{part}{starting partition, otherwise a random partition is generated.} \item{nrep}{number of replicates for each p.} \item{control}{A list of parameters for controlling the fitting process.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{pmlCluster} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees during the optimization.} \item{fits}{fits for the final partitions} } \description{ Stochastic Partitioning of genes into p cluster. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all cluster, on the right the parameter which are optimized specific to each cluster. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameter can be used only once in the formula. There are also some restriction on the combinations how parameters can get used. \code{"rate"} is only available for the right side. When \code{"rate"} is specified on the left hand side \code{"edge"} has to be specified (on either side), if \code{"rate"} is specified on the right hand side it follows directly that \code{edge} is too. } \examples{ \dontrun{ data(yeast) dm <- dist.logDet(yeast) tree <- NJ(dm) fit <- pml(tree,yeast) fit <- optim.pml(fit) weight <- xtabs(~ index+genes,attr(yeast, "index")) set.seed(1) sp <- pmlCluster(edge~rate, fit, weight, p=1:4) sp SH.test(sp) } } \references{ K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD Thesis) Lanfear, R., Calcott, B., Ho, S.Y.W. and Guindon, S. (2012) PartitionFinder: Combined Selection of Partitioning Schemes and Substitution Models for Phylogenetic Analyses. \emph{Molecular Biology and Evolution}, \bold{29(6)}, 1695-1701 } \seealso{ \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlMix}},\code{\link{SH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/phyDat.Rd0000644000176200001440000001246013707232051014364 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyDat.R \name{phyDat} \alias{phyDat} \alias{as.phyDat.character} \alias{as.phyDat.data.frame} \alias{as.phyDat.matrix} \alias{as.MultipleAlignment} \alias{as.MultipleAlignment.phyDat} \alias{cbind.phyDat} \alias{c.phyDat} \alias{acgt2ry} \alias{removeUndeterminedSites} \alias{phyDat2MultipleAlignment} \alias{as.phyDat} \alias{as.phyDat.factor} \alias{as.phyDat.DNAbin} \alias{as.phyDat.alignment} \alias{phyDat2alignment} \alias{as.phyDat.MultipleAlignment} \alias{as.character.phyDat} \alias{as.data.frame.phyDat} \alias{as.DNAbin.phyDat} \alias{as.AAbin.phyDat} \alias{baseFreq} \alias{subset.phyDat} \alias{[.phyDat} \alias{unique.phyDat} \alias{allSitePattern} \alias{genlight2phyDat} \alias{image.phyDat} \title{Conversion among Sequence Formats} \usage{ phyDat(data, type = "DNA", levels = NULL, return.index = TRUE, ...) as.phyDat(x, ...) \method{as.phyDat}{factor}(x, ...) \method{as.phyDat}{DNAbin}(x, ...) \method{as.phyDat}{alignment}(x, type = "DNA", ...) phyDat2alignment(x) \method{as.phyDat}{MultipleAlignment}(x, ...) \method{as.MultipleAlignment}{phyDat}(x, ...) acgt2ry(obj) \method{as.character}{phyDat}(x, allLevels = TRUE, ...) \method{as.data.frame}{phyDat}(x, ...) \method{as.DNAbin}{phyDat}(x, ...) \method{as.AAbin}{phyDat}(x, ...) baseFreq(obj, freq = FALSE, all = FALSE, drop.unused.levels = FALSE) \method{subset}{phyDat}(x, subset, select, site.pattern = TRUE, ...) \method{[}{phyDat}(x, i, j, ..., drop = FALSE) \method{unique}{phyDat}(x, incomparables = FALSE, identical = TRUE, ...) removeUndeterminedSites(x, ...) allSitePattern(n, levels = c("a", "c", "g", "t"), names = NULL) genlight2phyDat(x, ambiguity = NA) \method{image}{phyDat}(x, ...) } \arguments{ \item{data}{An object containing sequences.} \item{type}{Type of sequences ("DNA", "AA", "CODON" or "USER").} \item{levels}{Level attributes.} \item{return.index}{If TRUE returns a index of the site patterns.} \item{...}{further arguments passed to or from other methods.} \item{x}{An object containing sequences.} \item{obj}{as object of class phyDat} \item{allLevels}{return original data.} \item{freq}{logical, if 'TRUE', frequencies or counts are returned otherwise proportions} \item{all}{all a logical; if all = TRUE, all counts of bases, ambiguous codes, missing data, and alignment gaps are returned as defined in the contrast.} \item{drop.unused.levels}{logical, drop unused levels} \item{subset}{a subset of taxa.} \item{select}{a subset of characters.} \item{site.pattern}{select site pattern or sites.} \item{i, j}{indices of the rows and/or columns to select or to drop. They may be numeric, logical, or character (in the same way than for standard R objects).} \item{drop}{for compatibility with the generic (unused).} \item{incomparables}{for compatibility with unique.} \item{identical}{if TRUE (default) sequences have to be identical, if FALSE sequences are considered duplicates if distance between sequences is zero (happens frequently with ambiguous sites).} \item{n}{Number of sequences.} \item{names}{Names of sequences.} \item{ambiguity}{character for ambiguous character and no contrast is provided.} } \value{ The functions return an object of class \code{phyDat}. } \description{ These functions transform several DNA formats into the \code{phyDat} format. \code{allSitePattern} generates an alignment of all possible site patterns. } \details{ If \code{type} "USER" a vector has to be give to \code{levels}. For example c("a", "c", "g", "t", "-") would create a data object that can be used in phylogenetic analysis with gaps as fifth state. There is a more detailed example for specifying "USER" defined data formats in the vignette "phangorn-specials". \code{allSitePattern} returns all possible site patterns and can be useful in simulation studies. For further details see the vignette phangorn-specials. The generic function \code{c} can be used to to combine sequences and \code{unique} to get all unique sequences or unique haplotypes. \code{acgt2ry} converts a \code{phyDat} object of nucleotides into an binary ry-coded dataset. } \examples{ data(Laurasiatherian) class(Laurasiatherian) Laurasiatherian # base frequencies baseFreq(Laurasiatherian) baseFreq(Laurasiatherian, all=TRUE) baseFreq(Laurasiatherian, freq=TRUE) # subsetting phyDat objects # the first 5 sequences subset(Laurasiatherian, subset=1:5) # the first 5 characters subset(Laurasiatherian, select=1:5, site.pattern = FALSE) # subsetting with [] Laurasiatherian[1:5, 1:20] # short for subset(Laurasiatherian, subset=1:5, select=1:20, site.pattern = FALSE) # the first 5 site patterns (often more than 5 characters) subset(Laurasiatherian, select=1:5, site.pattern = TRUE) # transform into old ape format LauraChar <- as.character(Laurasiatherian) # and back Laura <- phyDat(LauraChar) all.equal(Laurasiatherian, Laura) # Compute all possible site patterns # for nucleotides there $4 ^ (number of tips)$ patterns allSitePattern(5) } \seealso{ \code{\link{DNAbin}}, \code{\link{as.DNAbin}}, \code{\link{read.dna}}, \code{\link{read.aa}}, \code{\link{read.nexus.data}} and the chapter 1 in the \code{vignette("phangorn-specials", package="phangorn")} and the example of \code{\link{pmlMix}} for the use of \code{allSitePattern} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/hadamard.Rd0000644000176200001440000000500614140463611014672 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{hadamard} \alias{hadamard} \alias{fhm} \alias{h4st} \alias{h2st} \title{Hadamard Matrices and Fast Hadamard Multiplication} \usage{ hadamard(x) fhm(v) h4st(obj, levels = c("a", "c", "g", "t")) h2st(obj, eps = 0.001) } \arguments{ \item{x}{a vector of length \eqn{2^n}, where n is an integer.} \item{v}{a vector of length \eqn{2^n}, where n is an integer.} \item{obj}{a data.frame or character matrix, typical a sequence alignment.} \item{levels}{levels of the sequences.} \item{eps}{Threshold value for splits.} } \value{ \code{hadamard} returns a Hadamard matrix. \code{fhm} returns the fast Hadamard multiplication. } \description{ A collection of functions to perform Hadamard conjugation. %Hv of a Hadamard matrix H with a vector v using fast Hadamard multiplication. } \details{ \code{h2st} and \code{h4st} perform Hadamard conjugation for 2-state (binary, RY-coded) or 4-state (DNA/RNA) data. \code{write.nexus.splits} writes splits returned from \code{h2st} or \code{\link[phangorn]{distanceHadamard}} to a nexus file, which can be processed by Spectronet or SplitsTree. } \examples{ H <- hadamard(3) v <- 1:8 H \%*\% v fhm(v) data(yeast) # RY-coding dat_ry <- acgt2ry(yeast) fit2 <- h2st(dat_ry) lento(fit2) # write.nexus.splits(fit2, file = "test.nxs") # read this file into Spectronet or SplitsTree to show the network \dontrun{ dat <- as.character(yeast) dat4 <- phyDat(dat, type="USER", levels=c("a","c", "g", "t"), ambiguity=NULL) fit4 <- h4st(dat4) old.par <- par(no.readonly = TRUE) par(mfrow=c(3,1)) lento(fit4[[1]], main="Transversion") lento(fit4[[2]], main="Transition 1") lento(fit4[[3]], main="Transition 2") par(old.par) } } \references{ Hendy, M.D. (1989). The relationship between simple evolutionary tree models and observable sequence data. \emph{Systematic Zoology}, \bold{38} 310--321. Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5--24. Hendy, M. D. (2005). Hadamard conjugation: an analytical tool for phylogenetics. In O. Gascuel, editor, \emph{Mathematics of evolution and phylogeny}, Oxford University Press, Oxford Waddell P. J. (1995). Statistical methods of phylogenetic analysis: Including hadamard conjugation, LogDet transforms, and maximum likelihood. \emph{PhD thesis}. } \seealso{ \code{\link{distanceHadamard}}, \code{\link{lento}}, \code{\link{plot.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/designTree.Rd0000644000176200001440000000422514140462313015222 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{designTree} \alias{designTree} \alias{nnls.tree} \alias{nnls.phylo} \alias{nnls.splits} \alias{nnls.networx} \alias{designSplits} \title{Compute a design matrix or non-negative LS} \usage{ designTree(tree, method = "unrooted", sparse = FALSE, ...) nnls.tree(dm, tree, rooted = FALSE, trace = 1, weight = NULL, balanced = FALSE) nnls.phylo(x, dm, rooted = FALSE, trace = 0, ...) nnls.splits(x, dm, trace = 0) nnls.networx(x, dm) designSplits(x, splits = "all", ...) } \arguments{ \item{tree}{an object of class \code{phylo}} \item{method}{design matrix for an "unrooted" or "rooted" ultrametric tree.} \item{sparse}{return a sparse design matrix.} \item{\dots}{further arguments, passed to other methods.} \item{dm}{a distance matrix.} \item{rooted}{compute a "rooted" or "unrooted" tree.} \item{trace}{defines how much information is printed during optimization.} \item{weight}{vector of weights to be used in the fitting process. Weighted least squares is used with weights w, i.e., sum(w * e^2) is minimized.} \item{balanced}{use weights as in balanced fastME} \item{x}{number of taxa.} \item{splits}{one of "all", "star".} } \value{ \code{nnls.tree} return a tree, i.e. an object of class \code{phylo}. \code{designTree} and \code{designSplits} a matrix, possibly sparse. } \description{ \code{nnls.tree} estimates the branch length using non-negative least squares given a tree and a distance matrix. \code{designTree} and \code{designSplits} compute design matrices for the estimation of edge length of (phylogenetic) trees using linear models. For larger trees a sparse design matrix can save a lot of memory. %\code{designTree} also computes a contrast matrix if the method is "rooted". } \examples{ example(NJ) dm <- as.matrix(dm) y <- dm[lower.tri(dm)] X <- designTree(tree) lm(y~X-1) # avoids negative edge weights tree2 <- nnls.tree(dm, tree) } \seealso{ \code{\link[ape]{fastme}}, \code{\link[phangorn]{distanceHadamard}}, \code{\link[phangorn]{splitsNetwork}}, \code{\link[phangorn]{upgma}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/densiTree.Rd0000644000176200001440000001021014140455403015044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Densi.R \name{densiTree} \alias{densiTree} \title{Plots a densiTree.} \usage{ densiTree(x, type = "cladogram", alpha = 1/length(x), consensus = NULL, direction = "rightwards", optim = FALSE, scaleX = FALSE, col = 1, width = 1, lty = 1, cex = 0.8, font = 3, tip.color = 1, adj = 0, srt = 0, underscore = FALSE, label.offset = 0, scale.bar = TRUE, jitter = list(amount = 0, random = TRUE), ...) } \arguments{ \item{x}{an object of class \code{multiPhylo}.} \item{type}{a character string specifying the type of phylogeny, so far "cladogram" (default) or "phylogram" are supported.} \item{alpha}{parameter for semi-transparent colors.} \item{consensus}{A tree or character vector which is used to define the order of the tip labels.} \item{direction}{a character string specifying the direction of the tree. Four values are possible: "rightwards" (the default), "leftwards", "upwards", and "downwards".} \item{optim}{not yet used.} \item{scaleX}{scale trees to have identical heights.} \item{col}{a scalar or vector giving the colours used to draw the edges for each plotted phylogeny. These are taken to be in the same order than input trees x. If fewer colours are given than the number of trees, then the colours are recycled.} \item{width}{edge width.} \item{lty}{line type.} \item{cex}{a numeric value giving the factor scaling of the tip labels.} \item{font}{an integer specifying the type of font for the labels: 1 (plain text), 2 (bold), 3 (italic, the default), or 4 (bold italic).} \item{tip.color}{color of the tip labels.} \item{adj}{a numeric specifying the justification of the text strings of the labels: 0 (left-justification), 0.5 (centering), or 1 (right-justification).} \item{srt}{a numeric giving how much the labels are rotated in degrees.} \item{underscore}{a logical specifying whether the underscores in tip labels should be written as spaces (the default) or left as are (if TRUE).} \item{label.offset}{a numeric giving the space between the nodes and the tips of the phylogeny and their corresponding labels.} \item{scale.bar}{a logical specifying whether add scale.bar to the plot.} \item{jitter}{allows to shift trees. a list with two arguments: the amount of jitter and random or equally spaced (see details below)} \item{\dots}{further arguments to be passed to plot.} } \description{ An R function to plot trees similar to those produced by DensiTree. } \details{ If no consensus tree is provided \code{densiTree} computes a consensus tree, and if the input trees have different labels a mrp.supertree as a backbone. This should avoid too many unnecessary crossings of edges. Trees should be rooted, other wise the output may not be visually pleasing. \code{jitter} shifts trees a bit so that they are not exactly on top of each other. If \code{amount == 0}, it is ignored. If \code{random=TRUE} the result of the permutation is \code{runif(n, -amount, amount)}, otherwise \code{seq(-amount, amount, length=n)}, where \code{n <- length(x)}. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x) upgma(dist.hamming(x)), bs=25) # cladogram nice to show topological differences densiTree(bs, type="cladogram", col="blue") densiTree(bs, type="phylogram", col="green", direction="downwards", width=2) # plot five trees slightly shifted, no transparent color densiTree(bs[1:5], type="phylogram", col=1:5, width=2, jitter= list(amount=.3, random=FALSE), alpha=1) \dontrun{ # phylograms are nice to show different age estimates require(PhyloOrchard) data(BinindaEmondsEtAl2007) BinindaEmondsEtAl2007 <- .compressTipLabel(BinindaEmondsEtAl2007) densiTree(BinindaEmondsEtAl2007, type="phylogram", col="red") } } \references{ densiTree is inspired from the great \href{https://www.cs.auckland.ac.nz/~remco/DensiTree/}{DensiTree} program of Remco Bouckaert. Remco R. Bouckaert (2010) DensiTree: making sense of sets of phylogenetic trees \emph{Bioinformatics}, \bold{26 (10)}, 1372-1373. } \seealso{ \code{\link{plot.phylo}}, \code{\link{plot.networx}}, \code{\link{jitter}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/pml.fit.Rd0000644000176200001440000000512214107665636014517 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phylo.R \name{lli} \alias{lli} \alias{edQt} \alias{pml.free} \alias{pml.init} \alias{pml.fit} \title{Internal maximum likelihood functions.} \usage{ lli(data, tree = NULL, ...) edQt(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) pml.free() pml.init(data, k = 1L) pml.fit(tree, data, bf = rep(1/length(levels), length(levels)), shape = 1, k = 1, Q = rep(1, length(levels) * (length(levels) - 1)/2), levels = attr(data, "levels"), inv = 0, rate = 1, g = NULL, w = NULL, eig = NULL, INV = NULL, ll.0 = NULL, llMix = NULL, wMix = 0, ..., site = FALSE, Mkv = FALSE, site.rate = "gamma") } \arguments{ \item{data}{An alignment, object of class \code{phyDat}.} \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{\dots}{Further arguments passed to or from other methods.} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{bf}{Base frequencies.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{levels}{The alphabet used e.g. c("a", "c", "g", "t") for DNA} \item{inv}{Proportion of invariable sites.} \item{rate}{Rate.} \item{g}{vector of quantiles (default is NULL)} \item{w}{vector of probabilities (default is NULL)} \item{eig}{Eigenvalue decomposition of Q} \item{INV}{Sparse representation of invariant sites} \item{ll.0}{default is NULL} \item{llMix}{default is NULL} \item{wMix}{default is NULL} \item{site}{return the log-likelihood or vector of sitewise likelihood values} \item{Mkv}{indicate if Lewis' Mkv should be estimated.} \item{site.rate}{Indicates what type of gamma distribution to use. Options are "gamma" approach of Yang 1994 (default), "quadrature" after the Laguerre quadrature approach of Felsenstein 2001 and "freerate" .} } \value{ \code{pml.fit} returns the log-likelihood. } \description{ These functions are internally used for the likelihood computations in \code{pml} or \code{optim.pml}. } \details{ These functions are exported to be used in different packages so far only in the package coalescentMCMC, but are not intended for end user. Most of the functions call C code and are far less forgiving if the import is not what they expect than \code{pml}. } \references{ Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a maximum likelihood approach. \emph{Journal of Molecular Evolution}, \bold{17}, 368--376. } \seealso{ \code{\link{pml}, \link{pmlPart}, \link{pmlMix}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/nni.Rd0000644000176200001440000000225613707232051013721 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeRearrangement.R \name{nni} \alias{nni} \alias{rNNI} \alias{rSPR} \title{Tree rearrangements.} \usage{ nni(tree) rNNI(tree, moves = 1, n = length(moves)) rSPR(tree, moves = 1, n = length(moves), k = NULL) } \arguments{ \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{moves}{Number of tree rearrangements to be transformed on a tree. Can be a vector} \item{n}{Number of trees to be simulated.} \item{k}{If defined just SPR of distance k are performed.} } \value{ an object of class multiPhylo. } \description{ \code{nni} returns a list of all trees which are one nearest neighbor interchange away. \code{rNNI} and \code{rSPR} are two methods which simulate random trees which are a specified number of rearrangement apart from the input tree. Both methods assume that the input tree is bifurcating. These methods may be useful in simulation studies. } \examples{ tree <- rtree(20, rooted = FALSE) trees1 <- nni(tree) trees2 <- rSPR(tree, 2, 10) } \seealso{ \code{\link{allTrees}}, \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/simSeq.Rd0000644000176200001440000000725014017247617014406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/simSeq.R \name{simSeq} \alias{simSeq} \alias{simSeq.phylo} \alias{simSeq.pml} \title{Simulate sequences.} \usage{ simSeq(x, ...) \method{simSeq}{phylo}(x, l = 1000, Q = NULL, bf = NULL, rootseq = NULL, type = "DNA", model = NULL, levels = NULL, rate = 1, ancestral = FALSE, code = 1, ...) \method{simSeq}{pml}(x, ancestral = FALSE, ...) } \arguments{ \item{x}{a phylogenetic tree \code{tree}, i.e. an object of class \code{phylo} or and object of class \code{pml}.} \item{\dots}{Further arguments passed to or from other methods.} \item{l}{The length of the sequence to simulate.} \item{Q}{The rate matrix.} \item{bf}{Base frequencies.} \item{rootseq}{A vector of length \code{l} containing the root sequence. If not provided, the root sequence is randomly generated.} \item{type}{Type of sequences ("DNA", "AA", "CODON" or "USER").} \item{model}{Amino acid model of evolution to employ, for example "WAG", "JTT", "Dayhoff" or "LG". For a full list of supported models, type \code{phangorn:::.aamodels}. Ignored if type is not equal to "AA".} \item{levels}{A character vector of the different character tokens. Ignored unless type = "USER".} \item{rate}{A numerical value greater than zero giving the mutation rate or scaler for edge lengths.} \item{ancestral}{Logical specifying whether to return ancestral sequences.} \item{code}{The ncbi genetic code number for translation (see details). By default the standard genetic code is used.} } \value{ \code{simSeq} returns an object of class phyDat. } \description{ Simulate sequences from a given evolutionary tree. } \details{ \code{simSeq} is a generic function to simulate sequence alignments along a phylogeny. It is quite flexible and can generate DNA, RNA, amino acids, codon, morphological or binary sequences. simSeq can take as input a phylogenetic tree of class \code{phylo}, or a \code{pml} object; it will return an object of class \code{phyDat}. There is also a more low level version, which lacks rate variation, but one can combine different alignments with their own rates (see example). The rate parameter acts like a scaler for the edge lengths. For codon models \code{type="CODON"}, two additional arguments \code{dnds} for the dN/dS ratio and \code{tstv} for the transition transversion ratio can be supplied. \strong{Defaults:} If \code{x} is a tree of class \code{phylo}, then sequences will be generated with the default Jukes-Cantor DNA model (\code{"JC"}). If \code{bf} is not specified, then all states will be treated as equally probable. If \code{Q} is not specified, then a uniform rate matrix will be employed. } \examples{ \dontrun{ data(Laurasiatherian) tree <- nj(dist.ml(Laurasiatherian)) fit <- pml(tree, Laurasiatherian, k=4) fit <- optim.pml(fit, optNni=TRUE, model="GTR", optGamma=TRUE) data <- simSeq(fit) } tree <- rtree(5) plot(tree) nodelabels() # Example for simple DNA alignment data <- simSeq(tree, l = 10, type="DNA", bf=c(.1,.2,.3,.4), Q=1:6, ancestral=TRUE) as.character(data) # Example to simulate discrete Gamma rate variation rates <- discrete.gamma(1,4) data1 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[1]) data2 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[2]) data3 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[3]) data4 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[4]) data <- c(data1,data2, data3, data4) write.phyDat(data, file="temp.dat", format="sequential", nbcol = -1, colsep = "") unlink("temp.dat") } \seealso{ \code{\link{phyDat}}, \code{\link{pml}}, \code{\link{SOWH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/phangorn-package.Rd0000644000176200001440000000301714134551471016343 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{package} \name{phangorn-package} \alias{phangorn} \alias{phangorn-package} \title{phangorn: Phylogenetic Reconstruction and Analysis} \description{ Allows for estimation of phylogenetic trees and networks using Maximum Likelihood, Maximum Parsimony, distance methods and Hadamard conjugation. Offers methods for tree comparison, model selection and visualization of phylogenetic networks as described in Schliep et al. (2017) . } \seealso{ Useful links: \itemize{ \item \url{https://github.com/KlausVigo/phangorn} \item Report bugs at \url{https://github.com/KlausVigo/phangorn/issues} } } \author{ \strong{Maintainer}: Klaus Schliep \email{klaus.schliep@gmail.com} (\href{https://orcid.org/0000-0003-2941-0161}{ORCID}) Authors: \itemize{ \item Emmanuel Paradis (\href{https://orcid.org/0000-0003-3092-2199}{ORCID}) \item Leonardo de Oliveira Martins (\href{https://orcid.org/0000-0001-5247-1320}{ORCID}) \item Alastair Potts \item Tim W. White } Other contributors: \itemize{ \item Cyrill Stachniss [contributor] \item Michelle Kendall \email{m.kendall@imperial.ac.uk} [contributor] \item Keren Halabi [contributor] \item Richel Bilderbeek [contributor] \item Kristin Winchell [contributor] \item Liam Revell [contributor] \item Mike Gilchrist [contributor] \item Jeremy Beaulieu [contributor] \item Brian O'Meara [contributor] \item Long Qu [contributor] } } \keyword{internal} phangorn/man/read.nexus.splits.Rd0000644000176200001440000000460514140463611016526 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read.nexus.splits.R \name{read.nexus.splits} \alias{read.nexus.splits} \alias{write.nexus.splits} \alias{write.nexus.networx} \alias{read.nexus.networx} \alias{write.splits} \title{Function to import and export splits and networks} \usage{ read.nexus.splits(file) write.nexus.splits(obj, file = "", weights = NULL, taxa = TRUE, append = FALSE) write.nexus.networx(obj, file = "", taxa = TRUE, splits = TRUE, append = FALSE) read.nexus.networx(file, splits = TRUE) write.splits(x, file = "", zero.print = ".", one.print = "|", print.labels = TRUE, ...) } \arguments{ \item{file}{a file name.} \item{obj}{An object of class splits.} \item{weights}{Edge weights.} \item{taxa}{logical. If TRUE a taxa block is added} \item{append}{logical. If TRUE the nexus blocks will be added to a file.} \item{splits}{logical. If TRUE the nexus blocks will be added to a file.} \item{x}{An object of class splits.} \item{zero.print}{character which should be printed for zeros.} \item{one.print}{character which should be printed for ones.} \item{print.labels}{logical. If TRUE labels are printed.} \item{\dots}{Further arguments passed to or from other methods.} \item{labels}{names of taxa.} } \value{ \code{write.nexus.splits} and \code{write.nexus.networx} write out the \code{splits} and \code{networx} object to read with other software like SplitsTree. \code{read.nexus.splits} and \code{read.nexus.networx} return an \code{splits} and \code{networx} object. } \description{ \code{read.nexus.splits}, \code{write.nexus.splits}, \code{read.nexus.networx}, \code{write.nexus.networx} can be used to import and export splits and networks with nexus format and allow to exchange these object with other software like SplitsTree. \code{write.splits} returns a human readable output. } \note{ \code{read.nexus.splits} reads in the splits block of a nexus file. It assumes that different co-variables are tab delimited and the bipartition are separated with white-space. Comments in square brackets are ignored. } \examples{ (sp <- as.splits(rtree(5))) write.nexus.splits(sp) spl <- allCircularSplits(5) plot(as.networx(spl), "2D") write.splits(spl, print.labels = FALSE) } \seealso{ \code{\link{prop.part}}, \code{\link{lento}}, \code{\link{as.splits}}, \code{\link{as.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/parsimony.Rd0000644000176200001440000000732614140462313015157 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ancestral_pml.R, R/fitch64.R, R/parsimony.R, % R/sankoff.R \name{acctran} \alias{acctran} \alias{fitch} \alias{random.addition} \alias{parsimony} \alias{optim.parsimony} \alias{sankoff} \alias{pratchet} \title{Parsimony tree.} \usage{ acctran(tree, data) fitch(tree, data, site = "pscore") random.addition(data, tree = NULL, method = "fitch") parsimony(tree, data, method = "fitch", cost = NULL, site = "pscore") optim.parsimony(tree, data, method = "fitch", cost = NULL, trace = 1, rearrangements = "SPR", ...) pratchet(data, start = NULL, method = "fitch", maxit = 1000, minit = 10, k = 10, trace = 1, all = FALSE, rearrangements = "SPR", perturbation = "ratchet", ...) sankoff(tree, data, cost = NULL, site = "pscore") } \arguments{ \item{tree}{tree to start the nni search from.} \item{data}{A object of class phyDat containing sequences.} \item{site}{return either 'pscore' or 'site' wise parsimony scores.} \item{method}{one of 'fitch' or 'sankoff'.} \item{cost}{A cost matrix for the transitions between two states.} \item{trace}{defines how much information is printed during optimization.} \item{rearrangements}{SPR or NNI rearrangements.} \item{...}{Further arguments passed to or from other methods (e.g. model="sankoff" and cost matrix).} \item{start}{a starting tree can be supplied.} \item{maxit}{maximum number of iterations in the ratchet.} \item{minit}{minimum number of iterations in the ratchet.} \item{k}{number of rounds ratchet is stopped, when there is no improvement.} \item{all}{return all equally good trees or just one of them.} \item{perturbation}{whether to use "ratchet", "random_addition" or "stochastic" (nni) for shuffling the tree.} } \value{ \code{parsimony} returns the maximum parsimony score (pscore). \code{optim.parsimony} returns a tree after NNI rearrangements. \code{pratchet} returns a tree or list of trees containing the best tree(s) found during the search. \code{acctran} returns a tree with edge length according to the ACCTRAN criterion. } \description{ \code{parsimony} returns the parsimony score of a tree using either the sankoff or the fitch algorithm. \code{optim.parsimony} tries to find the maximum parsimony tree using either Nearest Neighbor Interchange (NNI) rearrangements or sub tree pruning and regrafting (SPR). \code{pratchet} implements the parsimony ratchet (Nixon, 1999) and is the preferred way to search for the best tree. \code{random.addition} can be used to produce starting trees. } \details{ The "SPR" rearrangements are so far only available for the "fitch" method, "sankoff" only uses "NNI". The "fitch" algorithm only works correct for binary trees. } \examples{ set.seed(3) data(Laurasiatherian) dm <- dist.hamming(Laurasiatherian) tree <- NJ(dm) parsimony(tree, Laurasiatherian) treeRA <- random.addition(Laurasiatherian) treeNNI <- optim.parsimony(tree, Laurasiatherian) treeRatchet <- pratchet(Laurasiatherian, start=tree, maxit=100, minit=5, k=5, trace=0) # assign edge length treeRatchet <- acctran(treeRatchet, Laurasiatherian) plot(midpoint(treeRatchet)) add.scale.bar(0,0, length=100) parsimony(c(tree,treeNNI, treeRatchet), Laurasiatherian) } \references{ Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Nixon, K. (1999) The Parsimony Ratchet, a New Method for Rapid Parsimony Analysis. \emph{Cladistics} \bold{15}, 407-414 } \seealso{ \code{\link{bab}}, \code{\link{CI}}, \code{\link{RI}}, \code{\link{ancestral.pml}}, \code{\link{nni}}, \code{\link{NJ}}, \code{\link{pml}}, \code{\link{getClans}} ,\code{\link{ancestral.pars}}, \code{\link{bootstrap.pml}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/discrete.gamma.Rd0000644000176200001440000000515214030677772016033 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/discrete.gamma.R \name{discrete.gamma} \alias{discrete.gamma} \alias{plot_gamma_plus_inv} \alias{plotRates} \title{Discrete Gamma function} \usage{ discrete.gamma(alpha, k) plot_gamma_plus_inv(shape = 1, inv = 0, k = 4, discrete = TRUE, cdf = TRUE, append = FALSE, xlab = "x", ylab = ifelse(cdf, "F(x)", "f(x)"), xlim = NULL, verticals = FALSE, edge.length = NULL, site.rate = "gamma", ...) plotRates(obj, cdf.color = "blue", main = "cdf", ...) } \arguments{ \item{alpha}{Shape parameter of the gamma distribution.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{inv}{Proportion of invariable sites.} \item{discrete}{logical whether to plot discrete (default) or continuous pdf or cdf.} \item{cdf}{logical whether to plot the cumulative distribution function or density / probability function.} \item{append}{logical; if TRUE only add to an existing plot.} \item{xlab}{a label for the x axis, defaults to a description of x.} \item{ylab}{a label for the y axis, defaults to a description of y.} \item{xlim}{the x limits of the plot.} \item{verticals}{logical; if TRUE, draw vertical lines at steps.} \item{edge.length}{Total edge length (sum of all edges in a tree).} \item{site.rate}{Indicates what type of gamma distribution to use. Options are "gamma" (Yang 1994) and "gamma_quadrature" using Laguerre quadrature approach of Felsenstein (2001)} \item{\dots}{Further arguments passed to or from other methods.} \item{obj}{an object of class pml} \item{cdf.color}{color of the cdf.} \item{main}{a main title for the plot.} } \value{ \code{discrete.gamma} returns a matrix. } \description{ \code{discrete.gamma} internally used for the likelihood computations in \code{pml} or \code{optim.pml}. It is useful to understand how it works for simulation studies or in cases where . } \details{ These functions are exported to be used in different packages so far only in the package coalescentMCMC, but are not intended for end user. Most of the functions call C code and are far less forgiving if the import is not what they expect than \code{pml}. } \examples{ discrete.gamma(1, 4) old.par <- par(no.readonly = TRUE) par(mfrow = c(2,1)) plot_gamma_plus_inv(shape=2, discrete = FALSE, cdf=FALSE) plot_gamma_plus_inv(shape=2, append = TRUE, cdf=FALSE) plot_gamma_plus_inv(shape=2, discrete = FALSE) plot_gamma_plus_inv(shape=2, append = TRUE) par(old.par) } \seealso{ \code{\link{pml.fit}, \link{stepfun}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/pml.Rd0000644000176200001440000002237614140462313013730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phylo.R \name{pml.control} \alias{pml.control} \alias{pml} \alias{optim.pml} \title{Likelihood of a tree.} \usage{ pml.control(epsilon = 1e-08, maxit = 10, trace = 1, tau = 1e-08) pml(tree, data, bf = NULL, Q = NULL, inv = 0, k = 1, shape = 1, rate = 1, model = NULL, site.rate = "gamma", ...) optim.pml(object, optNni = FALSE, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1L, tau = 1e-08), model = NULL, rearrangement = ifelse(optNni, "NNI", "none"), subs = NULL, ratchet.par = list(iter = 20L, maxit = 200L, minit = 100L, prop = 1/2), ...) } \arguments{ \item{epsilon}{Stop criterion for optimization (see details).} \item{maxit}{Maximum number of iterations (see details).} \item{trace}{Show output during optimization (see details).} \item{tau}{minimal edge length.} \item{tree}{A phylogenetic \code{tree}, object of class \code{phylo}.} \item{data}{An alignment, object of class \code{phyDat}.} \item{bf}{Base frequencies (see details).} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{inv}{Proportion of invariable sites.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{rate}{Rate.} \item{model}{allows to choose an amino acid models or nucleotide model, see details.} \item{site.rate}{Indicates what type of gamma distribution to use. Options are "gamma" approach of Yang 1994 (default), "quadrature" after the Laguerre quadrature approach of Felsenstein 2001 or "freerate".} \item{\dots}{Further arguments passed to or from other methods.} \item{object}{An object of class \code{pml}.} \item{optNni}{Logical value indicating whether topology gets optimized (NNI).} \item{optBf}{Logical value indicating whether base frequencies gets optimized.} \item{optQ}{Logical value indicating whether rate matrix gets optimized.} \item{optInv}{Logical value indicating whether proportion of variable size gets optimized.} \item{optGamma}{Logical value indicating whether gamma rate parameter gets optimized.} \item{optEdge}{Logical value indicating the edge lengths gets optimized.} \item{optRate}{Logical value indicating the overall rate gets optimized.} \item{optRooted}{Logical value indicating if the edge lengths of a rooted tree get optimized.} \item{control}{A list of parameters for controlling the fitting process.} \item{rearrangement}{type of tree tree rearrangements to perform, one of "none", "NNI", "stochastic" or "ratchet"} \item{subs}{A (integer) vector same length as Q to specify the optimization of Q} \item{ratchet.par}{search parameter for stochastic search} } \value{ \code{pml} or \code{optim.pml} return a list of class \code{pml}, some are useful for further computations like \item{tree}{the phylogenetic tree.} \item{data}{the alignment.} \item{logLik}{Log-likelihood of the tree.} \item{siteLik}{Site log-likelihoods.} \item{weight}{Weight of the site patterns.} } \description{ \code{pml} computes the likelihood of a phylogenetic tree given a sequence alignment and a model. \code{optim.pml} optimizes the different model parameters. } \details{ Base frequencies in \code{pml} can be supplied in different ways. For amino acid they are usually defined through specifying a model, so the argument bf does not need to be specified. Otherwise if \code{bf=NULL}, each state is given equal probability. It can be a numeric vector given the frequencies. Last but not least \code{bf} can be string "equal", "empirical" and for codon models additionally "F3x4". The topology search uses a nearest neighbor interchange (NNI) and the implementation is similar to phyML. The option model in pml is only used for amino acid models. The option model defines the nucleotide model which is getting optimized, all models which are included in modeltest can be chosen. Setting this option (e.g. "K81" or "GTR") overrules options optBf and optQ. Here is a overview how to estimate different phylogenetic models with \code{pml}: \tabular{lll}{ model \tab optBf \tab optQ \cr Jukes-Cantor \tab FALSE \tab FALSE \cr F81 \tab TRUE \tab FALSE \cr symmetric \tab FALSE \tab TRUE \cr GTR \tab TRUE \tab TRUE } Via model in optim.pml the following nucleotide models can be specified: JC, F81, K80, HKY, TrNe, TrN, TPM1, K81, TPM1u, TPM2, TPM2u, TPM3, TPM3u, TIM1e, TIM1, TIM2e, TIM2, TIM3e, TIM3, TVMe, TVM, SYM and GTR. These models are specified as in Posada (2008). So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff_DCMut" and "JTT_DCMut") and additionally rate matrices and amino acid frequencies can be supplied. It is also possible to estimate codon models (e.g. YN98), for details see also the chapter in vignette("phangorn-specials"). If the option 'optRooted' is set to TRUE than the edge lengths of rooted tree are optimized. The tree has to be rooted and by now ultrametric! Optimising rooted trees is generally much slower. \code{pml.control} controls the fitting process. \code{epsilon} and \code{maxit} are only defined for the most outer loop, this affects \code{pmlCluster}, \code{pmlPart} and \code{pmlMix}. \code{epsilon} is defined as (logLik(k)-logLik(k+1))/logLik(k+1), this seems to be a good heuristics which works reasonably for small and large trees or alignments. If \code{trace} is set to zero than no out put is shown, if functions are called internally than the trace is decreased by one, so a higher of trace produces more feedback. If \code{rearrangement} is set to \code{stochastic} a stochastic search algorithm similar to Nguyen et al. (2015). and for \code{ratchet} the likelihood ratchet as in Vos (2003). This should helps often to find better tree topologies, especially for larger trees. } \examples{ example(NJ) # Jukes-Cantor (starting tree from NJ) fitJC <- pml(tree, Laurasiatherian) # optimize edge length parameter fitJC <- optim.pml(fitJC) fitJC \dontrun{ # search for a better tree using NNI rearrangements fitJC <- optim.pml(fitJC, optNni=TRUE) fitJC plot(fitJC$tree) # JC + Gamma + I - model fitJC_GI <- update(fitJC, k=4, inv=.2) # optimize shape parameter + proportion of invariant sites fitJC_GI <- optim.pml(fitJC_GI, optGamma=TRUE, optInv=TRUE) # GTR + Gamma + I - model fitGTR <- optim.pml(fitJC_GI, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") } # 2-state data (RY-coded) dat <- acgt2ry(Laurasiatherian) fit2ST <- pml(tree, dat) fit2ST <- optim.pml(fit2ST,optNni=TRUE) fit2ST # show some of the methods available for class pml methods(class="pml") } \references{ Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a maximum likelihood approach. \emph{Journal of Molecular Evolution}, \bold{17}, 368--376. Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, Sunderland. Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University Press, Oxford. Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa (2000) Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast DNA. \emph{Journal of Molecular Evolution}, \bold{50}, 348--358 Rota-Stabelli, O., Z. Yang, and M. Telford. (2009) MtZoa: a general mitochondrial amino acid substitutions model for animal evolutionary studies. \emph{Mol. Phyl. Evol}, \bold{52(1)}, 268--72 Whelan, S. and Goldman, N. (2001) A general empirical model of protein evolution derived from multiple protein families using a maximum-likelihood approach. \emph{Molecular Biology and Evolution}, \bold{18}, 691--699 Le, S.Q. and Gascuel, O. (2008) LG: An Improved, General Amino-Acid Replacement Matrix \emph{Molecular Biology and Evolution}, \bold{25(7)}, 1307--1320 Yang, Z., R. Nielsen, and M. Hasegawa (1998) Models of amino acid substitution and applications to Mitochondrial protein evolution. \emph{Molecular Biology and Evolution}, \bold{15}, 1600--1611 Abascal, F., D. Posada, and R. Zardoya (2007) MtArt: A new Model of amino acid replacement for Arthropoda. \emph{Molecular Biology and Evolution}, \bold{24}, 1--5 Kosiol, C, and Goldman, N (2005) Different versions of the Dayhoff rate matrix - \emph{Molecular Biology and Evolution}, \bold{22}, 193--199 L.-T. Nguyen, H.A. Schmidt, A. von Haeseler, and B.Q. Minh (2015) IQ-TREE: A fast and effective stochastic algorithm for estimating maximum likelihood phylogenies. \emph{Molecular Biology and Evolution}, \bold{32}, 268--274. Vos, R. A. (2003) Accelerated Likelihood Surface Exploration: The Likelihood Ratchet. \emph{Systematic Biology}, \bold{52(3)}, 368--373 Yang, Z., and R. Nielsen (1998) Synonymous and nonsynonymous rate variation in nuclear genes of mammals. \emph{Journal of Molecular Evolution}, \bold{46}, 409-418. Lewis, P.O. (2001) A likelihood approach to estimating phylogeny from discrete morphological character data. \emph{Systematic Biology} \bold{50}, 913--925. } \seealso{ \code{\link{bootstrap.pml}}, \code{\link{modelTest}}, \code{\link{pmlPart}}, \code{\link{pmlMix}}, \code{\link{plot.phylo}}, \code{\link{SH.test}}, \code{\link{ancestral.pml}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/upgma.Rd0000644000176200001440000000201113707232051014233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{upgma} \alias{upgma} \alias{wpgma} \title{UPGMA and WPGMA} \usage{ upgma(D, method = "average", ...) wpgma(D, method = "mcquitty", ...) } \arguments{ \item{D}{A distance matrix.} \item{method}{The agglomeration method to be used. This should be (an unambiguous abbreviation of) one of "ward", "single", "complete", "average", "mcquitty", "median" or "centroid". The default is "average".} \item{\dots}{Further arguments passed to or from other methods.} } \value{ A phylogenetic tree of class \code{phylo}. } \description{ UPGMA and WPGMA clustering. Just a wrapper function around \code{\link[stats]{hclust}}. } \examples{ data(Laurasiatherian) dm <- dist.ml(Laurasiatherian) tree <- upgma(dm) plot(tree) } \seealso{ \code{\link{hclust}}, \code{\link{dist.hamming}}, \code{\link{NJ}}, \code{\link{as.phylo}}, \code{\link{fastme}}, \code{\link{nnls.tree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/NJ.Rd0000644000176200001440000000233413707232051013441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distTree.R \name{NJ} \alias{NJ} \alias{UNJ} \title{Neighbor-Joining} \usage{ NJ(x) UNJ(x) } \arguments{ \item{x}{A distance matrix.} } \value{ an object of class \code{"phylo"}. } \description{ This function performs the neighbor-joining tree estimation of Saitou and Nei (1987). UNJ is the unweighted version from Gascuel (1997). } \examples{ data(Laurasiatherian) dm <- dist.ml(Laurasiatherian) tree <- NJ(dm) plot(tree) } \references{ Saitou, N. and Nei, M. (1987) The neighbor-joining method: a new method for reconstructing phylogenetic trees. \emph{Molecular Biology and Evolution}, \bold{4}, 406--425. Studier, J. A and Keppler, K. J. (1988) A Note on the Neighbor-Joining Algorithm of Saitou and Nei. \emph{Molecular Biology and Evolution}, \bold{6}, 729--731. Gascuel, O. (1997) Concerning the NJ algorithm and its unweighted version, UNJ. in Birkin et. al. \emph{Mathematical Hierarchies and Biology}, 149--170. } \seealso{ \code{\link[ape]{nj}}, \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}}, \code{\link[phangorn]{upgma}}, \code{\link[ape]{fastme}} } \author{ Klaus P. Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/dist.hamming.Rd0000644000176200001440000000531614130613657015525 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distSeq.R \name{dist.hamming} \alias{dist.hamming} \alias{dist.ml} \alias{dist.logDet} \title{Pairwise Distances from Sequences} \usage{ dist.hamming(x, ratio = TRUE, exclude = "none") dist.ml(x, model = "JC69", exclude = "none", bf = NULL, Q = NULL, k = 1L, shape = 1, ...) dist.logDet(x) } \arguments{ \item{x}{An object of class \code{phyDat}} \item{ratio}{Compute uncorrected ('p') distance or character difference.} \item{exclude}{One of "none", "all", "pairwise" indicating whether to delete the sites with missing data (or ambiguous states). The default is handle missing data as in pml.} \item{model}{One of "JC69", "F81" or one of 17 amino acid models see details.} \item{bf}{A vector of base frequencies.} \item{Q}{A vector containing the lower triangular part of the rate matrix.} \item{k}{Number of intervals of the discrete gamma distribution.} \item{shape}{Shape parameter of the gamma distribution.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ an object of class \code{dist} } \description{ \code{dist.hamming}, \code{dist.ml} and \code{dist.logDet} compute pairwise distances for an object of class \code{phyDat}. \code{dist.ml} uses DNA / AA sequences to compute distances under different substitution models. } \details{ So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff_DCMut" and "JTT_DCMut") and additional rate matrices and frequencies can be supplied. The "F81" model uses empirical base frequencies, the "JC69" equal base frequencies. This is even the case if the data are not nucleotides. } \examples{ data(Laurasiatherian) dm1 <- dist.hamming(Laurasiatherian) tree1 <- NJ(dm1) dm2 <- dist.logDet(Laurasiatherian) tree2 <- NJ(dm2) treedist(tree1,tree2) # JC model dm3 <- dist.ml(Laurasiatherian) tree3 <- NJ(dm3) treedist(tree1,tree3) # F81 + Gamma dm4 <- dist.ml(Laurasiatherian, model="F81", k=4, shape=.4) tree4 <- NJ(dm4) treedist(tree1,tree4) treedist(tree3,tree4) } \references{ Lockhart, P. J., Steel, M. A., Hendy, M. D. and Penny, D. (1994) Recovering evolutionary trees under a more realistic model of sequence evolution. \emph{Molecular Biology and Evolution}, \bold{11}, 605--602. Jukes TH and Cantor CR (1969). \emph{Evolution of Protein Molecules}. New York: Academic Press. 21--132. } \seealso{ For more distance methods for nucleotide data see \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise polymorphism p-distances. \code{\link{writeDist}} for export and import distances. } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/Laurasiatherian.Rd0000644000176200001440000000073514107670671016262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{Laurasiatherian} \alias{Laurasiatherian} \title{Laurasiatherian data (AWCMEE)} \source{ Data have been taken from the former repository of the Allan Wilson Centre and were converted to R format by \email{klaus.schliep@gmail.com}. } \description{ Laurasiatherian RNA sequence data } \examples{ data(Laurasiatherian) str(Laurasiatherian) } \keyword{datasets} phangorn/man/lento.Rd0000644000176200001440000000257413707232051014261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lento.R \name{lento} \alias{lento} \title{Lento plot} \usage{ lento(obj, xlim = NULL, ylim = NULL, main = "Lento plot", sub = NULL, xlab = NULL, ylab = NULL, bipart = TRUE, trivial = FALSE, col = rgb(0, 0, 0, 0.5), ...) } \arguments{ \item{obj}{an object of class phylo, multiPhylo or splits} \item{xlim}{graphical parameter} \item{ylim}{graphical parameter} \item{main}{graphical parameter} \item{sub}{graphical parameter} \item{xlab}{graphical parameter} \item{ylab}{graphical parameter} \item{bipart}{plot bipartition information.} \item{trivial}{logical, whether to present trivial splits (default is FALSE).} \item{col}{color for the splits / bipartition.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ lento returns a plot. } \description{ The lento plot represents support and conflict of splits/bipartitions. } \examples{ data(yeast) yeast.ry <- acgt2ry(yeast) splits.h <- h2st(yeast.ry) lento(splits.h, trivial=TRUE) } \references{ Lento, G.M., Hickson, R.E., Chambers G.K., and Penny, D. (1995) Use of spectral analysis to test hypotheses on the origin of pinninpeds. \emph{Molecular Biology and Evolution}, \bold{12}, 28-52. } \seealso{ \code{\link{as.splits}, \link{hadamard}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} \keyword{plot} phangorn/man/bootstrap.pml.Rd0000644000176200001440000000666014013023424015735 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bootstrap.R \name{bootstrap.pml} \alias{bootstrap.pml} \alias{bootstrap.phyDat} \title{Bootstrap} \usage{ bootstrap.pml(x, bs = 100, trees = TRUE, multicore = FALSE, mc.cores = NULL, ...) bootstrap.phyDat(x, FUN, bs = 100, multicore = FALSE, mc.cores = NULL, jumble = TRUE, ...) } \arguments{ \item{x}{an object of class \code{pml} or \code{phyDat}.} \item{bs}{number of bootstrap samples.} \item{trees}{return trees only (default) or whole \code{pml} objects.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use during bootstrap. Only supported on UNIX-alike systems.} \item{\dots}{further parameters used by \code{optim.pml} or \code{plot.phylo}.} \item{FUN}{the function to estimate the trees.} \item{jumble}{logical, jumble the order of the sequences.} } \value{ \code{bootstrap.pml} returns an object of class \code{multi.phylo} or a list where each element is an object of class \code{pml}. \code{plotBS} returns silently a tree, i.e. an object of class \code{phylo} with the bootstrap values as node labels. The argument \code{BStrees} is optional and if not supplied the tree with labels supplied in the \code{node.label} slot. } \description{ \code{bootstrap.pml} performs (non-parametric) bootstrap analysis and \code{bootstrap.phyDat} produces a list of bootstrapped data sets. \code{plotBS} plots a phylogenetic tree with the bootstrap values assigned to the (internal) edges. } \details{ It is possible that the bootstrap is performed in parallel, with help of the multicore package. Unfortunately the multicore package does not work under windows or with GUI interfaces ("aqua" on a mac). However it will speed up nicely from the command line ("X11"). } \examples{ \dontrun{ data(Laurasiatherian) dm <- dist.hamming(Laurasiatherian) tree <- NJ(dm) # NJ set.seed(123) NJtrees <- bootstrap.phyDat(Laurasiatherian, FUN=function(x)NJ(dist.hamming(x)), bs=100) treeNJ <- plotBS(tree, NJtrees, "phylogram") # Maximum likelihood fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit, rearrangement="NNI") set.seed(123) bs <- bootstrap.pml(fit, bs=100, optNni=TRUE) treeBS <- plotBS(fit$tree,bs) # Maximum parsimony treeMP <- pratchet(Laurasiatherian) treeMP <- acctran(treeMP, Laurasiatherian) set.seed(123) BStrees <- bootstrap.phyDat(Laurasiatherian, pratchet, bs = 100) treeMP <- plotBS(treeMP, BStrees, "phylogram") add.scale.bar() # export tree with bootstrap values as node labels # write.tree(treeBS) } } \references{ Felsenstein J. (1985) Confidence limits on phylogenies. An approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 Lemoine, F., Entfellner, J. B. D., Wilkinson, E., Correia, D., Felipe, M. D., De Oliveira, T., & Gascuel, O. (2018). Renewing Felsenstein’s phylogenetic bootstrap in the era of big data. \emph{Nature}, \bold{556(7702)}, 452--456. Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree construction. \emph{Cladistics} \bold{1}, 266--278 Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 } \seealso{ \code{\link{optim.pml}}, \code{\link{pml}}, \code{\link{plot.phylo}}, \code{\link{maxCladeCred}} \code{\link{nodelabels}},\code{\link{consensusNet}} and \code{\link{SOWH.test}} for parametric bootstrap } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/phangorn-internal.Rd0000644000176200001440000000101113707232051016547 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R, R/networx.R, % R/phangorn-package.R, R/phyDat.R, R/pmlPen.R \name{threshStateC} \alias{threshStateC} \alias{coords} \alias{phangorn-internal} \alias{map_duplicates} \alias{pmlPen} \title{Internal phangorn Functions} \usage{ threshStateC(x, thresholds) coords(obj, dim = "3D") map_duplicates(x, dist = length(x) < 500, ...) pmlPen(object, lambda, ...) } \description{ Internal \pkg{phangorn} functions. } \keyword{internal} phangorn/man/midpoint.Rd0000644000176200001440000000343714140465255014770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{getRoot} \alias{getRoot} \alias{midpoint} \alias{midpoint.phylo} \alias{midpoint.multiPhylo} \alias{pruneTree} \title{Tree manipulation} \usage{ getRoot(tree) midpoint(tree, node.labels = "support", ...) \method{midpoint}{phylo}(tree, node.labels = "support", ...) \method{midpoint}{multiPhylo}(tree, node.labels = "support", ...) pruneTree(tree, ..., FUN = ">=") } \arguments{ \item{tree}{an object of class \code{phylo}.} \item{node.labels}{are node labels 'support' values (edges), 'label' or should labels get 'deleted'?} \item{\dots}{further arguments, passed to other methods.} \item{FUN}{a function evaluated on the nodelabels, result must be logical.} } \value{ \code{pruneTree} and \code{midpoint} a tree. \code{getRoot} returns the root node. } \description{ \code{midpoint} performs midpoint rooting of a tree. \code{pruneTree} produces a consensus tree. } \details{ \code{pruneTree} prunes back a tree and produces a consensus tree, for trees already containing nodelabels. It assumes that nodelabels are numerical or character that allows conversion to numerical, it uses as.numeric(as.character(tree$node.labels)) to convert them. \code{midpoint} so far does not transform node.labels properly. } \examples{ tree <- rtree(10, rooted = FALSE) tree$node.label <- c("", round(runif(tree$Nnode-1), 3)) tree2 <- midpoint(tree) tree3 <- pruneTree(tree, .5) old.par <- par(no.readonly = TRUE) par(mfrow = c(3,1)) plot(tree, show.node.label=TRUE) plot(tree2, show.node.label=TRUE) plot(tree3, show.node.label=TRUE) par(old.par) } \seealso{ \code{\link[ape]{consensus}}, \code{\link[ape]{root}}, \code{\link[ape]{multi2di}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/maxCladeCred.Rd0000644000176200001440000000444214074005750015452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bootstrap.R \name{maxCladeCred} \alias{maxCladeCred} \alias{mcc} \alias{allCompat} \title{Maximum clade credibility tree} \usage{ maxCladeCred(x, tree = TRUE, part = NULL, rooted = TRUE) mcc(x, tree = TRUE, part = NULL, rooted = TRUE) allCompat(x) } \arguments{ \item{x}{\code{x} is an object of class \code{multiPhylo} or \code{phylo}} \item{tree}{logical indicating whether return the tree with the clade credibility (default) or the clade credibility score for all trees.} \item{part}{a list of partitions as returned by \code{prop.part}} \item{rooted}{logical, if FALSE the tree with highest maximum bipartition credibility is returned.} } \value{ a tree (an object of class \code{phylo}) with the highest clade credibility or a numeric vector of clade credibilities for each tree. } \description{ \code{maxCladeCred} computes the maximum clade credibility tree from a sample of trees. } \details{ So far just the best tree is returned. No annotations or transformations of edge length are performed. If a list of partition is provided then the clade credibility is computed for the trees in x. \code{allCompat} returns a 50% majority rule consensus tree with added compatible splits similar to the option allcompat in MrBayes. } \examples{ data(Laurasiatherian) set.seed(42) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)upgma(dist.hamming(x)), bs=100) strict_consensus <- consensus(bs) majority_consensus <- consensus(bs, p=.5) all_compat <- allCompat(bs) max_clade_cred <- maxCladeCred(bs) old.par <- par(no.readonly = TRUE) par(mfrow = c(2,2), mar = c(1,4,1,1)) plot(strict_consensus, main="Strict consensus tree") plot(majority_consensus, main="Majority consensus tree") plot(all_compat, main="Majority consensus tree with compatible splits") plot(max_clade_cred, main="Maximum clade credibility tree") par(old.par) # compute clade credibility for trees given a prop.part object pp <- prop.part(bs) tree <- rNNI(bs[[1]], 20) maxCladeCred(c(tree, bs[[1]]), tree=FALSE, part = pp) # first value likely be -Inf } \seealso{ \code{\link{consensus}}, \code{\link{consensusNet}}, \code{\link{prop.part}}, \code{\link{bootstrap.pml}}, \code{\link{plotBS}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/chloroplast.Rd0000644000176200001440000000050313707232051015460 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{chloroplast} \alias{chloroplast} \title{Chloroplast alignment} \description{ Amino acid alignment of 15 genes of 19 different chloroplast. } \examples{ data(chloroplast) chloroplast } \keyword{datasets} phangorn/man/modelTest.Rd0000644000176200001440000000602213707232051015070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/modelTest.R \name{modelTest} \alias{modelTest} \alias{AICc} \title{ModelTest} \usage{ modelTest(object, tree = NULL, model = c("JC", "F81", "K80", "HKY", "SYM", "GTR"), G = TRUE, I = TRUE, FREQ = FALSE, k = 4, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), multicore = FALSE, mc.cores = NULL) } \arguments{ \item{object}{an object of class phyDat or pml} \item{tree}{a phylogenetic tree.} \item{model}{a vector containing the substitution models to compare with each other or "all" to test all available models} \item{G}{logical, TRUE (default) if (discrete) Gamma model should be tested} \item{I}{logical, TRUE (default) if invariant sites should be tested} \item{FREQ}{logical, FALSE (default) if TRUE amino acid frequencies will be estimated.} \item{k}{number of rate classes} \item{control}{A list of parameters for controlling the fitting process.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use, i.e. at most how many child processes will be run simultaneously. Must be at least one, and parallelization requires at least two cores.} } \value{ A data.frame containing the log-likelihood, number of estimated parameters, AIC, AICc and BIC all tested models. The data.frame has an attributes "env" which is an environment which contains all the trees, the data and the calls to allow get the estimated models, e.g. as a starting point for further analysis (see example). } \description{ Comparison of different nucleotide or amino acid substitution models } \details{ \code{modelTest} estimates all the specified models for a given tree and data. When the mclapply is available, the computations are done in parallel. \code{modelTest} runs each model in one thread. This is may not work within a GUI interface and will not work under Windows. } \examples{ \dontrun{ example(NJ) (mT <- modelTest(Laurasiatherian, tree)) # some R magic env <- attr(mT, "env") ls(env=env) (F81 <- get("F81+G", env)) # a call eval(F81, env=env) data(chloroplast) (mTAA <- modelTest(chloroplast, model=c("JTT", "WAG", "LG"))) # test all available amino acid models (mTAA_all <- modelTest(chloroplast, model="all", multicore=TRUE, mc.cores=2)) } } \references{ Burnham, K. P. and Anderson, D. R (2002) \emph{Model selection and multimodel inference: a practical information-theoretic approach}. 2nd ed. Springer, New York Posada, D. and Crandall, K.A. (1998) MODELTEST: testing the model of DNA substitution. \emph{Bioinformatics} \bold{14(9)}: 817-818 Posada, D. (2008) jModelTest: Phylogenetic Model Averaging. \emph{Molecular Biology and Evolution} \bold{25}: 1253-1256 Darriba D., Taboada G.L., Doallo R and Posada D. (2011) ProtTest 3: fast selection of best-fit models of protein evolution. . \emph{Bioinformatics} \bold{27}: 1164-1165 } \seealso{ \code{\link{pml}}, \code{\link{anova}}, \code{\link[stats]{AIC}}, \code{\link{codonTest}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/identify.networx.Rd0000644000176200001440000000201313707232051016444 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{identify.networx} \alias{identify.networx} \title{Identify splits in a network} \usage{ \method{identify}{networx}(x, quiet = FALSE, ...) } \arguments{ \item{x}{an object of class \code{networx}} \item{quiet}{a logical controlling whether to print a message inviting the user to click on the tree.} \item{\dots}{further arguments to be passed to or from other methods.} } \value{ \code{identify.networx} returns a splits object. } \description{ \code{identify.networx} reads the position of the graphics pointer when the mouse button is pressed. It then returns the split belonging to the edge closest to the pointer. The network must be plotted beforehand. } \examples{ \dontrun{ data(yeast) dm <- dist.ml(yeast) nnet <- neighborNet(dm) plot(nnet, "2D") identify(nnet) # click close to an edge } } \seealso{ \code{\link[phangorn]{plot.networx}}, \code{\link[graphics]{identify}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } phangorn/man/superTree.Rd0000644000176200001440000000444613775657504015141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/superTree.R \name{superTree} \alias{superTree} \title{Super Tree methods} \usage{ superTree(tree, method = "MRP", rooted = FALSE, trace = 0, start = NULL, multicore = FALSE, mc.cores = NULL, ...) } \arguments{ \item{tree}{an object of class \code{multiPhylo}} \item{method}{An argument defining which algorithm is used to optimize the tree. Possible are "MRP", "RF", and "SPR".} \item{rooted}{should the resulting supertrees be rooted.} \item{trace}{defines how much information is printed during optimization.} \item{start}{a starting tree can be supplied.} \item{multicore}{logical, whether models should estimated in parallel.} \item{mc.cores}{The number of cores to use, i.e. at most how many child processes will be run simultaneously.} \item{\dots}{further arguments passed to or from other methods.} } \value{ The function returns an object of class \code{phylo}. } \description{ These function \code{superTree} allows the estimation of a supertree from a set of trees using either Matrix representation parsimony, Robinson-Foulds or SPR as criterion. } \details{ The function \code{superTree} extends the function mrp.supertree from Liam Revells, with artificial adding an outgroup on the root of the trees. This allows to root the supertree afterwards. The functions is internally used in DensiTree. The implementation for the RF- and SPR-supertree are very basic so far and assume that all trees share the same set of taxa. } \examples{ data(Laurasiatherian) set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x) upgma(dist.hamming(x)), bs=50) mrp_st <- superTree(bs) plot(mrp_st) \dontrun{ rf_st <- superTree(bs, method = "RF") spr_st <- superTree(bs, method = "SPR") } } \references{ Baum, B. R., (1992) Combining trees as a way of combining data sets for phylogenetic inference, and the desirability of combining gene trees. \emph{Taxon}, \bold{41}, 3-10. Ragan, M. A. (1992) Phylogenetic inference based on matrix representation of trees. \emph{Molecular Phylogenetics and Evolution}, \bold{1}, 53-58. } \seealso{ \code{mrp.supertree}, \code{\link{densiTree}}, \code{\link{RF.dist}}, \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} Liam Revell } \keyword{cluster} phangorn/man/CI.Rd0000644000176200001440000000217613707232051013431 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parsimony.R \name{CI} \alias{CI} \alias{RI} \title{Consistency Index and Retention Index} \usage{ CI(tree, data, cost = NULL, sitewise = FALSE) RI(tree, data, cost = NULL, sitewise = FALSE) } \arguments{ \item{tree}{tree to start the nni search from.} \item{data}{A object of class phyDat containing sequences.} \item{cost}{A cost matrix for the transitions between two states.} \item{sitewise}{return CI/RI for alignment or sitewise} } \description{ \code{CI} and \code{RI} compute the Consistency Index (CI) and Retention Index (RI). } \details{ The Consistency Index is defined as minimum number of changes divided by the number of changes required on the tree (parsimony score). The Consistency Index is equal to one if there is no homoplasy. And the Retention Index is defined as \deqn{RI = \frac{MaxChanges - ObsChanges}{MaxChanges - MinChanges}}{RI = (MaxChanges - ObsChanges) / (MaxChanges - MinChanges)} } \seealso{ \code{\link{parsimony}}, \code{\link{pratchet}}, \code{\link{fitch}}, \code{\link{sankoff}}, \code{\link{bab}}, \code{\link{ancestral.pars}} } phangorn/man/addConfidences.Rd0000644000176200001440000000352613775174601016042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{createLabel} \alias{createLabel} \alias{addConfidences} \alias{addConfidences.phylo} \alias{presenceAbsence} \title{Compare splits and add support values to an object} \usage{ createLabel(x, y, label_y, type = "edge", nomatch = NA) addConfidences(x, y, ...) \method{addConfidences}{phylo}(x, y, ...) presenceAbsence(x, y) } \arguments{ \item{x}{an object of class \code{splits}, \code{phylo} or \code{networx}} \item{y}{an object of class \code{splits}, \code{phylo}, \code{multiPhylo} or \code{networx}} \item{label_y}{label of y matched on x. Will be usually of length(as.splits(x)).} \item{type}{should labels returned for edges (in \code{networx}) or splits.} \item{nomatch}{default value if no match between x and y is found.} \item{...}{Further arguments passed to or from other methods.} } \value{ The object \code{x} with added bootstrap / MCMC support values. } \description{ Add support values to a \code{splits}, \code{phylo} or \code{networx} object. } \examples{ data(woodmouse) woodmouse <- phyDat(woodmouse) tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) boot_trees <- read.tree(tmpfile) dm <- dist.ml(woodmouse) tree <- upgma(dm) nnet <- neighborNet(dm) tree <- addConfidences(tree, boot_trees) nnet <- addConfidences(nnet, boot_trees) plot(tree, show.node.label=TRUE) plot(nnet, "2D", show.edge.label=TRUE) } \references{ Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{as.splits}}, \code{\link{as.networx}}, \code{\link{RF.dist}}, \code{\link{plot.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/plotBS.Rd0000644000176200001440000000642714042563015014344 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bootstrap.R \name{plotBS} \alias{plotBS} \title{Plotting trees with bootstrap values} \usage{ plotBS(tree, BStrees, type = "unrooted", method = "FBP", bs.col = "black", bs.adj = NULL, digits = 3, p = 0, frame = "none", ...) } \arguments{ \item{tree}{The tree on which edges the bootstrap values are plotted.} \item{BStrees}{a list of trees (object of class "multiPhylo").} \item{type}{the type of tree to plot, one of "phylogram", "cladogram", "fan", "unrooted", "radial" or "none". If type is "none" the tree is returned with the bootstrap values assigned to the node labels.} \item{method}{either "FBP" the classical bootstrap (default) or "TBE" (transfer bootstrap)} \item{bs.col}{color of bootstrap support labels.} \item{bs.adj}{one or two numeric values specifying the horizontal and vertical justification of the bootstrap labels.} \item{digits}{integer indicating the number of decimal places.} \item{p}{only plot support values higher than this percentage number (default is 0).} \item{frame}{a character string specifying the kind of frame to be printed around the bootstrap values. This must be one of "none" (the default), "rect" or "circle".} \item{\dots}{further parameters used by \code{plot.phylo}.} } \value{ \code{plotBS} returns silently a tree, i.e. an object of class \code{phylo} with the bootstrap values as node labels. The argument \code{BStrees} is optional and if not supplied the labels supplied in the \code{node.label} slot will be used. } \description{ \code{plotBS} plots a phylogenetic tree with the bootstrap values assigned to the (internal) edges. It can also used to assign bootstrap values to a phylogenetic tree. } \details{ \code{plotBS} can either assign the classical Felsenstein’s bootstrap proportions (FBP) (Felsenstein (1985), Hendy & Penny (1985)) or the transfer bootstrap expectation (TBE) of Lemoine et al. (2018). Using the option \code{type=="n"} just assigns the bootstrap values and return the tree without plotting it. } \examples{ fdir <- system.file("extdata/trees", package = "phangorn") # RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) # RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) par(mfrow=c(1,2)) plotBS(raxml.tree, raxml.bootstrap, "p") plotBS(raxml.tree, raxml.bootstrap, "p", "TBE") } \references{ Felsenstein J. (1985) Confidence limits on phylogenies. An approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 Lemoine, F., Entfellner, J. B. D., Wilkinson, E., Correia, D., Felipe, M. D., De Oliveira, T., & Gascuel, O. (2018). Renewing Felsenstein’s phylogenetic bootstrap in the era of big data. \emph{Nature}, \bold{556(7702)}, 452--456. Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree construction. \emph{Cladistics} \bold{1}, 266--278 Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 } \seealso{ \code{\link{plot.phylo}}, \code{\link{maxCladeCred}} \code{\link{nodelabels}}, \code{\link{consensus}}, \code{\link{consensusNet}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } phangorn/man/neighborNet.Rd0000644000176200001440000000227413707232051015401 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/neighborNet.R \name{neighborNet} \alias{neighborNet} \title{Computes a neighborNet from a distance matrix} \usage{ neighborNet(x, ord = NULL) } \arguments{ \item{x}{a distance matrix.} \item{ord}{a circular ordering.} } \value{ \code{neighborNet} returns an object of class networx. } \description{ Computes a neighborNet, i.e. an object of class \code{networx} from a distance matrix. } \details{ \code{neighborNet} is still experimental. The cyclic ordering sometimes differ from the SplitsTree implementation, the \emph{ord} argument can be used to enforce a certain circular ordering. } \examples{ data(yeast) dm <- dist.ml(yeast) nnet <- neighborNet(dm) plot(nnet, "2D") } \references{ Bryant, D. & Moulton, V. (2004) Neighbor-Net: An Agglomerative Method for the Construction of Phylogenetic Networks. \emph{Molecular Biology and Evolution}, 2004, \bold{21}, 255-265 } \seealso{ \code{\link{splitsNetwork}}, \code{\link{consensusNet}}, \code{\link{plot.networx}}, \code{\link{lento}}, \code{\link{cophenetic.networx}}, \code{\link{distanceHadamard}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{hplot} phangorn/man/coalSpeciesTree.Rd0000644000176200001440000000222513707232051016203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Coalescent.R \name{coalSpeciesTree} \alias{coalSpeciesTree} \title{Species Tree} \usage{ coalSpeciesTree(tree, X = NULL, sTree = NULL) } \arguments{ \item{tree}{an object of class \code{multiPhylo}} \item{X}{A \code{phyDat} object to define which individual belongs to which species.} \item{sTree}{A species tree which fixes the topology.} } \value{ The function returns an object of class \code{phylo}. } \description{ \code{coalSpeciesTree} estimates species trees and can handle multiple individuals per species. } \details{ \code{coalSpeciesTree} estimates a single linkage tree as suggested by Liu et al. (2010) from the element wise minima of the cophenetic matrices of the gene trees. It extends \code{speciesTree} in ape as it allows that have several individuals per gene tree. } \references{ Liu, L., Yu, L. and Pearl, D. K. (2010) Maximum tree: a consistent estimator of the species tree. \emph{Journal of Mathematical Biology}, \bold{60}, 95--106. } \seealso{ \code{\link{speciesTree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} Emmanuel Paradies } \keyword{cluster} phangorn/man/getClans.Rd0000644000176200001440000001456613707232051014704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clanistic.R \name{getClans} \alias{getClans} \alias{getSlices} \alias{getClips} \alias{getDiversity} \alias{summary.clanistics} \alias{diversity} \title{Clans, slices and clips} \usage{ getClans(tree) getSlices(tree) getClips(tree, all = TRUE) getDiversity(tree, x, norm = TRUE, var.names = NULL, labels = "new") \method{summary}{clanistics}(object, ...) diversity(tree, X) } \arguments{ \item{tree}{An object of class phylo or multiPhylo (getDiversity).} \item{all}{A logical, return all or just the largest clip.} \item{x}{An object of class phyDat.} \item{norm}{A logical, return Equitability Index (default) or Shannon Diversity.} \item{var.names}{A vector of variable names.} \item{labels}{see details.} \item{object}{an object for which a summary is desired.} \item{...}{Further arguments passed to or from other methods.} \item{X}{a data.frame} } \value{ getClans, getSlices and getClips return a matrix of partitions, a matrix of ones and zeros where rows correspond to a clan, slice or clip and columns to tips. A one indicates that a tip belongs to a certain partition. \cr getDiversity returns a list with tree object, the first is a data.frame of the equitability index or Shannon divergence and parsimony scores (p-score) for all trees and variables. The data.frame has two attributes, the first is a splits object to identify the taxa of each tree and the second is a splits object containing all partitions that perfectly fit. } \description{ Functions for clanistics to compute clans, slices, clips for unrooted trees and functions to quantify the fragmentation of trees. } \details{ Every split in an unrooted tree defines two complementary clans. Thus for an unrooted binary tree with \eqn{n} leaves there are \eqn{2n - 3} edges, and therefore \eqn{4n - 6} clans (including \eqn{n} trivial clans containing only one leave). Slices are defined by a pair of splits or tripartitions, which are not clans. The number of distinguishable slices for a binary tree with \eqn{n} tips is \eqn{2n^2 - 10n + 12}. %A clip is a different type of partition as it is defined by evolutionary or cophenetic distance and not by the topology. Namely clips are groups of leaves for which the maximum pairwise distance is smaller than threshold. %For a better separation we additionally demand that the maximum pairwise distance within a clip is lower than the distance between any member of the clip and any other tip. A clip is a different type of partition, defining groups of leaves that are related in terms of evolutionary distances and not only topology. Namely, clips are groups of leaves for which all pairwise path-length distances are smaller than a given threshold value (Lapointe et al. 2010). There exists different numbers of clips for different thresholds, the largest (and trivial) one being the whole tree. There is always a clip containing only the two leaves with the smallest pairwise distance. Clans, slices and clips can be used to characterize how well a vector of categorial characters (natives/intruders) fit on a tree. We will follow the definitions of Lapointe et al.(2010). A complete clan is a clan that contains all leaves of a given state/color, but can also contain leaves of another state/color. A clan is homogeneous if it only contains leaves of one state/color. \code{getDiversity} computes either the \cr Shannon Diversity: \eqn{H = -\sum_{i=1}^{k}(N_i/N) log(N_i/N), N=\sum_{i=1}^{k} N_i}{H = -sum(N_i/N) * log(N_i/N), N=sum(N_i)} \cr or the \cr Equitability Index: \eqn{E = H / log(N)} \cr where \eqn{N_i} are the sizes of the \eqn{k} largest homogeneous clans of intruders. If the categories of the data can be separated by an edge of the tree then the E-value will be zero, and maximum equitability (E=1) is reached if all intruders are in separate clans. getDiversity computes these Intruder indices for the whole tree, complete clans and complete slices. Additionally the parsimony scores (p-scores) are reported. The p-score indicates if the leaves contain only one color (p-score=0), if the the leaves can be separated by a single split (perfect clan, p-score=1) or by a pair of splits (perfect slice, p-score=2). So far only 2 states are supported (native, intruder), however it is also possible to recode several states into the native or intruder state using contrasts, for details see section 2 in vignette("phangorn-specials"). Furthermore unknown character states are coded as ambiguous character, which can act either as native or intruder minimizing the number of clans or changes (in parsimony analysis) needed to describe a tree for given data. Set attribute labels to "old" for analysis as in Schliep et al. (2010) or to "new" for names which are more intuitive. \code{diversity} returns a data.frame with the parsimony score for each tree and each levels of the variables in \code{X}. \code{X} has to be a \code{data.frame} where each column is a factor and the rownames of \code{X} correspond to the tips of the trees. %TODO See also vignette("Clanistic"). } \examples{ set.seed(111) tree <- rtree(10) getClans(tree) getClips(tree, all=TRUE) getSlices(tree) set.seed(123) trees <- rmtree(10, 20) X <- matrix(sample(c("red", "blue", "violet"), 100, TRUE, c(.5,.4, .1)), ncol=5, dimnames=list(paste('t',1:20, sep=""), paste('Var',1:5, sep="_"))) x <- phyDat(X, type = "USER", levels = c("red", "blue"), ambiguity="violet") plot(trees[[1]], "u", tip.color = X[trees[[1]]$tip,1]) # intruders are blue (divTab <- getDiversity(trees, x, var.names=colnames(X))) summary(divTab) } \references{ Lapointe, F.-J., Lopez, P., Boucher, Y., Koenig, J., Bapteste, E. (2010) Clanistics: a multi-level perspective for harvesting unrooted gene trees. \emph{Trends in Microbiology} 18: 341-347 Wilkinson, M., McInerney, J.O., Hirt, R.P., Foster, P.G., Embley, T.M. (2007) Of clades and clans: terms for phylogenetic relationships in unrooted trees. \emph{Trends in Ecology and Evolution} 22: 114-115 Schliep, K., Lopez, P., Lapointe F.-J., Bapteste E. (2011) Harvesting Evolutionary Signals in a Forest of Prokaryotic Gene Trees, \emph{Molecular Biology and Evolution} 28(4): 1393-1405 } \seealso{ \code{\link{parsimony}}, Consistency index \code{\link{CI}}, Retention index \code{\link{RI}}, \code{\link{phyDat}} } \author{ Klaus Schliep \email{klaus.schliep@snv.jussieu.fr} Francois-Joseph Lapointe \email{francois-joseph.lapointe@umontreal.ca} } \keyword{cluster} phangorn/man/delta.score.Rd0000644000176200001440000000216413707232051015336 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/delta.score.R \name{delta.score} \alias{delta.score} \title{Computes the \eqn{\delta} score} \usage{ delta.score(x, arg = "mean", ...) } \arguments{ \item{x}{an object of class \code{phyDat}} \item{arg}{Specifies the return value, one of "all", "mean" or "sd"} \item{...}{further arguments passed through \code{dist.hamming}} } \value{ A vector containing the \eqn{\delta} scores. } \description{ Computes the treelikeness } \examples{ data(yeast) hist(delta.score(yeast, "all")) } \references{ BR Holland, KT Huber, A Dress, V Moulton (2002) \eqn{\delta} Plots: a tool for analyzing phylogenetic distance data Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human history \emph{Molecular Biology and Evolution}, \bold{19(12)} 2051--2059 Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human history \emph{Phil. Trans. R. Soc. B}, \bold{365} 3923--3933; DOI: 10.1098/rstb.2010.0162 } \seealso{ \code{\link{dist.hamming}} } \author{ Alastair Potts and Klaus Schliep } \keyword{cluster} phangorn/man/yeast.Rd0000644000176200001440000000077013707232051014261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phangorn-package.R \docType{data} \name{yeast} \alias{yeast} \title{Yeast alignment (Rokas et al.)} \description{ Alignment of 106 genes of 8 different species of yeast. } \examples{ data(yeast) str(yeast) } \references{ Rokas, A., Williams, B. L., King, N., and Carroll, S. B. (2003) Genome-scale approaches to resolving incongruence in molecular phylogenies. \emph{Nature}, \bold{425}(6960): 798--804 } \keyword{datasets} phangorn/man/bab.Rd0000644000176200001440000000402614140462313013654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bab.R \name{bab} \alias{bab} \alias{BranchAndBound} \title{Branch and bound for finding all most parsimonious trees} \usage{ bab(data, tree = NULL, trace = 1, ...) } \arguments{ \item{data}{an object of class phyDat.} \item{tree}{a phylogenetic tree an object of class phylo, otherwise a pratchet search is performed.} \item{trace}{defines how much information is printed during optimization.} \item{\dots}{Further arguments passed to or from other methods} } \value{ \code{bab} returns all most parsimonious trees in an object of class \code{multiPhylo}. } \description{ \code{bab} finds all most parsimonious trees. } \details{ This implementation is very slow and depending on the data may take very long time. In the worst case all (2n-5)!! possible trees have to be examined, where n is the number of species / tips. For 10 species there are already 2027025 tip-labelled unrooted trees. It only uses some basic strategies to find a lower and upper bounds similar to penny from phylip. \code{bab} uses a very basic heuristic approach of MinMax Squeeze (Holland et al. 2005) to improve the lower bound. On the positive side \code{bab} is not like many other implementations restricted to binary or nucleotide data. } \examples{ data(yeast) dfactorial(11) # choose only the first two genes gene12 <- yeast[, 1:3158] trees <- bab(gene12) } \references{ Hendy, M.D. and Penny D. (1982) Branch and bound algorithms to determine minimal evolutionary trees. \emph{Math. Biosc.} \bold{59}, 277-290 Holland, B.R., Huber, K.T. Penny, D. and Moulton, V. (2005) The MinMax Squeeze: Guaranteeing a Minimal Tree for Population Data, \emph{Molecular Biology and Evolution}, \bold{22}, 235--242 White, W.T. and Holland, B.R. (2011) Faster exact maximum parsimony search with XMP. \emph{Bioinformatics}, \bold{27(10)},1359--1367 } \seealso{ \code{\link{pratchet}}, \code{\link{dfactorial}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} based on work on Liam Revell } \keyword{cluster} phangorn/man/add.tips.Rd0000644000176200001440000000160514140465255014646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{add.tips} \alias{add.tips} \title{Add tips to a tree} \usage{ add.tips(tree, tips, where, edge.length = NULL) } \arguments{ \item{tree}{an object of class "phylo".} \item{tips}{a character vector containing the names of the tips.} \item{where}{an integer or character vector of the same length as tips giving the number of the node or tip of the tree where to add the new tips.} \item{edge.length}{optional numeric vector with edge length} } \value{ an object of class phylo } \description{ This function binds tips to nodes of a phylogenetic trees. } \examples{ tree <- rcoal(10) plot(tree) nodelabels() tiplabels() tree1 <- add.tips(tree, c("A", "B", "C"), c(1,2,15)) plot(tree1) } \seealso{ \code{\link{bind.tree}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/dist.p.Rd0000644000176200001440000000623014140461515014333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dist.p.R \name{dist.p} \alias{dist.p} \title{Pairwise Polymorphism P-Distances from DNA Sequences} \usage{ dist.p(x, cost = "polymorphism", ignore.indels = TRUE) } \arguments{ \item{x}{a matrix containing DNA sequences; this must be of class "phyDat" (use as.phyDat to convert from DNAbin objects).} \item{cost}{A cost matrix or "polymorphism" for a predefined one.} \item{ignore.indels}{a logical indicating whether gaps are treated as fifth state or not. Warning, each gap site is treated as a characters, so an an indel that spans a number of base positions would be treated as multiple character states.} } \value{ an object of class \code{dist}. } \description{ This function computes a matrix of pairwise uncorrected polymorphism p-distances. Polymorphism p-distances include intra-individual site polymorphisms (2ISPs; e.g. "R") when calculating genetic distances. } \details{ The polymorphism p-distances (Potts et al. 2014) have been developed to analyse intra-individual variant polymorphism. For example, the widely used ribosomal internal transcribed spacer (ITS) region (e.g. Alvarez and Wendel, 2003) consists of 100's to 1000's of units within array across potentially multiple nucleolus organizing regions (Bailey et al., 2003; Goeker and Grimm, 2008). This can give rise to intra-individual site polymorphisms (2ISPs) that can be detected from direct-PCR sequencing or cloning . Clone consensus sequences (see Goeker and Grimm, 2008) can be analysed with this function. } \examples{ data(Laurasiatherian) laura <- as.DNAbin(Laurasiatherian) dm <- dist.p(Laurasiatherian, "polymorphism") ######################################################## # Dealing with indel 2ISPs # These can be coded using an "x" in the alignment. Note # that as.character usage in the read.dna() function. ######################################################### cat("3 5", "No305 ATRA-", "No304 ATAYX", "No306 ATAGA", file = "exdna.txt", sep = "\n") (ex.dna <- read.dna("exdna.txt", format = "sequential", as.character=TRUE)) dat <- phyDat(ex.dna, "USER", levels=unique(as.vector(ex.dna))) dist.p(dat) unlink("exdna.txt") } \references{ Alvarez, I., and J. F. Wendel. (2003) Ribosomal ITS sequences and plant phylogenetic inference. \emph{ Molecular Phylogenetics and Evolution}, \bold{29}, 417--434. Bailey, C. D., T. G. Carr, S. A. Harris, and C. E. Hughes. (2003) Characterization of angiosperm nrDNA polymorphism, paralogy, and pseudogenes. \emph{Molecular Phylogenetics and Evolution} \bold{29}, 435--455. Goeker, M., and G. Grimm. (2008) General functions to transform associate data to host data, and their use in phylogenetic inference from sequences with intra-individual variability. \emph{BMC Evolutionary Biology}, \bold{8}:86. Potts, A.J., T.A. Hedderson, and G.W. Grimm. (2014) Constructing phylogenies in the presence of intra-individual site polymorphisms (2ISPs) with a focus on the nuclear ribosomal cistron. \emph{Systematic Biology}, \bold{63}, 1--16 } \seealso{ \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}} } \author{ Klaus Schliep and Alastair Potts } \keyword{cluster} phangorn/man/codonTest.Rd0000644000176200001440000000572114140464176015106 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/codonTest.R \name{codonTest} \alias{codonTest} \title{codonTest} \usage{ codonTest(tree, object, model = c("M0", "M1a", "M2a"), frequencies = "F3x4", opt_freq = FALSE, codonstart = 1, control = pml.control(maxit = 20), ...) } \arguments{ \item{tree}{a phylogenetic tree.} \item{object}{an object of class phyDat.} \item{model}{a vector containing the substitution models to compare with each other or "all" to test all available models.} \item{frequencies}{a character string or vector defining how to compute the codon frequencies} \item{opt_freq}{optimize frequencies (so far ignored)} \item{codonstart}{an integer giving where to start the translation. This should be 1, 2, or 3, but larger values are accepted and have for effect to start the translation further within the sequence.} \item{control}{a list of parameters for controlling the fitting process.} \item{...}{further arguments passed to or from other methods.} } \value{ A list with an element called summary containing a data.frame with the log-likelihood, number of estimated parameters, etc. of all tested models. An object called posterior which contains the posterior probability for the rate class for each sites and the estimates of the defined models. } \description{ Models for detecting positive selection } \details{ \code{codonTest} allows to test for positive selection similar to programs like PAML (Yang ) or HyPhy (Kosakovsky Pond et al. 2005). There are several options for deriving the codon frequencies. Frequencies can be "equal" (1/61), derived from nucleotide frequencies "F1x4" and "F3x4" or "empirical" codon frequencies. The frequencies taken using the empirical frequencies or estimated via maximum likelihood. So far the M0 model (Goldman and Yang 2002), M1a and M2a are implemented. The M0 model is always computed the other are optional. The convergence may be very slow and sometimes fails. } \examples{ \dontrun{ # load woodmouse data from ape data(woodmouse) dat_codon <- dna2codon(as.phyDat(woodmouse)) tree <- NJ(dist.ml(dat_codon)) # optimize the model the old way fit <- pml(tree, dat_codon, bf="F3x4") M0 <- optim.pml(fit, model="codon1") # Now using the codonTest function fit_codon <- codonTest(tree, dat_codon) fit_codon plot(fit_codon, "M1a") } } \references{ Ziheng Yang (2014). \emph{Molecular Evolution: A Statistical Approach}. Oxford University Press, Oxford Sergei L. Kosakovsky Pond, Simon D. W. Frost, Spencer V. Muse (2005) HyPhy: hypothesis testing using phylogenies, \emph{Bioinformatics}, \bold{21(5)}: 676--679, doi:10.1093/bioinformatics/bti079 Nielsen, R., and Z. Yang. (1998) Likelihood models for detecting positively selected amino acid sites and applications to the HIV-1 envelope gene. \emph{Genetics}, \bold{148}: 929--936 } \seealso{ \code{\link{pml}}, \code{\link{pmlMix}}, \code{\link{modelTest}}, \code{\link[stats]{AIC}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/as.splits.Rd0000644000176200001440000000553113707232051015054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R, R/splits.R \name{allSplits} \alias{allSplits} \alias{allCircularSplits} \alias{as.splits} \alias{splits} \alias{as.Matrix} \alias{distinct.splits} \alias{as.phylo.splits} \alias{addTrivialSplits} \alias{removeTrivialSplits} \alias{matchSplits} \alias{as.matrix.splits} \alias{as.Matrix.splits} \alias{print.splits} \alias{c.splits} \alias{unique.splits} \alias{as.splits.phylo} \alias{as.splits.multiPhylo} \alias{as.splits.networx} \alias{as.prop.part.splits} \alias{as.bitsplits.splits} \alias{as.splits.bitsplits} \alias{compatible} \title{Splits representation of graphs and trees.} \usage{ allSplits(k, labels = NULL) allCircularSplits(k, labels = NULL) as.splits(x, ...) \method{as.matrix}{splits}(x, zero.print = 0L, one.print = 1L, ...) \method{as.Matrix}{splits}(x, ...) \method{print}{splits}(x, maxp = getOption("max.print"), zero.print = ".", one.print = "|", ...) \method{c}{splits}(..., recursive = FALSE) \method{unique}{splits}(x, incomparables = FALSE, unrooted = TRUE, ...) \method{as.splits}{phylo}(x, ...) \method{as.splits}{multiPhylo}(x, ...) \method{as.splits}{networx}(x, ...) \method{as.prop.part}{splits}(x, ...) \method{as.bitsplits}{splits}(x) \method{as.splits}{bitsplits}(x, ...) compatible(obj) } \arguments{ \item{k}{number of taxa.} \item{labels}{names of taxa.} \item{x}{An object of class phylo or multiPhylo.} \item{\dots}{Further arguments passed to or from other methods.} \item{zero.print}{character which should be printed for zeros.} \item{one.print}{character which should be printed for ones.} \item{maxp}{integer, default from \code{options(max.print)}, influences how many entries of large matrices are printed at all.} \item{recursive}{logical. If recursive = TRUE, the function recursively descends through lists (and pairlists) combining all their elements into a vector.} \item{incomparables}{only for compatibility so far.} \item{unrooted}{todo.} \item{obj}{an object of class splits.} } \value{ \code{as.splits} returns an object of class splits, which is mainly a list of splits and some attributes. Often a \code{splits} object will contain attributes \code{confidences} for bootstrap or Bayesian support values and \code{weight} storing edge weights. \code{compatible} return a lower triangular matrix where an 1 indicates that two splits are incompatible. } \description{ \code{as.splits} produces a list of splits or bipartitions. } \note{ The internal representation is likely to change. } \examples{ (sp <- as.splits(rtree(5))) write.nexus.splits(sp) spl <- allCircularSplits(5) plot(as.networx(spl), "2D") } \seealso{ \code{\link{prop.part}}, \code{\link{lento}}, \code{\link{as.networx}}, \code{\link{distanceHadamard}}, \code{\link{read.nexus.splits}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/SH.test.Rd0000644000176200001440000000336714140462313014427 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/SH.R \name{SH.test} \alias{SH.test} \title{Shimodaira-Hasegawa Test} \usage{ SH.test(..., B = 10000, data = NULL, weight = NULL) } \arguments{ \item{...}{either a series of objects of class \code{"pml"} separated by commas, a list containing such objects or an object of class \code{"pmlPart"} or a matrix containing the site-wise likelihoods in columns.} \item{B}{the number of bootstrap replicates.} \item{data}{an object of class \code{"phyDat"}.} \item{weight}{if a matrix with site (log-)likelihoods is is supplied an optional vector containing the number of occurrences of each site pattern.} } \value{ a numeric vector with the P-value associated with each tree given in \code{...}. } \description{ This function computes the Shimodaira--Hasegawa test for a set of trees. } \examples{ data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree1 <- NJ(dm) tree2 <- unroot(upgma(dm)) fit1 <- pml(tree1, Laurasiatherian) fit2 <- pml(tree2, Laurasiatherian) fit1 <- optim.pml(fit1) # optimize edge weights fit2 <- optim.pml(fit2) # with pml objects as input SH.test(fit1, fit2, B=1000) # in real analysis use larger B, e.g. 10000 # with matrix as input X <- matrix(c(fit1$siteLik, fit2$siteLik), ncol=2) SH.test(X, weight=attr(Laurasiatherian, "weight"), B=1000) \dontrun{ example(pmlPart) SH.test(sp, B=1000) } } \references{ Shimodaira, H. and Hasegawa, M. (1999) Multiple comparisons of log-likelihoods with applications to phylogenetic inference. \emph{Molecular Biology and Evolution}, \bold{16}, 1114--1116. } \seealso{ \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, \code{\link{SOWH.test}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{models} phangorn/man/treedist.Rd0000644000176200001440000001061014073022437014753 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treedist.R \name{treedist} \alias{treedist} \alias{sprdist} \alias{SPR.dist} \alias{RF.dist} \alias{wRF.dist} \alias{KF.dist} \alias{path.dist} \title{Distances between trees} \usage{ treedist(tree1, tree2, check.labels = TRUE) sprdist(tree1, tree2) SPR.dist(tree1, tree2 = NULL) RF.dist(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) wRF.dist(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) KF.dist(tree1, tree2 = NULL, check.labels = TRUE, rooted = FALSE) path.dist(tree1, tree2 = NULL, check.labels = TRUE, use.weight = FALSE) } \arguments{ \item{tree1}{A phylogenetic tree (class \code{phylo}) or vector of trees (an object of class \code{multiPhylo}). See details} \item{tree2}{A phylogenetic tree.} \item{check.labels}{compares labels of the trees.} \item{normalize}{compute normalized RF-distance, see details.} \item{rooted}{take bipartitions for rooted trees into account, default is unrooting the trees.} \item{use.weight}{use edge.length argument or just count number of edges on the path (default)} } \value{ \code{treedist} returns a vector containing the following tree distance methods \item{symmetric.difference}{symmetric.difference or Robinson-Foulds distance} \item{branch.score.difference}{branch.score.difference} \item{path.difference}{path.difference} \item{weighted.path.difference}{weighted.path.difference} } \description{ \code{treedist} computes different tree distance methods and \code{RF.dist} the Robinson-Foulds or symmetric distance. The Robinson-Foulds distance only depends on the topology of the trees. If edge weights should be considered \code{wRF.dist} calculates the weighted RF distance (Robinson & Foulds 1981). and \code{KF.dist} calculates the branch score distance (Kuhner & Felsenstein 1994). \code{path.dist} computes the path difference metric as described in Steel and Penny 1993). \code{sprdist} computes the approximate SPR distance (Oliveira Martins et al. 2008, de Oliveira Martins 2016). } \details{ The Robinson-Foulds distance between two trees \eqn{T_1} and \eqn{T_2} with \eqn{n} tips is defined as (following the notation Steel and Penny 1993): \deqn{d(T_1, T_2) = i(T_1) + i(T_2) - 2v_s(T_1, T_2)} where \eqn{i(T_1)} denotes the number of internal edges and \eqn{v_s(T_1, T_2)} denotes the number of internal splits shared by the two trees. The normalized Robinson-Foulds distance is derived by dividing \eqn{d(T_1, T_2)} by the maximal possible distance \eqn{i(T_1) + i(T_2)}. If both trees are unrooted and binary this value is \eqn{2n-6}. Functions like \code{RF.dist} returns the Robinson-Foulds distance (Robinson and Foulds 1981) between either 2 trees or computes a matrix of all pairwise distances if a \code{multiPhylo} object is given. For large number of trees the distance functions can use a lot of memory! } \examples{ tree1 <- rtree(100, rooted=FALSE) tree2 <- rSPR(tree1, 3) RF.dist(tree1, tree2) treedist(tree1, tree2) sprdist(tree1, tree2) trees <- rSPR(tree1, 1:5) SPR.dist(tree1, trees) } \references{ de Oliveira Martins L., Leal E., Kishino H. (2008) \emph{Phylogenetic Detection of Recombination with a Bayesian Prior on the Distance between Trees}. PLoS ONE \bold{3(7)}. e2651. doi: 10.1371/journal.pone.0002651 de Oliveira Martins L., Mallo D., Posada D. (2016) \emph{A Bayesian Supertree Model for Genome-Wide Species Tree Reconstruction}. Syst. Biol. \bold{65(3)}: 397-416, doi:10.1093/sysbio/syu082 Steel M. A. and Penny P. (1993) \emph{Distributions of tree comparison metrics - some new results}, Syst. Biol., \bold{42(2)}, 126--141 Kuhner, M. K. and Felsenstein, J. (1994) \emph{A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates}, Molecular Biology and Evolution, \bold{11(3)}, 459--468 D.F. Robinson and L.R. Foulds (1981) \emph{Comparison of phylogenetic trees}, Mathematical Biosciences, \bold{53(1)}, 131--147 D.F. Robinson and L.R. Foulds (1979) Comparison of weighted labelled trees. In Horadam, A. F. and Wallis, W. D. (Eds.), \emph{Combinatorial Mathematics VI: Proceedings of the Sixth Australian Conference on Combinatorial Mathematics, Armidale, Australia}, 119--126 } \seealso{ \code{\link[ape]{dist.topo}}, \code{\link{nni}}, \code{\link{superTree}}, \code{\link{mast}} } \author{ Klaus P. Schliep \email{klaus.schliep@gmail.com}, Leonardo de Oliveira Martins } \keyword{classif} phangorn/man/splitsNetwork.Rd0000644000176200001440000000373013707232051016023 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/splitsNetwork.R \name{splitsNetwork} \alias{splitsNetwork} \title{Phylogenetic Network} \usage{ splitsNetwork(dm, splits = NULL, gamma = 0.1, lambda = 1e-06, weight = NULL) } \arguments{ \item{dm}{A distance matrix.} \item{splits}{a splits object, containing all splits to consider, otherwise all possible splits are used} \item{gamma}{penalty value for the L1 constraint.} \item{lambda}{penalty value for the L2 constraint.} \item{weight}{a vector of weights.} } \value{ \code{splitsNetwork} returns a splits object with a matrix added. The first column contains the indices of the splits, the second column an unconstrained fit without penalty terms and the third column the constrained fit. } \description{ \code{splitsNetwork} estimates weights for a splits graph from a distance matrix. } \details{ \code{splitsNetwork} fits non-negative least-squares phylogenetic networks using L1 (LASSO), L2(ridge regression) constraints. The function minimizes the penalized least squares \deqn{\beta = min \sum(dm - X\beta)^2 + \lambda \|\beta \|^2_2 }{ beta = sum(dm - X*beta)^2 + lambda |beta|^2_2 } with respect to \deqn{\|\beta \|_1 <= \gamma, \beta >= 0}{ |beta|_1 = gamma, beta >= 0} where \eqn{X} is a design matrix constructed with \code{designSplits}. External edges are fitted without L1 or L2 constraints. } \examples{ data(yeast) dm <- dist.ml(yeast) fit <- splitsNetwork(dm) net <- as.networx(fit) plot(net, "2D") write.nexus.splits(fit) } \references{ Efron, Hastie, Johnstone and Tibshirani (2004) Least Angle Regression (with discussion) \emph{Annals of Statistics} \bold{32(2)}, 407--499 K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD Thesis) } \seealso{ \code{\link[phangorn]{distanceHadamard}}, \code{\link[phangorn]{designTree}} \code{\link[phangorn]{consensusNet}}, \code{\link[phangorn]{plot.networx}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/read.phyDat.Rd0000644000176200001440000000450414030677772015313 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read.phyDat.R \name{read.phyDat} \alias{read.phyDat} \alias{write.phyDat} \title{Import and export sequence alignments} \usage{ read.phyDat(file, format = "phylip", type = "DNA", ...) write.phyDat(x, file, format = "phylip", colsep = "", nbcol = -1, ...) } \arguments{ \item{file}{a file name specified by either a variable of mode character, or a double-quoted string.} \item{format}{File format of the sequence alignment (see details). Several popular formats are supported: "phylip", "interleaved", "sequential", "clustal", "fasta" or "nexus", or any unambiguous abbreviation of these.} \item{type}{Type of sequences ("DNA", "AA", "CODON" or "USER").} \item{...}{further arguments passed to or from other methods.} \item{x}{An object of class \code{phyDat}.} \item{colsep}{a character used to separate the columns (a single space by default).} \item{nbcol}{a numeric specifying the number of columns per row (-1 by default); may be negative implying that the nucleotides are printed on a single line.} } \value{ \code{read.phyDat} returns an object of class phyDat, \code{write.phyDat} write an alignment to a file. } \description{ These functions read and write sequence alignments. } \details{ \code{write.phyDat} calls the function \code{\link[ape]{write.dna}} or \code{\link[ape]{write.nexus.data}} and \code{read.phyDat} calls the function \code{\link[ape]{read.dna}}, \code{read.aa} or \code{read.nexus.data}, so see for more details over there. You may import data directly with \code{\link[ape]{read.dna}} or \code{\link[ape]{read.nexus.data}} and convert the data to class phyDat. } \examples{ fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") } \references{ % Anonymous. FASTA format description. % \url{https://www.ncbi.nlm.nih.gov/blast/fasta.shtml} Felsenstein, J. (1993) Phylip (Phylogeny Inference Package) version 3.5c. Department of Genetics, University of Washington. \url{https://evolution.genetics.washington.edu/phylip/phylip.html} } \seealso{ \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{IO} phangorn/man/cladePar.Rd0000644000176200001440000000215414065643321014651 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cladePar.R \name{cladePar} \alias{cladePar} \title{Utility function to plot.phylo} \usage{ cladePar(tree, node, edge.color = "red", tip.color = edge.color, edge.width = 1, edge.lty = "solid", x = NULL, plot = FALSE, ...) } \arguments{ \item{tree}{an object of class phylo.} \item{node}{the node which is the common ancestor of the clade.} \item{edge.color}{see plot.phylo.} \item{tip.color}{see plot.phylo.} \item{edge.width}{see plot.phylo.} \item{edge.lty}{see plot.phylo.} \item{x}{the result of a previous call to cladeInfo.} \item{plot}{logical, if TRUE the tree is plotted.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ A list containing the information about the edges and tips. } \description{ cladePar can help you coloring (choosing edge width/type) of clades. } \examples{ tree <- rtree(10) plot(tree) nodelabels() x <- cladePar(tree, 12) cladePar(tree, 18, "blue", "blue", x=x, plot=TRUE) } \seealso{ \code{\link{plot.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/cophenetic.networx.Rd0000644000176200001440000000144713707232051016764 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treedist.R \name{cophenetic.networx} \alias{cophenetic.networx} \alias{cophenetic.splits} \title{Pairwise Distances from a Phylogenetic Network} \usage{ \method{cophenetic}{networx}(x) } \arguments{ \item{x}{an object of class \code{networx}.} } \value{ an object of class \code{dist}, names are set according to the tip labels (as given by the element \code{tip.label} of the argument \code{x}). } \description{ \code{cophenetic.networx} computes the pairwise distances between the pairs of tips from a phylogenetic network using its branch lengths. } \seealso{ \code{\link[stats]{cophenetic}} for the generic function, \code{neighborNet} to construct a network from a distance matrix } \author{ Klaus Schliep } \keyword{manip} phangorn/man/distanceHadamard.Rd0000644000176200001440000000204613707232051016346 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hadamard.R \name{distanceHadamard} \alias{distanceHadamard} \title{Distance Hadamard} \usage{ distanceHadamard(dm, eps = 0.001) } \arguments{ \item{dm}{A distance matrix.} \item{eps}{Threshold value for splits.} } \value{ \code{distanceHadamard} returns a matrix. The first column contains the distance spectra, the second one the edge-spectra. If eps is positive an object of with all splits greater eps is returned. } \description{ Distance Hadamard produces spectra of splits from a distance matrix. } \examples{ data(yeast) dm <- dist.hamming(yeast) dm <- as.matrix(dm) fit <- distanceHadamard(dm) lento(fit) plot(as.networx(fit), "2D") } \references{ Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5-24. } \seealso{ \code{\link{hadamard}}, \code{\link{lento}}, \code{\link{plot.networx}}, \code{\link{neighborNet}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com}, Tim White } \keyword{cluster} phangorn/man/dna2codon.Rd0000644000176200001440000000454614140527773015022 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/codon.R \name{dna2codon} \alias{dna2codon} \alias{codon2dna} \title{Translate nucleic acid sequences into codons} \usage{ dna2codon(x, codonstart = 1, code = 1, ambiguity = "---", ...) codon2dna(x) } \arguments{ \item{x}{An object containing sequences.} \item{codonstart}{an integer giving where to start the translation. This should be 1, 2, or 3, but larger values are accepted and have for effect to start the translation further within the sequence.} \item{code}{The ncbi genetic code number for translation (see details). By default the standard genetic code is used.} \item{ambiguity}{character for ambiguous character and no contrast is provided.} \item{...}{further arguments passed to or from other methods.} } \value{ The functions return an object of class \code{phyDat}. } \description{ The function transforms \code{dna2codon} DNA sequences to codon sequences, \code{codon2dna} transform the other way. } \details{ The following genetic codes are described here. The number preceding each corresponds to the code argument. \tabular{rl}{ 1 \tab standard \cr 2 \tab vertebrate.mitochondrial \cr 3 \tab yeast.mitochondrial \cr 4 \tab protozoan.mitochondrial+mycoplasma \cr 5 \tab invertebrate.mitochondrial \cr 6 \tab ciliate+dasycladaceal \cr 9 \tab echinoderm+flatworm.mitochondrial \cr 10 \tab euplotid \cr 11 \tab bacterial+plantplastid \cr 12 \tab alternativeyeast \cr 13 \tab ascidian.mitochondrial \cr 14 \tab alternativeflatworm.mitochondrial \cr 15 \tab blepharism \cr 16 \tab chlorophycean.mitochondrial \cr 21 \tab trematode.mitochondrial \cr 22 \tab scenedesmus.mitochondrial \cr 23 \tab thraustochytrium.mitochondria \cr 24 \tab Pterobranchia.mitochondrial \cr 25 \tab CandidateDivision.SR1+Gracilibacteria \cr 26 \tab Pachysolen.tannophilus } Alignment gaps and ambiguities are currently ignored and sites containing these are deleted. } \examples{ data(Laurasiatherian) class(Laurasiatherian) Laurasiatherian dna2codon(Laurasiatherian) } \references{ \url{https://www.ncbi.nlm.nih.gov/Taxonomy/taxonomyhome.html/index.cgi?chapter=cgencodes} } \seealso{ \code{\link{trans}}, \code{\link{phyDat}} and the chapter 4 in the \code{vignette("phangorn-specials", package="phangorn")} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/man/Ancestors.Rd0000644000176200001440000000427013707232051015074 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/treeManipulation.R \name{Ancestors} \alias{Ancestors} \alias{allDescendants} \alias{Children} \alias{Descendants} \alias{Siblings} \alias{mrca.phylo} \title{tree utility function} \usage{ Ancestors(x, node, type = c("all", "parent")) allDescendants(x) Children(x, node) Descendants(x, node, type = c("tips", "children", "all")) Siblings(x, node, include.self = FALSE) mrca.phylo(x, node = NULL, full = FALSE) } \arguments{ \item{x}{a tree (a phylo object).} \item{node}{an integer or a vector of integers corresponding to a node ID} \item{type}{specify whether to return just direct children / parents or all} \item{include.self}{whether to include self in list of siblings} \item{full}{a logical indicating whether to return the MRCAs among all tips and nodes (if TRUE); the default is to return only the MRCAs among tips.} } \value{ a vector or a list containing the indices of the nodes. } \description{ Functions for describing relationships among phylogenetic nodes. } \details{ These functions are inspired by \code{treewalk} in phylobase package, but work on the S3 \code{phylo} objects. The nodes are the indices as given in edge matrix of an phylo object. From taxon labels these indices can be easily derived matching against the \code{tip.label} argument of an phylo object, see example below. All the functions allow \code{node} to be either a scalar or vector. \code{mrca} is a faster version of the mrca in ape, in phangorn only because of dependencies. If the argument node is missing the function is evaluated for all nodes. } \section{Functions}{ \itemize{ \item \code{allDescendants}: list all the descendant nodes of each node }} \examples{ tree <- rtree(10) plot(tree, show.tip.label = FALSE) nodelabels() tiplabels() Ancestors(tree, 1:3, "all") Children(tree, 11) Descendants(tree, 11, "tips") Siblings(tree, 3) # Siblings of all nodes Siblings(tree) mrca.phylo(tree, 1:3) mrca.phylo(tree, match(c("t1", "t2", "t3"), tree$tip)) mrca.phylo(tree) # same as mrca(tree), but faster for large trees } \seealso{ \code{treewalk}, \code{\link[ape]{as.phylo}}, \code{\link[ape]{nodelabels}} } \keyword{internal} \keyword{misc} phangorn/man/mast.Rd0000644000176200001440000000221014041302175014064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mast.R \name{mast} \alias{mast} \title{Maximum agreement subtree} \usage{ mast(x, y, tree = TRUE, rooted = TRUE) } \arguments{ \item{x}{a tree, i.e. an object of class \code{phylo}.} \item{y}{a tree, i.e. an object of class \code{phylo}.} \item{tree}{a logical, if TRUE returns a tree other wise the tip labels of the the maximum agreement subtree.} \item{rooted}{logical if TRUE treats trees as rooted otherwise unrooted.} } \value{ \code{mast} returns a vector of the tip labels in the MAST. } \description{ \code{mast} computes the maximum agreement subtree (MAST). } \details{ The code is derived from the code example in Valiente (2009). The version for the unrooted trees is much slower. } \examples{ tree1 <- rtree(100) tree2 <- rSPR(tree1, 5) tips <- mast(tree1, tree2) } \references{ G. Valiente (2009). \emph{Combinatorial Pattern Matching Algorithms in Computational Biology using Perl and R}. Taylor & Francis/CRC Press } \seealso{ \code{\link{SPR.dist}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} based on code of Gabriel Valiente } \keyword{cluster} phangorn/man/as.networx.Rd0000644000176200001440000000401014030677772015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/networx.R \name{as.networx} \alias{as.networx} \alias{networx} \alias{as.networx.splits} \alias{as.networx.phylo} \title{Conversion among phylogenetic network objects} \usage{ as.networx(x, ...) \method{as.networx}{splits}(x, planar = FALSE, coord = c("none", "2D", "3D"), ...) \method{as.networx}{phylo}(x, ...) } \arguments{ \item{x}{an object of class \code{"splits"} or \code{"phylo"}} \item{\dots}{Further arguments passed to or from other methods.} \item{planar}{logical whether to produce a planar graph from only cyclic splits (may excludes splits).} \item{coord}{add coordinates of the nodes, allows to reproduce the plot.} } \description{ \code{as.networx} convert \code{splits} objects into a \code{networx} object. And most important there exists a generic \code{plot} function to plot phylogenetic network or split graphs. } \details{ A \code{networx} object hold the information for a phylogenetic network and extends the \code{phylo} object. Therefore some generic function for \code{phylo} objects will also work for \code{networx} objects. The argument \code{planar = TRUE} will create a planar split graph based on a cyclic ordering. These objects can be nicely plotted in \code{"2D"}. } \note{ The internal representation is likely to change. } \examples{ set.seed(1) tree1 <- rtree(20, rooted=FALSE) sp <- as.splits(rNNI(tree1, n=10)) net <- as.networx(sp) plot(net) \dontrun{ # also see example in consensusNet example(consensusNet) } } \references{ Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 } \seealso{ \code{\link{consensusNet}}, \code{\link{neighborNet}}, \code{\link{splitsNetwork}}, \code{\link{hadamard}}, \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{plot} phangorn/man/pmlMix.Rd0000644000176200001440000000561413707232051014404 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pmlMix.R \name{pmlMix} \alias{pmlMix} \title{Phylogenetic mixture model} \usage{ pmlMix(formula, fit, m = 2, omega = rep(1/m, m), control = pml.control(epsilon = 1e-08, maxit = 20, trace = 1), ...) } \arguments{ \item{formula}{a formula object (see details).} \item{fit}{an object of class \code{pml}.} \item{m}{number of mixtures.} \item{omega}{mixing weights.} \item{control}{A list of parameters for controlling the fitting process.} \item{\dots}{Further arguments passed to or from other methods.} } \value{ \code{pmlMix} returns a list with elements \item{logLik}{log-likelihood of the fit} \item{omega}{mixing weights.} \item{fits}{fits for the final mixtures.} } \description{ Phylogenetic mixture model. } \details{ The \code{formula} object allows to specify which parameter get optimized. The formula is generally of the form \code{edge + bf + Q ~ rate + shape + \dots{}}, on the left side are the parameters which get optimized over all mixtures, on the right the parameter which are optimized specific to each mixture. The parameters available are \code{"nni", "bf", "Q", "inv", "shape", "edge", "rate"}. Each parameters can be used only once in the formula. \code{"rate"} and \code{"nni"} are only available for the right side of the formula. On the other hand parameters for invariable sites are only allowed on the left-hand side. The convergence of the algorithm is very slow and is likely that the algorithm can get stuck in local optima. } \examples{ \dontrun{ X <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4) weights <- 1000*exp(fit$siteLik) attr(X, "weight") <- weights fit1 <- update(fit, data=X, k=1) fit2 <- update(fit, data=X) (fitMixture <- pmlMix(edge~rate, fit1 , m=4)) (fit2 <- optim.pml(fit2, optGamma=TRUE)) data(Laurasiatherian) dm <- dist.logDet(Laurasiatherian) tree <- NJ(dm) fit <- pml(tree, Laurasiatherian) fit <- optim.pml(fit) fit2 <- update(fit, k=4) fit2 <- optim.pml(fit2, optGamma=TRUE) fitMix <- pmlMix(edge ~ rate, fit, m=4) fitMix # # simulation of mixture models # \dontrun{ X <- allSitePattern(5) tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") tree1 <- unroot(tree1) tree2 <- unroot(tree2) fit1 <- pml(tree1,X) fit2 <- pml(tree2,X) weights <- 2000*exp(fit1$siteLik) + 1000*exp(fit2$siteLik) attr(X, "weight") <- weights fit1 <- pml(tree1, X) fit2 <- optim.pml(fit1) logLik(fit2) AIC(fit2, k=log(3000)) fitMixEdge <- pmlMix( ~ edge, fit1, m=2) logLik(fitMixEdge) AIC(fitMixEdge, k=log(3000)) fit.p <- pmlPen(fitMixEdge, .25) logLik(fit.p) AIC(fit.p, k=log(3000)) } } } \seealso{ \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlCluster}} } \author{ Klaus Schliep \email{klaus.schliep@gmail.com} } \keyword{cluster} phangorn/TODO0000644000176200001440000000044514137602432012563 0ustar liggesusersas.splits.phylo trivial=FALSE bip bipart as.splits.multiPhylo Mkv Ancestral pml.fit4 add Mkv + weight for bootstrap ratchet.par add minit als parameter Inv or Mkv / Ascertainment bias sankoff auf new umstellen: index.nni indexNNI indexNNI3 indexNNI_fitch combine optBf und optF3x4 phangorn/DESCRIPTION0000644000176200001440000000636014156232262013604 0ustar liggesusersPackage: phangorn Title: Phylogenetic Reconstruction and Analysis Version: 2.8.1 Authors@R: c(person(given = "Klaus", family = "Schliep", role = c("aut", "cre"), email = "klaus.schliep@gmail.com", comment = c(ORCID = "0000-0003-2941-0161")), person(given = "Emmanuel", family = "Paradis", role = "aut", comment = c(ORCID = "0000-0003-3092-2199")), person(given = "Leonardo", family = "de Oliveira Martins", role = "aut", comment = c(ORCID = "0000-0001-5247-1320")), person(given = "Alastair", family = "Potts", role = "aut"), person(given = "Tim W.", family = "White", role = "aut"), person(given = "Cyrill", family = "Stachniss", role = "ctb"), person(given = "Michelle", family = "Kendall", role = "ctb", email = "m.kendall@imperial.ac.uk"), person(given = "Keren", family = "Halabi", role = "ctb"), person(given = "Richel", family = "Bilderbeek", role = "ctb"), person(given = "Kristin", family = "Winchell", role = "ctb"), person(given = "Liam", family = "Revell", role = "ctb"), person(given = "Mike", family = "Gilchrist", role = "ctb"), person(given = "Jeremy", family = "Beaulieu", role = "ctb"), person(given = "Brian", family = "O'Meara", role = "ctb"), person(given = "Long", family = "Qu", role = "ctb")) Description: Allows for estimation of phylogenetic trees and networks using Maximum Likelihood, Maximum Parsimony, distance methods and Hadamard conjugation. Offers methods for tree comparison, model selection and visualization of phylogenetic networks as described in Schliep et al. (2017) . License: GPL (>= 2) URL: https://github.com/KlausVigo/phangorn BugReports: https://github.com/KlausVigo/phangorn/issues Depends: ape (>= 5.5), R (>= 4.1.0) Imports: fastmatch, graphics, grDevices, igraph (>= 1.0), Matrix, methods, parallel, quadprog, Rcpp, stats, utils Suggests: Biostrings, knitr, magick, prettydoc, rgl, rmarkdown, seqinr, seqLogo, tinytest, xtable LinkingTo: Rcpp VignetteBuilder: knitr, utils biocViews: Software, Technology, QualityControl Encoding: UTF-8 Repository: CRAN RoxygenNote: 7.1.2 Language: en-US NeedsCompilation: yes Packaged: 2021-12-13 14:03:14 UTC; klaus Author: Klaus Schliep [aut, cre] (), Emmanuel Paradis [aut] (), Leonardo de Oliveira Martins [aut] (), Alastair Potts [aut], Tim W. White [aut], Cyrill Stachniss [ctb], Michelle Kendall [ctb], Keren Halabi [ctb], Richel Bilderbeek [ctb], Kristin Winchell [ctb], Liam Revell [ctb], Mike Gilchrist [ctb], Jeremy Beaulieu [ctb], Brian O'Meara [ctb], Long Qu [ctb] Maintainer: Klaus Schliep Date/Publication: 2021-12-15 00:20:02 UTC phangorn/build/0000755000176200001440000000000014155651242013172 5ustar liggesusersphangorn/build/vignette.rds0000644000176200001440000000060314155651242015530 0ustar liggesusersSQO0.c}5ل c_ƭm"[;F>7cs+sviӨ15hoBy@RCHP{1JT$}?~)o>ɱU jdK’3>%E2R&̊NjuAJ(ʰc>\0O<-c4'q 1O6Mf rz*qAPH]Ͼ[\B{\Jo_bj(b{'l>yH,# 6}7Ӵ/Gۢphangorn/tests/0000755000176200001440000000000014140752512013231 5ustar liggesusersphangorn/tests/tinytest.R0000644000176200001440000000042413707232051015236 0ustar liggesusersif (require("tinytest", quietly=TRUE)){ set.seed(42) home <- length(unclass(packageVersion("phangorn"))[[1]]) == 4 # 0.0.0.9000 if(home) { # Only run locally, let CRAN test examples and the vignette test_package("phangorn", at_home = home) } } phangorn/src/0000755000176200001440000000000014155651242012662 5ustar liggesusersphangorn/src/lessAndEqual.h0000644000176200001440000000527013707232051015413 0ustar liggesusers#ifndef R_R_H #include #endif #ifndef R_INTERNALS_H_ #include #endif #include /* NOTE: R_NaString is a different SEXP than mkChar("NA"), but holding the same string "NA". We will treat R_NaString to be smaller than every usual string, including mkChar("NA"). Real NaN becomes mkChar("NaN") by as.character(); Real -Inf becomes mkChar("-Inf") by as.character(); Real Inf becomes mkChar("Inf") by as.character(); */ class CharSEXP{ public: SEXP sexp; inline bool valid() {return( TYPEOF(sexp) == CHARSXP );} CharSEXP(SEXP x) { if (TYPEOF(x) == CHARSXP) sexp = x; else error("CharSEXP should be initialized with a CHARSXP type object"); } CharSEXP() { sexp = R_NaString; } friend inline bool operator< (const CharSEXP& lhs, const CharSEXP& rhs) { if (lhs.sexp == R_NaString) return( rhs.sexp != R_NaString ); if (rhs.sexp == R_NaString) return(false); return( strcmp(const_cast(CHAR(lhs.sexp)), const_cast(CHAR(rhs.sexp)) )<0 ); } friend inline bool operator== (const CharSEXP& lhs, const CharSEXP& rhs) { return (lhs.sexp == rhs.sexp); // R CHARSXP objects are cached (only one copy per string) } }; /* for general T where operator< and operator== have been implemented; * this is helpful for * (1) integers where NA's is just a special integer value; * (2) unsigned char, where NA's is converted to 00; * (3) CharSEXP, where NA's are properly handled by operator<. */ template bool lessThan (const T& lhs, const T& rhs) { return lhs < rhs;} template bool equalTo (const T& lhs, const T& rhs) { return lhs == rhs;} /* double Assumptions: NaN < NA_real_ < -Inf < Finite numbers < Inf */ template <> inline bool lessThan(const double& lhs, const double& rhs) { if (R_FINITE(lhs) && R_FINITE(rhs)) return lhs< rhs; // probably the most common case (both finite) bool rhsTest = R_IsNaN(rhs); // rhs = NaN if (R_IsNaN(lhs)) return !rhsTest; // lhs = NaN rhsTest = rhsTest || ISNA(rhs); // rhs <= NA_real_ if (ISNA(lhs)) return !rhsTest; // lhs = NA rhsTest = rhsTest || (rhs == R_NegInf); // rhs <= -Inf if (lhs == R_NegInf) return !rhsTest; // lhs = -Inf if(rhsTest) return false; // lhs is finite or +Inf but rhs <= -Inf return R_FINITE(lhs); // lhs is finite or +Inf but rhs is +Inf } template <> inline bool equalTo (const double& lhs, const double& rhs) {return( (lhs == rhs) || (ISNA(lhs) && ISNA(rhs)) || (R_IsNaN(lhs) && R_IsNaN(rhs)) );} phangorn/src/dupAtomMat.cpp0000644000176200001440000000345713707232051015445 0ustar liggesusers#include "rcSet.h" vecMap intVecMap; vecMap doubleVecMap; vecMap charsexpVecMap; vecMap rawVecMap; // Rbyte is an alias of unsigned char extern "C" { SEXP grpDupAtomMat(SEXP x, SEXP MARGIN, SEXP fromLast) {/* returns an integer vector of duplicated rows of numeric matrix x */ SEXP out; int* dim; int nGrps; dim=INTEGER(getAttrib(x, R_DimSymbol)); out = PROTECT(allocVector(INTSXP, dim[*INTEGER(MARGIN)-1])); switch (TYPEOF(x)) { case REALSXP: nGrps = doubleVecMap.grpDuplicatedMat (REAL(x), dim, dim+1, INTEGER(out), *INTEGER(MARGIN)==1, (bool)(*(LOGICAL(fromLast))) ); break; case INTSXP: // factor type is also covered here // if(!inherits(x, "factor")) nGrps = intVecMap.grpDuplicatedMat (INTEGER(x), dim, dim+1, INTEGER(out), *INTEGER(MARGIN)==1, (bool)(*(LOGICAL(fromLast))) ); // else {;} break; case LGLSXP: nGrps = intVecMap.grpDuplicatedMat (LOGICAL(x), dim, dim+1, INTEGER(out), *INTEGER(MARGIN)==1, (bool)(*(LOGICAL(fromLast))) ); break; case STRSXP: { CharSEXP* charSexpPtr = new CharSEXP [ dim[0]*dim[1] ]; for(int i=dim[0]*dim[1]-1; i>=0; --i) charSexpPtr[i].sexp = STRING_ELT(x, i); nGrps = charsexpVecMap.grpDuplicatedMat (charSexpPtr, dim, dim+1, INTEGER(out), *INTEGER(MARGIN)==1, (bool)(*(LOGICAL(fromLast))) ); delete[] charSexpPtr; break; } case RAWSXP: nGrps = rawVecMap.grpDuplicatedMat (RAW(x), dim, dim+1, INTEGER(out), *INTEGER(MARGIN)==1, (bool)(*(LOGICAL(fromLast))) ); break; default: error("C function 'grpDupAtomMat' only accepts REALSXP, LGLSXP, INTSXP and STRSXP"); } SEXP nLevels; nLevels = PROTECT(allocVector(INTSXP, 1)); INTEGER(nLevels)[0] = nGrps; setAttrib(out, install("nlevels"), nLevels); UNPROTECT(2); return out; } } phangorn/src/phangorn_utils.h0000644000176200001440000000154513743613604016076 0ustar liggesusers#ifndef PHANGORNUTILS_H #define PHANGORNUTILS_H #include using namespace Rcpp; List allDescCPP(IntegerMatrix orig, int nTips); List bipartCPP(IntegerMatrix orig, int nTips); std::vector< std::vector > bipCPP(IntegerMatrix orig, int nTips); List allChildrenCPP(const IntegerMatrix orig); List allSiblingsCPP(const IntegerMatrix & edge); IntegerVector p2dna(NumericMatrix xx, double eps=0.999); NumericVector node_height_cpp(IntegerVector edge1, IntegerVector edge2, NumericVector edge_length); NumericVector cophenetic_cpp(IntegerMatrix edge, NumericVector edge_length, int nTips, int nNode); IntegerVector threshStateC(NumericVector x, NumericVector thresholds); int countCycles_cpp(IntegerMatrix M); std::vector getIndex(IntegerVector left, IntegerVector right, int n); #endif phangorn/src/ml.c0000644000176200001440000007467714137217607013466 0ustar liggesusers/* * ml.c * * (c) 2008-2021 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ #define USE_FC_LEN_T #include #include #include #include #ifndef FCONE # define FCONE #endif #define LINDEX(i, k) (i - ntips - 1L) * (nr * nc) + k * ntips * (nr * nc) // index for LL #define LINDEX2(i, k) (i - *ntips - 1L) * (*nr* *nc) + k * *ntips * (*nr * *nc) // index for scaling matrix SCM #define LINDEX3(i, j) (i - *ntips - 1L) * *nr + j * *ntips * *nr //nr statt *nr double one = 1.0, zero = 0.0; int ONE = 1L; const double ScaleEPS = 1.0/4294967296.0; const double ScaleMAX = 4294967296.0; const double LOG_SCALE_EPS = -22.18070977791824915926; static double *LL; //, *WEIGHTS; static int *SCM; //, *XXX; SEXP ll_free2(){ free(LL); free(SCM); return R_NilValue; } SEXP ll_init2(SEXP nr, SEXP nTips, SEXP nc, SEXP k) { int nrx = INTEGER(nr)[0], nTipsx = INTEGER(nTips)[0], ncx = INTEGER(nc)[0], kx = INTEGER(k)[0]; int i; LL = (double *) calloc(nrx * ncx * kx * nTipsx, sizeof(double)); SCM = (int *) calloc(nrx * kx * nTipsx, sizeof(int)); // * 2L for(i =0; i < (nrx * kx * nTipsx); i++) SCM[i] = 0L; return R_NilValue; } /* LL likelihood for internal edges SCM scaling coefficients */ void matm(int *x, double *contrast, int *nr, int *nc, int *nco, double *result){ int i, j; for(i = 0; i < (*nr); i++){ for(j = 0; j < (*nc); j++) result[i + j*(*nr)] *= contrast[x[i] - 1L + j*(*nco)]; } } SEXP invSites(SEXP dlist, SEXP nr, SEXP nc, SEXP contrast, SEXP nco){ R_len_t n = length(dlist); int nrx=INTEGER(nr)[0], ncx=INTEGER(nc)[0], i, j; SEXP result; PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); double *res; res = REAL(result); for(j=0; j < (nrx * ncx); j++) res[j] = 1.0; for(i=0; i < n; i++) matm(INTEGER(VECTOR_ELT(dlist, i)), REAL(contrast), INTEGER(nr), INTEGER(nc), INTEGER(nco), res); UNPROTECT(1); // result return(result); } void scaleMatrix(double *X, int *nr, int *nc, int *result){ int i, j; double tmp; for(i = 0; i < *nr; i++) { tmp = 0.0; for(j = 0; j < *nc; j++) tmp += X[i + j* *nr]; while(tmp < ScaleEPS){ for(j = 0; j < *nc; j++) X[i + j* *nr] *=ScaleMAX; result[i] +=1L; tmp *= ScaleMAX; } } } // contrast to full dense matrix void matp(int *x, double *contrast, double *P, int *nr, int *nc, int *nrs, double *result){ int i, j; double *tmp; tmp = (double *) R_alloc((*nc) *(*nrs), sizeof(double)); F77_CALL(dgemm)("N", "N", nrs, nc, nc, &one, contrast, nrs, P, nc, &zero, tmp, nrs FCONE FCONE); for(i = 0; i < (*nr); i++){ for(j = 0; j < (*nc); j++) result[i + j*(*nr)] = tmp[x[i] - 1L + j*(*nrs)]; } } void rowMinScale(int *dat, int n, int k, int *res){ int i, h; int tmp; for(i = 0; i < n; i++){ tmp = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < tmp) tmp=dat[i + h*n];} if(tmp>0L){for(h = 0; h< k; h++) dat[i + h*n] -= tmp;} res[i] = tmp; } } void getP(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; double *tmp; tmp = (double *) R_alloc(m, sizeof(double)); for(i = 0; i < m; i++) tmp[i] = exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } } SEXP getPM(SEXP eig, SEXP nc, SEXP el, SEXP w){ R_len_t i, j, nel, nw, k; int m=INTEGER(nc)[0], l=0; double *ws=REAL(w); double *edgelen=REAL(el); double *eva, *eve, *evei; SEXP P, RESULT; nel = length(el); nw = length(w); if(!isNewList(eig)) error("'eig' must be a list"); eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); PROTECT(RESULT = allocVector(VECSXP, nel*nw)); for(j=0; j0)scaleMatrix(&ans[ni * rc], nr, nc, scaleTmp); // (ni-nTips) ni = node[i]; if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, &ans[ni * rc]); else F77_CALL(dgemm)("N", "N", nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, &ans[ni * rc], nr FCONE FCONE); } else { if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, rtmp); else F77_CALL(dgemm)("N", "N", nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, rtmp, nr FCONE FCONE); for(j=0; j < rc; j++) ans[ni * rc + j] *= rtmp[j]; } } scaleMatrix(&ans[ni * rc], nr, nc, scaleTmp); F77_CALL(dgemv)("N", nr, nc, &one, &ans[ni * rc], nr, bf, &ONE, &zero, TMP, &ONE FCONE); } // this seems to work perfectly void lll3(SEXP dlist, double *eva, double *eve, double *evei, double *el, double g, int *nr, int *nc, int *node, int *edge, int nTips, double *contrast, int nco, int n, int *scaleTmp, double *bf, double *TMP, double *ans, int *SC){ int ni, ei, j, i, rc; // R_len_t i, n = length(node); double *rtmp, *P; ni = -1L; rc = *nr * *nc; rtmp = (double *) R_alloc(*nr * *nc, sizeof(double)); P = (double *) R_alloc(*nc * *nc, sizeof(double)); for(j=0; j < *nr; j++) scaleTmp[j] = 0L; for(i = 0; i < n; i++) { getP(eva, eve, evei, *nc, el[i], g, P); ei = edge[i]; if(ni != node[i]){ // test for node[i+1] if(ni>0)scaleMatrix(&ans[ni * rc], nr, nc, &SC[ni * *nr]); // (ni-nTips) ni = node[i]; for(j=0; j < *nr; j++) SC[j + ni * *nr] = 0L; if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, &ans[ni * rc]); else{ F77_CALL(dgemm)("N", "N", nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, &ans[ni * rc], nr FCONE FCONE); for(j=0; j < *nr; j++) SC[ni * *nr + j] = SC[(ei-nTips) * *nr + j]; } } else { if(ei < nTips) matp(INTEGER(VECTOR_ELT(dlist, ei)), contrast, P, nr, nc, &nco, rtmp); else{ F77_CALL(dgemm)("N", "N", nr, nc, nc, &one, &ans[(ei-nTips) * rc], nr, P, nc, &zero, rtmp, nr FCONE FCONE); for(j=0; j < *nr; j++) SC[ni * *nr + j] += SC[(ei-nTips) * *nr + j]; } for(j=0; j < rc; j++) ans[ni * rc + j] *= rtmp[j]; } } scaleMatrix(&ans[ni * rc], nr, nc, &SC[ni * *nr]); for(j=0; j < *nr; j++) scaleTmp[j] = SC[ni * *nr + j]; F77_CALL(dgemv)("N", nr, nc, &one, &ans[ni * rc], nr, bf, &ONE, &zero, TMP, &ONE FCONE); } SEXP PML0(SEXP dlist, SEXP EL, SEXP G, SEXP NR, SEXP NC, SEXP K, SEXP eig, SEXP bf, SEXP node, SEXP edge, SEXP NTips, SEXP nco, SEXP contrast, SEXP N){ int nr=INTEGER(NR)[0], nc=INTEGER(NC)[0], k=INTEGER(K)[0], i, indLL; int nTips = INTEGER(NTips)[0], *SC; double *g=REAL(G), *tmp, logScaleEPS; SEXP TMP; double *eva, *eve, *evei; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); SC = (int *) R_alloc(nr * k, sizeof(int)); PROTECT(TMP = allocMatrix(REALSXP, nr, k)); // changed tmp=REAL(TMP); for(i=0; i<(k*nr); i++)tmp[i]=0.0; indLL = nr * nc * nTips; for(i=0; intips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goDown(&LL[LINDEX(ch, i)], &LL[LINDEX(pa, i)], P, nr, nc, tmp); } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goUp(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); } } } // double *w, void updateLL2(SEXP dlist, int pa, int ch, double *eva, double *eve, double*evei, double el, double *g, int nr, int nc, int ntips, double *contrast, int nco, int k, double *tmp, double *P){ int i; if(ch>ntips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goDown(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el, g[i], P); goUp(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); } } } void ExtractScale(int ch, int k, int *nr, int *ntips, double *res){ int i; int j, blub, tmp; for(i = 0; i < k; i++){ blub = LINDEX3(ch, i); for(j=0; j< *nr; j++) res[j +i * *nr] = SCM[blub+j]; } for(i = 0; i< *nr; i++){ tmp = res[i]; for(j = 1; j 1e-05) && (k < 10) ) { if(scalep>0.6){ NR_df(eva, nc-1L, edle, w, g, X, ld, nr, f, tmp); ll=0.0; lll=0.0; for(i=0; i 10.0) newedle = 10.0; if (newedle < tau) newedle = tau; // 1e-8 phyML for(i=0; i0L)SET_VECTOR_ELT(RESULT, 1, getM3(child, dad, P, nr, nc)); if(INTEGER(retB)[0]>0L)SET_VECTOR_ELT(RESULT, 2, getM3(dad, child, P, nr, nc)); // add variance ?? SET_VECTOR_ELT(RESULT, 3, ScalarReal(tmp[2])); UNPROTECT(3); return (RESULT); } // in dist.ml SEXP FS5(SEXP eig, SEXP nc, SEXP el, SEXP w, SEXP g, SEXP X, SEXP ld, SEXP nr, SEXP weight, SEXP f0, SEXP tau) { SEXP RESULT; // EL, P; double *wgt=REAL(weight), *eva=REAL(VECTOR_ELT(eig,0)); int ncx=INTEGER(nc)[0], nrx=INTEGER(nr)[0]; PROTECT(RESULT = allocVector(REALSXP, 3)); double edle = REAL(el)[0]; fs3(eva, ncx, edle, REAL(w), REAL(g), REAL(X), INTEGER(ld)[0], nrx, wgt, REAL(f0), REAL(tau)[0], REAL(RESULT)); UNPROTECT(1); return (RESULT); } SEXP optE(SEXP PARENT, SEXP CHILD, SEXP ANC, SEXP eig, SEXP EVI, SEXP EL, SEXP W, SEXP G, SEXP NR, SEXP NC, SEXP NTIPS, SEXP CONTRAST, SEXP CONTRAST2, SEXP NCO, SEXP dlist, SEXP WEIGHT, SEXP F0, SEXP TAU){ int i, k=length(W), h, j, n=length(PARENT), m, lEL=length(EL); int nc=INTEGER(NC)[0], nr=INTEGER(NR)[0], ntips=INTEGER(NTIPS)[0]; int *parent=INTEGER(PARENT), *child=INTEGER(CHILD), *anc=INTEGER(ANC); int loli, nco =INTEGER(NCO)[0]; double *weight=REAL(WEIGHT), *f0=REAL(F0), *w=REAL(W), tau=REAL(TAU)[0]; double *g=REAL(G), *evi=REAL(EVI), *contrast=REAL(CONTRAST), *contrast2=REAL(CONTRAST2); double *el; //=REAL(EL); double *eva, *eve, *evei, *tmp, *P; double *X; // define it *blub=REAL(BLUB), double *blub = (double *) R_alloc(nr * k, sizeof(double)); double oldel; //=el[ch-1L] int ancloli, pa, ch; //=anc[loli] double *res = (double *) R_alloc(3L, sizeof(double)); tmp = (double *) R_alloc(nr * nc, sizeof(double)); P = (double *) R_alloc(nc * nc, sizeof(double)); X = (double *) R_alloc(k * nr * nc, sizeof(double)); ExtractScale(parent[0], k, &nr, &ntips, blub); SEXP RESULT; PROTECT(RESULT = allocVector(REALSXP, lEL)); el=REAL(RESULT); for(i = 0; i < lEL; i++) el[i] = REAL(EL)[i]; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); loli = parent[0]; for(m = 0; m < n; m++){ pa = parent[m]; ch = child[m]; oldel=el[ch-1L]; while(loli != pa){ ancloli=anc[loli]; for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, el[loli-1L], g[i], P); moveLL5(&LL[LINDEX(loli, i)], &LL[LINDEX(ancloli, i)], P, &nr, &nc, tmp); } loli = ancloli; } // moveDad if(ch>ntips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDADI(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); helpPrep(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], eve, evi, nr, nc, tmp, &X[i*nr*nc]); for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDAD5(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); helpPrep2(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast2, evi, nr, nc, nco, &X[i*nr*nc]); //; for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } fs3(eva, nc, oldel, w, g, X, k, nr, weight, f0, tau, res); updateLL2(dlist, pa, ch, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); el[ch-1L] = res[0]; if (ch > ntips) loli = ch; else loli = pa; } UNPROTECT(1); //RESULT return(RESULT); } SEXP optQrtt(SEXP PARENT, SEXP CHILD, SEXP eig, SEXP EVI, SEXP EL, SEXP W, SEXP G, SEXP NR, SEXP NC, SEXP NTIPS, SEXP CONTRAST, SEXP CONTRAST2, SEXP NCO, SEXP dlist, SEXP WEIGHT, SEXP F0, SEXP TAU){ int i, k=length(W), h, j, m, lEL=length(EL); int nc=INTEGER(NC)[0], nr=INTEGER(NR)[0], ntips=INTEGER(NTIPS)[0]; int *parent=INTEGER(PARENT), *child=INTEGER(CHILD), pa, ch; int nco =INTEGER(NCO)[0]; // loli, double *weight=REAL(WEIGHT), *f0=REAL(F0), *w=REAL(W), tau=REAL(TAU)[0]; double *g=REAL(G), *evi=REAL(EVI), *contrast=REAL(CONTRAST), *contrast2=REAL(CONTRAST2); double *el, *X; double *eva, *eve, *evei, *tmp, *P; double *blub = (double *) R_alloc(nr * k, sizeof(double)); double oldel; double *res = (double *) R_alloc(3L, sizeof(double)); tmp = (double *) R_alloc(nr * nc, sizeof(double)); P = (double *) R_alloc(nc * nc, sizeof(double)); X = (double *) R_alloc(k * nr * nc, sizeof(double)); ExtractScale(parent[0], k, &nr, &ntips, blub); SEXP RESULT; PROTECT(RESULT = allocVector(REALSXP, lEL)); el=REAL(RESULT); for(i = 0; i < lEL; i++) el[i] = REAL(EL)[i]; eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); for(m = 4L; m > -1L; m--){ pa = parent[m]; ch = child[m]; oldel=el[m]; // moveDad if(ch>ntips){ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDADI(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], P, nr, nc, tmp); helpPrep(&LL[LINDEX(pa, i)], &LL[LINDEX(ch, i)], eve, evi, nr, nc, tmp, &X[i*nr*nc]); for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } else{ for(i = 0; i < k; i++){ getP(eva, eve, evei, nc, oldel, g[i], P); helpDAD5(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast, P, nr, nc, nco, tmp); helpPrep2(&LL[LINDEX(pa, i)], INTEGER(VECTOR_ELT(dlist, ch-1L)), contrast2, evi, nr, nc, nco, &X[i*nr*nc]); //; for(h = 0; h < nc; h++){ for(j = 0; j < nr; j++){ X[j+h*nr + i*nr*nc] *= blub[j+i*nr]; } } } } fs3(eva, nc, oldel, w, g, X, k, nr, weight, f0, tau, res); // go up // if i=2 go down if(m==2)updateLLQ(dlist, ch, pa, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); else updateLLQ(dlist, pa, ch, eva, eve, evei, res[0], g, nr, nc, ntips, contrast, nco, k, tmp, P); el[m] = res[0]; } UNPROTECT(1); //RESULT return(RESULT); } phangorn/src/sprdist.c0000644000176200001440000011705014127044006014513 0ustar liggesusers/* * sprdist.c * * (c) 2016-2019 Leonardo de Oliveira Martins (leomrtns@gmail.com) * * * This code may be distributed under the GNU GPL * */ #include #include #include #include #include /* standard integer types (int32_t typedef etc.) [C99]*/ #define true 1U /*!< Boolean TRUE */ #define false 0U /*!< Boolean FALSE */ typedef unsigned char bool; typedef struct splitset_struct* splitset; typedef struct hungarian_struct* hungarian; typedef struct bipartition_struct* bipartition; typedef struct bipsize_struct* bipsize; struct splitset_struct { int size, spsize, spr, spr_extra, rf, hdist; /*! \brief spr, extra prunes for spr, rf distances and hdist=assignment cost */ int n_g, n_s, n_agree, n_disagree; bipartition *g_split, *s_split, *agree, *disagree; bipartition prune; hungarian h; /* hungarian method for solving the assignment between edges */ bool match; /*! \brief do we want to calculate the minimum cost assignment */ }; struct hungarian_struct { int **cost, *col_mate; /*! \brief cost matrix, and col_mate[row] with column match for row */ int size, /*! \brief assignment size. Cost is a square matrix, so size should be an overestimate where "missing" nodes are added w/ cost zero */ initial_cost, /*! \brief sum of lowest input cost values for each column. The hungarian method rescales them so that minimum per column is zero */ final_cost; /*! \brief our final cost is on rescaled cost matrix, therefore to restore the "classical" optimal cost one should sum it with initial_cost */ int *unchosen_row, *row_dec, *slack_row, *row_mate, *parent_row, *col_inc, *slack; /* aux vectors */ }; /*! \brief Bit-string representation of splits. */ struct bipartition_struct { unsigned long long *bs; /*! \brief Representation of a bipartition by a vector of integers (bitstrings). */ int n_ones; /*! \brief Counter (number of "one"s) */ bipsize n; /*! \brief number of bits (leaves), vector size and mask */ int ref_counter; /*! \brief How many times this struct is being referenced */ }; struct bipsize_struct { unsigned long long mask;/*! \brief mask to make sure we consider only active positions (of last bitstring) */ int ints, bits, original_size; /*! \brief Vector size and total number of elements (n_ints = n_bits/(8*sizeof(long long)) +1). */ int ref_counter; /*! \brief How many times this struct is being referenced */ }; /*! \brief Allocate space for splitset structure (two vectors of bipartitions), for simple comparisons */ splitset new_splitset (int nleaves, int nsplits); /*! \brief free memory allocated for splitset structure */ void del_splitset (splitset split); /*! \brief low level function that does the actual SPR and hdist calculation based on a filled splitset struct */ int dSPR_topology_lowlevel (splitset split); /*! \brief function used by qsort for a vector of bipartitions (from smaller to larger) */ int compare_splitset_bipartition_increasing (const void *a1, const void *a2); /* BELOW: low level functions that work with bipartitions */ void split_create_agreement_list (splitset split); void split_remove_agree_edges (splitset split, bipartition *b, int *nb); void split_remove_duplicates (bipartition *b, int *nb); void split_compress_agreement (splitset split); void split_create_disagreement_list (splitset split); void split_disagreement_assign_match (splitset split); void split_find_small_disagreement (splitset split); void split_remove_small_disagreement (splitset split); void split_minimize_subtrees (splitset split); void split_remove_redundant_bit (splitset split, int id); void split_replace_bit (splitset split, int to, int from); void split_new_size (splitset split, int size, bool update_bipartitions); void split_swap_position (bipartition *b, int i1, int i2); /* BELOW: Hungarian method for bipartite matching (assignment) */ hungarian new_hungarian (int size); void hungarian_reset (hungarian p); void hungarian_update_cost (hungarian p, int row, int col, int cost); void del_hungarian (hungarian p); void hungarian_solve (hungarian p, int this_size); /* BELOW: Memory-efficient, fast bipartition comparisions based on 64bit representation of splits */ bipartition new_bipartition (int size); bipsize new_bipsize (int size); bipartition new_bipartition_copy_from (const bipartition from); bipartition new_bipartition_from_bipsize (bipsize n); void del_bipartition (bipartition bip); void del_bipsize (bipsize n); void bipsize_resize (bipsize n, int nbits); void bipartition_initialize (bipartition bip, int position); void bipartition_zero (bipartition bip); void bipartition_set (bipartition bip, int position); void bipartition_set_lowlevel (bipartition bip, int i, int j); void bipartition_unset (bipartition bip, int position); void bipartition_unset_lowlevel (bipartition bip, int i, int j); void bipartition_copy (bipartition to, const bipartition from); void bipartition_OR (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_AND (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_ANDNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_XOR (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_XORNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count); void bipartition_NOT (bipartition result, const bipartition bip); void bipartition_count_n_ones (const bipartition bip); void bipartition_to_int_vector (const bipartition b, int *id, int vecsize); bool bipartition_is_equal (const bipartition b1, const bipartition b2); bool bipartition_is_equal_bothsides (const bipartition b1, const bipartition b2); bool bipartition_is_larger (const bipartition b1, const bipartition b2); void bipartition_flip_to_smaller_set (bipartition bip); bool bipartition_is_bit_set (const bipartition bip, int position); bool bipartition_contains_bits (const bipartition b1, const bipartition b2); // void bipartition_print_to_stdout (const bipartition b1); void bipartition_replace_bit_in_vector (bipartition *bvec, int n_b, int to, int from, bool reduce); void bipartition_resize_vector (bipartition *bvec, int n_b); /*! \brief Main SPR calculation function, to be used within R */ SEXP C_sprdist (SEXP bp1, SEXP bp2, SEXP lt) { int i, j, n_leaves = INTEGER(lt)[0]; SEXP result; double *res; splitset split; PROTECT(result = allocVector(REALSXP, 4)); res = REAL(result); // if (length(bp1) != length(bp2)) error ("number of bipartitions given to C_sprdist are not the same"); split = new_splitset (n_leaves, length(bp1)); for (i=0; i < split->size; i++) { // for (j=0; j < length(VECTOR_ELT (bp1, i)); j++) printf (";;%d ", INTEGER (VECTOR_ELT (bp1, i))[j]); for (j=0; j < length(VECTOR_ELT (bp1, i)); j++) bipartition_set (split->g_split[i], INTEGER (VECTOR_ELT (bp1, i))[j] - 1); for (j=0; j < length(VECTOR_ELT (bp2, i)); j++) bipartition_set (split->s_split[i], INTEGER (VECTOR_ELT (bp2, i))[j] - 1); } dSPR_topology_lowlevel (split); res[0] = split->spr; res[1] = split->spr_extra; res[2] = split->rf; res[3] = split->hdist; del_splitset (split); UNPROTECT(1); // result return(result); } /* functions below should not be called outside this scope */ splitset new_splitset (int nleaves, int nsplits) { splitset split; int i; split = (splitset) malloc (sizeof (struct splitset_struct)); split->n_g = split->n_s = split->size = nsplits; split->n_agree = split->n_disagree = 0; split->prune = NULL; split->match = true; /* do we want to calculate the assignment matching cost (using hungarian() )? */ split->spr = split->spr_extra = split->rf = split->hdist = 0; split->g_split = (bipartition*) malloc (split->size * sizeof (bipartition)); split->s_split = (bipartition*) malloc (split->size * sizeof (bipartition)); split->g_split[0] = new_bipartition (nleaves); split->s_split[0] = new_bipartition (nleaves); for (i = 1; i < split->size; i++) { split->g_split[i] = new_bipartition_from_bipsize (split->g_split[0]->n); /* use same bipsize */ split->s_split[i] = new_bipartition_from_bipsize (split->s_split[0]->n); } split->agree = (bipartition*) malloc (split->size * sizeof (bipartition)); split->disagree = (bipartition*) malloc (split->size * split->size * sizeof (bipartition)); split->agree[0] = new_bipartition (nleaves); // this bipsize will be recycled below split->disagree[0] = new_bipartition (nleaves); for (i = 1; i < split->size; i++) split->agree[i] = new_bipartition_from_bipsize (split->agree[0]->n); for (i = 1; i < split->size * split->size; i++) split->disagree[i] = new_bipartition_from_bipsize (split->disagree[0]->n); split->prune = new_bipartition_from_bipsize (split->disagree[0]->n); split->h = new_hungarian (split->size); return split; } void del_splitset (splitset split) { int i; if (!split) return; del_bipartition (split->prune); if (split->disagree) { for (i = split->size * split->size - 1; i >= 0; i--) del_bipartition (split->disagree[i]); free (split->disagree); } if (split->agree) { for (i = split->size - 1; i >= 0; i--) del_bipartition (split->agree[i]); free (split->agree); } if (split->g_split) { for (i = split->size - 1; i >= 0; i--) del_bipartition (split->g_split[i]); free (split->g_split); } if (split->s_split) { for (i = split->size - 1; i >= 0; i--) del_bipartition (split->s_split[i]); free (split->s_split); } del_hungarian (split->h); free (split); } int compare_splitset_bipartition_increasing (const void *a1, const void *a2) { /* similar to bipartition_is_larger() */ bipartition *b1 = (bipartition *) a1; bipartition *b2 = (bipartition *) a2; int i; if ((*b1)->n_ones > (*b2)->n_ones) return 1; if ((*b1)->n_ones < (*b2)->n_ones) return -1; for (i = (*b1)->n->ints - 1; (i >= 0) && ((*b1)->bs[i] == (*b2)->bs[i]); i--); /* find position of distinct bipartition elem*/ if (i < 0) return 0; /* identical bipartitions */ if ((*b1)->bs[i] > (*b2)->bs[i]) return 1; else return -1; } int dSPR_topology_lowlevel (splitset split) { int i = 0, mismatch = -1; for (i=0; i < split->size; i++) { bipartition_flip_to_smaller_set (split->g_split[i]); bipartition_flip_to_smaller_set (split->s_split[i]); } qsort (split->g_split, split->size, sizeof (bipartition), compare_splitset_bipartition_increasing); qsort (split->s_split, split->size, sizeof (bipartition), compare_splitset_bipartition_increasing); //for (i = 0; i < split->n_g; i++) bipartition_print_to_stdout (split->g_split[i]); printf ("G ::DEBUG 0 ::\n"); //for (i = 0; i < split->n_s; i++) bipartition_print_to_stdout (split->s_split[i]); printf ("S\n"); i++; /* to trick -Werror, since we don't use it unless for debug */ while (mismatch) { split_create_agreement_list (split); // vector of identical bipartitions split_compress_agreement (split); // iterative replacement of cherry by new leaf // for (i = 0; i < split->n_g; i++) bipartition_print_to_stdout (split->g_split[i]); printf ("G ::DEBUG::\n"); // for (i = 0; i < split->n_s; i++) bipartition_print_to_stdout (split->s_split[i]); printf ("S\n"); // for (i = 0; i < split->n_agree; i++) bipartition_print_to_stdout (split->agree[i]); printf ("A\n"); if (mismatch == -1) split->rf = split->n_g + split->n_s; mismatch = (split->n_g > 0) && (split->n_s > 0); // all edges were in agreement if (!mismatch) return split->spr; split_create_disagreement_list (split); // vector of smallest disagreements split_disagreement_assign_match (split); /* assignment matching between edges using hungarian method (split->hdist after first time) */ split_remove_duplicates (split->disagree, &(split->n_disagree)); // some elements are equal; this function also qsorts split_find_small_disagreement (split); // could also be one leaf only //for (i = 0; i < split->n_disagree; i++) { bipartition_print_to_stdout (split->disagree[i]); printf ("\n"); } //printf ("{%d} prune: ", split->n_disagree); bipartition_print_to_stdout (split->prune); printf ("\n"); split->spr++; split_remove_small_disagreement (split); split_minimize_subtrees (split); mismatch = (split->n_g > 0) && (split->n_s > 0); // all edges were in agreement } return split->spr; } void split_create_agreement_list (splitset split) { int s, g; for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) if (bipartition_is_equal (split->g_split[g], split->s_split[s])) { bipartition_copy (split->agree[split->n_agree++], split->g_split[g]); split->n_g--; split_swap_position (split->g_split, g, split->n_g); /* if we don't swap them, we lose ref to "old" value on g_split[] */ split->n_s--; split_swap_position (split->s_split, s, split->n_s); g--; s = split->n_s; /* pretend loop finished, examine again with new values */ } split_remove_agree_edges (split, split->g_split, &(split->n_g)); split_remove_agree_edges (split, split->s_split, &(split->n_s)); } void split_remove_agree_edges (splitset split, bipartition *b, int *nb) { int i, a; for (i = 0; i < (*nb); i++) for (a = 0; a < split->n_agree; a++) if (bipartition_is_equal (b[i], split->agree[a])) { (*nb)--; split_swap_position (b, i, (*nb)); i--; a = split->n_agree; /* loop again over new value */ } } void split_remove_duplicates (bipartition *b, int *nb) { int i, j; bipartition pivot; if ((*nb) < 2) return; /* only if we have a vector with > 1 element */ qsort (b, (*nb), sizeof (bipartition), compare_splitset_bipartition_increasing); for (i = (*nb) - 1; i >= 1; i--) if (bipartition_is_equal (b[i], b[i-1])) { pivot = b[i]; /* do not lose a pointer to this element */ for (j = i; j < (*nb)-1; j++) b[j] = b[j+1]; b[j] = pivot; /* j = (*nb) - 1, which will become obsolete through next line --> (*nb)-- */ (*nb)--; } } void split_compress_agreement (splitset split) { int i, j, pair[2]; for (i = 0; i < split->n_agree; i++) if (split->agree[i]->n_ones == 2) { /* cherry in common, can be represented by just one leaf */ bipartition_to_int_vector (split->agree[i], pair, 2); split_remove_redundant_bit (split, pair[1]); split_new_size (split,split->agree[0]->n->bits - 1, false); /* false = do not recalculate every bipartition's last elem */ bipartition_resize_vector (split->agree, split->n_agree); for (j = 0; j < split->n_agree; j++) { /* minimize subtree size and remove single leaves */ bipartition_flip_to_smaller_set (split->agree[j]); /* agree only */ if (split->agree[j]->n_ones < 2) split_swap_position (split->agree, j--, --split->n_agree); } i = -1; /* redo all iterations, with new info (agree[] will be smaller) */ } bipartition_resize_vector (split->g_split, split->n_g); bipartition_resize_vector (split->s_split, split->n_s); } void split_create_disagreement_list (splitset split) { int g, s; for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) { bipartition_XOR (split->disagree[g * split->n_s + s], split->g_split[g], split->s_split[s], true); /* true means to calculate n_ones */ bipartition_flip_to_smaller_set (split->disagree[g * split->n_s + s]); } split->n_disagree = split->n_g * split->n_s; } void split_disagreement_assign_match (splitset split) { /* also calculates split->hdist */ int g, s, max_n, sum = 0; if (split->n_g > split->n_s) max_n = split->n_g; else max_n = split->n_s; if (max_n < 2) return; hungarian_reset (split->h); for (g = 0; g < split->n_g; g++) for (s = 0; s < split->n_s; s++) hungarian_update_cost (split->h, g, s, split->disagree[g * split->n_s + s]->n_ones); hungarian_solve (split->h, max_n); /* now split->h->col_mate will have the pairs */ /* if we do the matching below it becomes much faster, but we may miss the best prune subtrees in a few cases (do not compromise the algo) */ split->n_disagree = 0; for (g = 0; g < max_n; g++) if ((g < split->n_g) && ( split->h->col_mate[g] < split->n_s)) { /* some matchings might be to dummy edges */ bipartition_XOR (split->disagree[split->n_disagree], split->g_split[g], split->s_split[split->h->col_mate[g]], true); /* true means to calculate n_ones */ bipartition_flip_to_smaller_set (split->disagree[split->n_disagree++]); sum += split->disagree[split->n_disagree-1]->n_ones; } if (split->match) { split->hdist = split->h->final_cost+split->h->initial_cost; split->match = false; } } void split_find_small_disagreement (splitset split) { bipartition dis; int a, d; bipartition_copy (split->prune, split->disagree[0]); /* smallest, in case we don't find a better one in loop below */ if (split->prune->n_ones < 2) return; dis = new_bipartition_from_bipsize (split->disagree[0]->n); for (d = 0; d < split->n_disagree; d++) for (a = 0; a < split->n_agree; a++) { if ((split->disagree[d]->n_ones == split->agree[a]->n_ones) || (split->disagree[d]->n_ones == (split->agree[a]->n->bits - split->agree[a]->n_ones))) { bipartition_XOR (dis, split->disagree[d], split->agree[a], true); if (!dis->n_ones) { bipartition_copy (split->prune, split->disagree[d]); d = split->n_disagree; a = split->n_agree; } else if (dis->n_ones == dis->n->bits) { bipartition_NOT (split->prune, split->disagree[d]); d = split->n_disagree; a = split->n_agree; } } } /* check if prune nodes are all on same side of a tree or if they are actually two SPRs (one from each tree) */ for (d = 0; d < split->n_g; d++) { if (!bipartition_contains_bits (split->g_split[d], split->prune)) { bipartition_NOT (dis, split->g_split[d]); if (!bipartition_contains_bits (dis, split->prune)) { split->spr_extra++; d = split->n_g; } } } del_bipartition (dis); } void split_remove_small_disagreement (splitset split) { int *index, i, j = split->prune->n_ones - 1, k = 0, size = split->agree[0]->n->bits; index = (int*) malloc (split->prune->n_ones * sizeof (int)); bipartition_to_int_vector (split->prune, index, split->prune->n_ones); for (i = size - 1; i >= (size - split->prune->n_ones); i--) { if (index[k] >= (size - split->prune->n_ones)) i = -1; else { if (i == index[j]) j--; else split_replace_bit (split, index[k++], i); } } split_new_size (split,size - split->prune->n_ones, true); if (index) free (index); } void split_minimize_subtrees (splitset split) { int i; for (i = 0; i < split->n_s; i++) { bipartition_flip_to_smaller_set (split->s_split[i]); if (split->s_split[i]->n_ones < 2) { split->n_s--; split_swap_position (split->s_split, i, split->n_s); i--; } } for (i = 0; i < split->n_g; i++) { bipartition_flip_to_smaller_set (split->g_split[i]); if (split->g_split[i]->n_ones < 2) { split->n_g--; split_swap_position (split->g_split, i, split->n_g); i--; } } for (i = 0; i < split->n_agree; i++) { bipartition_flip_to_smaller_set (split->agree[i]); if (split->agree[i]->n_ones < 2) { split->n_agree--; split_swap_position (split->agree, i, split->n_agree); i--; } } } void split_remove_redundant_bit (splitset split, int id) { int last = split->agree[0]->n->bits-1; if (id < last) split_replace_bit (split, id, last); } void split_replace_bit (splitset split, int to, int from) { if (from <= to) return; /*not needed for disagree[] */ bipartition_replace_bit_in_vector (split->agree, split->n_agree, to, from, true); bipartition_replace_bit_in_vector (split->g_split, split->n_g, to, from, true); bipartition_replace_bit_in_vector (split->s_split, split->n_s, to, from, true); } void split_new_size (splitset split, int size, bool update_bipartitions) { bipsize_resize (split->g_split[0]->n, size); bipsize_resize (split->s_split[0]->n, size); bipsize_resize (split->agree[0]->n, size); bipsize_resize (split->disagree[0]->n, size); if (update_bipartitions) { bipartition_resize_vector (split->g_split, split->n_g); bipartition_resize_vector (split->s_split, split->n_s); bipartition_resize_vector (split->agree, split->n_agree); } } void split_swap_position (bipartition *b, int i1, int i2) { bipartition pivot = b[i1]; b[i1] = b[i2]; b[i2] = pivot; } /* The hungarian method below is copied from http://www.informatik.uni-freiburg.de/~stachnis/misc.html * The (edited) original message follows: * ** libhungarian by Cyrill Stachniss, 2004 Solving the Minimum Assignment Problem using the ** Hungarian Method. ** This file may be freely copied and distributed! ** ** ** Parts of the used code was originally provided by the "Stanford GraphGase", but I made changes to this code. ** As asked by the copyright node of the "Stanford GraphGase", I hereby proclaim that this file are *NOT* part of the ** "Stanford GraphGase" distrubition! */ void hungarian_reset (hungarian p) { int i, j; for (i = 0; i < p->size; i++) { p->col_mate[i] = p->unchosen_row[i] = p->row_dec[i] = p->slack_row[i] = p->row_mate[i] = p->parent_row[i] = p->col_inc[i] = p->slack[i] = 0; for (j = 0; j < p->size; j++) p->cost[i][j] = 0; } p->final_cost = 0; } hungarian new_hungarian (int size) { int i; hungarian p; p = (hungarian) malloc (sizeof (struct hungarian_struct)); p->size = size; /* n_rows = n_columns; if it's not, fill with zeroes (no cost) */ p->cost = (int**) malloc (size * sizeof (int*)); for (i = 0; i < p->size; i++) p->cost[i] = (int*) malloc (size * sizeof (int)); /* edges would be assignment_matrix[ i * ncols + col_mate[i] ] = true; and other elems "false" (but we don't use the matrix notation) */ p->col_mate = (int*) malloc (size * sizeof (int)); /* for a given row node, col_mate[row] is the assigned col node */ p->unchosen_row = (int*) malloc (size * sizeof (int)); p->row_dec = (int*) malloc (size * sizeof (int)); p->slack_row = (int*) malloc (size * sizeof (int)); p->row_mate = (int*) malloc (size * sizeof (int)); p->parent_row = (int*) malloc (size * sizeof (int)); p->col_inc = (int*) malloc (size * sizeof (int)); p->slack = (int*) malloc (size * sizeof (int)); hungarian_reset (p); return p; } void hungarian_update_cost (hungarian p, int row, int col, int cost) { if (row >= p->size) return; if (col >= p->size) return; p->cost[row][col] = cost; } void del_hungarian (hungarian p) { int i; if (!p) return; if (p->cost) { for (i = p->size - 1; i >= 0; i--) if (p->cost[i]) free (p->cost[i]); free (p->cost); } free (p->col_mate); /* this is the important one, with i assigned to col_mate[i] */ free (p->slack); free (p->col_inc); free (p->parent_row); free (p->row_mate); free (p->slack_row); free (p->row_dec); free (p->unchosen_row); free (p); } void hungarian_solve (hungarian p, int this_size) { int i, j, nrows = this_size, ncols = this_size, k, l, s, t, q, unmatched; p->final_cost = p->initial_cost = 0; if (this_size > p->size) { p->final_cost = -1; return; } /* we don't call biomcmc_error(), but it *is* an error! */ for (l = 0; l < ncols; l++) { // Begin subtract column minima in order to start with lots of zeroes 12 s = p->cost[0][l]; for (k = 1; k < nrows; k++) if (p->cost[k][l] < s) s = p->cost[k][l]; p->initial_cost += s; /* this should be added to final_cost to have classical assignment cost; here we distinguish them */ if (s!=0) for (k = 0; k < nrows; k++) p->cost[k][l] -= s; } // End subtract column minima in order to start with lots of zeroes 12 // Begin initial state 16 t=0; for (l = 0; l < ncols; l++) { // n => num_cols p->row_mate[l]= -1; p->parent_row[l]= -1; p->col_inc[l]=0; p->slack[l]= 0x7FFFFFFF; } for (k = 0; k < nrows; k++) { // m => num_rows s = p->cost[k][0]; for (l = 1; l < ncols; l++) if (p->cost[k][l] < s) s = p->cost[k][l]; p->row_dec[k]=s; for (l = 0; l < ncols; l++) if ((s==p->cost[k][l]) && (p->row_mate[l] < 0)) { p->col_mate[k] = l; p->row_mate[l] = k; // fprintf(stderr, "matching col %d==row %d\n",l,k); goto row_done; } p->col_mate[k] = -1; // fprintf(stderr, "node %d: unmatched row %d\n",t,k); p->unchosen_row[t++] = k; row_done: ; } // End initial state 16 // Begin Hungarian algorithm 18 if (t==0) goto done; unmatched=t; while (1) { q=0; // fprintf(stderr, "Matched %d rows.\n",m-t); while (1) { while (qunchosen_row[q]; s=p->row_dec[k]; for (l=0;lslack[l]) { int del; del = p->cost[k][l] - s + p->col_inc[l]; if (del < p->slack[l]) { if (del==0) { if (p->row_mate[l]<0) goto breakthru; p->slack[l]=0; p->parent_row[l]=k; // fprintf(stderr, "node %d: row %d==col %d--row %d\n", t,row_mate[l],l,k); p->unchosen_row[t++]=p->row_mate[l]; } else { p->slack[l]=del; p->slack_row[l]=k; } } } } // End explore node q of the forest 19 q++; } // Begin introduce a new zero into the matrix 21 s = 0x7FFFFFFF; for (l = 0;l < ncols; l++) if (p->slack[l] && p->slack[l] < s) s = p->slack[l]; for (q = 0; q < t; q++) p->row_dec[ p->unchosen_row[q] ] += s; for (l = 0; l < ncols; l++) if (p->slack[l]) { p->slack[l]-=s; if (p->slack[l]==0) { // Begin look at a new zero 22 k = p->slack_row[l]; // fprintf(stderr, "Decreasing uncovered elements by %d produces zero at [%d,%d]\n", s,k,l); if (p->row_mate[l]<0) { for (j=l+1;jslack[j]==0) p->col_inc[j]+=s; goto breakthru; } else { p->parent_row[l]=k; // fprintf(stderr, "node %d: row %d==col %d--row %d\n",t,row_mate[l],l,k); p->unchosen_row[t++]=p->row_mate[l]; } } // End look at a new zero 22 } else p->col_inc[l]+=s; // End introduce a new zero into the matrix 21 } breakthru: // fprintf(stderr, "Breakthrough at node %d of %d!\n",q,t); while (1) { // Begin update the matching 20 j=p->col_mate[k]; p->col_mate[k]=l; p->row_mate[l]=k; // fprintf(stderr, "rematching col %d==row %d\n",l,k); if (j<0) break; k=p->parent_row[j]; l=j; } // End update the matching 20 if (--unmatched==0) goto done; // Begin get ready for another stage 17 t=0; for (l=0;lparent_row[l]= -1; p->slack[l]=0x7FFFFFFF; } for (k=0;kcol_mate[k]<0) p->unchosen_row[t++]=k; // fprintf(stderr, "node %d: unmatched row %d\n",t,k); // End get ready for another stage 17 } done: // Begin doublecheck the solution 23 for (k = 0; k < nrows; k++) for (l=0;lcost[k][l] < p->row_dec[k] - p->col_inc[l]) { p->final_cost = -1; return;} //printf ("\n**\n"); for (k = 0; k < nrows; k++) { l=p->col_mate[k]; if ((l < 0) || (p->cost[k][l] != p->row_dec[k] - p->col_inc[l])) { p->final_cost = -1; return; } } k=0; for (l=0;lcol_inc[l]) k++; if (k>nrows) { p->final_cost = -1; return; } // End doublecheck the solution 23 // End Hungarian algorithm 18 for (k = 0; k < nrows; ++k) for (l = 0; l < ncols; ++l) p->cost[k][l] = p->cost[k][l] - p->row_dec[k] + p->col_inc[l]; for (i = 0; i < nrows; i++) p->final_cost += p->row_dec[i]; for (i = 0; i < ncols; i++) p->final_cost -= p->col_inc[i]; // fprintf(stderr, "Cost is %d\n",cost); } /* BELOW are the bipartition functions (memory-efficient storage of bipartitions on 64 bits */ int BitStringSize = 8 * sizeof (unsigned long long); bipartition new_bipartition (int size) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = new_bipsize (size); bip->n_ones = 0; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; return bip; } bipsize new_bipsize (int size) { bipsize n; int i; n = (bipsize) malloc (sizeof (struct bipsize_struct)); n->bits = n->original_size = size; n->ref_counter = 1; n->ints = size/BitStringSize + 1; n->mask = 0ULL; for (i=0; i < n->bits%BitStringSize; i++) n->mask |= (1ULL << i); /* disregard other bits */ return n; } bipartition new_bipartition_copy_from (const bipartition from) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = new_bipsize (from->n->bits); bip->n_ones = from->n_ones; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = from->bs[i]; return bip; } bipartition new_bipartition_from_bipsize (bipsize n) { bipartition bip; int i; bip = (bipartition) malloc (sizeof (struct bipartition_struct)); bip->n = n; bip->n->ref_counter++; bip->n_ones = 0; bip->ref_counter = 1; bip->bs = (unsigned long long*) malloc (bip->n->ints * sizeof (unsigned long long)); for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; return bip; } void del_bipartition (bipartition bip) { if (bip) { if (--bip->ref_counter) return; if (bip->bs) free (bip->bs); del_bipsize (bip->n); free (bip); } } void del_bipsize (bipsize n) { if (n) { if (--n->ref_counter) return; free (n); } } void bipsize_resize (bipsize n, int nbits) { int i; n->bits = nbits; n->ints = nbits/BitStringSize + 1; // might be smaller than original bs size n->mask = 0ULL; for (i=0; i < nbits%BitStringSize; i++) n->mask |= (1ULL << i); /* disregard other bits */ } void bipartition_initialize (bipartition bip, int position) { int i, j; for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; j = position%BitStringSize; i = position/BitStringSize; bip->bs[i] = (1ULL << j); bip->n_ones = 1; } void bipartition_zero (bipartition bip) { int i; for (i=0; i < bip->n->ints; i++) bip->bs[i] = 0ULL; bip->n_ones = 0; } void bipartition_set (bipartition bip, int position) { bipartition_set_lowlevel (bip, position/BitStringSize, position%BitStringSize); } void bipartition_set_lowlevel (bipartition bip, int i, int j) { if (bip->bs[i] & (1ULL << j)) return; // bit already set bip->bs[i] |= (1ULL << j); bip->n_ones++; /* doesn't work if we reduce space later (check replace_int_in_vector() ) */ } void bipartition_unset (bipartition bip, int position) { bipartition_unset_lowlevel (bip, position/BitStringSize, position%BitStringSize); } void bipartition_unset_lowlevel (bipartition bip, int i, int j) { if (!(bip->bs[i] & (1ULL << j))) return; // bit already unset bip->bs[i] &= ~(1ULL << j); bip->n_ones--; } void bipartition_copy (bipartition to, const bipartition from) { int i; for (i=0; i < to->n->ints; i++) to->bs[i] = from->bs[i]; to->n_ones = from->n_ones; } void bipartition_OR (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] | b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = b1->n_ones + b2->n_ones; // works on topologies where b1 and b2 are disjoint } void bipartition_AND (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] & b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_ANDNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] & (~b2->bs[i]); result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_XOR (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] ^ b2->bs[i]; result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_XORNOT (bipartition result, const bipartition b1, const bipartition b2, bool update_count) { /* equivalent to XOR followed by NOT */ int i; for (i=0; i < result->n->ints; i++) result->bs[i] = b1->bs[i] ^ (~b2->bs[i]); result->bs[i-1] &= b1->n->mask; /* do not change last bits (do not belong to bipartition) */ if (update_count) bipartition_count_n_ones (result); else result->n_ones = 0;// update_count = false should be used only when you don't care about this value (temp var) } void bipartition_NOT (bipartition result, const bipartition bip) { int i; for (i=0; i < result->n->ints; i++) result->bs[i] = ~bip->bs[i]; result->bs[i-1] &= bip->n->mask; /* do not invert last bits (do not belong to bipartition) */ result->n_ones = bip->n->bits - bip->n_ones; } void bipartition_count_n_ones (const bipartition bip) { int i; unsigned long long j; bip->n_ones = 0; /* // Naive approach for (i=0; i < bip->n_ints - 1; i++) for (j=0; j < BitStringSize; j++) bip->n_ones += ((bip->bs[i] >> j) & 1ULL); for (j=0; j < bip->n_bits%BitStringSize; j++) bip->n_ones += ((bip->bs[i] >> j) & 1ULL); */ // clear the least significant bit set per iteration (Peter Wegner in CACM 3 (1960), 322, mentioned in K&R) for (i=0; i < bip->n->ints; i++) for (j = bip->bs[i]; j; bip->n_ones++) j &= j - 1ULL; } bool bipartition_is_equal (const bipartition b1, const bipartition b2) { int i; if (b1->n_ones != b2->n_ones) return false; if (b1->n->ints != b2->n->ints) return false; for (i=0; i < b1->n->ints - 1; i++) if (b1->bs[i] != b2->bs[i]) return false; b1->bs[i] &= b1->n->mask; b2->bs[i] &= b2->n->mask; /* apply mask before comparing last elems */ if (b1->bs[i] != b2->bs[i]) return false; return true; } bool bipartition_is_equal_bothsides (const bipartition b1, const bipartition b2) { int i; bool equal = true; for (i=0; (i < b1->n->ints - 1) && (equal); i++) if (b1->bs[i] != b2->bs[i]) equal = false; if ((equal) && ((b1->bs[i] & b1->n->mask) != (b2->bs[i] & b2->n->mask))) equal = false; if (equal) return true; /* the biparitions are already the same, without flipping the bits */ /* now we compare one bipartition with the complement of the other */ for (i=0; (i < b1->n->ints - 1); i++) if (b1->bs[i] != ~b2->bs[i]) return false; if ((b1->bs[i] & b1->n->mask) != ((~b2->bs[i]) & b2->n->mask)) return false; return true; /* they are the exact complement of one another */ } bool bipartition_is_larger (const bipartition b1, const bipartition b2) { int i; if (b1->n_ones > b2->n_ones) return true; if (b1->n_ones < b2->n_ones) return false; for (i = b1->n->ints - 1; (i >= 0) && (b1->bs[i] == b2->bs[i]); i--); /* find position of distinct bipartition elem*/ if (i < 0) return false; /* identical bipartitions */ if (b1->bs[i] > b2->bs[i]) return true; else return false; } void bipartition_flip_to_smaller_set (bipartition bip) { int i = bip->n->ints - 1; /* most significant position -- consistent with is_larger() above, using OLD algo below */ if ((2 * bip->n_ones) < bip->n->bits) return; /* it is already the smaller set */ /* OLD always x is different from ~x, so we just look at last element ("largest digits of number") */ // if (((2 * bip->n_ones) == bip->n->bits) && (bip->bs[i] < (bip->n->mask & ~bip->bs[i]))) return; /* NEW: resolve ties by always showing the same "side" of bipartition, that is, the one having an arbitrary leaf (first one, in our case) */ if (((2 * bip->n_ones) == bip->n->bits) && (bip->bs[0] & 1ULL)) return; for (i=0; i < bip->n->ints; i++) bip->bs[i] = ~bip->bs[i]; /* like bipartition_NOT() */ bip->bs[i-1] &= bip->n->mask; /* do not invert last bits (do not belong to bipartition) */ bip->n_ones = bip->n->bits - bip->n_ones; return; } bool bipartition_is_bit_set (const bipartition bip, int position) { if (bip->bs[(int)(position/BitStringSize)] & (1ULL << (int)(position%BitStringSize))) return true; return false; } bool bipartition_contains_bits (const bipartition b1, const bipartition b2) { /* generalization of bipartition_is_bit_set(); b1 contains or not b2 */ int i; if (b1->n_ones < b2->n_ones) return false; for (i=0; i < b1->n->ints; i++) if ((b2->bs[i]) && (b2->bs[i] != (b1->bs[i] & b2->bs[i]))) return false; return true; } void bipartition_to_int_vector (const bipartition b, int *id, int vecsize) { int i, j, k = 0; for (i=0; i < b->n->ints; i++) for (j=0; (j < BitStringSize) && (k < vecsize); j++) if ( ((b->bs[i] >> j) & 1ULL) ) id[k++] = i * BitStringSize + j; } /* void bipartition_print_to_stdout (const bipartition b1) { int i, j; for (i = 0; i < b1->n->ints - 1; i++) { for (j = 0; j < BitStringSize; j++) printf ("%d", (int)((b1->bs[i] >> j) & 1ULL)); printf ("."); } for (j = 0; j < b1->n->bits%BitStringSize; j++) printf ("%d", (int)((b1->bs[i] >> j) & 1ULL)); printf ("[%d] ", b1->n_ones); } */ void bipartition_replace_bit_in_vector (bipartition *bvec, int n_b, int to, int from, bool reduce) { /* copy info from position "from" to position "to" */ int k, j = from%BitStringSize, i = from/BitStringSize, j2 = to%BitStringSize, i2 = to/BitStringSize; /* boolean "reduce" means that bitstring space will be reduced (last bits will be removed), therefore the update of * n_ones is different from default bipartition_set() behaviour: it's not an extra "1" (that is, one that did not * contribute to n_ones), but an existing "1" that change places. Schematically: * from -> to | normal n_ones count | when bitstring is reduced afterwards * 0 -> 0 | 0 | 0 * 0 -> 1 | -1 | -1 * 1 -> 0 | +1 | 0 (since it's a leaf that belonged to position "from" and now is on position "to") * 1 -> 1 | 0 | -1 (in fact one of the two "1"s dissapeared after reducing the bitstring * (the above description is outdated since I rewrote by hand the bit functions -- observe how we must erase 1 values from "from") */ if (reduce) for (k = 0; k < n_b; k++) { // copy 0 or 1 values, erasing "from" values to avoid problems after reducing space (hanging 1s out of range) if ( ((bvec[k]->bs[i] >> j) & 1ULL) && ((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->n_ones--; bvec[k]->bs[i] &= ~(1ULL << j); } else if ( ((bvec[k]->bs[i] >> j) & 1ULL) && !((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->bs[i2] |= (1ULL << j2); bvec[k]->bs[i] &= ~(1ULL << j); } else if ( !((bvec[k]->bs[i] >> j) & 1ULL) && ((bvec[k]->bs[i2] >> j2) & 1ULL) ) { bvec[k]->bs[i2] &= ~(1ULL << j2); bvec[k]->n_ones--; } /* else do nothing (from zero to zero) */ } else for (k = 0; k < n_b; k++) { // copy 0 or 1 values if ( ((bvec[k]->bs[i] >> j) & 1ULL) ) bipartition_set_lowlevel (bvec[k], i2, j2); // will check if n_ones change or not else bipartition_unset_lowlevel (bvec[k], i2, j2); } } void bipartition_resize_vector (bipartition *bvec, int n_b) { int k, i = bvec[0]->n->ints - 1; for (k = 0; k < n_b; k++) { bvec[k]->bs[i] &= bvec[0]->n->mask; bipartition_count_n_ones (bvec[k]); } } phangorn/src/Fitch.h0000644000176200001440000000424414140457727014102 0ustar liggesusers#include #ifndef _FITCH_H_ #define _FITCH_H_ #ifndef __has_builtin #define __has_builtin(x) 0 #endif #ifdef __GNUC__ #define GNUC_PREREQ(x, y) \ (__GNUC__ > x || (__GNUC__ == x && __GNUC_MINOR__ >= y)) #else #define GNUC_PREREQ(x, y) 0 #endif #if GNUC_PREREQ(4, 2) || \ __has_builtin(__builtin_popcount) #define HAVE_BUILTIN_POPCOUNT #endif using namespace Rcpp; // Counting bits set, Brian Kernighan's way // from Bit Twiddling Hacks by Sean Eron Anderson seander@cs.stanford.edu // count the number of bits set in v // fast if few bits set, what we assume static inline int bitCount64(uint64_t v){ int c; for (c = 0; v; c++){ v &= v - 1; // clear the least significant bit set } return c; } #if defined(HAVE_BUILTIN_POPCOUNT) static inline int popcnt64(uint64_t x) { return __builtin_popcountll(x); } #else static inline int popcnt64(uint64_t x) { return bitCount64(x); } #endif #define BIT_SIZE 64 std::vector< std::vector > readFitch(const List &xlist, IntegerMatrix contr, int nSeq, int nChar, int nStates, int nBits, int m); // IntegerMatrix preorder(const IntegerMatrix & edge, int nTips); class Fitch { public: // Fitch(Robject) Fitch (RObject obj, int w1, int m) { weight = obj.attr("weight"); nChar = (int) obj.attr("nr"); if( (nChar % BIT_SIZE) ){ for(int i= (nChar % BIT_SIZE); i > X; IntegerVector pscore_nodes; NumericVector weight; // Integer?? int nChar; int nSeq; int nStates; int nBits; int wBits; int m; int p0; }; #endif // _FITCH_H_ phangorn/src/fitch64.cpp0000644000176200001440000006642514140460000014632 0ustar liggesusers#include #include "Fitch.h" #include "phangorn_utils.h" //#include // parallel for // simd //using namespace Rcpp; //Enable C++11, as we may want to have unsigned long long (uint64_t) // [[Rcpp::plugins(cpp11)]] /* // Examples from Dirk to find minimum dist double vecmin(NumericVector x) { // Rcpp supports STL-style iterators NumericVector::iterator it = std::min_element(x.begin(), x.end()); // we want the value so dereference return *it; } int vecminInd(NumericVector x) { // Rcpp supports STL-style iterators NumericVector::iterator it = std::min_element(x.begin(), x.end()); // we want the position (+1 in R) return it - x.begin(); } */ std::vector< std::vector > readFitch(const List &xlist, IntegerMatrix contr, int nSeq, int nChar, int nStates, int nBits, int m){ int current_bit=0; std::vector< std::vector > out(m * nSeq); std::vector tmp; // tmp(nStates); for (int k = 0; k < nStates; ++k) tmp.push_back(0ull); for(int i=0; i 0){ tmp[k] |= (1ull << current_bit); } } current_bit++; if (current_bit == BIT_SIZE){ for (int k = 0; k < nStates; ++k){ out[i].push_back(tmp[k]); tmp[k] = 0ull; } current_bit = 0; } } if (current_bit && (current_bit != BIT_SIZE)){ for (; current_bit < BIT_SIZE; ++current_bit){ for (int k = 0; k < nStates; ++k){ tmp[k] |= (1ull << current_bit); } } for (int k = 0; k < nStates; ++k){ out[i].push_back(tmp[k]); tmp[k] = 0ull; } } out[i].shrink_to_fit(); } uint64_t tmp0=0ull; if(m>1){ for(int i=nSeq; i<(m*nSeq); ++i) { for(int j=0; j<(nStates*nBits); ++j){ out[i].push_back(tmp0); } out[i].shrink_to_fit(); } } return out; // wrap(out) } IntegerMatrix getAnc(Fitch* obj, int i){ int states = obj->nStates; int nBits = obj->nBits; uint64_t tmp; std::vector< std::vector > vector = obj->X; uint64_t * seq; seq = vector[i - 1].data(); IntegerMatrix res(BIT_SIZE*nBits, states); for (int i = 0; i < nBits; ++i){ for (int j = 0; j < states; ++j){ tmp = seq[j]; for(int l=0; l> l) & 1ull ) res(i*BIT_SIZE+l,j) = 1; } } seq += states; } return(res); } IntegerVector getAncAmb(Fitch* obj, int i){ int states = obj->nStates; int nBits = obj->nBits; uint64_t tmp; std::vector< std::vector > vector = obj->X; IntegerVector xx = IntegerVector::create(1, 2, 4, 8); uint64_t * seq; seq = vector[i - 1].data(); IntegerVector res(BIT_SIZE*nBits); for (int i = 0; i < nBits; ++i){ for (int j = 0; j < states; ++j){ tmp = seq[j]; for(int l=0; l> l) & 1ull ) res(i*BIT_SIZE+l) += xx[j]; } } seq += states; } return(res); } // Instead of looping through every single bit, you can instead loop through only the set bits, which can be faster if you expect bits to be sparsely set: // Assume the bit field is in (scalar integer) variable field. /* while (field){ temp = field & -field; //extract least significant bit on a 2s complement machine field ^= temp; // toggle the bit off //now you could have a switch statement or bunch of conditionals to test temp //or get the index of the bit and index into a jump table, etc. } */ // Works pretty well when the bit field is not limited to the size of a single data type, but could be of some arbitrary size. In that case, you can extract 32 (or whatever your register size is) bits at a time, test it against 0, and then move on to the next word. void update_vector_generic(uint64_t * parent, const uint64_t * child1, const uint64_t * child2, int nBits, int states){ for (int i = 0; i < nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; // #pragma omp simd private(orvand) for (int j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); // store vectors at parent // #pragma omp simd for (int j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; } } void update_vector_4x4(uint64_t * parent, const uint64_t * child1, const uint64_t * child2, int nBits, int states){ uint64_t tmp0, tmp1, tmp2, tmp3; // #pragma omp simd for (int i = 0; i < nBits; ++i){ uint64_t orvand = 0; tmp0 = (child1[0] & child2[0]); tmp1 = (child1[1] & child2[1]); tmp2 = (child1[2] & child2[2]); tmp3 = (child1[3] & child2[3]); orvand = tmp0 | tmp1 | tmp2 | tmp3; parent[0] = tmp0 | (~orvand & (child1[0] | child2[0])); parent[1] = tmp1 | (~orvand & (child1[1] | child2[1])); parent[2] = tmp2 | (~orvand & (child1[2] | child2[2])); parent[3] = tmp3 | (~orvand & (child1[3] | child2[3])); child1 += states; child2 += states; parent += states; } } void update_vector_2x2(uint64_t * parent, const uint64_t * child1, const uint64_t * child2, int nBits, int states){ uint64_t tmp0, tmp1; for (int i = 0; i < nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0; tmp0 = (child1[0] & child2[0]); tmp1 = (child1[1] & child2[1]); orvand = tmp0 | tmp1; parent[0] = tmp0 | (~orvand & (child1[0] | child2[0])); parent[1] = tmp1 | (~orvand & (child1[1] | child2[1])); child1 += states; child2 += states; parent += states; } } void update_vector(uint64_t * parent, const uint64_t * child1, const uint64_t * child2, int nBits, int states) { if (states == 4) update_vector_4x4(parent, child1, child2, nBits, states); else if (states == 2) update_vector_2x2(parent, child1, child2, nBits, states); else update_vector_generic(parent, child1, child2, nBits, states); } void update_vector_single_4x4(uint64_t * parent, const uint64_t * child, int nBits, int states){ uint64_t tmp0, tmp1, tmp2, tmp3; for (int i = 0; i < nBits; ++i){ uint64_t orvand = 0ull; tmp0 = (child[0] & parent[0]); tmp1 = (child[1] & parent[1]); tmp2 = (child[2] & parent[2]); tmp3 = (child[3] & parent[3]); orvand = tmp0 | tmp1 | tmp2 | tmp3; parent[0] = tmp0 | (~orvand & (child[0] | parent[0])); parent[1] = tmp1 | (~orvand & (child[1] | parent[1])); parent[2] = tmp2 | (~orvand & (child[2] | parent[2])); parent[3] = tmp3 | (~orvand & (child[3] | parent[3])); child += states; parent += states; } } void update_vector_single_2x2(uint64_t * parent, const uint64_t * child, int nBits, int states){ uint64_t tmp0, tmp1; for (int i = 0; i < nBits; ++i){ uint64_t orvand = 0ull; tmp0 = (child[0] & parent[0]); tmp1 = (child[1] & parent[1]); orvand = tmp0 | tmp1; parent[0] = tmp0 | (~orvand & (child[0] | parent[0])); parent[1] = tmp1 | (~orvand & (child[1] | parent[1])); child += states; parent += states; } } void update_vector_single_generic(uint64_t * parent, const uint64_t * child, int nBits, int states){ for (int i = 0; i < nBits; ++i){ uint64_t orvand = 0; for (int j = 0; j < states; ++j) orvand |= (child[j] & parent[j]); for (int j = 0; j < states; ++j) { parent[j] = (child[j] & parent[j]) | (~orvand & (child[j] | parent[j])); } child += states; parent += states; } } void update_vector_single(uint64_t * parent, const uint64_t * child, int nBits, int states) { if (states == 4) update_vector_single_4x4(parent, child, nBits, states); else if (states == 2) update_vector_single_2x2(parent, child, nBits, states); else update_vector_single_generic(parent, child, nBits, states); } void traverse(Fitch* obj, const IntegerMatrix & orig){ int states = obj->nStates; int nBits = obj->nBits; IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); int nl=desc.size(); int unrooted = nl % 2; if(unrooted == 1) nl = nl-1; for(int k=0; kX[anc[k] - 1].data(), obj->X[desc[k] - 1].data(), obj->X[desc[k+1] - 1].data(), nBits, states); } if(unrooted){ update_vector_single(obj->X[anc[nl] - 1].data(), obj->X[desc[nl] - 1].data(), nBits, states); } } void traversetwice(Fitch* obj, const IntegerMatrix & orig, int nni){ int states = obj->nStates; int nBits = obj->nBits; int nTips = obj->nSeq; IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); if(nni > 0) nni = nTips - 1; else nni = -1; int nl=desc.size(); int unrooted = nl % 2; // int l = nl; if(unrooted == 1) nl = nl-1; for(int k=0; kX[anc[k] - 1].data(), obj->X[desc[k] - 1].data(), obj->X[desc[k+1] - 1].data(), nBits, states); } if(unrooted == 1){ update_vector_single(obj->X[anc[nl] - 1].data(), obj->X[desc[nl] - 1].data(), nBits, states); int a = desc[nl] -1; int b = desc[nl-1] -1; int c = desc[nl-2] -1; update_vector(obj->X[a + 2*nTips].data(), obj->X[b].data(), obj->X[c].data(), nBits, states); update_vector(obj->X[b + 2*nTips].data(), obj->X[a].data(), obj->X[c].data(), nBits, states); update_vector(obj->X[c + 2*nTips].data(), obj->X[a].data(), obj->X[b].data(), nBits, states); } else{ int a = desc[nl-1] -1; int b = desc[nl-2] -1; update_vector_single(obj->X[a + 2*nTips].data(), obj->X[b].data(), nBits, states); update_vector_single(obj->X[b + 2*nTips].data(), obj->X[a].data(), nBits, states); } nl -= 2; for(int i=nl; i>0; i-=2){ int p = anc[i-1] -1; int c1 = desc[i-1] -1; int c2 = desc[i-2] -1; if(c1 > nni)update_vector(obj->X[c1 + 2*nTips].data(), obj->X[p + 2*nTips].data(), obj->X[c2].data(), nBits, states); if(c1 > nni)update_vector(obj->X[c2 + 2*nTips].data(), obj->X[p + 2*nTips].data(), obj->X[c1].data(), nBits, states); } } void acctran_help(uint64_t * child, const uint64_t * parent, int nBits, int states){ for (int i = 0; i < nBits; ++i){ uint64_t orvand = 0; for (int j = 0; j < states; ++j) orvand |= (child[j] & parent[j]); for (int j = 0; j < states; ++j) { child[j] = (child[j] & parent[j]) | (~orvand & child[j]); } child += states; parent += states; } } void acctran_traverse(Fitch* obj, const IntegerMatrix & orig){ int states = obj->nStates; int nBits = obj->nBits; IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); for(int i=0; i < anc.size(); ++i) { acctran_help(obj->X[desc[i] - 1].data(), obj->X[anc[i] - 1].data(), nBits, states); } } void root_all_node(Fitch* obj, const IntegerMatrix orig) { int states = obj->nStates; int nBits = obj->nBits; int nSeq = obj->nSeq; // std::vector< std::vector > vector = obj->X; IntegerVector node = orig( _, 1); for(int i=0; i < node.size(); ++i) { int ni = node[i]-1; // generic update_vector_single(obj->X[ni + 2*nSeq].data(), obj->X[ni].data(), nBits, states); } } // needed for random.addition, SPR & TBR void prep_spr(Fitch* obj, IntegerMatrix orig){ traversetwice(obj, orig, 0L); root_all_node(obj, orig); } // generic, TODO: bitcount, 2x2, 4x4 double pscore_vector_generic(const uint64_t* x, const uint64_t* y, const NumericVector weight, int nBits, int wBits, int states){ double pscore = 0.0; uint64_t ones = ~0ull; uint64_t tmp = 0ull; for (int i = 0; i < wBits; ++i){ uint64_t orvand = 0; for (int j = 0; j < states; ++j) orvand |= (x[j] & y[j]); tmp = ~orvand & ones; if(tmp>0ull){ for(int l=0; l<64; ++l){ if( (tmp >> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; } } x += states; y += states; } for (int i = wBits; i < nBits; ++i){ uint64_t orvand = 0; for (int j = 0; j < states; ++j) orvand |= (x[j] & y[j]); tmp = ~orvand & ones; pscore += popcnt64(tmp); x += states; y += states; } return(pscore); } double pscore_vector_4x4(const uint64_t* x, const uint64_t* y, const NumericVector weight, int nBits, int wBits, int states){ double pscore = 0.0; uint64_t ones = ~0ull; uint64_t tmp = 0ull; uint64_t orvand = 0; for (int i = 0; i < wBits; ++i){ orvand = (x[0] & y[0]) | (x[1] & y[1]) | (x[2] & y[2]) | (x[3] & y[3]); tmp = ~orvand & ones; if(tmp>0ull){ for(int l=0; l<64; ++l){ if( (tmp >> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; } } x += states; y += states; } for (int i = wBits; i < nBits; ++i){ orvand = (x[0] & y[0]) | (x[1] & y[1]) | (x[2] & y[2]) | (x[3] & y[3]); tmp = ~orvand & ones; pscore += popcnt64(tmp); x += states; y += states; } return(pscore); } double pscore_vector_2x2(const uint64_t* x, const uint64_t* y, const NumericVector weight, int nBits, int wBits, int states){ double pscore = 0.0; uint64_t ones = ~0ull; uint64_t tmp = 0ull; uint64_t orvand = 0; for (int i = 0; i < wBits; ++i){ orvand = (x[0] & y[0]) | (x[1] & y[1]); tmp = ~orvand & ones; if(tmp>0ull){ for(int l=0; l<64; ++l){ if( (tmp >> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; } } x += states; y += states; } for (int i = wBits; i < nBits; ++i){ orvand = (x[0] & y[0]) | (x[1] & y[1]); tmp = ~orvand & ones; pscore += popcnt64(tmp); x += states; y += states; } return(pscore); } double pscore_vector(const uint64_t* x, const uint64_t* y, const NumericVector weight, int nBits, int wBits, int states) { double res=0.0; if (states == 4) res=pscore_vector_4x4(x, y, weight, nBits, wBits, states); else if (states == 2) res=pscore_vector_2x2(x, y, weight, nBits, wBits, states); else res=pscore_vector_generic(x, y, weight, nBits, wBits, states); return(res); } int pscore_quartet(const uint64_t* a, const uint64_t* b, const uint64_t* c, const uint64_t* d, const NumericVector weight, int nBits, int wBits, int states) { double pscore = 0.0; uint64_t ones = ~0ull; uint64_t tmp1, tmp2, tmp3; uint64_t e, f; for (int i = 0; i < wBits; ++i){ uint64_t ou_ab = 0; uint64_t ou_cd = 0; uint64_t ou_ef = 0; for (int j = 0; j < states; ++j){ ou_ab |= (a[j] & b[j]); ou_cd |= (c[j] & d[j]); } for (int j = 0; j < states; ++j) { e = (a[j] & b[j]) | (~ou_ab & (a[j] | b[j])); f = (c[j] & d[j]) | (~ou_cd & (c[j] | d[j])); ou_ef |= (e & f); } tmp1 = ~ou_ab & ones; tmp2 = ~ou_cd & ones; tmp3 = ~ou_ef & ones; if((tmp1 | tmp2 | tmp3) > 0ull){ for(int l=0; l> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; if( (tmp2 >> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; if( (tmp3 >> l) & 1ull ) pscore += weight[i*BIT_SIZE + l]; } } a += states; b += states; c += states; d += states; } for (int i = wBits; i < nBits; ++i){ uint64_t ou_ab = 0; uint64_t ou_cd = 0; uint64_t ou_ef = 0; for (int j = 0; j < states; ++j){ ou_ab |= (a[j] & b[j]); ou_cd |= (c[j] & d[j]); } for (int j = 0; j < states; ++j) { e = (a[j] & b[j]) | (~ou_ab & (a[j] | b[j])); f = (c[j] & d[j]) | (~ou_cd & (c[j] | d[j])); ou_ef |= (e & f); } tmp1 = ~ou_ab & ones; tmp2 = ~ou_cd & ones; tmp3 = ~ou_ef & ones; pscore += popcnt64(tmp1) + popcnt64(tmp2) + popcnt64(tmp3); a += states; b += states; c += states; d += states; } return pscore; } IntegerMatrix pscore_nni(Fitch* obj, IntegerMatrix & M){ int nr = M.nrow(); IntegerMatrix res(nr, 3); std::vector< std::vector > X = obj->X; int states = obj->nStates; int nBits = obj->nBits; int wBits = obj->wBits; NumericVector weight = obj->weight; int a=0, b=0, c=0, d=0; for (int i = 0; i < nr; i++) { a = M(i,0) - 1L; b = M(i,1) - 1L; c = M(i,2) - 1L; d = M(i,3) - 1L; res(i,0) = pscore_quartet(X[a].data(), X[b].data(), X[c].data(), X[d].data(), weight, nBits, wBits, states); res(i,1) = pscore_quartet(X[a].data(), X[c].data(), X[b].data(), X[d].data(), weight, nBits, wBits, states); res(i,2) = pscore_quartet(X[b].data(), X[c].data(), X[a].data(), X[d].data(), weight, nBits, wBits, states); } return(res); } /* int get_quartet(Fitch* obj, IntegerVector & M){ std::vector< std::vector > X = obj->X; int states = obj->nStates; int nBits = obj->nBits; int wBits = obj->wBits; NumericVector weight = obj->weight; int res = pscore_quartet(X[M[0]].data(), X[M[1]].data(), X[M[2]].data(), X[M[3]].data(), weight, nBits, wBits, states); return(res); } */ NumericVector pscore_vec(Fitch* obj, IntegerVector & edge_to, int node_from){ // std::vector res; int n = edge_to.size(); NumericVector res(n); int states = obj->nStates; int nBits = obj->nBits; int wBits = obj->wBits; NumericVector weight = obj->weight; uint64_t * node_vec; node_vec = obj->X[node_from - 1L].data(); // #pragma omp parallel for num_threads(4) for(int i=0; i < edge_to.size(); ++i) { res[i] = pscore_vector(obj->X[edge_to[i]-1].data(), node_vec, weight, nBits, wBits, states); } return(res); } // dist.hamming works for >31 states, TODO openMP NumericVector hamming_dist(Fitch* obj){ int i, j; size_t ij; int states = obj->nStates; int nBits = obj->nBits; int wBits = obj->wBits; int nTips = obj->nSeq; R_xlen_t N; N = (R_xlen_t)nTips * (nTips-1)/2; std::vector< std::vector > X = obj->X; NumericVector weight = obj->weight; NumericVector ans(N); ij = 0; i=0; j=1; for(j = 0 ; j < (nTips-1L) ; j++) for(i = j+1; i < nTips ; i++) ans[ij++] = pscore_vector(X[i].data(), X[j].data(), weight, nBits, wBits, states); return(ans); } IntegerVector sitewise_pscore(Fitch* obj, const IntegerMatrix & orig){ int i,j; int states = obj->nStates; int nBits = obj->nBits; std::vector< std::vector > vector = obj->X; IntegerVector pars(nBits * BIT_SIZE); IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); int nl=desc.size(); int unrooted = nl % 2; if(unrooted == 1) nl = nl-1; uint64_t * child1; uint64_t * child2; uint64_t * parent; // set all bits to one uint64_t ones = ~0ull; uint64_t tmp = 0ull; for(int k=0; knBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; tmp = ~orvand & ones; for(int l=0; l> l) & 1ull); // tmp >>= 1ull; } } } if(unrooted){ child1 = vector[desc[nl] - 1].data(); parent = vector[anc[nl] - 1].data(); for (i = 0; i < obj->nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & parent[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & parent[j]) | (~orvand & (child1[j] | parent[j])); } child1 += states; parent += states; uint64_t tmp = ~orvand & ones; for(int l=0; l> l) & 1ull); // tmp >>= 1ullll; } } } return(pars); } double pscore(Fitch* obj, const IntegerMatrix & orig){ int i,j; int states = obj->nStates; int nBits = obj->nBits; std::vector< std::vector > vector = obj->X; double pars = 0; int p0 = obj->p0; IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); int nl=desc.size(); int unrooted = nl % 2; if(unrooted == 1) nl = nl-1; uint64_t * child1; uint64_t * child2; uint64_t * parent; // set all bits to one uint64_t ones = ~0ull; uint64_t tmp = 0ull; for(int k=0; kwBits; ++i){ // for (i = 0; i < obj->nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; tmp = ~orvand & ones; for(int l=0; l> l) & 1ull) pars+= obj->weight[i*BIT_SIZE + l]; } } for (int i = obj->wBits; i < nBits; ++i){ uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); for (j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; tmp = ~orvand & ones; pars += popcnt64(tmp); } } if(unrooted){ child1 = vector[desc[nl] - 1].data(); parent = vector[anc[nl] - 1].data(); for (i = 0; i < obj->wBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & parent[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & parent[j]) | (~orvand & (child1[j] | parent[j])); } child1 += states; parent += states; uint64_t tmp = ~orvand & ones; for(int l=0; l> l) & 1ull) pars+= obj->weight[i*BIT_SIZE + l]; } } for (int i = obj->wBits; i < nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & parent[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & parent[j]) | (~orvand & (child1[j] | parent[j])); } child1 += states; parent += states; uint64_t tmp = ~orvand & ones; pars += popcnt64(tmp); } } pars += p0; return(pars); } NumericVector pscore_node(Fitch* obj, const IntegerMatrix & orig){ int i,j; int states = obj->nStates; int nBits = obj->nBits; std::vector< std::vector > vector = obj->X; int nSeq = obj->nSeq; NumericVector pars(2 * nSeq); IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); int nl=desc.size(); int unrooted = nl % 2; if(unrooted == 1) nl = nl-1; uint64_t * child1; uint64_t * child2; uint64_t * parent; // set all bits to one uint64_t ones = ~0ull; uint64_t tmp = 0ull; for(int k=0; kwBits; ++i){ // for (i = 0; i < obj->nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; tmp = ~orvand & ones; for(int l=0; l> l) & 1ull) pars[anc[k] - 1L]+= obj->weight[i*BIT_SIZE + l]; } } for (int i = obj->wBits; i < nBits; ++i){ uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & child2[j]); for (j = 0; j < states; ++j) { parent[j] = (child1[j] & child2[j]) | (~orvand & (child1[j] | child2[j])); } child1 += states; child2 += states; parent += states; tmp = ~orvand & ones; pars[anc[k] - 1L] += popcnt64(tmp); } } if(unrooted){ child1 = vector[desc[nl] - 1].data(); parent = vector[anc[nl] - 1].data(); for (i = 0; i < obj->wBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & parent[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & parent[j]) | (~orvand & (child1[j] | parent[j])); } child1 += states; parent += states; uint64_t tmp = ~orvand & ones; for(int l=0; l> l) & 1ull) pars[anc[nl] - 1L]+= obj->weight[i*BIT_SIZE + l]; } } for (int i = obj->wBits; i < nBits; ++i){ // OR the ANDs of all states uint64_t orvand = 0ull; for (j = 0; j < states; ++j) orvand |= (child1[j] & parent[j]); // store vectors at parent for (j = 0; j < states; ++j) { parent[j] = (child1[j] & parent[j]) | (~orvand & (child1[j] | parent[j])); } child1 += states; parent += states; uint64_t tmp = ~orvand & ones; pars [anc[nl] - 1L]+= popcnt64(tmp); } } return(pars); } NumericVector pscore_acctran(Fitch* obj, const IntegerMatrix & orig){ int states = obj->nStates; int nBits = obj->nBits; int wBits = obj->wBits; NumericVector weight = obj->weight; int nSeq = obj->nSeq; NumericVector pars(2 * nSeq); IntegerVector anc = orig( _, 0); IntegerVector desc = orig( _, 1); for(int i=0; i X[anc[i]-1].data(), obj->X[desc[i]-1].data(), weight, nBits, wBits, states); } return(pars); } RCPP_MODULE(Fitch_mod) { using namespace Rcpp; class_("Fitch") .constructor("Default constructor") // .property("get_nr", &Fitch::getNR) // .property("get_nbits", &Fitch::getnBits) // .property("get_weight", &Fitch::getWeight) // .property("get_p0", &Fitch::getP0) // .method("get_quartet", &get_quartet) // .method("prep_nni", &prep_nni) .method("prep_spr", &prep_spr) .method("pscore_nni", &pscore_nni) .method("pscore", &pscore) .method("pscore_vec", &pscore_vec) .method("pscore_node", &pscore_node) .method("pscore_acctran", &pscore_acctran) .method("acctran_traverse", &acctran_traverse) .method("traverse", &traverse) .method("sitewise_pscore", &sitewise_pscore) .method("hamming_dist", &hamming_dist) .method("root_all_node", &root_all_node) .method("getAnc", &getAnc) .method("getAncAmb", &getAncAmb) .method("traversetwice", &traversetwice) ; } phangorn/src/Makevars0000644000176200001440000000006114140750745014355 0ustar liggesusersPKG_LIBS = $(BLAS_LIBS) $(FLIBS) CXX_STD = CXX11 phangorn/src/sankoff.c0000644000176200001440000001731014155444777014474 0ustar liggesusers/* * dist.c * * (c) 2008-2021 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ #include #include #include SEXP C_rowMin(SEXP sdat, SEXP sn, SEXP sk){ int i, h, n=INTEGER(sn)[0], k=INTEGER(sk)[0]; double x, *res, *dat; SEXP result; PROTECT(result = allocVector(REALSXP, n)); res = REAL(result); PROTECT(sdat = coerceVector(sdat, REALSXP)); dat = REAL(sdat); for(i = 0; i < n; i++){ x = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < x) x=dat[i + h*n];} res[i] = x; } UNPROTECT(2); return(result); } void rowMin2(double *dat, int n, int k, double *res){ int i, h; double x; for(i = 0; i < n; i++){ x = dat[i]; for(h = 1; h< k; h++) {if(dat[i + h*n] < x) x=dat[i + h*n];} res[i] = x; } } void sankoff4(double *dat, int n, double *cost, int k, double *result){ int i, j, h; double x, tmp; for(i = 0; i < n; i++){ for(j = 0; j < k; j++){ x = dat[i] + cost[j*k]; for(h = 1; h< k; h++){ tmp = dat[i + h*n] + cost[h + j*k]; if(tmp=0; j--) { PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); if (pj != nodes[j]) { for(i=0; i<(nrx * ncx); i++) tmp[i] = 0.0; sankoff4(REAL(VECTOR_ELT(dlist, nodes[j])), nrx, cost, ncx, tmp); for(i=0; i<(nrx * ncx); i++) res[i] = tmp[i] ; pj = nodes[j]; start = j; } else for(i=0; i<(nrx * ncx); i++) res[i] = tmp[i] ; k = start; while (k >= 0 && pj == nodes[k]) { if (k != j) sankoff4(REAL(VECTOR_ELT(data, edges[k])), nrx, cost, ncx, res); k--; } SET_VECTOR_ELT(dlist, edges[j], result); UNPROTECT(1); } UNPROTECT(1); return(dlist); } SEXP sankoffMPR(SEXP dlist, SEXP plist, SEXP scost, SEXP nr, SEXP nc, SEXP node, SEXP edge){ R_len_t i, n = length(node); int nrx=INTEGER(nr)[0], ncx=INTEGER(nc)[0], n0; int ei, j, *nodes=INTEGER(node), *edges=INTEGER(edge); SEXP result, dlist2; //tmp, double *res, *cost; // *rtmp, cost = REAL(scost); n0 = nodes[n-1L]; PROTECT(dlist2 = allocVector(VECSXP, n+1L)); PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); for(j=0;j<(nrx*ncx);j++)res[j]=0.0; for(j=n-1L; j>=0; j--) { if(nodes[j]!=n0){ SET_VECTOR_ELT(dlist2, n0, result); UNPROTECT(1); n0 = nodes[j]; PROTECT(result = allocMatrix(REALSXP, nrx, ncx)); res = REAL(result); for(i=0; i<(nrx * ncx); i++) res[i] = 0.0; sankoff4(REAL(VECTOR_ELT(plist,nodes[j])), nrx, cost, ncx, res); } ei = edges[j]; sankoff4(REAL(VECTOR_ELT(dlist,ei)), nrx, cost, ncx, res); } SET_VECTOR_ELT(dlist2, n0, result); UNPROTECT(2); return(dlist2); } phangorn/src/phangorn_utils.cpp0000644000176200001440000002365714141226416016433 0ustar liggesusers#include using namespace Rcpp; #define DINDEX(i, j) n*(i - 1) - i * (i - 1)/2 + j - i - 1 int give_index3(int i, int j, int n) { if (i > j) return(DINDEX(j, i)); else return(DINDEX(i, j)); } // [[Rcpp::export]] NumericVector fhm_new(NumericVector v, int n){ unsigned int l, i, j; unsigned int start, step, num_splits; unsigned int max_n = (unsigned int)n; double vi, vj; num_splits = (1 << n); step = 1; for(l = 0; l < max_n; l++){ start = 0L; while(start < (num_splits-1L)){ for(i = start; i < (start + step); i++){ j = i + step; vi = v[i]; vj = v[j]; v[i] = vi + vj; v[j] = vi - vj; } start = start + 2*step; } step *= 2; } return v; } //library(tools) //package_native_routine_registration_skeleton("package-root-directory") // import: edge matrix, number of tips // export: Descendants(x, 1:max(x$edge), "all") // [[Rcpp::export]] List allDescCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent); // create list for results std::vector< std::vector > out(m) ; for(int i = 0; i y; for(int i = 0; i nTips){ y = out[children[i] -1L]; out[parent[i]-1L].insert( out[parent[i]-1L].end(), y.begin(), y.end() ); } } // return the list return wrap(out); } //replaces void countCycle(int *M, int *l, int *m, int *res){ // [[Rcpp::export]] int countCycle_cpp(IntegerMatrix M){ int j, tmp; int l = M.nrow(); int m = M.ncol(); int res=0L; for (int i=0; i2L) res += tmp; } return(res); } // [[Rcpp::export]] IntegerVector countCycle2_cpp(IntegerMatrix M){ int tmp; int l = M.nrow(); int m = M.ncol(); IntegerVector res(l); for (int i=0; i getIndex(IntegerVector left, IntegerVector right, int n){ int k; std::vector res; for (int i = 0; i < left.size(); i++){ for (int j = 0; j < right.size(); j++){ k = give_index3(left[i], right[j], n) + 1L; res.push_back(k); k++; } } return res; } // transfer bootstrap // [[Rcpp::export]] double Transfer_Index(const IntegerVector bp, const IntegerMatrix orig, int l) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent), tmp, ei, ni; int p = bp.size(); int lmp = l - p; int best = p - 1; double result; IntegerVector l0(m+1); IntegerVector l1(m+1); for(int i = 0; i > bipartCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent), j=0; int nnode = m - nTips; // create list for results std::vector< std::vector > out(nnode) ; std::vector y; for(int i = 0; i nTips){ y = out[children[i] - nTips -1L]; out[j].insert( out[j].end(), y.begin(), y.end() ); } else out[j].push_back(children[i]); } for(int i=0; i > bipCPP(IntegerMatrix orig, int nTips) { IntegerVector parent = orig( _, 0); IntegerVector children = orig( _, 1); int m = max(parent), j=0; // create list for results std::vector< std::vector > out(m) ; std::vector y; for(int i = 0; i nTips){ y = out[children[i] - 1L]; out[j].insert( out[j].end(), y.begin(), y.end() ); } else out[j].push_back(children[i]); } for(int i=0; i > bp1 = bipartCPP(E1, nTips); std::vector< std::vector > bp2 = bipartCPP(E2, nTips); std::sort(bp1.begin(), bp1.end()); std::sort(bp2.begin(), bp2.end()); int shared=0; for(auto i=0, j=0; i > out(m) ; for(int i = 0; i > out(m); //max(edge) for(int h = root-1L; h0){ for(int j=0; j (m * eps)) res(i)+=tmp[j]; } } return res; } // [[Rcpp::export]] NumericVector node_height_cpp(IntegerVector edge1, IntegerVector edge2, NumericVector edge_length) { NumericVector xx(max(edge2)); for (int i = (edge2.size() - 1); i >= 0; i--) xx[edge2[i] - 1] = xx[edge1[i] - 1] + edge_length[i]; return(max(xx) - xx); } /* Fast cophenetic distance */ void copheneticHelpCpp(std::vector left, std::vector right, int h, NumericVector nh, int nTips, NumericVector dm){ int ind; for(std::size_t i=0; i > bip = bipCPP(edge, nTips); NumericVector dm( nTips * (nTips-1) /2 ); int l=0, left, right; for(int h=nNode; h<(nNode + nTips); h++){ // changed from NumericVector to IntegerVector IntegerVector tmp_ch = ch[h]; l = tmp_ch.size(); for(int j=0; j<(l-1L); j++){ left = tmp_ch[j] - 1; for(int k=j+1L; kthresholds[j] && j #include #include void addOne(int *edge, int *tip, int *ind, int *l, int *m, int *result){ int add = 1L, j=0L, p, k, i, l2=*l+2L, ei; p = edge[*ind-1L]; k = edge[*ind-1L + *l]; for(i=0; i<*l; i++){ ei = edge[i]; if( (add==1L) && (ei==p) ){ result[j] = *m; result[j+l2] = k; j++; result[j] = *m; result[j+l2] = *tip; j++; add=0L; } if(i== (*ind-1L)) result[j+l2] = *m; else result[j+l2] = edge[i+ *l]; result[j] = edge[i]; j++; } } SEXP AddOnes(SEXP edge, SEXP tip, SEXP ind, SEXP l, SEXP m){ R_len_t n = length(ind); SEXP result, res; PROTECT(res = allocVector(VECSXP, n)); for(int i=0; i x) x=dat[i + h*n];} res[i] = x; } UNPROTECT(2); return(result); } void getdP(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w * el) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } void getdP2(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } /* void getd2P(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w * el) * (eva[i] * w * el) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } void getd2P2(double *eva, double *ev, double *evi, int m, double el, double w, double *result){ int i, j, h; double res; //tmp[m], double *tmp; tmp = (double *) malloc(m * sizeof(double)); for(i = 0; i < m; i++) tmp[i] = (eva[i] * w) * (eva[i] * w) * exp(eva[i] * w * el); for(i = 0; i < m; i++){ for(j = 0; j < m; j++){ res = 0.0; for(h = 0; h < m; h++) res += ev[i + h*m] * tmp[h] * evi[h + j*m]; result[i+j*m] = res; } } free(tmp); } */ SEXP getdPM(SEXP eig, SEXP nc, SEXP el, SEXP w){ R_len_t i, j, nel, nw; int m=INTEGER(nc)[0], l=0; double *ws=REAL(w); double *edgelen=REAL(el); double *eva, *eve, *evei; SEXP P, RESULT; nel = length(el); nw = length(w); eva = REAL(VECTOR_ELT(eig, 0)); eve = REAL(VECTOR_ELT(eig, 1)); evei = REAL(VECTOR_ELT(eig, 2)); PROTECT(RESULT = allocVector(VECSXP, nel*nw)); double *p; if(!isNewList(eig)) error("'dlist' must be a list"); for(j=0; j0) & (tmp<(*nbin+1L)) ) ans[tmp-1L] ++; } } */ phangorn/src/rcSet.h0000644000176200001440000000667113766120500014120 0ustar liggesusers#include #include "lessAndEqual.h" template class rcVec { // a row vec or a col vec from a column-major order matrix public: T * x; // pointer to the first element int len; // length of vector: ncol for row vec; nrow for col vec int eltShift; // index shift between adjacent elements: nrow for row vec; 1 for col vec int vecShift; // index shift between adjacent vectors: 1 for row vec; nrow for col vec int nVec; // number of vectors: nrow for row vec; ncol for col vec inline bool operator< (const rcVec& rhs ) const { // elementwise comparison of two vectors from the end // assuming equalTo(usually operator==) and lessThan (usually operator<) defined for type T // also assuming operator= available for type T (Rcomplex is a struct of two doubles; SEXP in CharSEXP should be fine) T L, R; for(int i=len-1; i>=0; i--){ if ( equalTo(L= *(x+eltShift*i), (R= *(rhs.x+rhs.eltShift*i))) ) continue; return lessThan(L , R); } return false; } inline bool operator== (const rcVec& rhs) const { for(int i=len-1; i>=0; i--) if ( ! equalTo( *(x+eltShift*i), *(rhs.x+rhs.eltShift*i)) ) return false; return true; } /* friend inline bool operator> (const rcVec& lhs, const rcVec& rhs){return rhs < lhs;} friend inline bool operator<=(const rcVec& lhs, const rcVec& rhs){return !(lhs > rhs);} friend inline bool operator>=(const rcVec& lhs, const rcVec& rhs){return !(lhs < rhs);} */ }; template class vecMap { private: rcVec aRC; typedef std::map, int > rcvMapType; std::pair retPair; rcvMapType rcvMap; // using operator< of rcVec public: int grpDuplicatedMat (const T* x, const int* nrow, const int* ncol, int* const out, bool const byRow=true, bool const fromLast=false); }; template int vecMap::grpDuplicatedMat (const T* x, const int* nrow, const int* ncol, int* const out, bool const byRow, bool const fromLast) { /* put a logical vector of duplicated rows of numeric matrix x into out */ if(byRow){ aRC.eltShift = aRC.nVec = (int)(*nrow); aRC.vecShift = 1; aRC.len = (int)(*ncol); }else{ aRC.eltShift = 1; aRC.vecShift = aRC.len = (int)(*nrow); aRC.nVec = (int)(*ncol); } int grpId = 1; // map insert: if not previously inserted, the .second of returned pair is true; otherwise false. the .first is an iterator for the (previously) inserted element. if (fromLast) { aRC.x=const_cast(x) + ( byRow ? (*nrow)-1 : ((*ncol)-1)*(*nrow) ); for(int i=aRC.nVec-1; i>=0; aRC.x -= aRC.vecShift){ retPair = rcvMap.insert( std::pair, int> (aRC, grpId) ); out[i--] = retPair.second ? grpId++ : retPair.first->second; // + (int)std::distance(retPair.first , rcvSet.begin()); } }else { aRC.x=const_cast(x); for(int i=0; i, int> (aRC, grpId) ); out[i++] = retPair.second ? grpId++ : retPair.first->second; //+ (int)std::distance(retPair.first , rcvMap.begin()); // Rprintf("i=%d\tgrpId=%d\tdistance=%d\n", i, grpId, (int)( std::distance(retPair.first , rcvMap.begin())) ); } } rcvMap.clear(); return grpId - 1; } phangorn/src/dist.c0000644000176200001440000001254314130605441013767 0ustar liggesusers/* * dist.c * * (c) 2008-2021 Klaus Schliep (klaus.schliep@gmail.com) * * * This code may be distributed under the GNU GPL * */ //#define both_non_NA(a,b) (!ISNA(a) && !ISNA(b)) #include #include #include // off-diagonal #define DINDEX(i, j) n*(i - 1) - i * (i - 1)/2 + j - i - 1 // with diagonal (+i), R index (+1) #define DINDEX2(i, j) n*(i - 1) - i * (i - 1)/2 + j - 1 // #define threshold parameters int give_index(int i, int j, int n) { if (i > j) return(DINDEX(j, i)); else return(DINDEX(i, j)); } int give_index2(int i, int j, int n) { if (i > j) return(DINDEX2(j, i)); else return(DINDEX2(i, j)); } /* void giveIndex(int *left, int* right, int *ll, int *lr, int *n, int *res){ int i, j, k; k=0; for (i = 0; i < *ll; i++){ for (j = 0; j < *lr; j++){ res[k] = give_index(left[i], right[j], *n); k++; } } } void giveIndex2(int *left, int* right, int *ll, int *lr, int *n, int *res){ int i, j, k; k=0; for (i = 0; i < *ll; i++){ for (j = 0; j < *lr; j++){ res[k] = give_index2(left[i], right[j], *n); k++; } } } */ void PD(int *x, int *y, int *n, int *weight){ int i, k; //n =length(x) for(i=0; i< *n; i++){ k=give_index(x[i], y[i], *n); weight[k]++; } } void pwIndex(const int *left, const int* right, int *l, int *n, double *w, double *res){ int i, k; k=0; for (i = 0; i < *l; i++){ k = give_index2(left[i], right[i], *n); res[k] += w[i]; } } /* void pwIndex2(int *left, int* right, int* pos, int *l, int *n, double *w, double *res){ int i, k, li, ri; for (i = 0; i < *l; i++){ li = pos[left[i]-1L]; ri = pos[right[i]-1L]; if(li > 0 && ri > 0) { k = give_index2(li, ri, *n); res[k] += w[i]; } } } */ SEXP PWI(SEXP LEFT, SEXP RIGHT, SEXP L, SEXP N, SEXP W, SEXP LI){ int i, li=INTEGER(LI)[0]; SEXP res; PROTECT(res = allocVector(REALSXP, li)); for(i = 0; i < li; i++)REAL(res)[i] = 0.0; pwIndex(INTEGER(LEFT), INTEGER(RIGHT), INTEGER(L), INTEGER(N), REAL(W), REAL(res)); UNPROTECT(1); return(res); } /* SEXP PWI2(SEXP LEFT, SEXP RIGHT, SEXP POS, SEXP L, SEXP N, SEXP W, SEXP LI){ int i, li=INTEGER(LI)[0]; SEXP res; PROTECT(res = allocVector(REALSXP, li)); for(i = 0; i < li; i++)REAL(res)[i] = 0.0; pwIndex2(INTEGER(LEFT), INTEGER(RIGHT), INTEGER(POS), INTEGER(L), INTEGER(N), REAL(W), REAL(res)); UNPROTECT(1); return(res); } */ void distance_hadamard(double *d, int n) { unsigned int num_splits; unsigned int x, r, nr, p, b, e; unsigned int odd = 1; // The inner while loop can only terminate with odd == 1 so we don't need to set it inside the for loop. double cost, best_cost; num_splits = (1 << (n - 1)); for (x = 1; x < num_splits; ++x) { r = (x - 1) & x; // r = x without LSB nr = (r - 1) & r; // nr = r without LSB if (nr) { // If x contains 1 or 2 bits only, then it has already been computed as a pairwise distance. b = x - r; // b = LSB of x: the "fixed" taxon in the pair. best_cost = 1e20; e = 0; // e holds bits to the right of the current p. while (1) { p = r - nr; // p = 2nd half of pair cost = d[nr + e] + d[p + b]; if (cost < best_cost) best_cost = cost; if (!nr && odd) break; // Ensure we get the (LSB with reference taxon) pair when there are an odd number of taxa r = nr; e += p; nr = (r - 1) & r; // nr = r without LSB odd ^= 1; } d[x] = best_cost; } } d[0] = 0.0; } // int num_splits raus void pairwise_distances(double *dm, int n, double *d) { int k=0; unsigned int offset; for (int i = 0; i < (n-1); ++i) { for (int j = (i+1); j < n; ++j) { // Calculate the offset within the array to put the next value offset = (1 << i); if (j < n - 1) { // If i == n - 1 then this is a distance between the reference taxon and some other taxon. offset += (1 << j); // Note that "+" is safe since (1 << i) and (1 << j) are always different bits. } d[offset]=dm[k]; k++; } } } SEXP dist2spectra(SEXP dm, SEXP nx, SEXP ns) { int n = INTEGER(nx)[0]; int nsp = INTEGER(ns)[0]; double *res; SEXP result; PROTECT(result = allocVector(REALSXP, nsp)); res = REAL(result); pairwise_distances(REAL(dm), n, res); //nsp, distance_hadamard(res, n); UNPROTECT(1); return(result); } /* // speed up some code for NJ void out(double *d, double *r, int *n, int *k, int *l){ int i, j; double res, tmp; k[0]=1; l[0]=2; res = d[1] - r[0] - r[1]; for(i = 0; i < (*n-1); i++){ for(j = i+1; j < (*n); j++){ tmp = d[i*(*n)+j] - r[i] - r[j]; if(tmp do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // fhm_new NumericVector fhm_new(NumericVector v, int n); RcppExport SEXP _phangorn_fhm_new(SEXP vSEXP, SEXP nSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type v(vSEXP); Rcpp::traits::input_parameter< int >::type n(nSEXP); rcpp_result_gen = Rcpp::wrap(fhm_new(v, n)); return rcpp_result_gen; END_RCPP } // allDescCPP List allDescCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_allDescCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(allDescCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // countCycle_cpp int countCycle_cpp(IntegerMatrix M); RcppExport SEXP _phangorn_countCycle_cpp(SEXP MSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type M(MSEXP); rcpp_result_gen = Rcpp::wrap(countCycle_cpp(M)); return rcpp_result_gen; END_RCPP } // countCycle2_cpp IntegerVector countCycle2_cpp(IntegerMatrix M); RcppExport SEXP _phangorn_countCycle2_cpp(SEXP MSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type M(MSEXP); rcpp_result_gen = Rcpp::wrap(countCycle2_cpp(M)); return rcpp_result_gen; END_RCPP } // out_cpp IntegerVector out_cpp(NumericVector d, NumericVector r, int n); RcppExport SEXP _phangorn_out_cpp(SEXP dSEXP, SEXP rSEXP, SEXP nSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type d(dSEXP); Rcpp::traits::input_parameter< NumericVector >::type r(rSEXP); Rcpp::traits::input_parameter< int >::type n(nSEXP); rcpp_result_gen = Rcpp::wrap(out_cpp(d, r, n)); return rcpp_result_gen; END_RCPP } // getIndex std::vector getIndex(IntegerVector left, IntegerVector right, int n); RcppExport SEXP _phangorn_getIndex(SEXP leftSEXP, SEXP rightSEXP, SEXP nSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerVector >::type left(leftSEXP); Rcpp::traits::input_parameter< IntegerVector >::type right(rightSEXP); Rcpp::traits::input_parameter< int >::type n(nSEXP); rcpp_result_gen = Rcpp::wrap(getIndex(left, right, n)); return rcpp_result_gen; END_RCPP } // Transfer_Index double Transfer_Index(const IntegerVector bp, const IntegerMatrix orig, int l); RcppExport SEXP _phangorn_Transfer_Index(SEXP bpSEXP, SEXP origSEXP, SEXP lSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const IntegerVector >::type bp(bpSEXP); Rcpp::traits::input_parameter< const IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type l(lSEXP); rcpp_result_gen = Rcpp::wrap(Transfer_Index(bp, orig, l)); return rcpp_result_gen; END_RCPP } // bipartCPP std::vector< std::vector > bipartCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_bipartCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(bipartCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // bipCPP std::vector< std::vector > bipCPP(IntegerMatrix orig, int nTips); RcppExport SEXP _phangorn_bipCPP(SEXP origSEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type orig(origSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(bipCPP(orig, nTips)); return rcpp_result_gen; END_RCPP } // bip_shared int bip_shared(SEXP tree1, SEXP tree2, int nTips); RcppExport SEXP _phangorn_bip_shared(SEXP tree1SEXP, SEXP tree2SEXP, SEXP nTipsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< SEXP >::type tree1(tree1SEXP); Rcpp::traits::input_parameter< SEXP >::type tree2(tree2SEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); rcpp_result_gen = Rcpp::wrap(bip_shared(tree1, tree2, nTips)); return rcpp_result_gen; END_RCPP } // allChildrenCPP List allChildrenCPP(const IntegerMatrix orig); RcppExport SEXP _phangorn_allChildrenCPP(SEXP origSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const IntegerMatrix >::type orig(origSEXP); rcpp_result_gen = Rcpp::wrap(allChildrenCPP(orig)); return rcpp_result_gen; END_RCPP } // allSiblingsCPP List allSiblingsCPP(const IntegerMatrix& edge); RcppExport SEXP _phangorn_allSiblingsCPP(SEXP edgeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const IntegerMatrix& >::type edge(edgeSEXP); rcpp_result_gen = Rcpp::wrap(allSiblingsCPP(edge)); return rcpp_result_gen; END_RCPP } // p2dna IntegerVector p2dna(NumericMatrix xx, double eps); RcppExport SEXP _phangorn_p2dna(SEXP xxSEXP, SEXP epsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type xx(xxSEXP); Rcpp::traits::input_parameter< double >::type eps(epsSEXP); rcpp_result_gen = Rcpp::wrap(p2dna(xx, eps)); return rcpp_result_gen; END_RCPP } // node_height_cpp NumericVector node_height_cpp(IntegerVector edge1, IntegerVector edge2, NumericVector edge_length); RcppExport SEXP _phangorn_node_height_cpp(SEXP edge1SEXP, SEXP edge2SEXP, SEXP edge_lengthSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerVector >::type edge1(edge1SEXP); Rcpp::traits::input_parameter< IntegerVector >::type edge2(edge2SEXP); Rcpp::traits::input_parameter< NumericVector >::type edge_length(edge_lengthSEXP); rcpp_result_gen = Rcpp::wrap(node_height_cpp(edge1, edge2, edge_length)); return rcpp_result_gen; END_RCPP } // cophenetic_cpp NumericVector cophenetic_cpp(IntegerMatrix edge, NumericVector edge_length, int nTips, int nNode); RcppExport SEXP _phangorn_cophenetic_cpp(SEXP edgeSEXP, SEXP edge_lengthSEXP, SEXP nTipsSEXP, SEXP nNodeSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type edge(edgeSEXP); Rcpp::traits::input_parameter< NumericVector >::type edge_length(edge_lengthSEXP); Rcpp::traits::input_parameter< int >::type nTips(nTipsSEXP); Rcpp::traits::input_parameter< int >::type nNode(nNodeSEXP); rcpp_result_gen = Rcpp::wrap(cophenetic_cpp(edge, edge_length, nTips, nNode)); return rcpp_result_gen; END_RCPP } // threshStateC IntegerVector threshStateC(NumericVector x, NumericVector thresholds); RcppExport SEXP _phangorn_threshStateC(SEXP xSEXP, SEXP thresholdsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector >::type x(xSEXP); Rcpp::traits::input_parameter< NumericVector >::type thresholds(thresholdsSEXP); rcpp_result_gen = Rcpp::wrap(threshStateC(x, thresholds)); return rcpp_result_gen; END_RCPP } RcppExport SEXP AddOnes(SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP C_rowMin(SEXP, SEXP, SEXP); RcppExport SEXP C_sprdist(SEXP, SEXP, SEXP); RcppExport SEXP dist2spectra(SEXP, SEXP, SEXP); RcppExport SEXP FS4(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP FS5(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP getDAD(SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP getdPM(SEXP, SEXP, SEXP, SEXP); RcppExport SEXP getdPM2(SEXP, SEXP, SEXP, SEXP); RcppExport SEXP getPM(SEXP, SEXP, SEXP, SEXP); RcppExport SEXP getPrep(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP grpDupAtomMat(SEXP, SEXP, SEXP); RcppExport SEXP invSites(SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP ll_free2(); RcppExport SEXP ll_init2(SEXP, SEXP, SEXP, SEXP); RcppExport SEXP LogLik2(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP optE(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP optQrtt(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP PML0(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP PML4(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP pNodes(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP PWI(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP rowMax(SEXP, SEXP, SEXP); RcppExport SEXP sankoff3(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP sankoff3B(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP sankoffMPR(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); RcppExport SEXP sankoffQuartet(SEXP, SEXP, SEXP, SEXP); RcppExport SEXP _rcpp_module_boot_Fitch_mod(); static const R_CallMethodDef CallEntries[] = { {"_phangorn_fhm_new", (DL_FUNC) &_phangorn_fhm_new, 2}, {"_phangorn_allDescCPP", (DL_FUNC) &_phangorn_allDescCPP, 2}, {"_phangorn_countCycle_cpp", (DL_FUNC) &_phangorn_countCycle_cpp, 1}, {"_phangorn_countCycle2_cpp", (DL_FUNC) &_phangorn_countCycle2_cpp, 1}, {"_phangorn_out_cpp", (DL_FUNC) &_phangorn_out_cpp, 3}, {"_phangorn_getIndex", (DL_FUNC) &_phangorn_getIndex, 3}, {"_phangorn_Transfer_Index", (DL_FUNC) &_phangorn_Transfer_Index, 3}, {"_phangorn_bipartCPP", (DL_FUNC) &_phangorn_bipartCPP, 2}, {"_phangorn_bipCPP", (DL_FUNC) &_phangorn_bipCPP, 2}, {"_phangorn_bip_shared", (DL_FUNC) &_phangorn_bip_shared, 3}, {"_phangorn_allChildrenCPP", (DL_FUNC) &_phangorn_allChildrenCPP, 1}, {"_phangorn_allSiblingsCPP", (DL_FUNC) &_phangorn_allSiblingsCPP, 1}, {"_phangorn_p2dna", (DL_FUNC) &_phangorn_p2dna, 2}, {"_phangorn_node_height_cpp", (DL_FUNC) &_phangorn_node_height_cpp, 3}, {"_phangorn_cophenetic_cpp", (DL_FUNC) &_phangorn_cophenetic_cpp, 4}, {"_phangorn_threshStateC", (DL_FUNC) &_phangorn_threshStateC, 2}, {"_rcpp_module_boot_Fitch_mod", (DL_FUNC) &_rcpp_module_boot_Fitch_mod, 0}, {"AddOnes", (DL_FUNC) &AddOnes, 5}, {"C_rowMin", (DL_FUNC) &C_rowMin, 3}, {"C_sprdist", (DL_FUNC) &C_sprdist, 3}, {"dist2spectra", (DL_FUNC) &dist2spectra, 3}, {"FS4", (DL_FUNC) &FS4, 15}, {"FS5", (DL_FUNC) &FS5, 11}, {"getDAD", (DL_FUNC) &getDAD, 5}, {"getdPM", (DL_FUNC) &getdPM, 4}, {"getdPM2", (DL_FUNC) &getdPM2, 4}, {"getPM", (DL_FUNC) &getPM, 4}, {"getPrep", (DL_FUNC) &getPrep, 6}, {"grpDupAtomMat", (DL_FUNC) &grpDupAtomMat, 3}, {"invSites", (DL_FUNC) &invSites, 5}, {"ll_free2", (DL_FUNC) &ll_free2, 0}, {"ll_init2", (DL_FUNC) &ll_init2, 4}, {"LogLik2", (DL_FUNC) &LogLik2, 10}, {"optE", (DL_FUNC) &optE, 18}, {"optQrtt", (DL_FUNC) &optQrtt, 17}, {"PML0", (DL_FUNC) &PML0, 14}, {"PML4", (DL_FUNC) &PML4, 15}, {"pNodes", (DL_FUNC) &pNodes, 6}, {"PWI", (DL_FUNC) &PWI, 6}, {"rowMax", (DL_FUNC) &rowMax, 3}, {"sankoff3", (DL_FUNC) &sankoff3, 8}, {"sankoff3B", (DL_FUNC) &sankoff3B, 10}, {"sankoffMPR", (DL_FUNC) &sankoffMPR, 7}, {"sankoffQuartet", (DL_FUNC) &sankoffQuartet, 4}, {NULL, NULL, 0} }; RcppExport void R_init_phangorn(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } phangorn/vignettes/0000755000176200001440000000000014155651242014103 5ustar liggesusersphangorn/vignettes/AdvancedFeatures.Rmd0000644000176200001440000003233114140464110017743 0ustar liggesusers--- title: "Advanced features" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: > %\VignetteIndexEntry{Advanced features} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ``` # Introduction This document illustrates some of the _phangorn_ [@Schliep2011] specialized features which are useful but maybe not as well-known or just not (yet) described elsewhere. This is mainly interesting for someone who wants to explore different models or set up some simulation studies. We show how to construct data objects for different character states other than nucleotides or amino acids or how to set up different models to estimate transition rate. The vignette *Trees* describes in detail how to estimate phylogenies from nucleotide or amino acids. # User defined data formats To better understand how to define our own data type it is useful to know a bit more about the internal representation of `phyDat` objects. The internal representation of `phyDat` object is very similar to `factor` objects. As an example we will show here several possibilities to define nucleotide data with gaps defined as a fifth state. Ignoring gaps or coding them as ambiguous sites - as it is done in most programs, also in phangorn as default - may be misleading (see [@Warnow2012]). When the number of gaps is low and the gaps are missing at random coding gaps as separate state may be not important. Let assume we have given a matrix where each row contains a character vector of a taxonomic unit: ```{r} library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data ``` Normally we would transform this matrix into an phyDat object and gaps are handled as ambiguous character like "?". ```{r} gapsdata1 = phyDat(data) gapsdata1 ``` Now we will define a "USER" defined object and have to supply a vector levels of the character states for the new data, in our case the for nucleotide states and the gap. Additional we can define ambiguous states which can be any of the states. ```{r} gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 ``` This is not yet what we wanted as two sites of our alignment, which contain the ambiguous characters "r" and "y", got deleted. To define ambiguous characters like "r" and "y" explicitly we have to supply a contrast matrix similar to contrasts for factors. ```{r} contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 ``` Here we defined "n" as a state which can be any nucleotide but not a gap "-" and "?" can be any state including a gap. These data can be used in all functions available in _phangorn_ to compute distance matrices or perform parsimony and maximum likelihood analysis. # Markov models of character evolution To model nucleotide substitutions across the edges of a tree T we can assign a transition matrix. In the case of nucleotides, with four character states, each 4 $\times$ 4 transition matrix has, at most, 12 free parameters. Time-reversible Markov models are used to describe how characters change over time, and use fewer parameters. Time-reversible means that these models need not be directed in time, and the Markov property states that these models depend only on the current state. These models are used in analysis of phylogenies using maximum likelihood and MCMC, computing pairwise distances, as well in simulating sequence evolution. We will now describe the General Time-Reversible (GTR) model [@Tavare1986]. The parameters of the GTR model are the equilibrium frequencies $\pi = (\pi_A ,\pi_C ,\pi_G ,\pi_T)$ and a rate matrix $Q$ which has the form \begin{equation} Q = \begin{pmatrix} \ast & \alpha\pi_C & \beta\pi_G & \gamma\pi_T \\ \alpha\pi_A & \ast & \delta\pi_G & \epsilon\pi_T \\ \beta\pi_A & \delta\pi_C & \ast & \eta\pi_T \\ \gamma\pi_A & \epsilon\pi_C & \eta\pi_G & \ast \\ \end{pmatrix} (1) \end{equation} where we need to assign 6 parameters $\alpha, \dots, \eta$. The elements on the diagonal are chosen so that the rows sum to zero. The Jukes-Cantor (JC) [@Jukes1969] model can be derived as special case from the GTR model, for equal equilibrium frequencies $\pi_A = \pi_C = \pi_G = \pi_T = 0.25$ and equal rates set to $\alpha = \beta = \gamma = \delta = \eta$. Table \@ref(tab:models) lists all built-in nucleotide models in _phangorn_. The transition probabilities which describe the probabilities of change from character $i$ to $j$ in time $t$, are given by the corresponding entries of the matrix exponential \[ P(t) = (p_{ij}(t)) = e^{Qt}, \qquad \sum_j p_{ij}=1 \] where $P(t)$ is the transition matrix spanning a period of time $t$. # Estimation of non-standard transition rate matrices In the last section \@ref(user) we described how to set up user defined data formats. Now we describe how to estimate transition matrices with pml. Again for nucleotide data the most common models can be called directly in the `optim.pml` function (e.g. "JC69", "HKY", "GTR" to name a few). Table 2 lists all the available nucleotide models, which can estimated directly in `optim.pml`. For amino acids several transition matrices are available ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff\_DCMut" and "JTT-DCMut") or can be estimated with `optim.pml`. For example Mathews et al. (2010) [@Mathews2010] used this function to estimate a phytochrome amino acid transition matrix. We will now show how to estimate a rate matrix with different transition ($\alpha$) and transversion ratio ($\beta$) and a fixed rate to the gap state ($\gamma$) - a kind of Kimura two-parameter model (K81) for nucleotide data with gaps as fifth state (see table 1). | a | c | g | t | - --|----------|----------|----------|----------|---- a | | | | | c | $\beta$ | | | | g | $\alpha$ | $\beta$ | | | t | $\beta$ | $\alpha$ | $\beta$ | | - | $\gamma$ | $\gamma$ | $\gamma$ | $\gamma$ | : Tab 1. Rate matrix with 3 parameters to optimize. If we want to fit a non-standard transition rate matrices, we have to tell `optim.pml`, which transitions in Q get the same rate. The parameter vector subs accepts a vector of consecutive integers and at least one element has to be zero (these gets the reference rate of 1). Negative values indicate that there is no direct transition is possible and the rate is set to zero. ```{r} library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit ``` Here are some conventions how the models are estimated: If a model is supplied the base frequencies bf and rate matrix Q are optimized according to the model (nucleotides) or the adequate rate matrix and frequencies are chosen (for amino acids). If optQ=TRUE and neither a model or subs are supplied than a symmetric (optBf=FALSE) or reversible model (optBf=TRUE, i.e. the GTR for nucleotides) is estimated. This can be slow if the there are many character states, e.g. for amino acids. Table 2 shows how parameters are optimized and number of parameters to estimate. The elements of the vector subs correspond to $\alpha, \dots, \eta$ in equation (1) model | optQ | optBf | subs | df -------|------|-------|------|---- JC | FALSE | FALSE | $c(0, 0, 0, 0, 0, 0)$ | 0 F81 | FALSE | TRUE | $c(0, 0, 0, 0, 0, 0)$ | 3 K80 | TRUE | FALSE | $c(0, 1, 0, 0, 1, 0)$ | 1 HKY | TRUE | TRUE | $c(0, 1, 0, 0, 1, 0)$ | 4 TrNe | TRUE | FALSE | $c(0, 1, 0, 0, 2, 0)$ | 2 TrN | TRUE | TRUE | $c(0, 1, 0, 0, 2, 0)$ | 5 TPM1 | TRUE | FALSE | $c(0, 1, 2, 2, 1, 0)$ | 2 K81 | TRUE | FALSE | $c(0, 1, 2, 2, 1, 0)$ | 2 TPM1u | TRUE | TRUE | $c(0, 1, 2, 2, 1, 0)$ | 5 TPM2 | TRUE | FALSE | $c(1, 2, 1, 0, 2, 0)$ | 2 TPM2u | TRUE | TRUE | $c(1, 2, 1, 0, 2, 0)$ | 5 TPM3 | TRUE | FALSE | $c(1, 2, 0, 1, 2, 0)$ | 2 TPM3u | TRUE | TRUE | $c(1, 2, 0, 1, 2, 0)$ | 5 TIM1e | TRUE | FALSE | $c(0, 1, 2, 2, 3, 0)$ | 3 TIM1 | TRUE | TRUE | $c(0, 1, 2, 2, 3, 0)$ | 6 TIM2e | TRUE | FALSE | $c(1, 2, 1, 0, 3, 0)$ | 3 TIM2 | TRUE | TRUE | $c(1, 2, 1, 0, 3, 0)$ | 6 TIM3e | TRUE | FALSE | $c(1, 2, 0, 1, 3, 0)$ | 3 TIM3 | TRUE | TRUE | $c(1, 2, 0, 1, 3, 0)$ | 6 TVMe | TRUE | FALSE | $c(1, 2, 3, 4, 2, 0)$ | 4 TVM | TRUE | TRUE | $c(1, 2, 3, 4, 2, 0)$ | 7 SYM | TRUE | FALSE | $c(1, 2, 3, 4, 5, 0)$ | 5 GTR | TRUE | TRUE | $c(1, 2, 3, 4, 5, 0)$ | 8 : Tab 2. DNA models available in phangorn. # Codon substitution models A special case of the transition rates are codon models._phangorn_ now offers the possibility to estimate the $d_N/d_S$ ratio (sometimes called ka/ks), for an overview see [@Yang2014]. These functions extend the option to estimates the $d_N/d_S$ ratio for pairwise sequence comparison as it is available through the function `kaks` in _seqinr_. The transition rate between between codon $i$ and $j$ is defined as follows: \begin{eqnarray} q_{ij}=\left\{ \begin{array}{l@{\quad}l} 0 & \textrm{if i and j differ in more than one position} \\ \pi_j & \textrm{for synonymous transversion} \\ \pi_j\kappa & \textrm{for synonymous transition} \\ \pi_j\omega & \textrm{for non-synonymous transversion} \\ \pi_j\omega\kappa & \textrm{for non synonymous transition} \end{array} \right. \nonumber \end{eqnarray} where $\omega$ is the $d_N/d_S$ ratio, $\kappa$ the transition transversion ratio and $\pi_j$ is the the equilibrium frequencies of codon $j$. For $\omega\sim1$ the an amino acid change is neutral, for $\omega < 1$ purifying selection and $\omega > 1$ positive selection. There are four models available: "codon0", where both parameter $\kappa$ and $\omega$ are fixed to 1, "codon1" where both parameters are estimated and "codon2" or "codon3" where $\kappa$ or $\omega$ is fixed to 1. We compute the $d_N/d_S$ for some sequences given a tree using the ML functions `pml` and `optim.pml`. First we have to transform the the nucleotide sequences into codons (so far the algorithms always takes triplets). ```{r} library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) ``` There are several ways to estimate the codon frequencies $\pi_j$. The simplest model is to assume they have equal frequencies (=1/61). A second is to use the empirical codon frequencies, either computed using `baseFreq` or using the argument `bf="empirical"` in `pml`. Last but not least the frequencies can be derived from the base frequencies at each codon position, the F3x4 model is set by the argument `bf="F3x4"`. One can estimate the codon frequencies setting the option to `optBf=TRUE` in `optim.pml`. As the convergence of the 60 parameters the convergence is likely slow set the maximal iterations to a higher value than the default (e.g. `control = pml.control(maxit=50)`). Similar parameters of the F3x4 can also estimated using ML `optF3x4=TRUE` instead. The "YN98" model [@Yang1998] is similar to the "codon1", but additional optimizes the codon frequencies. # Generating trees _phangorn_ has several functions to generate tree topologies, which may are interesting for simulation studies. `allTrees` computes all possible bifurcating tree topologies either rooted or unrooted for up to 10 taxa. One has to keep in mind that the number of trees is growing exponentially, use `howmanytrees` from _ape_ as a reminder. ```{r} trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") ``` `nni` returns a list of all trees which are one nearest neighbor interchange away. ```{r} nni(trees[[1]]) ``` `rNNI` and `rSPR` generate trees which are a defined number of NNI (nearest neighbor interchange) or SPR (subtree pruning and regrafting) away. # Session info ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/vignettes/primates.dna0000644000176200001440000001010013707232051016376 0ustar liggesusers 14 232 Mouse ACCAAAAAAA CATCCAAACA CCAACCCCAG CCCTTACGCA ATAGCCATAC AAAGAATATT Bovine ACCAAACCTG TCCCCACCAT CTAACACCAA CCCACATATA CAAGCTAAAC CAAAAATACC Lemur ACCAAACTAA CATCTAACAA CTACCTCCAA CTCTAAAAAA GCACTCTTAC CAAACCCATC Tarsier ATCTACCTTA TCTCCCCCAA TCAATACCAA CCTAAAAACT CTACAATTAA AAACCCCACC Squir MonkACCCCAGCAA CTCGTTGTGA CCAACATCAA TCCAAAATTA GCAAACGTAC CAACAATCTC Jpn Macaq ACTCCACCTG CTCACCTCAT CCACTACTAC TCCTCAAGCA ATACATAAAC TAAAAACTTC Rhesus MacACTTCACCCG TTCACCTCAT CCACTACTAC TCCTCAAGCG ATACATAAAT CAAAAACTTC Crab-E.MacACCCCACCTA CCCGCCTCGT CCGCTACTGC TTCTCAAACA ATATATAGAC CAACAACTTC BarbMacaq ACCCTATCTA TCTACCTCAC CCGCCACCAC CCCCCAAACA ACACACAAAC CAACAACTTT Gibbon ACTATACCCA CCCAACTCGA CCTACACCAA TCCCCACATA GCACACAGAC CAACAACCTC Orang ACCCCACCCG TCTACACCAG CCAACACCAA CCCCCACCTA CTATACCAAC CAATAACCTC Gorilla ACCCCATTTA TCCATAAAAA CCAACACCAA CCCCCATCTA ACACACAAAC TAATGACCCC Chimp ACCCCATCCA CCCATACAAA CCAACATTAC CCTCCATCCA ATATACAAAC TAACAACCTC Human ACCCCACTCA CCCATACAAA CCAACACCAC TCTCCACCTA ATATACAAAT TAATAACCTC ATACTACTAA AAACTCAAAT TAACTCTTTA ATCTTTATAC AACATTCCAC CAACCTATCC ATACAACCAT AAATAAGACT AATCTATTAA AATAACCCAT TACGATACAA AATCCCTTTC ACAACTCTAT CAACCTAACC AAACTATCAA CATGCCCTCT CCTAATTAAA AACATTGCCA GCTCAATTAC TAGCAAAAAT AGACATTCAA CTCCTCCCAT CATAACATAA AACATTCCTC CCAAATTTAA AAACACATCC TACCTTTACA ATTAATAACC ATTGTCTAGA TATACCCCTA TCACCTCTAA TACTACACAC CACTCCTGAA ATCAATGCCC TCCACTAAAA AACATCACCA TCACCTCCAA TACTACGCAC CGCTCCTAAA ATCAATGCCC CCCACCAAAA AACATCACCA TCACCTTTAA CACTACATAT CACTCCTGAG CTTAACACCC TCCGCTAAAA AACACCACTA TTATCTTTAG CACCACACAT CACCCCCAAA AGCAATACCC TTCACCAAAA AGCACCATCA CCACCTTCCA TACCAAGCCC CGACTTTACC GCCAACGCAC CTCATCAAAA CATACCTACA TCAACCCCTA AACCAAACAC TATCCCCAAA ACCAACACAC TCTACCAAAA TACACCCCCA CCACCCTCAA AGCCAAACAC CAACCCTATA ATCAATACGC CTTATCAAAA CACACCCCCA CCACTCTTCA GACCGAACAC CAATCTCACA ACCAACACGC CCCGTCAAAA CACCCCTTCA CCACCTTCAG AACTGAACGC CAATCTCATA ACCAACACAC CCCATCAAAG CACCCCTCCA ACACAAAAAA ACTCATATTT ATCTAAATAC GAACTTCACA CAACCTTAAC ACATAAACAT GTCTAGATAC AAACCACAAC ACACAATTAA TACACACCAC AATTACAATA CTAAACTCCC CACTAAACCT ACACACCTCA TCACCATTAA CGCATAACTC CTCAGTCATA TCTACTACAC GCTCCAATAA ACACATCACA ATCCCAATAA CGCATATACC TAAATACATC ATTTAATAAT AAATAAATGA ATATAAACCC TCGCCGATAA CATA-ACCCC TAAAATCAAG ACATCCTCTC GCCCAAACAA ACACCTATCT ACCCCCCCGG TCCACGCCCC TAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTACCC ATCCCCCCGG TTCACGCCTC AAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTATCT ATCCCCCCGG TCCACGCCCC AAACCCCGCT ATTCCCCCCT AATCAAACAA ACACCTATTT ATTCCCCTAA TTCACGTCCC AAATCCCATT ATCTCTCCCC ACACAAACAA ATGCCCCCCC ACCCTCCTTC TTCAAGCCCA CTAGACCATC CTACCTTCCT ATTCACATCC GCACACCCCC ACCCCCCCTG CCCACGTCCA TCCCATCACC CTCTCCTCCC ACATAAACCC ACGCACCCCC ACCCCTTCCG CCCATGCTCA CCACATCATC TCTCCCCTTC GCACAAATTC ATACACCCCT ACCTTTCCTA CCCACGTTCA CCACATCATC CCCCCCTCTC ACACAAACCC GCACACCTCC ACCCCCCTCG TCTACGCTTA CCACGTCATC CCTCCCTCTC ACCCCAGCCC AACACCCTTC CACAAATCCT TAATATACGC ACCATAAATA AC ATCCCACCAA ATCACCCTCC ATCAAATCCA CAAATTACAC AACCATTAAC CC ACCCTAACAA TTTATCCCTC CCATAATCCA AAAACTCCAT AAACACAAAT TC AATACTCCAA CTCCCATAAC ACAGCATACA TAAACTCCAT AAGTTTGAAC AC ACAACGCCAA ACCCCCCTCT CATAACTCTA CAAAATACAC AATCACCAAC AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTGCAT AAGCAAACAG AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTACAT AAACAAACAA AC AATACACCAA ACAATTTTCT CCAACACCCA CAAACTGTAT AAACAAACAA AC AACATACCAA ACAATTCTCC CTAATATACA CAAACCACGC AAACAAACAA AC AGCACGCCAA GCTCTCTACC ATCAAACGCA CAACTTACAC ATACAGAACC AC AACACCCTAA GCCACCTTCC TCAAAATCCA AAACCCACAC AACCGAAACA AC AACACCTCAA TCCACCTCCC CCCAAATACA CAATTCACAC AAACAATACC AC AACATCTTGA CTCGCCTCTC TCCAAACACA CAATTCACGC AAACAACGCC AC AACACCTTAA CTCACCTTCT CCCAAACGCA CAATTCGCAC ACACAACGCC AC phangorn/vignettes/IntertwiningTreesAndNetworks.Rmd0000644000176200001440000003346014140461352022414 0ustar liggesusers--- title: 'Intertwining phylogenetic trees and networks: R Example Script' author: "Klaus Schliep, Alastair Potts, David Morrison and Guido Grimm" date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github vignette: > %\VignetteIndexEntry{Intertwining phylogenetic trees and networks: R Example Script} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- [comment]: # (output: html_document) --- nocite: | @Schliep2017 ... ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ``` *Description:* This script provides examples of the new functions available in the phangorn library to 'intertwine' trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R. *Methodological advancement:* The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualize and further analyze this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community. *What next?:* By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and [support](https://github.com/KlausVigo/phangorn), the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience. ### Installing R 1. Download R Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html 2. Select your operating system and download the relevant installation file. 3. Install R following the instructions. ### Installing the phangorn library Open R and run the two lines of code below in the command line. (You will need to select a region from which to download the library) ```{r, eval=FALSE} install.packages("phangorn", dependencies=TRUE) # install latest development version needs devtools install.packages("devtools", dependencies=TRUE) library(devtools) install_github("KlausVigo/phangorn") ``` ### Getting started ```{r} library(phangorn) # load the phangorn library ``` ### Set the working directory This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input? This is done using the `setwd()` function, e.g. `setwd("C:/TreesNetworks/Example Files")`. We now set it to the folder of the phangorn package, which contains the files we want to load for this example. ### Read in the example file datasets: This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (*Apodemus sylvaticus*) in the Western Palearctic region. Molecular Ecology, 12, 685-697.) ```{r} ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ``` All example files read into R. ### Viewing the data ```{r} par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighborNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ``` ### Intertwining trees and network functions ### 1A: Identification of edge bundles (in black) in a neighbor-net (NN) network that correspond to branches (labelled 1-12) in a tree (a maximum likelihood tree, in this case). ```{r, fig.width=7, fig.height=4, small.mar=TRUE} # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ``` ### 1B: Bootstrap support for all branches (branch labels) in the ML tree mapped on the corresponding edge bundles of the NN network. The edges in the network which are not found as ML tree branches are highlighted in red. ```{r, small.mar=TRUE} # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ``` Again we can write to SplitsTree for viewing... ```{r} # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ``` ### 1C: Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges. ```{r, small.mar=TRUE} y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ``` ### Extras... We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighborNet (this is similar to the process explained in 1C above). ```{r, small.mar=TRUE} cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ``` ### There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstrapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimized trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimized trees anyway, i.e. they are compatible with the tree. Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimized tree for a dataset of @Wang2012. (An advanced user figure...) ```{r, fig.width=7, fig.height=6} Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) |> unroot() raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) |> unique() |> removeTrivialSplits() # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) |> unique() |> removeTrivialSplits() |> addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ``` ### Figure 4 ```{r} YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ``` There are several option plotting a co-phylogeny. In the following we use the `cophylo` function of the `phytools` package. ``` library(phytools) par(mfrow=c(2,1)) obj <- cophylo(YCh, mtG) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("A. YCh B. mtG") obj <- cophylo(ncAI, all_data) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("C. ncAI D. All data") ``` ![](cophylo.png) Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions. ```{r} par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ``` We can compare this with consensus network with the different bootstrap values for the different genes. ```{r, small.mar=TRUE} par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) |> addConfidences(mtG_boot, add=TRUE) |> addConfidences(ncAI_boot, add=TRUE) |> addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) ``` phangorn/vignettes/seqLogo.png0000644000176200001440000002175614026352214016227 0ustar liggesusersPNG  IHDRXEPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvxxxyyyzzz{{{|||}}}~~~*L IDATx{UU9ΕD00_wID(QL=mJp:ΘhJGAB$R)|a*&8^>g=~k}~=|۟{sώPwP `AA XP,(D "`AA XP,(D "`AA XP,(D "`AA XP,(D "`AA d2ka`1P)n$)-`A2y*|`A닳[E4ԣ 5+hG XP,(DWV&®TIL:X*wB\\a1s0JH(uKBNX ,\dE%XSs,X  ;,X6SX22˜@`V9 `ɹM X d r %BD wl(Owh ?Xtnkb7w^%j2LA0 XUXtՙXtl$=L F:ۊ4RK@&-Q2xs/}CAXH,),XG׾=ςVrF`ыyńX4)bb k`l.޴k_|I9`, +,1Ak/ϟc}g;rcW_T{*k .5h PDz>х,m@^`Gݣ,ꁐn"!6oXe:z)mҽ춙#ޣ^`fVv;am{tKreVUcocv=F/&/`9?WKh`iA4^~ӲK>=L/N=VB eZCK.n9r{,Ѓ`MV}_wat>D|g4ΐ%XUeˡzq58tmc/@\뉧)w1?X~*_Q0*ʕ,(bOo("X+ױ-6w^v؟c5_LeX%Ţt/ĽXM Vkho22,&ĖFg)ҝRU`֑ktI V2P|_`[?74+QQ*.XRPXldPQE_)WpK1F%qW> sXIM">`ݵ뤯;y#E%]_]= V sk;ǸF[e>6 wkDM|pXIMP`]\}murXIM`)((X[n{kp]VR,X,R'&ğc55,0X JV!z_F&RUjZkt6K] `qkS߹F&،R/,01YuINX]VBql6`YI)-'F&Xo{bkt>`d ,s ^MXV'X#G`1sbJZd~Ŀo2,5RfXܭفe[B`'%k`UyW-V*e+ 7 ~sm`U*mK{,!❂yf4vl4ck-XM%X} VՕW eթO%l#݇`U%G*X`Snw#ּ+UOt/cV VB==XbWoZ\eIQ/e&V5{:8 ` Y¥{?`I- `sK2vט5`qb~` Nn`pݥKW>,9:*O?begsl`5 Sh />|&:;t/\, 2,.J~0K^sLm(;`f_K.4`:US@r>~J|k݌/ݻaڵKkO9XX,O2A{kJ`ef-(OKVt .Xg͚D#ej`֑kt?UUE*+RXǺ/&JX,=nN0*,XaP.! X*r b&2,ztkD VEX4CZҹ9XU]g*X$V``\0*9 B`K`M7Y"X릌" 鬓BŬ.`QuRuj޿`х,,X8`q"Gڠ `Y&gq`Y뮂?,XdPB9# =Gj~KISλ⺁kjLSpKi:=I2em U ,xpk`)Xn/T7X`ɧ,>\̺ aL^Ҧd/@XI.V"<vIL&+*+Ŝr><-˚xsa',~t8ہE4auKC+>_"\; Kr5#XV2X$,Sl#XK  x w^Ҫ5X*6`c Ź RB`鿽`qd,ɵKRܔ`II\ eN,&rXػV%S:LZ*&X\}V-HK_9,`'XX'h,!``j_Z̼i-`.[ך]SBYfb.%\׼xkii͝Seٵ\ XZT3Xs._ s_m/;CsgKYPP`ekF{:(S~,bmXʩt4eW'X_wu{C>`9l5"J'Xdal4sϱK.^\ӣ1`Uȑ+i1lr8߲0C,blteͫ؟R|3eG8N&g,VEhv]Kv"PbVvu[[%( &xS}a>` sT4Rml[(,fK&%^bܾW`[aKVs 9X%4Xb%h|eT`iqsxxԃE9rTp` v)<2,X X\uY9j]gKn*+Xv1^,&: L**Xj۳K=,ëw\}VʑZ,nEK#X,q XՖ1,z6V>),)q{ڳJ7KmQX4YL?S:&2rmrQrεX&\aυ,,),fX`i_ThWK}AGeuKuŜGW V'*@OL6,غRl O**`qEK-Md /EEv\Ҭn W\ JX~`1Wii,u6`)?XX&e>VS\B3X>+a:!\%V|"KXҾ|R{X\Y6X)T%`QZG`e&>#XT1<`,,!KY?bY%`c41YVbg%K@ DV`+rhr˼Xf`Q,sX6s]4&XbK? b49,mgzб>K%h2t,͊mCV,r1+'i LŨn`, EnҁeSx,,CBoc>nKl'2:w介]+r*oZ_u{0Z/}ט5*X_ye'*^\rr)cҮګujmZ]Bw+vrZ^ڋ~r|*|x*kͮ)޽OqϞU>eXB\rk}x:7Ehc~h@-^l5]+wpڋ 5]WRV*X75oH113 ֦O=inkDwat>id_ ;{3wn4 }X|{)vt]Us^UګWt椢aTjZ]q![1Qzu{tcϓ1} K\켑\r俉^c`ukJwc]|^Uk+׬RIkyW7]YeZЉ$?ӤöOR=O&Rwߏh@{XR{ S*qq\w Wu^Mn6nUe/XCIoض}St7]vIt7T{_Լ68@#Կ-i?׾N9e-h4|̽,tp]Uk--p^\e/XKn>pN5B}*|y1=y? jcngL _?^TkQ}*Tk+wJk=J5kWe'9i' ^cm}wʑߚGes{:B7,7%z}#ugKu]˕kr{MoSeBE`AA XP,(D "`AA XP,(D "o ?d_l,w6yʻ1(;^X:mVm5`-b/1aն>;XrjjO {x fLvC)Y }WO[G]/m9 1<\IDATU?n].|ϨSPukG4cWL-u~oXD "`AA XP,(D "`AA XP,(D "`AA XP,(D "`AA  kkIENDB`phangorn/vignettes/Ancestral.Rmd0000644000176200001440000001077014125321002016451 0ustar liggesusers--- title: "Ancestral Sequence Reconstruction" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: | %\VignetteIndexEntry{Ancestral Sequence Reconstruction} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ``` # Introduction These notes describe the ancestral sequence reconstruction using the _phangorn_ package [@Schliep2011]. _phangorn_ provides several methods to estimate ancestral character states with either Maximum Parsimony (MP) or Maximum Likelihood (ML). For more background on all the methods see e.g. [@Felsenstein2004] or [@Yang2006]. # Parsimony reconstructions To reconstruct ancestral sequences we first load some data and reconstruct a tree: ```{r} library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) |> acctran(primates) parsimony(tree, primates) ``` For parsimony analysis of the edge length represent the observed number of changes. Reconstructing ancestral states therefore defines also the edge lengths of a tree. However there can exist several equally parsimonious reconstructions or states can be ambiguous and therefore edge length can differ. "MPR" reconstructs the ancestral states for each (internal) node as if the tree would be rooted in that node. However the nodes are not independent of each other. If one chooses one state for a specific node, this can restrict the choice of neighboring nodes (figures 2 and 3). The function acctran (accelerated transformation) assigns edge length and internal nodes to the tree [@Swofford1987]. ```{r} anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") ``` All the ancestral reconstructions for parsimony are based on the fitch algorithm and so far only bifurcating trees are allowed. However trees can get pruned afterwards using the function `multi2di` from _ape_. The `seqLogo` function from the _seqLogo_ package from Bioconductor provides a neat way to show proportions of a nucleotides of ancestral states (see figure 1). ```{r seqLogo, fig.cap="Fig 1. Ancestral reconstruction for a node.", eval=FALSE} library(seqLogo) seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) ``` ![](seqLogo.png) You may need to install _seqLogo_ before ```{r, eval=FALSE} if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("seqLogo") ``` ```{r MPR, fig.cap="Fig 2. Ancestral reconstruction using MPR."} plotAnc(tree, anc.mpr, 17) title("MPR") ``` ```{r ACCTRAN, fig.cap="Fig 3. Ancestral reconstruction using ACCTRAN."} plotAnc(tree, anc.acctran, 17) title("ACCTRAN") ``` # Likelihood reconstructions _phangorn_ also offers the possibility to estimate ancestral states using a ML. The advantages of ML over parsimony is that the reconstruction accounts for different edge lengths. So far only a marginal construction is implemented (see [@Yang2006]). ```{r} fit <- pml(tree, primates) fit <- optim.pml(fit, model="F81", control = pml.control(trace=0)) ``` We can assign the ancestral states according to the highest likelihood ("ml"): \[ P(x_r = A) = \frac{L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}L(x_r=k)} \] and the highest posterior probability ("bayes") criterion: \[ P(x_r=A) = \frac{\pi_A L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}\pi_k L(x_r=k)}, \] where $L(x_r)$ is the joint probability of states at the tips and the state at the root $x_r$ and $\pi_i$ are the estimated base frequencies of state $i$. Both methods agree if all states (base frequencies) have equal probabilities. ```{r} anc.ml <- ancestral.pml(fit, "ml") anc.bayes <- ancestral.pml(fit, "bayes") ``` The differences of the two approaches for a specific site (17) are represented in the following figures. ```{r plotML, fig.cap="Fig 4. Ancestral reconstruction the using the maximum likelihood."} plotAnc(tree, anc.ml, 17) title("ML") ``` ```{r plotB, fig.cap="Fig 5. Ancestral reconstruction using (empirical) Bayes."} plotAnc(tree, anc.bayes, 17) title("Bayes") ``` # Session info ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/vignettes/cophylo.png0000644000176200001440000003157013707232051016267 0ustar liggesusersPNG  IHDRs?PLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{}}}~~~^ pHYsod IDATx xE 0!rɍ5uUT5",,(@ݕA(\cEA}՝g3T7TuLU=f&;H z@j ( @j ( @j<-hvAM;%ʓuf.GVٗ ۫hRE4ӤҸ{P͍Z]a9= $zVu*თ>5Orsrֲw<˂.QƍD0g梮D ݆^& '^;8J_;!z]\?o'7$ֳP/ ڗ'RǠƒ,xEe͢i*ѭ>qA&K]G^pчn <,/ tx]P&5D󔦢Ftn}]m{uUfttDsoׯh k T\g#z*3UOQ͓j }#hѶA *N)+x`Q~ϦP]y *n?QvpDbM;8 xWR" 3It}-%1xWc5w̝(`Ё⩪+nv 6T V~mۉz*GGۀw}!G >V A]xbzWH J)^-S.D? z mʄP+Xc.&j%gsn׶ K DI)ԷWy\Bv)9gUT~AW>8B휫:.1;Ԡm @]Q=q/'`?[1e\'^9*~Pϧ|6ueDKkC^ %(zSR8%Aig5!(A@P 5H RA@P 5H RA@P 5H RA@JGc@Jz&1 hh/!-mߢ\Q)HX9k椦1ҩ&瀠,Vj5{Uvc=RpI}k]EmybNYhϙ.M烐 TΙ);~6+q*>`YN D+aqnߡ>U$~csgKĤ}}J:}C]r V9?6%h-}roÚO\Xs>QZ˼--[w'ŶCĐ3Z~A:X;h\˔;B*ȝO{+>Sd^\p* wb7ҟK0A9B%'yIMި|QӁ G?!hD6п8ˣ;Jqew| )-H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H TO#?4*.ZFh #?4jni8rAI[OT[?!OǑ-h&ͧ?.0QFTOǑZF+?m0>qh%Ϣgd9?25AP2nJ 1qyp"d5OI*芾]TGᰛJߋ_#`>}F0OLc˩qM'*]NZ6ARAg*׫pBIO>~2~ \=atSgIJMTЗnu*^W~qʶL;4 qdX}{u]PüL[NG8γk{<@P?}NSDehwq @j ( @j ( @j ( @j ( @j ( A/T+E eM|hRLE &1bњQʑE uTh=$X5{sR4LG/ߝ(~?}}CAIڽ~ji Ƨ3[?v~Lm}&ŵx/-ٶF:zybNY68q*6ж3wO~h>Vta@P; n9ͤ;K¶a@Oq&<$'2N;ptw,7oE,~2R(5@S>Lm\zb<\[7k}\lm-_?ՂJ-3D_.f5mv!7u'[Y=J vןەW|BkwҶsg>7YmR4ë}hx!揬fdMd+ѦA 0F奔@'OPOLy}xyq»q_e}^}ՖzQHKkkJiV,VwM gP^b]RyQ]ę NIewe k?x#sx-p]P[j]Lߨ3~tQ#n5Ӵe5}0?":W.0#]CYl!$4eNТ%6  TF1*|/gf𰠼gR͆}[b 5e>r{{nՎ%" T/D3v08)hK[ڡV(X9ոٮ%N * =ȗφX͉ jڏ(yj/{9?@P3&襃+);K6N?2@/]{9I!ll[ ,kzYǍw{tX<$fQP);a]ʀw[I A Sv~ GvkI A Svx>0nw\I A Sv2Zq1')5+Fk+\μrTQ?3\zPj[SKZΆ0);kg9Vn#$:H_]VA/J? :at-Ll{PĜ/ "xScR45޲LPtM4UnoSZBP3!htt3e񜤁DZA͔sZZA>A}uj8 q  @P+@PǁVAAZ:uj8 6 zϴ_3_A`NϦ|2cף\qE )4591cgXj8 q  @P+@Py3^}@NAL҈:M= Տ* AM 4gfө%<)æclANAeXcJm8 W{Hj*y#EA %ijCKѮ9?|MX׏ӻۡ \4\Y77"-a&D&/kXet^ j"ҲTvSJx"3ʷa:k;b^7?误VoĪ7@Pk*;TT[ o:]Σ̙(iލwkm.*l :@ AaX⯫{3Zmob}2P5 jtR/:dǞOJXj_BAPH)(JsL巺I=/vn/l V(j9 *Q U @P<ɜMB^ U61ia\I ,z@Piz@Piz@Piz@Piz@Piz@Piz{ڴ4P4@P=n1~jėAc JJJJJJjsu1!4!6W[8Jjsu1!4!heNw7Mh1 V9y#J jru֏/L[y+EZuYzL* 6չ6< m;dYzL* kKSplMIE<)nFXM1HA߮q۷r۫չ_:d3w.'3%-|)vm+9R̿o9?mF.j/AcKUA[h!r^3G3šZ杴觗mes|MTf(s&m4T4eE^5:WhϘ7A5 &2255Tę NIKj0Oo"jh4'15@e5ӴebW.le cvo} =8X4 c=@3[ h hlF[ h hlF[ h hlF[ h hlF[ h hliuUA{4c [|+Eۇj lD/jd9d3:k1!lD-6l@ي̲^L*U0Om2ـeB(34AP4bR8m2e|hsAPPqǰ ?=CmdڼeLE ۤ)QAeCs+P=1i䭭,T\öri䘜?wFW!Cʆ"܏&j䐭,cVL/"AP4"d9d+2:0HbBPd9d+2:1J1!G^PoA=           Fo2/֣p_ µ.XOA]vUkc= ~ep ]?끚ǟ*`@PA}2@P_A 0@P/A=9ALdk=0u3XØDcAPcNPMRي<'TX$cAPcJPmRيT Jjry_k>AP?P)GjVm'D<k=vϫWJjV=đampOsFI*[GvsRl7cA3MRيwT&#;by @j (  #w 3ǵ+?#hܹe[6 0f{f| %.ptaSa^/9P;$@j ( A~_ zgF1&_jť,S^~"H5Ȉ8ͥĭک Xj~dDCjv**AF1"4P^xVNek|A1" ۜC;g@>;LjHMY*v**?7zX3ǘaeNEQE%p !7Ȑ8F]NM芝VoP{4Dܶ=+pBQ>;LgzǠrzP4WGN  ] c +w+iq}mMY-؟:G'ť< ڽ;kq𿙀@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5H RA@P 5Hw-GVٗ k}ڕphTVD f \C5n4l"z̅g=xTRp4A+*:[i&`LOrsrpUA%tz0ScX<Ԫ܂>xWC Z3c!zɱW}^Kj}z"܂*?c[i&ARuѹ_mOiZen3'/ tx]dW<@ڰ{OdEVG~{II*h3yRݾPޞR+OLX 4R_5>Y*%Gz_f*j m;d>g4Bz3LPiG[ȶf#kĩf91!C߯}>Ve;Tm̝OO/~Z%W+1݅)bu#cSjwO-gp6{΅53;ibڲUxlqRl+;D 9ÏչsƵL #1jYMg;3 tyq$ޫ6܉TH.;2B;o b=Kj0Oo"Fu壍:tǔ\H? A#^AT爛.?W'7  @j ( @j ( @j ( @j ( @j ( F~*'_đ-Zt#]đ5WQvqsrl-'T琧 C4Hӟov(#{HU&OiO;Zɳ(ę1Y$M4-tJ 1qyp"Fe!.衬 Z2e:GT^)/n7ycXNՏM8ldSiʨ@vA=qJ,䈛PR'j?ycXՏï>qܤ5IDATȦV@vA:#{ 'l{MC'VK΋F˴+^zaM+sbX +hVЅ3KӛQ]ę NIЦ"&+e3O⦿ǝ.8cfc4mgVcBP zjPt怠EjjPt怠EjjPt怠EjjPt怠EjjPt怠EjjPt h5P%&3MW|09(v-B6MfL>VFEU۰kA!hT@@P怠EjjPt怠EjjPt戉留! BǃjAiA@i5op@@i5֙.h1_uyl÷]PMΊ4'T琅Nu zý5MnA9;+tQFT}:L5$Z9;+t΢\'2XA] AM4;t,&ym3~ܹVisvvb)^!\6+8TnjE+aÆ9lStxMΊ4'0}g1*ֱ{nuZAPYPK&ggEeKݘ 8!(KYsvbs$V4S6&Yshwc ڀL j9 @P瀠6[R95(qޖ7?C絯?Oh޾q7;;Q%cFF s@PAm: s@PAm: s@PAm: s@PAP7׺ڀ ͘dĵnƄ6 zd V9.1! H n2٭ji ׵{gnƄ6`&&]@o3O< +݈idlLdM&;)nFDٟ1 MڀAi_RAn2ESd梤=E}ŮmeO7t'iV} e,{[P*螭%Ʒ|d53ImDtjcӬ: ^A-cAP]LK&>c@,Cb}%Ab&K&F&訮t-&%AWe!݊ A">Z:  uj(*Q U @P@PGVAAZ:  uj(f#c]^=#;Q׻;z{]j(*Q U @P@PGV9Pky䌉x=?8:mίsOcA%^P]TSɧsCAPwqXʤD Sgm<á 8+&igѮ9?|MX׏y8ug&DZP] j"6i)%{meOp[<%BPW )OkvW$ N;n{Gb{BE趆U j5&i.ǞIȨʥP& A]ƠfLY|MBTvPew@PA]Fue ht@PA]Fue ht@PA]FueټehDrA]&H.c1@P x] @耠.A 24: @耠.AWzV|@jAzoRu<4'*$r~at'ض4;Z;J95h7)APqTS_U>D}(~PC;M02N 3-d(o39df.=(#{c 5A'2@ni=ᖢKgQnT3NAP$hTp.ݝ;KMo-KL5,fA]&\>,"j­^gmb,~[Z͍gNr1sOd8dj?,5d.R9s#^][l ^~,%m'㗈xr\!-?ȟTA#RC!˄i)okkJ io.%o3E9 A]ƒyaq7KxvmG~%ɝ`uN_|&w<}\A]AA}u u h4@P׹iZI uR`$54` 54,4@а@XAAc  54,4@а$*c7g]y% 遠ϟo<z 遠ϟo<z h)iZjbKwĄƦgLɖ AcMIj61[&&56=]z.HX9k椦1iBN_t%&5<%iR?R٫Ze.X^lδՎ Acg rƭ=TF:zybNY6OtZV1f%b38gJlʫb5}ȅ53;i[9%(>'e!+9#,Nğ,KZ,h'~`iaW&zS RuکdF7xC~IgT]' |2&L1$ zFPqNeY$P>E~F_tmN?TT (nn +c*nї;_Fmt% S ۛJ;MaWXT|4Dܶ=+pT%xXs1aΩKA;hN^ UƄ)F?o0N~zrRH-Qt1a?uNKy׷{+w**{3)9:g Do 7 @j ( @j ( @j ( @j ( @j ( @j ( {6JIENDB`phangorn/vignettes/Trees.Rmd0000644000176200001440000003306314140464134015632 0ustar liggesusers--- title: "Estimating phylogenetic trees with phangorn" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: | %\VignetteIndexEntry{Estimating phylogenetic trees with phangorn} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- # Introduction These notes should enable the user to estimate phylogenetic trees from alignment data with different methods using the _phangorn_ package [@Schliep2011] . Several functions of _package_ are also described in more detail in [@Paradis2012]. For more theoretical background on all the methods see e.g. [@Felsenstein2004][@Yang2006]. This document illustrates some of the `package` features to estimate phylogenetic trees using different reconstruction methods. Small adaptations to the scripts in section \@ref(appendix) should enable the user to perform phylogenetic analyses. # Getting started The first thing we have to do is to read in an alignment. Unfortunately there exists many different file formats that alignments can be stored in. The function `read.phyDat` is used to read in an alignment. There are several functions to read in alignments depending on the format of the data set ("nexus", "phylip", "fasta") and the kind of data (amino acid or nucleotides) in the _ape_ package [@Paradis2018] and _phangorn_. The function `read.phyDat` calls these other functions and transform them into a `phyDat` object. For the specific parameter settings available look in the help files of the function `read.dna` (for phylip, fasta, clustal format), `read.nexus.data` for nexus files. For amino acid data additional `read.aa` is called. We start our analysis loading the _phangorn_ package and then reading in an alignment. ```{r} library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") ``` # Distance based methods After reading in the alignment we can build a first tree with distance based methods. The function dist.dna from the ape package computes distances for many DNA substitution models. To use the function dist.dna we have to transform the data to class DNAbin. For amino acids the function `dist.ml` offers common substitution models (for example "WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa" or "mtREV24"). After constructing a distance matrix we reconstruct a rooted tree with UPGMA and alternatively an unrooted tree using Neighbor Joining [@Saitou1987][@Studier1988]. More distance methods like `fastme` are available in the _ape_ package. ```{r} dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) ``` We can plot the trees treeUPGMA and treeNJ with the commands: ```{r plot1, fig.cap="Rooted UPGMA tree.", echo=TRUE} plot(treeUPGMA, main="UPGMA") ``` ```{r plot2, fig.cap="Unrooted NJ tree.", echo=TRUE} plot(treeNJ, "unrooted", main="NJ") ``` ## Bootstrap To run the bootstrap we need to first write a function which computes a tree from an alignment. So we first need to compute a distance matrix and afterwards compute the tree. This function we can than give to the `bootstrap.phyDat` function. ```{r bootstrap_dist, echo=TRUE} fun <- function(x) upgma(dist.ml(x)) bs_upgma <- bootstrap.phyDat(primates, fun) ``` With the new syntax of R 4.1 this can be written a bit shorter: ```{r bootstrap_dist_new, echo=TRUE, eval=FALSE} bs_upgma <- bootstrap.phyDat(primates, \(x){dist.ml(x) |> upgma}) ``` Finally we can plot the tree with bootstrap values added: ```{r plot_bs, fig.cap="Rooted UPGMA tree.", echo=TRUE} plotBS(treeUPGMA, bs_upgma, main="UPGMA") ``` Distance based methods are very fast and we will use the UPGMA and NJ tree as starting trees for the maximum parsimony and maximum likelihood analyses. # Parsimony The function parsimony returns the parsimony score, that is the number of changes which are at least necessary to describe the data for a given tree. We can compare the parsimony score or the two trees we computed so far: ```{r} parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) ``` The function `optim.parsimony` performs tree rearrangements to find trees with a lower parsimony score. The tree rearrangement implemented are nearest-neighbor interchanges (NNI) and subtree pruning and regrafting (SPR). The later one only works so far with the fitch algorithm. ```{r} treePars <- optim.parsimony(treeUPGMA, primates) ``` However is also a version of the parsimony ratchet [@Nixon1999] implemented, which is likely to find better trees than just doing NNI / SPR rearrangements. The current implementation 1. Create a bootstrap data set $D_b$ from the original data set. 2. Take the current best tree and perform tree rearrangements on $D_b$ and save bootstrap tree as $T_b$. 3. Use $T_b$ and perform tree rearrangements on the original data set. If this trees has a lower parsimony score than the currently best tree replace it. 4. Iterate 1:3 until either a given number of iteration is reached or no improvements have been recorded for a number of iterations. ```{r pratchet} treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) ``` Next we assign branch length to the tree. The branch length are proportional to the number of substitutions / site. ```{r} treeRatchet <- acctran(treeRatchet, primates) ``` The parsimony ratchet implicitly performs a bootstrap analysis (step 1). We make use of this and store the trees which where visited. This allows us to add bootstrap support values to the tree. ```{r} plotBS(midpoint(treeRatchet), type="phylogram") ``` ## Branch and bound For data sets with few species it is also possible to find all most parsimonious trees using a branch and bound algorithm [@Hendy1982]. For data sets with more than 10 taxa this can take a long time and depends strongly on how tree like the data are. And for more than 20-30 taxa this will take almost forever. ```{r} (trees <- bab(subset(primates,1:10))) ``` # Maximum likelihood The last method we will describe in this vignette is Maximum Likelihood (ML) as introduced by Felsenstein [@Felsenstein1981]. We can easily compute the likelihood for a tree given the data ```{r} fit = pml(treeNJ, data=primates) fit ``` The function `pml` returns an object of class `pml`. This object contains the data, the tree and many different parameters of the model like the likelihood. There are many generic functions for the class `pml` available, which allow the handling of these objects. ```{r} methods(class="pml") ``` The object fit just estimated the likelihood for the tree it got supplied, but the branch length are not optimized for the Jukes-Cantor model yet, which can be done with the function `optim.pml`. ```{r} fitJC <- optim.pml(fit, TRUE) logLik(fitJC) ``` With the default values`pml` will estimate a Jukes-Cantor model. The generic function `update` allows to change parameters. We will change the model to the GTR + $\Gamma(4)$ + I model and then optimize all the parameters. ```{r} fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR ``` With the control parameters the thresholds for the fitting process can be changed. Here we want just to suppress output during the fitting process. For larger trees the NNI rearrangements often get stuck in a local maximum. We added two stochastic algorithms to improve topology search. The first (set `rearrangement="stochastic"`) performs stochastic rearrangements similar as in [@Nguyen2015], which makes random NNI permutation to the tree, which than gets optimized to escape local optima. The second option (rearrangement="ratchet") perform the likelihood ratchet [@Vos2003]. While these algorithms may find better trees they will also take more time. ```{r} fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR ``` ## Model selection We can compare nested models for the JC and GTR + $\Gamma(4)$ + I model using likelihood ratio statistic ```{r} anova(fitJC, fitGTR) ``` with the Shimodaira-Hasegawa \cite{Shimodaira1999} test ```{r} SH.test(fitGTR, fitJC) ``` or with the AIC ```{r} AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) ``` An alternative is to use the function `modelTest` to compare different nucleotide or protein models the AIC, AICc or BIC, similar to popular programs ModelTest and ProtTest [@Posada1998], [@Posada2008], [@Abascal2005]. ```{r, echo=FALSE} load("Trees.RData") ``` ```{r, echo=TRUE, eval=FALSE} mt = modelTest(primates) ``` The results of `modelTest` is illustrated in following table: ```{r, echo=FALSE} library(knitr) kable(mt, digits=2) ``` The thresholds for the optimization in `modelTest` are not as strict as for `optim.pml` and no tree rearrangements are performed. As `modelTest` computes and optimizes a lot of models it would be a waste of computer time not to save these results. The results are saved as call together with the optimized trees in an environment and this call can be evaluated to get a `pml` object back to use for further optimization or analysis. ```{r, echo=TRUE} env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) ``` ## Bootstrap At last we may want to apply bootstrap to test how well the edges of the tree are supported: ```{r, echo=TRUE, eval=FALSE} bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, control = pml.control(trace = 0)) ``` Now we can plot the tree with the bootstrap support values on the edges and also look at `consensusNet` to identify potential conflict. ```{r plotBS, fig.cap="Tree with bootstrap support. Unrooted tree (midpoint rooted) with bootstrap support values.", echo=TRUE} plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") ``` ```{r ConsensusNet, fig.cap="ConsensusNet from the bootstrap sample.", echo=TRUE} cnet <- consensusNet(bs, p=0.2) plot(cnet, show.edge.label=TRUE) ``` ## Molecular dating with a strict clock We implemented a strict clock as described in [@Felsenstein2004], p. ???. So far the starting tree needs to be ultrametric, so we use the UPGMA tree. When we optimize the tree with `optim.pml` we have to make sure set we set `optRooted = TRUE`! ```{r, echo=TRUE, cache=TRUE} fit_strict <- pml(treeUPGMA, data=primates, k=4, bf=baseFreq(primates)) fit_strict <- optim.pml(fit_strict, model="GTR", optRooted = TRUE, rearrangement = "NNI", optGamma = TRUE, optInv = TRUE, control = pml.control(trace = 0)) ``` ```{r} plot(fit_strict) ``` Several analyses, e.g.`bootstrap` and `modelTest`, can be computationally demanding, but as nowadays most computers have several cores one can distribute the computations using the _parallel_ package. However it is only possible to use this approach if R is running from command line ("X11"), but not using a GUI (for example "Aqua" on Macs) and unfortunately the _parallel_ package does not work at all under Windows. \newpage # Appendix ## Standard scripts for nucleotide analysis Here we provide two standard scripts which can be adapted for the most common tasks. Most likely the arguments for `read.phyDat` have to be adapted to accommodate your file format. Both scripts assume that the _parallel_ package works on your platform, see comments above. ```{r, echo=TRUE, eval=FALSE} library(phangorn) file <- "myfile" dat <- read.phyDat(file) dm <- dist.ml(dat, "F81") tree <- NJ(dm) # as alternative for a starting tree: tree <- pratchet(dat) # parsimony tree tree <- nnls.phylo(tree, dm) # need edge weights # 1. alternative: quick and dirty: GTR + G fitStart <- pml(tree, dat, k=4) fit <- optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") # 2. alternative: prepare with modelTest mt <- modelTest(dat, tree=tree, multicore=TRUE) mt[order(mt$AICc),] # choose best model from the table according to AICc bestmodel <- mt$Model[which.min(mt$AICc)] env <- attr(mt, "env") fitStart <- eval(get("GTR+G+I", env), env) # or let R search the table fitStart <- eval(get(bestmodel, env), env) # equivalent to: fitStart = eval(get("GTR+G+I", env), env) fit <- optim.pml(fitStart, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ``` \newpage ## Standard scripts for amino acid analysis You can specify different several models build in which you can specify, e.g. "WAG", "JTT", "Dayhoff", "LG". Optimizing the rate matrix for amino acids is possible, but would take a long, a very long time and you will need to have a large alignment to estimate all the parameters. So make sure to set `optBf=FALSE` and `optQ=FALSE` in the function `optim.pml`, which is also the default. ```{r, echo=TRUE, eval=FALSE} library(phangorn) file <- "myfile" dat <- read.phyDat(file, type = "AA") dm <- dist.ml(dat, model="JTT") tree <- NJ(dm) # parallel will only work safely from command line # and not at all windows (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), multicore=TRUE)) # run all available amino acid models (mt <- modelTest(dat, model="all", multicore=TRUE)) env <- attr(mt, "env") fitStart <- eval(get(mt$Model[which.min(mt$BIC)], env), env) fitNJ <- pml(tree, dat, model="JTT", k=4, inv=.2) fit <- optim.pml(fitNJ, rearrangement = "stochastic", optInv=TRUE, optGamma=TRUE) fit bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ``` # Session info {.unnumbered} ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/vignettes/exdna.txt0000644000176200001440000000024213707232051015734 0ustar liggesusers3 40 No305 NTTCGAAAAACACACCCACTACTAAAANTTATCAGTCACT No304 ATTCGAAAAACACACCCACTACTAAAAATTATCAACCACT No306 ATTCGAAAAACACACCCACTACTAAAAATTATCAATCACT phangorn/vignettes/Networx.Rmd0000644000176200001440000001251114041301653016205 0ustar liggesusers--- title: "Splits and Networx" author: "Klaus Schliep" date: "`r format(Sys.time(), '%B %d, %Y')`" output: prettydoc::html_pretty: theme: cayman highlight: github bibliography: phangorn.bib vignette: > %\VignetteIndexEntry{Splits and Networx} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using [phangorn](https://cran.r-project.org/package=phangorn) [@Schliep2011] in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks [@Holland2004] and Neighbor-Net [@Bryant2004]. Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls). We first load the phangorn package and a few data sets we use in this vignette. ```{r, eval=TRUE} library(phangorn) data(Laurasiatherian) data(yeast) ``` ## consensusNet A consensusNet [@Holland2004] is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequency of the corresponding splits in the provided list of trees. The input for `consensusNet` is a list of trees i.e. an object of class `multiPhylo`. ```{r, eval=TRUE} set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, show.edge.label=TRUE) ``` In many cases, `consensusNet` will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D. ```{r, eval=FALSE} plot(cnet, "3D") # rotate 3d plot play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # create animated gif file movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ``` which will result in a spinning graph similar to this ![rotatingNetworx](movie.gif) ## neighborNet The function `neighborNet` implements the popular method of @Bryant2004. The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls). ```{r, eval=TRUE} dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet) ``` The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in `phangorn` may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the `networx` is done using the the fantastic igraph package [@Csardi2006]. ## Adding support values We can use the generic function `addConfidences` to add (branch) support values from a tree, i.e. an object of class `phylo` to a `networx`, `splits` or `phylo` object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects. ```{r, eval=TRUE} nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, show.edge.label=TRUE) ``` Analogously, we can also add support values to a tree: ```{r, eval=TRUE} tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ``` ## Estimating edge weights (nnls) Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph. ```{r, eval=TRUE} cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, show.edge.label=TRUE) ``` ### Import and export networks, advanced functions for networx objects The functions `read.nexus.networx` and `write.nexus.networx` can read and write nexus files for or from SplitsTree [@Huson2006]. Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications. ## Session Information ```{r, eval=TRUE} sessionInfo() ``` ## References phangorn/vignettes/Trees.RData0000644000176200001440000050112613707232051016102 0ustar liggesusers}@TK!-T0P.x1PADQ,$%nP,ACY%V0|]{杙wޙ3g|ɽ{Np!';I_ײ$#$/#ɔD_K8%f gY),dP%b PE}3‘E}YfчY.= Fx8D/ތ`9C2K+ 1¯^}ٺǧHfY܎"bą1A=Gzv$oUW -U6Nkwcr%wGPPw_rT! }.=Lo]Wrٗ{7Z/yӐ[>T4uwIE^-{nCl|n P^;>u]x"UΓ6Ԭ623kK] <3.E]k Iު[ -1Zbn*LS[s 3 ]KkK5y M-WzӴj{)3-4M9Xdfahlɼ'o`hb =]y#{=:*(h,? 6^"[_["wƲeaMZd}o\i-YahY|lSLP!'؉@ĝ䅫5K_ o?La͟@WùKL}X&x`ыoV7C!!o'z1f/@YmTfe8.ON#α.ZIrOx  O1[^<&|z iNto)3viBRߍc\;{&D3Cb;b:pz=ňᇔd f: ҟWrG#W!ݽ d}̙2ao-^p$脠 ʸc ;y=xv{|U$I~D9֝ƒ "ץOn:p!.}9ړ:,rHPQO$m&qH:+T|^rrжu5 *kbn:u5Hew='{Wj, i-<߫'n]Q$QNÆӟKΣaUn:A;3S6FԗT"YqKh^,ٍaVw7 4nPsH= B[d?Ey؆|ASޑ(屈{q*}?^DHdzrvGzI<5yw]m^Wy2~/]+`{_(N, w]R]j濮!oRuʣ$^:,BtG"X~IJώnלZ8>)\Wd <6]G*Cqsse}x闅2P*S{RvuR'g#>#u88ޮ1]ԸwL<2b'dW;:l^/Qϗ/!|o] ~Oc 4MgƊ˔:lIP5.Z3>5ő%^V̈́čL3Mt ]R  f#!vA;png)/6B٥"&盦b^Eٳ!$b}6$| ;)+ȏ{o@jYn:b>qO3@]p^:W!ey TUggCAkJ H#iz4ӧ +'.H_HR`č7Dһ mv^V9=]?~sWy/#]OzBf9κyL}OKWDib|-jB^&9  ,x( Dd׎vGm[48kk8)%o TC#/șZ[:5s (Af^ *6cmp5r%E<)Չ(9b:0s*4wč;EvK[ AR%Qp7Q_5I}{+DTMv8)lTow3:z_agZ?kgrtBzWV=ϝh/BvFC$[R"Q> Frtɨx*W==4 $nP `w:.E/)ƅ_:kGPlN={ʳ6EP#쮸f+))G@0O."c guqܺz܏By o4Qwi1= 12 )OW`juvî8.eHxOޯ.n0G T\(|F`7n6,Dȉc<㯾g놙<º'/#l'կq^U"r:~sXR:jmu;VBHOB^٣Eќ)FAOOgqrT.z Pq1QL6z䲁pUq7:.3O4&+?SanriK"&v1wYqLb(#"i>CSgTt\B^cD7t [\JuǿhS;?/Ig~gO{؀Jy^=.1o Dtj\F,/ ߚW3ʅbtUPQDUZ> q<2z-[4.­wk}De8Wo{U1IcJx_lCXyS2o`zHQ|1[-Fؠ>H>p} VSN͜=Qs/̽8|**!OXJ.H8G:"^}ԧ3?XaS^`]gH0B_'5㨨-{v x~1Ď';UGX nk蹰!dW C}Hܬzn<{_=\\"#җh「7Z4?, QgZ g [()~Ѡ:t7l;ȉh>G> xKHv^JbQRΉ 猬İ}:/|pM.Jm}|Ķ;hWq[n:1}D/Mc}Q6pkiyJDo5>ӭ( l#ȾSHi(y3"W;%^DǬ)[P)9)kClilaB|.j|:fQr@xa(8 )p7,^Wއy^RҾd^|3cpSb|.,0% F-o|t]mY_',(AF<9|)CO;xh]ö̜ĵϏqɬ#ψ8a$#68ÁQ1V, Ok.;Y`߈{V]rz_n+Fr3s"dn|~oi~$jbjQ?U!c\>!S9p3ϓ>}Ͳ~; ŷ~sQ^F7ӧV#@kWEȢƿ=y%x!dV3dvɗw=r+n zGAt@7t@s']oǥgN0אʎ7F Yfv^P9O|H %A "BYH[Q~%Kt@䁮6w_Tl^g^}h‘Ct?᭣tq$`~>N:|UG>=n<Ye3fϒ!S)LjzgOx /6>Nmz&O6 G5qwRrphO߾_I;Uu+%Q7r5;P趬,S+b{5?gb\~[KeV<40tOx wٜS3 TƂ3f驥[, oqK!uBxm ڑ_6Ft+ҷ؏/ k_E]ڑchu7Ed,(V ɻ3hHbPO=2 I6Mh=ƣl\PKb]v?B*9AҾ7/Agk6nt%'dV[?!/#L3qԧ3`?z|(i{,M̏ ^^Cs T9+w¡!3!.e`ܒY9:8Hy?pHnm {Jg$+-5u|RR]WzAv?taitE]>.#>x-l_2^FȺ?Ÿ@'"PpeS7H;z?A q .#%!oY*%@^1sr";29,є Ĕ 1as~Ar1g4DH\Vy,h}|=C:9_dPyß+|2Dk(1q;^Ӈ4kd|S<#~TXB D7t]ק+ ޹;dd4h (뷥|1>v޷H{#0_]u6AGB|!j%$sy4|B6wy"|=իs\sy*v&h <ɫ ɽstSr6|Оx/ؒe owEpj +yI-*"gɜ׫k.[zX+G%MOAazJ9nH EE 7w~kkoʒaR:eٻ2$y-UOw":}ofE>G:p]Ev9CjCRho_Wd0v;JGj5UDH.OBRD7t|p]q Olxag~t]Oxs-"5"z oWWsqk#(͸~s׫S,췳)>{nf>BqQ9C9W(]qB]jIЪ^[nAF9/ڎȷ_y!j}Ar=9C_[1#7_9p5D7t`cf=.hOWTI͛%JVEԳ7瘠dkC5kPbiz{nB~yClrVed|1}x-{#ve=.??܄qUIҖpعvVg eOXeI 8lgC|!WeMO e"q[Kxn(;+&XeoJرeogH6b$25jW /<@ta!tRw<; j胇$im-B#nFgRGQB.y@&/1ږi,(GҔ!}Q:ʇ#h#'S3޷\ an3HٌOvgnzӝHqOY!wL)6t䭞`6Y8HP7Hq8%JёۻlJ|Ft@fdO+7Oj{ȝ</#w.-Ҹ=%tT.$E}oEp Q\wWQ煮^\1[|\8(7=/B\ӐzH*h~avgDq}c4W)AfvW6b؞5V;KNW+,EݔOE. c.s/m rڞ؀&}-W^BD7t OYvfc+}L}X#%696d?綡.݉}AQ}BWDu{GRټp0Ud'j͒El OHU=2N8ldg<E7Q/ՠ̲4$gY/?n`YB,CQRY"I^ʰ_{D{ΈPY| i_?v#0/3^G^}:ʷk-gxԶ)!egfBǫ q~i_7<:1<#bp;Fp1gkZI><܏e8e7/#XH[[4$f7>~ ڸ% -haxRx-_^dH[עto`[3T=O:]; vgK恮?K~ tgڭјyD`$O̾2Uq@K΋80`wL=<]u\j&so7lZCt@_S5O?S??bT"=B ج^g"ē7wnچq(.==4,HglR8om|͗BA2gM>/"uDa}r,ej olj28Dˬ[$w2RggcųV\m6A&P(߾l"`Iq۝恮zBVoS?2qͪ< w'hW_Tۦ%_@ݩ[U\ͣwW[,uZ8%b8~&nE(R|]\$Ey͆F\bisyKcw#dO]ai0_~X{L9m2}<F0I^f_JxО;hF@tO"H 9hI&Ʀg4?jO͍[QU]:1{p8BƲ|b6[7 =Plj|OJܗzՑW7"T[j- PY?hL]ڷ XUo9A9.61wcy򁡵(he/{!yekm:ҽ$}4azOۉlﶽ*{qE3 Jc4@ V sᇼ2m;q^Xes+i ik>eK. w@ě#@7Jo _x]WtߝWپ$"b{vj|]OVE+Eޞ=QqG1,8UoHW~&d3.8<]Eٓ4~)Q٨nfpD}x Drͼ} I."y@>]q\PzJ'q;/;W DYN)k]-DPU29' R?{:k"E(IOB9Uz>FN޹~.zr;v8;7w/–%z |ЄYCb &4z!$A}5eHkA$F|ۋ@)^zUH}ee_1߼^恮+ゟE/)ƅ_Vh>!ѻ?=3!:9Au>)zx5n>4X8P҆i!:hڽUNfW ^O ɯTetp%_9N$ݚ &ځ`'{f،S#%e Pn{\Of,W!>"fHҜw@~ڡD7teчL~O#:O Xb\y~'J=C#7oŠ7>zҊ,X ĔǪ &`(g*K |y|i]qpX:.]1>M!r 䞁1>:|fS'f T1enH1ôE+E9BO"YgiV#F^Μ Hڞ T'yb t{E/}I_˾ʷqUekjÆX57>@PdݛX$Gd ڤK!T|ACH^qB$$H>[wJ"4`^W~&8AKUN!~8Wf #| jQ=1,?aBфckL$Y׏TKU؇ D 5!|x{4d8>;Gknh]?>`ouE,W0eч7'~m;*gƶJp=X1s> "3vD ^x(L7sw23FKՁi ap]Ύ;wDNЂ~P1Q"+;v:eBK𶤌 5zM:n t[Dd>o8ʎҙ 랯|p)kAq]٫Kr<6_D|Ag+auA3xK3nP 1r߬HuAK6yA]eF]:|SieO!Z ɉVIJ]T6#Y&q{ѴK!t RmNP OB[qOk JWM%dPq#e}u4(;?qe- n:cPbÌƩ"?mh̡ PkUEFf/MQqly9QGObR7>Lxi#!启8W#TODK|w<QÕؼ7 f78Ԉɻ2*z;~Bf^3^p9^śhޅGx ZrBW^ˏDY{0e֭ ɔ-٠q{,}د.Mt@偿ݗ_t!S}?ڇ_Xb'xD2uV) (_'zҽq*::sNCxˣyk}eP'$sl]CC@Q5"xwYǑnڂTw[þ IG2x̌TF+ْF=_԰3{&Y"rr{GNB:ROYGl:qAxCFeqmr=<߶~`q=eBV"gpKzPf2@j 2F[q]Z Y ;onz}+67,ѥ' @PZ%kI^ X!=>)u7Um%xFL}5Q<~x vd(Zxl-;)<<>*JʢTr$z#6M"ys)Of?}?Z'D' |ҘAD7t=щ^ ;&W)G#ωz)ux;˵F0A;B, ɹ*O(?S`}WSPy|?p2_@5/m9: '>YrCBϘS%{(%{q"#f{<#DEO ׃~.={mx׾[$OT#ykFt$\z^b%-ֈ6\#Z ]-*o'}!7}@M2OQ1H|SY_IeaYՐwF{Jx(;)~Y&m~r!O?ܷS˷ڢjɰ{v" v#xL,jjEky6Z.yie%y࿃Xq ](#d[E ;y񴀵n.Y$w{x+@}oa3=R? kp %Jq)Re'Rn\<䂄z'!g{r%{Ep].<{ލ{2/ط/&T7[w Q~Z̎2yFwY"1晗w};M98Rax{F;Y|Iޣh:Wsz ydz_7MDsGupyOp<cRϝm[>Yrh{xv+j\'P.6 _%*4O^U4Uv#!{᧹#Rqhc "[?])MRELpi܋':]>vT4la+xR C^{G 󭃝9RSO #IL\QxΆ!䨻o=,K9]Z߽oy~:~ (OW^ı:F`q O^\|BO+W"CTDRd  Z\߷ ti_ap7~,bc"f US|xҥ͙hz*_TΰҹQda!ȉR;Bq %y"J99#, ^2ǩ[9g<Z++kNI"R6zHXU|B_q!.6EB!4j2?4n9|uF }}oGҭ߆󚻇M{i32mom{Q+P.j?f֬mp7=Azrt3] SuN3@9uR7B |=12[g}FF2;A yTenOn\8{{OQw#_(tq'D so_c#(AkQ PqUN@')WےoR^ .l}!&F#=a'~+<7UBཁD7wͤ'\|%è7Gy#]0>M{ ͤ) Qa2h*َZR?vJ lq1ӵH>{َqįoT^o$=P":`Hxm|29 ~5؋3aBvٶ +.8 { w [*b@͕?=z)dD'j|>^q\c^/] %YĪ\UKk5_֝mfH~oY3{Iv5>!|֮/sƦr"lzQR_y6>ga냬gtݑ~^Vh a8e2Q(/Zr3I|{,+9t"rNk5Kt@KO.);uDRF|sy*ql+Q(Bg="Kl et}5lvג?UH "|!eCp@6kǗfn~=-VMA.a'G8by<|[];UnGwKp(LEn\N~8փѫ HP1n&hg&^,GH5\ zRO{} znx'] .E< %C>ﬢY9i@%S,Ko~tXUX5G"Xe+k?nC\Sd!y?4.}_g僮4.([+%&!li7TxFĩ^ ԋzJ>EJ"[.!@`*sM~4O=F Pr\17MJGLz3ݴ9"Mq3:>T$?߷N.м{DLŝ},ADW쑹rȷ,ĦMrpo,]ڷ+λ ~^`L}:[_Y?YRs}U/MΗtP2i4\ܞ[cُݽI f/AfeEWVO".Ѓτ=v!eي(nJ@jUWwtjH~}=}Mg>fo"")38kH\/tͱ(y1jDI6-f7=[Zm pVU.t_^~ABg |([]3/{嗄fὠ>WXU ȯBb 鏔y>9D|;AS7{ө ơ`PaF?ͱH`q> ǹy^]H>zMWIN`Ҝ(R,^S=!s*=&/]^gFn26dj ~qe*SE*;&xSO!e&Rtb!̺QօTGR 2¼%Ҽn÷ˆzHʴ8's)Nȗ׳_ |7+ԋ,CBAH"N7.?**9niɣ”Ñ$7c`ut?TsEZf\p쟎h%Ynn6(z 8u'"L.^{d1F̔ @LٳQy+}UTNj٪UWq7@15W33ϠIx/MƋ^[o'y?=.` gX]G44}/DiCw\p; I\KYi!)x4"؞]v+o">\t5$/WpABL&{Z ux+3#c$z !K&>T*eyHK%fRl^`1_+q'/~=#^z?ڗdF1(?`Vb,ۗ#Tq;U=!y۠\QDF~^ Ѽu Z倦}2"qv˃^"TFt9&"zPŊɈؙuc=IJ ݵQv)o2 ! ; q꣄E(ۿwfc IX{5T1rܜ[Z wS!u?qsMރ"^6+E0>>DA>]q@s.焀Ǹ]0'i"J]:5y}5 m)qU]n\'?;z[5Ӵf9#EQͥ"u+sznCT`V r/rӳor7Nm 3@Lc_?:?*IS!sej!qP.$ù"'<5b$o;6R7E=̆}wTƚk恮S #Xa7|Zݬ9޸6t9hB-@s?34? #yڸ`,zuq?'6O\j0&чn$e:I@/r vm 06$Ŋ"hѫCp^"3lՉ}͌{.&<@>KUb &U!}Ѿ=?]= tE`,z?/Fq'|A\daN`g'P)eD/K61cpM5“D7tjt߮/'պO=AUҸIՠ)+DGBDo04R< P0hWfZe#:-iҎ,,{b/\ 2XoX=ra;jhѯ+nN NͺSy0 5gP^ech}yxǑzEď=5恮,z3\jvBʑ&RĶYk ?j2 W2}A qcN n.><^x5phvEI5 Be%rTI9#nV+o@~}|\%u~)V=gR (/{zb ~;٩>ெ6@t@OȢOW]ۺ-y)I.Nڂ{飮PzH s6f's xQmQH&Rs\f?Zs#8v%٣r!a;.-00Eb6ȳ, Zԉbmt}rW e}ǣY~{}k~$I?z Fn:Fט٢h1$+7X͢nA8;EfL'c\|W^|KMs7/?VE-H&ym.u|L}:ІR' }ݭx7 Dya.$FR.IĿ.SOet\sUE} H_zo0QV@㷢HK唺viOOkZ74Px:Y/DNwyAU3o{rڐc;TH:!%y_e662TnČrĊ=w3UZ"?qqEX8Smz 3I4KgJ1i'-iNZ(,]R1K״i:iMf3yؚ~Ғ5͢+44M'):e2,l';K'sfHa{C9%lԃY4rk<gyPp]##KMc].#Z&}Ghze_yyz>WKhqcD AXD IrNS4=J>W|~>phKuɀŘ'o (&JeY(%b.>RB.%5!kTzJX1 .Pr}\Pi3*I?:Ͱ┰swJXRbdCTob9x[xiK}? 86Dxh⽩=wLqKbaC]_R@R(fO/*NwMJZ$~ɩlH9Y5qi|e7[=N?#[5l# 1xQy9}EHPEhKd>x~H*e{LvL}/ WXe-AER¤GD |D^]c %ڏOP"SO8^D蔜0NPچqvJ:^'(N{GND:7^\lqAzOwf& KJ6FBnUJoA)skV9btVQoKc4Yΰ3l;^Y>볌NԲ44mĵm{ʴ Č%v#mf"aܬbnKے-nKے~Œ╣n=X/&zG937W3YČ3oRmcq#ddd_&,GK{o0~po7g0~A@Ə̦3Isz2ӋY?sxxNos2E4ۉ|sZ(mؼ0$ͥzmʫs<l7>Z$}F>V\K;iAGMC #X(d,ڮ^`SM-+n`4m[L񞍼XT1LXʾH{?Az\P/rBJwC V]x^"Tg{YZYE~s(V8gݡןTU=Pb~;Xy3h}vDɥ~`/#v#ڔ ;'bZDCX^1W#eȶwr[㙫0 AJô{܅&ˍgٰNȘ(mvw|Y(G juހzrsJZ IꝬ ÁTSC#{1]\#u#QoL~kyM^n=9Qpj ?b{,{B"YoHKޘˉŕ+$HDyC#lzxo[ -> )@ՄC7"ūsqj uHWڡb[k:2#sn]Gaֈ>ɑl FT7 V<$[lXR$^1ifJ &aܷ6uSXIQ3jRN v|l^+n1ERw5R.:M_ML#hSK&"!_֋>J׳G ̹3|mwT7"[Y17&+L~ Pq{Sl: A7C+z˘:G?O'2?C?Wj =o?9aeYi4=xzB6љ?1Ox?s#5ޏ|~x t.b#M42N.|~`>J5eo,BOor-@:GUo͔}rRFR]'*G~l9hy;"쐀b'd N;BS@؀Q ȿsSc>D?[+S6@\`CG'lG/p̵\kĘV oܮDwХÈxR,rg?*i1FRTKQz兖mp OV5Qz-FxO"k6aZ i ^:;@* ]L7Uĩw θi4_YZ blnwVD(gJFd/3U-|ѓ+DgڿFzB16\y}6#t#O@mf#,6nNI̠P8$]u5NW՞KC&ق<ʟN8l&\;u>;?EIWՍ]Gu>J> YHP(}% z.Ko_A,GL'cRT>[^ԩo޾r]E#fUUpo![2#3s"|hљ ˫o"khϞJˑMGO +5&I ;3p?֒+˼^sjm'p|7~@?cD~i,Jb  {y}B.{A{[ҋ_TɡTw[`0G{P7YϞ.k JGHJFLb7N:]-$Gsw!#^ u]`)|"o5I=ݡO4!~[cيy?Y+ZxL#viW܋Jj;i'-R cd"aᴆGRQĮS(CT#A=N*ʈR)X KKk."aQjOIԻQ7( AT6;h|xD㩒\[K{r0S7Y*-Պϟc<.'WҺTQU=DÝ#{& GXȦ7(]#k8e ϵx|0bˍAȞ퓶!Um3itt@3'UF5e!H8hZw)pJt>yZ˫U34ɫ%d*.IwFGQa{Cd<<1SC>!bb_Ս.刞]ppm3"J<*o9\;|]8?5Gz7BXcj}/8B~G'2ջy?y5ޏ_jW!]K/l3{ར [.}¥ҧ86ƅuRr Kg!NH|FsVֲ lNFٳ̑M͚~HP?IZb&-6Qt#Q:0x\=rPo4{eQAW OZ;O/؂rc+f[t@۠/Pz4 V}܈U3MއWY;gF9(=SQ͜)뤀j,9OjΤ1x>i\ jB(3|WD6XXʆqWtt# j@rA(CR>%vx9^qy0"uD\صfV#~'L+kAT]ʩ3^#WPm4DevxO-^htJ?O]sT(Q<=޻]e^ MRGgXN(nxy(EPݫSؖ4^ .݈FTA > n.}BQ~判^n8f˧~} V>E'u "xF|ı=Go-k4`?z1aBiGC[Uo'X_%dz{+C١wOc1s9^-Ե9xm7GJjS66eOv㳰qw#k!Wtݫۇla<\k~ݩLfյ YZ%1}M%Qi Dn)4OGTz]Xd89~̥( GɬO8ab|(tOVOW?t|M_D ֗P"#8&yOv(E&S*qp"G[;@Ag^$5:4?!Uwm}#M.Dև{N17dxxWB>wNU^=2"&'#(uޖuY܀;t!.m5YL7͙lY!j><.Kuel548~Q*!+ ̥BtevW>sA_sW2gϪESs$ Mа}ގ<9 > v2CcYx&~ivOyOoJS؏h`?ۅɩt_W&kfMTAeƞ#+E U s~ CȀ~>w#Q]Qi fǜpdOɁ:}rTN6g\^cr#3k]F!bňSѻέPF'hS9xDI.Sܓ% ~3ڏ7B "}ވ{(2j@8wd P7BduokzuqklQXߛ%3<சTսgu#Q]Q)Slp?!sWMQ' V wUV = Eۥ,yDLjko{4,v9$z\Uȕ|"Ou~ѻU(S2$&CQ/AXcOz?Df[{F/|I y-#,aC݈Z-jB_(\Q5MkBimO܏l7͊@E:o=ʨ#z@iZ"_:u\yv"={nIDS\~is_y| +vS4}ҟuZC>yL1~K?!6/nVAsf˜ 0onN!HHae": ^ _n68]砾\5`6Tď歿5"O.+Ieo(XimnUWD8wɽX4>wPdZ}/;NԽn8~^nZ*5:ڞW?gTpxbn\!1b'n+ YY.<6п3Ix':WhV\|<.pH<{'16=jv*|$@DFT7=}Xe@6e2#?P)&#a?ӡ]YnXKkKEѷlo/ha\w䉸O:,˘[2*=bo7{7|óm܏@E4 ~^jxm'yҎI:='⍛q'YJ Vㅇ|}]Iq |9>Ō3؍nDuD Vywe~{w-\}-Bs\-ǧWy3բzíjpQ=^T|W;u~6o<-2!G^=mTiN9K(e6BsmXA%o.rDJ:Ŀ7Z_k?Ču\UN3{n|8r#wmʸݗ:ѧn4ֵd0[sZqZ)kґBr}o,wL\rLeE]\zw8X|^ƞfJG~᎞z-GPQDs"\xLӋ7#N8gTqmhs^!({z("!!wkbtǒ Dk<7y0Ƴ3B1o$||4#oc2212u6d<^eάՌ{mĐo!Y>іE8,й,'Oe^Odg'AYI2It oCC4E4Ў <c4)h3.0:=nHY㈎qYu!e$:ƭ 9.n0teG 9qց<&n,}I6DǸAYұŊ[R1=q˔@|@Ro㖃[ &/#~2H 4Q~a 4c5R1IY#8!Kt8'gg4.pv3d߸eYL%d),~D8K@gi y,2ȨqdD{bO 9W,eM|dk)#gd4+o㌓nomG4c/r?is:qW("ŌQtecVc"㶺L!ZCtZ}#E㶎}3.=nўd'f]}@t ={LDtc CSy$q %W| 1n_,_ )Kh7exK|w --91n-fL~ $~zR =n?2y'q6y#CWFuNو1>ec'ᘍ I1},8f&ڵ?k/ߚ뚍~lHYwqLש,l}HYoqLNxze׏lD8 lxYm{8!o#H1 IqLiY Ȑ[hAp̔O|c6rd1msӹg8n˘ll#*⇸f#qĽhkQx~ 0Bzۜ6A{ 1B&^bz;xtl1-BtiQC5DcL}vIw+:.$:ƴdIcCcLKcfCO)yҤcLKw ySXM%XcLOA1,mg|@t?(ZmX1"c=2ȘK6{m &3"1t8osBB,/C*6& o 22Hw,_bG1=M>s$#cMkIʹMtM,'خ06׵dniofa:iŤ񕺖V+,OPTto}6bM'2 Mu-N8\\,@L)BtUfƺdLQ t ҳ6ն243`.28X"@ZJZhZYY4ElZ$(**s@dd5utZ 2PGMρnSfF-)c8 4%k L^6]-CL3Ѵi|u̬uELw4Ѡ^VzVhd Iyд44'kz\+H]vW6G'GTCcm3LW|-q@t4նҴ"R6;Z63дiX^ZEX@^SdVxA>"ɇ0R1Ѵ0RoR-(?Sm31 3lLgiɶV]c˖"JCsKF9E,cF#3)|xK3"ohU!=I0sIvsI2m#*^m 3sr ڴl=3 CCSLk$F00\/Np۳Mgg#p Jmfbގ/6aے &ugaMڄ#yz`Rm3aIcAq-[Hf m*|:,-,--tْmtXS$"ٶmz (Y2R;V~[VI? i]dm򤥚. innlKod.jHx;廊~T:*_i;|7NbSKr򯔤S;B3=21Ef?(`ehG XX XjZIzf&uY M&k)...tKFIMQ[jbT]TBTÛOҫ|es m!Ư7YsV,OMW`F.Myje!t 1kįڂm2zYm33K]k̼9~SUues'-ۛňAtkn"EgbZc5 e7ln:fE^fԦMdfG6\z"J?YKLJ L`m14Qysv=ՓZn΋NSBHsk^f39nIS\̢j)˖EEhy=tm/"]QdZl"yRwޠ=vEGO7+t ID\`>yU Z0Ol5iZks}ͦlf A֨#K+I暆tUc2R=v.`3 /4A}`\MꯤM3Ϭi6-Rm i2>J:ZOW'gFml u6|kji:rk%GFiMhi 2m5ٯt52(n6,W@zցM Hʒn6ApZ)%2#gƶm|zm$%bӦm$ɛd#;lKL t$ Hhn;dH:lgf$~!(^#mWOfʟqӅ,Hہ&+33մCR-[ECMt^3fH6vM=md/IZQ5&3ϕhgZXZh[G$ ֌9&3S[:gCm])qIIɖ*G4K]+f)W\Pe3):p,t-,ɧjǴшͭ9}h."l˜X[Z hf]m+:6$Z zMJa1Mդ@uM [ ls%^BDLN??Gː,$+Cz"VO\ )269J";zZ0bj z51+AzjĘYldhvsϣm٩dZtĐ. Y KޝȴqSST>nG\4Zg:wpZ4RihlH(iT͕`ZNG7p J4Dмl'!=e+5s(8+>^p[$֦t0N;JK6 X 9Gmmi=ض0Z59ѴdŨT }+AF>*L\Фe53HkdskwN[ۨ jj[:L{N]MSR`HqmͳED6]a#A%LѾ 1lӘT`s;1H[6`V(!Uh6j_"RDŧOf)`bHn&+8~<9[[I&I,GkZ1HKC["V2j VZh&9B$I:[:֑7F /Q 4-,EH[ª)l2(g7]`*M[Mm$ c戮0IzMCvPMo320eoz,AQf&d7O>˙IIoicf*)"L"[A[k'-4-LY1#V$k1VFaD9!@sjgo.s/fb&2/hZ[fz[QLmv"!޶͵$k}ێ|XZ6OZ)ajJ }לRZ4#aKk$+%J%9D1'1+"@W` ֌7կ Y:[ 5Z%*Δ!ijfM>*ACMeL6#yIP@ɻemBJh[ [j"idc$2ڑٚkř=S2=-'L a ASYILhi=m;3 @%cMLsltڦ :ҟKl:U;:gצz3Ջq3f GZFU M 䉥4utF# kIj*ɌJ/>5vuOy5g=,f4<ҒݟqF l%icR3+YmoJӅ& ,_iaHa%m=3nU VC%!}eACSo5(ּ06Կ) m6]qa/L ɧL7)ol@6xь6"miz4/;iE&)2kLoMns%#6z_Ҷ3h938 5ڊ7-$; 3 M$7ŘI4=Kӿ+V2yi%G&54ѕV`дpAt #Ž-YuSj*<;u;^d-Y8֢*.D&Ot-ۭ;1&yִif4n|ch2= FZ;_zRXYª35[|-I_ hI֮ۍ}[(#ВX~̼2H~CQ#iяaЋNT5/m c_:DQm٧mY^(>rW"%L%E")TV]E"BQ9Zwp͚/a֚O5g2"2##rP-݂-wfdfddddd&8,%W^['Q>֍re JaP°Szȼ-Wwpl?+Ȥ;7{tv4s%ou^Ul9ŎL_r;`憃> -;{ux&WW8jUm3Xy;j> xMзp ջW͘͢*sJ3:;7/&5yn&ΎW ]bcONW%lZfFÆr'Qԩ( e;0škhMtf|C+j>NLw\tß4.lޱ?WmWڋ&NwF 4W1˺ZX1z+j4XIǓ~eV?0|~9-!*fͫoJrbXmTϑ]OJʙU`mEjiЀ!OӣρI_xq3'ü=8Pozr } U@ӥB@Tc+`&jdj@X2[̟:#,ښM5lL Ʊ~ws' ZD$ /G77]_<i0@/d8;Lg R]ۂ YkVV67+]aŊ۝ j) 0٫""R:w5l.iK.lj;M{v:ȃN*u17Ş:Fb*焑d1'167AiJV{P-9.)TJKW+ (F:ћ&Inn6DqFfY?t'] boSH&<3b8RL)Tt^mZh+BZ`Z+^PF+{bՕd:ȓ~b*.J~J،wvwfPDhoe囘< $u{|z;k*UAмACE`)PLfKY }xJk2FP!X~/hIȁXOh[&I\P'91vwDej]C?{+Jw H׻3gӷ5Wg[IbNi{YYMkrB9x{ƔYxY 6*Q1`H] #aBLA\><'r[ ^EIPٿNEfw9ȕ]OF>~`wQ4P j>d` ܫ0l ǔnu>4>\/ٍ>~ۄi |/.z?r$q/@AX 9Hu/Qn1(5c#N/6w(lh )!Ĕ3'$:xSI,s;@jyMskjT[uXcDU7"\XfVF!rnø`ۉvǪ+9ѽZ9k~W C81&v>繇 fU*Yo22oZhL[^䃃.X18pf牄6Q6˂T2PS33cauU ap|Cv%~!Vf݌wĚ-F푏8ǰ塴M$6Y*[x(90 v&Cj9Ah:TkSI_y2A^ ù|M"vke>ˡU.Iڧ eX~GtErdڟ|$=VkbOi+ӛ5x2n?NVXbLq0'VGvt:.EEc|X-#ya~N)؎t{!v69Ⱥi; 'S TEk6⼬ƒVB)<(`  'ӯ[`zR楾t@ɛa{dͲZ|a]HloQ 0ͫLvခvXqr?_:{aSccq? > W3@Nx5= D:ʩ Lwҡ2Ao=Jf66K(iG3EOx&+1# ?Wk8wU,pw^lwA '`>؝\lMwEpW d}ITtRxTtZO9EWZ:B᱊O~)T=K)gA/AV|)er%f~H)Ѹe 4<2wx(sRά;y~eue~%>v@& 9 xȍnSb07bPnȼg\?WFoXBfkhV׌hkj7VK>$o"}DCﲄd6@LP$5RBC<Ϡ@9ĔRz;9ǴcT|U:Tm ]e?ғI39Dʺ [10?]y}OΥ>_x&/ˣד\qX8JP:)}X[4B4[*At0Z:;nA3%?x|ݼY#!b΅>LjF!au|B͘S T+*-'-*/a(&^.#g)DҍM7oq{C((o0Vk!Ԗxr`&T2؂G̢G WZqIeżv(Z C;?Q@ׂR BƪmOБ,@I[E6TFUdC]@Z%l$⤢]1d 2biju,v@JL0GY[8}Z&\*tR Pq/b#WR'`ERz膒 ߰3Ma߈|!v&fwiTjx7fM{8 1T׼]\ų3aȫ=4@>xPɽ{k p"Kn܎G]+ѐ,{0xXh̲ ϸ_jm)qmQ2_ g _B֬nb+&xڂ 0=6ERnI/" wWX@(,IJar^*|l"bfIߓ0Ր\KT5wD)rik@u{q hZii gi$B¡uí7zne ^5_^ogގHNpϰ$&xI_(KDe+. $Kr^ }:6/^rE˲s6 8մ[6(p,PPޒdsZq Sߖ݁6Nu7ɓ2euD`onTonRSZp>%"m# {J- fDv߈j-X^BI]wDg=GGlH92;^ hKHscA0vCԍБ<m0!qD_<@!0цGcP͆xixaPJ]D1DQstAhA=[%._3u3'UX(1rqr ̆#-s.7,Qnw''.ÿeܫhPr/(l~_J}ReP)/RVT aFfNu's'M!,7Kp;|(uYf;vNPbS|OB!ŎS&ҚXM؞O/+v".X3d֜qvw.a5S4WųCs6 p3}a]C΁Xk? !EvٚAsvWd]Te =n0v37j@}@Bw;@Mإ2/#D.;#<075.  HhI`N sAZxZY&ln/ܦfxŖ^yi@ޅ"Ym}%+f m5/q`HTZ S^;ۄ"̄ɗ)zK *>|hƣ!o'V=k,ѳ':]yk >PЫPh.{|Y[|} r 2keo6_{Y|Fʬ/,RRNLhϒ@]J3zY똝9HRzךL9B]q:d e"k g "b.F@l;{WnHP@ H̞V;NwwPŲn~"@$3볤7| ׇ]cdXAvRT[G7mWmYUꪀ4""p?0dc?)Eeb'w}NZ,p y啢'_ +>fs؍S*΁0{<- 6+<R"^}`J 09MMzu&=6M]7濉g;0=6uUG7vgwvU\Yit飴t{A8jQ:pI5ꮉaWѳ u?=/|EB]5W]H\^PV܏Uu5*U +)i=?(Vqvc/U+n0./EqbUil&U< +:u[m*Nb}nTXq'U܋BIF*>.Vt Lyb'%gcu˺+.ۊŅb-]qGˉ (N)dcQo@1:gn /e b XݣA.Ml3>sv50[' E)E VYYC"ȱզm SFH|/ =81O)ΔCy.Ns[Q,uQl7*$ )tVYggO5 B`,HkK.{DTRfyG BmEdhϧ*\9 C@H[STS0-Y/?ȟz\]Ie8CVD9_>k;>|DPzkQgaaA M֜K7l3*mU]h}9qq)r8`te VsF9V30Wv5!pRSi[4Q$ӴNZ: 'edv%Q;>Nʼ6 M;[E;˱oeE6ڢQ?L Z֞l%ߒ3R fe;fI\I6n*.YWb]}Dn ,?1_lb߅'.o/$D4I0f&aWeLkQg, f3 g!dپiһ]]쌢[h@HoZV-ڶ*>pNrV-Qb0ֿ{$wނP22c͋|L`qaH bR[?%)zi7ʺWQEgŠFy+Z.xwu(lQ|vhE^o(مPrW/-WHE+~J8$"#4d\[wŸMquxAGo}Lߟ^OoEOL߅KK~C01^kq 8Xӆx /~5+8Ln>/^uő'p3EňG(Yh0$9ΟEK?`7T VyEϸv 7؛Sj^mfb6,4|6Z>P^ 'BNX29TmQUE o #_5LL;5d fRKV: Zm% 2x(I}u=:vnH}rz2̬^ZC+R7̘l i~5 nyٔ.|rUFk(6^om]OU sShf NXxrvt;x{R A괊6 Y ͛Q.>Cţ)v cm-^*0?K ]^wM2D ->S=a*9$)>{,(.`^5agd9V8(2)FkZmu>Qm:kKo%ʭkZh` wA_*:$X|!÷,dú (M4b*qoJx !j|+LJ'f4do>g.l1d0Mvw-StXt]nZrG þץɻ4[;R?P\* A?߰-ՠm1⮥_]H O}lţбd8u5Oߟhh;}K H)B\p=,X'u<4K4ߥV0%osUREDBˀ9HU@!c>}~Ώńv -;#6J?y=g|A*,[u5 [ysKOH;^)RX& u*ZL#0fYW"/s]#X'H}{ h;Qt(n l!u;'C:} 3fn+"RP#2dr,$3")=V)9!^t[|V~z3Lj8IXy4T?u#"y @w /-Zy2 Irg\{W%#ؗa'w%OXw3guG vت011 kW; |vXVڸ8+'t^+:o[z3%@8ٯc(6lK|2J䜨IOtH"@ WՋyB0cH`.g`+ :]obGuo <Ǩae\YV/6NPn5*0{0i%It:avd]XM)`\. HdFMXH:V)7ɶ5'rt{'~5|'F-v|l[0ߜqK (2 sYpLE1GPGzry񓂉j51oJ. FiHV]K$mɵ-"oQ}:#=Mzk}_ %ٶkPyQfO\5(3j+{ի}c&WX@n9ϴ{6ȱXB?vaΝ0E*.ڗI>/ |zl##i` kaxU4uF\G2.8i.aPSg1LeGv`'4*a&''~Ѓj0^wRV2%*w[&].C)íD3E|0;|he(%zw+tIv&̻96SX ݅ՐPAO#zuJˏ0O`K G` o*a$u-4g/zb;$i+lIRn98z.棲BQ4x~C̥Ey&J p3vɃX]nKUL=@g~V* N0>Ҳ|_T!M;A V݀xVɰ@q3,3ٖވRa۪0(RZ@Cmٮ=QHZ9 :D"gNCXUT)tVbEI0ʋ(H: V5t1ۜE$ы[>SH0 TlJr a5_szgeO NOkN<-Z:I[ϚBYScLۉS&99ˊHvH[h]'&ُ hߴ&GE9LGZpлuO!=d|{dԒ*ZYAD@sg5CK3$+c4ZBߵҙ2Qͧ vm|W,dGt[]X: ;ټB|L}<87VnЎG ӄ %&;y;&Gnp;S"ܰwWaԔpfnȉ~7oͼ6PMyim׶ @?̨P'Uji# Za-~ťj%opMzZ}t)ZO꠳&+v!al5Jwn+p*)@ry5eۯewVር[`dp:d݃3\fōq#HB.}cXc'ݼ:&Hk[ümG_'킯SUE]ۦaV C19wK(F bCCou޽tɍ*_LWt MN1[Z0Ca%X-|?QRhg> _E=;Je Z$d]D! f#쳔,eQJ,F[H?–߶2h;@Ϻ|KErm dž|z!:4*ZP<3wUfVe 57kJw/:D^$8yφB'9RReP:L[MmDs6  %& B3N,89|ZgByVSGC"[ cnv tV%o(%p~H}Izωie&YX xǗOXm8gE*J8rTg ^ZpB11+`VԺtZYykJ=L-_I+4^k]}!meXtwn;%8ЪU{d#>Ӥ6bL};ז$L7<ޜ=gSnj_c'Dr燗X =:;VemJ#3Ok/Ԕ8ț;ѩv`b)խҦ8EtI}53ABdҝYe4iZ|A_Ty,ԾwW噣8قvJ6݂+--EMVz۬Ɗn= RWd}Քg!+~) Cs6ϼt-,;q!:C^__STFyXUouꠝce EmVm zIy1W#0ݬWy]ޖg ^~ybPty{_MW.]bϽzov"/'/fsLdH:NI?B+X,৪_>:Hhocwok}'b C%XJ62TTwp6Zdߢ b#*3Sq$T[#NGdW;gvAm&-Qۃ+ TxP%XL:alfTE41EÃbp#l"[kvuhJ7 dPi+zuxA>L?lշiTO &?iah|-? s6@Si#^L߯6uxyܰ/ JSvaΡ9ҭ~w?4j?l5dxk+kk`K#2B|Sro ӃA,(j'19Zs9 `a ~$7ВN!SZ(:r|Wv>h=C]#~[cke_/;z&jwG6|IZ`Kak$]D(iZk̒A,dpG//b;R3-z.=LwIn Sx4kϬ;3b *Mɢ!Vb:/3K߂"!IBR:TF|aPi\LKhnL?.ZPz]xg 9/ƠMEMSS~zOq? ,'Z1ʃƒ{7нĚXrCКfi(ZGX&RjsŐnw`ʓM D뱶ot(0m:rP)CldHpތi Vm^H60N:vdC`q3w6M}!c}Ҩafy_K$)r^ gCਹʍӫĿ' /lV8>M,ecӇB ll^$V:FYVtN$ .:^pm:,?˜y=qplcrR9,RA n)gybð7=Tx:[TeuJ%EyRj»>oxDh<;J$,1ͩ/pJX:flTnjja3TMk|$ER]/ٙ /{. bεǭ>D=Zru5N2>̶:E5*I*\v([Ao8[ފױ*؈CO%Qh8bG+"ڛmJr ENgh' gi%l#{+6W5^j;{y^S@J+BGhs tic+V#4JIVbx>)|ߤ%m},硠jSZ$gD 5ޘ~|%c+qt֏i\jGe^i5z|ڹb(oK,{\GMPL`g,B@C-LX[A%,Z6x9f}Zz/eAWo?).3> 1܂Dˏtre'ȉWUtky>8{;nSa q@fL@ w꧃i[R4Z㭩-sxCDqZa"!YaAW%p!*yN>sOƞI<@'w,̏gҀ3B*Y݊ی[Q]Ywz܅~r-4=﨧0|آP]p!.A_m- ĺJ9]MMa-IyߠrlhLD"щb΍l:G`ף-Fet"Gz-NҲ Pm»81jc\+J3haʘeM3(WK`wk/n] ? :[];>9 웡uٖ+iK'qڧ)T`#L[x醰0=ݝ+kHϟ \\nF(25pw@Xi"BF9F u^kkf"T-+'/Z"k^g i aܗƷ*Df,_Mp^5Mv~TtXCha!{O=rO|!Th^/?#: [B> @<>ˋ7]M_pS)ޡ@ ىU' 9p ; \`C~%pTbO6S} u Y=kII2|gWF-K :"(L!~)[8To0:hhGBsгPdu@V>:o()jhPp=&'~k1oҡ˖{U[L(&'5\e`F*:lRtu] J FOgl+1+gFK ,JVGZ;G?pY5VՆ8;RUiBSr̰9%FuiSJ86D>Ph_c-nl<<$1gɁ0@;AbV1tO<ͳ]`j*N1ʊL# &\j>=0wiOj 0 U2{Іw(ݰߔS:J$vsmIu9xK"wD iJ 5s)2 FZE`t)4( gjᄩA98;yNwzPyܰ|~BȚYQZՐ'F="wb|mV$$+#ɴtXz6hމmuOVH2r%rVb92;OHQ"§;t}`)` q1\b?Ϲdz5&|>lb.U|2yzz OWgEnlA(@#,?==PGsбcx)&y;z!t)`P-(Α->"|ʙok6`h[Q0L};n{i<מѝΚy@ fPHhV. gגh{Яw.d?0Ʋtkpv:C1io|qzxnn%d&7>#;lN!4:/`7n|u5H?9([1Zxy*9?58~O*@r~f>, WAtbVNFyeaþYJ/wvL;Ku6_zpN=uԵ0bnoMzl WZ-d$d<a.ӎ؄5HZŖ\$łAuQ$(6k[Uf0:U4[/ޡhCVк}tF; = G!>+AGfy' !W \c>F,V$͹֊.?Ż 'ՋD$Hk/WIX@1;~I&,ˆ I([VƝeݰ6o Q*k||tsW}4a1uO瑵kQvlf/ճrj73̚m&:ݽj4y_|)TlǺ xIfw]}iߏOORzga01PHyAnNe2)%e WI.2Q.No[hC"ق/@A*M:hrkA58(VlDw-:lr=k i08>^sNz9H%7a+T_ӣ!E 60nDҰT+~J IeG4!UD춧H .D)(KGJJz]BmnKzS%C-)엲dHeGԗ [IvbdWL'ᐵ?jj魐LoňU}dzdzk92u<24ZLo=ZLo=?,D,AqۡhF&KSk?'.#(M"~=)) `柱eI#E e@ĊEepohc t;1yLys9yxϛKϛOxl0[qS xM<&ʋ{Ŋ޾n5V(!',\޾y|!8J1OE nca $a.ۈբpVtU(  RgԥM#$VomnIfHiQOR!џC U<ڽ^k3O6~TW|+B-Zd0c!pڝ$Հj<6ch=$G?0m6P>qOx1,ڽh; {qL/3]@}P`DW ƆK.5$*v^颠`v !I+J+f|07٤'n3VtI}ABm}<Ɖ}PdoCS{vY^>=>\(lV#1/]˜l.ր:h yH,q3em`Lս6T 2h苃x07]E0%%b+oCGU3UX+<d^ek #= =v?p+nQ%5<>;cꌬZDqDBf2-cO}IU 㻹0.tayv̼'`Qm[S:G!PܣnpF1QtG-]5sQ,FJP)38cX>b]oPC0 7! G3{-;o^"<0\7P![f_a,[/Moo30~a,}1~Ab_=2HB\9cXFG; ؓnobXJĊB-Vgn{]3kjVv̟ͯ眼19r UڼjWLH)Nou򝖑M>͛HSYIf~;D,M\%}~li N9(:2be BUrDf3WVc|h:X|̖<%?L#[g]9R(]۰G9G'NMB0=C$<{wa>W(Oޱy&*p~65n_dE`x&6,GfJ? }ϨA5gӪI;@CFD|z:1?3|p[Z͔{ýzW:DeY?ţT;86S,&pNn]iL`uf>Oj=Tf#A8ᾍkqgWFS O" 124h?tbG NǂTTrPWlu D#,%^XԳ6:*!S[ +!˚ՙdTI*d9MFB ҺXRmW!ۂ*V?Y- $T|zGZ6nlщQJ5v*i!;ZX YɘzWA<+*!ÿY o9Sj=!16ePOC(@?J]MK, c٢vPΥZʠ*ęS2J.̺''O{nw+s_ g(LPA+P'RqAieطp* #߈=!bpp*R3v0slgE~v. ڭzVAz74 |E#%K8Oa>) ŮPIqءTF?s=r$3Ɩnd}~xtCH%Hoo6^8ߒ϶"̶_%>٢z1 b'2bWr*bp#⺪'vT="+ Jr#J)&cJ**b,JjyL1c,e{CU}T؃YyEf>RV9߀Ak禵yX]^%Bjԋ['v,@P&@҂3SƒA bg2~F/q=O >ΟPZC& Dw9y ʔ(=HAQ'Ce:Up<%: /u^DA@5i ~9!)ȭ"DEcu{Figʸ8'R%”%(Y(Dݻ2891"Nu~A@5`fmɄf.ob5#Bp7}"ʛ>q(sآ~!Nf $ۧR]ƙ)[ ZGŊyBY ³*U$V\QXO׆./tkl3]KCRo)mp*xmt)j4CjAw3uut J_&']&@H݆둀pog5d7Jcz'}Z B[7c Nڹ#XP4гZ=[H[t }a5:Dn]*)%B«+6mڰ@:\.6s&n~[BUTmz2jKB)ʘZf c84kYjfÑl9(Up'a2ΑA;Pmi#}+BR3:Jpia8UOT[ɩ)I K;Ct Aw?*/p}rm YhT%R7ۑtQwWh\xpDN+# ڏ:VK[w7Mjv ԑ9?TJp%(bjj^m%# xVfK-ma#a?A2 9n~ǥDh# f@RR[Y[3[]/H=[Qb>'aƈL0TAs%2H)eJ!KDibBvEN3Lg\?ȮOh&|mw-fUF_s-ɧm5Ot+Rdt@f*L\HO{:`Rvv3p*bTp ( lHd;LM%L\S' 1\4Cs7[}{O  O`t!Py|}nAY6b@/FFijPJVc.LN-H8q5J6 [`% LfW}oFBQQZjn-b]`!7œ|-2\YQF_4GQn> P׬cUKSA(p=IRU? y3ܐO{[<̻' ;Zܐ=i9f.NNT$K7<%Ϊ`g95)q^-NsO-+R]1[0¡.c٭u#:YI >1(.b(^ -=AY: :}u5"h<V>#oIڡ\Ft O0? ޾֠Ӆ!It#[pkO'ĝ>d0' " r qJKTN1TbnFQ"܎!7$>g|5.^D$PyW@'B13nrL/c'5_ 7W&_ w!N(n*D7UdY0 B`GzMo;R  9E0,#q9])eWˑcI̓JuW׭p{j[ ۣinbסq>y޴4Hp<@-w\13h*!ZE@K"$` ckcΚYamBnxEݻhFNYV~1B%vtR'ABHB?1lp{^lR=Z"TH|P^R<)> `MsD=TWRMN5cq$Vba6ʀmcϷB?L+~Y`[O v# r!ڙC2UAgrYYP̡zcʞ|@Ih(5* ,J\v xW>/ĉkʎmLyrgohлFR7RՕ_xp:?:uy\?8Ûe u%Md^3St5}A ^ȑPWC Qhf*Q& 8TMEJeLD\wզ%7sx"e#6xQ]xY,W5- ;l7GKh2-[&uR0mۆz•GjVe@-Y14 vT&P0t},3x;_TF][Zr:\dJEʿZ\洼G9mHW)E̝SX]kA~^ie|}wQp t}^20K_k^h%wwd3)"lT@&/8b!gEn#sC)@ b gG!USfOgCG٣t-g宇Q@AP`xI溑;u$ML vKjk+KG1_= z2`OzÈљQ(ҏY[ng7K2 Uڭ/mBPxݾX Q86{vf ԗ9Gp=G@4DjE_h oo4= {G@{T8'x";,zCx`@3`ف=jzBF{t=S- }eȻRlx4\'A {xP75SKA=DA #L#)?ԓ?54|Ҕ,X!Sevvɚ_dl#+oR5;ն fkujJ!=7OoR01H6JBnVٺqREZpB˯n+ɁWlt@ȧĺxkOdAbRjIÉ?x)V6N=ڠ?ɫS1RC_vë8&HƴTEi*ӒmtK/¤$pFC@f?;/k]Y\.mFU5GK:;i3_H3ZUa(no RտKR(A|siauQۚQuL_o剴c],֟3hҔ}# 1 _Ddk׺~5\H#* 0^;?RQߐ@" /.ݜ<$Ya.92%N 1.8^@0L -JPz*E6_o_j Wvr%nbp=1V:5p;[[|/WTÛamw="C_<\Va1#{C?I֡Dqf%Ldsq Ԍe MC mGeb%{aj`.j]:uYIYhsuW՚ :>KKbYXކӹ00BMQf`βzJU•c{'x,RYe6q, #O+Gͷ(MWni<FzԚ>@Z_!p:ڟG%+I"垷%`1aH_rg]g4qK! CC"HVߍ5%D]hJ[wn+AUaꞸhq;rXwŗ9r׹Vs*x\QY綎-*}q& '^HP*k?c~c5D1.tfgyc'f #Si 2yyShg яFB< ;a`ԇu@R`Eۢ溭kr̰׹k'mw`1iFjl)gؕKЕR <^_NJ=(Gxu%*a}GWWRQ#lliתE[YʡѴ2FӹQpHJ$܊WqZ1Fyϙ\qGɲWx?R, ^~1Q/́ zP;WT3kܔvس2gF0|1rktGFjY,t 4h+]D"(A R2֑|}fŒc TNPLʝ30B*\??Shx(pn]#5,l݈£ʁ>JH^cNmٔ9k6vEn5.!hM~ '$/~Wx8bR]7=~qww&ۙg5'}@uS7I廭>,Yle1F j>=ޥxTm 6ܔQmi]rbZ)xx 'NJmK݋x51^ט%vZGNQ7Vq Yy02QrtJشvVR¾ lmkzĵ"Sfc8S WA[D0%j֗ aPkG;n/Ck?'#QjhV[b.aOc>`aaMo0A̋{sP2Yď{#&Uc?/?b(Ow#*_"B $NY9dS7sYFi~|+>l8\ْlJh\Ejz^NAR>cQ8>PzJYbryEwr 5DF5i~a{p^b[FәFͺ~6lF5E[O`M`~lg֠@=j$$㑘r (4|ب $+\ނZ7z:u ˧Ύ>0+H[wMF^틈jb p'b.SU`79Ic5# Vmay{Q8n\2h{0H(!jrpa27H$~TE" cN9O?#\|m ?=|ڋ2=)w?R+aY[<_rQP0<N~f;Bn}oxF942Fӗ̚Ņ%[8xY@zkf5!AD%C9]8Bj~'ښ\Kȃ,sGທe"Cc7BP!.3Y(h\]y ` ^ש }"գ*ʮ'y|PiDd=q7z>X{( \e^E])  +e}Xo|0ٟܦ*T aAQr >j}=Na}#;kdI|@W| OcYw@?T$V;[_gpe%,e+"F\MyDfX+%<O@(D \v \b^& 6Aw2p=*];rBj~*۰, A_+5R"0ql6gZ s[n s)[?1*,l19`xlt&%ah7c#J:fgHpR -:D*SrF|oG\kEC[\ecNND27CY:)z8:+0B?G [˳3X)qm8`Ή6AWebM"^T$u4R7VV(lSQ#TaiEG=G^0)~^ﺒ,3UdA1(Ǭ+3] <J$($Jjpef_Z.tlʓPVwu1vO4uu$M,H3J[_L&1!u>s O&>!:偊6X܀Yw絰΂}Є?j Շ^Gn0;R~uwuW>(/󟓪Z//焱OQKw*ꬩHA*@1NTEe$mp B=D} 7#ׂ+ lB ,N7 a%|`Bmvr<`1_ђW_U~t t㮏I/2ʬoJ|hl49hLޓ3xK@`Y$Ng#)@_):--T=o2 lpyF:܋x CeK|,5/hzx1;z߆oG(X3%1\|J| !Mͬ"+Ɠ숾YqTӒGZ]o uhFk`LGI;f\hnƫ{2۰7*s XGcR}㻦KP9Տ$/C*WFQ*ƨ\Qwx~v7w= cG3)ovvvѹggs7zZkP%k:Vύ lSvt^[3oSۍ8E)-UK_CL`!]zjfsSoxKa_fʓ곃/gCsni2>;쯅JSƚ!+k #7b~@XTFŊU~ '.M w~MuS 2k&a SiՃ&q.[[_`#]Vդ)v=uf_~=Ӏoa=JMSi'atxDT[bz)+@T\dz4QLI-?5ؠ5@j! nO,4<F%-  L\I{l^-x_b;Ώ*+jum _w٠Fh]oNs&\A,V+iQeiׇz^*5Բ+^ILU "fx8ܺ]KN'\v_:r",(MJ*}T漌{n2҉,жk8ow!ȜOnPyO{GbFF{T$XOӧц/ X+S諊Ĝpta'_A_UEp:3"S4ouN|5Np8 5d_DРYa4d `U2xkomV(ڒlGL \'W/̟91Z2 kw m&qn/0צ,0Bn H7h.ٟNrD渘$X2)Oz-: 0gT, 7E|s$4ԛg͆JQ|oqW5Jg+=_ 8sV~^NIO':I.$VNUܙj. }=;Ϟѳg uԛٕ&4QK -j,xm e0mU~BG~`5/ǭHGldȟdOo> ɘ@`yOg̫\\Ү-z_نvDTDKy}oJզ :k$@&/?_r_9+=8O1wSo-%,;#g*+z}tT5g[Qtx%Dɾ8;eXp1ꌥgxw/dIÝ *c$D8Vݲ>?%Y4B7|iַV j/sE[U;Ls5x6=NIiпO`|U% $tjXU|NC G*o $ wǭTf Hbxm,D4uF֣ݑ;f8W@{$SY3 h G}vѣ+2 C%h ꑇ x6>& 5vٱ+#Jɀ /?\u‰إ]d} GBڋߡOwhMLnd[×xFkeF]ru$ۍ`] ”ː#-§4qXGouܥ5!"`* \c >nV0 e{BΏVBQGqP޴{/̃'0g%Qt|V;)nIE G5ɼ|COn0*mܷ#tB/'8nYjȨ%Bkq5\„sɔAhe8ͥZ6'􁢼mCU,G994SW o{&W1~~k@o2xe)&W䷸SCԲ0/s0p6i= KHkvj_ "8Qmo$ZRkU8b֝TNl {;$P 9Z=Z0Yj9e0Ik$7#[[]huKBAț֓F73]A.51'nm]`:x ļ|Sf$dsk(ѹ ]л$[]G6,gg6Y𿵋55{Awƕr< Ρvs:i?n/Nj4yk,'AR(M(IET@/EGfkq-3c` {wY O1faX />ƦEh)voK޽p~wb#웇mGX:c jH ,cX5nm3Nk慕&vc8h\j2Mi`z W Cx]B&!d5^[E٢!&+2_g*):,9Gq93 #ZҭcG'u5l:u/+l4Z ZJee\qOab|I &D,tXo˝" O]{TЂnL_#NN{L*%AѢɲJ re]'IyD,m hr v0J0&6s(,k̠y/gP d}@'Sۣ>t&!຺j299a~:ZF,@e\~cA[8xQ`Ix+HsDZ2B J`&~mwyYj/_N0X |Y=ݤݢ2cDF=DCߨ.1wCr1GoLGJxN͐jV~T-89a9B=죞LIu[ |BQ;\Jb̲Ka׮vҬd` OR]bUw>q0E-+ GM"s/85ɚy$ }ߙcH?<ͫoTuBp uEM(a!5)o[/Yך5bƁ+Nԯ景*ns'i<Xt4WTۢzz^FI=t5;k^EP=Gˢb$".J\7 tc h8b ҫu}[6^ѯˈh-idž5ȪDê14=>as4; Qrt=:6DcZxy&I.*c+M9\+eC|;* ^"NT>u @'P 榴h_u*(|[WZdJ\MlOx+ЂwIcJxE>jKy|XI'T0xKsxMWdoA0JߥhO'R_1V$jt1:Rު\a1& vm!2t XT6rd1O.+*7!~l/qQW(=MYn>xSnQr_]U9xNi:kp|E644'}n_ewp ^_e4k"$*>B&p"dOBLD)N 8Ĕ9>>` N`+u% nm;o{/CC?+",9z?'`B6X%>Cw ?Sl~ozK$B\n3[bXr2re"Gz%8rqlZC܈%Fm]_󻓅,_Q䇍a;TPz/$fa~E_d{GnOQ J ehOU 4&hIo!yFߗ;3%YM׮SnvfQLAi9u]Df?CLTzWo݀E C3 OH9*[rf`zm~H :0E"W-PnjR+.YRt{z5ٕz!LnlJL#ow4<{3~uDE6KNK_>P{U*ͧ0vwj/ Fƞg!lfd2Njxq1!y(G?e8a[&#mDgьs{pƵzyN,3&&p>vQ-yH\ 6f72liPJD 9]%rx"kH+d\'|i(&pirƕ:#< >< 6j5WO׌]3d.)0:9.j.d5D~YrIZg+ɤxz8裏gɥIXf1}ʁG f˼ﭼc+I'M[kp\I| ,??cz2i#p=c)hq} Ӫ/[J',V$e-LC*Cd3؋zvo0 3B~Ϝ96qaWmiwK>Nxҗi?q٠>qA5CQ<5`aέkBn6p`)ĈdD4gzg yB3S*ՈDIr%Cd瘝MYHL|TΘgj` j,:W_fĊUt|I'^-V~%I=ܜݷQ&^Gw6(MM':ex\[HQ˿㷮a *Xl9T $2-X4(n1K)pTqIbv|I*k T`P)3)!LxpTŁ9ɝ24,9FP\L6'@H=׆4-*uvAM1 XiG5/ Ǭ'\$,K;̜4 =U(eVYykM&WR ID 5OZΎQtZ> Zo {ǻBjFp@L2B Czx s]й}LrFtĭ : جVq (sZ+d]&xUۦٸ y{f uz:)? aP%|RV8zO5A& ߆62՝{AzVjDW%^f/-7EԅL4]0l#a/ZyQCR#dhXVmE DpQC( Vis@DŽL*=g9(]*_E6E7&\-Ӄ|wt9H }~O,4).ث/ٲc!ՐWTMkp!uЮkHsی_ʦ͔U2Uc,#S\L=^ ,xL`\%L8  6\'̾@ڄ!R: _xO 0H/)Љ>btݪO,`^Bcu -pu^46Vǖe(I`*v/7f%'Җ@O(QrnW71 !^8i_A# mݡV 2.GEaޜbX1C$cTiMl@2!a JaD: ƵTlלS4KrsQŖp8%N_7PCo[lY3E93 5Z` Fɉ &&r3?kHV }yRo 0|l&Pd u YS3^՗1N+"YE!Z'菉r1eOd@9k&\?9Ďù=ǀ/E$O0~O趦jVL{ 8JKg@B;J3ݮCugAܰKogl%Hg`|@wF=s] ̅ 3!]k\:Nk7#8 OXд cPI@Ts~^lZ%PG!ն)NlEZ] jt D3yDWRs-/%꠩/R)*h3j1 ߹喣!tL䢊9,+Կm&NyM֟YYQ(S;$YߛS)ak!2PVpds)P&=gY Hr1/K7OT0tpK$"ܧF>N;ڛď:@!;=\EFv"ԕ^@oS*mI99jpʨ_c讬/ש"%⣎0 p4˲.Ⱥ) j5jWѵ"|w(yK>ij,2݆ ]-LUJDJsp(aY)ϣss-ƼRTZLϊ2QgR-k5o!S2]̂b雲Eyz (զWAb%#RS(<yA4zW@IKB2H`0I'lmU(Z[9YV!d q;jjĖ*ıSi*jd֔ 9[ SDAJKrLhzW|>b!t$u&iGMݔ 5> _h8%%Q?Ki9"ƠTpNW2ܥEFk \[MIn yly$x.$ nVͩ^c֣oJtB9͌cN$K!Ĥ-7q0rKlF巚H>Con B*u٪]A'q vKqu/4{=-j^EG(ˆ`*ܕȞ!18ieJHNIA+xuSF!T`DMJ 4*5m;)e{u.cFYofzs \hղ;kuj H&oľ=ۄCKE'^+<6)R5DfWq×QZߺ˪/9.t\F4V/ %O\X5A˫kJ-斾|J'<®(PBPm$bqs5%G wGf-w|]ܒe,JVZp%_JRdܨXct`qşb4Ytb$J|XWZDXqtyn8ND/l3Z|$2iaġ⸼jO5eNA؂c%kC&~?M9? }| f|Hb{qp#Y|$ë0µse죷Pv2ɨxC(BIyP,F'>P!92rEL֬b9YӋ%$ŠnX`kظ .ڶh;Iװ 2zxu7܅1hr%a|{lʹF-UQPd~:S/h5m@v"wūO{ٺ07nXFu`u $ P{c(RЕ*3NUN19[;#;:1jb֮$T;Ww7ktj=8IV jbD>}irv3:a"Ou_˘ʏi= rqj2RYe Z x`̒Hy\Ƿ^'w;u1f ЦdA=(bi]GY[FĐ64mx#"Ng7y/QIU$d 8wP7 0) fj3p"y|p}EB\NH7x.! Qi,M39lX.cgX\ys#  ԠhmeAkJ5KDu5t;gŝ6 )K M\j I!"!Q-5pDSlLe(B:u*i$5Qm M ]g]\赃(ǮAK0:W:2bP vy<{5Κ.bzM YXdȯ.c2C4% +;ޡA8(!gG(tdgo2o" mYTiqe5;WSިTydH=17kAk!mGÇ^q@ڜDQaVv]V;[ckU`H)uϜ5b=ЦENx,+5/UeF9@ax-Llm;^A@`֬;.2kS>+mQWW?s`x#|v$T$\ɭtݭrW6$nA3wU#&P]ObE6Qb/5Yw[ +r@SYAA+O/?MeN D=߇-ϝ`%|4YTޓ=hi1JQ&PdQ~ vupR^mzꛏQI^^ff4YWK͚c.Y#9S儑UPWmm8ljKE|V@0w(9U0t_CBzr -QrCvV*swj}H ϘQsAgpM#6+ߕxܑaBLD7 2VᴉxNZFs]oP^|jPl_cox[|yk59)ě ރ+J6IgYnNmao{t)L2$9),DuGV_~wk|pV~0P w;΄$ƻNzhAUZ;R A׈Kq+s锅j3a _ٱ@bGnx[䥕Ħ |< =9Gf'ȴ0a9!r'kۆvGk<5A+j>D|tY@EwvA&klM$ǚV;5\d#JEY(wwo'bl$@7k2j0#ј"GiL\{Wփ!3pzF83Le~Ɨl rEP(Ds*=l:%i!k az/©qﺦ#fR}3nGAJ"[qk(衞vP}bt}VP1Npk:]&sme{!#C ⢡2{z!~6]# 厤5)$`ЇZ\k j||5/9?UWad c23PI%-5 8Kz]B9X5oSцfFy5Dʋmb9Ə8wr49/)&>q>_aJ[3`q)IP6ʙA|I.^KZ%Z$"9,1NsULPlN^gR6jTBN.@&qX bzBr`P3=߯H`N|ď3-֑$(O+sMۻsC>Tu>YÎ fqlpޮ!ΝÚ{W^= e|lN-؜#RyM CJpZA5,1u`s+_9ƇM@zB|i)6 \:-2y1D"~Rn}!EAGe5=&K :H![2x( o־|+rw&ڄhm w~I&N;/E6F#"9;F#uqI^,B_/!BIvbL%ր$57#]HxS) 'w[Ƙ&̧&*] j(㡔vE#s{H`XXjX! NjBf F2khښf6]{Ь }$ٱIlt^Z0v f߷y6rc2:J[n긷J%|z CY}T#"qK./9<2.B7l-R~ik[ꦴ!npbi@l̦ACcĽ5.^hF q-M$աȍ.xp4晏[ΓH`ds ,X_1*[<1]?S PPYCȞϾM|ĸ)J{=,uI.Ōgu}@#-z23Y Ԓa%AЀL)/X [\y l]C%h4NoZiSZ eV8ނ$P-oWJ %5sKے-y"} MD K G %t&^xi<]~\`A./{*vbo/U5l$+o'ʡ/D`t3v[GvfGA0c7[m*-ӆv{*OC URsSt1**Kz}._w/>P@_^&/"Ea- EZ#@VHO%KJ2Nd83rZc)wr<u>dS}JinSVmKYB|)[/X4:$R"DO/HRVZ {T^R*'I‹bBxm%*f,ՖdDzի1R“3.H dY(Jh𿮴CF _!HQv,t?9S?BJV҃7{,b?#,q\V[퇕BL򞲶%ڜ CoHqj*_LS&wjq)gEWQk%F 3  ŤVW4ekYKלL|:,lb_C~b1~ڟeܙt.(3>w0>\# ,s5 _>Ypp/x^wwfMmiԼ$`HleZ| 2XʺA%gjNUw_ŞQjIG`cMWZuV>.t-"Ӱ"xE] ª.hY-+fyb,&\Um96q4]H9]e~aL}&°ZֳK`IkrH=Ke|423AƓEp`H!]%@$t!4xX07j@fSi˦=gw* yHrZ"ܺ w ͨ_%rR d.֮?{Ҍpox W ,; LBѥnۮ8Mn1ĥ*oWEݫ FW՜.kN̢Kꡙ_B?:ٵڻX6Qodzm6XpB] Ry(-_w_dYCO&̚_ }"Y6p&. 6nR_B-SȼQu,^LZTײ_0ܥDYB~Qpz̚xAҊ`Icdp,<^/꒝^!di08Xe D@C#\N,Z6-IB չڭ:"z$# ~nf.wVsI]pU1 Af^eԟw p%s+%!A[Nyx VŪ.4T3ZPg g-Īrcy>X{\+:?4֓/0twslp#.~{ 0I$ɟ]QWOsTyfK8?]~lsQZI~zSKrk+KiĒs6bS'Y>N0]i3nVʔEK󌠓 _k˯Fj~r6(<\|D7Ѥ),,N)¨A֥\;.rr-;o3k'cr%޻K7q.{.l"HO,Kk ҇gb<t*jtLC&Ų;zQdqƴv? )0xdiu?PdЯ$O!mk;l?%sGMЁ (q밺^[JmZFZ=ھXmu\CO}Ws]+1)nG#ޞX/ Ӝ6Oira=M̒Qo_>4g4S7:|UmC5rHMO<ڰJTەgLO0=jގGZڂ!. Dqvb@Nm#b[8%!;_%ݖ%wbֱ0wVWP RCZr"sL_v2gA~H!C7ͷF foR>|x߁&QYɐ);GX 8qנ&3bJKdFdGv;b~emDΰRbK[B"mYv$,˻Ў_΢Er{GKY:BE;B~g߇GlBCzEP mpk跡(sqU),ܓLԸ[bG&;a]P)b`S0w4ɛxǑ%%9mMDrwˬKLpXܿ4᧭1Q3LzV 4kp;):8Z7b_ɯ=)8: A˚vY樲.΋ۺN7ywVч͌98t}Yy{{q%2 +3oDx,bN5%<.ڇap6rgC?8we;^Qa.\m;կ-UzeB`;LBTAd-*YVς+?gf;W/s]]B(FѮv-jA "36G44F!v2NZŋ$)>tw\N f{y kU5LGvo|$=ѻ$&|PB3Z3ĈDbu]gbtp(l9W`7b6,he,-9Z ]rLRK7:H+ɸ?' #"L)+ݚ7& MPu}`w|J2s!|fgb;m] B(eه&>N(-eitA(GT dbe 4SҮIu+bW98Tl?h*XQ3ӾlZd"آ˾_$VeoAGGycU V!V#)\IX$+[DH6H@;mCp˜x-yxni΃4x\|=Iu2sXHXbF lqNُR򎔶u;Ų5gZJ9aGtmCb:`}gOiŎc1G A\Rޒݑ*ϕDEؓ=XM W@hZk0oA+ެN4EZ%O>t;"| .-QתocTrQnVhX5vv+]L^7 üg9Trlxtт8Z}\ ãpQ]Rti~0Y,$ ʋU2y1sEpbל4ksּ~TBeڭGI0pHB:'C!Et4|2.&4a>/eܨ$).ŧ̰\k8w桺/uG54d&(rhO?GiVShlq藮 {+pQj_I] -ySFZQe* :R\jn^}j!C p=0]]O?ԦK/5s1?;THwӼ?U-B~jȨ74TЭNh05y[C6ONTr)PZNq\f¡Hu{۴oԜ :dFyyh›kpNIYl ąFQ7 9WRV%I`[H)ٵ>J|\o\BZYdO'+1K$ܶw2ŽH^ ^N(f5zf)MZO#at:ОB:9 :r21֬V32!,BN+jm: F\ |}FD^exX|TW韒oӿ\ M.WP%. ͯdOp` *\ }O7=ЊG*-sZymJ8\!)8px&xEu5 |~¯-LJ,GV;aJdvjujّhRF iGa6Z ƀ^xY}9?zǃLoz!iͺ}s.u^pIɴkH\t;i^@EdF;=e/B\?Ejvgq ੝1hP/g (rYg]U+-lZkd:nx4nY>w:y'yX;']V4 WP~V/x7Ci[|@@Fk;0wzϚd|@W~B:w[ۆeTnOpY&p66wCjVGc31~ARi#աmmz`Gvc؀`S6̬`WWPF劧U:H9q3ݱTT`R.6W?yǕbx䠶iwpK -jg0iPQ3*4CD]PK5#I[n<0`2;eϛ$i'|l^|[`Y4٢L`3<4R qSxÍ5>9It o?K\P ^s e$+ zG}ZnMs=iѰK^:lPXQu}d?4|4Π` \Xm۲[eLm'ӝ:\>e(Mz✧qbK@p'YVD}*Ʒsi,ӨWob%A]ܢ[ mu'<_s-Tw?헆lzؿ anTwr<zzl`5=,\?﮹ff3gak~U!$  "ǂgfD=)?)Lm)<׽YF9_)Ʋ1޲[Gx[+ǣ ]oi~ <-_$ #4;sI) ?K[_@QjFJkL{e#է= [gyu'Z=:~]\ͫoPYc)5gBz.fvkhN-PjU |9 :PN=%YRSdzü5!"ۃB>*LsΎLτ2ೊi-v,Kt,)?)õW:ٺ"<;ul(KA>iNo{*e͗ҭ*W=S\O@a== ~]P~|цA=/5XȰ;TodyW-/JL,UfKX< Hrtá)3j b B4QNAT5,%Cp>ܵJ7ktuZ/v:ܼ i}zr* _LQ8=T \aH4bftߐ,A{wJgwآ.M\){Wo_kyfXO;HO Ԫߖ⺰9?;HMXB|{W\LӾ'_b\q/a76{nr]NÃV88F~D.t~>vkMDg 70QTMt~^ 'ژa{=oHӡp(&8(wLavw'O6muېwb G95¶g̱l,\޸zw\ \'&~ېTN=HdžwBVB#yOC(W)fH]Wigfr.ᶋ )RZr6,p_p420vpI͒,.n"śpT {9au lL|<[(aknkΓ$zf?9|85Uj7b )Y,u ĝ8[5G?Ν29Qx _)E:/%8,rzl9c9n]gwiqO57|Yl ^=Y}m%)JDrO\05u0p|4[SԻup5g`@,:hA X'W{QYS&^܎!ZzIhAwb!ܡ_aK%ƪsYto-(`4H4 I@BrL,ZWAsCƨ{70SYE Bޔ5%ford1Op0Zc ȇv'9^E`DSɹv-eoN$u 0 eM7>[@ӊ.J d5NeS$(yUz+r #$%.hu՘ PYIj4.^u"oESzLb7ef5롪{vEL/ΩI{74;3V:%N(@l%F-[OffO|ZFSL3!nXW5r,y:uA:%#]TozL) l7SO.<f]^Zpv 3ShoV{7 0ᐂ!o#7ia.dWF.jcרb+V&Mx^p= Aw:x,5s.}'9l9CB'ҁ)6?\22ZA7W@etnerZ׋0"'-V' vv #{X>$"AT[>z JD÷ 5ER [[,PIjPDP͐~3a%(,܋I:XȸVgđ1)3JoL4Q 5]RvN !qM>V9+y>Ƅ ītڣ;i.O$CqJ|7$j:rX6s9٬Ԙ1-<5/3]Z2)d=Vjt aƩ{2 Ʉ/ 2[=G[0G9 g=xh}=T^ǠtZI"f 9d Gx=1qquvqAÏzGKhWTmĊ⵴v]h-\e^h jBZk++4te>*++?gjs7g2­[U /L/\QeFu`V(JbxBSmz1e0g_7 պMIMI&\\{ ۓl֞ͺ=kIV( NcFQAMMkqՑ16pnjϐnϠƹ!_{(gh1>F3E +̚2°$ydXAf0,O3f-OQdO,x#5HUqJ~E9f-7|T :ptVQiUH f0(J%koڻ3" )Z#+IE@lE>jl|ېr5;1W ^(=RH a1 Q'Z>m$Wz G N0"k&0-e9D{8 jST΂^PSd{ij > #(f#{FV {sC t?%hdEyok^oI;_TWP"5O"GjTAO& $\-pK!$ˣ 9> ᷟ~JU8Er(cȦdcVDGM?~ubc:լ[-1Oj!B@AdFG9OZƩ2}*i)@0[PpҢ$)|Yx(`. d2Y]0# c'[ٿ2W\oq\b7@~=Y-z4 N{WjN7]ۜ:P~y-,^@Jq`:v\mDfNӼ> ;֖,L)-&[.diVG *H+1~38ƣTwX,= OfpԴshZFYF7'aNClL_؃B  йphoSe_{:poEm|gnʷ'y8YZ!i}[' [>%]|\|v {N{i]Y9{(TZb_AvI soDB4Gy8̊wG!b;O s {zזF bk8h،`,?B%fK!p,CPb>IpK1a`]AZx$e_>sdPkD|wQO|D,9R)o)=B3$Ok*ӕѼ|i1Qp2=y1xx"0DWTj@T߹}ܤIs!نJى@ _/U*EeViR1a 8TVa; TΠ;+?jɓݸǨ1˳&)T4l#%lpٌ 咟N h8gт*W x=;g+OzEjJ5ָ0+(JFمaB5gW^#»H\L;[jbW)]{AoJje]Τa3|w>2-N}ޛ X*tmN=!n&nkeZt GytS@ h="5 pٶSu\9*R{s P΄Z}dݨ\*Ā\%bN^PBk T(쉜>TP,Y^!o&lqqBŪLR<Ѻrw¼x1 R!6|E"?q( [M 21qxKEN$T ԍd9U?C'ki\@OzG~ΐXe86(J&lݳаo(yU_r_lD<XWↃץn1`6o"CpzV6n0;>H sji:&|Y\>AsьW&螲/̾Ĭ.(xG]WIb6Wtrl02q M8bj6&w.'ۺ%oR%X5)Vd yŸ'#+:{Q&ێjl2eFy@δǗkUXatJ.b%ROa/<XkӔS dJPlhgӉtzӠZ]GѵU@Žm8|:Уq8[cyq^:وu:УHb4`ǦCc[!~`7q* ~2.Cb܈I|Q@w~~L]=O5rʋ2Ƶ8Y| [&.B6"@vOaj}/LɦllxZ;7]%t{u({:s0MfY"))[s /oB-b!P#HS~yac!3@+`d%y0ljBl⎀:#p"px|n }ϑ>CT'dÌyfy^|fϊxaswpTZ1'q P*5@&Xm)itZ{ĘP. |du1_J\eY%fJY} '$*JP[G*,Ɋ3OOpi'rȯz[gU}+9ӢK;uqbChs'821[|̃1TGe )M\ zuƸ'S Qe}4jU5ױP>NzrB[Q>O{DAkšf.LHxk]Q4J ̔2̀g} RPEh #|2 AO$p&>%YGIDfOzr"cjHB%aIl=3B=I[$ݝQ>gY]:$PQ'Tfc%1rd'=Zbb!0 cm@!< GNFpiAfΔ 9mASL|' Ss9}+[ֽ~z2evj(Etiy3Qg 4[((ffr{MYTzNxI=]LJQ"uFrvqv]Vd^nF^ Cլ(b9OL-f\&L3$ɼ *#E.D5!NާI:h*SX|>HEҔZ=3E jX>mِXV'9֨(UkmU c'B^Co.\ܧ<NS5wy94&!'ycst^TO4K 9,41Djtn74Іl1U]Fef}%3}]3j(|ݰ;Erp'FɈQY.]XHժBٓVIi*X=d󢂊hx'طAG)^:)Hv}b~c1Am]cd=T&sq/,]RI?҅t pw8d:eP6$ǺGv=jR/{1w!"{7S%ш?]ط4 =RYfµcg4k}Ǐ!i'ڍtI!ʶJ6/`L[-:IudR1{69R^%Z_݈E娭]E c\ŀH}Ϥq orruQ?;&Zn^vM(U 0w”X@P F/kUn">{H EZPUPبUc@ctA}6Ą*n$\E)5 e"JP%5"%Wb+G%_z4巄5@瓡} NyѝսT0BBT VqIe&&qE,b']=yq!]JՒ4u`ok$%&TolR4BRUR'^s.JOJ${Ɓ+oF++mT (ṈB{pd$` uQe5T24})7˜N6Yӑ$t*, }j2 6>9Vl]r)-\mlNQ۽4+/P4ς8k lRF1׭2q(*[$Kd8|P10'.Ykhk l>;STX&*ɴĜ)U+'nKhaepҩFDMH^.r 0i(pGҾ!t]ҒH#= #E$.F I`wHo$@B&( BJ ]1AX6k ܴ^w-sGKqnK-Ϊ*הRe[?~x޲>u`we$ƫcbj'sٯ*\8zLbCrڰZV iV ͵P2v0Q%x`!x&+gRP0Lpf7q5IZ&p_DΤI ozChmKfZ CVMHb"2Yrэ-2L_ΦȖIt4heZJ343d9qfYke1:3RrCjyxMﭠ~U}={Ԟ~FM,:MSdex. !ZI$cqQI4^ 6F]V'&@ONuF$^+dU%U,OͼK=z֩Qg5.%)?zQ.dInmڱQE$8ѹ3 Dcͼ/,bt5Di z>&@E$a"uV3]j"9U#$@.ĭ:DlΙx^'$`D1VDjTzn~Rhz~x2Pj<]o:/-!"GkBW!8'RFvVb|!`K&Yud waȀĊ&0H⵺[zi1Xw+bmƅT!To!?+eݥ+wQ.qJTz xu $%ҋjx"3YeXU9׊2+<bVeFdT*KLm%XPI8vh6Tr5sTi/# .Õڌ<$}iS8csSMH~$|S9륩Olf"q2{cCR{]{J, [_ثL5)q3a8t4㥵JBF[ &)OG$0w +,d(.sXr1jG61:x Zsvە)0Tƍ]$ra*Bοe7oEAZ`. q_,!~͈>ح!хlz>b$=(tdWOѩ/Nh&<͕&`<ϞbՄuĔNv$-t$ (l~\ Xl?+[L+̤Z &F*ܰo.oT@cl(Ǒ# ĪSV te8f򝤤Z]lb邚~ :ZާO[Ewz,8"]3.KgI8elfuc`oV-̟s(j&UWGu0ݷ1 5ٺ@݋^okɒAy ׫)༖OGӼֽ;;….Ԫb[v쾑`TYv1K:=U(!Wt* oЪ..T +`%blk$h

p莭$+%P nE`nFߌfOp 9v37cn%|4#"EeH= 7Gy_%Y,\ $\&1)cҒTOjt&3^xzKE]{10h;<6 -U""d Y+Msxl/m-Y.L`4| )O5*>y}4>*~f< P$H(DGЉE+jQ`t(G;:BEKjΙ*rئPdl2Bq2CI 4Ee JߙJJHա~rf7FR93dȑ`}A )/m \S55vY]e q2X6鴝" j<XuxԮ0iX-ô:s)۟xV@B&A|4impSZAdw64 Y'k1¾6(lWE"ӗ_?M@ڢetKw5W]"C )e.CZ6záQT/|󌻥eN;'L '!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~}%yx$ #_(""e" `Xz RG`YN_/E/~gr6>Po 9VOI&Crƒ`fyxP @WMyQ0l@Lb. ~AU"*4~?(fեկR0R @҉6WqA9D AH,eX:0zA5n (4Б]NG7! sA\hJ$ 5(WaR&4"#z|Rм@(H!ΑB mIO ƕt%Vy{Ƌfsѡ=X&P)iϊϟN$*֠Ϥ,tj J G_jFn4k Ght+b%%G+be nLcYKHX! 2Y:Wլ8cDכsAe= R1qXE[ugYβR^κޱnɍXS1ɅnජaZaAl i5ŜXZxyH\:w&t򢑱*W wgj+ LN;B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%~}$ #ȿd( "i лa h?.A03/YP _7~1(ɒux2DST`0/KRdҴIPAItZ,NW- 6D>!S$N%Ru?ɺ_Ʌ+lݴ9H.*۠vM3 b3p~\lċT̓G٪e n_S9'. %G0`` @ϏW}twKN]\ƽ2NhË@r ~^ |W~낵S|@܆qI@((Wi@-kCa 93RQJ"H׉VID^88݋'O'Vb~HIl!B4&.eS) %yv% ?p5}ƚYWDh\]qc-9N< t0>%/N86^@䏎m6V"htdTdLG(}Jq&>YY=*8`CT){!˯N$@ 8fb,uB>+ִCȗHj0D]:l &:3仄9KH81\U"/ A'P3,&kr"Cqm@.s36#pT? * ur# x4;!91[%y5ԉ]_}v21]B1gm'<:hWzy#m8-BM/NLU@8C.֍y xn2{H&p:.E ('îz [{ Ӎ#? '>OLQE` 24iaw"n:}L6قѠvldU0Y\'a+B`m.UKTô ٝxiP$IB0P%TH|?$+ۺQY{j~޽-_+KҊ\RvxE-~LN! ,//__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~mwsrY Ϻ^ ٰ׬ٻR QU˯X!'=PέpX.s"RÉk*blqxRخGY@&$ѠXJȜyf߾ )Z{A+`ҝKc4-t;V Z0e:54Xϰ nɚ5wvHq W\, ,V{![MA=YȌ'ɝ;7@@۸ͻ'VJ@ȓ+_<c[('ؗ'!8/~͛o  Ȁ;#^f|8?=~W@&Bd.5jǁ|7ft^_EiAe+0xvrX`Ct ,`X8#$")\:>&dK @%G$T4%TLVdUDSeC$=q: يbÄ8d%h,tHͦQ5cRw @biJ=K_Jd.;"2|ڐqM)ggso Y8)X፴{e4khO=(`"lj o5 ju B 1( . 0 jVTN܂) @*q0D2,8 (?,Ȧ dzv?ӐovY4G+@ ,0tt T U[l\օ0k0(Fr) x5w|-n9Gݸ v__;+DtL7琇~:Op_3v^:z>Srz}%o0  Y|؎o=/_K0?K{H/oM"& Sg׳Oܫ` >y4ZCxР-w#@4JڧW7?HYb0ɤY:J~PcdcjM)@TY%pP)BClŀ qJ(.K;(Jb)N H4"Cм1&#f|h6*ُ8sG D9ثc2QkvPƐtUGP䨐L"& Ñ;Pg/-6G( .NlP zl\>$wiLc;!aJX:5҅-\TZhtA& %8Iq&x֗N `%%bĬeXiuNب}E%2LZՂe~+wc]#O޺FP~{ jkcX {Tuξ6xѶ&7fF@3aNovfU`Rhyw%UxXRVǁz89rT :XREʌ(hBXSH&)9WPC0N:[[:AeD]OxY؇ęmf3!5gL)L6Q(YNAFDhn*qzF z7aWV (I JM'^**"=&DgN`"TycRX*m}r[q J Yي7\ۚF3)/B&-[2Vnp"Y >F䭦2З9ݏ~kC隊hW"0KqL,0 X\3 ' A%<;),pp'4\d V\@~_eiٶp?t&97 _ڦYXʽw ]L'BHkv0* cg}"&,zE]l_ݭ~F^wsI7e\<*2g"ԥE6t™ē_&k{5.<; f#M~0p(g$~4U\ВES\ ^?!P!w@X0ZPY5j'J*~Y*/h.d.D}6Gi"#Ѡ=a*K8DdA=YĉsD0YRDTFPmՌЬHQ}i1_= i~lH" ` vHd!0G$WdDb29s9HE2c., )IGRf h$"G4 ?}'4$Jdܡ$arISVK&١J)bOs!5EŒQN)(/Ok3 sS)PD%B%˅rq>#ځRxLAnȟDCtX1%$vNQ=)8Ok|UH6 ȣ"(zSYs[;#c|@JթUfϧ2T*m\!RnU8N_ ʆ-PTD])ՑD޸9D`"x>i_I0hboɋhzc3c!@ji_)ubT, !.֚TXR@B W&n`g@4̋RD;4&;,] Bvd,Emtg%#uBhLN;! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%$#r(" w ߳ ­o &jD03n_?iي``%YhF3NFC}$ԎHNL%\Zf?WL񦕐*II' q璒%Ɗxe p4DM%XuвL:j`MT}%jVؚۂݸXS`oef.^ۖEdEǐB Au@'J y>* 췹ڷ3ܬp^p;@ΣVGw]ӻNx jOGo@Ag~]xĞ<55q `r0& ߅^Y44R1u NV<~0z#M[1.儇a9ҀZ+Fan4Ztd .) dMt$_A%u$YZ8yF6NVg)RI Fy't:4hgtmƹharhM9)x ]c)cdJjL穜:jw ʺE TA1 YTI-*>#'g:(IuWG̢Cd"PRJ Vө!4ŤZ K@_lƪk Z$:(C ‡BSd:DWii2 ]k p/PҨ95Ϡ2;CACl%~ luخ?6]-k;w?|vZ7]w0wj0փ y Џи]9|`1+7 wӁS }o[zg:JPY梄i`U;Y*I h@2 2 A `Z m(@sbO"QKjnWPde"fT 9}$;!9IuaL;ap9p2bAQ0]uAp 1s#YEdrM,41ˌI H8v3+bmkDP> r1%p-)\pGpuh9WbchF2eb%ߺx[}DV$t#*/=veQ&|;LN; ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%$v("w#|̭ ɳ ɩs׿ 'J&?Q.@7^1g@DE]DX9i7 (=kųWm}Zz9`r>j1-R6kh4;  :7w~w̬a,vL<A۩O_dWT yA\8?$~ET5P7kDAQE6P'c(@%PZd<0G&#2P 1#*0$ 0$6$3v$EMYH$=Z$=-v~NAu,'yFOUipэ|aa&炉1ќX᧗A1ieDjqRJj+ve+~+*ԁ5Z+R}TN#d *8pA`2d{dF&wdzj0]ݕ ȕP|4DZs,`C@2 .Of;\ZCΡ 5~ffQ 4B_݃ŵn l}@6hOӅ1VCs%ζYxY|0A4w  1-B*(^yvaB9䌆C,n缠7fK3vH]X}7y?sq>HBo  gãׯɽ v5`Wޓ/i%|3V/B;g|\}I+ #% N>]0E; Mng0 x- |B@]:>} z=8 WeMƤة. a~9VW5>e1bҗD|D,.! E,cJhhU~QzR5+Si M ?\`g\&Ds$8I$%EIةj-XeJYGMsZ+gI%'o!HR9&NCnW^jBT-/®3FUB.A'%B14fdu -"39zsH!B洅Ձ?#:R輨 Q@=He-@; =|,+t) `ME5!q=NU:h %~ Cy]l*hA!ʩjUG" Q{WݱaVUSN.,/^KÜ#*-ƮCdg : gGkegnf6@/K'ꍯLX8^S`/0i#,@(J02-*%.r\(m"'s/O@n&e2RE "fG!y&`[[M:JvڅeCπz55x8d`9?Ep` Nri*UfI^ ? (gI}|D7IӶ}4`ٵ 740C/NԔS]/aW͒5=ϾhgtO~bLG>֍;sIg ,@bnQsZP`=#4L5` R TȁFRg"j[S8)^`Q,*b84R@bTXPȣאU0HdȇA~O^Lo2VS%WU[ZIeQɥ2-VLIJzɦ'ELYE (V8&Xj6!(6cYI0^zRq%iQ|JPjbRʃ ;7\g\U&dp9Gdy6vFł Ofל)2uKՌyKP `= h- xC*MhK;pUۨ./E,qP̡j (q5slaڽ7]B-MtK@k]O1pO+5J~Gcɔ+\gdFW ЖP]vl@$Wwc `r@ᇣZ6D.9xs`g^9-c.标_d =lfV) Xt3/ۜUi~"h#h}eo>?~ғP_Br=. Wz{!'o{(tdft|A-Y@P \G-M0@uaTbڙ;d 48x=z~HU<B"h퐢fH-QՌX0$rEsIV 猲bYAX $=t(Rs^x?aYhR2$a^m? X$X:j0ؘaHʼ5HXJ=uZF+%`[Bk*?2σqf[J4|ы=TS/˵|Z{(M"Vb9$0U a*d@c4p9 P\DݗΉu_Q q! #ΐ"EI/&ǂ5!e'АcNt0Q@bS"-ikI'y?)3ё|PSCg^U>'1(5 U*5s.Hv fŲr\:PS醙V6^+8L&m-,ƕ1{je-,X+Ouu{++Rˁ8/}$[ -e[.}bl>܆aqZ385$F mN]:u.s'ހFV5囎wOͯ~LN3! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~>%$#{("Ɂ Ҳӂ Źt&swȭ F?=J '(6Y:g+8{J= n iw$F SݪIyT1 H`3kHtZH #fѪ RQ[L.Fڅ`4b<(!>E]!X9Z5@ӦD)Nxm=r6@%xd]5ݔNnf#`3(|ݵg-g~^Hqۻjdi7T9^(`vՄViB@Q3`?l(a^Q|zȄg5 b#.u]4 [)e?@Frd,OhBZSR9dc%]` XIpcY%l)$͝g|I3EF8h44znFzJFfA՛[aDhVEZ+BlSXD,Ml=^qkgV1l2틄~;ű<|fgګ *ک p˂A&@|ZΊ-h*1ڥ.kFC魹pfL9Nm8p0G,"˭+Cp@7Xj“"[ATet 2sG3`C*(o ԴĻQ, qǛg r̸ jrj{)$vj'w38 sސj*<8䤗m ~-z >~P n`s)x'1n{'HDNt[5=%ę8f/$|0P?>-\a׷/[ɧ\W>R9 ,X,j9Ab-FRMX`v'nWA!INu..F :ve k )"bJ-+pॿu Ȥ.-HpeKpԋ{ML 0j"VSs rFQe;l7W>1b*ܸ { YS` B;osGt{UuFM%3-X>`4ƦOh0Z_@14vՠa.FU6} iqQDW$mpU@hRu+6Avr noK0>ޝܷ?|=Ԁ?_%`LȄZJ'W5SsOT.v)U1!9'0奕婈Bm8FXPBb`cU$Kd|$ 6Q)ƇPPc|H_QL%q}i@W5]IFXݑ$JrEQ6f8ahqaV6JXgɩ}Z% L1 *F  I~i]#P*W*Y "X NkZJ,JalS(K؞:QmEț}-rrg/ pT$ڻJF1fZ/pcTknVV@+ohPG{-Sh7p^%\ ZhA_1%϶=5 -&ZdZSIt5Ѷ-pl.5Sä206BZwTՀE _'w7 ,˂:^>.ڹ1sа3ݰ@(^]C}^F.z}-S^  ׳ gBuo~&>fC V)Ci z $h>ֳ`G̨vA8+ut a>x`Rrd.H2`!`脇rՒW@t<X 4غ< ?>1q9@%*V$;*AB^Wo&gn\p2%*D>5078!9+x#cS0ʰBX`0Dd#IIBJ}艔kJ (0qI('Iꆣ57|B0.acqd6~Aq!N9^F$:nZSV×xjBU4NunEa̚ ̐Tͼ?!F̊8%4[i d m+3Q8q3SGOr0mډRplJ79O4=ZdR#hOJ@wW26VTRG@ӼDPҹi*9 ,FwEr8u.¨ ux(Wt[{Rԭ^uZ1usZq445YE϶T1,d$ZE%jyƏickҖ[m;F2ʔ|˵^P >/9 "tYPP]F gPsEv]> ={΄noLN;'LF;phangorn/NEWS0000644000176200001440000006316514142252160012575 0ustar liggesusers CHANGES in PHANGORN VERSION 2.8.0 BUG FIXES o Use USE_FC_LEN_T in the C prototypes of LAPACK functions to correspond to code produced by gfortran >= 7. The mechanism was introduced in R 3.6.2 and is planned to make its use obligatory in R 4.2.0. o bug in dna2codon fixed. o codon models (codonTest) most likely did not work properly for models other than the standard code. NEW FEATURES o free rate model o Mkv model (so far only for rooted trees) o better support for ultrametric and time trees OTHER CHANGES o optim.pml has internally been reorganized to be easier to maintain and extend. o pml.control got an additional argument tau which controls the minimal edge length during optimisation. o trees constructed with allCompat, maxCladeCred now have support values stored in the node.labels o switched from magrittr %>% to the native pipe |> dropped dependency on magrittr CHANGES in PHANGORN VERSION 2.7.1 BUG FIXES o several bug fixes in parsimony code CHANGES in PHANGORN VERSION 2.7.0 BUG FIXES o several bug fixes, e.g. which called bootstrap.pml and pratchet to crash OTHER CHANGES o internal functions for handling bipartitions have been harmonized with ape and some functions like maxCladeCred are faster CHANGES in PHANGORN VERSION 2.6.0 NEW FEATURES o transfer bootstrap (Lemoine et al. 2018) o pratchet saves trees visited during search, which can be used as (approximate) bootstrap values CHANGES in PHANGORN VERSION 2.6.0 NEW FEATURES o rewritten fitch algorithm to be more memory efficient, often faster and without limitation on the number of states o dist.hamming may handle larger datasets and can be faster o add Laguerre quadrature as option for discrete rate classes (experimental) o additional genetic codes for codon models. OTHER CHANGES o conversion between alignment formats is faster and more memory efficient, allowing the handling of larger datasets o changed R dependencies to 3.6.0 mainly to supply nicer palettes via hcl.colors() o lots of small improvements to especially for codon models o tests are now done by tinytest, dropped dependencies on testthat, vdiffr o all vignettes are now based on Rmarkdown o pmlPart and pmlMix are a bit more robust CHANGES in PHANGORN VERSION 2.5.4 NEW FEATURES o dist.ml, dist.hamming, dist.logDet and dist.p also take DNAbin or AAbin objects as input BUG FIXES o bootstrap.pml returned an error with argument optNni=T Best practise is to always use TRUE and not T as shortcut OTHER CHANGES o several more unit tests CHANGES in PHANGORN VERSION 2.5.2 NEW FEATURES o pratchet, optim.parsimony, optim.pml all may now return trees with multifurcations in case duplicated sequences are discovered. This may lead to speeding up computations and improved tree topology search. o function codonTest which adds codon models to detect positive selection (M1a, M2a) and several options to estimate codon frequencies (F3x4, F1x4). Can be pretty slow and still experimental. o broom type tidy function for several objects to easier compare models o new "equal_angle" layout for 2D-networks (now the default), gives usually nicer layout of phylogenetic networks o tiplabels, nodelabels, edgelabels from ape work for plot.networx if plotted with base R OTHER CHANGES o several small improvements to more intuitively use pml and phyDat objects, like subsetting phyDat objects with "[i, j]". o several more unit tests o two new contributors, Keren and Richel o optim.parsimony, pratchet, pmlMix and pmlPart may return the current best tree or object when interrupted. o roxygen2 is used to generate NAMESPACE file CHANGES in PHANGORN VERSION 2.4.0 NEW FEATURES o new function add.tips BUG FIXES o midpoint works now for trees with only 2 tips o densiTree, bug report by Richel Bilderbeek o tree rearrangement in optim.pml return tree with double edge matrix o phyDat should work now for named vectors OTHER CHANGES o many more unit tests o more consistent coding style o flashClust and seqLogo are not suggested packages any more CHANGES in PHANGORN VERSION 2.3.0 NEW FEATURES o new function mast to compute the maximum agreement subtree o identify.networx to identify splits in a network o densiTree got more attributes o unique.dist, to filter duplicate distances o ancestral.pml and ancestral.pars are now may return proper phyDat objects and in for DNA may return ambiguous states BUG FIXES o densiTree may if the consensus tree had different ordering of labels OTHER CHANGES o acctran allows multiPhylo objects as input o rNNI has been completely rewritten and is faster CHANGES in PHANGORN VERSION 2.2.0 NEW FEATURES o midpoint in now generic and works for multiPhylo objects o as.bitsplits.splits to better interact with ape BUG FIXES o bug fix in RI and CI for ambiguous data OTHER CHANGES o added roxygen2 documentation, so R code is now much better documented, reorganisation of some documentation o many more unit tests CHANGES in PHANGORN VERSION 2.1.0 NEW FEATURES o new functions to compute the (approximate) SPR distance (sprdist, SPR.dist) contributed by Leonardo de Oliveira Martins. o super tree methods based on NNI and SPR distances BUG FIXES o fixed bug in KF.dist OTHER CHANGES o improvements to as.networx. It often now produces networks with less edges resulting in much nicer plots o plot.networx does take a different layout algorithm o as.data.frame.phyDat and as.character.phyDat return amino acids now in upper cases o more unit tests o improved cbind.phyDat, faster and more flexible o phangorn now requires ape 4.0 o phangorn now imports Rcpp, but not nnls any more CHANGES in PHANGORN VERSION 2.0.4 NEW FEATURES o new weighted Robinson-Foulds (1979) distance wRF, suggested by Michelle Kendall and normalized Robinson-Foulds suggested by Sereina Rutschmann o codon model "YN98" can be called directly, improved documentation o bootstrap.phyDat got an new argument jumble, which randomizes input order of sequences OTHER CHANGES o more unit tests CHANGES in PHANGORN VERSION 2.0.3 NEW FEATURES o new function maxCladeCred computing the maximum clade credibility tree from a sample of trees o function read.nexus.networx and write.nexus.networx to import / export phylogenetic networx to SplitsTree o function as.AAbin.phyDat to exchange data with the new AAbin class from ape o likelihood ratchet (Vos 2003) topology optimisation in optim.pml o with KF.dist (Kuhner & Felsenstein) and path.dist can be used like RF.dist BUG FIXES o improvements to optim.pml to avoid numerical problems, can now handle much more taxa (still experimantal) OTHER CHANGES o mrca.phylo can be used like mrca from ape (faster for large trees) o individual splits can be colored in lento plots (suggested by France Thouzé) o plot.networx now (silently) returns a networx object with some of the graphics parameters, more plot options o lots of small changes to make handling and identifying splits, edges in trees and networks easier o plotBS has a new argument frame and arguments BStrees can be empty o new vignette IntertwiningTreesAndNetworks CHANGES in PHANGORN VERSION 2.0.2 OTHER CHANGES o phangorn now suggests only the Biostrings and not depends on it o some improvements to bab (branch and bound), may be faster CHANGES in PHANGORN VERSION 2.0.0 NEW FEATURES o as.phyDat.MultipleAlignment to excange data with Biostrings o dist.ml can now compute distances using a discrete gamma model and the "F81" model. o optim.pml got a new rearrangement argument and can now use a stochastic rearrangements similar to Nguyen et al. (2015) BUG FIXES o plotBS may double counted edges when rooted trees were in the sample OTHER CHANGES o optim.pml uses more C code and should be more robust o more unit tests o baseFreq got additional parameter 'all' similar to base.freq in ape o lots of little improvements in the manual and help files o modelTest now also shows AIC weights and model="all" will test all available models CHANGES in PHANGORN VERSION 1.99.14 NEW FEATURES o phyDat2alignment to exports files to seqinr o readDist, writeDist to import / export distance matrices o cophenetic distance function for splits and networx o added unit tests BUG FIXES o as.splits.networx did not work properly for 4 taxa (reported by Laurélène Faye) o RF.dist returned sometimes wrong values (reported by Andres Dajles) o plotBS did sometimes not work if the tree had no edge lengths o plotBS did not work propoerly if input trees were rooted (reported by Quynh Quach) o plot.networx ignored cex argument in "2D" plots o Siblings ignored include.self argument if node is a vector OTHER CHANGES o plotBS got an additional argument p to plot only support values greater than p o pml and optim.pml now uses more C-code (and is a bit faster) o defaults in modelTest changed o discrete.gamma is now exported in the NAMESPACE CHANGES in PHANGORN VERSION 1.99-13 OTHER CHANGES o improved importing and conversion of data o improved stability of pml and optim.pml CHANGES in PHANGORN VERSION 1.99-12 NEW FEATURES o added neighborNet algorithm (Bryant and Moulton 2004) very experimental at the moment BUG FIXES o plotBS was not working correctly if bootstraped trees are in compressed form (bug report by Tobias Müller) OTHER CHANGES o many splits and networx methods have been improved and a vignette was added o phangorn now suggests only the rgl and not depends on it to avoid problems on different platforms (suggestion by Matt Pennell) o new package dependencies knitr for html vignettes and nnls CHANGES in PHANGORN VERSION 1.99-10 BUG FIXES o reorder.networx may not work as expected o Gamma model was not working properly in simSeq.pml CHANGES in PHANGORN VERSION 1.99-9 BUG FIXES o bug fixes for clang environment o midpoint takes care of node labels CHANGES in PHANGORN VERSION 1.99-8 NEW FEATURES o pmlPart got an argument rooted to handle rooted trees o simSeq is now a generic function. This simplifies the construcion of parametric bootstrap test o SOWH.test (very experimental) o as.networx and plot.networx improved considerably (often generate networks less edges) and planar graphs are now plotted nicely BUG FIXES o fixed some bugs in ancestral.pars o amino acid model "Blosum62" was not working OTHER CHANGES o improvements to read.nexus.splits, write.nexus.splits to be more consistant with SplitsTree o splitsNetwork got an additional argument splits o help for consensusNet, as.splits, as.networx have been reorganised and improved o treedist is much faster for larger trees o several changes to keep R CMD check happy o a development version phangorn is now available on github https://github.com/KlausVigo/phangorn.git CHANGES in PHANGORN VERSION 1.99-6 NEW FEATURES o cladePar helps coloring trees o treedist is faster for larger trees, better documentation and examples BUG FIXES o the plot of consensusNet shows now the proper bootstrap values OTHER CHANGES o phangorn does not depend only suggest rgl (should build on OS X now) o default rearrangement for parsimony is now "SPR" CHANGES in PHANGORN VERSION 1.99-5 NEW FEATURES o RF.dist works also on "multiPhylo" objects and is quite fast o optim.pml can now handle NNI tree arrangements for rooted trees, still experimental but useful for dating etc. BUG FIXES o rNNI did return sometimes trees without tip labels o SH.test did not work for pmlCluster objects o df for rooted rooted/ultrametric trees are correctly computed OTHER CHANGES o lots of internal code C-code changed o exports of some of the internal ML function, this should speed up in future other packages e.g. the colescentMCMC package, which use them considerably (interface may changes in the future) o registered C routines CHANGES in PHANGORN VERSION 1.99-0 NEW FEATURES o new function dist.p to estimate pairwise polymorphism p-distances from DNA sequences BUG FIXES o as.data.frame.phyDat returned only site patterns and so did write.phyDat for nexus files o some of the recently introduced (1.7-4) amino acid models were not known by all functions and contained NAs OTHER CHANGES o changed package imports and depends structure to aviod error messages, thanks to Brian Ripley o a lot of the internal C-code has changed CHANGES in PHANGORN VERSION 1.7-4 NEW FEATURES o densiTree plots are available now o new species tree and super tree methods o more amino acid models BUG FIXES o phangorn now depends on rgl instead of suggests rgl, rgl wants to be loaded before igraph, otherwise a compiling error on some platforms occured! o fixed a bug that sometimes caused in pratched to crash o fixed a bug when using negative indices in subset.phyDat o the search heuristic SPR in optim.parsimony evaluates now more trees and is more likely to find better ones OTHER CHANGES o underlying C-code for several functions has changed. less memory reallocations and potentially time savings hopefully I included not too many bugs o optimising edge length changed from Jacobi to Gauss-Seidel method and will hopefully be more robust in the long term! o Descendants is much faster for option type="all" o plotAnc gives user more control and produces nicer plots CHANGES in PHANGORN VERSION 1.7-1 NEW FEATURES o pmlPart got additional argument model (request from Santiago Claramunt) BUG FIXES o pmlPart should be more robust OTHER CHANGES o started reorganising the code o underlying code of several parsimony functions has changed and these are now considerably faster o some examples are changed to allow faster checking on CRAN CHANGES in PHANGORN VERSION 1.6-5 NEW FEATURES o dist.hamming handles ambigious states now as dist.ml (request from Arne Mooers) BUG FIXES o phangorn links properly to ape CHANGES in PHANGORN VERSION 1.6-3 NEW FEATURES o optim.parsimony has a new search heuristic (SPR) BUG FIXES o changed package to work with igraph >= 0.6 OTHER CHANGES o arguments of pratchet changed CHANGES in PHANGORN VERSION 1.6-0 NEW FEATURES o dist.ml has more options and is faster (ca. 5 times for nucleotides and 20 times for amino acids) BUG FIXES o plotBS did not work properly with ape version 3.0 OTHER CHANGES o vignettes changed for a faster compilation of the package o Ancestors allows a vector of nodes as input o midpoint uses less memory and works for larger trees (10000 of tips) o ancestral.pars gives better formated output CHANGES in PHANGORN VERSION 1.5-1 OTHER CHANGES o several examples changed for a faster compilation of the package CHANGES in PHANGORN VERSION 1.5-0 NEW FEATURES o codon models can be used directly (dn/ds ratio can be computed) o modelTest works now also for amino acids BUG FIXES o the code to compute RI and CI changed and should be more robust OTHER CHANGES o package parallel is used instead of multicore o vignettes, examples, help improved o ChangeLog is called NEWS CHANGES in PHANGORN VERSION 1.4-1 NEW FEATURES o parsimony branch-and-bould algorithms bab (so far pretty slow and memory intensive) o more amino acid models o function nnls.tree to compute non-negative edge weights for a given tree and a distance matrix BUG FIXES o allTrees returns now an integer edge matrix, this could have caused some problems previously o CI and RI now take better care of ambiguous states o dist.ml has default value for amino acids o as.splits.multiPhylo produces more sensible bipartitions and so lento and consensusNet produce more useful plots (thanks to Emmanuel Paradis) OTHER CHANGES o several changes to the networx classes and methods o modelTest now also returns the function calls of the estimated models, which can be used in downstream analyses o vignette "Trees" has a few more examples o dist.ml is more general (base frequencies and rate matrix can be supplied) o pml objects are more compact, thanks to the Matrix package o xtable is now a suggested package (needed for vignettes) CHANGES in PHANGORN VERSION 1.4-0 NEW FEATURES o plot.network to plot split networks in 3D (requires rgl) and 2D (still very experimantal) o consensusNet computes consensus networks o Lento plot allows to take multiPhylo objects as input BUG FIXES o CI and RI did not work with only one site pattern present o pratchet returned only one, not all of the best trees found OTHER CHANGES o phangorn now requires the Matrix, igraph and rgl packages o designTree returns a sparse Matrix and this can save a lot of memory o internal code for computing bipartitions is much faster for large trees, and so are several functions depending on it, e.g. RF.dist, treedist, Descendants CHANGES in PHANGORN VERSION 1.3-1 BUG FIXES o the multicore package may failed, if executed in a GUI environment, more error checks included o optim.pml, in rare cases may failed to optimize edge length (should be more robust now) OTHER CHANGES o some changes to keep R CMD check happy o modelTest, pratchet, bootstrap.pml, bootstrap.phyDat got an additional argument multicore option to switch between serial and parallel execution CHANGES in PHANGORN VERSION 1.3-0 NEW FEATURES o acctran to assign edge length to parsimony trees OTHER CHANGES o phangorn can now be cited o additional and improved ancestral reconstructions methods (ACCTRAN, MPR) o new vignette describing ancestral sequence reconstruction CHANGES in PHANGORN VERSION 1.2-0 NEW FEATURES o new function pratchet (parsimony ratchet) o new function midpoint for rooting trees o new function pruneTree to build concensus trees from node labels (e.g. bootstrap values) o multicore support for modelTest BUG FIXES o ancestral.pars sometimes did not show all possible states o the call-attributes did not get proper changed in update.pml and optim.pml OTHER CHANGES o there is now a general help page displayed with '?phangorn' o dist.hamming is faster o getClans, getSlices and getDiverstity can now handle multifurcating trees CHANGES in PHANGORN VERSION 1.1-2 NEW FEATURES o more generic methods for class splits (print, as.matrix) o plotBS can plot now cladograms and phylograms BUG FIXES o read.phyDat sometimes did not work properly for amino acids CHANGES in PHANGORN VERSION 1.1-1 NEW FEATURES o optim.pml allows to optimize rooted trees OTHER CHANGES o description of getClans improved CHANGES in PHANGORN VERSION 1.1-0 NEW FEATURES o Consistency Index (CI) and and Rentention Index (RI) o clanistic tools o new generic function cbind.phyDat o optim.parsimony works now also with the fitch algorithm, faster than the sankoff version BUG FIXES o treedist and RF.dist now check whether trees are binary and try to handle multifurcations (thanks to Jeremy Beaulieu for bug fixes) OTHER CHANGES o second vignette describing some special features o allTrees is faster o trace and pml.control are now more consistent o optim.pml uses less memory and can be faster for data with lots of characters CHANGES in PHANGORN VERSION 1.0-2 BUG FIXES o pml.control did not work properly OTHER CHANGES o pmlCluster, pmlMix and pmlPart gained an attribute control, which controls the outermost loop o some more error checking for pml and parsimony classes (thanks to Emmanuel and Liat) CHANGES in PHANGORN VERSION 1.0-1 NEW FEATURES o ancestral sequence reconstruction (parsimony and likelihood based) o a small convenience function acgt2ry for ry-coding o as.phylo.splits computes a tree from compatible splits BUG FIXES o a small error in pmlCluster was fixed OTHER CHANGES o upgma changed to accommodate change in as.phylo.hclust o lento plots are looking nicer CHANGES IN PHANGORN VERSION 1.0-0 NEW FEATURES o implementation of many nucleotide substitution models (additional general transition models can be defined) o new function modelTest, comparison of different phylogenetic model with AIC or BIC o Lento plot o subset functions for phyDat objects BUG FIXES o an error in pace is fixed OTHER CHANGES o parsimony (fitch and sankoff) can now handle multiPhylo objects o splits structure (which is a list of bipartitions), used by lento and hadamard conjugation o phyDat objects can be more general generated using a contrast matrix CHANGES IN PHANGORN VERSION 0.99-6 NEW FEATURES o pace, extracts the ancestral states of the root of a tree using the sankoff algorithm BUG FIXES o fixed a bug in dist.ml (thanks to Emmanuel) o fixed a bug introduced to SH.test in 0.99-5 OTHER CHANGES o fixed several spelling mistakes in the documentation CHANGES IN PHANGORN VERSION 0.99-5 NEW FEATURES o parallel computing via multicore (so far bootstrap.pml, bootstrap.pml profit under linux) o compute edge weights for parsimony trees BUG FIXES o optim.pml had problems when o as.character converted ?,- wrongly to NA o fitch needed binary trees as input, otherwise pscore is likely to be wrong (returns now a warning) o optim.pml had a problem with identical sequences OTHER CHANGES o optim.parsimony returns now a tree with edge weights o vignette is enhanced, I fixed some spelling mistakes and added some more examples. CHANGES IN PHANGORN VERSION 0.99-4 NEW FEATURES o new generic function unique.phyDat OTHER CHANGES o internal data format phyDat changed and data are stored more memory efficient (optim.pml and friends use less memory and may be faster) CHANGES IN PHANGORN VERSION 0.99-3 BUG FIXES o RF.dist sometimes returned wrong distances o rate parameter is now properly normalized in pml.Part and pmlCluster o simSeq had problems simulating a single character NEW FEATURES o rSPR and rNNI to simulate tree rearrangements CHANGES IN PHANGORN VERSION 0.99-2 NEW FEATURES o bootstrap.pml and bootstrap.phyDat: parametric bootstrap methods o simSeq: A new function to simulate sequence data o read.phyDat: simplifies reading in alignments o SH.test: Shimodaira-Hasegawa test o RF.dist: Robinson-Foulds distance as replacement for treedist (uses less memory and is much faster) BUG FIXES o dist.ml returned wrong variances. o as.character.phyDat, as.data.frame caused an error for alignments with only one site. OTHER CHANGES o added vignette describing how to perform some standard phylogenetic analysis with phangorn. o more functions to convert between different data formats. o NNI tree search is now general possible for partition models (pmlPart, pmlCluster) CHANGES IN PHANGORN VERSION 0.0-5 BUG FIXES o Solved a namespace problem with ape (>=2.2-3). CHANGES IN PHANGORN VERSION 0.0-4 NEW FEATURES o splitsNetwork fits a phylogenetic network using a L1 penalty. (High memory consumption) o pmlPen: A new function to estimate penalized likelihood models for sets of edge weights in mixtures or partition models. BUG FIXES o dist.ml should be more forgiving for different inputs. OTHER CHANGES o a new dataset. CHANGES IN PHANGORN VERSION 0.0-3 NEW FEATURES o amino acid models o several new maximum likelihood models: mixture models (pmlMix), and some model for phylogenomic data partition models (pmlPart), and clustering of partitions / genes (pmlCluster) (still experimental, feed back wellcome) o design matrices for phylogenetic distance methods o added some functions useful for simulations (nni, allTrees) OTHER CHANGES o the data object phyDat changed slightly internally o a new dataset o read.aa to read amino acid data in phylip format based on read.dna from the ape package CHANGES IN PHANGORN VERSION 0.0-2 NEW FEATURES o more generic functions (plot.pml, update.pml) BUG FIXES o the "Fitch" algorithm in parsimony contained a bug OTHER CHANGES o pml has a cleaner interface (less parameter) o new faster parsimony analysis (more compiled C-Code) o added NAMESPACE phangorn/R/0000755000176200001440000000000014155651117012275 5ustar liggesusersphangorn/R/treeRearrangement.R0000644000176200001440000002675414065103264016103 0ustar liggesusersnnin <- function(tree, n) { attr(tree, "order") <- NULL tree1 <- tree tree2 <- tree edge <- matrix(tree$edge, ncol = 2) parent <- edge[, 1] child <- tree$edge[, 2] k <- min(parent) - 1 ind <- which(child > k)[n] if (is.na(ind)) return(NULL) p1 <- parent[ind] p2 <- child[ind] ind1 <- which(parent == p1) ind1 <- ind1[ind1 != ind][1] ind2 <- which(parent == p2) e1 <- child[ind1] e2 <- child[ind2[1]] e3 <- child[ind2[2]] tree1$edge[ind1, 2] <- e2 tree1$edge[ind2[1], 2] <- e1 tree2$edge[ind1, 2] <- e3 tree2$edge[ind2[2], 2] <- e1 if (!is.null(tree$edge.length)) { tree1$edge.length[c(ind1, ind2[1])] <- tree$edge.length[c(ind2[1], ind1)] tree2$edge.length[c(ind1, ind2[2])] <- tree$edge.length[c(ind2[2], ind1)] } tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") result <- list(tree1, tree2) result } # faster for moves >> 1 n_nni <- function(tree, moves = 1L) { edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] nb.tip <- length(tree$tip.label) if (nb.tip == 1) return(tree) pvector <- integer(max(edge)) # parents pvector[child] <- parent ch <- Children(tree) edges <- child[child %in% parent] # these are the edges we sample from for (i in 1:moves) { p2 <- sample(edges, 1) p1 <- pvector[p2] ind1 <- ch[[p1]] v1 <- ind1[ind1 != p2][1] ind2 <- ch[[p2]] r2 <- sample(2, 1) v2 <- ind2[r2] ind1[ind1 == v1] <- v2 ind2[r2] <- v1 pvector[v1] <- p2 pvector[v2] <- p1 ch[[p1]] <- ind1 ch[[p2]] <- ind2 } tree$edge[, 1] <- pvector[child] attr(tree, "order") <- NULL reorder(tree, "postorder") } # roughly 2* fast from Martin Smith one_nnin <- function(tree, n) { edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] lengths <- tree$edge.length nb.tip <- length(tree$tip.label) ind <- which(child > nb.tip)[n] if (is.na(ind)) return(NULL) nb.node <- tree$Nnode if (nb.node == 1) return(tree) p1 <- parent[ind] p2 <- child[ind] ind1 <- which(parent == p1) ind1 <- ind1[ind1 != ind][1] ind2 <- which(parent == p2)[sample(2, 1)] new_ind <- c(ind2, ind1) old_ind <- c(ind1, ind2) child_swap <- child[new_ind] edge [old_ind, 2L] <- child_swap child[old_ind] <- child_swap neworder <- reorderRcpp(edge, as.integer(nb.tip), as.integer(nb.tip + 1L), 2L) tree$edge <- edge[neworder, ] if (!is.null(tree$edge.length)) { lengths[old_ind] <- lengths[new_ind] tree$edge.length <- lengths[neworder] } attr(tree, "order") <- "postorder" tree } ## @aliases nni rNNI rSPR #' Tree rearrangements. #' #' \code{nni} returns a list of all trees which are one nearest neighbor #' interchange away. \code{rNNI} and \code{rSPR} are two methods which simulate #' random trees which are a specified number of rearrangement apart from the #' input tree. Both methods assume that the input tree is bifurcating. These #' methods may be useful in simulation studies. #' #' #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param moves Number of tree rearrangements to be transformed on a tree. Can #' be a vector #' @param n Number of trees to be simulated. #' @param k If defined just SPR of distance k are performed. #' @return an object of class multiPhylo. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{allTrees}}, \code{\link{SPR.dist}} #' @keywords cluster #' @examples #' #' tree <- rtree(20, rooted = FALSE) #' trees1 <- nni(tree) #' trees2 <- rSPR(tree, 2, 10) #' #' @rdname nni #' @export nni nni <- function(tree) { tip.label <- tree$tip.label attr(tree, "order") <- NULL k <- min(tree$edge[, 1]) - 1 n <- sum(tree$edge[, 2] > k) result <- vector("list", 2 * n) l <- 1 for (i in 1:n) { tmp <- nnin(tree, i) tmp[[1]]$tip.label <- tmp[[2]]$tip.label <- NULL result[c(l, l + 1)] <- tmp l <- l + 2 } attr(result, "TipLabel") <- tip.label class(result) <- "multiPhylo" result } #' @rdname nni #' @export rNNI <- function(tree, moves = 1, n = length(moves)) { k <- length(na.omit(match(tree$edge[, 2], tree$edge[, 1]))) k_nni <- function(tree, ch, pvector, moves = 1L) { if (nb.tip < (4L - is.rooted(tree))) return(tree) for (i in seq_len(moves)) { if(length(edges)>1) p2 <- sample(edges, 1) else p2 <- edges p1 <- pvector[p2] ind1 <- ch[[p1]] v1 <- ind1[ind1 != p2][1] ind2 <- ch[[p2]] r2 <- sample(2, 1) v2 <- ind2[r2] ind1[ind1 == v1] <- v2 ind2[r2] <- v1 pvector[v1] <- p2 pvector[v2] <- p1 ch[[p1]] <- ind1 ch[[p2]] <- ind2 } edge[, 1] <- pvector[child] neworder <- reorderRcpp(edge, nb.tip, nb.tip + 1L, 2L) tree$edge <- edge[neworder, ] if (!is.null(tree$edge.length)) { tree$edge.length <- tree$edge.length[neworder] } attr(tree, "order") <- "postorder" tree } edge <- tree$edge parent <- edge[, 1] child <- edge[, 2] nb.tip <- Ntip(tree) pvector <- integer(max(edge)) # parents pvector[child] <- parent ch <- Children(tree) edges <- child[child %in% parent] if (n == 1) { trees <- tree if (moves > 0) { trees <- k_nni(tree, ch, pvector, moves = moves) } trees$tip.label <- tree$tip.label } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in seq_len(n)) { tmp <- tree if (moves[j] > 0) { tmp <- k_nni(tree, ch, pvector, moves = moves[j]) } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } rNNI_old <- function(tree, moves = 1, n = length(moves)) { k <- length(na.omit(match(tree$edge[, 2], tree$edge[, 1]))) if (n == 1) { trees <- tree if (moves > 0) { if (moves > 1) trees <- n_nni(trees, moves) else { trees <- one_nnin(trees, sample(k, 1)) } } trees$tip.label <- tree$tip.label } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in 1:n) { tmp <- tree if (moves[j] > 0) { if (moves[j] > 1) tmp <- n_nni(tmp, moves[j]) else { tmp <- one_nnin(tmp, sample(k, 1)) } } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } ################################################################################ # SPR ################################################################################ dn <- function(x) { # if (!is.binary(x) ) x <- multi2di(x, random = FALSE) if (is.null(x$edge.length)) x$edge.length <- rep(1, nrow(x$edge)) else x$edge.length[] <- 1 dist.nodes(x) } #' @rdname nni #' @export rSPR <- function(tree, moves = 1, n = length(moves), k = NULL) { if (n == 1) { trees <- tree for (i in 1:moves) trees <- kSPR(trees, k = k) } else { trees <- vector("list", n) if (length(moves) == 1) moves <- rep(moves, n) for (j in 1:n) { tmp <- tree if (moves[j] > 0) { for (i in 1:moves[j]) tmp <- kSPR(tmp, k = k) } tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } kSPR <- function(tree, k = NULL) { if (Ntip(tree) < (4L - is.rooted(tree))) return(tree) l <- length(tree$tip.label) root <- getRoot(tree) distN <- dn(tree)[-c(1:l), -c(1:l)] distN[upper.tri(distN)] <- Inf dN <- distN[lower.tri(distN)] tab <- tabulate(dN) tab[1] <- tab[1] * 2 tab[-1] <- tab[-1] * 8 if (is.null(k)) k <- seq_along(tab) k <- na.omit( (seq_along(tab))[k]) if (length(k) > 1) k <- sample(seq_along(tab)[k], 1, prob = tab[k] / sum(tab[k])) if (k == 1) return(rNNI(tree, 1, 1)) index <- which(distN == k, arr.ind = TRUE) + l m <- dim(index)[1] if (m == 0) stop("k is chosen too big") ind <- index[sample(m, 1), ] s1 <- sample(c(1, 2), 1) if (s1 == 1) res <- oneOf4(tree, ind[1], ind[2], sample(c(1, 2), 1), sample(c(1, 2), 1), root) if (s1 == 2) res <- oneOf4(tree, ind[2], ind[1], sample(c(1, 2), 1), sample(c(1, 2), 1), root) res } oneOf4 <- function(tree, ind1, ind2, from = 1, to = 1, root) { if (!is.binary(tree)) stop("Sorry, trees must be binary!") tree <- reroot(tree, ind2, FALSE) kids1 <- Children(tree, ind1) anc <- Ancestors(tree, ind1, "all") l <- length(anc) kids2 <- Children(tree, ind2) kids2 <- kids2[kids2 != anc[l - 1]] child <- tree$edge[, 2] tmp <- numeric(max(tree$edge)) tmp[child] <- seq_along(child) edge <- tree$edge edge[tmp[kids1[-from]], 1] <- Ancestors(tree, ind1, "parent") edge[tmp[kids2[to]], 1] <- ind1 edge[tmp[ind1]] <- ind2 tree$edge <- edge attr(tree, "order") <- NULL tree <- reroot(tree, root, FALSE) tree } # faster than kSPR rSPR_Old <- function(tree, moves = 1, n = 1) { k <- length(tree$edge[, 1]) if (n == 1) { trees <- tree for (i in 1:moves) trees <- sprMove(trees, sample(k, 1)) } else { trees <- vector("list", n) for (j in 1:n) { tmp <- tree for (i in 1:moves) tmp <- sprMove(tmp, sample(k, 1)) tmp$tip.label <- NULL trees[[j]] <- tmp } attr(trees, "TipLabel") <- tree$tip.label class(trees) <- "multiPhylo" } trees } sprMove <- function(tree, m) { if (is.rooted(tree)) tree <- unroot(tree) if (!is.binary(tree)) stop("Sorry, trees must be binary!") changeEdge <- function(tree, new, old) { tree$edge[tree$edge == old] <- 0L tree$edge[tree$edge == new] <- old tree$edge[tree$edge == 0L] <- new # needed for unrooted trees tree <- collapse.singles(tree) tree } edge <- tree$edge k <- max(edge) nTips <- length(tree$tip.label) nEdges <- 2 * nTips - 3 if (m > nEdges) stop("m is chosen too big") parent <- edge[, 1] child <- edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] bp <- bip(tree) root <- parent[!match(parent, child, 0)][1] ch <- child[m] pa <- parent[m] candidates <- !logical(k) candidates[root] <- FALSE candidates[cv[[ch]]] <- FALSE candidates[cv[[pa]]] <- FALSE candidates[pv[pa]] <- FALSE candidates[pa] <- FALSE ind <- which(candidates) l <- sample(ind, 1) cr <- FALSE if (!any(is.na(match(bp[[l]], bp[[ch]])))) { newroot <- cv[[ch]] # [ 1] newroot <- newroot[newroot > nTips][1] tree <- reroot(tree, newroot, FALSE) edge <- tree$edge parent <- tree$edge[, 1] child <- tree$edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] tmp <- pa pa <- ch ch <- tmp cr <- TRUE } if (pa == root) { cp <- cv[[pa]] newroot <- cp[cp != ch] newroot <- newroot[newroot > nTips][1] tree <- reroot(tree, newroot, FALSE) edge <- tree$edge parent <- tree$edge[, 1] child <- tree$edge[, 2] pv <- integer(k) pv[child] <- parent cv <- list() for (i in unique(parent)) cv[[i]] <- child[parent == i] cr <- TRUE } el <- tree$edge.length cp <- cv[[pa]] sib <- cp[cp != ch] edge[child == l, 1] <- pa edge[child == pa, 1] <- pv[l] edge[child == sib, 1] <- pv[pa] el[child == sib] <- el[child == sib] + el[child == pa] el[child == l] <- el[child == l] / 2 el[child == pa] <- el[child == l] tree$edge <- edge tree$edge.length <- el if (cr) tree <- changeEdge(tree, root, newroot) tree <- reorder(tree, "postorder") tree } phangorn/R/discrete.gamma.R0000644000176200001440000003056214136526753015317 0ustar liggesusers#' Discrete Gamma function #' #' \code{discrete.gamma} internally used for the likelihood computations in #' \code{pml} or \code{optim.pml}. It is useful to understand how it works #' for simulation studies or in cases where . #' #' These functions are exported to be used in different packages so far only in #' the package coalescentMCMC, but are not intended for end user. Most of the #' functions call C code and are far less forgiving if the import is not what #' they expect than \code{pml}. #' #' @param shape Shape parameter of the gamma distribution. #' @param alpha Shape parameter of the gamma distribution. #' @param k Number of intervals of the discrete gamma distribution. #' @param inv Proportion of invariable sites. #' @param site.rate Indicates what type of gamma distribution to use. Options #' are "gamma" (Yang 1994) and "gamma_quadrature" using Laguerre quadrature #' approach of Felsenstein (2001) ## or "free_rate" "gamma_unbiased". #' @param edge.length Total edge length (sum of all edges in a tree). #' @param discrete logical whether to plot discrete (default) or continuous pdf or #' cdf. #' @param cdf logical whether to plot the cumulative distribution function #' or density / probability function. #' @param append logical; if TRUE only add to an existing plot. #' @param xlab a label for the x axis, defaults to a description of x. #' @param ylab a label for the y axis, defaults to a description of y. #' @param xlim the x limits of the plot. #' @param verticals logical; if TRUE, draw vertical lines at steps. #' @param \dots Further arguments passed to or from other methods. #' @return \code{discrete.gamma} returns a matrix. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml.fit}, \link{stepfun}} #' @examples #' discrete.gamma(1, 4) #' #' old.par <- par(no.readonly = TRUE) #' par(mfrow = c(2,1)) #' plot_gamma_plus_inv(shape=2, discrete = FALSE, cdf=FALSE) #' plot_gamma_plus_inv(shape=2, append = TRUE, cdf=FALSE) #' #' plot_gamma_plus_inv(shape=2, discrete = FALSE) #' plot_gamma_plus_inv(shape=2, append = TRUE) #' par(old.par) #' #' @keywords cluster #' #' @rdname discrete.gamma #' @export discrete.gamma <- function(alpha, k) { if (k == 1) return(1) quants <- qgamma( (1:(k - 1)) / k, shape = alpha, rate = alpha) diff(c(0, pgamma(quants * alpha, alpha + 1), 1)) * k } discrete.beta <- function(shape1, shape2, k) { qbeta( ( (0:(k - 1)) + .5) / k, shape1, shape2) } #' @rdname discrete.gamma #' @importFrom stats dgamma qgamma stepfun #' @importFrom graphics curve #' @export plot_gamma_plus_inv <- function(shape=1, inv=0, k=4, discrete=TRUE, cdf=TRUE, append=FALSE, xlab = "x", ylab=ifelse(cdf, "F(x)", "f(x)"), xlim=NULL, verticals=FALSE, edge.length=NULL, site.rate="gamma", ...){ l <- max(lengths(list(shape, k, inv))) if(l>1){ shape <- rep_len(shape, l) k <- rep_len(k, l) inv <- rep_len(inv, l) verticals <- rep_len(verticals, l) } gw <- function(shape, k, inv, site.rate){ gw <- rates_n_weights(shape, k, site.rate) g <- gw[, 1] w <- gw[, 2] if (inv > 0){ w <- c(inv, (1 - inv) * w) g <- c(0, g/(1 - inv)) } cbind(w=w, g=g) } g <- mapply(function(shape, k, inv) max(gw(shape, k, inv, site.rate)[,"g"]), shape, k, inv) |> max() if(is.null(xlim)) xlim <- c(-0.25, 1.25 * g) # pgamma_invariant cdf_fun <- function(x, shape=1, inv=0){ if(inv > 0) x <- x * (1-inv) y <- (1-inv) * pgamma(x, shape = shape, rate = shape) + inv y[x<0] <- 0 y } # dgamma_invariant density_fun <- function(x, shape, inv){ if(inv > 0) x <- x * (1-inv) (1-inv) * dgamma(x, shape = shape, rate = shape) } step_GpI <- function(alpha=1, k=4, inv=0, edge.length=NULL, site.rate="gamma"){ rw <- rates_n_weights(alpha, k, site.rate) g <- rw[, 1] w <- rw[, 2] if (inv > 0) w <- c(inv, (1 - inv) * w) cw <- cumsum(w) if (inv > 0) g <- c(0, g/(1 - inv)) if(!is.null(edge.length)) g <- g * edge.length stepfun(g, c(0, cw)) } plot_cdf_discrete <- function(shape=1, inv=0, k=4, verticals=FALSE, append=FALSE, ylab=ylab, xlim=xlim, edge.length=edge.length, site.rate="gamma", ...){ sf <- step_GpI(shape, inv, k=k, edge.length=edge.length, site.rate = site.rate) if(append) plot(sf, verticals=verticals, add=TRUE, xlim=xlim, ...) else plot(sf, verticals=verticals, ylab=ylab, xlim=xlim, ...) } plot_density_discrete <- function(shape=1, inv=0, k=4, append=FALSE, xlab=xlab, ylab=ylab, xlim=xlim, site.rate="gamma", ...){ g_w <- gw(shape, k, inv, site.rate) g <- g_w[, "g"] w <- g_w[, "w"] if(!append) plot(g, w, xlim = xlim, ylim=c(0, 1), type="n", xlab=xlab, ylab=ylab, ...) segments(g, 0, g, w, ...) points(g, w, ...) } plot_cdf_continuos <- function(shape=1, inv=0, k=4, verticals=FALSE, append=FALSE, ylab=ylab, xlim=xlim, site.rate="gamma",...){ if(inv==0){ if(!append) plot(function(x)cdf_fun(x, shape, inv), xlim[1], xlim[2], ylim=c(0, 1), xlab=xlab, ylab=ylab, ...) else plot(function(x)cdf_fun(x, shape, inv), add=TRUE, ...) } else{ g_w <- gw(shape, k, inv, site.rate) g <- g_w[, "g"] w <- g_w[, "w"] if(!append) plot(g, w, xlim = xlim, #c(-.5, 1.25 * max(g)), ylim=c(0, 1), type="n", xlab=xlab, ylab=ylab, ...) plot(function(x)cdf_fun(x, shape, inv), xlim[1], -.001, add=TRUE, ...) plot(function(x)cdf_fun(x, shape, inv), 0, xlim[2], add=TRUE, ...) points(0, inv, ...) if(verticals) segments(0, 0, 0, inv, ...) } } plot_density_continuous <- function(shape=1, inv=0, k=4, append=FALSE, xlab=xlab, ylab=ylab, xlim=xlim, ...){ if(!append) plot(function(x)density_fun(x, shape = shape, inv=inv), xlim[1], xlim[2], xlab=xlab, ylab=ylab, ...) else{ plot(function(x)density_fun(x, shape = shape, inv=inv), xlim[1], xlim[2], add=TRUE, ...) } if(inv>0){ segments(0, 0, 0, inv, ...) points(0, inv, ...) } } i <- 1L while(l >= i ){ if(cdf){ if(discrete){ plot_cdf_discrete(shape[i], inv[i], k[i], verticals = verticals[i], append = append, ylab = ylab, xlim=xlim, edge.length=edge.length, site.rate=site.rate, ...) } else{ plot_cdf_continuos(shape[i], inv[i], k[i], verticals = verticals[i], append = append, ylab = ylab, xlim=xlim, site.rate=site.rate,...) } } else{ if(discrete){ plot_density_discrete(shape[i], inv[i], k[i], append=append, xlab=xlab, ylab=ylab, xlim=xlim, site.rate=site.rate, ...) } else{ plot_density_continuous(shape[i], inv[i], k[i], append=append, xlab=xlab, ylab=ylab, xlim=xlim, ...) } } append <- TRUE i <- i+1L } } #' @rdname discrete.gamma #' @importFrom stats ecdf #' @importFrom graphics rug ## @importFrom statmod gauss.quad.prob #' @param obj an object of class pml #' @param main a main title for the plot. #' @param cdf.color color of the cdf. #' @export plotRates <- function(obj, cdf.color="blue", main="cdf", ...){ pscores <- parsimony(obj$tree, obj$data, site="site")[attr(obj$data, "index")] ecdf_pscores <- ecdf(pscores) plot(ecdf_pscores, verticals = TRUE, do.points=FALSE, main=main, ...) rug(jitter(pscores)) # rug(sort(unique(pscores))) el <- obj$tree$edge.length xlim <- c(-.25, 1.1 * max(pscores)) plot_gamma_plus_inv(k=obj$k, shape=obj$shape, inv=obj$inv, append=TRUE, xlim = xlim, edge.length=sum(el), verticals=TRUE, col=cdf.color, site.rate=obj$site.rate, ...) } # from selac LaguerreQuad <- function(shape=1, ncats=4) { # Determine rates based on alpha and the number of bins # bins roots normalized to 1 of the General Laguerre Quadrature # first ncats elements are rates with mean 1 # second ncats elements are probabilities with sum 1 roots <- findRoots(shape - 1, ncats) weights <- numeric(ncats) f <- prod(1 + (shape - 1)/(1:ncats)) for (i in 1:ncats) { weights[i] <- f * roots[i] / ((ncats + 1)^2 * Laguerre(roots[i], shape - 1, ncats + 1)^2) } roots <- roots/shape return(matrix(c(roots, weights), ncol=2L, dimnames = list(NULL, c("rate", "weight")))) } # needs to be fixed #LogNormalQuad <- function(shape, ncats){ # s = shape # m = -(s^2)/2 # pp <- gauss.quad.prob(ncats, dist="normal", mu=m, sigma=s) # matrix(c(exp(pp$nodes/m), pp$weights), ncol=2L, # dimnames = list(NULL, c("rate", "weight"))) #} findRoots <- function(shape, ncats) { # Determine rates based on Gamma's alpha and the number of bins # bins roots normalized to 1 of the General Laguerre Polynomial (GLP) coeff <- integer(ncats + 1) for (i in 0:ncats) { # coeff[i + 1] <- (-1)^i*nChooseK(ncats + shape, ncats - i)/factorial(i) coeff[i + 1] <- (-1)^i * exp(lchoose(ncats + shape, ncats - i) - lfactorial(i)) } return(sort(Re(polyroot(coeff)))) } Laguerre <- function(x, shape, degree) { y <- 0 for (i in 0:degree) { y <- y + (-1)^i * x^i * exp(lchoose(degree + shape, degree - i) - lfactorial(i)) } return(y) } #Took this from R.basic -- the C version did not work when LaguerreQuad was #called internally. Adding this function fixed this issue (JMB 9-29-2016). #nChooseK <- function(n, k, log=FALSE) { # nChooseK0 <- function(n, k) { # if((n == k) || (k==0)) # return(1) # m <- min(k, n-k) # prod(seq(from=n, to=(n-m+1), by=-1)/(seq(from=m, to=1, by=-1))) # } # Process the arguments # if (is.logical(log)) { # if (log == TRUE) # log <- exp(1) # else # log <- NULL # } # Repeat n or k to make the of equal length. # nn <- length(n) # nk <- length(k) # if (nn > nk) { # k <- rep(k, length.out=nn) # nk <- nn # } else if (nn < nk) { # n <- rep(n, length.out=nk) # nn <- nk # } # if (is.null(log)) { # gamma(n+1) / (gamma(n-k+1) * gamma(k+1)) # } else { # (lgamma(n+1) - (lgamma(n-k+1) + lgamma(k+1))) / log(log) # } #} rates_n_weights <- function(shape, k, site.rate = "gamma"){ site.rate <- match.arg(site.rate, c("gamma", "gamma_unbiased", "gamma_quadrature", "free_rate")) if(k==1) rates.and.weights <- matrix(c(1,1), ncol=2L, dimnames = list(NULL, c("rate", "weight"))) else{ if(site.rate == "gamma"){ g <- discrete.gamma(shape, k=k) w <- rep(1 / k, k) rates.and.weights <- matrix( c(g, w), ncol=2L, dimnames = list(NULL, c("rate", "weight"))) } if(site.rate == "gamma_unbiased"){ rates.and.weights <- discrete.gamma.2(alpha=shape, k=k) } if(site.rate == "gamma_quadrature") rates.and.weights <- LaguerreQuad(shape=shape, k) if(site.rate == "free_rate"){ g <- rep(1, k) w <- rep(1 / k, k) rates.and.weights <- matrix( c(g, w), ncol=2L, dimnames = list(NULL, c("rate", "weight"))) } } rates.and.weights } discrete.gamma.2 <- function(alpha, k){ if (k == 1) return(list(w=1, g=1)) bin <- c(rep(0, k), 1) quants <- rep(0, k+1) quants[k+1] <- 1 for(i in 2:k){ old_bin <- bin[i-1] fun <- function(x, k, alpha, old_bin){ quants <- qgamma(c(old_bin, x), shape = alpha, rate = alpha) tmp <- diff(pgamma(quants * alpha, alpha + 1)) * (1 / (x-old_bin)) abs( (x - old_bin) * tmp - 1/k ) } res <- optimize(fun, k=k, alpha=alpha, old_bin=old_bin, interval=c(old_bin, 1), tol = .Machine$double.eps^0.5) bin[i] <- res$minimum } w <- diff(bin) quants <- qgamma( bin[seq_len(k)], shape = alpha, rate = alpha) g <- diff(c(pgamma(quants * alpha, alpha + 1), 1)) * (1/w) matrix(c(g, w), ncol=2L, dimnames = list(NULL, c("rate", "weight"))) } # free_rate <- function(k) nur optimisieren phangorn/R/lento.R0000644000176200001440000000600413707232051013533 0ustar liggesusers#' Lento plot #' #' The lento plot represents support and conflict of splits/bipartitions. #' #' #' @param obj an object of class phylo, multiPhylo or splits #' @param xlim graphical parameter #' @param ylim graphical parameter #' @param main graphical parameter #' @param sub graphical parameter #' @param xlab graphical parameter #' @param ylab graphical parameter #' @param bipart plot bipartition information. #' @param trivial logical, whether to present trivial splits (default is #' FALSE). #' @param col color for the splits / bipartition. #' @param \dots Further arguments passed to or from other methods. #' @return lento returns a plot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{as.splits}, \link{hadamard}} #' @references Lento, G.M., Hickson, R.E., Chambers G.K., and Penny, D. (1995) #' Use of spectral analysis to test hypotheses on the origin of pinninpeds. #' \emph{Molecular Biology and Evolution}, \bold{12}, 28-52. #' @keywords cluster plot #' @examples #' #' data(yeast) #' yeast.ry <- acgt2ry(yeast) #' splits.h <- h2st(yeast.ry) #' lento(splits.h, trivial=TRUE) #' #' @export lento lento <- function(obj, xlim = NULL, ylim = NULL, main = "Lento plot", sub = NULL, xlab = NULL, ylab = NULL, bipart = TRUE, trivial = FALSE, col = rgb(0, 0, 0, .5), ...) { if (inherits(obj, "phylo")) { if (inherits(obj, "phylo", TRUE) == 1) obj <- as.splits(obj)[obj$edge[, 2]] obj <- as.splits(obj) } if (inherits(obj, "multiPhylo")) obj <- as.splits(obj) labels <- attr(obj, "labels") l <- length(labels) if (!trivial) { triv <- lengths(obj) ind <- logical(length(obj)) ind[(triv > 1) & (triv < (l - 1))] <- TRUE if (length(col) == length(obj)) col <- col[ind] obj <- obj[ind] } CM <- compatible(obj) support <- attr(obj, "weights") if (is.null(support)) support <- rep(1, length(obj)) conflict <- -as.matrix(CM) %*% support n <- length(support) if (is.null(ylim)) { eps <- (max(support) - min(conflict)) * 0.05 ylim <- c(min(conflict) - eps, max(support) + eps) } if (is.null(xlim)) { xlim <- c(0, n + 1) } ord <- order(support, decreasing = TRUE) support <- support[ord] conflict <- conflict[ord] if (length(col) == length(obj)) col <- col[ord] plot.new() plot.window(xlim, ylim) title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) segments(0:(n - 1), support, y1 = conflict, ...) segments(1:n, support, y1 = conflict, ...) segments(0:(n - 1), support, x1 = 1:n, ...) segments(0:(n - 1), conflict, x1 = 1:n, ...) abline(h = 0) axis(2, ...) aty <- diff(ylim) / (l + 1) at <- min(ylim) + (1:l) * aty if (bipart) { Y <- rep(at, n) X <- rep( (1:n) - .5, each = l) Circles <- matrix(1, l, n) for (i in 1:n) Circles[obj[[ord[i]]], i] <- 19 col <- rep(col, each = l) text(x = n + .1, y = at, labels, pos = 4, ...) points(X, Y, pch = as.numeric(Circles), col = col, ...) } invisible(list(support = cbind(support, conflict), splits = obj[ord])) } phangorn/R/sysdata.rda0000644000176200001440000005115214140520651014431 0ustar liggesusers=<8R=(y[>Ą6O&F/y+k/ﮆ´ owOַCzS+棵P<¼"gIE wOM\, yLww*@^@rܣwv9UsNO7cAYِ= -JU5:6.ڕgZksK@c↕B | /$9!WWqyбoߛ1>K!ر(fhq7*ݞ`  I|m;!c5,bǧ ;ph}(zؿ01x rЩ\#7cNěe38%bu]WC*mbHi5ㆆ8>n@NiޜQ ~cX /ΧCRMTgA%YTM8* e 郋52V+CG'P?t;o'L[hZif퇬q1S=3kYC^Td?xRV UIwL!]h{\˧WjA'CN.ZQePѼ$Zk..ZO&7BeP?uA^sl9qe-̞ yFűt7wXCSNQ @݌o$Zk Bdb>AO#!"+;{O>H`ykY Snd %rw2#c(vwOX(cA +^`K00KyO% H /FsTl::}wT +9Z9%npO7omJ:.wAJl?P?NwǮ\ShlWpp88to[ίi&A4غG~A ?A?hm?np?}`]:J1|F`ran*̂jWmDO{{UHQLB*90J') wP C(]; iJl Hò$\}L[+\_}J(]p'A#H=$^Q i Ϡ$"Fjv J(]uXGp%*" \PQfXۻ7_/@H$<䙋"41<!/ԊIx w0 Hv$TAfAD߭Do9q{btyI7Dr#:"NHlf! 7r(] noQ y棸K޻X.\M2U7NnOP>-Qܛ*$܁AQ|}_OB4"9Q==i:j <³B޽믋|$܂7#,fp#⯃G8eB} z]F/񸠌)>(T?n_Fw=w错Og*ˋgU~g̾m`8H8^hnhfЫthkgn/3-e`wZa'V%b;5p%T^zzo(gR,tOPf*.\O3aGg^S 2@w+-d(}!(%*E @,BPAw>KʁAPH><؂F[4rYK߅說-+_X<|^ѫ>*(2 r'hQw ? 4txYx}iJ4JaJo>u gjvp:^O[)"zx,\_|))4xM "b{K:xفvvN˩H\,'O6AqP(  M[M&(0~@w IFlxZo[2xI˅* hFB]otq /qGdzzLׁ ,B~FwFԥ*7ĻNh7km[֒jΡMpoMlp4y۠^2 opaAڬ,ഽL㖕IM=3_Njԫ/lgK[L%<]\)!mgw4K?k{Իԓa'kVSk-VH[C1|Vs~f.c}$$ϭ{YLeUY14 9Ms9<*Zqfo&d b/7[cST)y/Aw;9d;SpmJ~r"Ѣ3xȥRy#WŰE P&~b0DeZ?&FV:>rS lSSeB^Fbn1{,ocҺWyr}H_HV5gDL.x&В·N?&Ogrh.˪Zw$3ۇ^l]Gɩ̤jP̔O wvB^fYŠKՌUO>  ϓ"vG;] %$dݧou_`*Nvnhf #崡&3#;Hz~_Qpfʑt4"}6>1mx}b3F2!<ui!Ru)Z8JJL)C+[EHO |f}M xW\uIfK=Zu έPm9lq0+;(HPXLyg~nxu4KȊQz%?e!c(Y䜲mj `.`]7ެ|rT-ݩ sA=xr,4P^ָ0F=({BI[Z<܏`uۯ1M>/nݐ9D4'vH XȜ|7l}ǐ,[kEp8\ZYNeEb [q KxsX(<֢7l< u%WQAehFB) 4}|h=|J~D "7oP{{_IX,r^g;9uf<`:ͮC u02F@~7 -P!DtqJM੓]SUV taqd+bu?^Ǎ|:LO6s~Ȳ|XYg/}L +J|Z:.6sܴmK%H63.?ٷx81lUۭu6}S=-0 Mt&m1C+: FmBi:V0e#ystP[j}XH͖!xE^X9i˟^yGѳM3ʴ7-+A>P)8ƝKc'xU95`BԔ!0~Uz# =lk̫kAMY r4Ya#P=ڀJ#4ηK`,lؼk\,0,y\ԲTx$b;yrEp _jOoWIx H4pjMx(;1&UdGB&@l9(S1I6e9{W>}̆ { gpoid& ;?&ZrФM1 |<I_i?M9:?VloɀYs?ZBྲྀ78y\l`=&tUy. B7gOՃ%ngx$3-+Y׼T0>{WZ. f#‹z΅n&[hUK)t\tjcJv|HD~wqOdMT"s 1dPNe&Ab6fH#a+%?sb1t Ȫ}/ p_\q n4*qz4ږ7 ^=&3YsU #N4tGf1 Yfy}ÆwJEL pm˖A\`_wlUydg=xu_% b zM;g"m}Dk*8EURkoQ[R}5}#{Jɼ^ah<5'Y=8}bxj~8w'Wxq%_%.zx,E˃fcAoC}t'k3θQ#nQU߷}\wPq3{sTzf<%|tbJI0*flYE_WjNob//s8!#5UA>g{}bBkO#\; r>_q^fs J<$jQ^o7>~ ΃NScynnZvqyf$4FoyLg*^{hYփOʌO=}!a|Vm1xiR Qh>aΣnSsg% ՄLW-p*̻:WÙD "&*9 م[FʹdBkzMLN-4Kjt\V>-oP nO:/f9:v7['{ wfǍL>- \ 09eqڞ+S~k*y҂ެ4BLUl}e;^_v ]NGo]Bogo0§-xfh4k>ՏZlY-5׊\DW2v$\ <mX |-^_.SL8|r 3vICF10Oqi1XX6 \/:jܪRϋViaɤgC stb \׳DPlS G[Ej?r"# u3O2DG,5ڧO,J;ZNqv \u{cb (UM,#EdTdDn&=mf\Px'P9!Q@Ko _nŧKy^?g/;nwAZn!fH,r8xxl^l鹓>]8w:S%Lqv9bYܤᨉ<'Qo&G0a/#f0G2o߬/1f{S޾CL}1jn>ēIv9evTxmmШ[hc'Ӈv&.::C.!? >|,6uO~.s\{S)}(?EVo+czs5ַ?c"\turv1'Xw_e|gLIK v8MI=w`W4@qQk*o@BI]İ!FVǞ$G5FA aD9G[]Yc\jbұvzÞ`_'҂sCq^art U(a:̏&.Ic@M99 av#0w=Q| MCc7.ltX>\?'Fq<%z=vQOD@ݱ\.#<<b>cq/TGs%.j6lEw7Oʚ%fK?ւSၗ>d '=\3qX,x|ff rG1cul4pRK|]Gz5WF~ bJBh؂)p"κgOլSJͮDp 3(ts&y{4F~/@%<6vX)Lt.2rfܸ 9N\K<+K GۮC)*y4H=6ъV5HCܱ@d^Qs1XepU4 SQO:o:eE[!s !sFfho?B`_|R_YANƤi% Mڶ@ݲSxgMT*Pu[7AYy{+]̜ېqbgqw"uy 2r T\,҇ JO ^g8*/'jXKe,^@e֯zZZ'!bKVMuU|+ Z3Y:KV'R-{^ wu@^!f!,oxW@Lbk;̱ģ uGZ\70o!meĝ"*߮n#@wwP/y|ȟç{;$OYA朥G>ANqq7z8;3Ň΄yBRBfV&Č5})qܳw\-\o57S`ỞTF]1n˲dNއ%18wC7_ɷX}K\o bb05818ݾU ZӫEMhV}OJ'\8%679@qTe}yKI41ACRuy"7 Ό([gU>I =32G mWh2>sA֢<-ApIg+W*t8:&*Hx1۳q)x=$.ڨU/VH·*7[ԐHQt::&$P 5糹ZD2*u^qrNqi4G+Cmcd8َWk"du B}>:R]*tMv7I9Dh9d Hp?kY /M0<ڱmڛhH=?`Wp ҡ&/=:Y&]{[dg4do:J3_=}-ΛLȫ?E`945gfWҦ^}_ -:,g9!@`Ľz.&^_2诈k$ՎntFt|aQk29W s CG_8HUmJu [y p%q]b\pT?RP=Ȱkgr6rbAP${xtUZkrƒ9p'p+/>:oGUp~^"p8<;Jҗp65}f|UV"h˥{C:֑ 7NEkZ{cNvD&4E߅VAԜ{Sڲ WzQP"0#o6)a*-uxYV]3|VB:9wX iKLx7d+#Gh׏ )ɌGZ𲥲0Qj4T#D,_TgrVs/9E.3kZڇN(ڐ%xSt1hkXGBig8-)r1 ~Fiܮl4tnh//+Rk*L\# Y]5ANiX3^kNlC.|.uL% #{+.ZvoԂ=qJ`s(~jyz>5x[{aOHB{u[2u,s<9CS.OItlxmKY'ZԦAx;4!>򗯓脻*@fip^9Rj TTRɶ >oYn9+wT23}`}nb#9J ,EYgṽg9yp̤uB)ksB+\$)KgiVY IbV0Wfc5ŭ] tM]sWb~Hl%s܄/ݎt{൒nɓz{7ENa X=[tAxN2jM9@z;sYzu3|O-a$g)s$gD5 /GI )~y`)Κd9C镠bC~۠{}噜cXۣ}94YS(](`aʔ\[e Q%=oߵ' @^9۽SXS PBrm-ѾioћKoWOGzC9hBhsI?B$qx_ 0 "HH~QG(}?h:WGϤIGu=)>?ޏt<=I#EDo=x_c}de1~ eiK xiq #/Ei7U86ѤB:ڗı\xƮ>kygOsMyqS^|(Bћ6M: 6B7w# FR](kߕ .x'Q | AN83 S -HH M9 AONk#IU1\v#qtM݁+NOd醚`DvPy}Vn^W0I;D@`1i2qpAx!pYP<9~7'rpt$Rtx|h*x n?0YS56 l |t(yQןOGo THhI:)(xxbI$%PұqN3Q҅oE祉b$GAˇ?pi|tmSy +Ah?Jy<?O||=^4-x7 =&{GEPxExѰ /J;}!_ocmLjqCɿ;+bgBi0l(~/#H;b<㏲[lW4^Q4үq4ċ|/ , 5{x<ŋr'{[^@s /a'[t\i'|gh3)p ] z}'+:e" 8(zn+S`wOYO&xIH<\l6g6=U#Nt/%\ts}Ɵ=Y隬Wm+g^(sX@qX-!m:wb깞OҝQywH&&3x r5](5K$qdg2j<oɚMcCp0IWݕ4.~GNJnMQZp"x'@Hq&G~>Nx\Hx1VP;9n%(+|M*})՜DLNO(rI!y͗zm?A;,Og';7GnyϧNb)IgJ?(S{YA@v%qyd;CÒ</y$%{| Y5^':LAomZ$}|5d}$QONo B5IGj+r+'ۉǏ܁O΍ڃ]>ӈLmz Y>dk#YMu=%${9cR~~Hע%o%2TO!so!;G/M`=Iw05D"ҞVv kS1ZT~!2JB+jvOc.DRS3#{@<ԣ2_v4IxKGc)2Æ G(OH#][Sݴ/|d8{-pk7-T}8~硍ru><@BNͨ_!}Kn!Jd?}NGrX4H^4ݮl2Ӑ<_ITa;%P=P=QR߭O02W=mt'ZolЀ" nq`=tG`;rRya"{]12iĭ*{D\/=l85cfiC&izDak Ww7?=Ly#ǂF]y?}Kx&F8:m(R/lT>J122|.ސB + >ǡxo@ў0'xA70>"+3tUpP`Yk2GH” DžmR 4S2r&>X4|w>xxOw>+NEʔ }\; ˣBCHhq! SO/t=Y/72{yI vu_7Qܪ)$pΆ 9t oxth7zGzPcl}{ˉ7<@BYzeC{!`[~s( +_4(;*=+m<Cv#| cXN| /ܸ-ӱ7#՞Fqg4Y*0G?ݽM. ^z},#xon5n>VdE'QS۶.;ipG<ﳟN+!|mXgO֌l ^O AZ˔<݈:6P:%g}WJ$OHC=?r_232سی k͋L  u!nk>xR7k]p@]n񊫽y3fxJdS0xoKps@+77mJCC(ZAzvHf Q-XqmHar(hs@Ewg-~x( =xUR(8uߕ>l&L m 5ͦWYrV3@Pj!4^,'~ڗ8#$n;z>h 2z@@p^+E֜sKg>o~.8,.[_AS^Bl8ݻg IGGna{${%cy켱,tlӀpA;\_!2< ,Ntf*ނ ηpv&ht<]l逽aN/2EL:Gc5c*|`^ M;"7 cMhV!MĔ!EF&\}2mO;x3ε_sVA`:$پ1p; M̃NGl/G͎3]Cn11sdȴ f^g"JVkC X▒gwR6Y37(kw{!>T(Lpzt-u\x*`x}[뭼hl)A.U \tkώuڑͳር//2]`Z<9dw!/ W!!rKN-Qwk$bBb$sm)#; ` t ~}D^Ah+౯ꑙmF!iv^B͸k P}JX >Wo _!YF5wI bse- dWqVm>ox8poP?Cg6 kd{6wD/o#_V3 [ւCx [upBm%A}X8SW+1t|xFO=<]4ttY 5R2/%A'2snG77a|nh.'COx$=m= w-7Mo3pTT%fܱwO}CV+oLP{"npM!(=UrD,l&>K|ES*B]qeWUaiWѽ>Ȕl<-Ob φZIl5j{X Е643I/H6CQn'N~^aQ& 8eF镛Bd݆CccLԼ"bqAIx2yW!<}< ;Ǽ.mONE$3ݲv<>s ȟr>,צJANGGD ⶨur.d<԰q"DaP'4_p@Uiﺦ>YT`,+^^P"u^vPE.!+.,ɺ1 9 ]4T H}9e nm^js`TL['5uHVNn/(o>si~t*W{F'B֥Dб)ȑk,Dvߙ%EB+[=k)Qxhr("BŚEֻAWZvxHK~'ڮ:ў2^i6_hC<ݢ12_Gxw|65إ]:KGu-UY!͊W,w܇Nv̂2@a7NbZWt/ `鹁y!9wGxE&;?Bc@yݢ=ED6u%Ԗ ߂g㲡$F+\}xrg |U~DވbPI-adت30,Mb9SΙ -+w__Ŧnt99(wGAg3#!ڝ.Bt/\@洳WSOX΁)r= pb<bo.xg4 lc\S, [F W &P9xvVr&J8 -ppI l[,f/3GO%઻[7ֽ ^FzθGr /߂7%S5Ćd Å̗SA?(|9em>)_NxX/,5_+Ö/(|~'_NYe ))}e~~ZK׌?6z Ͽ~oc?6|9wezk->`?Oug`+g`O_χk~d?/O Ͽ~0h?W?4GյNGc"iBUݧ;"G5&QFUQqըT\M*&WOէSq)jTyըQUʫFW*U^5jTyըQUʫFW*U^5Ty5jRդʫIW*&U^MTy5jRդʫIW*&U^MTySէʫOW*>U^}TySէʫOW*>U^}+[!{ƶ>R]cơC;ijd3R@i{ɮIG=A!;9wU |Mw#wf;5hΠ^eCӞ)AfNE2 k`%kiKyz_KvW4:Rv<2wo~ ]Gƃ!.5u' ]t5ϐI_; _[ƃ!.=k D_ G~F]gkmL?J{K:~}ῠo}_3}o}_/{ǃo}_/[ޙƷ/I:G_C[ :5͏Cŏd;_?=~~g4~I_/t g|x?Wx}oMu~ƺY_;(A{t-4~ƚGޡuWGG?h|~׾/qT{K:~}ῠo}_:g}Ὺ~ /;CgWuϐA߻weU2w8w0`ÇBZS˧?JW?~4 ϡC|'>0`?|/GÀ:WU vṡ0`?_>a~/W{ #|[ -A߭ |73 } ed =%n; >пw_SI7 _BAeeO ?B }Z<&À` Dm-߻~w =%.;?@ T~oT~?~S -4D??A?) @3$~- D??6@3_Kk~ D?? ~??|iz D_ߊѿ5q|+ޯ DWߊѿ54@˿ѿxѿxѿxѿxZen>_ D~7/ϗѿxZe@/?Ÿ_"&::]û*Asvtt&:.ȨJ}T>jR)jT\5*WIդjRq5T\}*>WFW*U^5jTyըQUʫFW*U^5jTyըQUʫIW*&U^MTy5jRդʫIW*&U^MTy5jRդʫOW*>U^}TySէʫOW*>U^}TySwaǝUIQTphangorn/R/pmlPart.R0000644000176200001440000007125114010766553014046 0ustar liggesusers# # pmlPart + pmlCluster # optimPartQGeneral <- function(object, Q = c(1, 1, 1, 1, 1, 1), subs = rep(1, length(Q)), ...) { m <- length(Q) n <- max(subs) ab <- numeric(n) for (i in 1:n) ab[i] <- log(Q[which(subs == i)[1]]) fn <- function(ab, object, m, n, subs, ...) { Q <- numeric(m) for (i in 1:n) Q[subs == i] <- ab[i] Q <- exp(Q) result <- 0 for (i in seq_along(object)) result <- result + update(object[[i]], Q = Q, ...)$logLik result } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = Inf, control = list(fnscale = -1, maxit = 25), object = object, m = m, n = n, subs = subs, ...) Q <- rep(1, m) for (i in 1:n) Q[subs == i] <- exp(res[[1]][i]) res[[1]] <- Q res } optimPartBf <- function(object, bf = c(0.25, 0.25, 0.25, 0.25), ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, object, ...) { result <- 0 bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) n <- length(object) for (i in 1:n) result <- result + update(object[[i]], bf = bf, ...)$logLik result } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500), object, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) } optimPartInv <- function(object, inv = 0.01, ...) { fn <- function(inv, object, ...) { result <- 0 n <- length(object) for (i in 1:n) result <- result + update(object[[i]], inv = inv, ...)$logLik result } res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = 1e-04, object, ...) res[[1]] } optimPartGamma <- function(object, shape = 1, ...) { fn <- function(shape, object, ...) { result <- 0 n <- length(object) for (i in 1:n) result <- result + update(object[[i]], shape = shape, ...)$logLik result } res <- optimize(f = fn, interval = c(0, 100), lower = 0, upper = 100, maximum = TRUE, tol = 0.01, object, ...) res } dltmp <- function(fit, i = 1, transform = transform) { tree <- fit$tree data <- getCols(fit$data, tree$tip.label) if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") q <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- max(edge) dat <- vector(mode = "list", length = m) eig <- fit$eig w <- fit$w[i] g <- fit$g[i] bf <- fit$bf el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) dat[(q + 1):m] <- .Call("LogLik2", data, P, nr, nc, node, edge, nTips, mNodes, contrast, nco) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 datp <- vector("list", m) el <- tree$edge.length if (transform) dP <- getdP(tree$edge.length, eig, g) else dP <- getdP2(tree$edge.length, eig, g) datp[(nTips + 1)] <- dat[(nTips + 1)] l <- length(child) dl <- matrix(0, nr, l) for (j in (m - 1):1) { # tips have factor format, internal edges are matrices if (child[j] > nTips) { tmp2 <- (datp[[parent[j]]] / (dat[[child[j]]] %*% P[[j]])) dl[, j] <- (tmp2 * (dat[[child[j]]] %*% dP[[j]])) %*% (w * bf) datp[[child[j]]] <- (tmp2 %*% P[[j]]) * dat[[child[j]]] } else { tmp2 <- datp[[parent[j]]] / ((contrast %*% P[[j]])[data[[child[j]]], ]) dl[, j] <- (tmp2 * ((contrast %*% dP[[j]])[data[[child[j]]], ])) %*% (w * bf) } } dl } dl <- function(x, transform = TRUE) { l <- length(x$w) dl <- dltmp(x, 1, transform) i <- 2 while (i < (l + 1)) { dl <- dl + dltmp(x, i, transform) i <- i + 1 } dl } # add control and change edge optimPartEdge <- function(object, ...) { tree <- object[[1]]$tree theta <- tree$edge.length theta <- pmax(theta, 1e-8) tree$edge.length <- theta tmptree <- tree n <- length(object) l <- length(theta) nrv <- numeric(n) for (i in 1:n) nrv[i] <- attr(object[[i]]$data, "nr") cnr <- cumsum(c(0, nrv)) weight <- numeric(sum(nrv)) dl <- matrix(NA, sum(nrv), l) for (i in 1:n) weight[(cnr[i] + 1):cnr[i + 1]] <- attr(object[[i]]$data, "weight") ll0 <- 0 for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) for (i in 1:n) ll0 <- ll0 + object[[i]]$logLik eps <- 1 scalep <- 1 k <- 1 while (eps > 0.001 & k < 50) { if (scalep == 1) { for (i in 1:n) { lv <- drop(exp(object[[i]]$siteLik)) dl[(cnr[i] + 1):cnr[i + 1], ] <- dl(object[[i]], TRUE) / lv } sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) + diag(l) * 1e-10 # add small ridge penalty for numerical stability } thetaNew <- log(theta) + scalep * solve(F, sc) thetaNew <- pmax(thetaNew, log(1e-8)) tmptree$edge.length <- as.numeric(exp(thetaNew)) for (i in 1:n) object[[i]] <- update(object[[i]], tree = tmptree) ll1 <- 0 for (i in 1:n) ll1 <- ll1 + object[[i]]$logLik eps <- ll1 - ll0 if (eps < 0 || is.nan(eps)) { scalep <- scalep / 2 eps <- 1 thetaNew <- log(theta) ll1 <- ll0 } else { scalep <- 1 tree <- tmptree } theta <- exp(thetaNew) theta <- pmax(theta, 1e-8) ll0 <- ll1 k <- k + 1 } for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) object } makePart <- function(fit, rooted, weight = ~index + genes) { if (inherits(fit, "phyDat")) { x <- fit dm <- dist.ml(x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) fit <- pml(tree, x, k = 4) } dat <- fit$data if (class(weight)[1] == "formula") weight <- xtabs(weight, data = attr(dat, "index")) fits <- NULL for (i in 1:dim(weight)[2]) { ind <- which(weight[, i] > 0) dat2 <- getRows(dat, ind) attr(dat2, "weight") <- weight[ind, i] fits[[i]] <- update(fit, data = dat2) } names(fits) <- colnames(fits) fits } #' @rdname pmlPart #' @export multiphyDat2pmlPart <- function(x, rooted = FALSE, ...) { shared_tree <- TRUE if (shared_tree) { concatenate_x <- do.call(cbind.phyDat, x@seq) dm <- dist.ml(concatenate_x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) } else tree <- NULL fun <- function(x, rooted = FALSE, tree, ...) { if (is.null(tree)) { dm <- dist.ml(x) if (!rooted) tree <- NJ(dm) else tree <- upgma(dm) } pml(tree, x, ...) } fits <- lapply(x@seq, fun, tree = tree, rooted = rooted, ...) fits } #' @rdname pmlPart #' @export pmlPart2multiPhylo <- function(x) { res <- lapply(x$fits, FUN = function(x) x$tree) class(res) <- "multiPhylo" res } #' @export plot.pmlPart <- function(x, ...) { plot(pmlPart2multiPhylo(x), ...) } #' Partition model. #' #' Model to estimate phylogenies for partitioned data. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' partitions, on the right the parameter which are optimized specific to each #' partition. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameters can be used only once in the #' formula. \code{"rate"} is only available for the right side of the formula. #' #' For partitions with different edge weights, but same topology, \code{pmlPen} #' can try to find more parsimonious models (see example). #' #' \code{pmlPart2multiPhylo} is a convenience function to extract the trees out #' of a \code{pmlPart} object. #' #' @aliases pmlPart #' @param formula a formula object (see details). #' @param object an object of class \code{pml} or a list of objects of class #' \code{pml} . #' @param control A list of parameters for controlling the fitting process. #' @param model A vector containing the models containing a model for each #' partition. #' @param rooted Are the gene trees rooted (ultrametric) or unrooted. #' @param \dots Further arguments passed to or from other methods. #' @param x an object of class \code{pmlPart} #' @return \code{kcluster} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees #' during the optimization.} \item{object}{an object of class \code{"pml"} or #' \code{"pmlPart"}} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso #' \code{\link{pml}},\code{\link{pmlCluster}},\code{\link{pmlMix}},\code{\link{SH.test}} #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.logDet(yeast) #' tree <- NJ(dm) #' fit <- pml(tree,yeast) #' fits <- optim.pml(fit) #' #' weight=xtabs(~ index+genes,attr(yeast, "index"))[,1:10] #' #' sp <- pmlPart(edge ~ rate + inv, fits, weight=weight) #' sp #' #' \dontrun{ #' sp2 <- pmlPart(~ edge + inv, fits, weight=weight) #' sp2 #' AIC(sp2) #' #' sp3 <- pmlPen(sp2, lambda = 2) #' AIC(sp3) #' } #' #' @rdname pmlPart #' @export pmlPart pmlPart <- function(formula, object, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1), model = NULL, rooted = FALSE, ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllNNI <- !is.na(optAll[1]) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) PartNni <- !is.na(optPart[1]) PartBf <- !is.na(optPart[2]) PartQ <- !is.na(optPart[3]) PartInv <- !is.na(optPart[4]) PartGamma <- !is.na(optPart[5]) PartEdge <- !is.na(optPart[6]) PartRate <- !is.na(optPart[7]) if (PartNni) PartEdge <- TRUE if(AllNNI) AllEdge <- TRUE if (inherits(object, "multiphyDat")) { if (AllNNI || AllEdge) object <- do.call(cbind.phyDat, object@seq) else fits <- multiphyDat2pmlPart(object, rooted = rooted, ...) } if (inherits(object, "pml")) fits <- makePart(object, rooted = rooted, ...) if (inherits(object, "phyDat")) fits <- makePart(object, rooted = rooted, ...) if (inherits(object, "pmlPart")) fits <- object$fits if (inherits(object, "list")) fits <- object if(AllNNI) if(Ntip(fits[[1]]$tree) < (3 + !rooted)) AllNNI <- FALSE trace <- control$trace epsilon <- control$epsilon maxit <- control$maxit p <- length(fits) # if(length(model) 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 # rates if (PartEdge) df[1, 2] <- p if (PartGamma) df[2, 2] <- p if (PartInv) df[3, 2] <- p if (PartBf) df[4, 2] <- p if (PartQ) df[5, 2] <- p if (PartRate) df[6, 1] <- p - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) object <- list(logLik = logLik, fits = fits, call = call, df = df) class(object) <- "pmlPart" return(object) }) while (eps > epsilon & m < maxit) { loli <- 0 if (any(c(PartNni, PartBf, PartInv, PartQ, PartGamma, PartEdge, PartRate))){ for (i in 1:p) { fits[[i]] <- optim.pml(fits[[i]], optNni = PartNni, optBf = PartBf, optQ = PartQ, optInv = PartInv, optGamma = PartGamma, optEdge = PartEdge, optRate = PartRate, optRooted = rooted, control = pml.control(maxit = 3, epsilon = 1e-8, trace - 1), model = model[i]) } } if (AllQ) { Q <- fits[[1]]$Q subs <- c(1:(length(Q) - 1), 0) newQ <- optimPartQGeneral(fits, Q = Q, subs = subs) for (i in 1:p) fits[[i]] <- update(fits[[i]], Q = newQ[[1]]) } if (AllBf) { bf <- fits[[1]]$bf newBf <- optimPartBf(fits, bf = bf) for (i in 1:p) fits[[i]] <- update(fits[[i]], bf = newBf) } if (AllInv) { inv <- fits[[1]]$inv newInv <- optimPartInv(fits, inv = inv) for (i in 1:p) fits[[i]] <- update(fits[[i]], inv = newInv) } if (AllGamma) { shape <- fits[[1]]$shape newGamma <- optimPartGamma(fits, shape = shape)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], shape = newGamma) } if (AllNNI) { fits <- optimPartNNI(fits, AllEdge) if (trace > 0) cat(attr(fits, "swap"), " NNI operations performed") } if (AllEdge) fits <- optimPartEdge(fits) if (PartRate) { tree <- fits[[1]]$tree rate <- numeric(p) wp <- numeric(p) for (i in 1:p) { wp[i] <- sum(fits[[i]]$weight) rate[i] <- fits[[i]]$rate } ratemult <- sum(wp) / sum(wp * rate) tree$edge.length <- tree$edge.length / ratemult for (i in 1:p) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i] * ratemult) } loli <- 0 for (i in 1:p) loli <- loli + fits[[i]]$log eps <- (logLik - loli) / loli if (trace > 0) cat("loglik:", logLik, "-->", loli, "\n") logLik <- loli m <- m + 1 } } # # pmlCluster # pmlCluster.fit <- function(formula, fit, weight, p = 4, part = NULL, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllNNI <- !is.na(optAll[1]) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) PartNni <- !is.na(optPart[1]) PartBf <- !is.na(optPart[2]) PartQ <- !is.na(optPart[3]) PartInv <- !is.na(optPart[4]) PartGamma <- !is.na(optPart[5]) PartEdge <- !is.na(optPart[6]) PartRate <- !is.na(optPart[7]) if (PartNni) PartEdge <- TRUE nrw <- dim(weight)[1] ncw <- dim(weight)[2] if (is.null(part)) { part <- rep(1:p, length = ncw) part <- sample(part) } Part <- part Gtrees <- vector("list", p) dat <- fit$data attr(fit$orig.data, "index") <- attr(dat, "index") <- NULL for (i in 1:p) Gtrees[[i]] <- fit$tree fits <- vector("list", p) for (i in 1:p) fits[[i]] <- fit trace <- control$trace eps <- 0 m <- 1 logLik <- fit$log trees <- list() weights <- matrix(0, nrw, p) lls <- matrix(0, nrw, p) loli <- fit$log oldpart <- part eps2 <- 1 iter <- 0 swap <- 1 on.exit({ df <- matrix(1, 6, 2) colnames(df) <- c("#df", "group") rownames(df) <- c("Edge", "Shape", "Inv", "Bf", "Q", "Rate") df[1, 1] <- length(fits[[1]]$tree$edge.length) df[2, 1] <- fits[[1]]$k - 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 if (PartEdge) df[1, 2] <- p if (PartGamma) df[2, 2] <- p if (PartInv) df[3, 2] <- p if (PartBf) df[4, 2] <- p if (PartQ) df[5, 2] <- p if (PartRate) df[6, 1] <- p - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) res <- list(logLik = logLik, Partition = Part, trees = trees) result <- list(logLik = loli, fits = fits, Partition = part, df = df, res = res, call = call) class(result) <- c("pmlPart") return(result) }) while (eps < ncw || abs(eps2) > control$eps) { df2 <- 0 if (any(c(PartNni, PartBf, PartInv, PartQ, PartGamma, PartEdge, PartRate))){ for (i in 1:p) { weights[, i] <- rowSums(weight[, which(part == i), drop = FALSE]) ind <- which(weights[, i] > 0) dat2 <- getRows(dat, ind) attr(dat2, "weight") <- weights[ind, i] fits[[i]] <- update(fits[[i]], data = dat2) fits[[i]] <- optim.pml(fits[[i]], PartNni, PartBf, PartQ, PartInv, PartGamma, PartEdge, PartRate, control = pml.control(epsilon = 1e-8, maxit = 3, trace - 1)) lls[, i] <- update(fits[[i]], data = dat)$siteLik Gtrees[[i]] <- fits[[i]]$tree } } if (AllQ) { Q <- fits[[1]]$Q subs <- c(1:(length(Q) - 1), 0) newQ <- optimPartQGeneral(fits, Q = Q, subs = subs)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], Q = newQ) df2 <- df2 + length(unique(newQ)) - 1 } if (AllBf) { bf <- fits[[1]]$bf newBf <- optimPartBf(fits, bf = bf) for (i in 1:p) fits[[i]] <- update(fits[[i]], bf = newBf) df2 <- df2 + length(unique(newBf)) - 1 } if (AllInv) { inv <- fits[[1]]$inv newInv <- optimPartInv(fits, inv = inv) for (i in 1:p) fits[[i]] <- update(fits[[i]], inv = newInv) # there was an Error df2 <- df2 + 1 } if (AllGamma) { shape <- fits[[1]]$shape newGamma <- optimPartGamma(fits, shape = shape)[[1]] for (i in 1:p) fits[[i]] <- update(fits[[i]], shape = newGamma) df2 <- df2 + 1 } if (AllNNI) { fits <- optimPartNNI(fits, AllEdge) if (trace > 0) cat(attr(fits, "swap"), " NNI operations performed") swap <- attr(fits, "swap") } if (AllEdge) { fits <- optimPartEdge(fits) df2 <- df2 + length(fits[[1]]$tree$edge.length) } if (PartRate) { tree <- fits[[1]]$tree rate <- numeric(p) wp <- numeric(p) for (i in 1:p) { wp[i] <- sum(fits[[i]]$weight) rate[i] <- fits[[i]]$rate } ratemult <- sum(wp) / sum(wp * rate) tree$edge.length <- tree$edge.length / ratemult for (i in 1:p) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i] * ratemult) } for (i in 1:p) lls[, i] <- update(fits[[i]], data = dat)$siteLik trees[[m]] <- Gtrees LL <- t(weight) %*% lls # choose partitions which change tmp <- (LL[cbind(1:ncw, part)] - apply(LL, 1, max)) / colSums(weight) fixi <- numeric(p) for (i in 1:p) { tmpi <- which(part == i) fixi[i] <- tmpi[which.max(tmp[tmpi])] } oldpart <- part # restrict the number of elements changing groups # If more than 25% would change, only the 25% with the highest increase per # site change if (sum(tmp == 0) / length(tmp) < .75) { medtmp <- quantile(tmp, .25) medind <- which(tmp <= medtmp) part[medind] <- max.col(LL[medind, ]) } else part <- max.col(LL) # else part <- apply(LL, 1, which.max) # force groups to have at least one member part[fixi] <- 1:p Part <- cbind(Part, part) eps <- sum(diag(table(part, oldpart))) eps2 <- loli loli <- sum(apply(LL, 1, max)) eps2 <- (eps2 - loli) / loli logLik <- c(logLik, loli) if (trace > 0) print(loli) Part <- cbind(Part, part) df2 <- df2 + df2 if (eps == ncw & swap == 0) AllNNI <- FALSE m <- m + 1 if (eps == ncw) iter <- iter + 1 if (iter == 3) break } } #' Stochastic Partitioning #' #' Stochastic Partitioning of genes into p cluster. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' cluster, on the right the parameter which are optimized specific to each #' cluster. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameter can be used only once in the #' formula. There are also some restriction on the combinations how parameters #' can get used. \code{"rate"} is only available for the right side. When #' \code{"rate"} is specified on the left hand side \code{"edge"} has to be #' specified (on either side), if \code{"rate"} is specified on the right hand #' side it follows directly that \code{edge} is too. #' #' @param formula a formula object (see details). #' @param fit an object of class \code{pml}. #' @param weight \code{weight} is matrix of frequency of site patterns for all #' genes. #' @param p number of clusters. #' @param part starting partition, otherwise a random partition is generated. #' @param nrep number of replicates for each p. #' @param control A list of parameters for controlling the fitting process. #' @param \dots Further arguments passed to or from other methods. #' @return \code{pmlCluster} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{trees}{a list of all trees #' during the optimization.} \item{fits}{fits for the final partitions} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso #' \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlMix}},\code{\link{SH.test}} #' @references K. P. Schliep (2009). Some Applications of statistical #' phylogenetics (PhD Thesis) #' #' Lanfear, R., Calcott, B., Ho, S.Y.W. and Guindon, S. (2012) PartitionFinder: #' Combined Selection of Partitioning Schemes and Substitution Models for #' Phylogenetic Analyses. \emph{Molecular Biology and Evolution}, \bold{29(6)}, #' 1695-1701 #' @keywords cluster #' @examples #' #' \dontrun{ #' data(yeast) #' dm <- dist.logDet(yeast) #' tree <- NJ(dm) #' fit <- pml(tree,yeast) #' fit <- optim.pml(fit) #' #' weight <- xtabs(~ index+genes,attr(yeast, "index")) #' set.seed(1) #' #' sp <- pmlCluster(edge~rate, fit, weight, p=1:4) #' sp #' SH.test(sp) #' } #' #' @export pmlCluster pmlCluster <- function(formula, fit, weight, p = 1:5, part = NULL, nrep = 10, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) if (any(p == 1)) { opt2 <- c("nni", "bf", "Q", "inv", "shape", "edge") tmp1 <- opt2 %in% form$left tmp1 <- tmp1 | (opt2 %in% form$right) fit <- optim.pml(fit, tmp1[1], tmp1[2], tmp1[3], tmp1[4], tmp1[5], tmp1[6], control = control) } p <- p[p != 1] if (length(p) == 0) return(fit) n <- sum(weight) k <- 2 BIC <- matrix(0, length(p) + 1, nrep) BIC[1, ] <- AIC(fit, k = log(n)) LL <- matrix(NA, length(p) + 1, nrep) LL[1, ] <- logLik(fit) P <- array(dim = c(length(p) + 1, nrep, dim(weight)[2])) tmpBIC <- Inf choice <- c(1, 1) for (j in p) { tmp <- NULL for (i in 1:nrep) { tmp <- pmlCluster.fit(formula, fit, weight, p = j, part = part, control = control, ...) P[k, i, ] <- tmp$Partition BIC[k, i] <- AIC(tmp, k = log(n)) LL[k, i] <- logLik(tmp) if (BIC[k, i] < tmpBIC) { tmpBIC <- BIC[k, i] result <- tmp choice <- c(k, i) } } k <- k + 1 } p <- c(1, p) result$choice <- choice result$BIC <- BIC result$AllPartitions <- P result$AllLL <- LL result$p <- p class(result) <- c("pmlCluster", "pmlPart") result } #' @export plot.pmlCluster <- function(x, which = c(1L:3L), caption = list("BIC", "log-likelihood", "Partitions"), ...) { show <- rep(FALSE, 3) show[which] <- TRUE choice <- x$choice if (show[1]) { X <- x$AllPartitions[choice[1], , ] d <- dim(X) ind <- order(X[choice[2], ]) im <- matrix(0, d[2], d[2]) for (j in 1:d[1]) { for (i in 1:d[2]) im[i, ] <- im[i, ] + (X[j, ] == X[j, i]) } image(im[ind, ind], ...) } if (show[1]) matplot(x$p, x$BIC, ylab = "BIC", xlab = "number of clusters") if (show[1]) matplot(x$p, x$AllLL, ylab = "log-likelihood", xlab = "number of clusters") } #' @export print.pmlPart <- function(x, ...) { nc <- attr(x$fits[[1]]$data, "nc") levels <- attr(x$fits[[1]]$data, "levels") r <- length(x$fits) nc <- attr(x$fits[[1]]$data, "nc") k <- x$fits[[1]]$k lbf <- x$df["Bf", 2] bf <- matrix(0, lbf, nc) if (lbf > 1) dimnames(bf) <- list(1:r, levels) lQ <- x$df["Q", 2] Q <- matrix(0, lQ, nc * (nc - 1) / 2) if (lQ > 1) dimnames(Q) <- list(1:r, NULL) type <- attr(x$fits[[1]]$data, "type") loli <- numeric(r) rate <- numeric(r) shape <- numeric(r) sizes <- numeric(r) inv <- numeric(r) for (i in 1:r) { loli[i] <- x$fits[[i]]$logLik if (i <= lbf) bf[i, ] <- x$fits[[i]]$bf if (i <= lQ) Q[i, ] <- x$fits[[i]]$Q rate[i] <- x$fits[[i]]$rate shape[i] <- x$fits[[i]]$shape inv[i] <- x$fits[[i]]$inv sizes[i] <- sum(attr(x$fits[[i]]$data, "weight")) } cat("\nloglikelihood:", x$logLik, "\n") cat("\nloglikelihood of partitions:\n ", loli, "\n") cat("AIC: ", AIC(x), " BIC: ", AIC(x, k = log(sum(sizes))), "\n\n") cat("Proportion of invariant sites:", inv, "\n") cat("\nRates:\n") cat(rate, "\n") if (k > 1) { cat("\nShape parameter:\n") cat(shape, "\n") } if (type == "AA") cat("Rate matrix:", x$fits[[1]]$model, "\n") else { cat("\nBase frequencies: \n") print(bf) cat("\nRate matrix:\n") print(Q) } } #' @export logLik.pmlPart <- function(object, ...) { res <- object$logLik attr(res, "df") <- sum(object$df[, 1] * object$df[, 2]) class(res) <- "logLik" res } optNNI <- function(fit, INDEX) { tree <- fit$tree ll.0 <- fit$ll.0 bf <- fit$bf eig <- fit$eig # k <- fit$k w <- fit$w g <- fit$g rootEdges <- attr(INDEX, "root") .dat <- NULL parent <- tree$edge[, 1] child <- tree$edge[, 2] data <- getCols(fit$data, tree$tip.label) datp <- rnodes(tree, data, w, g, eig, bf) tmp <- length(tree$tip.label) for (i in seq_along(w)) .dat[i, 1:tmp] <- new2old.phyDat(data) evector <- numeric(max(parent)) evector[child] <- tree$edge.length m <- dim(INDEX)[1] loglik <- numeric(2 * m) edgeMatrix <- matrix(0, 2 * m, 5) for (i in 1:m) { ei <- INDEX[i, ] el0 <- evector[INDEX[i, ]] l <- length(datp[, 1]) weight <- fit$weight datn <- vector("list", 4 * l) attr(datn, "dim") <- c(l, 4) datn <- .dat[, ei[1:4], drop = FALSE] if (!(ei[5] %in% rootEdges)) datn[, 1] <- datp[, ei[1], drop = FALSE] new1 <- optim.quartet(el0[c(1, 3, 2, 4, 5)], eig, bf, datn[, c(1, 3, 2, 4), drop = FALSE], g, w, weight, ll.0, llcomp = fit$log) new2 <- optim.quartet(el0[c(1, 4, 3, 2, 5)], eig, bf, datn[, c(1, 4, 3, 2), drop = FALSE], g, w, weight, ll.0, llcomp = fit$log) loglik[(2 * i) - 1] <- new1[[2]] loglik[(2 * i)] <- new2[[2]] edgeMatrix[(2 * i) - 1, ] <- new1[[1]] edgeMatrix[(2 * i), ] <- new2[[1]] } list(loglik = loglik, edges = edgeMatrix) } optimPartNNI <- function(object, AllEdge = TRUE, ...) { tree <- object[[1]]$tree INDEX <- indexNNI(tree) l <- length(object) loglik0 <- 0 for (i in 1:l) loglik0 <- loglik0 + logLik(object[[i]]) l <- length(object) TMP <- vector("list", l) for (i in 1:l) { TMP[[i]] <- optNNI(object[[i]], INDEX) } loglik <- TMP[[1]][[1]] for (i in 2:l) loglik <- loglik + TMP[[i]][[1]] swap <- 0 candidates <- loglik > loglik0 while (any(candidates)) { ind <- which.max(loglik) loglik[ind] <- -Inf if (ind %% 2) swap.edge <- c(2, 3) else swap.edge <- c(2, 4) tree2 <- changeEdge(tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[1]][[2]][ind, ]) tmpll <- 0 for (i in 1:l) { if (!AllEdge) tree2 <- changeEdge(object[[i]]$tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[i]][[2]][ind, ]) tmpll <- tmpll + update(object[[i]], tree = tree2)$logLik } if (tmpll < loglik0) candidates[ind] <- FALSE if (tmpll > loglik0) { swap <- swap + 1 tree <- tree2 indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE loglik[indi] <- -Inf for (i in 1:l) { if (!AllEdge) tree2 <- changeEdge(object[[i]]$tree, INDEX[(ind + 1) %/% 2, swap.edge], INDEX[(ind + 1) %/% 2, ], TMP[[i]][[2]][ind, ]) object[[i]] <- update(object[[i]], tree = tree2) } loglik0 <- 0 for (i in 1:l) loglik0 <- loglik0 + logLik(object[[i]]) cat(loglik0, "\n") } } if (AllEdge) object <- optimPartEdge(object) attr(object, "swap") <- swap object } phangorn/R/transferBootstrap.R0000644000176200001440000000155514042560754016151 0ustar liggesusers## include in addConfidences, plotBS etc. transferBootstrap <- function(tree, bstree){ if(!inherits(bstree, "multiPhylo")) stop("bstrees needs to be of class multiPhylo!") bstree <- .uncompressTipLabel(bstree) bstree <- .compressTipLabel(bstree, tree$tip.label) bstree <- reorder(bstree, "postorder") l <- Ntip(tree) bp <- prop.part(tree) bp <- SHORTwise(bp)[-1] not_cherry <- lengths(bp) != 2 res <- numeric(length(bp)) for(i in seq_along(bstree)){ tmp <- bstree[[i]] bptmp <- prop.part(tmp) bptmp <- SHORTwise(bptmp)[-1] ind <- fmatch(bp, bptmp) res[!is.na(ind)] <- res[!is.na(ind)] + 1 # cherries can be check outside ind <- which(is.na(ind) & not_cherry) for(j in ind) res[j] <- res[j] + Transfer_Index(bp[[j]], tmp$edge, l) } res <- res / length(bstree) * 100 tree$node.label <- c(NA_real_, res) tree } phangorn/R/zzz.R0000644000176200001440000000412414140524223013245 0ustar liggesusers## zzz.R #' @import methods #' @import Rcpp #' @import parallel #' @import ape #' @importFrom stats AIC BIC logLik reorder update optim optimize constrOptim #' @importFrom stats cophenetic hclust as.dist pchisq reshape qgamma pgamma #' @importFrom stats na.omit model.matrix aggregate lm.fit xtabs quantile sd #' @importFrom stats runif qbeta #' @importFrom graphics plot plot.default plot.new plot.window text par abline #' @importFrom graphics strwidth axis title segments points image matplot legend #' @importFrom graphics hist identify locator barplot #' @importFrom utils read.table download.file stack #' @importFrom utils installed.packages write.table combn packageDescription #' @importFrom grDevices rgb adjustcolor col2rgb #' @useDynLib phangorn, .registration = TRUE .packageName <- "phangorn" .aamodels <- c("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT", "RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff_DCMut", "JTT_DCMut") .dnamodels <- c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR") # environment variables # .CodonAlphabet <- c("aaa", "aac", "aag", "aat", "aca", "acc", "acg", "act", # "aga", "agc", "agg", "agt", "ata", "atc", "atg", "att", # "caa", "cac", "cag", "cat", "cca", "ccc", "ccg", "cct", # "cga", "cgc", "cgg", "cgt", "cta", "ctc", "ctg", "ctt", # "gaa", "gac", "gag", "gat", "gca", "gcc", "gcg", "gct", # "gga", "ggc", "ggg", "ggt", "gta", "gtc", "gtg", "gtt", # "tac", "tat", "tca", "tcc", "tcg", "tct", "tgc", "tgg", # "tgt", "tta", "ttc", "ttg", "ttt") .nucleotideAlphabet <- c("a", "c", "g", "t") # if rate g[i] is smaller than .gEps invariant site is increased by w[i] .gEps <- 1e-12 .PlotNetworxEnv <- new.env() loadModule("Fitch_mod", TRUE) # .onLoad <- function(libname, pkgname) { # library.dynam("phangorn", pkgname, libname) #} phangorn/R/pmlPen.R0000644000176200001440000001365013707232051013652 0ustar liggesusers#' @rdname phangorn-internal #' @export pmlPen <- function(object, lambda, ...) { if (inherits(object, "pmlPart")) return(pmlPartPen(object, lambda, ...)) if (inherits(object, "pmlMix")) return(pmlMixPen(object, lambda, ...)) else stop("object has to be of class pmlPart or pmlMix") } pmlPartPen <- function(object, lambda, control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...) { fits <- object$fits m <- length(fits) K <- -diag(length(fits[[1]]$tree$edge.length)) Ktmp <- K for (i in 1:(m - 1)) Ktmp <- cbind(Ktmp, K) KM <- Ktmp for (i in 1:(m - 1)) KM <- rbind(KM, Ktmp) diag(KM) <- m - 1 theta <- NULL l <- length(fits[[1]]$tree$edge.length) loglik <- 0 for (i in 1:m) { theta <- c(theta, fits[[i]]$tree$edge.length) loglik <- loglik + fits[[i]]$logLik } # print(loglik) pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik <- loglik - 0.5 * lambda * t(theta) %*% KM %*% theta eps <- 1 H <- matrix(0, m * l, m * l) iter <- 0 trace <- control$trace while (abs(eps) > control$eps & iter < control$maxit) { theta <- NULL sc <- NULL for (i in 1:m) { theta <- c(theta, fits[[i]]$tree$edge.length) scoretmp <- score(fits[[i]], TRUE) sc <- c(sc, scoretmp$sc) H[(1:l) + l * (i - 1), (1:l) + l * (i - 1)] <- scoretmp$F } sc <- sc - lambda * KM %*% log(theta) thetanew <- log(theta) + solve(H + lambda * KM, sc) for (i in 1:m) fits[[i]]$tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) for (i in 1:m) fits[[i]] <- update.pml(fits[[i]], tree = fits[[i]]$tree) loglik1 <- 0 for (i in 1:m) loglik1 <- loglik1 + fits[[i]]$logLik logLik <- loglik1 if (trace > 0) print(loglik1) loglik0 <- loglik1 pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik1 <- loglik1 - 0.5 * lambda * t(thetanew) %*% KM %*% thetanew eps <- (loglik - loglik1) / loglik1 loglik <- loglik1 theta <- exp(thetanew) iter <- iter + 1 if (trace > 0) print(iter) } df <- sum(diag(solve(H + lambda * KM, H))) object$df[1, 1] <- df object$df[1, 2] <- 1 object$fits <- fits object$logLik <- loglik0 attr(object$logLik, "df") <- sum(object$df[, 1] * object$df[, 2]) object$logLik.pen <- loglik attr(object$logLik.pen, "df") <- sum(object$df[, 1] * object$df[, 2]) object } pmlMixPen <- function(object, lambda, optOmega = TRUE, control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...){ fits <- object$fits m <- length(fits) K <- -diag(length(fits[[1]]$tree$edge.length)) tree <- fits[[1]]$tree Ktmp <- K for (i in 1:(m - 1)) Ktmp <- cbind(Ktmp, K) KM <- Ktmp for (i in 1:(m - 1)) KM <- rbind(KM, Ktmp) diag(KM) <- m - 1 theta <- NULL l <- length(fits[[1]]$tree$edge.length) omega <- object$omega dat <- fits[[1]]$data nr <- attr(dat, "nr") weight <- drop(attr(dat, "weight")) ll <- matrix(0, nr, m) for (i in 1:m) ll[, i] <- fits[[i]]$lv lv <- drop(ll %*% omega) loglik <- sum(weight * log(lv)) for (i in 1:m) theta <- c(theta, fits[[i]]$tree$edge.length) pen <- -0.5 * lambda * t(theta) %*% KM %*% theta loglik <- loglik + pen print(loglik) eps0 <- 1 dl <- matrix(0, nr, m * l) iter0 <- 0 trace <- control$trace while (abs(eps0) > control$eps & iter0 < control$maxit) { eps <- 1 iter <- 0 while (abs(eps) > 0.01 & iter < 5) { for (i in 1:m) { dl[, (1:l) + l * (i - 1)] <- dl(fits[[i]], TRUE) * omega[i] } dl <- dl / lv sc <- colSums(weight * dl) - lambda * KM %*% log(theta) H <- crossprod(dl * weight, dl) thetanew <- log(theta) + solve(H + lambda * KM, sc) for (i in 1:m) fits[[i]]$tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) for (i in 1:m) { tree$edge.length <- exp(thetanew[(1:l) + (i - 1) * l]) fits[[i]] <- update.pml(fits[[i]], tree = tree) ll[, i] <- fits[[i]]$lv } lv <- drop(ll %*% omega) loglik1 <- sum(weight * log(lv)) pen <- -0.5 * lambda * t(thetanew) %*% KM %*% thetanew loglik1 <- loglik1 + pen eps <- abs(loglik1 - loglik) theta <- exp(thetanew) loglik <- loglik1 iter <- iter + 1 } if (optOmega) { res <- optWPen(ll, weight, omega, pen) omega <- res$p for (i in 1:m) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } } lv <- drop(ll %*% omega) loglik1 <- sum(weight * log(lv)) loglik0 <- loglik1 loglik1 <- loglik1 - 0.5 * lambda * t(thetanew) %*% KM %*% thetanew eps0 <- (loglik - loglik1) / loglik1 theta <- exp(thetanew) loglik <- loglik1 iter0 <- iter0 + 1 if (trace > 0) print(loglik) } for (i in 1:m) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } df <- sum(diag(solve(H + lambda * KM, H))) penalty <- list(lambda = lambda, K = KM, thetanew = thetanew, ploglik = loglik) object$omega <- omega object$df[1, 1] <- df object$df[1, 2] <- 1 object$fits <- fits object$logLik <- loglik0 object$penalty <- penalty object } optWPen <- function(ll, weight, omega, pen, ...) { k <- length(omega) nenner <- 1 / omega[1] eta <- log(omega * nenner) eta <- eta[-1] fn <- function(eta, ll, weight, pen) { eta <- c(0, eta) p <- exp(eta) / sum(exp(eta)) res <- sum(weight * log(ll %*% p)) + pen res } if (k == 2) res <- optimize(f = fn, interval = c(-3, 3), lower = -3, upper = 3, maximum = TRUE, tol = .Machine$double.eps^0.25, ll = ll, weight = weight, pen = pen) else res <- optim(eta, fn = fn, method = "L-BFGS-B", lower = -5, upper = 5, control = list(fnscale = -1, maxit = 25), gr = NULL, ll = ll, weight = weight, pen = pen) p <- exp(c(0, res[[1]])) p <- p / sum(p) result <- list(par = p, value = res[[2]]) result } phangorn/R/read.phyDat.R0000644000176200001440000001126314030677034014564 0ustar liggesusers read.fasta.user <- function (file, skip = 0, nlines = 0, comment.char = "#", seq.names = NULL){ getTaxaNames <- function(x) { x <- sub("^ +", "", x) x <- sub(" +$", "", x) x <- sub("^['\"]", "", x) x <- sub("['\"]$", "", x) x } X <- scan(file = file, what = character(), sep = "\n", quiet = TRUE, skip = skip, nlines = nlines, comment.char = comment.char) start <- grep("^ {0,}>", X) taxa <- X[start] n <- length(taxa) obj <- vector("list", n) if (is.null(seq.names)) { taxa <- sub("^ {0,}>", "", taxa) seq.names <- getTaxaNames(taxa) } start <- c(start, length(X) + 1) for (i in 1:n) obj[[i]] <- unlist(strsplit(gsub(" ", "", X[(start[i] + 1):(start[i + 1] - 1)]), NULL)) names(obj) <- seq.names obj <- lapply(obj, tolower) obj } #' Import and export sequence alignments #' #' These functions read and write sequence alignments. #' #' \code{write.phyDat} calls the function \code{\link[ape]{write.dna}} or #' \code{\link[ape]{write.nexus.data}} and \code{read.phyDat} calls the function #' \code{\link[ape]{read.dna}}, \code{read.aa} or \code{read.nexus.data}, so see #' for more details over there. #' #' You may import data directly with \code{\link[ape]{read.dna}} or #' \code{\link[ape]{read.nexus.data}} and convert the data to class phyDat. #' #' @param file a file name specified by either a variable of mode character, or #' a double-quoted string. #' @param format File format of the sequence alignment (see details). Several #' popular formats are supported: "phylip", "interleaved", "sequential", #' "clustal", "fasta" or "nexus", or any unambiguous abbreviation of these. #' @param type Type of sequences ("DNA", "AA", "CODON" or "USER"). #' @param ... further arguments passed to or from other methods. #' @return \code{read.phyDat} returns an object of class phyDat, #' \code{write.phyDat} write an alignment to a file. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, #' \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} #' @references % Anonymous. FASTA format description. % #' \url{https://www.ncbi.nlm.nih.gov/blast/fasta.shtml} Felsenstein, J. (1993) #' Phylip (Phylogeny Inference Package) version 3.5c. Department of Genetics, #' University of Washington. #' \url{https://evolution.genetics.washington.edu/phylip/phylip.html} #' @examples #' fdir <- system.file("extdata/trees", package = "phangorn") #' primates <- read.phyDat(file.path(fdir, "primates.dna"), #' format = "interleaved") #' @keywords IO #' @rdname read.phyDat #' @export read.phyDat <- function(file, format="phylip", type="DNA", ...){ formats <- c("phylip", "nexus", "interleaved", "sequential", "fasta", "clustal") format <- match.arg(tolower(format), formats) if(format=="nexus") data <- read.nexus.data(file, ...) else { if(format=="phylip") format <- "sequential" #"interleaved" if (type == "DNA" || type == "CODON"){ data <- read.dna(file, format, as.character = (format!="fasta"), ...) } if (type == "AA") data <- read.aa(file, format=format, ...) if (type == "USER"){ if(format=="fasta") data <- read.fasta.user(file) else data <- read.dna(file, format, as.character = TRUE) extras <- match.call(expand.dots = FALSE)$... extras <- lapply(extras, eval) return(phyDat(data, type, levels=extras$levels, ambiguity = extras$ambiguity, contrast = extras$contrast)) } } if(is.list(data)){ ll <- lengths(data) if(!all(ll == ll[[1]])) stop("sequences have different length") } phyDat(data, type, return.index = TRUE) } #' @param x An object of class \code{phyDat}. #' @param colsep a character used to separate the columns (a single space by #' default). #' @param nbcol a numeric specifying the number of columns per row (-1 by #' default); may be negative implying that the nucleotides are printed on a #' single line. #' @rdname read.phyDat #' @export write.phyDat <- function(x, file, format="phylip", colsep = "", nbcol=-1, ...){ formats <- c("phylip", "nexus", "interleaved", "sequential", "fasta") format <- match.arg(tolower(format), formats) if(format=="nexus"){ type <- attr(x, "type") if(type=="DNA") write.nexus.data(as.list(as.data.frame(x)), file, format = "dna",...) else write.nexus.data(as.list(as.data.frame(x)), file, format = "protein", ...) } else{ if(format=="phylip") format <- "interleaved" write.dna(as.character(x), file, format=format, colsep = colsep, nbcol=nbcol, ...) } } phangorn/R/mast.R0000644000176200001440000000713614041301450013355 0ustar liggesusers#' Maximum agreement subtree #' #' \code{mast} computes the maximum agreement subtree (MAST). #' #' The code is derived from the code example in Valiente (2009). ## for the original code see \url{https://www.cs.upc.edu/~valiente/comput-biol/}. #' The version for the unrooted trees is much slower. #' #' @param x a tree, i.e. an object of class \code{phylo}. #' @param y a tree, i.e. an object of class \code{phylo}. #' @param tree a logical, if TRUE returns a tree other wise the tip labels #' of the the maximum agreement subtree. #' @param rooted logical if TRUE treats trees as rooted otherwise unrooted. #' @return \code{mast} returns a vector of the tip labels in the MAST. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} based on code of Gabriel Valiente #' @seealso \code{\link{SPR.dist}} #' @references #' G. Valiente (2009). \emph{Combinatorial Pattern Matching Algorithms in Computational Biology using Perl and R}. Taylor & Francis/CRC Press #' #' #' @keywords cluster #' @examples #' tree1 <- rtree(100) #' tree2 <- rSPR(tree1, 5) #' tips <- mast(tree1, tree2) #' #' @rdname mast #' @export mast <- function(x, y, tree = TRUE, rooted = TRUE) { if (!is.rooted(x) | !is.rooted(y)) { rooted <- FALSE } shared_tips <- intersect(x$tip.label, y$tip.label) if (length(shared_tips) < length(x$tip.label)) x <- drop.tip(x, setdiff(x$tip.label, shared_tips)) if (length(shared_tips) < length(y$tip.label)) y <- drop.tip(y, setdiff(y$tip.label, shared_tips)) # make order of labels the same y <- .compressTipLabel(c(y), x$tip.label)[[1]] x <- reorder(x, "postorder") if (rooted) res <- mast.fit(x, y) else { x <- reorder(x, "postorder") bipart_x <- bipartCPP(x$edge, Ntip(x))[[2]] x <- root(x, bipart_x, resolve.root = TRUE) x <- reorder(x, "postorder") y <- unroot(y) y <- reorder(y, "postorder") res <- NULL bipart_y <- bipartCPP(y$edge, Ntip(y)) for (i in 2:length(bipart_y)) { y <- root(y, bipart_y[[i]], resolve = TRUE) tmp <- mast.fit(x, y) if (length(tmp) > length(res)) res <- tmp } } if (tree) res <- keep.tip(x, res) # drop.tip(x, setdiff(x$tip.label, res)) res } mast.fit <- function(x, y) { y <- reorder(y, "postorder") nTips <- length(x$tip.label) po1 <- c(x$edge[, 2], x$edge[nrow(x$edge), 1]) po2 <- c(y$edge[, 2], y$edge[nrow(y$edge), 1]) # vielleicht ausserhalb p_vec_1 <- Ancestors(x, 1L:max(x$edge)) # nTips p_vec_2 <- Ancestors(y, 1L:max(y$edge)) # nTips # vielleicht ausserhalb CH1 <- allChildren(x) CH2 <- allChildren(y) m <- matrix(list(), nrow = length(po1), ncol = length(po2)) for (i in seq_len(nTips)) { m[i, i] <- c(i) m[cbind(i, p_vec_2[[i]])] <- c(i) m[cbind(p_vec_1[[i]], i)] <- c(i) } L <- lengths(m) po1 <- po1[po1>nTips] po2 <- po2[po2>nTips] for (i in po1) { l1 <- CH1[[i]][1] r1 <- CH1[[i]][2] for (j in po2) { l2 <- CH2[[j]][1] r2 <- CH2[[j]][2] mm <- c(m[[l1, l2]], m[[r1, r2]]) ll <- L[l1, l2] + L[r1, r2] if (L[l1, r2] + L[r1, l2] > ll){ mm <- c(m[[l1, r2]], m[[r1, l2]]) ll <- L[l1, r2] + L[r1, l2] } if (L[i, l2] > ll){ mm <- m[[i, l2]] ll <- L[i, l2] } if (L[i, r2] > ll){ mm <- m[[i, r2]] ll <- L[i, r2] } if (L[l1, j] > ll){ mm <- m[[l1, j]] ll <- L[l1, j] } if (L[r1, j] > ll){ mm <- m[[r1, j]] ll <- L[r1, j] } if (!is.null(mm)){ m[[i, j]] <- mm L[i,j] <- ll } } } x$tip.label[m[[i, j]]] } phangorn/R/networx.R0000644000176200001440000011631714125320503014124 0ustar liggesusers#' @rdname as.splits #' @export allSplits <- function(k, labels = NULL) { result <- lapply(1:(2^(k - 1) - 1), dec2Bin) if (is.null(labels)) labels <- (as.character(1:k)) attr(result, "labels") <- labels class(result) <- "splits" result } #' @rdname as.splits #' @export allCircularSplits <- function(k, labels = NULL) { fun <- function(x, y) { tmp <- (1L:y) + x tmp %% (k + 1L) + tmp %/% (k + 1L) } k <- as.integer(k) l <- (k - 1L) %/% 2L res <- vector("list", k * (k - 1L) / 2) res[1:k] <- 1L:k ind <- k if (k > 3) { if (k > 4L) { for (i in 2:l) { res[(ind + 1):(ind + k)] <- lapply(0L:(k - 1L), fun, i) ind <- ind + k } } if ( (k %% 2L) == 0) { m <- k %/% 2 res[(ind + 1):(ind + m)] <- lapply(0L:(m - 1L), fun, m) } } res <- lapply(res, sort) if (is.null(labels)) labels <- as.character(1:k) attr(res, "labels") <- labels attr(res, "cycle") <- 1:k class(res) <- "splits" res } #getIndex <- function(left, right, n) { # if (n < max(left) | n < max(right)) stop("Error") # left <- as.integer(left) # right <- as.integer(right) # ll <- length(left) # lr <- length(right) # .C("giveIndex", left, right, ll, lr, as.integer(n), integer(ll * lr))[[6]] + 1 #} splits2design <- function(obj, weight = NULL) { labels <- attr(obj, "labels") m <- length(labels) n <- length(obj) l <- 1:m sl <- lengths(obj) p0 <- sl * (m - sl) p <- c(0, cumsum(p0)) i <- numeric(max(p)) for (k in 1:n) { sp <- obj[[k]] if (p0[k] != 0) i[(p[k] + 1):p[k + 1]] <- getIndex(sp, l[-sp], m) } dims <- c(m * (m - 1) / 2, n) sparseMatrix(i = i, p = p, x = 1.0, dims = dims) } addEdge <- function(network, desc, spl) { edge <- network$edge parent <- edge[, 1] child <- edge[, 2] nTips <- length(network$tip.label) desc2 <- SHORTwise(desc) #, nTips) split <- desc2[spl] index <- network$splitIndex ind <- which(compatible2(split, desc2[index]) == 1) if (is.null(ind) | (length(ind) == 0)) return(network) add <- TRUE X <- as.matrix(desc2) rsX <- rowSums(X) z <- X %*% X[spl, ] v <- which((rsX == z)[index] == TRUE) # intersection of shortest pathes of both partitions # best with similar to circNetwork with shortest_paths while (add) { tmp <- ind for (i in ind) { tmp2 <- which(compatible2(desc2[index][i], desc2[index]) == 1) tmp <- union(tmp, tmp2) } if (identical(ind, tmp)) { ind <- tmp add <- FALSE } ind <- tmp } g <- graph(t(network$edge[ind, ]), directed = FALSE) dec <- decompose(g, min.vertices = 2) # fromTo <- sort(match(split[[1]], attr(desc, "cycle"))) # sptmp = shortest_paths(g, fromTo[i-1], fromTo[i], # output=c("epath"))$epath[[1]] # sp2 = c(sp2, sptmp[-c(1, length(sptmp))]) # sp0 = c(sp0, sptmp) oldNodes <- unique(as.vector(edge[ind, ])) mNodes <- max(network$edge) newNodes <- (mNodes + 1L):(mNodes + length(oldNodes)) # duplicated splits dSpl <- edge[ind, ] edge2 <- edge[v, ] for (i in seq_along(oldNodes)) { edge2[edge2 == oldNodes[i]] <- newNodes[i] } edge[v, ] <- edge2 # alle Splits verdoppeln for (i in seq_along(oldNodes)) dSpl[dSpl == oldNodes[i]] <- newNodes[i] edge <- rbind(edge, dSpl, deparse.level = 0) # experimental: no labels index <- c(index, index[ind]) # neu zu alt verbinden edge <- rbind(edge, cbind(oldNodes, newNodes), deparse.level = 0) index <- c(index, rep(spl, length(oldNodes))) network$edge <- edge network$Nnode <- max(edge) - nTips network$splitIndex <- index network } ## as.splits.phylo circNetwork <- function(x, ord = NULL) { if (is.null(ord)) ord <- attr(x, "cycle") weight <- attr(x, "weights") if (is.null(weight)) weight <- rep(1, length(x)) nTips <- length(ord) tmp <- which(ord == 1) if (tmp != 1) ord <- c(ord[tmp:nTips], ord[1:(tmp - 1)]) res <- stree(nTips, tip.label = attr(x, "labels")) res$edge[, 2] <- ord res$edge.length <- NULL x <- SHORTwise(x) #, nTips) spRes <- as.splits(res)[res$edge[, 2]] index <- match(spRes, x) if (any(is.na(index))) { l.na <- sum(is.na(index)) x <- c(x, spRes[is.na(index)]) weight <- c(weight, rep(0, l.na)) index <- match(spRes, x) } l <- lengths(ONEwise(x)) l2 <- lengths(x) # dm <- as.matrix(compatible2(x)) tmp <- countCycles(x, ord = ord) ind <- which(tmp == 2 & l2 > 1) # & l X[k, j]) { Vstop <- ord[j - 1] ordStop <- j - 1 } } fromTo <- ordStart:ordStop if (ordStart > ordStop) fromTo <- c(ordStart:nTips, 1:ordStop) fromTo <- ord[fromTo] g <- graph(t(res$edge), directed = FALSE) isChild <- (rsY == (Y %*% X[k, ]))[index] sp2 <- NULL sp0 <- NULL for (i in 2:length(fromTo)) { sptmp <- shortest_paths(g, fromTo[i - 1], fromTo[i], output = c("epath"))$epath[[1]] sp2 <- c(sp2, sptmp[-c(1, length(sptmp))]) sp0 <- c(sp0, sptmp) } sp0 <- unique(sp0) if (length(sp2) > 0) { # blub = which(dm[index[sp2], ind[k]]>0) TMP <- rowSums(dm2[index[sp2], 1:k, drop = FALSE]) blub <- which(TMP > 0) sp2 <- sp2[blub] } if (length(sp2) == 0) { isChild <- (rsY == (Y %*% X[k, ]))[index] sp0 <- which(isChild == TRUE) edge1 <- unique(as.vector(res$edge[sp0, ])) edge2 <- as.vector(res$edge[-sp0, ]) asdf <- edge1 %in% edge2 sp <- edge1[asdf] } if (length(sp2) > 0) sp <- unique(as.vector(t(res$edge[sp2, ]))) parent <- res$edge[, 1] child <- res$edge[, 2] j <- ord[which(X[k, ] == 1)] anc <- unique(parent[match(j, child)]) maxVert <- max(parent) l <- length(sp) newVert <- (maxVert + 1):(maxVert + l) sp01 <- setdiff(sp0, sp2) for (i in 1:l) res$edge[sp01, ][res$edge[sp01, ] == sp[i]] <- newVert[i] newindex <- rep(ind[k], l) if (length(sp) > 1) newindex <- c(index[sp2], newindex) index <- c(index, newindex) # connect new and old vertices newEdge <- matrix(cbind(sp, newVert), ncol = 2) if (length(sp) > 1) { # copy edges qwer <- match(as.vector(res$edge[sp2, ]), sp) newEdge <- rbind(matrix(newVert[qwer], ncol = 2), newEdge) } res$edge <- rbind(res$edge, newEdge) res$Nnode <- max(res$edge) - nTips res$splitIndex <- index res$edge.length <- rep(1, nrow(res$edge)) class(res) <- c("networx", "phylo") attr(res, "order") <- NULL } res$edge.length <- weight[index] # ausserhalb res$Nnode <- max(res$edge) - nTips res$splitIndex <- index res$splits <- x class(res) <- c("networx", "phylo") attr(res, "order") <- NULL res } #' Conversion among phylogenetic network objects #' #' \code{as.networx} convert \code{splits} objects into a \code{networx} #' object. And most important there exists a generic \code{plot} function to #' plot phylogenetic network or split graphs. #' #' @details A \code{networx} object hold the information for a phylogenetic #' network and extends the \code{phylo} object. Therefore some generic function #' for \code{phylo} objects will also work for \code{networx} objects. The #' argument \code{planar = TRUE} will create a planar split graph based on a #' cyclic ordering. These objects can be nicely plotted in \code{"2D"}. #' #' @aliases networx #' @param x an object of class \code{"splits"} or \code{"phylo"} #' @param planar logical whether to produce a planar graph from only cyclic #' splits (may excludes splits). #' @param coord add coordinates of the nodes, allows to reproduce the plot. #' @param \dots Further arguments passed to or from other methods. #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensusNet}}, \code{\link{neighborNet}}, #' \code{\link{splitsNetwork}}, \code{\link{hadamard}}, #' \code{\link{distanceHadamard}}, \code{\link{plot.networx}}, #' \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}} #' @references #' Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords plot #' @importFrom igraph graph #' @examples #' #' set.seed(1) #' tree1 <- rtree(20, rooted=FALSE) #' sp <- as.splits(rNNI(tree1, n=10)) #' net <- as.networx(sp) #' plot(net) #' \dontrun{ #' # also see example in consensusNet #' example(consensusNet) #' } #' #' @rdname as.networx #' @export as.networx as.networx <- function(x, ...) { if (inherits(x, "networx")) return(x) UseMethod("as.networx") } getOrdering <- function(x, opt=TRUE) { tree <- as.phylo(x, TRUE) tree <- reorder(tree) if(opt) tree <- optCycle(x, tree) nTips <- length(tree$tip.label) ord <- reorder(tree)$edge[, 2] ord <- ord[ord <= nTips] ind <- which(ord == 1L) if (ind > 1) ord <- c(ord[ind:nTips], ord[c(1:(ind - 1L))]) ord } #' @export addTrivialSplits <- function(obj) { label <- attr(obj, "label") nTips <- length(label) weight <- attr(obj, "weights") if (is.null(weight)) weight <- rep(1, length(obj)) STree <- stree(nTips, tip.label = attr(obj, "labels")) STree$edge.length <- NULL spRes <- as.splits(STree)[STree$edge[, 2]] tmpIndex <- match(spRes, SHORTwise(obj)) if (any(is.na(tmpIndex))) { l.na <- sum(is.na(tmpIndex)) obj <- c(obj, spRes[is.na(tmpIndex)]) weight <- c(weight, rep(0, l.na)) attr(obj, "weights") <- weight } obj } #' @export removeTrivialSplits <- function(obj) { nTips <- length(attr(obj, "label")) l <- lengths(obj) ind <- which( (l == 0L) | (l == 1L) | (l == nTips) | (l == (nTips - 1L))) obj[-ind] } #' @rdname as.networx #' @importFrom igraph shortest_paths decompose #' @importFrom Matrix spMatrix #' @method as.networx splits #' @export as.networx.splits <- function(x, planar = FALSE, coord = c("none", "2D", "3D"), ...) { label <- attr(x, "label") x <- addTrivialSplits(x) nTips <- length(label) x <- ONEwise(x) l <- lengths(x) if (any(l == nTips)) x <- x[l != nTips] # get rid of trivial splits l <- lengths(x) weight <- attr(x, "weights") if (is.null(weight)) weight <- rep(1, length(x)) attr(x, "weights") <- weight ext <- sum(l == 1 | l == (nTips - 1)) if (!is.null(attr(x, "cycle"))) { c.ord <- attr(x, "cycle") } else c.ord <- getOrdering(x) attr(x, "cycle") <- c.ord # check for star tree if(length(x)==nTips) return(as.phylo(x)) # which splits are in circular ordering circSplits <- which(countCycles(x, ord = c.ord) == 2) if (length(circSplits) == length(x)) planar <- TRUE tmp <- circNetwork(x, c.ord) attr(tmp, "order") <- NULL if (planar) { return(reorder(tmp)) } dm <- as.matrix(compatible2(x)) ll <- lengths(x) ind <- tmp$splitIndex # match(sp, x) ind2 <- union(ind, which(ll == 0)) # which(duplicated(x)) ind2 <- union(ind2, which(ll == nTips)) ord <- order(colSums(dm)) ord <- setdiff(ord, ind2) if (length(ord) > 0) { for (i in seq_along(ord)) { tmp <- addEdge(tmp, x, ord[i]) tmp$edge.length <- weight[tmp$splitIndex] tmp$Nnode <- max(tmp$edge) - nTips class(tmp) <- c("networx", "phylo") } } tmp$edge.length <- weight[tmp$splitIndex] tmp$Nnode <- max(tmp$edge) - nTips attr(x, "cycle") <- c.ord tmp$splits <- x class(tmp) <- c("networx", "phylo") tmp <- reorder(tmp) coord <- match.arg(coord) vert <- switch(coord, "none" = NULL, "2D" = coords(tmp, dim = "2D"), "3D" = coords(tmp, dim = "3D")) # attr(tmp, "coords") <- coordinates tmp$plot <- list(vertices = vert) tmp } #' @rdname as.networx #' @method as.networx phylo #' @export as.networx.phylo <- function(x, ...) { spl <- as.splits(x) spl <- spl[x$tree[, 2]] x$splitIndex <- seq_len( nrow(x$edge) ) x$splits <- spl class(x) <- c("networx", "phylo") x } # as.igraph.networx <- function(x, directed=FALSE){ # graph(t(x$edge), directed=directed) # } #' Computes a consensusNetwork from a list of trees Computes a \code{networx} #' object from a collection of splits. #' #' Computes a consensusNetwork, i.e. an object of class \code{networx} from a #' list of trees, i.e. an class of class \code{multiPhylo}. Computes a #' \code{networx} object from a collection of splits. #' #' #' @param obj An object of class multiPhylo. #' @param prob the proportion a split has to be present in all trees to be #' represented in the network. #' @param \dots Further arguments passed to or from other methods. #' @return \code{consensusNet} returns an object of class networx. This is #' just an intermediate to plot phylogenetic networks with igraph. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{splitsNetwork}}, \code{\link{neighborNet}}, #' \code{\link{lento}}, \code{\link{distanceHadamard}}, #' \code{\link{plot.networx}}, \code{\link{maxCladeCred}} #' @references Holland B.R., Huber K.T., Moulton V., Lockhart P.J. (2004) Using #' consensus networks to visualize contradictory evidence for species #' phylogeny. \emph{Molecular Biology and Evolution}, \bold{21}, 1459--61 #' @keywords hplot #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), #' bs=50) #' cnet <- consensusNet(bs, .3) #' plot(cnet) #' \dontrun{ #' library(rgl) #' open3d() #' plot(cnet, type = "3D", show.tip.label=FALSE, show.nodes=TRUE) #' plot(cnet, type = "equal angle", show.edge.label=TRUE) #' #' tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) #' trees <- read.tree(tmpfile) #' cnet_woodmouse <- consensusNet(trees, .3) #' plot(cnet_woodmouse, type = "equal angle", show.edge.label=TRUE) #' } #' #' @export consensusNet consensusNet <- function(obj, prob = 0.3, ...) { l <- length(obj) spl <- as.splits(obj) w <- attr(spl, "weights") ind <- (w / l) > prob spl <- spl[ind] attr(spl, "confidences") <- (w / l)[ind] # attr(spl, "weights") = w[ind] res <- as.networx(spl) res$edge.labels <- as.character(res$edge.length / l * 100) res$edge.labels[res$edge[, 2] <= length(res$tip.label)] <- "" reorder(res) } #' @rdname addConfidences #' @export createLabel <- function(x, y, label_y, type = "edge", nomatch = NA) { spl_x <- as.splits(x) if (inherits(x, "phylo", TRUE) == 1) spl_x <- spl_x[x$edge[, 2]] spl_y <- as.splits(y) if (inherits(y, "phylo", TRUE) == 1) spl_y <- spl_y[y$edge[, 2]] tiplabel <- attr(spl_x, "label") nTips <- length(tiplabel) spl_y <- changeOrder(spl_y, tiplabel) spl_y <- SHORTwise(spl_y) ind <- match(SHORTwise(spl_x), spl_y) pos <- which(!is.na(ind)) res <- rep(nomatch, length(spl_x)) if (length(label_y) == 1L) label_y <- rep(label_y, length(spl_y)) res[pos] <- label_y[ind[pos]] if (type == "edge" && inherits(x, "networx")) { return(res[x$splitIndex]) } res } #' Compare splits and add support values to an object #' #' Add support values to a \code{splits}, \code{phylo} or \code{networx} #' object. #' #' @param x an object of class \code{splits}, \code{phylo} or \code{networx} #' @param y an object of class \code{splits}, \code{phylo}, \code{multiPhylo} #' or \code{networx} #' @param ... Further arguments passed to or from other methods. #' @param label_y label of y matched on x. Will be usually of #' length(as.splits(x)). #' @param type should labels returned for edges (in \code{networx}) or splits. #' @param nomatch default value if no match between x and y is found. #' @return The object \code{x} with added bootstrap / MCMC support values. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{as.splits}}, \code{\link{as.networx}}, #' \code{\link{RF.dist}}, \code{\link{plot.phylo}} #' @references Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords cluster #' @examples #' #' data(woodmouse) #' woodmouse <- phyDat(woodmouse) #' tmpfile <- normalizePath(system.file("extdata/trees/RAxML_bootstrap.woodmouse", package="phangorn")) #' boot_trees <- read.tree(tmpfile) #' #' dm <- dist.ml(woodmouse) #' tree <- upgma(dm) #' nnet <- neighborNet(dm) #' #' tree <- addConfidences(tree, boot_trees) #' nnet <- addConfidences(nnet, boot_trees) #' #' plot(tree, show.node.label=TRUE) #' plot(nnet, "2D", show.edge.label=TRUE) #' #' @rdname addConfidences #' @export addConfidences <- function(x, y, ...) UseMethod("addConfidences") # some function to add confidences on splits if trees have different taxa # used in addConfidences.splits addConfidencesMultiPhylo <- function(spl, trees) { fun <- function(spl, intersect_labels) { spl2 <- spl index <- match(attr(spl, "labels"), intersect_labels) attr(spl2, "labels") <- intersect_labels for (i in seq_along(spl2)) { spl2[[i]] <- sort(na.omit(index[spl[[i]]])) } l_spl <- lengths(spl2) l <- length(intersect_labels) ind <- which((l_spl > 1) & (l_spl < (l - 1L))) if (length(ind) == 0) return(NULL) list(spl = spl2[ind], index = ind) } spl_labels <- attr(spl, "labels") zaehler <- numeric(length(spl)) nenner <- numeric(length(spl)) for (i in seq_along(trees)) { intersect_labels <- intersect(trees[[i]]$tip.label, spl_labels) if (length(intersect_labels) > 3) { tmp <- fun(spl, intersect_labels) if (!is.null(tmp)) { tree_spl <- as.splits(trees[[i]]) if (!identical(intersect_labels, trees[[i]]$tip.label)) tree_spl <- fun(tree_spl, intersect_labels)[[1]] comp <- compatible_2(as.bitsplits(tmp[[1]]), as.bitsplits(tree_spl)) ind <- tmp$index zaehler[ind] <- zaehler[ind] + comp nenner[ind] <- nenner[ind] + 1L } } } confidences <- zaehler / nenner attr(spl, "confidences") <- confidences spl } #' @export addConfidences.splits <- function(x, y, scaler = 1, ...) { if (hasArg(add)) add <- list(...)$add else add <- FALSE tiplabel <- attr(x, "label") nTips <- length(tiplabel) # x = addTrivialSplits(x) if (inherits(y, "phylo")) { ind <- match(tiplabel, y$tip.label) if (any(is.na(ind)) | length(tiplabel) != length(y$tip.label)) stop("trees have different labels") y$tip.label <- y$tip.label[ind] ind2 <- match(seq_along(ind), y$edge[, 2]) y$edge[ind2, 2] <- order(ind) } if (inherits(y, "multiPhylo")) { if (inherits(try(.compressTipLabel(y), TRUE), "try-error")) { res <- addConfidencesMultiPhylo(x, y) return(res) } } spl <- as.splits(y) # postprocess.proppart spl <- changeOrder(spl, tiplabel) spl <- SHORTwise(spl) ind <- match(SHORTwise(x), spl) # pos <- which(ind > nTips) pos <- which(!is.na(ind)) confidences <- rep(NA_real_, length(x)) # numeric(length(x)) #character if(is.numeric(attr(spl, "confidences"))) confidences[pos] <- attr(spl, "confidences")[ind[pos]] * scaler else confidences[pos] <- attr(spl, "confidences")[ind[pos]] if (add == TRUE) confidences <- paste(prettyNum(attr(x, "confidences")), prettyNum(confidences * scaler), sep = "/") # y$node.label[ind[pos] - nTips] attr(x, "confidences") <- confidences x } #' @export addConfidences.networx <- function(x, y, scaler = 1, ...) { spl <- x$splits spl <- addConfidences(spl, y, scaler = scaler, ...) x$splits <- spl x } #' @rdname addConfidences #' @export addConfidences.phylo <- function(x, y, ...) { # call <- x$call if (hasArg(as.is)) as.is <- list(...)$as.is else as.is <- TRUE nTips <- length(x$tip.label) spl <- as.splits(x) |> SHORTwise() conf <- attr(addConfidences(spl, y), "confidences") l <- lengths(spl) if (is.character(conf)) as.is <- TRUE # conf <- as.numeric(conf) ind <- (l == 1L) | (l == (nTips - 1L)) | (l == nTips) conf[ind == TRUE] <- NA_real_ nTips <- length(x$tip.label) if (!as.is) conf <- conf * 100 x$node.label <- conf[-c(1:nTips)] x } #' @export addConfidences.multiPhylo <- function(x, y, ...) { x <- .uncompressTipLabel(x) x <- unclass(x) x <- lapply(x, addConfidences, y) class(x) <- "multiPhylo" x } #' @rdname addConfidences #' @export presenceAbsence <- function(x, y) { spl <- as.splits(y) l <- length(spl) attr(spl, "confidences") <- rep(1, l) addConfidences(x, y) } #' @export reorder.networx <- function(x, order = "cladewise", index.only = FALSE, ...) { order <- match.arg(order, c("cladewise", "postorder")) if (!is.null(attr(x, "order"))) if (attr(x, "order") == order) return(x) g <- graph(t(x$edge)) if (order == "cladewise") neword <- topo_sort(g, "out") else neword <- topo_sort(g, "in") neworder <- order(match(x$edge[, 1], neword)) if (index.only) return(neworder) x$edge <- x$edge[neworder, ] if (!is.null(x$edge.length)) x$edge.length <- x$edge.length[neworder] if (!is.null(x$edge.labels)) x$edge.labels <- x$edge.labels[neworder] if (!is.null(x$splitIndex)) x$splitIndex <- x$splitIndex[neworder] attr(x, "order") <- order x } # some trigonemetric functions rad2deg <- function(rad) (rad * 180) / (pi) deg2rad <- function(deg) (deg * pi) / (180) # circular mean # https://en.wikipedia.org/wiki/Mean_of_circular_quantities circ.mean <- function(deg) { rad.m <- (deg * pi) / (180) mean.cos <- mean(cos(rad.m)) mean.sin <- mean(sin(rad.m)) theta <- rad2deg(atan(mean.sin / mean.cos)) if (mean.cos < 0) theta <- theta + 180 if ((mean.sin < 0) & (mean.cos > 0)) theta <- theta + 360 theta } spl2angle <- function(x) { l <- length(attr(x, "labels")) ord <- 1:l if (!is.null(attr(x, "cycle"))) ord <- attr(x, "cycle") x <- changeOrder(x, attr(x, "labels")[ord]) y <- lapply(x, function(x, l) (x - 1) / l * 360, l = l) angle <- vapply(y, circ.mean, 0) |> deg2rad() # angle <- ((vapply(x, sum, 0) / lengths(x) - 1) / l ) * 2*pi # kreis2kart(attr(x, "weight"), angle) angle } coords.equal.angle <- function(obj) { if (is.null(attr(obj, "order")) || (attr(obj, "order") == "postorder")) obj <- reorder.networx(obj) spl <- obj$splits spl <- SHORTwise(spl) #, length(obj$tip.label)) l <- length(obj$edge.length) # ind1 <- which(!duplicated(obj$splitIndex)) n <- max(obj$edge) angle <- spl2angle(spl) weight <- attr(spl, "weight") k <- matrix(0, max(obj$splitIndex), 2) res <- matrix(0, max(obj$edge), 2) for (i in 1:l) { # unique(obj$splitIndex) j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kreis2kart(weight[p], angle[p]) } res } #' @rdname phangorn-internal #' @export coords <- function(obj, dim = "3D") { # if(is.null(attr(obj,"order")) || (attr(obj, "order")=="postorder") ) # obj = reorder.networx(obj) if (dim == "equal_angle") return(coords.equal.angle(obj)) l <- length(obj$edge.length) ind1 <- which(!duplicated(obj$splitIndex)) n <- max(obj$edge) adj <- spMatrix(n, n, i = obj$edge[, 2], j = obj$edge[, 1], x = rep(1, length(obj$edge.length))) g <- graph_from_adjacency_matrix(adj, "undirected") ########## # add this # g2 <- graph(t(obj$edge), directed=FALSE) # g2 <- set.edge.attribute(g, "weight", value=rep(1, nrow(obj$edge)) if (dim == "3D") { coord <- layout_nicely(g, dim = 3) k <- matrix(0, max(obj$splitIndex), 3) for (i in ind1) { tmp <- coord[obj$edge[i, 2], ] - coord[obj$edge[i, 1], ] k[obj$splitIndex[i], ] <- kart2kugel(tmp[1], tmp[2], tmp[3]) } k[obj$splitIndex[ind1], 1] <- obj$edge.length[ind1] res <- matrix(0, vcount(g), 3) for (i in 1:l) { j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kugel2kart(k[p, 1], k[p, 2], k[p, 3]) } } else { coord <- layout_nicely(g, dim = 2) k <- matrix(0, max(obj$splitIndex), 2) for (i in ind1) { tmp <- coord[obj$edge[i, 2], ] - coord[obj$edge[i, 1], ] k[obj$splitIndex[i], ] <- kart2kreis(tmp[1], tmp[2]) } k[obj$splitIndex[ind1], 1] <- obj$edge.length[ind1] res <- matrix(0, vcount(g), 2) for (i in 1:l) { j <- obj$edge[i, 1] m <- obj$edge[i, 2] p <- obj$splitIndex[i] res[m, ] <- res[j, ] + kreis2kart(k[p, 1], k[p, 2]) } } res } kart2kugel <- function(x, y, z) { r <- sqrt(x * x + y * y + z * z) alpha <- atan(sqrt(x * x + y * y) / z) if (z < 0) alpha <- alpha + pi beta <- atan(y / x) if (x < 0) beta <- beta + pi c(r, alpha, beta) } kart2kreis <- function(x, y) { r <- sqrt(x * x + y * y) alpha <- atan(y / x) if (x < 0) alpha <- alpha + pi c(r, alpha) } kreis2kart <- function(r, alpha) { c(r * cos(alpha), r * sin(alpha)) # if(length(r)>1) return(matrix(c(r*cos(alpha), r*sin(alpha)), ncol=2)) # else return(c(r*cos(alpha), r*sin(alpha))) } kugel2kart <- function(r, alpha, beta) { x <- r * sin(alpha) * cos(beta) y <- r * sin(alpha) * sin(beta) z <- r * cos(alpha) c(x, y, z) } edgeLabels <- function(xx, yy, zz = NULL, edge) { XX <- (xx[edge[, 1]] + xx[edge[, 2]]) / 2 YY <- (yy[edge[, 1]] + yy[edge[, 2]]) / 2 if (!is.null(zz)) { ZZ <- (zz[edge[, 1]] + zz[edge[, 2]]) / 2 return(cbind(XX, YY, ZZ)) } cbind(XX, YY) } #' plot phylogenetic networks #' #' So far not all parameters behave the same on the the \code{rgl} \code{"3D"} and #' basic graphic \code{"2D"} device. #' #' Often it is easier and safer to supply vectors of graphical parameters for #' splits (e.g. splits.color) than for edges. These overwrite values edge.color. #' #' @param x an object of class \code{"networx"} #' @param type "3D" to plot using rgl or "2D" in the normal device. #' @param use.edge.length a logical indicating whether to use the edge weights #' of the network to draw the branches (the default) or not. #' @param show.tip.label a logical indicating whether to show the tip labels on #' the graph (defaults to \code{TRUE}, i.e. the labels are shown). #' @param show.edge.label a logical indicating whether to show the tip labels #' on the graph. #' @param edge.label an additional vector of edge labels (normally not needed). #' @param show.node.label a logical indicating whether to show the node labels #' (see example). #' @param node.label an additional vector of node labels (normally not needed). #' @param show.nodes a logical indicating whether to show the nodes (see #' example). #' @param tip.color the colors used for the tip labels. #' @param edge.color the colors used to draw edges. #' @param edge.width the width used to draw edges. #' @param edge.lty a vector of line types. #' @param split.color the colors used to draw edges. #' @param split.width the width used to draw edges. #' @param split.lty a vector of line types. #' @param font an integer specifying the type of font for the labels: 1 (plain #' text), 2 (bold), 3 (italic, the default), or 4 (bold italic). #' @param cex a numeric value giving the factor scaling of the labels. #' @param cex.node.label a numeric value giving the factor scaling of the node #' labels. #' @param cex.edge.label a numeric value giving the factor scaling of the edge #' labels. #' @param col.node.label the colors used for the node labels. #' @param col.edge.label the colors used for the edge labels. #' @param font.node.label the font used for the node labels. #' @param font.edge.label the font used for the edge labels. #' @param \dots Further arguments passed to or from other methods. #' @rdname plot.networx #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensusNet}}, \code{\link{neighborNet}}, #' \code{\link{splitsNetwork}}, \code{\link{hadamard}}, #' \code{\link{distanceHadamard}}, \code{\link{as.networx}}, #' \code{\link[ape]{evonet}}, \code{\link[ape]{as.phylo}}, #' \code{\link{densiTree}}, \code{\link[ape]{nodelabels}} #' @references Dress, A.W.M. and Huson, D.H. (2004) Constructing Splits Graphs #' \emph{IEEE/ACM Transactions on Computational Biology and Bioinformatics #' (TCBB)}, \bold{1(3)}, 109--115 #' #' Schliep, K., Potts, A. J., Morrison, D. A. and Grimm, G. W. (2017), #' Intertwining phylogenetic trees and networks. \emph{Methods Ecol Evol}. #' \bold{8}, 1212--1220. doi:10.1111/2041-210X.12760 #' @keywords plot #' @importFrom igraph graph #' @examples #' #' set.seed(1) #' tree1 <- rtree(20, rooted=FALSE) #' sp <- as.splits(rNNI(tree1, n=10)) #' net <- as.networx(sp) #' plot(net) #' \dontrun{ #' # also see example in consensusNet #' example(consensusNet) #' } #' @importFrom igraph graph_from_adjacency_matrix vcount topo_sort layout_nicely #' @method plot networx #' @export plot.networx <- function(x, type = "equal angle", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "black", edge.color = "black", edge.width = 3, edge.lty = 1, split.color = NULL, split.width = NULL, split.lty = NULL, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) { type <- match.arg(type, c("equal angle", "3D", "2D")) if (use.edge.length == FALSE){ x$edge.length[] <- 1 attr(x$splits, "weight") <- rep(1, length(x$splits)) } nTips <- length(x$tip.label) conf <- attr(x$splits, "confidences") index <- x$splitIndex if (is.null(edge.label) & !is.null(conf)) { conf <- conf[index] if (!is.null(x$translate)) conf[match(x$translate$node, x$edge[, 2])] <- "" else conf[x$edge[, 2] <= nTips] <- "" edge.label <- conf } if (is.null(node.label)) node.label <- as.character(1:max(x$edge)) if (show.tip.label) node.label[1:nTips] <- "" lspl <- max(x$splitIndex) if (!is.null(split.color)) { if (length(split.color) != lspl) stop("split.color must be same length as splits") else edge.color <- split.color[x$splitIndex] } if (!is.null(split.width)) { if (length(split.width) != lspl) stop("split.color must be same length as splits") else edge.width <- split.width[x$splitIndex] } if (!is.null(split.lty)) { if (length(split.lty) != lspl) stop("split.color must be same length as splits") else edge.lty <- split.lty[x$splitIndex] } chk <- FALSE if (type == "3D") chk <- requireNamespace("rgl", quietly = TRUE) if (!chk && type == "3D") { warning("type='3D' requires the package 'rgl', plotting in '2D' instead!\n") type <- "2D" } # use precomputed vertices when available coord <- NULL if (!is.null(x$.plot)) coord <- x$.plot$vertices if (type == "3D") { if (is.null(coord) || ncol(coord) != 3) coord <- coords(x, dim = "3D") plotRGL(coord, x, show.tip.label = show.tip.label, show.edge.label = show.edge.label, edge.label = edge.label, show.node.label = show.node.label, node.label = node.label, show.nodes = show.nodes, tip.color = tip.color, edge.color = edge.color, edge.width = edge.width, font = font, cex = cex, cex.node.label = cex.node.label, cex.edge.label = cex.edge.label, col.node.label = col.node.label, col.edge.label = col.edge.label, font.node.label = font.node.label, font.edge.label = font.edge.label) } else { if (is.null(coord) || ncol(coord) != 2) { if (type == "equal angle") coord <- coords.equal.angle(x) else coord <- coords(x, dim = "2D") } plot2D(coord, x, show.tip.label = show.tip.label, show.edge.label = show.edge.label, edge.label = edge.label, show.node.label = show.node.label, node.label = node.label, show.nodes = show.nodes, tip.color = tip.color, edge.color = edge.color, edge.width = edge.width, edge.lty = edge.lty, font = font, cex = cex, cex.node.label = cex.node.label, cex.edge.label = cex.edge.label, col.node.label = col.node.label, col.edge.label = col.edge.label, font.node.label = font.node.label, font.edge.label = font.edge.label, add = FALSE) } x$.plot <- list(vertices = coord, edge.color = edge.color, edge.width = edge.width, edge.lty = edge.lty) L <- list(Ntip = nTips, type = "networx") assign("last_plot.phylo", c(L, list(edge = x$edge, xx = coord[, 1], yy = coord[, 2])), envir = .PlotPhyloEnv) invisible(x) } plotRGL <- function(coords, net, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, show.nodes = FALSE, tip.color = "blue", edge.color = "grey", edge.width = 3, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, ...) { open3d <- rgl::open3d segments3d <- rgl::segments3d spheres3d <- rgl::spheres3d rgl.texts <- rgl::rgl.texts edge <- net$edge x <- coords[, 1] y <- coords[, 2] z <- coords[, 3] nTips <- length(net$tip.label) segments3d(x[t(edge)], y[t(edge)], z[t(edge)], col = rep(edge.color, each = 2), lwd = edge.width) radius <- 0 if (show.nodes) { radius <- sqrt( (max(x) - min(x))^2 + (max(y) - min(y))^2 + (max(z) - min(z))^2) / 200 spheres3d(x[1:nTips], y[1:nTips], z[1:nTips], radius = 2 * radius, color = "cyan") spheres3d(x[-c(1:nTips)], y[-c(1:nTips)], z[-c(1:nTips)], radius = radius, color = "magenta") } if (show.tip.label) { if (is.null(net$translate)) rgl.texts(x[1:nTips] + 2.05 * radius, y[1:nTips], z[1:nTips], net$tip.label, color = tip.color, cex = cex, font = font) else rgl.texts(x[net$translate$node] + 2.05 * radius, y[net$translate$node], z[net$translate$node], net$tip.label, color = tip.color, cex = cex, font = font) } if (show.edge.label) { ec <- edgeLabels(x, y, z, edge) if (is.null(edge.label)) edge.label <- net$splitIndex # else edge.label = net$splitIndex rgl.texts(ec[, 1], ec[, 2], ec[, 3], edge.label, color = col.edge.label, cex = cex.edge.label, font = font.edge.label) } if (show.node.label) { rgl.texts(x, y, z, node.label, color = col.node.label, cex = cex.node.label, font = font.node.label) } } plot2D <- function(coords, net, show.tip.label = TRUE, show.edge.label = FALSE, edge.label = NULL, show.node.label = FALSE, node.label = NULL, tip.color = "blue", edge.color = "grey", edge.width = 3, edge.lty = 1, font = 3, cex = par("cex"), cex.node.label = cex, cex.edge.label = cex, col.node.label = tip.color, col.edge.label = tip.color, font.node.label = font, font.edge.label = font, add = FALSE, ...) { edge <- net$edge label <- net$tip.label xx <- coords[, 1] yy <- coords[, 2] nTips <- length(label) xlim <- range(xx) ylim <- range(yy) if (show.tip.label) { offset <- max(nchar(label)) * 0.018 * cex * diff(xlim) xlim <- c(xlim[1] - offset, xlim[2] + offset) ylim <- c(ylim[1] - 0.03 * cex * diff(ylim), ylim[2] + 0.03 * cex * diff(ylim)) } if (!add) { plot.new() plot.window(xlim, ylim, asp = 1) } cladogram.plot(edge, xx, yy, edge.color, edge.width, edge.lty) if (show.tip.label) { if (is.null(net$translate)) ind <- match(1:nTips, edge[, 2]) else ind <- match(net$translate$node, edge[, 2]) pos <- rep(4, nTips) XX <- xx[edge[ind, 1]] - xx[edge[ind, 2]] pos[XX > 0] <- 2 YY <- yy[edge[ind, 1]] - yy[edge[ind, 2]] pos2 <- rep(3, nTips) pos2[YY > 0] <- 1 # needed if tiplabels are not at internal nodes XX[is.na(XX)] <- 0 YY[is.na(YY)] <- 0 pos[abs(YY) > abs(XX)] <- pos2[abs(YY) > abs(XX)] if (is.null(net$translate)) text(xx[1:nTips], yy[1:nTips], labels = label, pos = pos, col = tip.color, cex = cex, font = font) else text(xx[net$translate$node], yy[net$translate$node], labels = label, pos = pos, col = tip.color, cex = cex, font = font) } if (show.edge.label) { ec <- edgeLabels(xx, yy, edge = edge) if (is.null(edge.label)) edge.label <- net$splitIndex # show only one edge label em <- apply(ec, 1, function(x) max(abs(x))) si <- net$splitIndex for (i in unique(si)) { tmp <- si == i if (sum(tmp) > 1) { w <- which(tmp) wm <- which.max(em[w]) edge.label[w[-wm]] <- "" } } text(ec[, 1], ec[, 2], labels = edge.label, col = col.edge.label, cex = cex.edge.label, font = font.edge.label) } if (show.node.label) { text(xx, yy, labels = node.label, col = col.node.label, cex = cex.node.label, font = font.node.label) } } closest.edge <- function(x, y, P1, P2) { x1 <- P1[, 1] x2 <- P2[, 1] y1 <- P1[, 2] y2 <- P2[, 2] A <- sqrt( (x2 - x)^2 + (y2 - y)^2) # d_BC B <- sqrt( (x1 - x)^2 + (y1 - y)^2) # d_AC C <- sqrt( (x1 - x2)^2 + (y1 - y2)^2) # d_AB # Kosinussatz alpha <- acos( (B^2 + C^2 - A^2) / (2 * B * C)) beta <- acos( (A^2 + C^2 - B^2) / (2 * A * C)) d <- abs( (y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1) / sqrt( (y2 - y1)^2 + (x2 - x1)^2) d[alpha > (pi / 2)] <- B[alpha > (pi / 2)] d[beta > (pi / 2)] <- A[beta > (pi / 2)] d } closest.node <- function(x, y, P) { x1 <- P[, 1] y1 <- P[, 2] d <- sqrt((x1 - x)^2 + (y1 - y)^2) d } #' Identify splits in a network #' #' \code{identify.networx} reads the position of the graphics pointer when the #' mouse button is pressed. It then returns the split belonging to the edge #' closest to the pointer. The network must be plotted beforehand. #' #' @param x an object of class \code{networx} #' @param quiet a logical controlling whether to print a message inviting the #' user to click on the tree. #' @param \dots further arguments to be passed to or from other methods. #' @return \code{identify.networx} returns a splits object. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[phangorn]{plot.networx}}, \code{\link[graphics]{identify}} #' @examples #' \dontrun{ #' data(yeast) #' dm <- dist.ml(yeast) #' nnet <- neighborNet(dm) #' plot(nnet, "2D") #' identify(nnet) # click close to an edge #' } #' @importFrom graphics identify #' @method identify networx #' @export identify.networx <- function(x, quiet = FALSE, ...) { if (!quiet) cat("Click close to a node or edge of the tree...\n") xy <- locator(1) if (is.null(xy)) return(NULL) if (is.null(x$.plot)) { lastPP <- get("last_plot.phylo", envir = .PlotPhyloEnv) edge <- lastPP$edge xx <- lastPP$xx yy <- lastPP$yy vertices <- cbind(xx, yy) } else { lastPP <- x$.plot edge <- x$edge vertices <- lastPP$vertices } P1 <- vertices[edge[, 1], , drop = FALSE] P2 <- vertices[edge[, 2], , drop = FALSE] d <- closest.edge(xy$x, xy$y, P1, P2) split <- x$splitIndex[which.min(d)] x$splits[split] } phangorn/R/bab.R0000644000176200001440000002274714140462212013146 0ustar liggesusers# branch and bound getOrder <- function(x) { label <- names(x) dm <- as.matrix(dist.hamming(x, FALSE)) ind <- as.vector(which(dm == max(dm), arr.ind = TRUE)[1, ]) nTips <- as.integer(length(label)) added <- ind remaining <- c(1:nTips)[-ind] tree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), c(ind, 0L)), .Dim = c(3L, 2L)), tip.label = label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") l <- length(remaining) res <- numeric(l) nr <- attr(x, "nr") storage.mode(nr) <- "integer" # n <- length(x) #- 1L weight <- attr(x, "weight") storage.mode(weight) <- "double" # m <- nr * (2L * nTips - 2L) f <- init_fitch(x, FALSE, FALSE, m=4L) edge <- tree$edge for (i in seq_along(remaining)) { edge[3, 2] <- remaining[i] res[i] <- f$pscore(edge) } tmp <- which.max(res) added <- c(added, remaining[tmp]) remaining <- remaining[-tmp] tree$edge[, 2] <- added while (length(remaining) > 0) { edge <- tree$edge[, 2] + 2 * nTips f$prep_spr(tree$edge) l <- length(remaining) res <- numeric(l) nt <- numeric(l) for (j in 1:l) { score <- f$pscore_vec(edge, remaining[j]) res[j] <- min(score) nt[j] <- which.min(score) } tmp <- which.max(res) added <- c(added, remaining[tmp]) tree <- addOne(tree, remaining[tmp], nt[tmp]) remaining <- remaining[-tmp] } added <- c(added, remaining) added } pBound <- function(x, UB, LB) { nr <- attr(x, "nr") contrast <- attr(x, "contrast") rownames(contrast) <- attr(x, "allLevels") colnames(contrast) <- attr(x, "levels") weight0 <- attr(x, "weight") attr(x, "weight") <- rep(1, nr) attr(x, "index") <- NULL y <- as.character(x) singles <- attr(x, "levels") fun2 <- function(x, singles) all(x %in% singles) fun1 <- function(x) cumsum(!duplicated(x)) - 1L tmp <- apply(y, 2, fun2, singles) ind <- which(tmp) if (length(ind) < 2) return(numeric(nTips)) y <- y[, ind, drop = FALSE] weight0 <- weight0[ind] # print(sum(weight0)) UB <- UB[, ind, drop = FALSE] single_dis <- apply(y, 2, fun1) # single_dis <- LB nTips <- nrow(y) l <- length(weight0) res <- numeric(nTips) for (i in 1:(l - 1)) { for (j in (i + 1):l) { # cat(i, j, "\n") if ((weight0[i] > 0) & (weight0[j] > 0)) { z <- paste(y[, i], y[, j], sep = "_") dis2 <- single_dis[, i] + single_dis[, j] # D1 <- (dis2[nTips] - dis2) dis <- fun1(z) # dis <- pmax(dis, dis2) # D2 <- dis[nTips] - (UB[, i] + UB[, j]) if (dis[nTips] > dis2[nTips]) { # ub <- UB[, i] + UB[, j] # dis <- dis[nTips] - ub # d2 <- dis2[nTips] - dis2 # dis <- pmax(dis, d2) - d2 # dis <- pmax(dis, dis2) - dis2 dis <- dis - dis2 if (sum(dis[4:nTips]) > 0) { wmin <- min(weight0[i], weight0[j]) weight0[i] <- weight0[i] - wmin weight0[j] <- weight0[j] - wmin res <- res + dis * wmin } } } if(weight0[i] < 1e-6) break() } } # print(sum(weight0)) res } #' Branch and bound for finding all most parsimonious trees #' #' \code{bab} finds all most parsimonious trees. #' #' This implementation is very slow and depending on the data may take very #' long time. In the worst case all (2n-5)!! possible trees have to be #' examined, where n is the number of species / tips. For 10 species there are #' already 2027025 tip-labelled unrooted trees. It only uses some basic #' strategies to find a lower and upper bounds similar to penny from phylip. #' \code{bab} uses a very basic heuristic approach of MinMax Squeeze #' (Holland et al. 2005) to improve the lower bound. On the positive side #' \code{bab} is not like many other implementations restricted to binary or #' nucleotide data. #' #' @aliases bab BranchAndBound #' @param data an object of class phyDat. #' @param tree a phylogenetic tree an object of class phylo, otherwise a #' pratchet search is performed. #' @param trace defines how much information is printed during optimization. #' @param \dots Further arguments passed to or from other methods #' @return \code{bab} returns all most parsimonious trees in an object of class #' \code{multiPhylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} based on work on Liam #' Revell #' @seealso \code{\link{pratchet}}, \code{\link{dfactorial}} #' @references Hendy, M.D. and Penny D. (1982) Branch and bound algorithms to #' determine minimal evolutionary trees. \emph{Math. Biosc.} \bold{59}, #' 277-290 #' #' Holland, B.R., Huber, K.T. Penny, D. and Moulton, V. (2005) The MinMax #' Squeeze: Guaranteeing a Minimal Tree for Population Data, \emph{Molecular #' Biology and Evolution}, \bold{22}, 235--242 #' #' White, W.T. and Holland, B.R. (2011) Faster exact maximum parsimony search #' with XMP. \emph{Bioinformatics}, \bold{27(10)},1359--1367 #' @keywords cluster #' @examples #' #' data(yeast) #' dfactorial(11) #' # choose only the first two genes #' gene12 <- yeast[, 1:3158] #' trees <- bab(gene12) #' #' @export bab bab <- function(data, tree = NULL, trace = 1, ...) { if (!is.null(tree)) data <- subset(data, tree$tip.label) pBound <- TRUE nTips <- length(data) if (nTips < 4) return(stree(nTips, tip.label = names(data))) # New data <- removeParsimonyUninfomativeSites(data, recursive=TRUE) star_tree <- ifelse(attr(data, "nr") == 0, TRUE, FALSE) add_taxa <- ifelse(is.null(attr(data, "duplicated")), FALSE, TRUE) p0 <- attr(data, "p0") nTips <- length(data) if (nTips < 4L || star_tree) { nam <- names(data) if (star_tree) tree <- stree(length(nam), tip.label = nam) else tree <- stree(nTips, tip.label = names(data)) if(add_taxa) tree <- addTaxa(tree, attr(data, "duplicated")) tree <- unroot(tree) return(tree) } # compress sequences (all transitions count equal) data <- compressSites(data) o <- order(attr(data, "weight"), decreasing = TRUE) data <- subset(data, select = o) tree <- pratchet(data, start = tree, trace = trace - 1, ...) data <- subset(data, tree$tip.label) nr <- as.integer(attr(data, "nr")) inord <- getOrder(data) nTips <- m <- length(data) nr <- as.integer(attr(data, "nr")) TMP <- UB <- matrix(0, m, nr) for (i in 4:m) { TMP[i, ] <- lowerBound(subset(data, inord[1:i])) UB[i, ] <- upperBound(subset(data, inord[1:i])) } dat_used <- subset(data, inord) weight <- as.double(attr(data, "weight")) m <- nr * (2L * nTips - 2L) mmsAmb <- TMP %*% weight # mmsAmb <- mmsAmb[nTips] - mmsAmb mms0 <- 0 if (pBound) mms0 <- pBound(dat_used, UB, TMP) mms0 <- mms0 + mmsAmb mms0 <- mms0[nTips] - mms0 mms0 <- c(mms0, 0) f <- init_fitch(data, m=4L) if (trace > 1) print(paste("lower bound:", p0 + mms0[1])) bound <- f$pscore(tree$edge) if (trace > 1) print(paste("upper bound:", bound + p0)) startTree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), as.integer(inord)[1:3]), .Dim = c(3L, 2L)), tip.label = tree$tip.label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") trees <- vector("list", nTips) trees[[3]] <- list(startTree$edge) for (i in 4:nTips) trees[[i]] <- vector("list", (2L * i) - 5L) # new # index M[i] is neues node fuer edge i+1 # index L[i] is length(node) tree mit i+1 L <- as.integer(2L * (1L:nTips) - 3L) M <- as.integer(1L:nTips + nTips - 1L) PSC <- matrix(c(3, 1, 0), 1, 3) PSC[1, 3] <- f$pscore(startTree$edge) k <- 4L Nnode <- 1L npsc <- 1 visited <- numeric(nTips) result <- list() while (npsc > 0) { a <- PSC[npsc, 1] b <- PSC[npsc, 2] blub <- PSC[npsc, 3] PSC <- PSC[-npsc, , drop = FALSE] npsc <- npsc - 1L tmpTree <- trees[[a]][[b]] edge <- tmpTree[, 2] + 2 * nTips f$prep_spr(tmpTree) score <- f$pscore_vec(edge, as.integer(inord[a + 1L])) score <- score + blub + mms0[a + 1L] ms <- min(score) if (ms < bound + .1) { if ((a + 1L) < nTips) { ind <- (1:L[a])[score <= bound] trees[[a + 1]][seq_along(ind)] <- .Call('AddOnes', tmpTree, as.integer(inord[a + 1L]), as.integer(ind), as.integer(L[a]), as.integer(M[a])) l <- length(ind) # os <- order(score[ind], decreasing=TRUE) os <- seq_len(l) # in C++ pushback PSC <- rbind(PSC, cbind(rep(a + 1, l), os, score[ind] - mms0[a + 1L])) npsc <- npsc + l visited[a + 1] <- visited[a + 1] + l # PSC = rbind(PSC, cbind(rep(a+1, l), os, score[ind][os] )) } else { ind <- which(score == ms) tmp <- vector("list", length(ind)) tmp[seq_along(ind)] <- .Call('AddOnes', tmpTree, as.integer(inord[a + 1L]), as.integer(ind), as.integer(L[a]), as.integer(M[a])) if (ms < bound) { bound <- ms if (trace) cat("upper bound:", bound + p0, "\n") result <- tmp PSC <- PSC[PSC[, 3] < (bound + 1e-8), ] npsc <- nrow(PSC) } else result <- c(result, tmp) } } } for (i in seq_along(result)) { result[[i]] <- structure(list(edge = result[[i]], Nnode = nTips - 2L), .Names = c("edge", "Nnode"), class = "phylo", order = "postorder") } attr(result, "TipLabel") <- tree$tip.label attr(result, "visited") <- visited class(result) <- "multiPhylo" if(add_taxa) result <- addTaxa(result, attr(data, "duplicated")) return(result) } phangorn/R/modelTest.R0000644000176200001440000002407714126606535014374 0ustar liggesusersaic.weights <- function(aic) { diff.aic <- aic - min(aic) exp(-0.5 * diff.aic) / sum(exp(-0.5 * diff.aic)) } #' ModelTest #' #' Comparison of different nucleotide or amino acid substitution models #' #' \code{modelTest} estimates all the specified models for a given tree and #' data. When the mclapply is available, the computations are done in #' parallel. \code{modelTest} runs each model in one thread. This is may not #' work within a GUI interface and will not work under Windows. #' #' @aliases modelTest AICc #' @param object an object of class phyDat or pml #' @param tree a phylogenetic tree. #' @param model a vector containing the substitution models to compare with #' each other or "all" to test all available models #' @param G logical, TRUE (default) if (discrete) Gamma model should be tested #' @param I logical, TRUE (default) if invariant sites should be tested #' @param FREQ logical, FALSE (default) if TRUE amino acid frequencies will be #' estimated. #' @param k number of rate classes #' @param control A list of parameters for controlling the fitting process. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use, i.e. at most how many child #' processes will be run simultaneously. Must be at least one, and #' parallelization requires at least two cores. #' @return A data.frame containing the log-likelihood, number of estimated #' parameters, AIC, AICc and BIC all tested models. The data.frame has an #' attributes "env" which is an environment which contains all the trees, the #' data and the calls to allow get the estimated models, e.g. as a starting #' point for further analysis (see example). #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{anova}}, \code{\link[stats]{AIC}}, #' \code{\link{codonTest}} #' @references Burnham, K. P. and Anderson, D. R (2002) \emph{Model selection #' and multimodel inference: a practical information-theoretic approach}. 2nd #' ed. Springer, New York #' #' Posada, D. and Crandall, K.A. (1998) MODELTEST: testing the model of DNA #' substitution. \emph{Bioinformatics} \bold{14(9)}: 817-818 #' #' Posada, D. (2008) jModelTest: Phylogenetic Model Averaging. \emph{Molecular #' Biology and Evolution} \bold{25}: 1253-1256 #' #' Darriba D., Taboada G.L., Doallo R and Posada D. (2011) ProtTest 3: fast #' selection of best-fit models of protein evolution. . \emph{Bioinformatics} #' \bold{27}: 1164-1165 #' @keywords cluster #' @examples #' #' \dontrun{ #' example(NJ) #' (mT <- modelTest(Laurasiatherian, tree)) #' #' # some R magic #' env <- attr(mT, "env") #' ls(env=env) #' (F81 <- get("F81+G", env)) # a call #' eval(F81, env=env) #' #' data(chloroplast) #' (mTAA <- modelTest(chloroplast, model=c("JTT", "WAG", "LG"))) #' #' # test all available amino acid models #' (mTAA_all <- modelTest(chloroplast, model="all", multicore=TRUE, mc.cores=2)) #' } #' #' @export modelTest modelTest <- function(object, tree = NULL, model = c("JC", "F81", "K80", "HKY", "SYM", "GTR"), G = TRUE, I = TRUE, FREQ = FALSE, k = 4, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 1), multicore = FALSE, mc.cores = NULL) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } if (inherits(object, "phyDat")) data <- object if (inherits(object, "pml")) { data <- object$data if (is.null(tree)) tree <- object$tree } if(!identical(sort(names(data)), sort(tree$tip.label))){ stop("Labels in tree and data differ!") } if (attr(data, "type") == "DNA") type <- c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR") if (attr(data, "type") == "AA") type <- .aamodels if (attr(data, "type") == "USER") type <- "JC" if ( (length(model) == 1) && model == "all") model <- type model <- match.arg(model, type, TRUE) env <- new.env() assign("data", data, envir = env) if (is.null(tree)) tree <- candidate.tree(data) if (is.null(tree$tip.label)){ tree <- acctran(tree, data) tree$edge.length <- tree$edge.length / sum(attr(data, "weight")) tree <- minEdge(tree, tau=1e-8) } trace <- control$trace control$trace <- trace - 1 fit <- pml(tree, data) fit <- optim.pml(fit, control = control) l <- length(model) if (attr(fit$data, "type") == "DNA") FREQ <- FALSE n <- 1L + sum(I + G + (G & I) + FREQ + (FREQ & I) + (FREQ & G) + (FREQ & G & I)) nseq <- sum(attr(data, "weight")) fitPar <- function(model, fit, G, I, k, FREQ) { m <- 1 res <- matrix(NA, n, 6) res <- as.data.frame(res) colnames(res) <- c("Model", "df", "logLik", "AIC", "AICc", "BIC") data.frame(c("Model", "df", "logLik", "AIC", "AICc", "BIC")) calls <- vector("list", n) trees <- vector("list", n) fittmp <- optim.pml(fit, model = model, control = control) res[m, 1] <- model res[m, 2] <- fittmp$df res[m, 3] <- fittmp$logLik res[m, 4] <- AIC(fittmp) res[m, 5] <- AICc(fittmp) res[m, 6] <- AIC(fittmp, k = log(nseq)) calls[[m]] <- fittmp$call trees[[m]] <- fittmp$tree m <- m + 1 if (I) { if (trace > 0) print(paste0(model, "+I")) fitI <- optim.pml(fittmp, model = model, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+I") res[m, 2] <- fitI$df res[m, 3] <- fitI$logLik res[m, 4] <- AIC(fitI) res[m, 5] <- AICc(fitI) res[m, 6] <- AIC(fitI, k = log(nseq)) calls[[m]] <- fitI$call trees[[m]] <- fitI$tree m <- m + 1 } if (G) { if (trace > 0) print(paste0(model, "+G")) fitG <- update(fittmp, k = k) fitG <- optim.pml(fitG, model = model, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G") res[m, 2] <- fitG$df res[m, 3] <- fitG$logLik res[m, 4] <- AIC(fitG) res[m, 5] <- AICc(fitG) res[m, 6] <- AIC(fitG, k = log(nseq)) calls[[m]] <- fitG$call trees[[m]] <- fitG$tree m <- m + 1 } if (G & I) { if (trace > 0) print(paste0(model, "+G+I")) fitGI <- update(fitI, k = k) fitGI <- optim.pml(fitGI, model = model, optGamma = TRUE, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+G+I") res[m, 2] <- fitGI$df res[m, 3] <- fitGI$logLik res[m, 4] <- AIC(fitGI) res[m, 5] <- AICc(fitGI) res[m, 6] <- AIC(fitGI, k = log(nseq)) calls[[m]] <- fitGI$call trees[[m]] <- fitGI$tree m <- m + 1 } if (FREQ) { if (trace > 0) print(paste0(model, "+F")) fitF <- optim.pml(fittmp, model = model, optBf = TRUE, control = control) res[m, 1] <- paste0(model, "+F") res[m, 2] <- fitF$df res[m, 3] <- fitF$logLik res[m, 4] <- AIC(fitF) res[m, 5] <- AICc(fitF) res[m, 6] <- AIC(fitF, k = log(nseq)) calls[[m]] <- fitF$call trees[[m]] <- fitF$tree m <- m + 1 } if (FREQ & I) { if (trace > 0) print(paste0(model, "+I+F")) fitIF <- update(fitF, inv = fitI$inv) fitIF <- optim.pml(fitIF, model = model, optBf = TRUE, optInv = TRUE, control = control) res[m, 1] <- paste0(model, "+I+F") res[m, 2] <- fitIF$df res[m, 3] <- fitIF$logLik res[m, 4] <- AIC(fitIF) res[m, 5] <- AICc(fitIF) res[m, 6] <- AIC(fitIF, k = log(nseq)) calls[[m]] <- fitIF$call trees[[m]] <- fitIF$tree m <- m + 1 } if (FREQ & G) { if (trace > 0) print(paste0(model, "+G+F")) fitGF <- update(fitF, k = k, shape = fitG$shape) fitGF <- optim.pml(fitGF, model = model, optBf = TRUE, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G+F") res[m, 2] <- fitGF$df res[m, 3] <- fitGF$logLik res[m, 4] <- AIC(fitGF) res[m, 5] <- AICc(fitGF) res[m, 6] <- AIC(fitGF, k = log(nseq)) calls[[m]] <- fitGF$call trees[[m]] <- fitGF$tree m <- m + 1 } if (FREQ & G & I) { if (trace > 0) print(paste0(model, "+G+I+F")) fitGIF <- update(fitIF, k = k) fitGIF <- optim.pml(fitGIF, model = model, optBf = TRUE, optInv = TRUE, optGamma = TRUE, control = control) res[m, 1] <- paste0(model, "+G+I+F") res[m, 2] <- fitGIF$df res[m, 3] <- fitGIF$logLik res[m, 4] <- AIC(fitGIF) res[m, 5] <- AICc(fitGIF) res[m, 6] <- AIC(fitGIF, k = log(nseq)) calls[[m]] <- fitGIF$call trees[[m]] <- fitGIF$tree m <- m + 1 } list(res, trees, calls) } eval.success <- FALSE if (!eval.success & multicore) { RES <- mclapply(model, fitPar, fit, G, I, k, FREQ, mc.cores = mc.cores) eval.success <- TRUE } if (!eval.success) RES <- lapply(model, fitPar, fit, G, I, k, FREQ) RESULT <- matrix(NA, n * l, 8) RESULT <- as.data.frame(RESULT) colnames(RESULT) <- c("Model", "df", "logLik", "AIC", "AICw", "AICc", "AICcw", "BIC") for (i in 1:l) RESULT[( (i - 1) * n + 1):(n * i), c(1, 2, 3, 4, 6, 8)] <- RES[[i]][[1]] RESULT[, 5] <- aic.weights(RESULT[, 4]) RESULT[, 7] <- aic.weights(RESULT[, 6]) for (i in 1:l) { for (j in 1:n) { mo <- RES[[i]][[1]][j, 1] tname <- paste0("tree_", mo) tmpmod <- RES[[i]][[3]][[j]] tmpmod["tree"] <- call(tname) if (!is.null(tmpmod[["k"]])) tmpmod["k"] <- k if (attr(data, "type") == "AA") tmpmod["model"] <- RES[[i]][[1]][1, 1] assign(tname, RES[[i]][[2]][[j]], envir = env) assign(mo, tmpmod, envir = env) } } attr(RESULT, "env") <- env class(RESULT) <- c("modelTest", "data.frame") RESULT } tidy <- function(x, ...) UseMethod("tidy") tidy.modelTest <- function(x) { env <- attr(x, "env") l <- nrow(x) k <- rep(1L, l) shape <- rep(NA_real_, l) inv <- rep(0, l) for (i in seq_len(l)) { tmp <- get(x$Model[i], env) if (!is.null(tmp[["k"]])) k[i] <- tmp[["k"]] if (!is.null(tmp[["shape"]])) shape[i] <- tmp[["shape"]] if (!is.null(tmp[["inv"]])) inv[i] <- tmp[["inv"]] } data.frame(Model = x$Model, k = k, shape = shape, inv = inv) } phangorn/R/splits.R0000644000176200001440000003642114037257331013743 0ustar liggesusers#' Splits representation of graphs and trees. #' #' \code{as.splits} produces a list of splits or bipartitions. #' #' @aliases splits as.Matrix distinct.splits as.phylo.splits #' addTrivialSplits removeTrivialSplits matchSplits #' @param x An object of class phylo or multiPhylo. #' @param maxp integer, default from \code{options(max.print)}, influences how #' many entries of large matrices are printed at all. #' @param zero.print character which should be printed for zeros. #' @param one.print character which should be printed for ones. #' @param incomparables only for compatibility so far. #' @param unrooted todo. #' @param \dots Further arguments passed to or from other methods. #' @param recursive logical. If recursive = TRUE, the function recursively #' descends through lists (and pairlists) combining all their elements into a #' vector. #' @param obj an object of class splits. #' @param k number of taxa. #' @param labels names of taxa. #' @return \code{as.splits} returns an object of class splits, which is mainly #' a list of splits and some attributes. Often a \code{splits} object will #' contain attributes \code{confidences} for bootstrap or Bayesian support #' values and \code{weight} storing edge weights. #' \code{compatible} return a lower triangular matrix where an 1 indicates that #' two splits are incompatible. #' @note The internal representation is likely to change. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{prop.part}}, \code{\link{lento}}, #' \code{\link{as.networx}}, \code{\link{distanceHadamard}}, #' \code{\link{read.nexus.splits}} #' @keywords cluster #' @examples #' #' (sp <- as.splits(rtree(5))) #' write.nexus.splits(sp) #' spl <- allCircularSplits(5) #' plot(as.networx(spl), "2D") #' #' @rdname as.splits #' @export as.splits <- function(x, ...) { if (inherits(x, "splits")) return(x) UseMethod("as.splits") } #' @export as.Matrix <- function(x, ...) { if (inherits(x, "Matrix")) return(x) UseMethod("as.Matrix") } #' @rdname as.splits #' @method as.matrix splits #' @export as.matrix.splits <- function(x, zero.print = 0L, one.print = 1L, ...) { m <- length(x) labels <- attr(x, "labels") n <- length(labels) res <- matrix(zero.print, m, n) for (i in 1:m) res[i, x[[i]]] <- one.print dimnames(res) <- list(names(x), labels) res } #' @rdname as.splits #' @importFrom Matrix sparseMatrix #' @method as.Matrix splits #' @export as.Matrix.splits <- function(x, ...) { labels <- attr(x, "labels") l <- length(x) j <- unlist(x) i <- rep(1:l, lengths(x)) sparseMatrix(i, j, x = rep(1L, length(i)), dimnames = list(NULL, labels)) # included x und labels } #' @rdname as.splits #' @export print.splits <- function(x, maxp = getOption("max.print"), zero.print = ".", one.print = "|", ...) { x.orig <- x cx <- as.matrix(x, zero.print = zero.print, one.print = one.print) print(cx, quote = FALSE, right = TRUE, max = maxp) invisible(x.orig) } #' @export "[.splits" <- function(x, i) { tmp <- attributes(x) result <- unclass(x)[i] if (!is.null(tmp$weights)) tmp$weights <- tmp$weights[i] if (!is.null(tmp$confidences)) tmp$confidences <- tmp$confidences[i] if (!is.null(tmp$intervals)) tmp$intervals <- tmp$intervals[i] if (!is.null(tmp$data)) tmp$data <- tmp$data[i, , drop = FALSE] attributes(result) <- tmp result } changeOrder <- function(x, labels) { oldL <- attr(x, "labels") ind <- match(oldL, labels) for (i in seq_along(x)) x[[i]] <- sort(ind[x[[i]]]) if (!is.null(attr(x, "cycle"))) attr(x, "cycle") <- ind[attr(x, "cycle")] attr(x, "labels") <- labels x } ## @rdname as.splits #' @export matchSplits <- function(x, y, as.in = TRUE) { tiplabel <- attr(x, "label") if (any(is.na(match(tiplabel, attr(y, "label"))))) stop("x and y have different labels!") nTips <- length(tiplabel) y <- changeOrder(y, tiplabel) y <- SHORTwise(y) #, nTips) if (as.in) return(match(SHORTwise(x), y, nomatch = 0L) > 0L) match(SHORTwise(x), y) } optCycle <- function(splits, tree) { tips <- tree$tip.label tree <- reorder(tree) nodes <- sort(unique(tree$edge[, 1])) M <- as.matrix(splits) # l <- as.integer(nrow(M)) m <- as.integer(ncol(M)) tmp <- tree$edge[, 2] tmp <- tmp[tmp <= m] # start <- .C("countCycle", M[, tmp], l, m, integer(1))[[4]] start <- countCycle_cpp(M[, tmp]) best <- start eps <- 1 if (eps > 0) { for (i in seq_along(nodes)) { tmptree <- rotate(tree, nodes[i]) tmp <- tmptree$edge[, 2] tmp <- tmp[tmp <= m] # tmpC <- .C("countCycle", M[, tmp], l, m, integer(1))[[4]] tmpC <- countCycle_cpp(M[, tmp]) if (tmpC < best) { best <- tmpC tree <- tmptree } } eps <- start - best } tree } countCycles <- function(splits, tree = NULL, ord = NULL) { M <- as.matrix(splits) # l <- as.integer(nrow(M)) # m <- as.integer(ncol(M)) if (!is.null(tree)) ord <- getOrdering(tree) # res <- .C("countCycle2", M[, ord], l, m, integer(l))[[4]] res <- countCycle2_cpp(M[, ord]) res } #' @rdname as.splits #' @method c splits #' @export c.splits <- function(..., recursive = FALSE) { x <- list(...) if (length(x) == 1 && !inherits(x[[1]], "splits")) x <- x[[1]] n <- length(x) match.names <- function(a, b) { if (any(!(a %in% b))) stop("names do not match previous names") } if (n == 1) return(x[[1]]) labels <- attr(x[[1]], "labels") cycle <- attr(x[[1]], "cycle") for (i in 2:n) { match.names(labels, attr(x[[i]], "labels")) x[[i]] <- changeOrder(x[[i]], labels) } w <- as.vector(unlist(lapply(x, attr, "weights"))) x <- lapply(x, unclass) res <- structure(do.call("c", x), class = c("splits", "prop.part")) names(res) <- NULL attr(res, "labels") <- labels attr(res, "weights") <- w attr(res, "cycle") <- cycle res } #' @rdname as.splits #' @method unique splits #' @export unique.splits <- function(x, incomparables = FALSE, unrooted = TRUE, ...) { nTips <- length(attr(x, "labels")) x <- SHORTwise(x) x[!duplicated(x)] } #' @export distinct.splits <- function(...) { tmp <- c(...) res <- unique(tmp) attributes(res) <- attributes(tmp) attr(res, "weights") <- tabulate(match(tmp, res)) res } # computes splits from phylo #' @rdname as.splits #' @method as.splits phylo #' @export as.splits.phylo <- function(x, ...) { if (hasArg(as.is)) as.is <- list(...)$as.is else as.is <- TRUE result <- bip(x) if (!is.null(x$edge.length)) { edge.weights <- numeric(max(x$edge)) edge.weights[x$edge[, 2]] <- x$edge.length attr(result, "weights") <- edge.weights } if (!is.null(x$node.label)) { conf <- x$node.label if (is.character(conf)) as.is <- TRUE #conf <- as.numeric(conf) if (!as.is) if (max(na.omit(conf)) > (1 + 1e-8)) conf <- conf / 100 attr(result, "confidences") <- c(rep(NA_real_, length(x$tip.label)), conf) } attr(result, "labels") <- x$tip.label class(result) <- c("splits", "prop.part") result } # computes splits from multiPhylo object (e.g. bootstrap, MCMC etc.) #' @rdname as.splits #' @method as.splits multiPhylo #' @export as.splits.multiPhylo <- function(x, ...) { if (hasArg(trivial)) trivial <- list(...)$trivial else trivial <- TRUE lx <- length(x) x <- unroot(x) splits <- prop.part(x) splits <- postprocess.prop.part(splits, method="SHORTwise") class(splits) <- "list" weights <- attr(splits, "number") lab <- attr(splits, "labels") attr(splits, "labels") <- attr(splits, "number") <- NULL l <- length(lab) if(trivial){ splitTips <- vector("list", l) for (i in 1:l) splitTips[[i]] <- i result <- c(splitTips, splits) attr(result, "weights") <- c(rep(lx, l), weights) } else attr(result, "weights") <- weights attr(result, "confidences") <- attr(result, "weights") / lx attr(result, "summary") <- list(confidences = "ratio", ntrees = lx, clades = FALSE) attr(result, "labels") <- lab class(result) <- c("splits", "prop.part") result } #' @export as.splits.prop.part <- function(x, ...) { if (is.null(attr(x, "number"))) attr(x, "weights") <- rep(1, length(x)) else { attr(x, "weights") <- attr(x, "number") if( is.integer(attr(x, "number")) )attr(x, "confidences") <- attr(x, "number") / attr(x, "number")[1] } class(x) <- c("splits", "prop.part") x } #' @rdname as.splits #' @method as.splits networx #' @export as.splits.networx <- function(x, ...) { if (!is.null(x$splits)) x$splits else warning("No split object included!") } #' @rdname as.splits #' @method as.prop.part splits #' @export as.prop.part.splits <- function(x, ...) { attr(x, "number") <- attr(x, "weights") attr(x, "weights") <- NULL attr(x, "confidences") <- NULL class(x) <- c("prop.part") x } ## as.splits.phylo ## @rdname as.splits ## @method as.phylo splits #' @export as.phylo.splits <- function(x, check=TRUE,...){ if(check) x <- compatibleSplits(x) phy <- splits2phylo(x) spl <- as.splits(phy)[phy$edge[,2]] ind <- matchSplits(spl, x, FALSE) phy$edge.length <- attr(x, "weights")[ind] phy } splits2phylo <- function(x){ labels <- attr(x, "labels") nTips <- length(labels) x <- SHORTwise(x) l <- lengths(x) x <- x[order(l)] x <- x[lengths(x) > 1] nNodes <- length(x) + 1L node_i <- as.integer( nNodes + nTips ) edge <- matrix(0L, node_i - 1L, 2L) y <- seq_len(nTips) x <- unclass(x) m <- 0 for(i in seq_along(x)){ tmp <- x[[i]] kids <- unique( y[ tmp ] ) k <- length(kids) y[ tmp ] <- node_i edge[m + 1:k ,1] <- node_i edge[m + 1:k ,2] <- kids m <- m + k node_i <- node_i - 1L } kids <- unique( y ) k <- length(kids) edge[m + 1:k ,1] <- node_i edge[m + 1:k ,2] <- kids phy <- structure(list(edge, labels, nNodes), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") phy } compatibleSplits <- function(x) { x <- postprocess.splits(x) labels <- attr(x, "labels") nTips <- length(labels) x <- SHORTwise(x) # x <- x[lengths(x)>1] dm <- as.matrix(compatible(x)) rs <- rowSums(dm) ind <- which(rs == 0) if (any(rs > 0)) { tmp <- which(rs > 0) candidates <- tmp[order(rs[tmp])] for (i in candidates) { if (sum(dm[ind, i]) == 0) ind <- c(ind, i) } } x[ind] } postprocess.splits <- function (x) { # w <- attr(x, "number") tmp <- attributes(x) labels <- attr(x, "labels") x <- SHORTwise(x) drop <- duplicated(x) if (any(drop)) { W <- ifelse (is.null(tmp$weights), FALSE, TRUE) CONF <- ifelse (is.null(tmp$confidences), FALSE, TRUE) if(W) w <- tmp$weights if (CONF) conf <- tmp$confidences class(x) <- NULL attributes(x) <- NULL y <- x[drop] ind1 <- match(y, x) ind2 <- which(drop) for (i in seq_along(ind2)) { if(W) w[ind1[i]] <- w[ind1[i]] + w[ind2[i]] if(CONF) conf[ind1[i]] <- conf[ind1[i]] + conf[ind2[i]] } x <- x[!drop] w <- w[!drop] if(CONF) conf <- conf[!drop] attr(x, "weights") <- w if(CONF) attr(x, "confidences") <- conf attr(x, "labels") <- labels class(x) <- c("splits", "prop.part") } x } #' @rdname as.splits #' @method as.bitsplits splits #' @export as.bitsplits.splits <- function(x) { foo <- function(vect, RAWVECT) { res <- RAWVECT for (y in vect) { i <- ceiling(y / 8) res[i] <- res[i] | as.raw(2^(8 - ((y - 1) %% 8) - 1)) } res } N <- length(x) n <- length(attr(x, "labels")) nr <- ceiling(n / 8) mat <- raw(N * nr) dim(mat) <- c(nr, N) RAWVECT <- raw(nr) for (i in 1:N) mat[, i] <- foo(x[[i]], RAWVECT) freq <- attr(x, "weights") if (is.null(freq)) freq <- rep(1, N) structure(list(matsplit = mat, labels = attr(x, "labels"), freq = freq), class = "bitsplits") } #' @rdname as.splits #' @method as.splits bitsplits #' @export as.splits.bitsplits <- function(x, ...){ as.splits(as.prop.part(x)) } # computes compatible splits #' @rdname as.splits #' @export compatible <- function(obj) { labels <- attr(obj, "labels") if (!inherits(obj, "splits")) stop("obj needs to be of class splits") l <- length(labels) n <- length(obj) bp <- matrix(0L, n, l) for (i in 1:n) bp[i, obj[[i]]] <- 1L bp[bp[, 1] == 0L, ] <- 1L - bp[bp[, 1] == 0L, ] k <- 1 res <- matrix(0L, n, n) tmp1 <- tcrossprod(bp) # sum(bp[i,]* bp[j,]) tmp2 <- tcrossprod(1L - bp) # sum((1L - bp[i,])*(1L - bp[j,])) tmp3 <- tcrossprod(bp, 1L - bp) # sum(bp[i,]*(1L - bp[j,])) tmp4 <- tcrossprod(1L - bp, bp) # sum((1L - bp[i,])*bp[j,]) res[(tmp1 * tmp2 * tmp3 * tmp4) > 0] <- 1L k <- k + 1 res <- res[lower.tri(res)] attr(res, "Size") <- n attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" return(res) } # replace compatible ?? compatible2 <- function(obj1, obj2 = NULL) { if (!inherits(obj1, "splits")) stop("obj needs to be of class splits") labels <- attr(obj1, "labels") l <- length(labels) n <- length(obj1) bp1 <- as.matrix(obj1) bp1[bp1[, 1] == 0L, ] <- 1L - bp1[bp1[, 1] == 0L, ] if (!is.null(obj2)) { m <- length(obj2) bp2 <- as.matrix(obj2) labels2 <- attr(obj2, "labels") bp2 <- bp2[, match(labels2, labels), drop = FALSE] bp2[bp2[, 1] == 0L, ] <- 1L - bp2[bp2[, 1] == 0L, ] } else bp2 <- bp1 if (is.null(obj2)) res <- matrix(0L, n, n) else res <- matrix(0L, n, m) tmp1 <- tcrossprod(bp1, bp2) tmp2 <- tcrossprod(1L - bp1, 1L - bp2) tmp3 <- tcrossprod(bp1, 1L - bp2) tmp4 <- tcrossprod(1L - bp1, bp2) res[(tmp1 * tmp2 * tmp3 * tmp4) > 0] <- 1L if (is.null(obj2)) { res <- res[lower.tri(res)] attr(res, "Size") <- n attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" } return(res) } compatible3 <- function(x, y = NULL) { if (!inherits(x, "splits")) stop("x needs to be of class splits") if (is.null(y)) y <- x if (!inherits(y, "splits")) stop("y needs to be of class splits") xlabels <- attr(x, "labels") ylabels <- attr(y, "labels") if (identical(xlabels, ylabels)) labels <- xlabels else labels <- intersect(xlabels, ylabels) nx <- length(x) ny <- length(y) bp1 <- as.matrix(x)[, labels, drop = FALSE] bp2 <- as.matrix(y)[, labels, drop = FALSE] rs1 <- rowSums(bp1) rs2 <- rowSums(bp2) res <- matrix(0L, nx, ny) tmp1 <- tcrossprod(bp1, bp2) res <- matrix(0L, nx, ny) for (i in 1:nx) { for (j in 1:ny) { if (tmp1[i, j] == rs1[i]) res[i, j] <- 1 if (tmp1[i, j] == rs2[j]) res[i, j] <- 2 if (tmp1[i, j] == rs1[i] & tmp1[i, j] == rs2[j]) res[i, j] <- 3 } } if (is.null(y)) { res <- res[lower.tri(res)] attr(res, "Size") <- length(x) attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE class(res) <- "dist" } return(res) } compatible_2 <- function(obj1, obj2) { ntaxa <- length(obj1$labels) msk <- !as.raw(2^(8 - (ntaxa %% 8)) - 1) r0 <- as.raw(0) arecompatible2 <- function(x, y, msk, r0) { foo <- function(v) { lv <- length(v) v[lv] <- v[lv] & msk as.integer(all(v == r0)) } nE <- foo(x & y) + foo(x & !y) + foo(!x & y) + foo(!x & !y) if (nE > 0) TRUE else FALSE } m1 <- obj1$matsplit m2 <- obj2$matsplit n1 <- ncol(m1) n2 <- ncol(m2) res <- rep(TRUE, n1) for (i in 1:n1) { j <- 1 while (j <= n2) { if (!arecompatible2(m1[, i], m2[, j], msk, r0)) { res[i] <- FALSE break() } j <- j + 1L } } res } phangorn/R/codonTest.R0000644000176200001440000001442114140464146014362 0ustar liggesusers#' codonTest #' #' Models for detecting positive selection #' #' \code{codonTest} allows to test for positive selection similar to programs #' like PAML (Yang ) or HyPhy (Kosakovsky Pond et al. 2005). #' #' There are several options for deriving the codon frequencies. #' Frequencies can be "equal" (1/61), derived from nucleotide frequencies "F1x4" #' and "F3x4" or "empirical" codon frequencies. The frequencies taken using #' the empirical frequencies or estimated via maximum likelihood. #' #' So far the M0 model (Goldman and Yang 2002), M1a and M2a are #' implemented. The M0 model is always computed the other are optional. #' The convergence may be very slow and sometimes fails. #' #' @aliases codonTest #' @param object an object of class phyDat. #' @param tree a phylogenetic tree. #' @param model a vector containing the substitution models to compare with #' each other or "all" to test all available models. #' @param frequencies a character string or vector defining how to compute #' the codon frequencies #' @param opt_freq optimize frequencies (so far ignored) #' @param codonstart an integer giving where to start the translation. This #' should be 1, 2, or 3, but larger values are accepted and have for effect to #' start the translation further within the sequence. #' @param control a list of parameters for controlling the fitting process. #' @param ... further arguments passed to or from other methods. #' @return A list with an element called summary containing a data.frame with #' the log-likelihood, number of estimated parameters, etc. of all tested #' models. An object called posterior which contains the posterior probability #' for the rate class for each sites and the estimates of the defined models. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlMix}}, \code{\link{modelTest}}, #' \code{\link[stats]{AIC}} #' @references Ziheng Yang (2014). \emph{Molecular Evolution: A Statistical #' Approach}. Oxford University Press, Oxford #' #' Sergei L. Kosakovsky Pond, Simon D. W. Frost, Spencer V. Muse (2005) HyPhy: #' hypothesis testing using phylogenies, \emph{Bioinformatics}, \bold{21(5)}: #' 676--679, doi:10.1093/bioinformatics/bti079 #' #' Nielsen, R., and Z. Yang. (1998) Likelihood models for detecting positively #' selected amino acid sites and applications to the HIV-1 envelope gene. #' \emph{Genetics}, \bold{148}: 929--936 #' #' @examples #' #' \dontrun{ #' # load woodmouse data from ape #' data(woodmouse) #' dat_codon <- dna2codon(as.phyDat(woodmouse)) #' tree <- NJ(dist.ml(dat_codon)) #' # optimize the model the old way #' fit <- pml(tree, dat_codon, bf="F3x4") #' M0 <- optim.pml(fit, model="codon1") #' # Now using the codonTest function #' fit_codon <- codonTest(tree, dat_codon) #' fit_codon #' plot(fit_codon, "M1a") #' } #' #' @keywords cluster # @param control A list of parameters for controlling the fitting process. #' @export codonTest <- function(tree, object, model = c("M0", "M1a", "M2a"), frequencies = "F3x4", opt_freq=FALSE, codonstart = 1, control=pml.control(maxit = 20), ...){ if (attr(object, "type") == "DNA") object <- dna2codon(object, codonstart = codonstart, ...) if (is.null(tree$edge.length)) tree <- nnls.phylo(tree, dist.ml(object)) if (!("M0" %in% model)) model <- c("M0", model) trace <- control$trace control$trace <- trace - 1 if (trace > 2) print("optimize model M0") fit <- pml(tree, object, bf = frequencies) M0 <- optim.pml(fit, model="codon1", control = control) result <- cbind(model = "M0", Frequencies = frequencies, estimate = "empirical", glance.pml(M0), dnds_0 = M0$dnds, dnds_1 = NA, dnds_2 = NA, p_0 = 1, p_1 = NA, p_2 = NA, tstv = M0$tstv) choices <- c("M0", "M1a", "M2a") model <- match.arg(choices, model, TRUE) M1a <- NULL M2a <- NULL estimates <- vector("list", length(model)) names(estimates) <- model estimates[["M0"]] <- M0 prob <- list() if ("M1a" %in% model) { if (trace > 2) print("optimize model M1a") M1a_start <- list(update(M0, dnds = 0.1, scaleQ = 1), update(M0, dnds = 1, scaleQ = 1)) M1a <- pmlMix(rate ~ M1a, M1a_start, m = 2, control = control) result <- rbind(result, cbind(model = "M1a", Frequencies = frequencies, estimate = "empirical", glance.pmlMix(M1a), dnds_0 = M1a$dnds[1], dnds_1 = 1, dnds_2 = NA, p_0 = M1a$omega[1], p_1 = M1a$omega[2], p_2 = NA, tstv = M1a$fits[[1]]$tstv)) prob[["M1a"]] <- neb(M1a) estimates[["M1a"]] <- M1a } if ("M2a" %in% model) { if (trace > 2) print("optimize model M2a") M2a_start <- list(update(M0, dnds = 0.1, scaleQ = 1), update(M0, dnds = 1, scaleQ = 1), update(M0, dnds = 3, scaleQ = 1)) M2a <- pmlMix(rate ~ M2a, M2a_start, m = 3, control = control) result <- rbind(result, cbind(model = "M2a", Frequencies = frequencies, estimate = "empirical", glance.pmlMix(M2a), dnds_0 = M2a$dnds[1], dnds_1 = 1, dnds_2 = M2a$dnds[3], p_0 = M2a$omega[1], p_1 = M2a$omega[2], p_2 = M2a$omega[3], tstv = M2a$fits[[1]]$tstv)) prob[["M2a"]] <- neb(M2a) estimates[["M2a"]] <- M2a } # attr(result, "estimates") <- estimates # attr(result, "prob") <- prob res <- list(summary = result, posterior = prob, estimates = estimates) class(res) <- "codonTest" res } # tidy codon glance.pml <- function(x, ...) { res <- data.frame(logLik = x$logLik, df = x$df, AIC = AIC(x), BIC = BIC(x)) res } glance.pmlMix <- function(x, ...) { nr <- attr(x$fits[[1]]$data, "nr") res <- data.frame(logLik = x$logLik, df = attr(logLik(x), "df"), AIC = AIC(x), BIC = AIC(x, k = log(nr))) res } #' @export print.codonTest <- function(x, ...) print(x$summary) #' @importFrom grDevices hcl.colors #' @export plot.codonTest <- function(x, model = "M1a", col = hcl.colors(3), ...) { dat <- t(x$posterior[[model]]) colnames(dat) <- seq_len(ncol(dat)) barplot(dat, col = col, space = 0, border = NA, legend.text = prettyNum(x$estimates[[model]]$dnds), ...) } # compute Naive Empirical Bayes (NEB) probabilities neb <- function(x) { p <- x$omega l <- length(p) index <- attr(x$fits[[1]]$data, "index") res <- matrix(0, max(index), l) for (i in seq_len(l)) res[, i] <- p[i] * x$fits[[i]]$lv res <- res / rowSums(res) res[index, ] } phangorn/R/phylo.R0000644000176200001440000027500414155444613013564 0ustar liggesusersoptimQ <- function(tree, data, Q = rep(1, 6), subs = rep(1, length(Q)), trace = 0, ...) { m <- length(Q) n <- max(subs) o <- min(subs) ab <- numeric(n) # ab = log(Q[match(1:n, subs)]) for (i in 1:n) ab[i] <- log(Q[which(subs == i)[1]]) fn <- function(ab, tree, data, m, n, o, subs, ...) { Q <- numeric(m) for (i in 1:n) Q[subs == i] <- ab[i] if (o < 0) Q[subs < 0] <- -Inf pml.fit(tree, data, Q = exp(Q), ...) # Q^2, ...) } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = 10, control = list(fnscale = -1, maxit = 25, trace = trace), tree = tree, data = data, m = m, n = n, o = o, subs = subs, ...) Q <- rep(1, m) for (i in 1:n) Q[subs == i] <- exp(res[[1]][i]) if (o < 0) Q[subs < 0] <- 0 res[[1]] <- Q res } CodonQ <- function(subs, syn, tstv = 1, dnds = 1) { Q <- numeric(length(subs)) Q[subs == 1] <- 1 # transversion Q[subs == 2] <- tstv # transition Q[syn == 1] <- Q[syn == 1] * dnds Q[syn < 0] <- 0 Q } # needs no Q optimCodon <- function(tree, data, Q, subs, syn, trace = 0L, ab = c(0, 0), optK = TRUE, optW = TRUE, ...) { m <- length(Q) n <- 1L fn <- function(ab, tree, data, m, n, subs, syn, optK, optW, ...) { Q <- numeric(m) Q[subs == 1] <- 0 # transversion if (optK) Q[subs == 2] <- ab[1] # transition else Q[subs == 2] <- 0 if (optW) Q[syn == 1] <- Q[syn == 1] + ab[2] # ab[n+1] dnds Q[syn < 0] <- -Inf pml.fit(tree, data, Q = exp(Q), ...) # Q^2, ...) } res <- optim(par = ab, fn = fn, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = Inf, control = list(fnscale = -1, maxit = 25, trace = trace), tree = tree, data = data, m = m, n = n, subs = subs, syn = syn, optK = optK, optW = optW, ...) ab <- exp(res[[1]]) Q[subs == 1] <- 1 # transversion if (optK) Q[subs == 2] <- ab[1] # transition else { Q[subs == 2] <- 1 ab[1] <- 1 } if (optW) Q[syn == 1] <- Q[syn == 1] * ab[2] # dnds else ab[2] <- 1 Q[syn < 0] <- 0 res[[5]] <- ab res[[1]] <- Q res } subsChoice <- function(type = c("JC", "F81", "K80", "HKY", "TrNe", "TrN", "TPM1", "K81", "TPM1u", "TPM2", "TPM2u", "TPM3", "TPM3u", "TIM1e", "TIM1", "TIM2e", "TIM2", "TIM3e", "TIM3", "TVMe", "TVM", "SYM", "GTR")) { type <- match.arg(type) switch(type, JC = list(optQ = FALSE, optBf = FALSE, subs = c(0, 0, 0, 0, 0, 0)), F81 = list(optQ = FALSE, optBf = TRUE, subs = c(0, 0, 0, 0, 0, 0)), K80 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 0, 0, 1, 0)), HKY = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 0, 0, 1, 0)), TrNe = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 0, 0, 2, 0)), TrN = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 0, 0, 2, 0)), TPM1 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 1, 0)), K81 = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 1, 0)), TPM1u = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 2, 2, 1, 0)), TPM2 = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 1, 0, 2, 0)), TPM2u = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 1, 0, 2, 0)), TPM3 = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 0, 1, 2, 0)), TPM3u = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 0, 1, 2, 0)), TIM1e = list(optQ = TRUE, optBf = FALSE, subs = c(0, 1, 2, 2, 3, 0)), TIM1 = list(optQ = TRUE, optBf = TRUE, subs = c(0, 1, 2, 2, 3, 0)), TIM2e = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 1, 0, 3, 0)), TIM2 = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 1, 0, 3, 0)), TIM3e = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 0, 1, 3, 0)), TIM3 = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 0, 1, 3, 0)), TVMe = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 3, 4, 2, 0)), TVM = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 3, 4, 2, 0)), SYM = list(optQ = TRUE, optBf = FALSE, subs = c(1, 2, 3, 4, 5, 0)), GTR = list(optQ = TRUE, optBf = TRUE, subs = c(1, 2, 3, 4, 5, 0)) ) } optimGamma <- function(tree, data, shape = 1, k = 4, ...) { fn <- function(shape, tree, data, k, ...) pml.fit(tree, data, shape = shape, k = k, ...) res <- optimize(f = fn, interval = c(0.1, 100), lower = 0.1, upper = 1000, maximum = TRUE, tol = .01, tree = tree, data = data, k = k, ...) res } optimInv <- function(tree, data, inv = 0.01, INV = NULL, ll.0 = NULL, ...) { fn <- function(inv, tree, data, ...) pml.fit(tree, data, inv = inv, INV = INV, ll.0 = NULL, ...) res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = .0001, tree = tree, data = data, ...) res } optimFreeRate <- function(tree, data, g = c(.25, .75, 1, 2), k=4, w=w, ...) { g0 <- c(g[1], diff(g)) g0[g0 < 1e-8] <- 1e-8 # required by constrOptim R <- matrix(0, k, k) R[lower.tri(R, TRUE)] <- 1 fn <- function(g0, tree, data, R, w, k, ...) { g_new <- as.vector(R %*% g0) pml.fit(tree, data, g=g_new, w=w, k=k, ...) } ui <- rbind(R, diag(k)) ci <- rep(0, 2 * k) # Maybe constrain rates * omega res <- constrOptim(g0, fn, grad = NULL, ui = ui, ci = ci, mu = 1e-04, control = list(fnscale = -1), method = "Nelder-Mead", outer.iterations = 100, outer.eps = 1e-08, tree = tree, data = data, R = R, w = w, k=k, ...) rate <- res[[1]] res[[1]] <- as.vector(R %*% rate) res } optimWs <- function(tree, data, w = c(.25, .25, .25, .25), g=g, ...) { k <- length(w) nenner <- 1 / w[1] eta <- log(w * nenner) eta <- eta[-1] fn <- function(eta, tree, data, g, k, ...) { eta <- c(0, eta) w_new <- exp(eta) / sum(exp(eta)) pml.fit(tree, data, g=g, w=w_new, k=k, ...) } if (k == 2) res <- optimize(f = fn, interval = c(-3, 3), lower = -3, upper = 3, maximum = TRUE, tol = .Machine$double.eps^0.25, tree = tree, data = data, g = g, k=k, ...) else res <- optim(eta, fn = fn, method = "L-BFGS-B", lower = -5, upper = 5, control = list(fnscale = -1, maxit = 25), gr = NULL, tree = tree, data = data, g = g, k = k, ...) w <- exp(c(0, res[[1]])) w <- w / sum(w) result <- list(par = w, value = res[[2]]) result } # changed to c(-10,10) from c(-5,5) optimRate <- function(tree, data, rate = 1, ...) { fn <- function(rate, tree, data, ...) pml.fit(tree, data, rate = exp(rate), ...) res <- optimize(f = fn, interval = c(-10, 10), tree = tree, data = data, ..., maximum = TRUE) res[[1]] <- exp(res[[1]]) res } optimBf <- function(tree, data, bf = c(.25, .25, .25, .25), trace = 0, ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, tree, data, ...) { bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) pml.fit(tree, data, bf = bf, ...) } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500, trace = trace), tree = tree, data = data, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) result <- list(bf = bf, loglik = res[[2]]) result } # MLF3x4 model optimF3x4 <- function(tree, data, bf_codon = matrix(.25, 4, 3), trace = 0, ...) { l <- nrow(bf_codon) nenner <- 1 / bf_codon[l, ] lbf <- log(bf_codon * rep(nenner, each = 4)) lbf <- lbf[-l, ] fn <- function(lbf, tree, data, ...) { dim(lbf) <- c(3, 3) bf_codon <- rbind(exp(lbf), c(1, 1, 1)) bf_codon <- bf_codon / rep(colSums(bf_codon), each = 4) bf <- F3x4_freq(bf_codon) pml.fit(tree, data, bf = bf, ...) } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500, trace = trace), tree = tree, data = data, ...) bf_codon <- rbind(exp(res[[1]]), c(1, 1, 1)) bf_codon <- bf_codon / rep(colSums(bf_codon), each = 4) bf <- F3x4_freq(bf_codon) result <- list(bf = bf, loglik = res[[2]], bf_codon = bf_codon) result } # predict.pml <- function(object, newdata,...) sum(object$siteLik * newdata) #' @export logLik.pml <- function(object, ...) { res <- object$logLik attr(res, "df") <- object$df class(res) <- "logLik" res } #' @export AICc <- function(object, ...) UseMethod("AICc") #' @export AICc.pml <- function(object, ...) { n <- sum(object$weight) k <- object$df if (k >= (n - 1)) return(NaN) res <- AIC(object) res + (2 * k * (k + 1)) / (n - k - 1) } #' @export BIC.pml <- function(object, ...) { res <- AIC(object, k = log(sum(object$weight))) res } #' @export anova.pml <- function(object, ...) { X <- c(list(object), list(...)) fun <- function(x) { tmp <- logLik(x) c(tmp[1], attr(tmp, "df")) } DF <- t(sapply(X, fun)) dev <- c(NA, 2 * diff(DF[, 1])) ddf <- c(NA, diff(DF[, 2])) table <- data.frame(DF, ddf, dev, pchisq(dev, ddf, lower.tail = FALSE)) dimnames(table) <- list(seq_along(X), c("Log lik.", "Df", "Df change", "Diff log lik.", "Pr(>|Chi|)")) structure(table, heading = "Likelihood Ratio Test Table", class = c("anova", "data.frame")) } # vcov.pml <- function(object, obs=FALSE,...){ # if(obs) FI = score4(object)[[2]] # else FI = score(object,FALSE)[[2]] # l = dim(FI)[1] # res = try(solve(FI)) # if(class(res) == "try-error"){ # cat("Covariance is ill-conditioned !! \n") # res = solve(FI + diag(l)* 1e-8) # } # res # } #' @export vcov.pml <- function(object, ...) { FI <- score(object, FALSE)[[2]] l <- dim(FI)[1] res <- try(solve(FI)) if (inherits(res, "try-error")) { cat("Covariance is ill-conditioned !! \n") res <- solve(FI + diag(l) * 1e-8) } res } getdP <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getdPM", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } # version without transformation (used for vcov) getdP2 <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getdPM2", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } getP <- function(el, eig = edQt(), g = 1.0) { n <- length(eig$values) res <- .Call("getPM", eig, as.integer(n), as.double(el), as.double(g)) attr(res, "dim") <- c(length(g), length(el)) res } #' @rdname pml.fit #' @export lli <- function(data, tree = NULL, ...) { contrast <- attr(data, "contrast") nr <- attr(data, "nr") nc <- attr(data, "nc") nco <- as.integer(dim(contrast)[1]) if (!is.null(tree)) data <- subset(data, tree$tip.label) .Call("invSites", data, as.integer(nr), as.integer(nc), contrast, as.integer(nco)) } #' @rdname pml.fit #' @export edQt <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) res <- res / sum(res2) e <- eigen(res, FALSE) e$inv <- solve.default(e$vec) e } # some functions to get codon models to work getScaler <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25)) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) sum(res2) } # eigen value decomposition without scaling edQt2 <- function(Q = c(1, 1, 1, 1, 1, 1), bf = c(0.25, 0.25, 0.25, 0.25), scale = 1) { l <- length(bf) res <- matrix(0, l, l) res[lower.tri(res)] <- Q res <- res + t(res) res <- res * bf res2 <- res * rep(bf, each = l) diag(res) <- -colSums(res) res <- res / scale e <- eigen(res, FALSE) e$inv <- solve.default(e$vec) e } df_freq_codon <- function(bf) { switch(bf, equal = 0, empirical = 60, F61 = 60, F3x4 = 9, F1x4 = 3) } #' @rdname pml.fit #' @export pml.free <- function() { .Call("ll_free2") # rm(.INV, .iind, envir = parent.frame()) } #' @rdname pml.fit #' @export pml.init <- function(data, k = 1L) { nTips <- length(data) nr <- attr(data, "nr") nc <- attr(data, "nc") .Call("ll_init2", as.integer(nr), as.integer(nTips), as.integer(nc), as.integer(k)) } fn.quartet <- function(old.el, eig, bf, dat, g = 1, w = 1, weight, ll.0) { l <- length(dat[, 1]) ll <- ll.0 res <- vector("list", 2 * l) tmp1 <- NULL tmp2 <- NULL attr(res, "dim") <- c(l, 2) for (j in 1:l) { P <- getP(old.el, eig, g[j]) tmp1 <- (dat[[j, 1]] %*% P[[1]]) * (dat[[j, 2]] %*% P[[2]]) tmp2 <- (dat[[j, 3]] %*% P[[3]]) * (dat[[j, 4]] %*% P[[4]]) res[[j, 1]] <- tmp1 * (tmp2 %*% P[[5]]) res[[j, 2]] <- tmp2 ll <- ll + res[[j, 1]] %*% (w[j] * bf) } l0 <- sum(weight * log(ll)) list(ll = l0, res = res) } rnodes <- function(tree, data, w, g, eig, bf) { tree <- reorder(tree, "postorder") data <- getCols(data, tree$tip.label) q <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- length(edge) + 1 # max(edge) l <- length(w) dat <- vector(mode = "list", length = m * l) dim(dat) <- c(l, m) tmp <- length(data) # for(i in seq_along(w))dat[i,1:tmp]=new2old.phyDat(data) # # dat[1,1:tmp] <- data vielleicht gebraucht el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) for (i in 1:l) dat[i, (q + 1):m] <- .Call("LogLik2", data, P[i, ], nr, nc, node, edge, nTips, mNodes, contrast, nco) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 datp <- vector("list", m) dat2 <- vector("list", m * l) dim(dat2) <- c(l, m) for (i in 1:l) { datp[(nTips + 1)] <- dat[i, (nTips + 1)] for (j in (m - 1):1) { if (child[j] > nTips) { tmp2 <- (datp[[parent[j]]] / (dat[[i, child[j]]] %*% P[[i, j]])) datp[[child[j]]] <- (tmp2 %*% P[[i, j]]) * dat[[i, child[j]]] dat2[[i, child[j]]] <- tmp2 } } } assign(".dat", dat, envir = parent.frame(n = 1)) dat2 } score <- function(fit, transform = TRUE) { tree <- fit$tree child <- tree$edge[, 2] l <- length(child) sc <- numeric(l) weight <- as.numeric(fit$weight) f <- drop(exp(fit$siteLik)) dl <- dl(fit, transform) dl <- dl / f sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) names(sc) <- child dimnames(F) <- list(child, child) result <- list(sc = sc, F = F) result } # wird noch in partition models verwendet optim.quartet <- function(old.el, eig, bf, dat, g = 1, w = 1, weight, ll.0 = weight * 0, control = list(eps = 1e-08, maxit = 5, trace = 0, tau=1e-8), llcomp = -Inf) { eps <- 1 iter <- 0 evi <- (t(eig[[3]]) * bf) tau <- control$tau while (eps > control$eps && iter < control$maxit) { tmp <- fn.quartet(old.el = old.el, eig = eig, bf = bf, dat = dat, g = g, w = w, weight = weight, ll.0 = ll.0) old.ll <- tmp$ll el1 <- fs(old.el[1], eig, tmp$res[, 1], dat[, 1], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau = tau, getA = TRUE, getB = FALSE) el2 <- fs(old.el[2], eig, el1[[2]], dat[, 2], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau = tau, getA = TRUE, getB = FALSE) el5 <- fs(old.el[5], eig, el2[[2]], tmp$res[, 2], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau = tau, getA = FALSE, getB = TRUE) el3 <- fs(old.el[3], eig, el5[[3]], dat[, 3], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau = tau, getA = TRUE, getB = FALSE) el4 <- fs(old.el[4], eig, el3[[2]], dat[, 4], weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau = tau, getA = FALSE, getB = FALSE) old.el[1] <- el1[[1]] old.el[2] <- el2[[1]] old.el[3] <- el3[[1]] old.el[4] <- el4[[1]] old.el[5] <- el5[[1]] iter <- iter + 1 ll <- el4[[4]] eps <- (old.ll - ll) / ll if (ll < llcomp) return(list(old.el, ll)) old.ll <- ll } list(old.el, ll) } #' @export plot.pml <- function(x, ...) plot.phylo(x$tree, ...) phangornParseFormula <- function(model) { parseSide <- function(model) { model.vars <- list() while (length(model) == 3 && model[[1]] == as.name("+")) { model.vars <- c(model.vars, model[[3]]) model <- model[[2]] } unlist(rev(c(model.vars, model))) } if (!inherits(model, "formula")) stop("model must be a formula object") l <- length(model) varsLHS <- NULL if (l == 3) { modelLHS <- model[[2]] modelRHS <- model[[3]] varsRHS <- parseSide(modelRHS) varsRHS <- unlist(lapply(varsRHS, as.character)) varsLHS <- parseSide(modelLHS) varsLHS <- unlist(lapply(varsLHS, as.character)) } if (l == 2) { modelRHS <- model[[2]] varsRHS <- parseSide(modelRHS) varsRHS <- unlist(lapply(varsRHS, as.character)) } list(left = varsLHS, right = varsRHS) } #' @rdname pml #' @export pml.control <- function(epsilon = 1e-08, maxit = 10, trace = 1, tau = 1e-8) { if (!is.numeric(epsilon) || epsilon <= 0) stop("value of 'epsilon' must be > 0") if (!is.numeric(maxit) || maxit <= 0) stop("maximum number of iterations must be > 0") if (!is.numeric(tau) || tau <= 0) stop("tau must be > 0") list(epsilon = epsilon, maxit = maxit, trace = trace, tau = tau) } fs <- function(old.el, eig, parent.dat, child.dat, weight, g = g, w = w, bf = bf, ll.0 = ll.0, evi, tau=1e-8, getA = TRUE, getB = TRUE) { if (old.el < 1e-8) old.el <- 1e-8 lg <- length(parent.dat) P <- getP(old.el, eig, g) nr <- as.integer(length(weight)) nc <- as.integer(length(bf)) dad <- .Call("getDAD", parent.dat, child.dat, P, nr, nc) X <- .Call("getPrep", dad, child.dat, eig[[2]], evi, nr, nc) .Call("FS4", eig, as.integer(length(bf)), as.double(old.el), as.double(w), as.double(g), unlist(X), child.dat, dad, as.integer(length(w)), nr, as.double(weight), as.double(ll.0), as.double(tau), as.integer(getA), as.integer(getB)) } optimEdge <- function(tree, data, eig = eig, w = w, g = g, bf = bf, rate = rate, ll.0 = ll.0, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0, tau=1e-8), ...) { tree <- reorder(tree, "postorder") nTips <- length(tree$tip.label) el <- tree$edge.length tree$edge.length[el < 1e-08] <- 1e-08 oldtree <- tree k <- length(w) data <- subset(data, tree$tip.label) loglik <- pml.fit4(tree, data, bf=bf, g=g, w=w, eig=eig, ll.0=ll.0, ...) start.ll <- old.ll <- loglik contrast <- attr(data, "contrast") contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) weight <- attr(data, "weight") eps <- 1 iter <- 0 treeP <- tree tree <- reorder(tree) tau <- control$tau child <- tree$edge[, 2] parent <- tree$edge[, 1] m <- max(tree$edge) pvec <- integer(m) pvec[child] <- parent EL <- numeric(m) EL[child] <- tree$edge.length n <- length(tree$edge.length) nr <- as.integer(length(weight)) nc <- as.integer(length(bf)) nco <- as.integer(nrow(contrast)) lg <- k ScaleEPS <- 1.0 / 4294967296.0 anc <- Ancestors(tree, 1:m, "parent") anc0 <- as.integer(c(0L, anc)) while (eps > control$eps && iter < control$maxit) { EL <- .Call("optE", as.integer(parent), as.integer(child), as.integer(anc0), eig, evi, EL, w, g, as.integer(nr), as.integer(nc), as.integer(nTips), as.double(contrast), as.double(contrast2), nco, data, as.double(weight), as.double(ll.0), as.double(tau)) iter <- iter + 1 treeP$edge.length <- EL[treeP$edge[, 2]] newll <- pml.fit4(treeP, data, bf=bf, g=g, w=w, eig=eig, ll.0=ll.0, ...) eps <- (old.ll - newll) / newll if (eps < 0) return(list(tree=oldtree, logLik=old.ll)) oldtree <- treeP if (control$trace > 1) cat(old.ll, " -> ", newll, "\n") old.ll <- newll } if (control$trace > 0) cat("optimize edge weights: ", start.ll, "-->", newll, "\n") list(tree = treeP, logLik = newll, c(eps, iter)) } pml.move <- function(EDGE, el, data, g, w, eig, k, nTips, bf) { node <- EDGE[, 1] edge <- EDGE[, 2] nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - nTips - 1L) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) tmp2 <- .Call("PML4", dlist = data, as.double(el), as.double(w), as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) return(NULL) } bip <- function(x) { x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) res <- .Call("_phangorn_bipCPP", x$edge, nTips) attr(res, "labels") <- x$tip.label res } # replace with prop.part bipart <- function(x) { x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) res <- .Call('_phangorn_bipartCPP', x$edge, nTips) attr(res, "labels") <- x$tip.label res } bipartition <- function(tree) { if (is.rooted(tree)) tree <- unroot(tree) tree <- reorder(tree, "postorder") bp <- bip(tree) nTips <- length(tree$tip.label) l <- length(bp) res <- matrix(0L, l, nTips) for (i in 1:l) res[i, bp[[i]]] <- 1L res <- res[tree$edge[, 2], , drop = FALSE] colnames(res) <- tree$tip.label rownames(res) <- tree$edge[, 2] res[res[, 1] == 1, ] <- 1L - res[res[, 1] == 1, ] res } readAArate <- function(file) { tmp <- read.table(system.file(file.path("extdata", file)), col.names = 1:20, fill = TRUE) Q <- tmp[1:19, 1:19] names <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") Q <- as.numeric(Q[lower.tri(Q, TRUE)]) bf <- as.numeric(as.character(unlist(tmp[20, ]))) names(bf) <- names list(Q = Q, bf = bf) } # .LG <- readAArate("lg.dat") # .WAG <- readAArate("wag.dat") # .Dayhoff <- readAArate("dayhoff-dcmut.dat") # .JTT <- readAArate("jtt-dcmut.dat") # .cpREV <- readAArate("cpREV.dat") # .mtmam <- readAArate("mtmam.dat") # .mtArt <- readAArate("mtArt.dat") # save(.LG,.WAG,.Dayhoff,.JTT,.cpREV,.mtmam,.mtArt, file = "sysdata2.rda") getModelAA <- function(model, bf = TRUE, Q = TRUE) { model <- match.arg(eval(model), .aamodels) tmp <- get(paste(".", model, sep = ""), environment(pml)) if (Q) assign("Q", tmp$Q, envir = parent.frame()) if (bf) assign("bf", tmp$bf, envir = parent.frame()) } #' @export print.pml <- function(x, ...) { cat("\n loglikelihood:", x$logLik, "\n") w <- x$weight w <- w[w > 0] type <- attr(x$data, "type") levels <- attr(x$data, "levels") nc <- attr(x$data, "nc") ll0 <- sum(w * log(w / sum(w))) cat("\nunconstrained loglikelihood:", ll0, "\n") if (x$inv > 0) cat("Proportion of invariant sites:", x$inv, "\n") if (x$k > 1) { cat("Discrete gamma model\n") cat("Number of rate categories:", x$k, "\n") cat("Shape parameter:", x$shape, "\n") } if (type == "AA") cat("Rate matrix:", x$model, "\n") if (type == "DNA") { cat("\nRate matrix:\n") QM <- matrix(0, nc, nc, dimnames = list(levels, levels)) QM[lower.tri(QM)] <- x$Q QM <- QM + t(QM) print(QM) cat("\nBase frequencies: \n") bf <- x$bf names(bf) <- levels cat(bf, "\n") } if (type == "CODON") { cat("dn/ds:", x$dnds, "\n") cat("ts/tv:", x$tstv, "\n") cat("Freq:", x$frequencies, "\n") } if (type == "USER" & length(x$bf) < 11) { cat("\nRate matrix:\n") QM <- matrix(0, nc, nc, dimnames = list(levels, levels)) QM[lower.tri(QM)] <- x$Q QM <- QM + t(QM) print(QM) cat("\nBase frequencies: \n") bf <- x$bf names(bf) <- levels cat(bf, "\n") } } optEdgeMulti <- function(object, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1, tau = 1e-8), ...) { tree <- object$tree theta <- object$tree$edge.length weight <- attr(object$data, "weight") ll0 <- object$logLik eps <- 1 iter <- 0 iter2 <- 0 scale <- 1 # l <- length(theta) while (abs(eps) > control$eps && iter < control$maxit) { dl <- score(object) thetaNew <- log(theta) + scale * solve(dl[[2]], dl[[1]]) # + diag(l) * 1e-10 newtheta <- exp(thetaNew) tree$edge.length <- as.numeric(newtheta) object <- update(object, tree = tree) ll1 <- object$logLik eps <- (ll0 - ll1) / ll1 if (eps < 0) { newtheta <- theta scale <- scale / 2 tree$edge.length <- as.numeric(theta) ll1 <- ll0 iter2 <- iter2 + 1 } else { scale <- 1 iter2 <- 0 } theta <- newtheta if (iter2 == 0 && control$trace > 0) cat("loglik: ", ll1, "\n") ll0 <- ll1 if (iter2 == 10) iter2 <- 0 if (iter2 == 0) iter <- iter + 1 } object <- update(object, tree = tree) object } # add data for internal use parent.frame(n) for higher nestings update.pmlNew <- function(object, ..., evaluate = TRUE) { call <- object$call if (is.null(call)) stop("need an object with call component") extras <- match.call(expand.dots = FALSE)$... if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } if (evaluate) eval(call, object, parent.frame()) else call } #' @export update.pml <- function(object, ...) { extras <- match.call(expand.dots = FALSE)$... pmla <- c("tree", "data", "bf", "Q", "inv", "k", "shape", "rate", "model", "wMix", "llMix", "dnds", "tstv", "scaleQ","...") names(extras) <- pmla[pmatch(names(extras), pmla[-length(pmla)])] call <- object$call if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } existing <- match(pmla, names(extras)) updateEig <- FALSE updateRates <- FALSE Mkv <- object$Mkv site.rate <- object$site.rate type <- attr(object$data, "type") if(type=="CODON"){ bf_choice <- object$frequencies } if (is.na(existing[1])) tree <- object$tree else tree <- eval(extras[[existing[1]]], parent.frame()) tree <- reorder(tree, "postorder") if (is.na(existing[2])) { data <- object$data INV <- object$INV } else { data <- eval(extras[[existing[2]]], parent.frame()) ll.0 <- numeric(attr(data, "nr")) INV <- Matrix(lli(data, tree), sparse = TRUE) } nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) if (is.na(existing[3])) bf <- object$bf else { bf <- eval(extras[[existing[3]]], parent.frame()) # check for "character" if (is.character(bf)) { bf_choice <- match.arg(bf, c("equal", "empirical", "F1x4", "F3x4", "F61")) # if(bf_choice %in% c("F1x4", "F3x4", "F61") & type != "CODON") if (bf_choice == "F3x4" & type != "CODON") stop("F3x4 not available for this data type") if (bf_choice == "F1x4" & type != "CODON") stop("F1x4 not available for this data type") if (bf_choice == "F61" & type != "CODON") stop("F61 not available for this data type") bf <- switch(bf_choice, equal = rep(1 / nc, nc), empirical = baseFreq(data), F61 = baseFreq(data), F3x4 = F3x4(data), F1x4 = F1x4(data)) freq_df <- df_freq_codon(bf_choice) names(bf) <- NULL } updateEig <- TRUE } if (is.na(existing[4])) Q <- object$Q else { Q <- eval(extras[[existing[4]]], parent.frame()) updateEig <- TRUE } type <- attr(object$data, "type") model <- NULL if (type == "AA") { if (!is.na(existing[9])) { model <- match.arg(eval(extras[[existing[9]]], parent.frame()), .aamodels) getModelAA(model, bf = is.na(existing[3]), Q = is.na(existing[4])) updateEig <- TRUE } # else model <- object$model } scaleQ <- FALSE if (type == "CODON") { if (is.na(existing[12])) dnds <- object$dnds else { dnds <- eval(extras[[existing[12]]], parent.frame()) updateEig <- TRUE } if (is.na(existing[13])) tstv <- object$tstv else { tstv <- eval(extras[[existing[13]]], parent.frame()) updateEig <- TRUE } if (!is.na(existing[14])) { scaleQ <- eval(extras[[existing[14]]], parent.frame()) updateEig <- TRUE } if (updateEig){ .syn <- synonymous_subs(code=attr(data, "code")) .sub <- tstv_subs(code=attr(data, "code")) Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) } } if (is.na(existing[5])) inv <- object$inv else { inv <- eval(extras[[existing[5]]], parent.frame()) updateRates <- TRUE } if (is.na(existing[6])) k <- object$k else { k <- eval(extras[[existing[6]]], parent.frame()) updateRates <- TRUE } if (is.na(existing[7])) shape <- object$shape else { shape <- eval(extras[[existing[7]]], parent.frame()) updateRates <- TRUE } rate <- ifelse(is.na(existing[8]), object$rate, eval(extras[[existing[8]]], parent.frame())) wMix <- ifelse(is.na(existing[10]), object$wMix, eval(extras[[existing[10]]], parent.frame())) if (is.na(existing[11])) llMix <- object$llMix else llMix <- eval(extras[[existing[11]]], parent.frame()) levels <- attr(data, "levels") weight <- attr(data, "weight") if (updateEig){ if(scaleQ) eig <- edQt2(Q = Q, bf = bf, scale = scaleQ) else eig <- edQt(Q = Q, bf = bf) } else { eig <- object$eig model <- object$model } rw <- rates_n_weights(shape, k, site.rate) g <- rw[, 1] w <- rw[, 2] if (inv > 0){ w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix m <- 1 ### play save kmax <- k if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] k <- length(w) } #### resll <- matrix(0, nr, k) nTips <- as.integer(length(tree$tip.label)) data <- subset(data, tree$tip.label) on.exit(.Call("ll_free2")) .Call("ll_init2", nr, nTips, nc, as.integer(k)) tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE) df <- ifelse(is.ultrametric(tree), tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (k > 1) + (inv > 0), CODON = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + (dnds != 1) + (tstv != 1), USER = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) result <- list(logLik = tmp$loglik, inv = inv, k = kmax, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = weight, g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix, Mkv=Mkv, site.rate=site.rate) if (type == "CODON") { result$dnds <- dnds result$tstv <- tstv result$frequencies <- bf_choice } class(result) <- "pml" result } ### this is the version we want to optimize pml.fit4 <- function(tree, data, bf = rep(1 / length(levels), length(levels)), inv = 0, g, w, eig, ll.0, llMix = NULL, wMix = 0, ..., site = FALSE, Mkv = FALSE, site.rate = "gamma") { weight <- as.double(attr(data, "weight")) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) k <- length(w) m <- 1 # if (is.null(ll.0)) { # ll.0 <- numeric(attr(data, "nr")) # } # if (is.null(INV)) # INV <- Matrix(lli(data, tree), sparse = TRUE) # if (inv > 0) # ll.0 <- as.matrix(INV %*% (bf * inv)) # if (Mkv) # ll.0 <- as.matrix(INV %*% bf) # if (wMix > 0) # ll.0 <- ll.0 + llMix node <- tree$edge[, 1] edge <- tree$edge[, 2] el <- as.double(tree$edge.length) node <- as.integer(node - nTips - 1L) # min(node)) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) siteLik <- .Call("PML4", dlist = data, el, as.double(w), as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) if (inv > 0){ ind <- which(ll.0 > 0) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) } # if (!is.null(ll.0)) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) loglik <- sum(weight * siteLik) # neu if (Mkv) { ind <- seq_len(nc) p0 <- sum(exp(siteLik[ind])) if(is.nan(log(1 - p0))) browser() loglik <- loglik - sum(weight) * log(1 - p0) # cat("pml.fit4", loglik, "\n") } if (!site) return(loglik) return(list(loglik = loglik, siteLik = siteLik)) # , resll=resll } #' Internal maximum likelihood functions. #' #' These functions are internally used for the likelihood computations in #' \code{pml} or \code{optim.pml}. #' #' These functions are exported to be used in different packages so far only in #' the package coalescentMCMC, but are not intended for end user. Most of the #' functions call C code and are far less forgiving if the import is not what #' they expect than \code{pml}. #' #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param data An alignment, object of class \code{phyDat}. #' @param bf Base frequencies. #' @param shape Shape parameter of the gamma distribution. #' @param k Number of intervals of the discrete gamma distribution. #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param levels The alphabet used e.g. c("a", "c", "g", "t") for DNA #' @param inv Proportion of invariable sites. #' @param rate Rate. #' @param g vector of quantiles (default is NULL) #' @param w vector of probabilities (default is NULL) #' @param eig Eigenvalue decomposition of Q #' @param INV Sparse representation of invariant sites #' @param ll.0 default is NULL #' @param llMix default is NULL #' @param wMix default is NULL #' @param \dots Further arguments passed to or from other methods. #' @param site return the log-likelihood or vector of sitewise likelihood #' values #' @param Mkv indicate if Lewis' Mkv should be estimated. #' @param site.rate Indicates what type of gamma distribution to use. Options #' are "gamma" approach of Yang 1994 (default), "quadrature" after the Laguerre #' quadrature approach of Felsenstein 2001 and "freerate" . ## or "lognormal" after a lognormal quadrature approach. #' @return \code{pml.fit} returns the log-likelihood. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}, \link{pmlPart}, \link{pmlMix}} #' @references Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a #' maximum likelihood approach. \emph{Journal of Molecular Evolution}, #' \bold{17}, 368--376. #' @keywords cluster #' #' @rdname pml.fit #' @export pml.fit pml.fit <- function(tree, data, bf = rep(1 / length(levels), length(levels)), shape = 1, k = 1, Q = rep(1, length(levels) * (length(levels) - 1) / 2), levels = attr(data, "levels"), inv = 0, rate = 1, g = NULL, w = NULL, eig = NULL, INV = NULL, ll.0 = NULL, llMix = NULL, wMix = 0, ..., site = FALSE, Mkv = FALSE, site.rate = "gamma") { weight <- as.double(attr(data, "weight")) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) k <- as.integer(k) m <- 1 if (is.null(eig)) eig <- edQt(bf = bf, Q = Q) if(is.null(g) | is.null(w)){ rw <- rates_n_weights(shape, k, site.rate) g <- rw[, 1] w <- rw[, 2] if (inv > 0){ w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate } if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] # kmax <- k k <- length(w) } if (is.null(INV)) INV <- Matrix(lli(data, tree), sparse = TRUE) if (is.null(ll.0)) { ll.0 <- numeric(attr(data, "nr")) } if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) # Notwendig?? if (Mkv) ll.0 <- as.matrix(INV %*% bf) if (wMix > 0) ll.0 <- ll.0 + llMix node <- tree$edge[, 1] edge <- tree$edge[, 2] # root <- as.integer(node[length(node)]) el <- as.double(tree$edge.length) node <- as.integer(node - nTips - 1L) # min(node)) edge <- as.integer(edge - 1L) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) resll <- .Call("PML0", dlist = data, el, as.double(g), nr, nc, k, eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) sca <- .Call("rowMax", resll, length(weight), as.integer(k)) + 1 # nr statt length(weight) lll <- resll - sca lll <- exp(lll) lll <- (lll %*% w) if (inv > 0){ ind <- which(ll.0 > 0) # automatic in INV gespeichert lll[ind] <- lll[ind] + exp(log(ll.0[ind]) - sca[ind]) } siteLik <- log(lll) + sca # needs to change if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) loglik <- sum(weight * siteLik) if (Mkv) { ind <- seq_len(nc) p0 <- sum(exp(log(lll[ind]) + sca[ind])) loglik <- loglik - sum(weight) * log(1 - p0) } if (!site) return(loglik) resll <- exp(resll) return(list(loglik = loglik, siteLik = siteLik, resll = resll)) } ### @param optF3x4 Logical value indicating if codon frequencies are estimated ### for the F3x4 model #' Likelihood of a tree. #' #' \code{pml} computes the likelihood of a phylogenetic tree given a sequence #' alignment and a model. \code{optim.pml} optimizes the different model #' parameters. #' #' Base frequencies in \code{pml} can be supplied in different ways. #' For amino acid they are usually defined through specifying a model, so the #' argument bf does not need to be specified. Otherwise if \code{bf=NULL}, #' each state is given equal probability. It can be a numeric vector given the #' frequencies. Last but not least \code{bf} can be string "equal", "empirical" #' and for codon models additionally "F3x4". #' #' The topology search uses a nearest neighbor interchange (NNI) and the #' implementation is similar to phyML. The option model in pml is only used #' for amino acid models. The option model defines the nucleotide model which #' is getting optimized, all models which are included in modeltest can be #' chosen. Setting this option (e.g. "K81" or "GTR") overrules options optBf #' and optQ. Here is a overview how to estimate different phylogenetic models #' with \code{pml}: \tabular{lll}{ model \tab optBf \tab optQ \cr Jukes-Cantor #' \tab FALSE \tab FALSE \cr F81 \tab TRUE \tab FALSE \cr symmetric \tab FALSE #' \tab TRUE \cr GTR \tab TRUE \tab TRUE } Via model in optim.pml the following #' nucleotide models can be specified: JC, F81, K80, HKY, TrNe, TrN, TPM1, K81, #' TPM1u, TPM2, TPM2u, TPM3, TPM3u, TIM1e, TIM1, TIM2e, TIM2, TIM3e, TIM3, #' TVMe, TVM, SYM and GTR. These models are specified as in Posada (2008). #' #' So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", #' "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", #' "FLU", "Blosum62", "Dayhoff_DCMut" and "JTT_DCMut") and additionally rate #' matrices and amino acid frequencies can be supplied. #' #' It is also possible to estimate codon models (e.g. YN98), for details see #' also the chapter in vignette("phangorn-specials"). #' #' If the option 'optRooted' is set to TRUE than the edge lengths of rooted #' tree are optimized. The tree has to be rooted and by now ultrametric! #' Optimising rooted trees is generally much slower. #' #' \code{pml.control} controls the fitting process. \code{epsilon} and #' \code{maxit} are only defined for the most outer loop, this affects #' \code{pmlCluster}, \code{pmlPart} and \code{pmlMix}. \code{epsilon} is #' defined as (logLik(k)-logLik(k+1))/logLik(k+1), this seems to be a good #' heuristics which works reasonably for small and large trees or alignments. #' If \code{trace} is set to zero than no out put is shown, if functions are #' called internally than the trace is decreased by one, so a higher of trace #' produces more feedback. #' #' If \code{rearrangement} is set to \code{stochastic} a stochastic search #' algorithm similar to Nguyen et al. (2015). and for \code{ratchet} the #' likelihood ratchet as in Vos (2003). This should helps often to find better #' tree topologies, especially for larger trees. #' #' @aliases pml #' @param tree A phylogenetic \code{tree}, object of class \code{phylo}. #' @param data An alignment, object of class \code{phyDat}. #' @param bf Base frequencies (see details). #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param inv Proportion of invariable sites. #' @param k Number of intervals of the discrete gamma distribution. #' @param shape Shape parameter of the gamma distribution. #' @param rate Rate. #' @param model allows to choose an amino acid models or nucleotide model, see #' details. #' @param site.rate Indicates what type of gamma distribution to use. Options #' are "gamma" approach of Yang 1994 (default), "quadrature" after the Laguerre #' quadrature approach of Felsenstein 2001 or "freerate". ## or "lognormal" after a lognormal #' @param object An object of class \code{pml}. #' @param optNni Logical value indicating whether topology gets optimized (NNI). #' @param optBf Logical value indicating whether base frequencies gets #' optimized. #' @param optQ Logical value indicating whether rate matrix gets optimized. #' @param optInv Logical value indicating whether proportion of variable size #' gets optimized. #' @param optGamma Logical value indicating whether gamma rate parameter gets #' optimized. #' @param optEdge Logical value indicating the edge lengths gets optimized. #' @param optRate Logical value indicating the overall rate gets optimized. #' @param optRooted Logical value indicating if the edge lengths of a rooted #' tree get optimized. #' @param ratchet.par search parameter for stochastic search #' @param rearrangement type of tree tree rearrangements to perform, one of #' "none", "NNI", "stochastic" or "ratchet" #' @param control A list of parameters for controlling the fitting process. #' @param subs A (integer) vector same length as Q to specify the optimization #' of Q #' @param \dots Further arguments passed to or from other methods. #' @param epsilon Stop criterion for optimization (see details). #' @param maxit Maximum number of iterations (see details). #' @param trace Show output during optimization (see details). #' @param tau minimal edge length. #' @return \code{pml} or \code{optim.pml} return a list of class \code{pml}, #' some are useful for further computations like \item{tree}{the phylogenetic #' tree.} \item{data}{the alignment.} \item{logLik}{Log-likelihood of the #' tree.} \item{siteLik}{Site log-likelihoods.} \item{weight}{Weight of the #' site patterns.} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bootstrap.pml}}, \code{\link{modelTest}}, #' \code{\link{pmlPart}}, \code{\link{pmlMix}}, \code{\link{plot.phylo}}, #' \code{\link{SH.test}}, \code{\link{ancestral.pml}} #' @references Felsenstein, J. (1981) Evolutionary trees from DNA sequences: a #' maximum likelihood approach. \emph{Journal of Molecular Evolution}, #' \bold{17}, 368--376. #' #' Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer Associates, #' Sunderland. #' #' Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University #' Press, Oxford. #' #' Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa (2000) Plastid genome #' phylogeny and a model of amino acid substitution for proteins encoded by #' chloroplast DNA. \emph{Journal of Molecular Evolution}, \bold{50}, 348--358 #' #' Rota-Stabelli, O., Z. Yang, and M. Telford. (2009) MtZoa: a general #' mitochondrial amino acid substitutions model for animal evolutionary #' studies. \emph{Mol. Phyl. Evol}, \bold{52(1)}, 268--72 #' #' Whelan, S. and Goldman, N. (2001) A general empirical model of protein #' evolution derived from multiple protein families using a maximum-likelihood #' approach. \emph{Molecular Biology and Evolution}, \bold{18}, 691--699 #' #' Le, S.Q. and Gascuel, O. (2008) LG: An Improved, General Amino-Acid #' Replacement Matrix \emph{Molecular Biology and Evolution}, \bold{25(7)}, #' 1307--1320 #' #' Yang, Z., R. Nielsen, and M. Hasegawa (1998) Models of amino acid #' substitution and applications to Mitochondrial protein evolution. #' \emph{Molecular Biology and Evolution}, \bold{15}, 1600--1611 #' #' Abascal, F., D. Posada, and R. Zardoya (2007) MtArt: A new Model of amino #' acid replacement for Arthropoda. \emph{Molecular Biology and Evolution}, #' \bold{24}, 1--5 #' #' Kosiol, C, and Goldman, N (2005) Different versions of the Dayhoff rate #' matrix - \emph{Molecular Biology and Evolution}, \bold{22}, 193--199 #' #' L.-T. Nguyen, H.A. Schmidt, A. von Haeseler, and B.Q. Minh (2015) IQ-TREE: A #' fast and effective stochastic algorithm for estimating maximum likelihood #' phylogenies. \emph{Molecular Biology and Evolution}, \bold{32}, 268--274. #' #' Vos, R. A. (2003) Accelerated Likelihood Surface Exploration: The Likelihood #' Ratchet. \emph{Systematic Biology}, \bold{52(3)}, 368--373 #' #' Yang, Z., and R. Nielsen (1998) Synonymous and nonsynonymous rate variation #' in nuclear genes of mammals. \emph{Journal of Molecular Evolution}, #' \bold{46}, 409-418. #' #' Lewis, P.O. (2001) A likelihood approach to estimating phylogeny from #' discrete morphological character data. \emph{Systematic Biology} \bold{50}, #' 913--925. #' @keywords cluster #' @importFrom Matrix Matrix #' @examples #' #' example(NJ) #' # Jukes-Cantor (starting tree from NJ) #' fitJC <- pml(tree, Laurasiatherian) #' # optimize edge length parameter #' fitJC <- optim.pml(fitJC) #' fitJC #' #' \dontrun{ #' # search for a better tree using NNI rearrangements #' fitJC <- optim.pml(fitJC, optNni=TRUE) #' fitJC #' plot(fitJC$tree) #' #' # JC + Gamma + I - model #' fitJC_GI <- update(fitJC, k=4, inv=.2) #' # optimize shape parameter + proportion of invariant sites #' fitJC_GI <- optim.pml(fitJC_GI, optGamma=TRUE, optInv=TRUE) #' # GTR + Gamma + I - model #' fitGTR <- optim.pml(fitJC_GI, rearrangement = "stochastic", #' optGamma=TRUE, optInv=TRUE, model="GTR") #' } #' #' #' # 2-state data (RY-coded) #' dat <- acgt2ry(Laurasiatherian) #' fit2ST <- pml(tree, dat) #' fit2ST <- optim.pml(fit2ST,optNni=TRUE) #' fit2ST #' # show some of the methods available for class pml #' methods(class="pml") #' #' @rdname pml #' @export pml pml <- function(tree, data, bf = NULL, Q = NULL, inv = 0, k = 1, shape = 1, rate = 1, model = NULL, site.rate = "gamma", ...) { Mkv <- FALSE if (!is.null(model) && model == "Mkv") Mkv <- TRUE call <- match.call() extras <- match.call(expand.dots = FALSE)$... pmla <- c("wMix", "llMix", "dnds", "tstv") existing <- match(pmla, names(extras)) wMix <- ifelse(is.na(existing[1]), 0, eval(extras[[existing[1]]], parent.frame())) llMix <- ifelse(is.na(existing[2]), 0, eval(extras[[existing[2]]], parent.frame())) # allow dnds <- tstv <- 1 dnds <- ifelse(is.na(existing[3]), 1, eval(extras[[existing[3]]], parent.frame())) tstv <- ifelse(is.na(existing[4]), 1, eval(extras[[existing[4]]], parent.frame())) if (!inherits(tree, "phylo")) stop("tree must be of class phylo") if (is.null(tree$edge.length)) stop("tree must have edge weights") if (any(duplicated(tree$tip.label))) stop("tree must have unique labels!") nTips <- as.integer(length(tree$tip.label)) tree <- reorder(tree, "postorder") if (any(tree$edge.length < 0)) tree <- minEdge(tree) if (!inherits(data, "phyDat")) stop("data must be of class phyDat") if (any(is.na(match(tree$tip.label, attr(data, "names"))))) stop("tip labels are not in data") data <- subset(data, tree$tip.label) # needed levels <- attr(data, "levels") type <- attr(data, "type") if (Mkv) { data <- cbind(constSitePattern(length(tree$tip.label), names=tree$tip.label, levels=levels, type=type), data) ## compress=FALSE) attr(data, "weight")[1:attr(data, "nc")] <- 0.0 } weight <- attr(data, "weight") nr <- attr(data, "nr") if (type == "AA" & !is.null(model)) { model <- match.arg(model, .aamodels) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) } if (type == "CODON") { .syn <- synonymous_subs(code=attr(data, "code")) .sub <- tstv_subs(code=attr(data, "code")) Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) if(is.null(bf)) bf_choice <- "equal" } if (is.null(bf)) bf <- rep(1 / length(levels), length(levels)) if (is.character(bf)) { bf_choice <- match.arg(bf, c("equal", "empirical", "F1x4", "F3x4", "F61")) # , "estimated" if (bf_choice == "F3x4" & type != "CODON") stop("F3x4 not available for this data type") if (bf_choice == "F1x4" & type != "CODON") stop("F1x4 not available for this data type") if (bf_choice == "F61" & type != "CODON") stop("F61 not available for this data type") bf <- switch(bf_choice, equal = rep(1 / length(levels), length(levels)), empirical = baseFreq(data), F61 = baseFreq(data), F3x4 = F3x4(data), F1x4 = F1x4(data)) names(bf) <- NULL } if (type == "CODON") freq_df <- df_freq_codon(bf_choice) if (is.null(Q)) Q <- rep(1, length(levels) * (length(levels) - 1) / 2) m <- 1 eig <- edQt(bf = bf, Q = Q) if(site.rate=="free_rate"){ w <- rep(1/k, k) g <- rep(1, k) } else{ rw <- rates_n_weights(shape, k, site.rate) g <- rw[, 1] w <- rw[, 2] } if (inv > 0){ w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate inv0 <- inv kmax <- k if (any(g < .gEps)) { for (i in seq_along(g)) { if (g[i] < .gEps) { inv <- inv + w[i] } } w <- w[g > .gEps] g <- g[g > .gEps] k <- length(w) } INV <- Matrix(lli(data, tree), sparse = TRUE) ll.0 <- as.matrix(INV %*% (bf * inv)) if(Mkv) ll.0 <- as.matrix(INV %*% rep(1, length(bf))) if (wMix > 0) ll.0 <- ll.0 + llMix nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) on.exit(.Call("ll_free2")) .Call("ll_init2", nr, nTips, nc, as.integer(k)) tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE, Mkv=Mkv) df <- ifelse(is.ultrametric(tree), tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (kmax > 1) + (inv0 > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (kmax > 1) + (inv0 > 0), CODON = df + (kmax > 1) + (inv0 > 0) + freq_df + (dnds!=1) + (tstv!=1), USER = df + (kmax > 1) + (inv0 > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) result <- list(logLik = tmp$loglik, inv = inv, k = kmax, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = weight, g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix, Mkv=Mkv, site.rate=site.rate) # if (type == "CODON") { result$dnds <- dnds result$tstv <- tstv result$frequencies <- bf_choice } class(result) <- "pml" result } optimRooted <- function(tree, data, bf, g, w, eig, ll.0, INV=NULL, control = pml.control(epsilon = 1e-08, maxit = 25, trace = 0), ...) { nTips <- as.integer(length(tree$tip.label)) k <- length(w) tau <- control$tau # optimising rooted triplets optRoot0 <- function(t, tree, data, g, w, eig, bf, ll.0, ...) { l <- length(tree$edge.length) tree$edge.length[1:(l - 1)] <- tree$edge.length[1:(l - 1)] + t tree$edge.length[l] <- tree$edge.length[l] - t loglik <- pml.fit4(tree, data, bf=bf, g=g, w=w, eig=eig, ll.0=ll.0, ...) loglik } # optim edges leading to the root # add tau == t ??? optRoot2 <- function(t, tree, data, g, w, eig, bf, ll.0, ...) { tree$edge.length <- tree$edge.length + t # c(el1+t, el2-t) loglik <- pml.fit4(tree, data, bf=bf, g=g, w=w, eig=eig, ll.0=ll.0, ...) loglik } # scale whole tree scaleEdges <- function(tree, data, tau = 1e-8, ...) { #t = 1, trace = 0, fn <- function(t, tree, data, ...) { tree$edge.length <- tree$edge.length * t pml.fit4(tree, data, ...) } min_scaler <- max(.25, tau / min(tree$edge.length) ) min_scaler <- min(min_scaler, 1) if(min_scaler>1) browser() optimize(f = fn, interval = c(min_scaler, 4), tree = tree, data = data, ..., maximum = TRUE, tol = .00001) } # ensure that each edge is at least tau long # tips have the same height tree <- minEdge(tree, tau) parent <- tree$edge[, 1] child <- tree$edge[, 2] anc <- Ancestors(tree, 1:max(tree$edge), "parent") sibs <- Siblings(tree, 1:max(tree$edge)) allKids <- cvector <- allChildren(tree) rootNode <- getRoot(tree) child2 <- orderNNI(tree, nTips) # (cvector, rootNode, nTips, TRUE) lengthList <- edgeList <- vector("list", max(tree$edge)) for (i in tree$edge[, 2]) { pa <- anc[i] kids <- sibs[[i]] if (pa != rootNode) { edgeList[[i]] <- cbind(pa, c(anc[pa], kids)) lengthList[[i]] <- c(pa, kids) } else { edgeList[[i]] <- cbind(pa, kids) lengthList[[i]] <- kids } } treeList <- vector("list", max(child2)) for (i in child2) { pa <- anc[i] kids <- allKids[[i]] treeList[[i]] <- cbind(i, c(kids, pa)) } ll <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) start.ll <- ll eps <- 10 iter <- 1 EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length if(is.ultrametric(tree)){ tmp <- scaleEdges(tree, data, tau=tau, bf=bf, ll.0=ll.0, eig=eig, w=w, g=g, ...) # if(control$trace>2)cat("scale", tmp[[2]], "\n") if(tmp[[2]]>ll){ t <- tmp[[1]] tree$edge.length <- tree$edge.length * t } } el <- tree$edge.length EL[tree$edge[, 2]] <- tree$edge.length ll2 <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) tmptree <- tree while (eps > control$eps && iter < control$maxit) { ll2 <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) loli <- rootNode children <- allKids[[rootNode]] kidsEl <- EL[children] minEl <- min(kidsEl) kidsEl <- kidsEl - minEl tmptree$edge <- cbind(rootNode, children) tmptree$edge.length <- kidsEl t <- optimize(f = optRoot2, interval = c(tau, 3), tmptree, data = data, g=g, w=w, eig=eig, bf=bf, ll.0=ll.0, maximum = TRUE, ...) optRoot2(t[[1]], tmptree, data = data, g=g, w=w, eig=eig, bf=bf, ll.0=ll.0, ...) # if(control$trace>2)cat("optRoot", t[[2]], "\n") if(t[[2]] > ll2){ ll2 <- t[[2]] EL[children] <- kidsEl + t[[1]] tree$edge.length <- EL[tree$edge[, 2]] } ll2 <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) for (i in seq_along(child2)) { dad <- child2[i] pa <- anc[dad] while (loli != pa) { tmpKids <- cvector[[loli]] tmpEdge <- cbind(loli, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) loli <- anc[loli] } pml.move(edgeList[[dad]], EL[lengthList[[dad]]], data, g, w, eig, k, nTips, bf) children <- allKids[[dad]] kidsEl <- EL[children] minEl <- min(kidsEl) maxEl <- EL[dad] EDGE <- treeList[[dad]] tmptree$edge <- EDGE tmptree$edge.length <- c(kidsEl, maxEl) t0 <- optRoot0(0, tmptree, data, g, w, eig, bf, ll.0, ...) t <- optimize(f = optRoot0, interval = c(-minEl + tau, maxEl - tau), tmptree, data = data, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, maximum = TRUE, ...) # if(control$trace>2) cat("edge", t[[2]], "\n") if (!is.nan(t[[2]]) & t[[2]] > ll2) { optRoot0(t[[1]], tmptree, data = data, g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, k = k, ...) EL[children] <- kidsEl + t[[1]] EL[dad] <- maxEl - t[[1]] ll2 <- t[[2]] } else optRoot0(0, tmptree, data, g, w, eig, bf, ll.0, k, ...) loli <- dad } tree$edge.length <- EL[tree$edge[, 2]] ll2 <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) eps <- (ll - ll2) / ll2 if (control$trace > 1) cat("optimRooted: ", ll, " -> ", ll2, "\n") ll <- ll2 iter <- iter + 1 } if (control$trace > 0) cat("optimize edge weights: ", start.ll, "-->", ll, "\n") list(tree = tree, logLik = ll, c(eps = eps, iter = iter)) } index.nni <- function(ch, cvector, pvector, root) { p1 <- pvector[ch] k12 <- cvector[[ch]] k3 <- cvector[[p1]] k3 <- k3[k3 != ch] kids <- c(k12, k3, ch) parents <- c(ch, ch, p1, p1) if (p1 != root) { k4 <- pvector[p1] kids <- c(kids, k4) parents <- c(parents, p1) } cbind(parents, kids) } orderNNI <- function(tree, nTips) { res <- reorder(tree)$edge[, 2] res <- res[res > nTips] res } rooted.nni <- function(tree, data, eig, w, g, bf, rate, ll.0, INV, control = pml.control(epsilon = 1e-08, maxit = 25, trace = 0), ...) { ind0 <- which(ll.0 > 0) contrast <- attr(data, "contrast") tree$edge.length[tree$edge.length < 1e-08] <- 1e-08 nTips <- as.integer(length(tree$tip.label)) k <- length(w) tree <- reorder.phylo(tree, "postorder") if (!is.rooted(tree)) stop("tree must be rooted") attr(tree, "order") <- NULL weight <- attr(data, "weight") nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) getEL1 <- function(t, nh) { el <- numeric(4) if (nh[1] > nh[2]) { el[2] <- nh[1] - nh[2] tnh <- nh[1] + t[1] } else { el[1] <- nh[2] - nh[1] tnh <- nh[2] + t[1] } el[1:2] <- el[1:2] + t[1] if (tnh > nh[3]) el[3] <- el[3] + tnh - nh[3] else el[4] <- el[4] - tnh + nh[3] el[3:4] <- el[3:4] + t[2] el } optRootU <- function(t, tree, data, bf, g, w, eig, ll.0, nh, ...) { tree$edge.length <- getEL1(t, nh) pml.fit4(tree, data, bf = bf, eig = eig, ll.0 = ll.0, w = w, g = g, ...) } getEL2 <- function(t, nh) { el <- numeric(5) eps <- 1e-6 nh12.min <- max(nh[1:2]) + eps nh123.min <- max(nh12.min, nh[3]) + eps l1 <- nh[5] - nh123.min - eps el[5] <- l1 * t[1] + eps nh123 <- nh[5] - el[5] l2 <- nh123 - nh12.min - eps nh12 <- nh12.min + l2 * t[2] el[1] <- nh12 - nh[1] el[2] <- nh12 - nh[2] el[3] <- nh123 - nh[3] el[4] <- nh123 - nh12 el } optEdgeU <- function(t, tree, data, bf, g, w, eig, ll.0, nh, ...) { tree$edge.length <- getEL2(t, nh) pml.fit4(tree, data, bf = bf, eig = eig, ll.0 = ll.0, w = w, g = g, ...) } child <- tree$edge[, 2] parent <- tree$edge[, 1] ll <- pml.fit4(tree, data, bf = bf, eig = eig, ll.0 = ll.0, w = w, g = g, ...) llstart <- ll eps <- .00001 iter <- 1 EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length change <- numeric(length(parent)) + 1 rootNode <- getRoot(tree) anc <- Ancestors(tree, 1:max(tree$edge), "parent") cvector <- allChildren(tree) sibs <- Siblings(tree, 1:max(tree$edge)) child2 <- orderNNI(tree, nTips) while (iter < 2) { ll <- pml.fit4(tree, data, bf = bf, eig = eig, ll.0 = ll.0, w = w, g = g, ...) nh <- nodeHeight(tree) loli <- rootNode pa <- rootNode nchanges <- 0 ind <- 1 i <- 1 tree1 <- tree2 <- tree3 <- tree for (i in seq_along(child2)) { ch <- child2[i] dad <- anc[ch] if (ch > nTips) { EL[tree$edge[, 2]] <- tree$edge.length pa <- ifelse(dad == rootNode, rootNode, anc[dad]) # should avoid unnecessary movements while (loli != dad && loli != rootNode) { if (loli == pa) { tmpKids <- sibs[[dad]] tmpEdge <- cbind(pa, c(anc[pa], tmpKids)) pml.move(tmpEdge, EL[c(pa, tmpKids)], data, g, w, eig, k, nTips, bf) # cat("move from pa to dad \n") loli <- dad } else { # cat("move loli up", loli, "dad", dad, "pa", pa, "ch", ch, "\n") tmpKids <- cvector[[loli]] tmpEdge <- cbind(loli, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) loli <- anc[loli] } } if (loli == rootNode && dad != loli) { # update all nodes pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) # cat("move down loli", loli, "dad", dad, "pa", pa, "ch", ch, "\n") gd <- rev(Ancestors(tree, ch, "all")) tmpKids <- sibs[[gd[2]]] tmpEdge <- cbind(rootNode, tmpKids) pml.move(tmpEdge, EL[tmpKids], data, g, w, eig, k, nTips, bf) gd <- gd[-1] while (length(gd) > 1) { tmpKids <- sibs[[gd[2]]] tmpEdge <- cbind(gd[1], c(anc[gd[1]], tmpKids)) pml.move(tmpEdge, EL[c(gd[1], tmpKids)], data, g, w, eig, k, nTips, bf) gd <- gd[-1] } loli <- dad } X1 <- index.nni(ch, cvector, anc, rootNode) if (loli != rootNode) { tree1$edge <- X1 tree1$edge.length <- abs(nh[X1[, 1]] - nh[X1[, 2]]) ll0 <- pml.fit4(tree1, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) # cat("quartet", ll0, ch, dad, "\n") } if (dad == rootNode) { ll0 <- pml.fit4(tree1, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) # cat("at root", ll0, ch, dad, "\n") ind2 <- c(1, 3, 2, 4) ind3 <- c(3, 2, 1, 4) X2 <- X3 <- X1 X2[, 2] <- X1[ind2, 2] X3[, 2] <- X1[ind3, 2] tree1$edge <- X1 tree2$edge <- X2 tree3$edge <- X3 edge1 <- X1[, 2] edge1[4] <- dad res1 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree1, data = data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) res2 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree2, data = data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) res3 <- optim(par = c(.1, .1), optRootU, gr = NULL, tree = tree3, data = data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-8, upper = 5, control = list(fnscale = -1)) ind <- which.max(c(res1[[2]], res2[[2]], res3[[2]])) if (control$trace > 2) cat("root", c(res1[[2]], res2[[2]], res3[[2]]), "\n") # optRootU <- function(t, tree, data, bf, g, w, eig, ll.0, nh, ...) { if (ind == 1) { ll2 <- res1[[2]] optRootU(t = res1[[1]], tree = tree1, data = data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL1(res1[[1]], nh[X1[, 2]]) tree <- changeEdgeLength(tree, X1[, 2], tmpEL) } if (ind == 2) { ll2 <- res2[[2]] optRootU(t = res2[[1]], tree = tree2, data = data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL1(res2[[1]], nh[X2[, 2]]) tree <- changeEdge(tree, X1[c(2, 3), 2]) tree <- changeEdgeLength(tree, X2[, 2], tmpEL) } if (ind == 3) { ll2 <- res3[[2]] optRootU(t = res3[[1]], tree = tree3, data = data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL1(res3[[1]], nh[X3[, 2]]) tree <- changeEdge(tree, X1[c(1, 3), 2]) tree <- changeEdgeLength(tree, X3[, 2], tmpEL) } } else { loli <- dad ind2 <- c(1, 3, 2, 4, 5) ind3 <- c(3, 2, 1, 4, 5) X2 <- X3 <- X1 X2[, 2] <- X1[ind2, 2] X3[, 2] <- X1[ind3, 2] tree1$edge <- X1 tree2$edge <- X2 tree3$edge <- X3 tt <- c(.3, .5) res1 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree1, data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) res2 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree2, data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) res3 <- optim(par = tt, optEdgeU, gr = NULL, tree = tree3, data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ..., method = "L-BFGS-B", lower = 1e-4, upper = 1 - 1e-4, control = list(fnscale = -1)) ind <- which.max(c(res1[[2]], res2[[2]], res3[[2]])) if (control$trace > 2) cat("edge", ch, ":", c(res1[[2]], res2[[2]], res3[[2]]), "\n") ll3 <- max(c(res1[[2]], res2[[2]], res3[[2]])) if ( (ll3 - 1e-5 * ll3) < ll2) { loli <- rootNode ll2 <- pml.fit4(tree, data, bf = bf, k = k, eig = eig, ll.0 = ll.0, INV = INV, w = w, g = g, ...) nh <- nodeHeight(tree) EL[tree$edge[, 2]] <- tree$edge.length ind <- 0 } else { if (ind == 1) { ll2 <- res1[[2]] optEdgeU(res1[[1]], tree = tree1, data, nh = nh[X1[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL2(res1[[1]], nh[X1[, 2]]) tmpE <- X1[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdgeLength(tree, tmpE, tmpEL) } if (ind == 2) { ll2 <- res2[[2]] optEdgeU(res2[[1]], tree = tree2, data, nh = nh[X2[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL2(res2[[1]], nh[X2[, 2]]) tmpE <- X2[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdge(tree, X1[c(2, 3), 2]) tree <- changeEdgeLength(tree, tmpE, tmpEL) } if (ind == 3) { ll2 <- res3[[2]] optEdgeU(res3[[1]], tree = tree3, data, nh = nh[X3[, 2]], g = g, w = w, eig = eig, bf = bf, ll.0 = ll.0, ...) tmpEL <- getEL2(res3[[1]], nh[X3[, 2]]) tmpE <- X3[, 2] tmpE[5] <- X1[5, 1] tree <- changeEdge(tree, X1[c(1, 3), 2]) tree <- changeEdgeLength(tree, tmpE, tmpEL) } } } nh <- nodeHeight(tree) EL[tree$edge[, 2]] <- tree$edge.length loli <- dad if (ind > 1) { # print("NNI swap") nchanges <- nchanges + 1 anc <- Ancestors(tree, 1:max(tree$edge), "parent") cvector <- allChildren(tree) sibs <- Siblings(tree, 1:max(tree$edge)) } } } ll2 <- pml.fit4(tree, data, bf=bf, eig=eig, ll.0=ll.0, w=w, g=g, ...) eps <- (ll - ll2) / ll2 if (control$trace > 1) cat(ll, " -> ", ll2, "\n") if (control$trace > 1) cat("swap:", nchanges) ll <- ll2 iter <- iter + 1 } list(tree = tree, logLik = ll, iter = iter, swap = nchanges) } updateRates <- function(res, ll, rate, shape, k, inv, wMix, update="rate", site.rate = "gamma"){ if( is.infinite(res[[2]]) || is.nan(res[[2]])) return(NULL) if(res[[2]] < ll) return(NULL) update <- match.arg(update, c("rate", "shape", "inv")) if(update=="rate") rate <- res[[1]] if(update=="shape") shape <- res[[1]] if(update=="inv") inv <- res[[1]] rw <- rates_n_weights(shape, k, site.rate) g <- rw[, 1] w <- rw[, 2] if (inv > 0){ w <- (1 - inv) * w g <- g / (1 - inv) } if (wMix > 0) w <- (1 - wMix) * w g <- g * rate assign("g", g, envir = parent.frame(n = 1)) assign("w", w, envir = parent.frame(n = 1)) assign("inv", inv, envir = parent.frame(n = 1)) assign("rate", rate, envir = parent.frame(n = 1)) assign("shape", shape, envir = parent.frame(n = 1)) assign("ll", res[[2]], envir = parent.frame(n = 1)) } #' @rdname pml #' @aliases optim.pml #' @export optim.pml <- function(object, optNni = FALSE, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, #optF3x4 = FALSE, control = pml.control(epsilon = 1e-8, maxit = 10, trace = 1L, tau = 1e-8), model = NULL, rearrangement = ifelse(optNni, "NNI", "none"), subs = NULL, ratchet.par = list(iter = 20L, maxit = 200L, minit = 100L, prop = 1 / 2), ...) { ratchet <- FALSE ratchet2 <- FALSE if (rearrangement == "none") optNni <- FALSE if (rearrangement == "NNI") optNni <- TRUE if (rearrangement == "stochastic"){ ratchet <- TRUE optNni <- TRUE } if (rearrangement == "ratchet"){ ratchet2 <- TRUE optNni <- TRUE } extras <- match.call(expand.dots = FALSE)$... pmla <- c("wMix", "llMix") wMix <- object$wMix llMix <- object$llMix Mkv <- object$Mkv site.rate <- object$site.rate optFreeRate <- FALSE if(site.rate=="free_rate"){ if(optGamma){ optFreeRate <- TRUE optGamma <- FALSE } } if (is.null(llMix)) llMix <- 0 if (!is.null(extras)) { names(extras) <- pmla[pmatch(names(extras), pmla)] existing <- match(pmla, names(extras)) if (!is.na(existing[1])) wMix <- eval(extras[[existing[1]]], parent.frame()) if (!is.na(existing[2])) llMix <- eval(extras[[existing[2]]], parent.frame()) } tree <- object$tree call <- object$call data <- object$data addTaxa <- FALSE trace <- control$trace tau <- control$tau if (optNni) { mapping <- map_duplicates(data) if (!is.null(mapping)) { orig.data <- data addTaxa <- TRUE tree2 <- drop.tip(tree, mapping[, 1]) tree <- reorder(tree2, "postorder") } if (!is.binary(tree)) tree <- multi2di(tree) optEdge <- TRUE } if (length(tree$tip.label) < (3 + !optRooted)) { optNni <- FALSE ratchet <- FALSE ratchet2 <- FALSE } if (length(tree$tip.label) < (2 + !optRooted)) { stop("rooted / unrooted tree needs at least 2 / 3 tips") } is_ultrametric <- FALSE timetree <- FALSE if (is.rooted(tree)) { if (optRooted == FALSE && optEdge == TRUE) { tree <- unroot(tree) attr(tree, "order") <- NULL tree <- reorder(tree, "postorder") warning("I unrooted the tree", call. = FALSE) } else{ is_ultrametric <- is.ultrametric(tree, option=2) if(!is_ultrametric) timetree <- TRUE } } tree <- reorder(tree, "postorder") if (any(tree$edge.length < tau)) { tree <- minEdge(tree, tau, is_ultrametric) object <- update.pml(object, tree = tree) } if (optEdge & optRate & !timetree) { warning("You can't optimize edges and rates at the same time, only edges are optimized!", call. = FALSE) optRate <- FALSE } if (optRooted) { optEdge <- TRUE if (!is.rooted(tree)) stop("tree must be rooted") } data <- subset(data, tree$tip.label) type <- attr(data, "type") if (type == "AA") { if(!is.null(model)) object <- update(object, model = model) model <- object$model } if (type == "CODON") { .syn <- synonymous_subs(code=attr(data, "code")) .sub <- tstv_subs(code=attr(data, "code")) if (is.null(model)) model <- "codon1" model <- match.arg(model, c("codon0", "codon1", "codon2", "codon3", "YN98")) dnds <- object$dnds tstv <- object$tstv if (!is.null(model)) { if (model == "codon0") optQ <- FALSE else optQ <- TRUE if (model == "YN98") optBf <- TRUE } bf_choice <- object$frequencies freq_df <- df_freq_codon(bf_choice) if (bf_choice=="F3x4") { bf <- F3x4(data) bf_codon <- bf_by_codon(data) object <- update.pml(object, bf = bf) } } Q <- object$Q if (is.null(subs)) subs <- c(1:(length(Q) - 1), 0) bf <- object$bf eig <- object$eig inv <- object$inv k <- object$k if (k == 1 & optGamma) { optGamma <- FALSE message("only one rate class, ignored optGamma") } if(Mkv==TRUE & optInv==TRUE){ optInv <- FALSE message('cannot estimate invariant sites and Mkv model, ignored optInv') } shape <- object$shape w <- object$w g <- object$g if (type == "DNA" & !is.null(model)) { tmp <- subsChoice(model) optQ <- tmp$optQ if (!optQ) Q <- rep(1, 6) optBf <- tmp$optBf if (!optBf) bf <- c(0.25, 0.25, 0.25, 0.25) subs <- tmp$subs } ll0 <- object$logLik INV <- object$INV ll.0 <- object$ll.0 rate <- object$rate ll <- ll0 ll1 <- ll0 opti <- TRUE nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) nTips <- as.integer(length(tree$tip.label)) on.exit({ tmp <- pml.fit(tree, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = TRUE, Mkv=Mkv) if (addTaxa) { tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2], edge.length = rep(0, nrow(mapping))) data <- orig.data } df <- ifelse(optRooted, tree$Nnode, length(tree$edge.length)) df <- switch(type, DNA = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1, AA = df + (k > 1) + (inv > 0) + optBf * (length(unique(bf)) - 1), CODON = df + (k > 1) + (inv > 0) + freq_df + (dnds != 1) + (tstv != 1), USER = df + (k > 1) + (inv > 0) + length(unique(bf)) - 1 + length(unique(Q)) - 1) object <- list(logLik = tmp$loglik, inv = inv, k = k, shape = shape, Q = Q, bf = bf, rate = rate, siteLik = tmp$siteLik, weight = attr(data, "weight"), g = g, w = w, eig = eig, data = data, model = model, INV = INV, ll.0 = ll.0, tree = tree, lv = tmp$resll, call = call, df = df, wMix = wMix, llMix = llMix, Mkv=Mkv, site.rate=site.rate) if (type == "CODON") { object$dnds <- dnds object$tstv <- tstv object$frequencies <- bf_choice } class(object) <- "pml" extras <- pairlist(bf = bf, Q = Q, inv = inv, shape = shape, rate = rate)[c(optBf, optQ, optInv, optGamma, optRate)] if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } object$call <- call pml.free() return(object) }) pml.init(data, k) if (optEdge) { res <- opt_Edge(tree, data, rooted = optRooted, eig = eig, w = w, g = g, bf = bf, inv=inv, rate = rate, ll.0 = ll.0, INV = INV, Mkv=Mkv, control = pml.control(epsilon = 1e-07, maxit = 10, trace = trace, tau = tau)) if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } rounds <- 1 while (opti) { if (optBf) { if (type=="CODON" && bf_choice=="F3x4") res <- optimF3x4(tree, data, bf_codon = bf_codon, inv = inv, Q = Q, w = w, g = g, INV = INV, rate = rate, k = k, llMix = llMix, Mkv=Mkv) else res <- optimBf(tree, data, bf = bf, inv = inv, Q = Q, w = w, g = g, INV = INV, rate = rate, k = k, llMix = llMix, Mkv=Mkv) if (trace > 0) cat("optimize base frequencies: ", ll, "-->", max(res[[2]], ll), "\n") if (res[[2]] > ll) { bf <- res[[1]] eig <- edQt(Q = Q, bf = bf) if (inv > 0) ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix ll <- res[[2]] } } if (optQ) { if (type == "CODON") { ab <- c(tstv, dnds) res <- switch(model, YN98 = optimCodon(tree, data, Q = length(.sub), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = TRUE), codon1 = optimCodon(tree, data, Q = length(.sub), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = TRUE), codon2 = optimCodon(tree, data, Q = length(.sub), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = FALSE, optW = TRUE), codon3 = optimCodon(tree, data, Q = length(.sub), subs = .sub, syn = .syn, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, ab = log(ab), optK = TRUE, optW = FALSE)) tmp <- res[[5]] m <- length(tmp) dnds <- tmp[m] if (m > 1) tstv <- tmp[1] } else{ res <- optimQ(tree, data, Q = Q, subs = subs, bf = bf, w = w, g = g, inv = inv, INV = INV, ll.0 = ll.0, rate = rate, k = k, Mkv=Mkv) } Q <- res[[1]] eig <- edQt(Q = Q, bf = bf) if (trace > 0) cat("optimize rate matrix: ", ll, "-->", res[[2]], "\n") ll <- res[[2]] } ### end sitewise if (optInv) { res <- optimInv(tree, data, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, k = k, shape = shape, rate = rate) if (trace > 0) cat("optimize invariant sites: ", ll, "-->", max(res[[2]], ll), "\n") updateRates(res, ll, rate, shape, k, inv, wMix, update="inv", site.rate=site.rate) ll.0 <- as.matrix(INV %*% (bf * inv)) if (wMix > 0) ll.0 <- ll.0 + llMix } if (optGamma) { res <- optimGamma(tree, data, shape = shape, k = k, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, ll.0 = ll.0, rate = rate, Mkv=Mkv) if (trace > 0) cat("optimize shape parameter: ", ll, "-->", max(res[[2]], ll), "\n") updateRates(res, ll, rate, shape, k, inv, wMix, update="shape", site.rate=site.rate) } if (optFreeRate) { # bis jetzt w nicht optimiert! tmp_ll <- ll res <- optimFreeRate(tree, data, g = g, k = k, w = w, inv = inv, INV = INV, bf = bf, eig = eig, ll.0 = ll.0, rate = rate) scale <- function(tree, g, w){ blub <- sum(g * w) g <- g / blub tree$edge.length <- tree$edge.length * blub list(tree=tree, g=g) } if(res[[2]] > ll){ tmp_sc <- scale(tree, res[[1]], w) g0 <- res[[1]] blub <- sum(g0 * w) g <- g0 / blub tree$edge.length <- tree$edge.length * blub ## if (trace > 0) cat("optimize free rate parameters: ", ll, "-->", ## max(res[[2]], ll), "\n") ll <- res[[2]] } res2 <- optimWs(tree, data, w = w, g=g, inv = inv, INV = INV, bf = bf, eig = eig, ll.0 = ll.0, rate = rate) if(res2[[2]] > ll){ w <- res2[[1]] blub <- sum(g * w) g <- g / blub tree$edge.length <- tree$edge.length * blub ll <- res2[[2]] } if (trace > 0) cat("optimize free rate parameters: ", tmp_ll, "-->", ll, "\n") } ### end sitewise if (optRate) { res <- optimRate(tree, data, rate = rate, inv = inv, INV = INV, Q = Q, bf = bf, eig = eig, k = k, shape = shape, w = w, ll.0 = ll.0) if (trace > 0) cat("optimize rate: ", ll, "-->", max(res[[2]], ll), "\n") updateRates(res, ll, rate, shape, k, inv, wMix, update="rate", site.rate=site.rate) } if (optEdge) { res <- opt_Edge(tree, data, rooted = optRooted, eig = eig, w = w, g = g, bf = bf, inv=inv, rate = rate, ll.0 = ll.0, Mkv=Mkv, control = pml.control(epsilon = 1e-08, maxit = 10, trace = trace, tau = tau)) if (res[[2]] > ll) { ll <- res[[2]] tree <- res[[1]] } } epsR <- 1e-8 if (optNni) { res <- opt_nni(tree, data, rooted=optRooted, iter_max=5, trace=trace, ll=ll, w = w, g = g, eig = eig, bf = bf, inv=inv, ll.0 = ll.0, INV = INV, Mkv=Mkv, control = list(eps=1e-08, maxit=3, trace=trace-1, tau=tau), ...) ll <- res$logLik tree <- res$tree swap <- res$swap rounds <- 1 if (swap == 0) optNni <- FALSE } # if ( (ratchet == TRUE) && (optNni == FALSE)) { if ( ((ratchet == TRUE) || (ratchet2 == TRUE)) && (optNni == FALSE)) { maxR <- ratchet.par$iter maxit <- ratchet.par$maxit kmax <- 1 i <- 1 while ((i < maxit) && (kmax <= maxR)) { if(ratchet == TRUE){ tree2 <- rNNI(tree, moves = round(nTips * ratchet.par$prop), n = 1) } else { tree2 <- bootstrap.phyDat(data, candidate.tree, bs = 1, rooted=optRooted, eps = tau, bf = bf, Q = Q, k = k, shape = shape)[[1]] tree2 <- checkLabels(tree2, tree$tip.label) tree2 <- reorder(tree2, "postorder") } swap <- 1 ll2 <- pml.fit(tree2, data, bf, shape = shape, k = k, Q = Q, levels = attr(data, "levels"), inv = inv, rate = rate, g = g, w = w, eig = eig, INV = INV, ll.0 = ll.0, llMix = llMix, wMix = wMix, site = FALSE, Mkv=Mkv) res <- opt_nni(tree2, data, rooted=optRooted, iter_max=25, trace=trace, ll=ll2, w = w, g = g, eig = eig, bf = bf, inv=inv, ll.0 = ll.0, INV = INV, Mkv=Mkv, control = list(eps=1e-08, maxit=5, trace=trace, tau=tau), ...) if (res$logLik > (ll + epsR)) { tree <- res$tree ll <- res$logLik kmax <- 1 } else kmax <- kmax + 1 if (trace > 0) print(paste("Ratchet iteration ", i, ", best pscore so far:", ll)) i <- i + 1 } optNni <- TRUE ratchet <- FALSE rounds <- 1 } # if (rounds > control$maxit) opti <- FALSE if ( (abs((ll1 - ll) / ll) < control$eps) || rounds > control$maxit) # abs(ll1 - ll) opti <- FALSE rounds <- rounds + 1 ll1 <- ll } } indexNNI3 <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- reorder(tree)$edge[, 2] nTips <- length(tree$tip.label) ind <- ind[ind > nTips] # ind <- which(child %in% parent) Nnode <- tree$Nnode # a d # \ / # e-----f c is closest to root, f is root from subtree # / \ # b c c(a,b,c,d,e,f) edgeMatrix <- matrix(0L, (Nnode - 1), 6) pvector <- integer(max(parent)) pvector[child] <- parent tips <- !logical(max(parent)) tips[parent] <- FALSE # cvector <- allCildren(tree) cvector <- vector("list", max(parent)) for (i in seq_along(parent)) cvector[[parent[i]]] <- c(cvector[[parent[i]]], child[i]) k <- 1L for (i in ind) { f <- pvector[i] # f ab <- cvector[[i]] # a,b ind1 <- cvector[[f]] # c,d cd <- ind1[ind1 != i] if (pvector[f]) cd <- c(pvector[f], cd) # cd edgeMatrix[k, 1:6] <- c(ab, cd, i, f) k <- k + 1L } edgeMatrix } # EL ausserhalb index2tree <- function(x, tree, root = length(tree$tip.label) + 1L) { EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length pa <- c(5L, 5L, 6L, 6L, 6L) ch <- c(1L, 2L, 5L, 4L, 3L) elind <- c(1L, 2L, 5L, 4L, 6L) # raus if (x[6L] == root) el <- EL[x[ch]] else el <- EL[x[elind]] structure(list(edge = structure(c(x[pa], x[ch]), .Dim = c(5L, 2L)), edge.length = el, Nnode = 2L), .Names = c("edge", "edge.length", "Nnode"), class = "phylo", order = "postorder") } index2tree2 <- function(x, tree, root = length(tree$tip.label) + 1L) { EL <- numeric(max(tree$edge)) EL[tree$edge[, 2]] <- tree$edge.length pa <- c(6L, 6L, 5L, 5L, 5L) ch <- c(3L, 4L, 6L, 1L, 2L) elr <- c(3L, 4L, 5L, 1L, 2L) eln <- c(6L, 4L, 5L, 1L, 2L) if (x[6L] == root) el <- EL[x[elr]] else el <- EL[x[eln]] structure(list(edge = structure(c(x[pa], x[ch]), .Dim = c(5L, 2L)), edge.length = el, Nnode = 2L), .Names = c("edge", "edge.length", "Nnode"), class = "phylo", order = "postorder") } # weight, nr, nc, contrast, nco (Reihenfolge beibehalten) # INV raus, inv rein # evi, eve, contrast2 ausserhalb definieren optimQuartet <- function(tree, data, eig, w, g, bf, rate, ll.0, nTips, weight, nr, nc, contrast, nco, inv=0, llcomp = -Inf, control = pml.control(epsilon = 1e-08, maxit = 5, trace = 0, tau = 1e-8), ...) { el <- tree$edge.length tree$edge.length[el < 1e-08] <- 1e-08 oldtree <- tree k <- length(w) loglik <- pml.quartet(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) start.ll <- old.ll <- new.ll <- loglik contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) # weight <- attr(data, "weight") eps <- 1 iter <- 0 child <- tree$edge[, 2] parent <- tree$edge[, 1] m <- max(tree$edge) EL <- tree$edge.length n <- length(tree$edge.length) ind.inv <- which(ll.0 > 0) tau <- control$tau # nr <- as.integer(length(weight)) # nc <- as.integer(length(bf)) # nco <- as.integer(nrow(contrast)) lg <- k ScaleEPS <- 1.0 / 4294967296.0 # anc <- Ancestors(tree, 1:m, "parent") # anc0 <- as.integer(c(0L, anc)) while (eps > control$eps && iter < control$maxit) { EL <- .Call("optQrtt", as.integer(parent), as.integer(child), eig, evi, EL, w, g, as.integer(nr), as.integer(nc), as.integer(nTips), as.double(contrast), as.double(contrast2), nco, data, as.double(weight), as.double(ll.0), as.double(tau)) iter <- iter + 1 # tree$edge.length <- EL[tree$edge[,2]] tree$edge.length <- EL # [treeP$edge[,2]] # vormals treeP newll <- pml.quartet(tree, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) eps <- (old.ll - newll) / newll if ( (eps < 0) || (newll < llcomp)) return(list(tree = oldtree, logLik = old.ll, c(eps, iter))) oldtree <- tree # vormals treeP # if (control$trace > 1) cat(old.ll, " -> ", newll, "\n") old.ll <- newll # loli <- parent[1] } if (control$trace > 0) cat(start.ll, " -> ", newll, "\n") list(tree = tree, logLik = newll, c(eps, iter)) # vormals treeP } pml.quartet <- function(tree, data, bf = rep(.25, 4), k = 1, rate = 1, g, w, eig, ll.0 = NULL, #ind.ll0 = NULL, inv=0, llMix = NULL, wMix = 0, nTips, weight, nr, nc, contrast, nco, ..., site = FALSE, Mkv=FALSE) { # in C if (is.null(ll.0)) { ll.0 <- numeric(nr) } # if (is.null(ind.ll0)) { # ind <- which(ll.0 > 0) # } # else ind <- ind.ll0 node <- as.integer(tree$edge[, 1] - nTips - 1L) # min(node)) edge <- as.integer(tree$edge[, 2] - 1L) siteLik <- .Call("PML4", dlist = data, as.double(tree$edge.length), as.double(w), as.double(g), nr, nc, as.integer(k), eig, as.double(bf), node, edge, nTips, nco, contrast, N = as.integer(length(edge))) # in C if (inv > 0){ ind <- which(ll.0 > 0) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) } # if (!is.null(ll.0)) siteLik[ind] <- log(exp(siteLik[ind]) + ll.0[ind]) if (wMix > 0) siteLik <- log(exp(siteLik) * (1 - wMix) + llMix) loglik <- sum(weight * siteLik) if (Mkv) { ind <- seq_len(nc) p0 <- sum(exp(siteLik[ind])) loglik <- loglik - sum(weight) * log(1 - p0) } return(loglik) } index2edge <- function(x, root) { ch <- c(1L, 2L, 5L, 4L, 3L) elind <- c(1L, 2L, 5L, 4L, 6L) if (x[6L] == root) el <- x[ch] else el <- x[elind] el } pml.nni <- function(tree, data, w, g, eig, bf, ll.0, ll, inv, ...) { k <- length(w) INDEX <- indexNNI3(tree) tmpl <- pml.fit4(tree, data, bf = bf, g = g, w = w, eig = eig, inv = inv, ll.0 = ll.0, k = k, ...) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) weight <- as.numeric(attr(data, "weight")) contrast <- attr(data, "contrast") nco <- as.integer(dim(contrast)[1]) contrast2 <- contrast %*% eig[[2]] evi <- (t(eig[[3]]) * bf) nTips <- as.integer(length(tree$tip.label)) m <- dim(INDEX)[1] loglik <- numeric(2 * m) edgeMatrix <- matrix(0L, 2 * m, 5) anc <- Ancestors(tree, 1:max(tree$edge), "parent") loli <- getRoot(tree) ind1 <- c(1L, 4L, 3L, 2L, 5L) # ind2 <- c(4L, 2L, 3L, 1L, 5L) # for (i in 1:m) { ei <- INDEX[i, ] tree0 <- index2tree(INDEX[i, ], tree, nTips + 1L) ch <- ei[5] pa <- ei[6] # move up while (pa != loli) { tmpr <- match(loli, INDEX[, 5]) treetmp <- index2tree(INDEX[tmpr, ], tree, nTips + 1L) tmpl <- pml.quartet(treetmp, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) loli <- anc[loli] } llt0 <- pml.quartet(tree0, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) # new0 <- optimQuartet(tree0, data, eig=eig, w=w, g=g, bf=bf, # rate=rate, ll.0=ll.0, nTips=nTips, # weight=weight, nr=nr, nc=nc, contrast=contrast, nco=nco, inv=0, # control = list(epsilon = 1e-08, maxit = 3, trace=0)) tree2 <- tree1 <- tree0 tree1$edge[, 2] <- tree1$edge[ind1, 2] tree1$edge.length <- tree1$edge.length[ind1] tree2$edge[, 2] <- tree2$edge[ind2, 2] tree2$edge.length <- tree2$edge.length[ind2] new1 <- optimQuartet(tree1, data, eig = eig, w = w, g = g, bf = bf, ll.0 = ll.0, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco, inv=inv, llcomp = ll + 1e-8, ...) # new0$logLik+1e-8) new2 <- optimQuartet(tree2, data, eig = eig, w = w, g = g, bf = bf, ll.0 = ll.0, nTips = nTips, weight = weight, nr = nr, nc = nc, contrast = contrast, nco = nco, inv=inv, llcomp = ll + 1e-8, ...) # new0$logLik+1e-8) loglik[(2 * i) - 1] <- new1$logLik loglik[(2 * i)] <- new2$logLik edgeMatrix[(2 * i) - 1, ] <- new1$tree$edge.length edgeMatrix[(2 * i), ] <- new2$tree$edge.length # godown or recompute if (any (INDEX[i, c(1, 2)] > nTips)) { tree00 <- index2tree2(INDEX[i, ], tree, nTips + 1L) tmp3 <- pml.quartet(tree00, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) loli <- getRoot(tree00) } else tmp3 <- pml.quartet(tree0, data, bf = bf, g = g, w = w, eig = eig, ll.0 = ll.0, k = k, nTips = nTips, weight = weight, inv = inv, nr = nr, nc = nc, contrast = contrast, nco = nco) } swap <- 0 eps0 <- 1e-6 candidates <- loglik > ll + eps0 # cat("candidates", sum(candidates), "\n") INDEX2 <- t(apply(INDEX, 1, index2edge, root = getRoot(tree))) while (any(candidates)) { ind <- which.max(loglik) loglik[ind] <- -Inf if (ind %% 2) swap.edge <- c(2, 4) else swap.edge <- c(1, 4) IND <- index2edge(INDEX[(ind + 1) %/% 2, ], nTips + 1L) treeT <- changeEdge(tree, IND[swap.edge], IND, edgeMatrix[ind, ]) test <- pml.fit4(treeT, data, bf = bf, k = k, g = g, w = w, eig = eig, ll.0 = ll.0, inv = inv, ...) if (test <= ll + eps0) candidates[ind] <- FALSE if (test > ll + eps0) { ll <- test swap <- swap + 1 tree <- treeT indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE loglik[indi] <- -Inf } } # trees <- vector("list", 2*m) # for(i in seq_along(loglik)){ # ind = i # if( ind %% 2 ) swap.edge = c(2,4) # else swap.edge = c(1,4) # IND = index2edge(INDEX[(ind+1)%/%2,]) # tree2 <- try(changeEdge(tree, IND[swap.edge], IND, # edgeMatrix[ind,]) ) # trees[[i]] <- tree2 # } # class(trees) <- "multiPhylo" # trees <- .compressTipLabel(trees) # , all=loglik list(tree = tree, loglik = ll, swap = swap, candidates = candidates) } opt_nni <- function(tree, data, rooted, iter_max, trace, ll, ...){ swap <- 0 iter <- 0 while (iter < iter_max) { if (!rooted) { tmp <- pml.nni(tree, data, ll=ll, ...) res <- optimEdge(tmp$tree, data, ...) } else { tmp <- rooted.nni(tree, data, ...) res <- optimRooted(tmp$tree, data, ...) } ll2 <- res$logLik if(length(ll2)==0) browser() if(ll2 > (ll + 1e-8)) # epsR tree <- res$tree else { res$logLik <- ll res$tree <- tree tmp$swap <- 0 ll2 <- ll } swap <- swap + tmp$swap if (trace > 0) cat(" optimize topology: ", ll, "-->", ll2, "\n") ll <- ll2 iter <- iter + 1 if (tmp$swap == 0) { break() iter <- iter_max } } if (trace > 0) cat("NNI moves: ", swap, "\n") res$iter <- iter res$swap <- swap res } opt_Edge <- function(tree, data, rooted, ...){ if(rooted){ res <- optimRooted(tree, data, ...) } else{ res <- optimEdge(tree, data, ...) } res } phangorn/R/distSeq.R0000644000176200001440000003453614132320172014034 0ustar liggesusers#' Pairwise Distances from Sequences #' #' \code{dist.hamming}, \code{dist.ml} and \code{dist.logDet} compute pairwise #' distances for an object of class \code{phyDat}. \code{dist.ml} uses DNA / #' AA sequences to compute distances under different substitution models. #' #' So far 17 amino acid models are supported ("WAG", "JTT", "LG", "Dayhoff", #' "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", #' "FLU", "Blosum62", "Dayhoff_DCMut" and "JTT_DCMut") and additional rate #' matrices and frequencies can be supplied. #' #' The "F81" model uses empirical base frequencies, the "JC69" equal base #' frequencies. This is even the case if the data are not nucleotides. #' #' @param x An object of class \code{phyDat} #' @param ratio Compute uncorrected ('p') distance or character difference. #' @param model One of "JC69", "F81" or one of 17 amino acid models see #' details. #' @param exclude One of "none", "all", "pairwise" indicating whether to delete #' the sites with missing data (or ambiguous states). The default is handle #' missing data as in pml. #' @param bf A vector of base frequencies. #' @param Q A vector containing the lower triangular part of the rate matrix. #' @param k Number of intervals of the discrete gamma distribution. #' @param shape Shape parameter of the gamma distribution. #' @param \dots Further arguments passed to or from other methods. #' @return an object of class \code{dist} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso For more distance methods for nucleotide data see #' \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise #' polymorphism p-distances. \code{\link{writeDist}} for export and import #' distances. #' @references Lockhart, P. J., Steel, M. A., Hendy, M. D. and Penny, D. (1994) #' Recovering evolutionary trees under a more realistic model of sequence #' evolution. \emph{Molecular Biology and Evolution}, \bold{11}, 605--602. #' #' Jukes TH and Cantor CR (1969). \emph{Evolution of Protein Molecules}. New #' York: Academic Press. 21--132. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm1 <- dist.hamming(Laurasiatherian) #' tree1 <- NJ(dm1) #' dm2 <- dist.logDet(Laurasiatherian) #' tree2 <- NJ(dm2) #' treedist(tree1,tree2) #' # JC model #' dm3 <- dist.ml(Laurasiatherian) #' tree3 <- NJ(dm3) #' treedist(tree1,tree3) #' # F81 + Gamma #' dm4 <- dist.ml(Laurasiatherian, model="F81", k=4, shape=.4) #' tree4 <- NJ(dm4) #' treedist(tree1,tree4) #' treedist(tree3,tree4) #' #' @rdname dist.hamming #' @export dist.hamming <- function(x, ratio = TRUE, exclude = "none"){ if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") l <- length(x) contrast <- attr(x, "contrast") nc <- as.integer(attr(x, "nc")) con <- rowSums(contrast > 0) < 2 if (exclude == "all") { index <- con[x[[1]]] for (i in 2:l) index <- index & con[x[[i]]] index <- which(index) if(length(index)==0) warning('each site contains at least one ambiguous state, try exclude = "pairwise"') x <- subset(x, select = index) } weight <- attr(x, "weight") d <- numeric( (l * (l - 1)) / 2) if (exclude == "pairwise") { k <- 1 W <- numeric(l * (l - 1) / 2) for (i in 1:(l - 1)) { tmp <- con[x[[i]]] for (j in (i + 1):l) { W[k] <- sum(weight[tmp & con[ x[[j]] ] ]) k <- k + 1 } } } if (exclude == "pairwise"){ contrast[!con, ] <- 1L attr(x, "contrast") <- contrast } # ub <- upperBound(x) # x <- subset(x, select=ub>0) f <- init_fitch(x, FALSE, TRUE, m=1L) d <- f$hamming_dist() if (ratio) { if (exclude == "pairwise") d <- d / W else d <- d / sum(weight) } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "hamming" class(d) <- "dist" return(d) } #' @rdname dist.hamming #' @export dist.ml <- function(x, model = "JC69", exclude = "none", bf = NULL, Q = NULL, k = 1L, shape = 1, ...){ if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") l <- length(x) d <- numeric((l * (l - 1)) / 2) v <- numeric((l * (l - 1)) / 2) contrast <- attr(x, "contrast") con <- rowSums(contrast > 0) == 1 if (exclude == "all") { index <- con[x[[1]]] for (i in 2:l) index <- index & con[x[[i]]] index <- which(index) if(length(index)==0) warning('each site contains at least one ambiguous state, try exclude = "pairwise"') x <- subset(x, select = index) } unique_contrast <- grp_duplicated(contrast) if(exclude != "none"){ pos_contrast <- rep(NA_integer_, length(unique_contrast)) lu <- length(unique( unique_contrast[con]) ) pos_contrast[unique( unique_contrast[con])] <- seq_len(lu) unique_contrast <- pos_contrast[unique_contrast] attr(unique_contrast, "nlevels") <- lu } nc <- as.integer(attr(x, "nc")) nr <- as.integer(attr(x, "nr")) model <- match.arg(model, c("JC69", "F81", .aamodels)) if (!is.na(match(model, .aamodels))) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) if (is.null(bf) && model == "F81") bf <- baseFreq(x) if (is.null(bf)) bf <- rep(1 / nc, nc) if (is.null(Q)) Q <- rep(1, (nc - 1) * nc / 2L) bf <- as.double(bf) eig <- edQt(Q = Q, bf = bf) pos <- 1 k <- as.integer(k) w <- as.double(w <- rep(1 / k, k)) g <- as.double(discrete.gamma(shape, k)) fun <- function(s) -(nc - 1) / nc * log(1 - nc / (nc - 1) * s) eps <- (nc - 1) / nc n <- as.integer(dim(contrast)[1]) # attr(unique_contrast, "nlevels") ind1 <- rep(1:n, n:1) ind2 <- unlist(lapply(n:1, function(x) seq_len(x) + n - x)) li <- as.integer(length(ind1)) weight <- as.double(attr(x, "weight")) ll.0 <- as.double(weight * 0) if (exclude == "pairwise") { index <- con[ind1] & con[ind2] index <- which(!index) } tmp <- (contrast %*% eig[[2]])[ind1, ] * (contrast %*% (t(eig[[3]]) * bf))[ind2, ] tmp2 <- vector("list", k) wshared <- which(rowSums(contrast[ind1, ] * contrast[ind2, ]) > 0) tmp2 <- vector("list", k) for (i in 1:(l - 1)) { for (j in (i + 1):l) { w0 <- .Call('PWI', as.integer(x[[i]]), as.integer(x[[j]]), nr, n, weight, li) if (exclude == "pairwise") w0[index] <- 0.0 ind <- w0 > 0 # more error checking sum_shared <- sum(w0[wshared]) sum_w <- sum(w0) if(sum_w == 0){ d[pos] <- NA_real_ v[pos] <- NA_real_ } else if(sum_shared == sum_w){ d[pos] <- 0 v[pos] <- NA_real_ } else { #1 - (sum(w0[wshared]) / sum(w0)) old.el <- 1 - sum_shared / sum_w if (old.el > eps) old.el <- 10 else old.el <- fun(old.el) for (lk in 1:k) tmp2[[lk]] <- tmp[ind, , drop = FALSE] res <- .Call('FS5', eig, nc, as.double(old.el), w, g, unlist(tmp2), as.integer(k), as.integer(sum(ind)), w0[ind], ll.0, 1.0e-8) d[pos] <- res[1] # res[[1]] v[pos] <- res[2] # res[[2]] } pos <- pos + 1 } } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "variance") <- v class(d) <- "dist" return(d) } #' @rdname dist.hamming #' @export dist.logDet <- function(x) { if(inherits(x, "DNAbin") | inherits(x, "AAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) stop("x must be of class phyDat") weight <- attr(x, "weight") contrast <- attr(x, "contrast") r <- attr(x, "nc") l <- length(x) d <- numeric( (l * (l - 1)) / 2) k <- 1 for (i in 1:(l - 1)) { Xi <- weight * contrast[x[[i]], , drop = FALSE] for (j in (i + 1):l) { tmp <- crossprod(Xi, contrast[x[[j]], , drop = FALSE]) class(tmp) <- "matrix" z <- determinant.matrix(tmp, logarithm = TRUE) res <- z$sign * z$modulus if (is.nan(res)) { d[k] <- 10 } else d[k] <- (-res + sum(log(rowSums(tmp) * colSums(tmp))) / 2) / r k <- k + 1 } } attr(d, "Size") <- l if (is.list(x)) attr(d, "Labels") <- names(x) else attr(d, "Labels") <- colnames(x) attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "logDet" class(d) <- "dist" return(d) } #' Writing and reading distances in phylip and nexus format #' #' \code{readDist}, \code{writeDist} and \code{write.nexus.dist} are useful to #' exchange distance matrices with other phylogenetic programs. #' #' #' @param x A \code{dist} object. #' @param file A file name. #' @param format file format, default is "phylip", only other option so far is #' "nexus". #' @param \dots Further arguments passed to or from other methods. #' @param upper logical value indicating whether the upper triangle of the #' distance matrix should be printed. #' @param diag logical value indicating whether the diagonal of the distance #' matrix should be printed. #' @param digits passed to format inside of \code{write.nexus.dist}. #' @param taxa logical. If TRUE a taxa block is added. #' @param append logical. If TRUE the nexus blocks will be added to a file. #' @return an object of class \code{dist} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso To compute distance matrices see \code{\link{dist.ml}} #' \code{\link[ape]{dist.dna}} and \code{\link{dist.p}} for pairwise #' polymorphism p-distances #' @references Maddison, D. R., Swofford, D. L. and Maddison, W. P. (1997) #' NEXUS: an extensible file format for systematic information. #' \emph{Systematic Biology}, \bold{46}, 590--621. #' #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' writeDist(dm) #' write.nexus.dist(dm) #' #' @rdname writeDist #' @export writeDist writeDist <- function(x, file = "", format = "phylip", ...) { format <- match.arg(format, c("phylip", "nexus")) if (format == "phylip") { x <- as.matrix(x) # maybe x <- format(x, digits = digits, justify = "none") cat(ncol(x), "\n", file = file) write.table(x, file, append = TRUE, quote = FALSE, col.names = FALSE) } else write.nexus.dist(x, file = file, ...) } #' @rdname writeDist #' @export write.nexus.dist <- function(x, file = "", append = FALSE, upper = FALSE, diag = TRUE, digits = getOption("digits"), taxa = !append) { if(!inherits(x, "dist")) x <- as.dist(x) taxa.labels <- attr(x, "Labels") ntaxa <- length(taxa.labels) m <- as.matrix(x) cf <- format(m, digits = digits, justify = "none") l <- length(attr(x, "Labels")) if (upper) diag <- TRUE if (!upper) cf[row(cf) < col(cf)] <- "" if (!diag) cf[row(cf) == col(cf)] <- "" cf2 <- apply(cf, 1, "paste0", collapse = " ") cf2 <- paste(attr(x, "Labels"), cf2) cf2 <- trimws(cf2, "right") if (!append) cat("#NEXUS\n\n", file = file) if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS ntax=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) cat("\tTAXLABELS", paste(taxa.labels, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } cat("BEGIN DISTANCES; \n", file = file, append = TRUE) if (upper) cat("\tFORMAT TRIANGLE = BOTH;\n", file = file, append = TRUE) else cat("\tFORMAT TRIANGLE = LOWER;\n", file = file, append = TRUE) if (!diag) cat("\tFORMAT NODIAGONAL;\n", file = file, append = TRUE) cat("\tMatrix \n", file = file, append = TRUE) for (i in 1:l) cat("\t", cf2[i], "\n", sep = "", file = file, append = TRUE) cat("\t;\nEND; \n", file = file, append = TRUE) } RSS <- function(x, dm, trace = 0) { labels <- attr(x, "labels") dm <- as.matrix(dm) dm <- dm[labels, labels] y <- dm[lower.tri(dm)] betahat <- attr(x, "weights") X <- splits2design(x) RSS <- sum((y - (X %*% betahat))^2) RSS } #' @rdname writeDist #' @export readDist <- function(file, format="phylip") { format <- match.arg(format, c("phylip", "nexus")) if(format=="phylip") return(readPhylip(file)) else return(read.nexus.dist(file)) NULL } readPhylip <- function(file, skip = 1, ...) { tmp <- read.table(file, stringsAsFactors = FALSE, skip=skip, ...) labels <- tmp[, 1] dm <- as.matrix(tmp[, -1]) dimnames(dm) <- list(labels, labels) as.dist(dm) } #' @rdname writeDist #' @export read.nexus.dist <- function(file){ X <- scan(file = file, what = "", sep = "\n", quiet = TRUE, strip.white = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments i1 <- grep("TAXLABELS", X, ignore.case = TRUE) taxlab <- ifelse(length(i1) > 0, TRUE, FALSE) if (taxlab) { end <- semico[semico >= i1][1] x <- X[(i1):end] # assumes not a 'new line' after "TRANSLATE" x <- gsub("TAXLABELS", "", x, ignore.case = TRUE) x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\"]", "", x) } distStart <- grep("DISTANCES;", X, ignore.case = TRUE) distEnd <- grep("END;", X, ignore.case = TRUE) distEnd <- distEnd[distEnd > distStart][1] matr <- grep("MATRIX", X, ignore.case = TRUE) format <- grep("FORMAT", X, ignore.case = TRUE) start <- matr[matr > distStart][1] + 1 end <- semico[semico > start][1] - 1 format <- format[(format > distStart) & (format < distEnd)] res <- vector("list", end - start + 1) weights <- numeric(end - start + 1) j <- 1 flab <- FALSE if (length(format) > 0) { tmp <- X[format] tmp <- gsub("\\;", "", tmp) tmp <- gsub("\\s+", "", tmp) flab <- grepl("labels=left", tmp, ignore.case = TRUE) } tmp <- tempfile() writeLines(X[start:end], tmp) nTip <- end-start+1 colnames <- c("label" , paste("V", seq_len(nTip))) dm <- readPhylip(tmp, fill=TRUE, skip=0, col.names = colnames, colClasses=c("character", rep("numeric", nTip))) unlink(tmp) dm } #' @rdname writeDist #' @param incomparables Not used so far. #' @export unique.dist <- function(x, incomparables, ...) { y <- as.matrix(x) l <- nrow(y) z <- character(l) for (i in seq_len(l)) z[i] <- paste(round(y[i, ], 8), collapse = "_") if (any(duplicated(z))) { ind <- !duplicated(z) y <- y[ind, ind] if (is.matrix(x)) return(y) if (inherits(x, "dist")) { res <- as.dist(y, diag = attr(x, "Diag"), upper = attr(x, "Upper")) return(res) } } x } phangorn/R/phangorn-package.R0000644000176200001440000000233114134551241015616 0ustar liggesusers#' Chloroplast alignment #' #' Amino acid alignment of 15 genes of 19 different chloroplast. #' #' #' @name chloroplast #' @docType data #' @keywords datasets #' @examples #' #' data(chloroplast) #' chloroplast #' NULL #' Laurasiatherian data (AWCMEE) #' #' Laurasiatherian RNA sequence data #' #' #' @name Laurasiatherian #' @docType data #' @source Data have been taken from the former repository of the Allan Wilson #' Centre and were converted to R format by \email{klaus.schliep@gmail.com}. #' @keywords datasets #' @examples #' #' data(Laurasiatherian) #' str(Laurasiatherian) #' NULL #' @keywords internal "_PACKAGE" #' Internal phangorn Functions #' #' Internal \pkg{phangorn} functions. #' #' @name phangorn-internal #' @aliases phangorn-internal threshStateC coords map_duplicates #' @keywords internal NULL #' Yeast alignment (Rokas et al.) #' #' Alignment of 106 genes of 8 different species of yeast. #' #' #' @name yeast #' @docType data #' @references Rokas, A., Williams, B. L., King, N., and Carroll, S. B. (2003) #' Genome-scale approaches to resolving incongruence in molecular phylogenies. #' \emph{Nature}, \bold{425}(6960): 798--804 #' @keywords datasets #' @examples #' #' data(yeast) #' str(yeast) #' NULL phangorn/R/sankoff.R0000644000176200001440000000375214155444723014061 0ustar liggesusersprepareDataSankoffNew <- function(data) { contrast <- attr(data, "contrast") contrast[contrast == 0] <- 1.0e+06 contrast[contrast == 1] <- 0.0 attr(data, "contrast") <- contrast data } fit.sankoffNew <- function(tree, data, cost, returnData = c("pscore", "site", "data")) { tree <- reorder(tree, "postorder") returnData <- match.arg(returnData) node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") nr <- attr(data, "nr") contr <- attr(data, "contrast") q <- length(tree$tip.label) nc <- attr(data, "nc") m <- length(edge) + 1L dat <- vector(mode = "list", length = m) dat[1:q] <- subset(data, tree$tip.label) node <- as.integer(node - 1L) edge <- as.integer(edge - 1L) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) res <- .Call('sankoff3B', dat, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, mNodes, nTips, as.double(contr), as.integer(nrow(contr))) root <- getRoot(tree) erg <- .Call('C_rowMin', res[[root]], as.integer(nr), as.integer(nc)) if (returnData == "site") return(erg) pscore <- sum(weight * erg) result <- pscore if (returnData == "data") { res[1:nTips] <- new2old.phyDat(data)[tree$tip.label] result <- list(pscore = pscore, dat = res) } result } #' @rdname parsimony #' @export sankoff <- function(tree, data, cost = NULL, site = "pscore") { if (!inherits(data, "phyDat")) stop("data must be of class phyDat") data <- prepareDataSankoffNew(data) if (is.null(cost)) { levels <- attr(data, "levels") l <- length(levels) cost <- matrix(1, l, l) cost <- cost - diag(l) } if (inherits(tree, "phylo")) return(fit.sankoffNew(tree, data, cost, returnData = site)) if (inherits(tree, "multiPhylo")) { if (is.null(tree$TipLabel)) tree <- unclass(tree) return(sapply(tree, fit.sankoffNew, data, cost, site)) } } phangorn/R/treedist.R0000644000176200001440000007242514041300676014250 0ustar liggesusers# # tree distance functions # coph <- function(x, path = FALSE) { if (is.null(attr(x, "order")) || attr(x, "order") == "cladewise") x <- reorder(x, "postorder") el <- x$edge.length if (path) el <- rep(1.0, nrow(x$edge)) nTips <- as.integer(length(x$tip.label)) nNode <- as.integer(x$Nnode) dm <- cophenetic_cpp(x$edge, as.double(el), nTips, nNode) attr(dm, "Size") <- nTips attr(dm, "Labels") <- x$tip.label attr(dm, "Diag") <- FALSE attr(dm, "Upper") <- FALSE class(dm) <- "dist" dm } #' @export cophenetic.splits <- function(x) { labels <- attr(x, "labels") X <- splits2design(x) dm <- as.vector(X %*% attr(x, "weight")) attr(dm, "Size") <- length(labels) attr(dm, "Labels") <- labels attr(dm, "Diag") <- FALSE attr(dm, "Upper") <- FALSE class(dm) <- "dist" dm } #' Pairwise Distances from a Phylogenetic Network #' #' \code{cophenetic.networx} computes the pairwise distances between the pairs #' of tips from a phylogenetic network using its branch lengths. #' #' #' @aliases cophenetic.networx cophenetic.splits #' @param x an object of class \code{networx}. #' @return an object of class \code{dist}, names are set according to the tip #' labels (as given by the element \code{tip.label} of the argument \code{x}). #' @author Klaus Schliep #' @seealso \code{\link[stats]{cophenetic}} for the generic function, #' \code{neighborNet} to construct a network from a distance matrix #' @keywords manip #' @export cophenetic.networx <- function(x) { spl <- x$splits cophenetic.splits(spl) } ## @aliases treedist RF.dist wRF.dist KF.dist path.dist sprdist SPR.dist #' Distances between trees #' #' \code{treedist} computes different tree distance methods and \code{RF.dist} #' the Robinson-Foulds or symmetric distance. The Robinson-Foulds distance only #' depends on the topology of the trees. If edge weights should be considered #' \code{wRF.dist} calculates the weighted RF distance (Robinson & Foulds #' 1981). and \code{KF.dist} calculates the branch score distance (Kuhner & #' Felsenstein 1994). \code{path.dist} computes the path difference metric as #' described in Steel and Penny 1993). #' \code{sprdist} computes the approximate SPR distance (Oliveira Martins et #' al. 2008, de Oliveira Martins 2016). #' #' @details The Robinson-Foulds distance between two trees \eqn{T_1} and \eqn{T_2} with #' \eqn{n} tips is defined as (following the notation Steel and Penny 1993): #' \deqn{d(T_1, T_2) = i(T_1) + i(T_2) - 2v_s(T_1, T_2)} where \eqn{i(T_1)} #' denotes the number of internal edges and \eqn{v_s(T_1, T_2)} denotes the #' number of internal splits shared by the two trees. The normalized #' Robinson-Foulds distance is derived by dividing \eqn{d(T_1, T_2)} by the #' maximal possible distance \eqn{i(T_1) + i(T_2)}. If both trees are unrooted #' and binary this value is \eqn{2n-6}. #' #' Functions like \code{RF.dist} returns the Robinson-Foulds distance (Robinson #' and Foulds 1981) between either 2 trees or computes a matrix of all pairwise #' distances if a \code{multiPhylo} object is given. #' #' For large number of trees the distance functions can use a lot of memory! #' #' @param tree1 A phylogenetic tree (class \code{phylo}) or vector of trees (an #' object of class \code{multiPhylo}). See details #' @param tree2 A phylogenetic tree. #' @param normalize compute normalized RF-distance, see details. #' @param check.labels compares labels of the trees. #' @param rooted take bipartitions for rooted trees into account, default is #' unrooting the trees. #' @param use.weight use edge.length argument or just count number of edges on #' the path (default) #' @return \code{treedist} returns a vector containing the following tree #' distance methods \item{symmetric.difference}{symmetric.difference or #' Robinson-Foulds distance} #' \item{branch.score.difference}{branch.score.difference} #' \item{path.difference}{path.difference} #' \item{weighted.path.difference}{weighted.path.difference} #' @author Klaus P. Schliep \email{klaus.schliep@@gmail.com}, #' Leonardo de Oliveira Martins #' @seealso \code{\link[ape]{dist.topo}}, \code{\link{nni}}, #' \code{\link{superTree}}, \code{\link{mast}} #' @references de Oliveira Martins L., Leal E., Kishino H. (2008) #' \emph{Phylogenetic Detection of Recombination with a Bayesian Prior on the #' Distance between Trees}. PLoS ONE \bold{3(7)}. e2651. doi: #' 10.1371/journal.pone.0002651 #' #' de Oliveira Martins L., Mallo D., Posada D. (2016) \emph{A Bayesian #' Supertree Model for Genome-Wide Species Tree Reconstruction}. Syst. Biol. #' \bold{65(3)}: 397-416, doi:10.1093/sysbio/syu082 #' #' Steel M. A. and Penny P. (1993) \emph{Distributions of tree comparison #' metrics - some new results}, Syst. Biol., \bold{42(2)}, 126--141 #' #' Kuhner, M. K. and Felsenstein, J. (1994) \emph{A simulation comparison of #' phylogeny algorithms under equal and unequal evolutionary rates}, Molecular #' Biology and Evolution, \bold{11(3)}, 459--468 #' #' D.F. Robinson and L.R. Foulds (1981) \emph{Comparison of phylogenetic #' trees}, Mathematical Biosciences, \bold{53(1)}, 131--147 #' #' D.F. Robinson and L.R. Foulds (1979) Comparison of weighted labelled trees. #' In Horadam, A. F. and Wallis, W. D. (Eds.), \emph{Combinatorial Mathematics #' VI: Proceedings of the Sixth Australian Conference on Combinatorial #' Mathematics, Armidale, Australia}, 119--126 #' @keywords classif #' @importFrom fastmatch fmatch #' @examples #' #' tree1 <- rtree(100, rooted=FALSE) #' tree2 <- rSPR(tree1, 3) #' RF.dist(tree1, tree2) #' treedist(tree1, tree2) #' sprdist(tree1, tree2) #' trees <- rSPR(tree1, 1:5) #' SPR.dist(tree1, trees) #' #' @rdname treedist #' @export treedist treedist <- function(tree1, tree2, check.labels = TRUE) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) tree1 <- unroot(tree1) tree2 <- unroot(tree2) if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) # if (check.labels) { # ind <- match(tree1$tip.label, tree2$tip.label) # if (any(is.na(ind)) | length(tree1$tip.label) != # length(tree2$tip.label)) # stop("trees have different labels") # tree2$tip.label <- tree2$tip.label[ind] # ind2 <- match(seq_along(ind), tree2$edge[, 2]) # tree2$edge[ind2, 2] <- order(ind) # } tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") symmetric.difference <- NULL branch.score.difference <- NULL path.difference <- NULL quadratic.path.difference <- NULL if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") bp1 <- bip(tree1) bp2 <- bip(tree2) bp1 <- SHORTwise(bp1) bp2 <- SHORTwise(bp2) bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") l <- length(tree1$tip.label) if (!is.null(tree1$edge.length) & !is.null(tree2$edge.length)) { dv1 <- coph(tree1) dv2 <- coph(tree2) quadratic.path.difference <- sqrt(sum( (dv1 - dv2)^2)) } RF <- sum(match(bp1, bp2, nomatch = 0L) == 0L) + sum(match(bp2, bp1, nomatch = 0L) == 0L) symmetric.difference <- RF # 2 * (p - sum(r1)) if (!is.null(tree1$edge.length) & !is.null(tree2$edge.length)) { w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length # v1 <- tree1$edge.length # v2 <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (w1[ind3] - w2[ind4])^2) s2 <- sum(w1[-ind3]^2) s3 <- sum(w2[-ind4]^2) branch.score.difference <- sqrt(s1 + s2 + s3) } tree1$edge.length <- rep(1, nrow(tree1$edge)) tree2$edge.length <- rep(1, nrow(tree2$edge)) dt1 <- coph(tree1) dt2 <- coph(tree2) path.difference <- sqrt(sum( (dt1 - dt2)^2)) result <- c(symmetric.difference = symmetric.difference, branch.score.difference = branch.score.difference, path.difference = path.difference, quadratic.path.difference = quadratic.path.difference) result } # leomrtns addition #' @rdname treedist #' @export sprdist <- function(tree1, tree2) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) tree1 <- unroot(tree1) tree2 <- unroot(tree2) lt1 <- length(tree1$tip.label) lt2 <- length(tree2$tip.label) # checking labels is obligatory for spr (user should prune one of them # beforehand?) ind <- match(tree1$tip.label, tree2$tip.label) if (any(is.na(ind)) | lt1 != lt2) stop("trees have different labels") tree2$tip.label <- tree2$tip.label[ind] ind2 <- match(seq_along(ind), tree2$edge[, 2]) tree2$edge[ind2, 2] <- order(ind) # same as in original treedist (will create list of strings with shorter # side of splits) tree1 <- reorder(tree1, "postorder") tree2 <- reorder(tree2, "postorder") if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") # possibly replace bip with bipart bp1 <- bip(tree1) bp1 <- SHORTwise(bp1) bp2 <- bip(tree2) bp2 <- SHORTwise(bp2) bp1 <- bp1[ lengths(bp1) > 1 ] # only internal nodes bp2 <- bp2[ lengths(bp2) > 1 ] if (length(bp1) != length(bp2)) stop ("number of bipartitions given to C_sprdist are not the same") # OBS: SPR distance works w/ incompatible splits only, but it needs common # cherries (to replace by single leaf) spr <- .Call("C_sprdist", bp1, bp2, lt1) tmp <- .Call("C_sprdist", bp2, bp1, lt1)[1] spr[1] <- min(spr[1], tmp) names(spr) <- c("spr", "spr_extra", "rf", "hdist") spr } SPR1 <- function(trees) { trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) trees <- lapply(trees, unroot) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) trees <- lapply(trees, reorder, "postorder") nTips <- length(trees[[1]]$tip.label) fun <- function(x) { bp <- bipart(x) bp <- SHORTwise(bp) bp <- bp[ lengths(bp) > 1 ] bp } BP <- lapply(trees, fun) k <- 1 l <- length(trees) SPR <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] for (j in (i + 1):l) { SPR[k] <- min( .Call("C_sprdist", bp, BP[[j]], nTips)[1], .Call("C_sprdist", BP[[j]], bp, nTips)[1]) k <- k + 1 } } attr(SPR, "Size") <- l if (!is.null(names(trees))) attr(SPR, "Labels") <- names(trees) attr(SPR, "Diag") <- FALSE attr(SPR, "Upper") <- FALSE class(SPR) <- "dist" return(SPR) } SPR2 <- function(tree, trees) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) trees <- .uncompressTipLabel(trees) if (any(is.rooted(trees))) { trees <- unroot(trees) } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) trees <- lapply(trees, reorder, "postorder") tree <- unroot(tree) if (has.singles(tree)) tree <- collapse.singles(tree) nTips <- length(tree$tip.label) fun <- function(x) { bp <- bipart(x) bp <- SHORTwise(bp) bp <- bp[ lengths(bp) > 1 ] bp } bp <- fun(tree) l <- length(trees) SPR <- numeric(l) for (i in 1:l) { bpi <- fun(trees[[i]]) SPR[i] <- min(.Call("C_sprdist", bp, bpi, nTips)[1], .Call("C_sprdist", bpi, bp, nTips)[1]) } if (!is.null(names(trees))) names(SPR) <- names(trees) return(SPR) } #' @rdname treedist #' @export SPR.dist <- function(tree1, tree2 = NULL) { if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(SPR1(tree1)) if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(sprdist(tree1, tree2)[1]) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(SPR2(tree1, tree2)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(SPR2(tree2, tree1)) return(NULL) } wRF0 <- function(tree1, tree2, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (r1 != r2) { message("one tree is unrooted, unrooted both") } if (!rooted) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } if (!r1 | !r2) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) bp1 <- bip(tree1) bp2 <- bip(tree2) if (!rooted) { bp1 <- SHORTwise(bp1) bp2 <- SHORTwise(bp2) } bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(w1[ind3] - w2[ind4])) s2 <- sum(w1[-ind3]) s3 <- sum(w2[-ind4]) wRF <- s1 + s2 + s3 if (normalize) wRF <- wRF / (sum(tree1$edge.length) + sum(tree2$edge.length)) return(wRF) } wRF2 <- function(tree, trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) unclass(trees) nTips <- length(tree$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) if (!rooted & is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) if (!rooted) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") w <- numeric(max(tree$edge)) w[tree$edge[, 2]] <- tree$edge.length l <- length(trees) wRF <- numeric(l) for (i in 1:l) { ind3 <- fmatch(BP[[i]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(W[[i]][ind3] - w[ind4])) s2 <- sum(W[[i]][-ind3]) s3 <- sum(w[-ind4]) wRF[i] <- (s1 + s2 + s3) } if (normalize) { sc <- sapply(trees, function(x) sum(x$edge.length)) + sum(tree$edge.length) wRF <- wRF / sc } wRF } wRF1 <- function(trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) unclass(trees) nTips <- length(trees[[1]]$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (normalize) sc <- sapply(trees, function(x) sum(x$edge.length)) if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) k <- 1 l <- length(trees) wRF <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] w <- W[[i]] for (j in (i + 1):l) { ind3 <- fmatch(BP[[j]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum(abs(W[[j]][ind3] - w[ind4])) s2 <- sum(W[[j]][-ind3]) s3 <- sum(w[-ind4]) wRF[k] <- (s1 + s2 + s3) if (normalize) wRF[k] <- wRF[k] / (sc[i] + sc[j]) k <- k + 1 } } attr(wRF, "Size") <- l if (!is.null(names(trees))) attr(wRF, "Labels") <- names(trees) attr(wRF, "Diag") <- FALSE attr(wRF, "Upper") <- FALSE class(wRF) <- "dist" return(wRF) } mRF2 <- function(tree, trees, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (!inherits(trees, "multiPhylo")) stop("Argument trees should be an object of class \"multiPhylo\"") if (!inherits(tree, "phylo")) stop("Argument tree should be an object of class \"phylo\"") trees <- .compressTipLabel(trees) tipLabel <- attr(trees, "TipLabel") if (check.labels) tree <- checkLabels(tree, tipLabel) # if (check.labels) { # ind <- match(tipLabel, tree$tip.label) # if (any(is.na(ind)) | length(tipLabel) != length(tree$tip.label)) # stop("trees have different labels") # tree$tip.label <- tree$tip.label[ind] # ind2 <- match(seq_along(ind), tree$edge[, 2]) # tree$edge[ind2, 2] <- order(ind) # } nTips <- length(tipLabel) l <- length(trees) RF <- numeric(l) trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) if (!rooted & any(is.rooted(trees))) { warning("some trees were rooted, unrooted all") trees <- unroot(trees) } if (!rooted & is.rooted(tree)) tree <- unroot(tree) if (any(!is.binary(trees))) { message("Some trees are not binary. Result may not what you expect!") } tree <- reorder(tree, "postorder") trees <- reorder(trees, "postorder") xx <- lapply(trees, bipart) if (!rooted) xx <- lapply(xx, SHORTwise) xx <- lapply(xx, function(x) sapply(x, paste, collapse = "_")) yy <- bipart(tree) if (!rooted) yy <- SHORTwise(yy) yy <- sapply(yy, paste, collapse = "_") NnodeT <- Nnode(tree) Nnodes <- Nnode(trees) for (i in 1:l) { RF[i] <- Nnodes[i] + NnodeT - 2 * sum(fmatch(xx[[i]], yy, nomatch = 0L) > 0L) # RF[i] <- sum(match(xx[[i]], yy, nomatch=0L)==0L) + # sum(match(yy, xx[[i]], nomatch=0L)==0L) } if (!is.null(names(trees))) names(RF) <- names(trees) if (!normalize) return(RF) else { sc <- Nnode(trees) + Nnode(tree) - 2 return(RF / sc) } } mRF <- function(trees, normalize = FALSE, rooted = FALSE) { if (!inherits(trees, "multiPhylo")) stop("Argument trees should be an object of class \"multiPhylo\"") trees <- .compressTipLabel(trees) tipLabel <- attr(trees, "TipLabel") nTips <- length(tipLabel) l <- length(trees) RF <- numeric( (l * (l - 1)) / 2) if (rooted & any(!is.rooted(trees))) { warning("Some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) # n <- length(attr(trees, "TipLabel")) # if (any(sapply(trees, is.rooted))) { # warning("some trees were rooted, unrooted all") # trees <- lapply(trees, unroot) # } if (any(!is.binary(trees))) { message("Some trees are not binary. Result may not what you expect!") } # trees <- reorder(trees, "postorder") # trees <- lapply(trees, reorder, "postorder") Nnodes <- Nnode(trees) trees <- .uncompressTipLabel(trees) trees <- unclass(trees) xx <- lapply(trees, bipart) if (!rooted) xx <- lapply(xx, SHORTwise) xx <- lapply(xx, function(x) sapply(x, paste, collapse = "_")) # returns list of character vectors k <- 1 for (i in 1:(l - 1)) { tmp <- xx[[i]] for (j in (i + 1):l) { RF[k] <- Nnodes[i] + Nnodes[j] - 2 * sum(fmatch(xx[[j]], tmp, nomatch = 0L) > 0L) # RF[k] <- sum(match(xx[[j]], tmp, nomatch=0L)==0L) + # sum(match(tmp, xx[[j]], nomatch=0L)==0L) if (normalize) RF[k] <- RF[k] / (Nnodes[i] + Nnodes[j] - 2) k <- k + 1 } } attr(RF, "Size") <- l if (!is.null(names(trees))) attr(RF, "Labels") <- names(trees) attr(RF, "Diag") <- FALSE attr(RF, "Upper") <- FALSE class(RF) <- "dist" return(RF) } RF0 <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (!rooted) { if (r1) { tree1 <- unroot(tree1) r1 <- FALSE } if (r2) { tree2 <- unroot(tree2) r2 <- FALSE } } else { if (r1 != r2) { message("one tree is unrooted, unrooted both") tree1 <- unroot(tree1) tree2 <- unroot(tree2) r1 <- r2 <- FALSE } } if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (!is.binary(tree1) | !is.binary(tree2)) message("Trees are not binary!") bp1 <- bipart(tree1) bp2 <- bipart(tree2) nTips <- length(tree1$tip.label) if (!rooted) { bp1 <- SHORTwise(bp1) bp2 <- SHORTwise(bp2) } RF <- sum(match(bp1, bp2, nomatch = 0L) == 0L) + sum(match(bp2, bp1, nomatch = 0L) == 0L) if (normalize) RF <- RF / (Nnode(tree1) + Nnode(tree2) - 2) RF } #' @rdname treedist #' @export RF.dist <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(RF0(tree1, tree2, normalize, check.labels, rooted)) if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(mRF(tree1, normalize, rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(mRF2(tree1, tree2, normalize, check.labels, rooted)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(mRF2(tree2, tree1, normalize, check.labels, rooted)) else return(NULL) } #' @rdname treedist #' @export wRF.dist <- function(tree1, tree2 = NULL, normalize = FALSE, check.labels = TRUE, rooted = FALSE) { if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(wRF0(tree1, tree2, normalize, check.labels, rooted)) if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(wRF1(tree1, normalize, check.labels, rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(wRF2(tree1, tree2, normalize, check.labels, rooted)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(wRF2(tree2, tree1, normalize, check.labels, rooted)) else return(NULL) } kf0 <- function(tree1, tree2, check.labels = TRUE, rooted = FALSE) { if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (has.singles(tree1)) tree1 <- collapse.singles(tree1) if (has.singles(tree2)) tree2 <- collapse.singles(tree2) r1 <- is.rooted(tree1) r2 <- is.rooted(tree2) if (!rooted) { if (r1) tree1 <- unroot(tree1) if (r2) tree2 <- unroot(tree2) } else { if (r1 != r2) { message("one tree is unrooted, unrooted both") tree1 <- unroot(tree1) tree2 <- unroot(tree2) r1 <- r2 <- FALSE } } bp1 <- bip(tree1) bp2 <- bip(tree2) if (!rooted) { bp1 <- SHORTwise(bp1) bp2 <- SHORTwise(bp2) } bp1 <- sapply(bp1, paste, collapse = "_") bp2 <- sapply(bp2, paste, collapse = "_") w1 <- numeric(max(tree1$edge)) w2 <- numeric(max(tree2$edge)) w1[tree1$edge[, 2]] <- tree1$edge.length w2[tree2$edge[, 2]] <- tree2$edge.length ind3 <- match(bp1, bp2, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (w1[ind3] - w2[ind4])^2) s2 <- sum(w1[-ind3]^2) s3 <- sum(w2[-ind4]^2) branch.score.difference <- sqrt(s1 + s2 + s3) branch.score.difference } kf1 <- function(tree, trees, check.labels = TRUE, rooted = FALSE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) if (has.singles(tree)) tree <- collapse.singles(tree) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted) { if (any(is.rooted(trees))) { trees <- unroot(trees) } } unclass(trees) nTips <- length(tree$tip.label) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) if (!rooted & is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) if (!rooted) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") w <- numeric(max(tree$edge)) w[tree$edge[, 2]] <- tree$edge.length l <- length(trees) branch.score.difference <- numeric(l) for (i in 1:l) { ind3 <- fmatch(BP[[i]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (W[[i]][ind3] - w[ind4])^2) s2 <- sum(W[[i]][-ind3]^2) s3 <- sum(w[-ind4]^2) branch.score.difference[i] <- sqrt(s1 + s2 + s3) } branch.score.difference } kf2 <- function(trees, check.labels = TRUE, rooted = FALSE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (any(has.singles(trees))) trees <- lapply(trees, collapse.singles) nTips <- length(trees[[1]]$tip.label) if (rooted & any(!is.rooted(trees))) { warning("some trees were rooted, unrooted all") rooted <- FALSE } if (!rooted & any(is.rooted(trees))) { trees <- unroot(trees) } unclass(trees) fun1 <- function(x) { w <- numeric(max(x$edge)) w[x$edge[, 2]] <- x$edge.length w } W <- lapply(trees, fun1) fun2 <- function(x, nTips) { bp <- bip(x) bp <- SHORTwise(bp) bp <- sapply(bp, paste, collapse = "_") bp } fun3 <- function(x, nTips) { bp <- bip(x) bp <- sapply(bp, paste, collapse = "_") bp } if (rooted) BP <- lapply(trees, fun3, nTips) else BP <- lapply(trees, fun2, nTips) k <- 1 l <- length(trees) KF <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { bp <- BP[[i]] w <- W[[i]] for (j in (i + 1):l) { ind3 <- fmatch(BP[[j]], bp, nomatch = 0L) ind4 <- ind3[ind3 > 0] ind3 <- which(ind3 > 0) s1 <- sum( (W[[j]][ind3] - w[ind4])^2) s2 <- sum(W[[j]][-ind3]^2) s3 <- sum(w[-ind4]^2) KF[k] <- sqrt(s1 + s2 + s3) k <- k + 1 } } attr(KF, "Size") <- l if (!is.null(names(trees))) attr(KF, "Labels") <- names(trees) attr(KF, "Diag") <- FALSE attr(KF, "Upper") <- FALSE class(KF) <- "dist" return(KF) } #' @rdname treedist #' @export KF.dist <- function(tree1, tree2 = NULL, check.labels = TRUE, rooted = FALSE) { if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(kf2(tree1, rooted = rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(kf0(tree1, tree2, check.labels, rooted)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(kf1(tree1, tree2, check.labels, rooted)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(kf1(tree2, tree1, check.labels, rooted)) return(NULL) } #' @rdname treedist #' @export path.dist <- function(tree1, tree2 = NULL, check.labels = TRUE, use.weight = FALSE) { if (inherits(tree1, "phylo") && inherits(tree2, "phylo")) return(pd0(tree1, tree2, check.labels, !use.weight)) if (inherits(tree1, "phylo") && inherits(tree2, "multiPhylo")) return(pd1(tree1, tree2, check.labels, !use.weight)) if (inherits(tree2, "phylo") && inherits(tree1, "multiPhylo")) return(pd1(tree2, tree1, check.labels, !use.weight)) if (inherits(tree1, "multiPhylo") && is.null(tree2)) return(pd2(tree1, check.labels, !use.weight)) else return(NULL) } pd0 <- function(tree1, tree2, check.labels = TRUE, path = TRUE) { if (check.labels) tree2 <- checkLabels(tree2, tree1$tip.label) if (path) { tree1 <- unroot(tree1) tree2 <- unroot(tree2) } dt1 <- coph(tree1, path) dt2 <- coph(tree2, path) sqrt(sum( (dt1 - dt2)^2)) } pd1 <- function(tree, trees, check.labels = TRUE, path = TRUE) { if (check.labels) { trees <- .compressTipLabel(trees) tree <- checkLabels(tree, attr(trees, "TipLabel")) } trees <- .uncompressTipLabel(trees) if (path) { trees <- unroot(trees) tree <- unroot(tree) } trees <- reorder(trees, "postorder") unclass(trees) l <- length(trees) dt <- coph(tree, path) res <- numeric(l) for (i in 1:l) { dt2 <- coph(trees[[i]], path) res[i] <- sqrt(sum( (dt - dt2)^2)) } res } pd2 <- function(trees, check.labels = TRUE, path = TRUE) { if (check.labels) trees <- .compressTipLabel(trees) trees <- .uncompressTipLabel(trees) if (path) trees <- unroot(trees) trees <- reorder(trees, "postorder") l <- length(trees) unclass(trees) CM <- lapply(trees, coph, path) k <- 1 PD <- numeric( (l * (l - 1)) / 2) for (i in 1:(l - 1)) { for (j in (i + 1):l) { PD[k] <- sqrt(sum( (CM[[i]] - CM[[j]])^2)) k <- k + 1 } } attr(PD, "Size") <- l if (!is.null(names(trees))) attr(PD, "Labels") <- names(trees) attr(PD, "Diag") <- FALSE attr(PD, "Upper") <- FALSE class(PD) <- "dist" return(PD) } phangorn/R/treeManipulation.R0000644000176200001440000005437514152433625015755 0ustar liggesusers# # tree manipulation # # no checks for postorder #' @rdname midpoint #' @export getRoot <- function(tree) { if (!is.null(attr(tree, "order")) && attr(tree, "order") == "postorder") { return(tree$edge[nrow(tree$edge), 1]) } z <- logical(max(tree$edge)) z[tree$edge[, 1]] <- TRUE z[tree$edge[, 2]] <- FALSE z <- which(z) if (length(z) == 1) return(z) else stop("There are apparently two root edges in your tree") } reroot <- function (tree, node, switch_root=TRUE) { root <- getRoot(tree) if (node == root) return(reorder(tree, "postorder")) anc <- Ancestors(tree, node, "all") l <- length(anc) ind <- match(c(node, anc[-l]), tree$edge[, 2]) tree$edge[ind, c(1, 2)] <- tree$edge[ind, c(2, 1)] nb.tip <- Ntip(tree) neworder <- reorderRcpp(tree$edge, as.integer(nb.tip), as.integer(node), 2L) tree$edge <- tree$edge[neworder, ] if(!is.null(tree$edge.length)) tree$edge.length <- tree$edge.length[neworder] if(switch_root){ tree$edge[tree$edge == root] <- 0L tree$edge[tree$edge == node] <- root tree$edge[tree$edge == 0L] <- node } attr(tree, "order") <- "postorder" if(switch_root) tree <- collapse.singles(tree) tree } changeEdge <- function(tree, swap, edge = NULL, edge.length = NULL) { attr(tree, "order") <- NULL child <- tree$edge[, 2] tmp <- numeric(max(child)) tmp[child] <- seq_along(child) tree$edge[tmp[swap[1]], 2] <- swap[2] tree$edge[tmp[swap[2]], 2] <- swap[1] if (!is.null(edge)) { tree$edge.length[tmp[edge]] <- edge.length } reorder(tree, "postorder") } changeEdgeLength <- function(tree, edge, edge.length) { tree$edge.length[match(edge, tree$edge[, 2])] <- edge.length tree } ## @aliases midpoint pruneTree getRoot #' Tree manipulation #' #' \code{midpoint} performs midpoint rooting of a tree. \code{pruneTree} #' produces a consensus tree. #' #' \code{pruneTree} prunes back a tree and produces a consensus tree, for trees #' already containing nodelabels. It assumes that nodelabels are numerical or #' character that allows conversion to numerical, it uses #' as.numeric(as.character(tree$node.labels)) to convert them. \code{midpoint} #' so far does not transform node.labels properly. #' #' @param tree an object of class \code{phylo}. #' @param FUN a function evaluated on the nodelabels, result must be logical. #' @param node.labels are node labels 'support' values (edges), 'label' or #' should labels get 'deleted'? #' @param \dots further arguments, passed to other methods. #' @return \code{pruneTree} and \code{midpoint} a tree. \code{getRoot} returns #' the root node. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{consensus}}, \code{\link[ape]{root}}, #' \code{\link[ape]{multi2di}} #' @keywords cluster #' @examples #' #' tree <- rtree(10, rooted = FALSE) #' tree$node.label <- c("", round(runif(tree$Nnode-1), 3)) #' #' tree2 <- midpoint(tree) #' tree3 <- pruneTree(tree, .5) #' #' old.par <- par(no.readonly = TRUE) #' par(mfrow = c(3,1)) #' plot(tree, show.node.label=TRUE) #' plot(tree2, show.node.label=TRUE) #' plot(tree3, show.node.label=TRUE) #' par(old.par) #' #' @rdname midpoint #' @export midpoint midpoint <- function(tree, node.labels = "support", ...) UseMethod("midpoint") #' @rdname midpoint #' @method midpoint phylo #' @export midpoint.phylo <- function(tree, node.labels = "support", ...) { # distance from node to root node2root <- function(x) { x <- reorder(x, "postorder") el <- numeric(max(x$edge)) parents <- x$edge[, 1] child <- x$edge[, 2] el[child] <- x$edge.length l <- length(parents) res <- numeric(max(x$edge)) for (i in l:1) { res[child[i]] <- el[child[i]] + res[parents[i]] } res } if (is.null(tree$edge.length)) { warning("tree needs edge length") return(tree) } oldtree <- tree if(Ntip(tree)==1) return(tree) if(Ntip(tree)==2){ tree <- collapse.singles(tree) el <- sum(tree$edge.length) tree$edge.length[] <- el / 2 return(tree) } tree <- unroot(tree) nTips <- length(tree$tip.label) maxD1 <- node2root(tree)[1:nTips] ind <- which.max(maxD1) tmproot <- Ancestors(tree, ind, "parent") nTips <- length(tree$tip.label) if (tmproot > nTips) tree <- root(tree, node = tmproot) else tree <- root(tree, tmproot) el <- numeric(max(tree$edge)) el[tree$edge[, 2]] <- tree$edge.length maxdm <- el[ind] tree$edge.length[tree$edge[, 2] == ind] <- 0 maxD1 <- node2root(tree)[1:nTips] tree$edge.length[tree$edge[, 2] == ind] <- maxdm ind <- c(ind, which.max(maxD1)) maxdm <- maxdm + maxD1[ind[2]] rn <- max(tree$edge) + 1L edge <- tree$edge el <- tree$edge.length children <- tree$edge[, 2] left <- match(ind[1], children) tmp <- Ancestors(tree, ind[2], "all") tmp <- c(ind[2], tmp[-length(tmp)]) right <- match(tmp, children) if (el[left] >= (maxdm / 2)) { edge <- rbind(edge, c(rn, ind[1])) edge[left, 2] <- rn el[left] <- el[left] - (maxdm / 2) el <- c(el, maxdm / 2) } else { sel <- cumsum(el[right]) i <- which(sel > (maxdm / 2))[1] edge <- rbind(edge, c(rn, tmp[i])) edge[right[i], 2] <- rn eltmp <- sel[i] - (maxdm / 2) el <- c(el, el[right[i]] - eltmp) el[right[i]] <- eltmp } tree$edge.length <- el storage.mode(edge) <- "integer" tree$edge <- edge tree$Nnode <- tree$Nnode + 1L attr(tree, "order") <- NULL tree <- reroot(tree, rn) if (!is.null(tree$node.label)) { node.label <- tree$node.label tmp <- node.label[1] node.label[1] <- node.label[rn - nTips] node.label[rn - nTips] <- tmp node.label[is.na(node.label)] <- "" tree$node.label <- node.label } attr(tree, "order") <- NULL tree <- reorder(tree, "postorder") if (!is.null(oldtree$node.label)) { type <- match.arg(node.labels, c("support", "label", "delete")) if (type == "support") tree <- addConfidences.phylo(tree, oldtree) if (type == "delete") tree$node.label <- NULL } tree } #' @rdname midpoint #' @method midpoint multiPhylo #' @export midpoint.multiPhylo <- function(tree, node.labels = "support", ...) { if (!is.null(attr(tree, "TipLabel"))) compress <- TRUE else compress <- FALSE tree <- lapply(tree, midpoint.phylo, node.labels = node.labels) class(tree) <- "multiPhylo" if (compress) tree <- .compressTipLabel(tree) tree } #' @rdname midpoint #' @export pruneTree <- function(tree, ..., FUN = ">=") { if (is.null(tree$node)) stop("no node labels") if (is.rooted(tree)) tree <- unroot(tree) m <- max(tree$edge) nTips <- length(tree$tip.label) bs <- rep(TRUE, m) bs[ (nTips + 1):m] <- sapply(as.numeric(as.character(tree$node)), FUN, ...) tree$edge.length[!bs[tree$edge[, 2]]] <- 0 attr(tree, "order") <- NULL reorder(di2multi(tree), "postorder") } # requires postorder # for internal use in fitch.spr # pos statt i dropTip <- function(x, i, check.binary = FALSE, check.root = TRUE) { edge <- x$edge root <- edge[nrow(edge), 1] #getRoot(x) ch <- match(i, edge[,2]) #which(edge[, 2] == i) pa <- edge[ch, 1] edge <- edge[-ch, ] ind <- which(edge[, 1] == pa) if (root == pa) { if (length(ind) == 1) { edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } if (length(ind) == 2) { n <- dim(edge)[1] newroot <- edge[n - 2L, 1] newedge <- edge[ind, 2] if (newedge[1] == newroot) edge[n - 1, ] <- newedge else edge[n - 1, ] <- newedge[2:1] edge <- edge[-n, ] x$Nnode <- x$Nnode - 1L edge[edge == newroot] <- root pa <- newroot } # todo handle unrooted trees } else { nind <- match(pa, edge[,2]) #which(edge[, 2] == pa) # normal binary case if (length(ind) == 1) { edge[nind, 2] <- edge[ind, 2] edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } } # edge[edge > pa] <- edge[edge > pa] - 1L x$edge <- edge x } # like drop tip and returns two trees, # to be used in fitch.spr descAll <- function(x, node, nTips, ch) { m <- max(x) isInternal <- logical(m) isInternal[(nTips + 1):m] <- TRUE desc <- function(node, isInternal) { if (!isInternal[node]) return(node) res <- NULL while (length(node) > 0) { tmp <- unlist(ch[node]) res <- c(res, tmp) node <- tmp[isInternal[tmp]] } res } desc(node, isInternal) } dropNode <- function(x, i, check.binary = FALSE, check.root = TRUE, all.ch = NULL) { edge <- x$edge root <- getRoot(x) ch <- match(i, edge[, 2]) # which(edge[, 2] == i) nTips <- length(x$tip.label) pa <- edge[ch, 1] if (i > nTips) { if (is.null(all.ch)) all.ch <- allChildren(x) kids <- descAll(edge, i, nTips, all.ch) ind <- match(kids, edge[, 2]) edge2 <- edge[sort(ind), ] edge <- edge[-c(ch, ind), ] } else edge <- edge[-ch, ] if (nrow(edge) < 3) return(NULL) ind <- which(edge[, 1] == pa) sibs <- edge[ind, 2L] if (root == pa) { if (length(ind) == 1) { edge <- edge[-ind, ] x$Nnode <- x$Nnode - 1L } if (length(ind) == 2) { n <- dim(edge)[1] newroot <- edge[n - 2L, 1] newedge <- edge[ind, 2] if (newedge[1] == newroot) edge[n - 1, ] <- newedge else edge[n - 1, ] <- newedge[2:1] edge <- edge[-n, ] x$Nnode <- as.integer(length(unique(edge[, 1]))) edge[edge == newroot] <- root pa <- newroot } # todo handle unrooted trees } else { nind <- match(pa, edge[,2]) # which(edge[, 2] == pa) # normal binary case if (length(ind) == 1) { edge[nind, 2] <- edge[ind, 2] edge <- edge[-ind, ] x$Nnode <- as.integer(length(unique(edge[, 1]))) } } x$edge <- edge y <- x y$edge <- edge2 y$Nnode <- as.integer(length(unique(edge2[, 1]))) list(x, y, pa, sibs) } # nur mit edge matrix # postorder remained tip in 1:nTips addOne <- function(tree, tip, i) { edge <- tree$edge parent <- edge[, 1] l <- dim(edge)[1] m <- max(edge) + 1L p <- edge[i, 1] k <- edge[i, 2] edge[i, 2] <- m ind <- match(p, parent) if (ind == 1) edge <- rbind(matrix(c(m, m, k, tip), 2, 2), edge) else edge <- rbind(edge[1:(ind - 1), ], matrix(c(m, m, k, tip), 2, 2), edge[ind:l, ]) tree$edge <- edge tree$Nnode <- tree$Nnode + 1L tree } # raus? addOneTree <- function(tree, subtree, i, node) { edge <- tree$edge parent <- edge[, 1] l <- dim(edge)[1] m <- node # max(edge)+1L p <- edge[i, 1] k <- edge[i, 2] edge[i, 2] <- m edge2 <- subtree$edge ind <- match(p, parent) r2 <- edge2[nrow(edge2), 1] if (ind == 1) edge <- rbind(edge2, matrix(c(m, m, r2, k), 2, 2), edge) else edge <- rbind(edge[1:(ind - 1), ], edge2, matrix(c(m, m, r2, k), 2, 2), edge[ind:l, ]) tree$edge <- edge tree$Nnode <- tree$Nnode + subtree$Nnode + 1L attr(tree, "order") <- NULL tips1 <- as.integer(length(tree$tip.label) + 1L) tmproot <- getRoot(tree) if (tmproot != tips1) { tree$edge[tree$edge == tmproot] <- 0L tree$edge[tree$edge == tips1] <- tmproot tree$edge[tree$edge == 0L] <- tips1 } tree <- reorder(tree, "postorder") if (tmproot != tips1) tree <- unroot(tree) tree } #' Add tips to a tree #' #' This function binds tips to nodes of a phylogenetic trees. #' #' #' @param tree an object of class "phylo". #' @param tips a character vector containing the names of the tips. #' @param where an integer or character vector of the same length as tips giving #' the number of the node or tip of the tree where to add the new tips. #' @param edge.length optional numeric vector with edge length #' @return an object of class phylo #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bind.tree}} #' @keywords cluster #' @examples #' tree <- rcoal(10) #' plot(tree) #' nodelabels() #' tiplabels() #' tree1 <- add.tips(tree, c("A", "B", "C"), c(1,2,15)) #' plot(tree1) #' @export add.tips <- function(tree, tips, where, edge.length = NULL) { nTips <- length(tree$tip.label) nTips_new <- length(tips) if (nTips_new < 1) return(tree) edge <- tree$edge if (is.character(where)) { where <- match(where, c(tree$tip.label, tree$node.label)) } ind <- match(where, edge[, 2]) n_internal <- as.integer(sum(unique(where) <= nTips)) edge[edge > nTips] <- edge[edge > nTips] + nTips_new p_vec <- integer(max(edge) + n_internal) p_vec[edge[, 2]] <- edge[, 1] tip_index <- (nTips + 1):(nTips + nTips_new) c_vec <- c(edge[, 2], tip_index) # first handle internal nodes (easy) if (any(where > nTips)) { ind1 <- where > nTips p_vec[tip_index[ind1]] <- where[ind1] + nTips_new } # handle tips if (any(where <= nTips)) { m <- max(edge) tmp <- unique(where) tmp <- tmp[tmp <= nTips] new_internal <- as.integer( (m + 1L):(m + n_internal)) # add new internal node p_vec[new_internal] <- edge[match(tmp, edge[, 2]), 1] p_vec[tmp] <- new_internal # add tip ind2 <- (where <= nTips) p_vec[tip_index[ind2]] <- p_vec[where[ind2]] ind <- match(tmp, edge[, 2]) c_vec[ind] <- new_internal c_vec <- c(c_vec, tmp) if (!is.null(tree$node.label)) { tree$node.label <- c(tree$node.label, rep("", n_internal)) } } tree$edge <- matrix(c(p_vec[c_vec], c_vec), ncol = 2) if (!is.null(tree$edge.length)) { if (is.null(edge.length)) { tree$edge.length <- c(tree$edge.length, rep(0, nTips_new + n_internal)) } else { if (length(edge.length) < nTips_new) edge.length <- rep(edge.length, length.out = nTips_new) tree$edge.length <- c(tree$edge.length, edge.length, rep(0, n_internal)) } } tree$Nnode <- tree$Nnode + n_internal tree$tip.label <- c(tree$tip.label, tips) attr(tree, "order") <- NULL tree <- reorder(tree) if (!is.null(tree$edge.length)) { if (is.null(edge.length)) { nh <- nodeHeight(tree) nh[tip_index] <- 0 tree$edge.length <- nh[tree$edge[, 1]] - nh[tree$edge[, 2]] } } tree } #' Compute all trees topologies. #' #' \code{allTrees} computes all tree topologies for rooted or unrooted trees #' with up to 10 tips. \code{allTrees} returns bifurcating trees. #' #' #' @param n Number of tips (<=10). #' @param rooted Rooted or unrooted trees (default: rooted). #' @param tip.label Tip labels. #' @return an object of class \code{multiPhylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{rtree}}, \code{\link{nni}} #' @keywords cluster #' @examples #' #' trees <- allTrees(5) #' #' old.par <- par(no.readonly = TRUE) #' par(mfrow = c(3,5)) #' for(i in 1:15)plot(trees[[i]]) #' par(old.par) #' #' @export allTrees allTrees <- function(n, rooted = FALSE, tip.label = NULL) { n <- as.integer(n) nt <- as.integer(round(dfactorial(2 * (n + rooted) - 5))) if ( (n + rooted) > 10) { stop(gettextf("That would generate %d trees, and take up more than %d MB of memory!", nt, as.integer(round(nt / 1000)), domain = "R-phangorn")) } if (n < 2) { stop("A tree must have at least two taxa.") } if (!rooted && n == 2) { stop("An unrooted tree must have at least three taxa.") } if (rooted) { edge <- matrix(NA, 2 * n - 2, 2) edge[1:2, ] <- c(n + 1L, n + 1L, 1L, 2L) } else { edge <- matrix(NA, 2 * n - 3, 2) edge[1:3, ] <- c(n + 1L, n + 1L, n + 1L, 1L, 2L, 3L) } edges <- list() edges[[1]] <- edge m <- 1 nedge <- 1 trees <- vector("list", nt) if ( (n + rooted) > 3) { i <- 3L + (!rooted) pa <- n + 2L nr <- 2L + (!rooted) while (i < (n + 1L)) { nedge <- nedge + 2 m2 <- m * nedge newedges <- vector("list", m2) for (j in 1:m) { edge <- edges[[j]] l <- nr edgeA <- edge edgeB <- edge for (k in 1L:l) { edge <- edgeA node <- edge[k, 1] edge[k, 1] <- pa edge[l + 1, ] <- c(pa, i) edge[l + 2, ] <- c(node, pa) newedges[[(j - 1) * (l + rooted) + k]] <- edge } if (rooted) { edgeB[] <- as.integer(sub(n + 1L, pa, edgeB)) edge <- edgeB edge[l + 1, ] <- c(n + 1L, i) edge[l + 2, ] <- c(n + 1L, pa) newedges[[j * (l + 1)]] <- edge } } # end for edges <- newedges m <- m2 i <- i + 1L pa <- pa + 1L nr <- nr + 2L } # end for m } # end if for (x in 1:m) { edge <- edges[[x]] edge <- edge[reorderRcpp(edge, n, n + 1L, 2L), ] tree <- list(edge = edge) tree$Nnode <- as.integer(n - 2L + rooted) attr(tree, "order") <- "postorder" class(tree) <- "phylo" trees[[x]] <- tree } attr(trees, "TipLabel") <- if (is.null(tip.label)) paste("t", 1:n, sep = "") else tip.label class(trees) <- "multiPhylo" trees } # # some generic tree functions # allAncestors <- function(x) { x <- reorder(x, "postorder") parents <- x$edge[, 1] child <- x$edge[, 2] l <- length(parents) res <- vector("list", max(x$edge)) for (i in l:1) { pa <- parents[i] res[[child[i]]] <- c(pa, res[[pa]]) } res } ## @aliases Ancestors Children Descendants Siblings mrca.phylo #' tree utility function #' #' Functions for describing relationships among phylogenetic nodes. #' #' These functions are inspired by \code{treewalk} in phylobase package, but #' work on the S3 \code{phylo} objects. The nodes are the indices as given in #' edge matrix of an phylo object. From taxon labels these indices can be #' easily derived matching against the \code{tip.label} argument of an phylo #' object, see example below. All the functions allow \code{node} to be either #' a scalar or vector. \code{mrca} is a faster version of the mrca in ape, in #' phangorn only because of dependencies. #' If the argument node is missing the function is evaluated for all nodes. #' #' @param x a tree (a phylo object). #' @param node an integer or a vector of integers corresponding to a node ID #' @param type specify whether to return just direct children / parents or all #' @param include.self whether to include self in list of siblings #' @param full a logical indicating whether to return the MRCAs among all tips #' and nodes (if TRUE); the default is to return only the MRCAs among tips. #' @return a vector or a list containing the indices of the nodes. #' @seealso \code{treewalk}, \code{\link[ape]{as.phylo}}, #' \code{\link[ape]{nodelabels}} #' @keywords misc #' @examples #' #' tree <- rtree(10) #' plot(tree, show.tip.label = FALSE) #' nodelabels() #' tiplabels() #' Ancestors(tree, 1:3, "all") #' Children(tree, 11) #' Descendants(tree, 11, "tips") #' Siblings(tree, 3) #' # Siblings of all nodes #' Siblings(tree) #' mrca.phylo(tree, 1:3) #' mrca.phylo(tree, match(c("t1", "t2", "t3"), tree$tip)) #' mrca.phylo(tree) #' # same as mrca(tree), but faster for large trees #' #' @export #' @rdname Ancestors Ancestors <- function(x, node, type = c("all", "parent")) { parents <- x$edge[, 1] child <- x$edge[, 2] pvector <- integer(max(x$edge)) # parents pvector[child] <- parents type <- match.arg(type) if (type == "parent") return(pvector[node]) anc <- function(pvector, node) { res <- integer(0) repeat { anc <- pvector[node] if (anc == 0) break res <- c(res, anc) node <- anc } res } if (!missing(node) && length(node) == 1) return(anc(pvector, node)) else allAncestors(x)[node] } allChildren <- function(x) { l <- length(x$tip.label) if (l < 20) { parent <- x$edge[, 1] children <- x$edge[, 2] res <- vector("list", max(x$edge)) for (i in seq_along(parent)) res[[parent[i]]] <- c(res[[parent[i]]], children[i]) return(res) } else { allChildrenCPP(x$edge) } } #' @describeIn Ancestors list all the descendant nodes of each node #' @keywords internal #' @export allDescendants <- function(x) { if (is.null(attr(x, "order")) || attr(x, "order") != "postorder") x <- reorder(x, "postorder") nTips <- as.integer(length(x$tip.label)) allDescCPP(x$edge, nTips) } #' @rdname Ancestors #' @export Children <- function(x, node) { # return allChildren if node is missing if (!missing(node) && length(node) == 1) return(x$edge[x$edge[, 1] == node, 2]) allChildren(x)[node] } #' @rdname Ancestors #' @export Descendants <- function(x, node, type = c("tips", "children", "all")) { type <- match.arg(type) if (type == "children") return(Children(x, node)) if (type == "tips") return(bip(x)[node]) # new version using Rcpp if (missing(node) || length(node) > 10) return(allDescendants(x)[node]) ch <- allChildren(x) # out of the loop isInternal <- logical(max(x$edge)) isInternal[ unique(x$edge[, 1]) ] <- TRUE desc <- function(node, isInternal) { if (!isInternal[node]) return(node) res <- NULL while (length(node) > 0) { tmp <- unlist(ch[node]) res <- c(res, tmp) node <- tmp[isInternal[tmp]] } res } if (length(node) > 1) return(lapply(node, desc, isInternal)) desc(node, isInternal) } #' @rdname Ancestors #' @export Siblings <- function(x, node, include.self = FALSE) { if (missing(node)) node <- as.integer(1:max(x$edge)) l <- length(node) if (l == 1) { v <- Children(x, Ancestors(x, node, "parent")) if (!include.self) v <- v[v != node] return(v) } else { parents <- x$edge[, 1] child <- x$edge[, 2] pvector <- integer(max(x$edge)) # parents pvector[child] <- parents root <- as.integer(parents[!match(parents, child, 0)][1]) res <- vector("list", l) ch <- allChildren(x) if (include.self) return(ch[ pvector[node] ]) k <- 1 for (i in node) { if (i != root) { tmp <- ch[[ pvector[i] ]] res[[k]] <- tmp[tmp != i] } k <- k + 1 } } res } #' @rdname Ancestors #' @export mrca.phylo <- function(x, node = NULL, full = FALSE) { if (is.null(node)) return(mrca2(x, full = full)) return(getMRCA(x, node)) } # should be in ape mrca2 <- function(phy, full = FALSE) { Nnode <- phy$Nnode Ntips <- length(phy$tip.label) phy <- reorder(phy) nodes <- unique(phy$edge[, 1]) if (!full) { res <- Descendants(phy, nodes, "tips") M <- matrix(nodes[1], Ntips, Ntips) for (i in 2:Nnode) M[res[[i]], res[[i]]] <- nodes[i] diag(M) <- 1:Ntips dimnames(M) <- list(phy$tip.label, phy$tip.label) } else { res <- Descendants(phy, nodes, "all") M <- matrix(nodes[1], Ntips + Nnode, Ntips + Nnode) for (i in 2:Nnode) { tmp <- c(res[[i]], nodes[i]) M[tmp, tmp] <- nodes[i] } diag(M) <- 1:(Ntips + Nnode) dimnames(M) <- list(1:(Ntips + Nnode), 1:(Ntips + Nnode)) } M } phangorn/R/ancestral_pml.R0000644000176200001440000003106614140307115015240 0ustar liggesusers# # ancestral sequences ML # #' Ancestral character reconstruction. #' #' Marginal reconstruction of the ancestral character states. #' #' The argument "type" defines the criterion to assign the internal nodes. For #' \code{ancestral.pml} so far "ml" and (empirical) "bayes" and for #' \code{ancestral.pars} "MPR" and "ACCTRAN" are possible. #' #' With parsimony reconstruction one has to keep in mind that there will be #' often no unique solution. #' #' For further details see vignette("Ancestral"). #' #' @param object an object of class pml #' @param tree a tree, i.e. an object of class pml #' @param data an object of class phyDat #' @param type method used to assign characters to internal nodes, see details. #' @param i plots the i-th site pattern of the \code{data}. #' @param col a vector containing the colors for all possible states. #' @param cex.pie a numeric defining the size of the pie graphs #' @param pos a character string defining the position of the legend #' @param cost A cost matrix for the transitions between two states. #' @param return return a \code{phyDat} object or matrix of probabilities. #' @param \dots Further arguments passed to or from other methods. #' @return %A matrix containing the the estimates character states. An object #' of class "phyDat", containing the ancestral states of all nodes. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{parsimony}}, \code{\link[ape]{ace}}, #' \code{\link[ape]{root}} #' @references Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer #' Associates, Sunderland. #' #' Swofford, D.L., Maddison, W.P. (1987) Reconstructing ancestral character #' states under Wagner parsimony. \emph{Math. Biosci.} \bold{87}: 199--229 #' #' Yang, Z. (2006). \emph{Computational Molecular evolution}. Oxford University #' Press, Oxford. #' @keywords cluster #' @importFrom fastmatch fmatch #' @examples #' #' example(NJ) #' fit <- pml(tree, Laurasiatherian) #' anc.ml <- ancestral.pml(fit, type = "ml") #' anc.p <- ancestral.pars(tree, Laurasiatherian) #' \dontrun{ #' require(seqLogo) #' seqLogo( t(subset(anc.ml, 48, 1:20)[[1]]), ic.scale=FALSE) #' seqLogo( t(subset(anc.p, 48, 1:20)[[1]]), ic.scale=FALSE) #' } #' # plot the first site pattern #' plotAnc(tree, anc.ml, 1) #' # plot the third character #' plotAnc(tree, anc.ml, attr(anc.ml, "index")[3]) #' #' @rdname ancestral.pml #' @export ancestral.pml <- function(object, type = "marginal", return = "prob") { call <- match.call() pt <- match.arg(type, c("marginal", "joint", "ml", "bayes")) tree <- object$tree INV <- object$INV inv <- object$inv data <- getCols(object$data, tree$tip.label) data_type <- attr(data, "type") if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") { tree <- reorder(tree, "postorder") } nTips <- length(tree$tip.label) node <- tree$edge[, 1] edge <- tree$edge[, 2] m <- length(edge) + 1 # max(edge) w <- object$w g <- object$g l <- length(w) nr <- attr(data, "nr") nc <- attr(data, "nc") dat <- vector(mode = "list", length = m * l) result <- vector(mode = "list", length = m) dim(dat) <- c(l, m) x <- attributes(data) label <- as.character(1:m) nam <- tree$tip.label label[seq_along(nam)] <- nam x[["names"]] <- label tmp <- length(data) if (return != "phyDat") { result <- new2old.phyDat(data) } else { result[1:nTips] <- data } eig <- object$eig bf <- object$bf el <- tree$edge.length P <- getP(el, eig, g) nr <- as.integer(attr(data, "nr")) nc <- as.integer(attr(data, "nc")) node <- as.integer(node - min(node)) edge <- as.integer(edge - 1) nTips <- as.integer(length(tree$tip.label)) mNodes <- as.integer(max(node) + 1) contrast <- attr(data, "contrast") # proper format eps <- 1.0e-5 ind1 <- which(apply(contrast, 1, function(x) sum(x > eps)) == 1L) ind2 <- which(contrast[ind1, ] > eps, arr.ind = TRUE) pos <- ind2[match(seq_len(ncol(contrast)), ind2[, 2]), 1] nco <- as.integer(dim(contrast)[1]) for (i in 1:l) dat[i, (nTips + 1):m] <- .Call('LogLik2', data, P[i, ], nr, nc, node, edge, nTips, mNodes, contrast, nco) parent <- tree$edge[, 1] child <- tree$edge[, 2] nTips <- min(parent) - 1 # in C with scaling for (i in 1:l) { for (j in (m - 1):1) { if (child[j] > nTips) { tmp2 <- (dat[[i, parent[j]]] / (dat[[i, child[j]]] %*% P[[i, j]])) dat[[i, child[j]]] <- (tmp2 %*% P[[i, j]]) * dat[[i, child[j]]] } } } for (j in unique(parent)) { tmp <- matrix(0, nr, nc) if (inv > 0) tmp <- as.matrix(INV) * inv for (i in 1:l) { # scaling!!! tmp <- tmp + w[i] * dat[[i, j]] } if ((pt == "bayes") || (pt == "marginal")) tmp <- tmp * rep(bf, each = nr) tmp <- tmp / rowSums(tmp) if (return == "phyDat") { if (data_type == "DNA") { tmp <- p2dna(tmp) tmp <- fitchCoding2ambiguous(tmp) } else { tmp <- pos[max.col(tmp)] } } result[[j]] <- tmp } attributes(result) <- x attr(result, "call") <- call result } # joint_reconstruction <- function(object){ # # } # in mpr ancestral2phyDat <- function(x) { eps <- 1.0e-5 contr <- attr(x, "contrast") # a bit too complicated ind1 <- which(apply(contr, 1, function(x) sum(x > eps)) == 1L) ind2 <- which(contr[ind1, ] > eps, arr.ind = TRUE) # pos <- ind2[match(as.integer(1L:ncol(contr)), ind2[,2]),1] pos <- ind2[match(seq_len(ncol(contr)), ind2[, 2]), 1] # only first hit res <- lapply(x, function(x, pos) pos[max.col(x)], pos) attributes(res) <- attributes(x) return(res) } fitchCoding2ambiguous <- function(x, type = "DNA") { y <- c( 1L, 2L, 4L, 8L, 8L, 3L, 5L, 9L, 6L, 10L, 12L, 7L, 11L, 13L, 14L, 15L, 15L, 15L ) fmatch(x, y) } fitchCoding2ambiguous2 <- function(x, type = "DNA") { y <- c(1L, 2L, 4L, 8L, 8L, 3L, 5L, 9L, 6L, 10L, 12L, 7L, 11L, 13L, 14L, 15L) dna <- c( "a", "c", "g", "t", "t", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n" ) rna <- c( "a", "c", "g", "u", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n" ) res <- switch(type, "DNA" = dna[fmatch(x, y)], "RNA" = rna[fmatch(x, y)] ) res } #' @rdname ancestral.pml #' @export ancestral.pars <- function(tree, data, type = c("MPR", "ACCTRAN"), cost = NULL, return = "prob") { call <- match.call() type <- match.arg(type) if (type == "ACCTRAN") { res <- ptree(tree, data, return = return) attr(res, "call") <- call } if (type == "MPR") { res <- mpr(tree, data, cost = cost, return = return) attr(res, "call") <- call } res } #' @rdname ancestral.pml #' @export pace <- ancestral.pars mpr.help <- function(tree, data, cost = NULL) { tree <- reorder(tree, "postorder") if (!inherits(data, "phyDat")) { stop("data must be of class phyDat") } levels <- attr(data, "levels") l <- length(levels) if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } weight <- attr(data, "weight") p <- attr(data, "nr") kl <- TRUE i <- 1 dat <- prepareDataSankoff(data) for (i in seq_along(dat)) storage.mode(dat[[i]]) <- "double" tmp <- fit.sankoff(tree, dat, cost, returnData = "data") p0 <- tmp[[1]] datf <- tmp[[2]] datp <- pnodes(tree, datf, cost) nr <- attr(data, "nr") nc <- attr(data, "nc") node <- tree$edge[, 1] edge <- tree$edge[, 2] node <- as.integer(node - 1L) edge <- as.integer(edge - 1L) res <- .Call('sankoffMPR', datf, datp, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge) root <- getRoot(tree) res[[root]] <- datf[[root]] res } mpr <- function(tree, data, cost = NULL, return = "prob") { data <- subset(data, tree$tip.label) att <- attributes(data) type <- att$type nr <- att$nr nc <- att$nc res <- mpr.help(tree, data, cost) l <- length(tree$tip.label) m <- length(res) label <- as.character(1:m) nam <- tree$tip.label label[seq_along(nam)] <- nam att[["names"]] <- label ntips <- length(tree$tip.label) contrast <- att$contrast eps <- 5e-6 rm <- apply(res[[ntips + 1]], 1, min) RM <- matrix(rm, nr, nc) + eps fun <- function(X) { rs <- rowSums(X) # apply(X, 1, sum) X / rs } for (i in 1:ntips) res[[i]] <- contrast[data[[i]], , drop = FALSE] for (i in (ntips + 1):m) res[[i]][] <- as.numeric(res[[i]] < RM) if (return == "prob") { # for(i in 1:ntips) res[[i]] <- contrast[data[[i]],,drop=FALSE] if (return == "prob") res <- lapply(res, fun) } # else res[1:ntips] <- data[1:ntips] attributes(res) <- att fun2 <- function(x) { x <- p2dna(x) fitchCoding2ambiguous(x) } if (return != "prob") { if (type == "DNA") { res <- lapply(res, fun2) attributes(res) <- att } else { res <- ancestral2phyDat(res) } res[1:ntips] <- data } res } #' @rdname ancestral.pml #' @param site.pattern logical, plot i-th site pattern or i-th site #' @importFrom grDevices hcl.colors #' @export plotAnc <- function(tree, data, i = 1, site.pattern = TRUE, col = NULL, cex.pie = par("cex"), pos = "bottomright", ...) { y <- subset(data, select = i, site.pattern = site.pattern) CEX <- cex.pie xrad <- CEX * diff(par("usr")[1:2]) / 50 levels <- attr(data, "levels") nc <- attr(data, "nc") y <- matrix(unlist(y[]), ncol = nc, byrow = TRUE) l <- dim(y)[1] dat <- matrix(0, l, nc) for (i in 1:l) dat[i, ] <- y[[i]] plot(tree, label.offset = 1.1 * xrad, plot = FALSE, ...) lastPP <- get("last_plot.phylo", envir = .PlotPhyloEnv) XX <- lastPP$xx YY <- lastPP$yy xrad <- CEX * diff(lastPP$x.lim * 1.1) / 50 par(new = TRUE) plot(tree, label.offset = 1.1 * xrad, plot = TRUE, ...) if (is.null(col)) col <- hcl.colors(nc) #rainbow(nc) if (length(col) != nc) { warning("Length of color vector differs from number of levels!") } BOTHlabels( pie = y, XX = XX, YY = YY, adj = c(0.5, 0.5), frame = "rect", pch = NULL, sel = seq_along(XX), thermo = NULL, piecol = col, col = "black", bg = "lightblue", horiz = FALSE, width = NULL, height = NULL, cex = cex.pie ) if (!is.null(pos)) legend(pos, legend=levels, text.col = col) } # # ACCTRAN # acctran2 <- function(tree, data) { if(!is.binary(tree)) tree <- multi2di(tree) tree <- reorder(tree, "postorder") edge <- tree$edge data <- subset(data, tree$tip.label) f <- init_fitch(data, FALSE, FALSE, m=2L) psc_node <- f$pscore_node(edge) tmp <- reorder(tree)$edge tmp <- tmp[tmp[,2]>Ntip(tree), ,drop=FALSE] f$traverse(edge) if(length(tmp)>0)f$acctran_traverse(tmp) psc <- f$pscore_acctran(edge) el <- psc #[edge[,2]] parent <- unique(edge[,1]) desc <- Descendants(tree, parent, "children") for(i in seq_along(parent)){ x <- psc_node[parent[i]] -sum(psc[desc[[i]]]) if(x>0) el[desc[[i]] ] <- el[desc[[i]] ] + x/length(desc[[i]]) } tree$edge.length <- el[edge[,2]] tree } #' @rdname parsimony #' @export acctran <- function(tree, data) { if (inherits(tree, "multiPhylo")) { compress <- FALSE if (!is.null(attr(tree, "TipLabel"))){ compress <- TRUE tree <- .uncompressTipLabel(tree) } res <- lapply(tree, acctran2, data) class(res) <- "multiPhylo" if (compress) res <- .compressTipLabel(res) return(res) } acctran2(tree, data) } ptree <- function(tree, data, return = "prob") { tree <- reorder(tree, "postorder") edge <- tree$edge att <- attributes(data) nr <- att$nr type <- att$type m <- max(edge) nTip <- Ntip(tree) f <- init_fitch(data, FALSE, FALSE, m=2L) f$traverse(edge) tmp <- reorder(tree)$edge tmp <- tmp[tmp[,2]>Ntip(tree),] if(length(tmp)>0)f$acctran_traverse(tmp) res <- vector("list", m) att$names <- c(att$names, as.character((nTip+1):m)) if(return == "phyDat"){ res[1:nTip] <- data[1:nTip] if(type=="DNA"){ for(i in (nTip+1):m) res[[i]] <- f$getAnc(i)[1:nr] } } if(return == "phyDat"){ res[1:nTip] <- data[1:nTip] if(type=="DNA"){ for(i in (nTip+1):m) res[[i]] <- f$getAncAmb(i)[1:nr] } else stop("This is only for nucleotide sequences supported so far") } else { fun <- function(X) { rs <- rowSums(X) # apply(X, 1, sum) X / rs } contrast <- att$contrast for(i in seq_len(nTip)) res[[i]] <- contrast[data[[i]], , drop=FALSE] for(i in (nTip+1):m) res[[i]] <- f$getAnc(i)[1:nr, , drop=FALSE] res <- lapply(res, fun) } attributes(res) <- att res } #parsimony.plot <- function(tree, ...) { # x <- numeric(max(tree$edge)) # x[tree$edge[, 2]] <- tree$edge.length # plot(tree, ...) # ind <- get("last_plot.phylo", envir = .PlotPhyloEnv)$edge[, 2] # edgelabels(prettyNum(x[ind]), frame = "none") #} phangorn/R/RcppExports.R0000644000176200001440000000310714155651117014712 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 fhm_new <- function(v, n) { .Call(`_phangorn_fhm_new`, v, n) } allDescCPP <- function(orig, nTips) { .Call(`_phangorn_allDescCPP`, orig, nTips) } countCycle_cpp <- function(M) { .Call(`_phangorn_countCycle_cpp`, M) } countCycle2_cpp <- function(M) { .Call(`_phangorn_countCycle2_cpp`, M) } out_cpp <- function(d, r, n) { .Call(`_phangorn_out_cpp`, d, r, n) } getIndex <- function(left, right, n) { .Call(`_phangorn_getIndex`, left, right, n) } Transfer_Index <- function(bp, orig, l) { .Call(`_phangorn_Transfer_Index`, bp, orig, l) } bipartCPP <- function(orig, nTips) { .Call(`_phangorn_bipartCPP`, orig, nTips) } bipCPP <- function(orig, nTips) { .Call(`_phangorn_bipCPP`, orig, nTips) } bip_shared <- function(tree1, tree2, nTips) { .Call(`_phangorn_bip_shared`, tree1, tree2, nTips) } allChildrenCPP <- function(orig) { .Call(`_phangorn_allChildrenCPP`, orig) } allSiblingsCPP <- function(edge) { .Call(`_phangorn_allSiblingsCPP`, edge) } p2dna <- function(xx, eps = 0.999) { .Call(`_phangorn_p2dna`, xx, eps) } node_height_cpp <- function(edge1, edge2, edge_length) { .Call(`_phangorn_node_height_cpp`, edge1, edge2, edge_length) } cophenetic_cpp <- function(edge, edge_length, nTips, nNode) { .Call(`_phangorn_cophenetic_cpp`, edge, edge_length, nTips, nNode) } #' @rdname phangorn-internal #' @export threshStateC <- function(x, thresholds) { .Call(`_phangorn_threshStateC`, x, thresholds) } phangorn/R/codon.R0000644000176200001440000000722214140526064013521 0ustar liggesusers#' Translate nucleic acid sequences into codons #' #' The function transforms \code{dna2codon} DNA sequences to codon sequences, #' \code{codon2dna} transform the other way. #' #' The following genetic codes are described here. The number preceding each #' corresponds to the code argument. #' \tabular{rl}{ #' 1 \tab standard \cr #' 2 \tab vertebrate.mitochondrial \cr #' 3 \tab yeast.mitochondrial \cr #' 4 \tab protozoan.mitochondrial+mycoplasma \cr #' 5 \tab invertebrate.mitochondrial \cr #' 6 \tab ciliate+dasycladaceal \cr #' 9 \tab echinoderm+flatworm.mitochondrial \cr #' 10 \tab euplotid \cr #' 11 \tab bacterial+plantplastid \cr #' 12 \tab alternativeyeast \cr #' 13 \tab ascidian.mitochondrial \cr #' 14 \tab alternativeflatworm.mitochondrial \cr #' 15 \tab blepharism \cr #' 16 \tab chlorophycean.mitochondrial \cr #' 21 \tab trematode.mitochondrial \cr #' 22 \tab scenedesmus.mitochondrial \cr #' 23 \tab thraustochytrium.mitochondria \cr #' 24 \tab Pterobranchia.mitochondrial \cr #' 25 \tab CandidateDivision.SR1+Gracilibacteria \cr #' 26 \tab Pachysolen.tannophilus #' } #' Alignment gaps and ambiguities are currently ignored and sites containing #' these are deleted. #' #' @aliases #' dna2codon codon2dna #' @param x An object containing sequences. #' @param codonstart an integer giving where to start the translation. This #' should be 1, 2, or 3, but larger values are accepted and have for effect to #' start the translation further within the sequence. #' @param code The ncbi genetic code number for translation (see details). #' By default the standard genetic code is used. #' @param ambiguity character for ambiguous character and no contrast is #' provided. #' @param ... further arguments passed to or from other methods. #' @return The functions return an object of class \code{phyDat}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @references \url{https://www.ncbi.nlm.nih.gov/Taxonomy/taxonomyhome.html/index.cgi?chapter=cgencodes} #' @seealso \code{\link{trans}}, \code{\link{phyDat}} and the chapter 4 in the #' \code{vignette("phangorn-specials", package="phangorn")} #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' class(Laurasiatherian) #' Laurasiatherian #' dna2codon(Laurasiatherian) #' #' @rdname dna2codon #' @export dna2codon <- function(x, codonstart=1, code=1, ambiguity="---", ...){ if(!inherits(x, "phyDat"))stop("x needs to be of class phyDat!") if(attr(x, "type")=="AA")stop("x needs to be a nucleotide sequence!") if(codonstart>1){ del <- -seq_len(codonstart) x <- subset(x, select=del, site.pattern=FALSE) } n_sites <- sum(attr(x, "weight")) if( (n_sites %% 3) ){ keep <- seq_len( (n_sites %/% 3) * 3 ) x <- subset(x, select=keep, site.pattern=FALSE) } phyDat.codon(as.character(x), ambiguity=ambiguity, code=code, ...) } #' @rdname dna2codon #' @export codon2dna <- function(x){ if(!inherits(x, "phyDat"))stop("x needs to be of class phyDat!") phyDat.DNA(as.character(x)) } synonymous_subs <- function(code=1, stop.codon=FALSE){ tmp <- .CODON[, as.character(code)] label <- rownames(.CODON) l <- length(tmp) res <- matrix(1, 64, 64, dimnames = list(label, label)) for(i in seq_len(64)){ for(j in seq_len(64)) { if(tmp[i] == tmp[j]) res[i, j] <- 0 } } res[.ONE_TRANSITION == FALSE] <- -1 if(!stop.codon){ label <- label[tmp != "*"] res <- res[label, label] } res[lower.tri(res)] } tstv_subs <- function(code=1, stop.codon=FALSE){ tmp <- .CODON[, as.character(code)] label <- rownames(.CODON) res <- .SUB if(!stop.codon){ label <- label[tmp != "*"] res <- res[label, label] } res[lower.tri(res)] } phangorn/R/phyDat.R0000644000176200001440000006411314140203506013643 0ustar liggesusers# # Data structures for ML and MP # #' Conversion among Sequence Formats #' #' These functions transform several DNA formats into the \code{phyDat} format. #' \code{allSitePattern} generates an alignment of all possible site patterns. #' #' If \code{type} "USER" a vector has to be give to \code{levels}. For example #' c("a", "c", "g", "t", "-") would create a data object that can be used in #' phylogenetic analysis with gaps as fifth state. There is a more detailed #' example for specifying "USER" defined data formats in the vignette #' "phangorn-specials". #' #' \code{allSitePattern} returns all possible site patterns and can be useful #' in simulation studies. For further details see the vignette #' phangorn-specials. #' #' The generic function \code{c} can be used to to combine sequences and #' \code{unique} to get all unique sequences or unique haplotypes. #' #' \code{acgt2ry} converts a \code{phyDat} object of nucleotides into an binary #' ry-coded dataset. #' #' @aliases #' as.phyDat.character as.phyDat.data.frame as.phyDat.matrix #' as.MultipleAlignment as.MultipleAlignment.phyDat cbind.phyDat c.phyDat #' acgt2ry removeUndeterminedSites phyDat2MultipleAlignment #' @param data An object containing sequences. #' @param x An object containing sequences. #' @param type Type of sequences ("DNA", "AA", "CODON" or "USER"). #' @param levels Level attributes. #' @param return.index If TRUE returns a index of the site patterns. #' @param n Number of sequences. #' @param names Names of sequences. #' @param subset a subset of taxa. #' @param select a subset of characters. #' @param site.pattern select site pattern or sites. #' @param allLevels return original data. #' @param obj as object of class phyDat #' @param freq logical, if 'TRUE', frequencies or counts are returned otherwise #' proportions #' @param all all a logical; if all = TRUE, all counts of bases, ambiguous #' codes, missing data, and alignment gaps are returned as defined in the #' contrast. #' @param drop.unused.levels logical, drop unused levels #' @param incomparables for compatibility with unique. #' @param identical if TRUE (default) sequences have to be identical, if FALSE #' sequences are considered duplicates if distance between sequences is zero #' (happens frequently with ambiguous sites). #' @param ambiguity character for ambiguous character and no contrast is #' provided. #' @param ... further arguments passed to or from other methods. #' @return The functions return an object of class \code{phyDat}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{DNAbin}}, \code{\link{as.DNAbin}}, #' \code{\link{read.dna}}, \code{\link{read.aa}}, \code{\link{read.nexus.data}} #' and the chapter 1 in the \code{vignette("phangorn-specials", #' package="phangorn")} and the example of \code{\link{pmlMix}} for the use of #' \code{allSitePattern} #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' class(Laurasiatherian) #' Laurasiatherian #' # base frequencies #' baseFreq(Laurasiatherian) #' baseFreq(Laurasiatherian, all=TRUE) #' baseFreq(Laurasiatherian, freq=TRUE) #' # subsetting phyDat objects #' # the first 5 sequences #' subset(Laurasiatherian, subset=1:5) #' # the first 5 characters #' subset(Laurasiatherian, select=1:5, site.pattern = FALSE) #' # subsetting with [] #' Laurasiatherian[1:5, 1:20] #' # short for #' subset(Laurasiatherian, subset=1:5, select=1:20, site.pattern = FALSE) #' # the first 5 site patterns (often more than 5 characters) #' subset(Laurasiatherian, select=1:5, site.pattern = TRUE) #' # transform into old ape format #' LauraChar <- as.character(Laurasiatherian) #' # and back #' Laura <- phyDat(LauraChar) #' all.equal(Laurasiatherian, Laura) #' # Compute all possible site patterns #' # for nucleotides there $4 ^ (number of tips)$ patterns #' allSitePattern(5) #' #' @rdname phyDat #' @export phyDat <- function (data, type="DNA", levels=NULL, return.index = TRUE, ...){ # if (inherits(data, "DNAbin")) type <- "DNA" pt <- match.arg(type, c("DNA", "AA", "CODON", "USER")) if(pt=="DNA") dat <- phyDat.DNA(data, return.index=return.index, ...) if(pt=="AA") dat <- phyDat.AA(data, return.index=return.index, ...) if(pt=="CODON") dat <- phyDat.codon(data, return.index=return.index, ...) if(pt=="USER") dat <- phyDat.default(data, levels = levels, return.index=return.index, ...) dat } #' @rdname phyDat #' @export as.phyDat <- function (x, ...){ if (inherits(x, "phyDat")) return(x) UseMethod("as.phyDat") } #' @rdname phyDat #' @method as.phyDat factor #' @export as.phyDat.factor <- function(x, ...){ nam <- names(x) lev <- levels(x) x <- as.character(x) names(x) <- nam phyDat(x, type="USER", levels = lev, ...) } #' @rdname phyDat #' @method as.phyDat DNAbin #' @export as.phyDat.DNAbin <- function(x, ...) phyDat.DNA(x, ...) #' @rdname phyDat #' @method as.phyDat alignment #' @export as.phyDat.alignment <- function (x, type="DNA", ...){ x$seq <- tolower(x$seq) data <- sapply(x$seq, strsplit, "") names(data) <- x$nam if(type=="DNA") dat <- phyDat.DNA(data, ...) if(type=="AA") dat <- phyDat.AA(data, ...) if(type=="CODON") dat <- phyDat.codon(data, ...) if(type=="USER") dat <- phyDat.default(data, ...) dat } #as.alignment.phyDat <- function(x, ...) as.alignment(as.character(x)) #' @rdname phyDat #' @export phyDat2alignment <- function(x){ z <- as.character(x) nam <- rownames(z) type <- attr(x, "type") seq <- switch(type, DNA = tolower(apply(z, 1, paste, collapse="")), AA = toupper(apply(z, 1, paste, collapse=""))) names(seq) <- NULL res <- list(nb=length(seq), nam=nam, seq=seq, com=NA) class(res) <- "alignment" res } #' @rdname phyDat #' @method as.phyDat MultipleAlignment #' @export as.phyDat.MultipleAlignment <- function(x, ...){ if (requireNamespace("Biostrings")){ if(inherits(x, "DNAMultipleAlignment")) res <- phyDat.DNA(Biostrings::as.matrix(x)) if(inherits(x, "RNAMultipleAlignment")) res <- phyDat.DNA(Biostrings::as.matrix(x)) if(inherits(x, "AAMultipleAlignment")) res <- phyDat.AA(Biostrings::as.matrix(x)) return(res) } return(NULL) } # @rdname phyDat #' @export as.MultipleAlignment <- function (x, ...){ if (inherits(x, "MultipleAlignment")) return(x) UseMethod("as.MultipleAlignment") } #' @rdname phyDat #' @export as.MultipleAlignment.phyDat <- function(x, ...){ if (requireNamespace("Biostrings")){ z <- as.character(x) # nam <- rownames(z) type <- attr(x, "type") seq <- switch(type, DNA = tolower(apply(z, 1, paste, collapse="")), AA = toupper(apply(z, 1, paste, collapse=""))) if(type=="DNA") return(Biostrings::DNAMultipleAlignment(seq)) if(type=="AA") return(Biostrings::AAMultipleAlignment(seq)) } return(NULL) } #' @export phyDat2MultipleAlignment <- as.MultipleAlignment.phyDat #' @export as.phyDat.matrix <- function (x, ...) phyDat(data=x, ...) #' @export as.phyDat.character <- function (x, ...) phyDat(data=x, ...) # @rdname phyDat #' @export as.phyDat.data.frame <- function (x, ...) phyDat(data=x, ...) #' @rdname phyDat #' @export acgt2ry <- function(obj){ ac <- c("a", "c", "g", "t", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n", "?", "-") AC <- matrix(c(c(1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1), c(0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1), c(0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1), c(0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1)), 18, 4, dimnames = list(NULL, c("a", "c", "g", "t"))) ry <- AC[c(7, 10), ] RY <- AC %*% t(ry) RY[RY==2] <- 1 dimnames(RY) <- list(NULL, c("r", "y")) attr(obj, "levels") <- c("r", "y") attr(obj, "nc") <- 2 attr(obj, "type") <- "USER" attr(obj, "contrast") <- RY obj <- phyDat.default(as.character(obj, allLevels=FALSE), levels = c("r", "y"), ambiguity = NULL) obj } #' @rdname phyDat #' @export as.character.phyDat <- function (x, allLevels=TRUE, ...){ nr <- attr(x, "nr") # nc <- attr(x, "nc") type <- attr(x, "type") labels <- attr(x, "allLevels") if (!is.null(attr(x, "index"))) { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } else index <- rep(1:nr, attr(x, "weight")) if (type == "USER") { #levels in acgt2ry if(!allLevels){ tmp <- attr(x, "levels") contrast <- attr(x, "contrast") contrast[contrast>0] <- 1 ind <- which(rowSums(contrast)==1) contrast[rowSums(contrast)>1, ] <- 0 labels <- rep(NA, length(attr(x, "allLevels"))) labels[ind] <- tmp[contrast%*%c(seq_along(tmp))] } } if(type == "AA") labels <- toupper(labels) if(type == "CODON"){ nr <- length(index) result <- matrix(NA, nrow = length(x), ncol = 3L*nr) labels <- strsplit(labels, "") for (i in seq_along(x)) result[i, ] <- unlist(labels[ x[[i]][index] ]) } else { result <- matrix(NA, nrow = length(x), ncol = nr) for (i in seq_along(x)) result[i, ] <- labels[x[[i]]] result <- result[, index, drop = FALSE] } rownames(result) <- names(x) result } #' @rdname phyDat #' @export as.data.frame.phyDat <- function(x, ...){ nr <- attr(x, "nr") # nc <- attr(x, "nc") labels <- attr(x, "allLevels") if(attr(x, "type") == "AA") labels <- toupper(labels) result <- vector("list", length(x)) if (is.null(attr(x, "index"))) index <- rep(1:nr, attr(x, "weight")) else { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } for (i in seq_along(x)) result[[i]] <- labels[x[[i]][index]] attr(result, "names") <- names(x) attr(result, "row.names") <- seq_along(index) attr(result, "class") <- "data.frame" result } #' @rdname phyDat #' @export as.DNAbin.phyDat <- function (x, ...){ if(attr(x, "type")=="DNA"){ nr <- attr(x, "nr") ac <- attr(x, "allLevels") result <- matrix(as.raw(0), nrow = length(x), ncol = nr) # from ape ._cs_ cs <- c("a", "g", "c", "t", "r", "m", "w", "s", "k", "y", "v", "h", "d", "b", "n", "-", "?") # from ape ._bs_ bs <- as.raw(c(136, 72, 40, 24, 192, 160, 144, 96, 80, 48, 224, 176, 208, 112, 240, 4, 2)) ord <- match(ac, cs) ord[5] <- 4 for (i in seq_along(x)){ ind <- ord[x[[i]]] result[i,] <- bs[ind] } if (is.null(attr(x, "index"))) index <- rep(1:nr, attr(x, "weight")) else { index <- attr(x, "index") if (is.data.frame(index)) index <- index[, 1] } result <- result[, index, drop = FALSE] rownames(result) <- names(x) class(result) <- "DNAbin" return(result) } else stop("x must be a nucleotide sequence") } #' @rdname phyDat #' @export as.AAbin.phyDat <- function(x,...) { if(attr(x, "type")=="AA") return(as.AAbin(as.character(x, ...))) else stop("x must be a amino acid sequence") } #' @export print.phyDat <- function (x, ...){ cat(length(x), "sequences with",sum(attr(x,"weight")), "character and", attr(x,"nr"),"different site patterns.\n") cat("The states are",attr(x,"levels"), "\n") } ## @export summary.phyDat <- function (x, ...){ nc <- attr(x, "nc") nseq <- length(x) nchar <- sum(attr(x,"weight")) unique_sites <- attr(x, "nr") tmp <- logical(unique_sites) for(i in 2:nseq) tmp <- tmp | (x[[1]] != x[[i]]) const_sites <- sum(attr(x, "weight")[tmp==0]) list(nseq=nseq, nchar=nchar, unique_sites=unique_sites, const_sites=const_sites) } #' @export cbind.phyDat #' @export cbind.phyDat <- function(..., gaps="-", compress=TRUE){ object <- as.list(substitute(list(...)))[-1] x <- list(...) n <- length(x) if (n == 1) return(x[[1]]) types <- sapply(x, function(x)attr(x, "type")) # if(length(unique(types))>1) stop("All alignments need to have the same type!") # type <- attr(x[[1]], "type") nr <- numeric(n) ATTR <- attributes(x[[1]]) nr[1] <- sum(attr(x[[1]], "weight")) # levels <- attr(x[[1]], "levels") allLevels <- attr(x[[1]], "allLevels") gapsInd <- match(gaps, allLevels) snames <- vector("list", n) vec <- numeric(n+1) wvec <- numeric(n+1) objNames <- as.character(object) if(any(duplicated(objNames))) objNames <- paste0(objNames, 1:n) # tmp <- as.character(x[[1]]) for(i in 1:n){ snames[[i]] <- names(x[[i]]) nr[i] <- sum(attr(x[[i]], "weight")) vec[i+1] <- attr(x[[i]], "nr") wvec[i+1] <- sum(attr(x[[i]], "weight")) } vec <- cumsum(vec) wvec <- cumsum(wvec) snames <- unique(unlist(snames)) weight <- numeric(vec[n+1]) index <- numeric(wvec[n+1]) ATTR$names <- snames ATTR$nr <- vec[n+1] tmp <- matrix(gapsInd, vec[n+1], length(snames), dimnames = list(NULL, snames)) tmp <- as.data.frame(tmp) add.index <- TRUE for(i in 1:n){ nam <- names(x[[i]]) tmp[(vec[i]+1):vec[i+1], nam] <- x[[i]][nam] weight[(vec[i]+1):vec[i+1]] <- attr(x[[i]], "weight") } if(compress){ dindex <- grp_duplicated(as.matrix(tmp), MARGIN=1) attr(dindex, "nlevels") <- NULL weight <- aggregate(weight, by=list(dindex), FUN=sum)$x pos <- which(!duplicated(dindex)) tmp <- tmp[pos,] } if(any(sapply(x, function(x)is.null(attr(x, "index"))))) add.index <- FALSE if(add.index & compress){ for(i in 1:n){ tmp2 <- attr(x[[i]], "index") if(!is.null(tmp2)){ if(is.data.frame(tmp2))index[(wvec[i]+1):wvec[i+1]] <- dindex[(vec[i]+1):vec[i+1]][tmp2[,1]] else index[(wvec[i]+1):wvec[i+1]] <- dindex[(vec[i]+1):vec[i+1]][tmp2] } else add.index <- FALSE } } if(add.index) ATTR$index <- data.frame(index = index, genes=rep(objNames, nr)) ATTR$weight <- weight ATTR$nr <- length(weight) attributes(tmp) <- ATTR tmp } # @rdname phyDat #' @export c.phyDat #' @export c.phyDat <- cbind.phyDat #' @rdname phyDat #' @export baseFreq <- function(obj, freq=FALSE, all=FALSE, drop.unused.levels = FALSE){ if (!inherits(obj,"phyDat")) stop("data must be of class phyDat") labels <- attr(obj, "allLevels") weight <- attr(obj,"weight") n <- length(obj) res <- numeric(length(labels)) D <- diag(length(labels)) for(i in 1:n)res <- res + colSums(D[obj[[i]],, drop=FALSE]*weight) names(res) <- labels if(!all) res <- res[attr(obj, "levels")] if(!freq)res <- res/sum(res) if(drop.unused.levels) return(res[res>0]) res } phylo <- function(edge, tip, edge.length=NULL){ res <- list(edge=edge, tip.label=tip, edge.length=edge.length) class(res) <- "phylo" res } compress.phyDat <- function(data){ attrib <- attributes(data) attr(data, "class") <- "list" index <- grp_duplicated( matrix(unlist(data, use.names = FALSE), attrib$nr, length(data))) attrib$nr <- attr(index, "nlevels") attr(index, "nlevels") <- NULL pos <- which(!duplicated(index)) attrib$weight <- tapply(attrib$weight, index, sum) if(is.null(attrib$index)) attrib$index <-index else attrib$index <- index[attrib$index] for(i in seq_len(length(data))) data[[i]] <- data[[i]][pos] attributes(data) <- attrib attr(data, "class") <- "phyDat" data } getCols <- function (data, cols, compress=FALSE){ attrib <- attributes(data) if(inherits(attr(data, "index"), "data.frame")) compress <- FALSE attr(data, "class") <- "list" data <- data[cols] if (is.character(cols)) attrib$names <- cols else attrib$names <- attrib$names[cols] if(compress){ index <- grp_duplicated( matrix(unlist(data, use.names = FALSE), attrib$nr, length(data))) attrib$nr <- attr(index, "nlevels") attr(index, "nlevels") <- NULL pos <- which(!duplicated(index)) attrib$weight <- tapply(attrib$weight, index, sum) if(is.null(attrib$index)) attrib$index <-index else attrib$index <- index[attrib$index] for(i in seq_len(length(data))) data[[i]] <- data[[i]][pos] } attributes(data) <- attrib attr(data, "class") <- "phyDat" data } getRows <- function (data, rows, site.pattern = TRUE){ index <- attr(data, "index") if(is.data.frame(index))index <- index[,1] if(!site.pattern){ if(is.null(index)) index <- seq_len(length(data[[1]])) weight <- tabulate(index[rows]) ind <- which(weight>0) # update index new_index <- integer(length(weight)) new_index[ind] <- seq_along(ind) attr(data, "index") <- new_index[index[rows]] rows <- ind # rows[ind] weight <- weight[ind] } for (i in seq_along(data)){ if(is.matrix(data[[i]]))data[[i]] <- data[[i]][rows, ] else data[[i]] <- data[[i]][rows] } attr(data, "weight") <- attr(data, "weight")[rows] if(!site.pattern) attr(data, "weight") <- weight attr(data, "nr") <- length(attr(data, "weight")) if(site.pattern)attr(data, "index") <- NULL data } #' @rdname phyDat #' @method subset phyDat #' @export subset.phyDat <- function (x, subset, select, site.pattern = TRUE, ...){ if (!missing(subset)){ if(is.numeric(subset) & any(subset>length(x))) stop("subscript out of bounds") x <- getCols(x, subset, ...) } if (!missing(select)){ w <- attr(x, "weight") if(site.pattern) if(any(select > length(w))) stop("subscript out of bounds") else if(any(select > sum(w))) stop("subscript out of bounds") if(any(is.na(select))) return(NULL) x <- getRows(x, select, site.pattern=site.pattern) } x } #' @param i,j indices of the rows and/or columns to select or to drop. They #' may be numeric, logical, or character (in the same way than for standard R #' objects). #' @param drop for compatibility with the generic (unused). #' @rdname phyDat #' @export "[.phyDat" <- function(x, i, j, ..., drop=FALSE){ subset(x, subset = i, select = j, site.pattern=FALSE, compress=FALSE) } #' @rdname phangorn-internal #' @importFrom fastmatch fmatch #' @export map_duplicates <- function(x, dist=length(x)<500, ...){ labels <- names(x) nr <- attr(x, "nr") if(dist){ y <- as.matrix(dist.hamming(x, FALSE)) l <- nrow(y) # z <- character(l) # for(i in seq_len(l)) z[i] <- paste( round(y[i, ], 8), collapse="_") ind <- duplicated(y) } else ind <- duplicated(x) res <- NULL if(any(ind)){ ind2 <- grp_duplicated( matrix(unlist(x, recursive = FALSE, use.names = FALSE), nr, length(labels)), MARGIN=2) if(dist) ind2 <- grp_duplicated(y) ind2 <- ind2[ind] res <- data.frame(duplicates=labels[ind], where=labels[!ind][ind2], stringsAsFactors = FALSE) } res } #' @rdname phyDat #' @method unique phyDat #' @export unique.phyDat <- function(x, incomparables=FALSE, identical=TRUE, ...){ tmp <- map_duplicates(x, !identical) if (!is.null(tmp)) { x <- getCols(x, setdiff(names(x), tmp[, 1])) attr(x, "duplicated") <- list(tmp) } x } addTaxa <- function(tree, dup_list) { fun <- function(x, dup_list){ if(Ntip(x)==1L){ dup <- dup_list[[1]][,1] x <- add.tips(x, dup, rep(2, length(dup))) dup_list[[1]] <- NULL } for (i in seq_along(dup_list)) { dup <- dup_list[[i]] x <- add.tips(x, dup[, 1], dup[, 2]) } x } if(inherits(tree, "phylo")) return(fun(tree, dup_list)) if(inherits(tree, "multiPhylo")){ trees <- .uncompressTipLabel(tree) trees <- unclass(trees) trees <- lapply(trees, fun, dup_list) class(trees) <- "multiPhylo" trees <- .compressTipLabel(trees) return(trees) } NULL } #' @rdname phyDat #' @export removeUndeterminedSites <- function(x, ...){ # , use.contrast=TRUE, undetermined=c("?", "n", "-") nc <- attr(x, "nc") nr <- attr(x, "nr") contrast <- attr(x, "contrast") # if(use.contrast) ind <- which( (contrast %*% rep(1, nc)) == nc ) # else ind <- sort(match(undetermined, attr(x, "allLevels"))) tmp <- x[[1]] %in% ind for(i in 2:length(x)) tmp <- tmp & (x[[i]] %in% ind) if(any(tmp)) x <- getRows(x, (1:nr)[!tmp]) x } removeParsUninfoSites <- function(data, exact=TRUE){ nr <- attr(data, "nr") pis <- parsinfo(data, exact) if (length(pis) > 0){ p0 <- sum(attr(data, "weight")[pis[, 1]] * pis[, 2]) data <- getRows(data, c(1:nr)[-pis[, 1]], TRUE) if(is.null(attr(data, "informative"))) attr(data, "informative") <- seq_len(nr)[-pis[, 1]] else attr(data, "informative") <- attr(data, "informative")[-pis[, 1]] } else p0 <- 0 if(length(attr(data, "p0"))) p0 <- p0 + attr(data, "p0") attr(data, "p0") <- p0 data } removeParsimonyUninfomativeSites <- function(data, recursive=FALSE, exact=TRUE){ dup_list <- NULL tmp <- TRUE star_tree <- FALSE while (tmp) { nam <- names(data) data <- removeParsUninfoSites(data, exact) if(!recursive) return(data) if (attr(data, "nr") == 0) { star_tree <- TRUE break() tmp <- FALSE } # unique sequences dup <- map_duplicates(data) if (!is.null(dup)) { dup_list <- c(list(dup), dup_list) data <- subset(data, setdiff(names(data), dup[, 1])) } else break() # tmp <- FALSE } attr(data, "duplicated") <- dup_list data } #' @rdname phyDat #' @export allSitePattern <- function(n, levels=c("a", "c", "g", "t"), names=NULL){ l <- length(levels) X <- matrix(NA_integer_, n, l^n) if(is.null(names))rownames(X) <- paste0("t", 1:n) else rownames(X) <- names for(i in 1:n) X[i, ] <- rep(rep(levels, each=l^(i-1)), l^(n-i)) phyDat.default(X, levels, compress=FALSE, return.index=FALSE) } ##constSitePattern <- function(n, levels=c("a", "c", "g", "t"), names=NULL){ constSitePattern <- function(n, names=NULL, type="DNA", levels=NULL){ if(type=="DNA"){ levels <- c("a", "c", "g", "t") l <- 4L } else if(type=="AA"){ levels <- c("A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V") l <- 20L } else l <- length(levels) X <- matrix(0, l, n) X <- matrix(rep(levels, each=n), n, l) if(is.null(names)) rownames(X) <- paste0("t", seq_len(n)) else rownames(X) <- names phyDat(X, type=type, levels=levels) } #' Read Amino Acid Sequences in a File #' #' This function reads amino acid sequences in a file, and returns a matrix #' list of DNA sequences with the names of the taxa read in the file as row #' names. #' #' #' @param file a file name specified by either a variable of mode character, or #' a double-quoted string. #' @param format a character string specifying the format of the DNA sequences. #' Three choices are possible: \code{"interleaved"}, \code{"sequential"}, or #' \code{"fasta"}, or any unambiguous abbreviation of these. #' @param skip the number of lines of the input file to skip before beginning #' to read data. #' @param nlines the number of lines to be read (by default the file is read #' until its end). #' @param comment.char a single character, the remaining of the line after this #' character is ignored. #' @param seq.names the names to give to each sequence; by default the names #' read in the file are used. #' @return a matrix of amino acid sequences. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{read.dna}}, \code{\link[ape]{read.GenBank}}, #' \code{\link[phangorn]{phyDat}}, \code{\link[seqinr]{read.alignment}} #' @references % Anonymous. FASTA format description. % #' \url{https://en.wikipedia.org/wiki/FASTA_format} #' #' Felsenstein, J. (1993) Phylip (Phylogeny Inference Package) version 3.5c. #' Department of Genetics, University of Washington. #' \url{https://evolution.genetics.washington.edu/phylip/phylip.html} #' @keywords IO #' @export read.aa read.aa <- function (file, format = "interleaved", skip = 0, nlines = 0, comment.char = "#", seq.names = NULL){ getTaxaNames <- function(x) { x <- sub("^ +", "", x) x <- sub(" +$", "", x) x <- sub("^['\"]", "", x) x <- sub("['\"]$", "", x) x } format <- match.arg(format, c("interleaved", "sequential", "fasta")) phylip <- if (format %in% c("interleaved", "sequential")) TRUE else FALSE if (format == "fasta") { obj <- read.FASTA(file, type = "AA") return(obj) } X <- scan(file = file, what = character(), sep = "\n", quiet = TRUE, skip = skip, nlines = nlines, comment.char = comment.char) if (phylip) { fl <- X[1] oop <- options(warn = -1) fl.num <- as.numeric(unlist(strsplit(gsub("^ +", "", fl), " +"))) options(oop) if (all(is.na(fl.num))) stop("the first line of the file must contain the dimensions of the data") if (length(fl.num) != 2) stop("the first line of the file must contain TWO numbers") else { n <- fl.num[1] s <- fl.num[2] } X <- X[-1] obj <- vector("character", n * s) dim(obj) <- c(n, s) } if (format == "interleaved") { fl <- X[1] fl <- unlist(strsplit(fl, NULL)) bases <- grep("[-AaRrNnDdCcQqEeGgHhIiLlKkMmFfPpSsTtWwYyVvBbZzXx?]", fl) z <- diff(bases) for (i in seq_along(z)) if (all(z[i:(i + 8)] == 1)) break start.seq <- bases[i] if (is.null(seq.names)) seq.names <- getTaxaNames(substr(X[1:n], 1, start.seq - 1)) X[1:n] <- substr(X[1:n], start.seq, nchar(X[1:n])) X <- gsub(" ", "", X) nl <- length(X) for (i in 1:n) obj[i, ] <- unlist(strsplit(X[seq(i, nl, n)], NULL)) } if (format == "sequential") { fl <- X[1] taxa <- character(n) j <- 1 for (i in 1:n) { bases <- grep("[-AaRrNnDdCcQqEeGgHhIiLlKkMmFfPpSsTtWwYyVvBbZzXx?]", unlist(strsplit(X[j], NULL))) z <- diff(bases) for (k in seq_along(z)) if (all(z[k:(k + 8)] == 1)) break start.seq <- bases[k] taxa[i] <- substr(X[j], 1, start.seq - 1) sequ <- substr(X[j], start.seq, nchar(X[j])) sequ <- gsub(" ", "", sequ) j <- j + 1 while (nchar(sequ) < s) { sequ <- paste0(sequ, gsub(" ", "", X[j])) j <- j + 1 } obj[i, ] <- unlist(strsplit(sequ, NULL)) } if (is.null(seq.names)) seq.names <- getTaxaNames(taxa) } if (phylip) { rownames(obj) <- seq.names obj <- tolower(obj) } else { names(obj) <- seq.names obj <- lapply(obj, tolower) } obj } #' @rdname phyDat #' @export genlight2phyDat <- function(x, ambiguity=NA){ tmp <- as.matrix(x) lev <- na.omit(unique(as.vector(tmp))) phyDat(tmp, "USER", levels=lev, ambiguity=ambiguity) } #' @rdname phyDat #' @method image phyDat #' @export image.phyDat <- function(x, ...){ if(attr(x, "type") == "AA") image(as.AAbin(x), ...) if(attr(x, "type") == "DNA") image(as.DNAbin(x), ...) else return(NULL) } phangorn/R/Densi.R0000644000176200001440000002433114140454701013457 0ustar liggesusersgetAges <- function(x) { fun <- function(x) max(node.depth.edgelength(x)) height <- NULL if (inherits(x, "phylo")) height <- fun(x) if (inherits(x, "multiPhylo")) { if (!is.null(attr(x, "TipLabel"))) { x <- .uncompressTipLabel(x) x <- unclass(x) height <- vapply(x, fun, 0) } else { x <- unclass(x) height <- vapply(x, fun, 0) } } height } add_tiplabels <- function(xy, tip.label, direction, adj, font, srt = 0, cex = 1, col = 1, label.offset = 0) { direction <- match.arg(direction, c("rightwards", "leftwards", "upwards", "downwards")) horizontal <- direction %in% c("rightwards", "leftwards") nTips <- length(tip.label) xx <- rep(1, nrow(xy)) yy <- xy[, 2 ] if (direction == "leftwards" | direction == "downwards") xx <- xx * 0 if (!horizontal) { # tmp <- yy yy <- xx xx <- xy[, 1] } MAXSTRING <- max(strwidth(tip.label, cex = cex)) loy <- 0 if (direction == "rightwards") lox <- label.offset + MAXSTRING * 1.05 * adj if (direction == "leftwards") lox <- -label.offset - MAXSTRING * 1.05 * (1 - adj) if (!horizontal) { psr <- par("usr") MAXSTRING <- MAXSTRING * 1.09 * (psr[4] - psr[3]) / (psr[2] - psr[1]) loy <- label.offset + MAXSTRING * 1.05 * adj lox <- 0 srt <- 90 + srt if (direction == "downwards") { loy <- -loy srt <- 180 + srt } } text(xx[1:nTips] + lox, yy[1:nTips] + loy, tip.label, adj = adj, font = font, srt = srt, cex = cex, col = col) } #' Plots a densiTree. #' #' An R function to plot trees similar to those produced by DensiTree. #' #' If no consensus tree is provided \code{densiTree} computes a consensus tree, #' and if the input trees have different labels a mrp.supertree as a backbone. #' This should avoid too many unnecessary crossings of edges. #' Trees should be rooted, other wise the output may not be visually pleasing. #' \code{jitter} shifts trees a bit so that they are not exactly on top of each other. #' If \code{amount == 0}, it is ignored. If \code{random=TRUE} the result of the permutation is #' \code{runif(n, -amount, amount)}, otherwise \code{seq(-amount, amount, length=n)}, where \code{n <- length(x)}. #' @param x an object of class \code{multiPhylo}. #' @param type a character string specifying the type of phylogeny, so far #' "cladogram" (default) or "phylogram" are supported. #' @param alpha parameter for semi-transparent colors. #' @param consensus A tree or character vector which is used to define the order #' of the tip labels. #' @param direction a character string specifying the direction of the tree. #' Four values are possible: "rightwards" (the default), "leftwards", "upwards", #' and "downwards". #' @param optim not yet used. #' @param scaleX scale trees to have identical heights. #' @param col a scalar or vector giving the colours used to draw the edges for #' each plotted phylogeny. These are taken to be in the same order than input #' trees x. If fewer colours are given than the number of trees, then the #' colours are recycled. #' @param width edge width. #' @param lty line type. #' @param cex a numeric value giving the factor scaling of the tip labels. #' @param font an integer specifying the type of font for the labels: 1 (plain text), #' 2 (bold), 3 (italic, the default), or 4 (bold italic). #' @param tip.color color of the tip labels. #' @param adj a numeric specifying the justification of the text strings of the #' labels: 0 (left-justification), 0.5 (centering), or 1 (right-justification). #' @param srt a numeric giving how much the labels are rotated in degrees. #' @param underscore a logical specifying whether the underscores in tip labels #' should be written as spaces (the default) or left as are (if TRUE). #' @param label.offset a numeric giving the space between the nodes and the tips of the #' phylogeny and their corresponding labels. #' @param scale.bar a logical specifying whether add scale.bar to the plot. #' @param jitter allows to shift trees. a list with two arguments: the amount of #' jitter and random or equally spaced (see details below) #' @param \dots further arguments to be passed to plot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{plot.phylo}}, \code{\link{plot.networx}}, \code{\link{jitter}} #' @references densiTree is inspired from the great #' \href{https://www.cs.auckland.ac.nz/~remco/DensiTree/}{DensiTree} program of Remco #' Bouckaert. #' #' Remco R. Bouckaert (2010) DensiTree: making sense of sets of phylogenetic #' trees \emph{Bioinformatics}, \bold{26 (10)}, 1372-1373. #' @keywords plot #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, FUN = #' function(x) upgma(dist.hamming(x)), bs=25) #' # cladogram nice to show topological differences #' densiTree(bs, type="cladogram", col="blue") #' densiTree(bs, type="phylogram", col="green", direction="downwards", width=2) #' # plot five trees slightly shifted, no transparent color #' densiTree(bs[1:5], type="phylogram", col=1:5, width=2, jitter= #' list(amount=.3, random=FALSE), alpha=1) #' \dontrun{ #' # phylograms are nice to show different age estimates #' require(PhyloOrchard) #' data(BinindaEmondsEtAl2007) #' BinindaEmondsEtAl2007 <- .compressTipLabel(BinindaEmondsEtAl2007) #' densiTree(BinindaEmondsEtAl2007, type="phylogram", col="red") #' } #' #' @export densiTree <- function(x, type = "cladogram", alpha = 1 / length(x), consensus = NULL, direction = "rightwards", optim = FALSE, scaleX = FALSE, col = 1, width = 1, lty = 1, cex = .8, font = 3, tip.color = 1, adj = 0, srt = 0, underscore = FALSE, label.offset = 0, scale.bar = TRUE, jitter = list(amount = 0, random = TRUE), ...) { if (!inherits(x, "multiPhylo")) stop("x must be of class multiPhylo") if (is.character(consensus)) { consensus <- stree(length(consensus), tip.label = consensus) consensus$edge.length <- rep(1.0, nrow(consensus$edge)) } if (is.null(consensus)) { consensus <- tryCatch(consensus(x, p = .5), error = function(e) unroot(midpoint(superTree(x)))) } if (inherits(consensus, "multiPhylo")) consensus <- consensus[[1]] sort_tips <- function(x) { x <- reorder(x) nTip <- as.integer(length(x$tip.label)) e2 <- x$edge[, 2] x$tip.label <- x$tip.label[e2[e2 <= nTip]] x$edge[e2 <= nTip, 2] <- as.integer(1L:nTip) x } type <- match.arg(type, c("phylogram", "cladogram")) direction <- match.arg(direction, c("rightwards", "leftwards", "upwards", "downwards")) horizontal <- direction %in% c("rightwards", "leftwards") consensus <- reorder(consensus) nTip <- as.integer(length(consensus$tip.label)) consensus <- sort_tips(consensus) consensus <- reorder(consensus, "postorder") maxBT <- max(getAges(x)) if (scaleX) maxBT <- 1.0 label <- rev(pretty(c(maxBT, 0))) maxBT <- max(label) xy <- plotPhyloCoor(consensus, direction = direction, ...) yy <- xy[, 2] plot.new() tl <- which.max(nchar(consensus$tip.label)) sw <- strwidth(consensus$tip.label[tl], cex = cex) * 1.1 if (direction == "rightwards") { # plot.window(xlim = c(0, 1.0 + sw), ylim = c(0, nTip + 1)) plot.default(0, type = "n", xlim = c(0, 1.0 + sw), ylim = c(0, nTip + 1), xlab = "", ylab = "", axes = FALSE, ...) if (scale.bar) axis(side = 1, at = seq(0, 1.0, length.out = length(label)), labels = label) } if (direction == "leftwards") { # plot.window(xlim = c(0 - sw, 1.0), ylim = c(0, nTip + 1)) plot.default(0, type = "n", xlim = c(0 - sw, 1.0), ylim = c(0, nTip + 1), xlab = "", ylab = "", axes = FALSE, ...) if (scale.bar) axis(side = 1, at = seq(0, 1.0, length.out = length(label)), labels = rev(label)) } if (direction == "downwards") { # plot.window(xlim = c(0, nTip + 1), ylim = c(0 - sw, 1.0)) plot.default(0, type = "n", xlim = c(0, nTip + 1), ylim = c(0 - sw, 1.0), xlab = "", ylab = "", axes = FALSE, ...) if (scale.bar) axis(side = 2, at = seq(0, 1.0, length.out = length(label)), labels = rev(label)) } if (direction == "upwards") { # plot.window(xlim = c(0, nTip + 1), ylim = c(0, 1.0 + sw)) plot.default(0, type = "n", xlim = c(0, nTip + 1), ylim = c(0, 1.0 + sw), xlab = "", ylab = "", axes = FALSE, ...) if (scale.bar) axis(side = 2, at = seq(0, 1.0, length.out = length(label)), labels = label) } tip_labels <- consensus$tip.label if (is.expression(consensus$tip.label)) underscore <- TRUE if (!underscore) tip_labels <- gsub("_", " ", tip_labels) add_tiplabels(xy, tip_labels, direction, adj = adj, font = font, srt = srt, cex = cex, col = tip.color, label.offset = label.offset) col <- rep(col, length.out = length(x)) tiporder <- 1:nTip names(tiporder) <- consensus$tip.label if (jitter$amount > 0) { if (jitter$random) jit <- runif(length(x), -jitter$amount, jitter$amount) else jit <- seq(-jitter$amount, jitter$amount, length = length(x)) } for (treeindex in seq_along(x)) { tmp <- reorder(x[[treeindex]]) tmp <- sort_tips(tmp) # if(!compressed) tiporder <- match(tmp$tip.label, consensus$tip.label) xy <- plotPhyloCoor(tmp, tip.height = tiporder, direction = direction, ...) xx <- xy[, 1] yy <- xy[, 2] if (horizontal) { if (scaleX) xx <- xx / max(xx) else xx <- xx / maxBT if (direction == "rightwards") xx <- xx + (1.0 - max(xx)) if (jitter$amount > 0) yy <- yy + jit[treeindex] } else { if (scaleX) yy <- yy / max(yy) else yy <- yy / maxBT if (direction == "upwards") yy <- yy + (1.0 - max(yy)) if (jitter$amount > 0) xx <- xx + jit[treeindex] } e1 <- tmp$edge[, 1] if (type == "cladogram") cladogram.plot(tmp$edge, xx, yy, edge.color = adjustcolor(col[treeindex], alpha.f = alpha), edge.width = width, edge.lty = lty) if (type == "phylogram") { Ntip <- min(e1) - 1L Nnode <- tmp$Nnode phylogram.plot(tmp$edge, Ntip, Nnode, xx, yy, horizontal, edge.color = adjustcolor(col[treeindex], alpha.f = alpha), edge.width = width, edge.lty = lty) } } } phangorn/R/clanistic.R0000644000176200001440000004500613707232051014370 0ustar liggesusers#' Clans, slices and clips #' #' Functions for clanistics to compute clans, slices, clips for unrooted trees #' and functions to quantify the fragmentation of trees. #' #' Every split in an unrooted tree defines two complementary clans. Thus for an #' unrooted binary tree with \eqn{n} leaves there are \eqn{2n - 3} edges, and #' therefore \eqn{4n - 6} clans (including \eqn{n} trivial clans containing #' only one leave). #' #' Slices are defined by a pair of splits or tripartitions, which are not #' clans. The number of distinguishable slices for a binary tree with \eqn{n} #' tips is \eqn{2n^2 - 10n + 12}. #' #' %A clip is a different type of partition as it is defined by evolutionary or #' cophenetic distance and not by the topology. Namely clips are groups of #' leaves for which the maximum pairwise distance is smaller than threshold. #' %For a better separation we additionally demand that the maximum pairwise #' distance within a clip is lower than the distance between any member of the #' clip and any other tip. #' #' A clip is a different type of partition, defining groups of leaves that are #' related in terms of evolutionary distances and not only topology. Namely, #' clips are groups of leaves for which all pairwise path-length distances are #' smaller than a given threshold value (Lapointe et al. 2010). There exists #' different numbers of clips for different thresholds, the largest (and #' trivial) one being the whole tree. There is always a clip containing only #' the two leaves with the smallest pairwise distance. #' #' Clans, slices and clips can be used to characterize how well a vector of #' categorial characters (natives/intruders) fit on a tree. We will follow the #' definitions of Lapointe et al.(2010). A complete clan is a clan that #' contains all leaves of a given state/color, but can also contain leaves of #' another state/color. A clan is homogeneous if it only contains leaves of one #' state/color. #' #' \code{getDiversity} computes either the \cr Shannon Diversity: \eqn{H = #' -\sum_{i=1}^{k}(N_i/N) log(N_i/N), N=\sum_{i=1}^{k} N_i}{H = -sum(N_i/N) * #' log(N_i/N), N=sum(N_i)} \cr or the \cr Equitability Index: \eqn{E = H / #' log(N)} \cr where \eqn{N_i} are the sizes of the \eqn{k} largest homogeneous #' clans of intruders. If the categories of the data can be separated by an #' edge of the tree then the E-value will be zero, and maximum equitability #' (E=1) is reached if all intruders are in separate clans. getDiversity #' computes these Intruder indices for the whole tree, complete clans and #' complete slices. Additionally the parsimony scores (p-scores) are reported. #' The p-score indicates if the leaves contain only one color (p-score=0), if #' the the leaves can be separated by a single split (perfect clan, p-score=1) #' or by a pair of splits (perfect slice, p-score=2). #' #' So far only 2 states are supported (native, intruder), however it is also #' possible to recode several states into the native or intruder state using #' contrasts, for details see section 2 in vignette("phangorn-specials"). #' Furthermore unknown character states are coded as ambiguous character, which #' can act either as native or intruder minimizing the number of clans or #' changes (in parsimony analysis) needed to describe a tree for given data. #' #' Set attribute labels to "old" for analysis as in Schliep et al. (2010) or to #' "new" for names which are more intuitive. #' #' \code{diversity} returns a data.frame with the parsimony score for each tree #' and each levels of the variables in \code{X}. \code{X} has to be a #' \code{data.frame} where each column is a factor and the rownames of \code{X} #' correspond to the tips of the trees. #' #' %TODO See also vignette("Clanistic"). #' #' @param tree An object of class phylo or multiPhylo (getDiversity). #' @param all A logical, return all or just the largest clip. #' @param x An object of class phyDat. #' @param norm A logical, return Equitability Index (default) or Shannon #' Diversity. #' @param var.names A vector of variable names. #' @param labels see details. #' @param X a data.frame #' @param object an object for which a summary is desired. #' @param ... Further arguments passed to or from other methods. #' @return getClans, getSlices and getClips return a matrix of partitions, a #' matrix of ones and zeros where rows correspond to a clan, slice or clip and #' columns to tips. A one indicates that a tip belongs to a certain partition. #' \cr getDiversity returns a list with tree object, the first is a data.frame #' of the equitability index or Shannon divergence and parsimony scores #' (p-score) for all trees and variables. The data.frame has two attributes, #' the first is a splits object to identify the taxa of each tree and the #' second is a splits object containing all partitions that perfectly fit. #' @author Klaus Schliep \email{klaus.schliep@@snv.jussieu.fr} #' #' Francois-Joseph Lapointe \email{francois-joseph.lapointe@@umontreal.ca} #' @seealso \code{\link{parsimony}}, Consistency index \code{\link{CI}}, #' Retention index \code{\link{RI}}, \code{\link{phyDat}} #' @references Lapointe, F.-J., Lopez, P., Boucher, Y., Koenig, J., Bapteste, #' E. (2010) Clanistics: a multi-level perspective for harvesting unrooted gene #' trees. \emph{Trends in Microbiology} 18: 341-347 #' #' Wilkinson, M., McInerney, J.O., Hirt, R.P., Foster, P.G., Embley, T.M. #' (2007) Of clades and clans: terms for phylogenetic relationships in unrooted #' trees. \emph{Trends in Ecology and Evolution} 22: 114-115 #' #' Schliep, K., Lopez, P., Lapointe F.-J., Bapteste E. (2011) Harvesting #' Evolutionary Signals in a Forest of Prokaryotic Gene Trees, \emph{Molecular #' Biology and Evolution} 28(4): 1393-1405 #' @keywords cluster #' @examples #' #' set.seed(111) #' tree <- rtree(10) #' getClans(tree) #' getClips(tree, all=TRUE) #' getSlices(tree) #' #' set.seed(123) #' trees <- rmtree(10, 20) #' X <- matrix(sample(c("red", "blue", "violet"), 100, TRUE, c(.5,.4, .1)), #' ncol=5, dimnames=list(paste('t',1:20, sep=""), paste('Var',1:5, sep="_"))) #' x <- phyDat(X, type = "USER", levels = c("red", "blue"), ambiguity="violet") #' plot(trees[[1]], "u", tip.color = X[trees[[1]]$tip,1]) # intruders are blue #' #' (divTab <- getDiversity(trees, x, var.names=colnames(X))) #' summary(divTab) #' #' @rdname getClans #' @export getClans <- function (tree) { if (is.rooted(tree)) tree <- unroot(tree) bp <- bip(tree) nTips <- length(tree$tip.label) root <- nTips + 1 bp[root] <- NULL X <- matrix(0, length(bp) - nTips, nTips) k <- 1 nl <- NULL if (!is.null(tree$node.label)) { nl <- c(rep("-1", nTips), rep("-1", nTips), tree$node.label[-1], tree$node.label[-1]) } if(root<=length(bp)){ for (i in root:length(bp)) { X[k, bp[[i]]] <- 1 k <- k + 1 } } res <- rbind(diag(nTips), 1 - diag(nTips), X, 1 - X) colnames(res) <- tree$tip.label if (!is.null(nl)) rownames(res) <- nl res } #' @rdname getClans #' @export getSlices <- function(tree){ nTips <- length(tree$tip.label) clans <- getClans(tree) m <- dim(clans)[1] X <- tcrossprod(clans) z <- rowSums(clans) Z1 <- matrix(z,m,m) Z2 <- t(Z1) Z <- matrix(0,m,m) Z[Z1<=Z2] <- Z1[Z1<=Z2] Z[Z20,arr.ind=TRUE) l <- dim(index)[1] nSlices <- 2 * nTips^2 -10 * nTips + 12 result <- matrix(0, nSlices, nTips) strClan <- do.call("paste", c(as.data.frame(clans), sep = "")) k <- 1 for(i in 1:l){ tmp1 <- as.numeric((clans[index[i,1],] + clans[index[i,2],])==2) tmp <- paste(tmp1,sep="",collapse="") if(is.na(match(tmp,strClan))){ result[k,] <- tmp1 k <- k+1 } } if(kmin(ind) ) break() within <- max(dm[ind, ind]) between <- min(dm[ind, -ind]) if (within < between) { res <- numeric(nTips) res[ind] <- 1L result <- rbind(result, res) } } } dimnames(result) <- list(NULL, tips) if (all) return(result) ind <- which.max(rowSums(result)) result[ind, ] } shannon <- function (x, norm=TRUE) { p <- x/sum(x) ShD <- -sum(p * log10(p)) if(norm){ if (sum(x) == 1) return(0) ShD <- ShD/log10(sum(x)) } ShD } shannon2 <- function (x, norm=TRUE) { p <- x/sum(x) ShD <- -sum(p * log(p)) if(norm){ if (sum(x) == 1) return(0) ShD <- ShD/log(sum(x)) } ShD } getE <- function (tree, x, clans = NULL, norm = TRUE) { if (is.rooted(tree)) tree <- unroot(tree) if (is.null(clans)) clans <- getClans(tree) labels <- tree$tip.label x <- x[labels] result <- rep(NA, 12) names(result) <- c("E* tree", "# natives", "# intruder", "# unknown", "E* clan", "# intruder", "# unknown", "E* slice", "# intruder", "# unknown", "bs 1", "bs 2") result[2] <- sum(x == 1) result[3] <- sum(x == 2) result[4] <- sum(x == 3) if (result[2] == 0 || result[3] == 0) { if (result[2] > 1) return(list(result, labels)) else return(list(result, integer(0))) } LHG <- E_Intruder(clans, x) d <- dim(LHG)[1] if (d == 1) { result[1] <- 0 if (!is.null(tree$node.label)) result[11] <- as.numeric(rownames(LHG)) return(list(result, labels[LHG == 0])) } intr <- drop(LHG %*% as.numeric(x == 2)) result[1] <- shannon2(intr, norm = norm) o <- order(intr, decreasing = TRUE) if (!is.null(tree$node.label)) result[11:12] <- as.numeric(rownames(LHG)[o[c(1, 2)]]) ind <- which(LHG[o[1], ] == 1) result[6] <- sum(x[-ind] == 2) result[7] <- sum(x[-ind] == 3) if (length(x[-ind]) < 4) return(list(result, NULL)) result[5] <- shannon2(intr[-o[1]], norm = norm) ind2 <- c(which(LHG[o[1], ] == 1), which(LHG[o[2], ] == 1)) spl <- structure(list(which(colSums(LHG)==0)), labels=labels, weights=1) class(spl) <- "splits" if (d == 2) { return(list(result, spl)) } result[9] <- sum(x[-ind2] == 2) result[10] <- sum(x[-ind2] == 3) if (length(x[-ind2]) < 4){ return(list(result, spl)) } result[8] <- shannon2(intr[-c(o[1], o[2])], norm = norm) return(list(result, spl)) } E_Intruder <- function (clans, x) { cp <- drop(clans %*% as.numeric(x == 1)) ci <- drop(clans %*% as.numeric(x == 2)) homo <- which(cp == 0 & ci > 0) l <- length(homo) if (l > 0) { HG <- clans[homo, , drop = FALSE] lhg <- rep(TRUE, l) rsh <- rowSums(HG) Z <- tcrossprod(HG)>0 Z <- Z * rsh zmax <- apply(Z,2,max) lhg <- !(zmax > rsh) LHG <- HG[lhg, , drop = FALSE] return(LHG) } return(NULL) } E_Intruder_2 <- function (clans, x, native=NULL) { contr <- attr(x, "contr") d <- dim(contr) if(d[1]>d[2]) contr[(d[2]+1):d[1],] <- 0 cp <- clans %*% contr[as.numeric(x),] homo <- which(rowSums(cp > 0) == 1) l <- length(homo) if (l > 0) { HG <- clans[homo, , drop = FALSE] lhg <- rep(TRUE, l) rsh <- rowSums(HG) Z <- tcrossprod(HG)>0 Z <- Z * rsh zmax <- apply(Z,2,max) lhg <- !(zmax > rsh) LHG <- HG[lhg, , drop = FALSE] return(LHG) } return(NULL) } getDiv <- function(tree, x, native=NULL){ clans <- getClans(tree) labels <- tree$tip.label x <- subset(x, labels) LHG <- E_Intruder_2(clans, subset(x,,1)) if(!is.null(native)){ ll <- match(native, attr(x, "allLevels")) ind <- (as.numeric(x) %in% ll) } if(!is.null(native)){ rs <- rowSums(clans) intr <- clans %*% ind clans <- clans[intr==0,] d <- which.max(rs[intr==0]) tree2 <- drop.tip(tree, tip=labels[which(clans[d, ]==1)]) } else tree2 <- NULL list(c(shannon(rowSums(LHG)), summary(factor(attr(x, "allLevels"))[as.numeric(subset(x,,1))]), parsimony(tree, x)), tree2 ) } #' @rdname getClans #' @export getDiversity <- function (tree, x, norm = TRUE, var.names = NULL, labels="new") { k <- 1 if(inherits(tree,"multiPhylo")) k <- length(tree) l <- attr(x, "nr") tmp <- matrix(0, k * l, 12) tnam <- 1 if (inherits(tree,"multiPhylo")) { tnam <- names(tree) if (is.null(tnam)) tnam <- seq_along(tree) } if(is.null(var.names)) var.names <- 1:l PM <- data.frame("t1", "a", stringsAsFactors = FALSE) colnames(PM) <- c("Tree", "Var") PM <- PM[FALSE,] PM[1 :(k*l), ] <- NA # perfect <- names(x) L <- vector("list",k*l) m <- 1 # o <- 1 # ok <- 0 for (i in 1:k) { if (inherits(tree,"multiPhylo")) tmptree <- tree[[i]] else tmptree <- tree if (is.rooted(tmptree)) tmptree <- unroot(tmptree) clans <- getClans(tmptree) for (j in 1:l) { TMP <- getE(tmptree, getRows(x, j), clans, norm = norm) tmp[m, ] <- TMP[[1]] L[[m]] <- TMP[[2]] # if class =splits else NULL PM[m, 1] <- tnam[i] PM[m, 2] <- var.names[j] m <- m + 1 } } tnam <- rep(tnam, each = l) dnam <- var.names dnam <- rep(dnam, k) pscore <- as.numeric(sankoff(tree, x, site = "site")) res <- data.frame(tnam, dnam, tmp, pscore) if(labels=="old")names(res) <- c("tree", "variable", "E tree", "# natives", "# intruder", "# unknown", "E clan", "# intruder", "# unknown", "E slice", "# intruder", "# unknown", "bs 1", "bs 2", "p-score") else{ names(res) <- c("tree", "variable", "E clan", "# natives", "# intruder", "# unknown", "E slice", "# intruder", "# unknown", "E melange", "# intruder", "# unknown", "bs 1", "bs 2", "p-score") warning("The variable names have changed") } attr(res, "Perfect") <- L class(res) <- c("clanistics", "data.frame") res } #' @rdname getClans #' @export summary.clanistics <- function(object, ...){ res <- matrix(FALSE, nrow(object), 5) res[,1] <- object[,4]>0 & object[,"p-score"]==0 # "natives" res[,2] <- object[,5]>0 & object[,"p-score"]==0 # "intruder" res[,3] <- object[,"p-score"]==1 res[,4] <- ( (object[,"p-score"]==2) & (object[,7]==0) & (!is.na(object[,7])) ) | ( (object[,"p-score"]==2) & (object[,4]==2) & (is.na(object[,7])) ) res[,5] <- object[,"p-score"]>=2 & (object[,7]>0) & (!is.na(object[,7])) res[] <- as.numeric(res) tmp <- data.frame(factor(object[,"variable"]), res) colnames(tmp) <- c("Variable", "Natives_only", "Intruder_only", "Clan", "Slice", "Melange") # colnames(res) = c("Natives only", "Intruder only", "Clan", "Melange") class(tmp) <- c("summary.clanistics", "data.frame") tmp } #' @export print.summary.clanistics <- function(x, ...){ print(aggregate(x[,-1], list(Variable=x[,1]), sum), ...) } compareSplits <- function(res, nam1, nam2){ wide <- reshape(res[, c("tree", "E tree", "variable")], v.names="E tree", idvar="tree", timevar="variable", direction="wide") wideI <- reshape(res[, c("tree", "# natives", "variable")], v.names="# natives", idvar="tree", timevar="variable", direction="wide") for(i in 2:dim(wide)[2]) colnames(wide)[i] <- strsplit(colnames(wide)[i],"E tree.")[[1]][2] for(i in 2:dim(wide)[2]) colnames(wideI)[i] <- strsplit(colnames(wideI)[i],"# natives.")[[1]][2] ntrees <- wide[,1] splits <- attr(res, "Perfect") dat <- attr(attr(res, "Perfect"), "data") res <- matrix(NA, length(ntrees), length(nam1)*length(nam2)) for(m in 1:ntrees){ k <- 1 trnam <- ntrees[m] for(i in nam1){ E1 <- wide[m, i] for(j in nam2){ E2 <- wide[m, j] if(!is.na(E1) & !is.na(E2)){ if(E1 == E2){ # if(E1 == 0 & E2 == 0){ if( (wideI[m, i] >0) & (wideI[m, j]) >0){ ind1 <- which(dat[,1]==trnam & dat[,2]==i) sp1 <- splits[[ind1]] ind2 <- which(dat[,1]==trnam & dat[,2]==j) sp2 <- splits[[ind2]] if(length(ind1)>0 & length(ind2)>0 ) res[m, k] <- drop(compatible3(sp1, sp2)) } } } k <- k+1 } } } res } #' @rdname getClans #' @export diversity <- function(tree, X){ # from kknn contr.dummy <- function (n, contrasts = TRUE) { if (length(n) <= 1) { if (is.numeric(n) && length(n) == 1 && n > 1) levels <- 1:n else stop("contrasts are not defined for 0 degrees of freedom") } else levels <- n lenglev <- length(levels) cont <- array(0, c(lenglev, lenglev), list(levels, levels)) cont[col(cont) == row(cont)] <- 1 cont } l <- dim(X)[2] m <- ifelse(inherits(tree,"multiPhylo"), length(tree), 1) contr <- as.list(rep("contr.dummy", l)) names(contr) <- names(X) tmp <- model.matrix(~.-1, X, contrast=contr) tmp1 <- phyDat.default(tmp, levels=c(1,0), compress = FALSE) attr(tmp1, "varnames") <- colnames(tmp) fd <- sankoff(tree,tmp1,site = "site") fd <- matrix(fd, ncol=m) if(m>1){ if(is.null(names(tree))) tnames <- paste("tree", 1:m, sep=".") else tnames <- names(tree) } else tnames <- "tree" dimnames(fd) <- list(colnames(tmp), tnames) res <- stack(data.frame(fd)) if(m>1)nt <- rep(sapply(tree, function(x)length(x$tip.label)), each=dim(fd)[1]) else nt <- rep(length(tree$tip.label), each=dim(fd)[1]) if(m>1)res2 <- as.vector(sapply(tree, function(x,y) colSums(y[x$tip.label,,drop=FALSE]) , y=tmp)) else res2 <- colSums(tmp[tree$tip.label,,drop=FALSE]) result <- data.frame(tree = res[,2], variable=rep(colnames(tmp),m), pscore=res[,1], ntips=nt, natives=res2) result } phangorn/R/simSeq.R0000644000176200001440000001665614017245572013700 0ustar liggesusers#' Simulate sequences. #' #' Simulate sequences from a given evolutionary tree. #' #' \code{simSeq} is a generic function to simulate sequence alignments #' along a phylogeny. It is quite flexible and can generate DNA, RNA, #' amino acids, codon, morphological or binary sequences. #' simSeq can take as input a phylogenetic tree of class \code{phylo}, #' or a \code{pml} object; it will return an object of class \code{phyDat}. #' There is also a more low level #' version, which lacks rate variation, but one can combine different #' alignments with their own rates (see example). The rate parameter acts like #' a scaler for the edge lengths. #' #' For codon models \code{type="CODON"}, two additional arguments \code{dnds} #' for the dN/dS ratio and \code{tstv} for the transition transversion ratio #' can be supplied. #' #' \strong{Defaults:} #' #' If \code{x} is a tree of class \code{phylo}, then sequences will be generated #' with the default Jukes-Cantor DNA model (\code{"JC"}). #' #' If \code{bf} is not specified, then all states will be treated as equally #' probable. #' #' If \code{Q} is not specified, then a uniform rate matrix will be employed. #' #' #' @param x a phylogenetic tree \code{tree}, i.e. an object of class #' \code{phylo} or and object of class \code{pml}. #' @param l The length of the sequence to simulate. #' @param Q The rate matrix. #' @param bf Base frequencies. #' @param rootseq A vector of length \code{l} containing the root sequence. #' If not provided, the root sequence is randomly generated. #' @param type Type of sequences ("DNA", "AA", "CODON" or "USER"). #' @param model Amino acid model of evolution to employ, for example "WAG", #' "JTT", "Dayhoff" or "LG". For a full list of supported models, type #' \code{phangorn:::.aamodels}. Ignored if type is not equal to "AA". #' @param levels A character vector of the different character tokens. #' Ignored unless type = "USER". #' @param rate A numerical value greater than zero giving the mutation rate #' or scaler for edge lengths. #' @param ancestral Logical specifying whether to return ancestral sequences. #' @param code The ncbi genetic code number for translation (see details). By #' default the standard genetic code is used. #' @param \dots Further arguments passed to or from other methods. #' @return \code{simSeq} returns an object of class phyDat. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{phyDat}}, \code{\link{pml}}, \code{\link{SOWH.test}} #' @keywords cluster #' @examples #' #' \dontrun{ #' data(Laurasiatherian) #' tree <- nj(dist.ml(Laurasiatherian)) #' fit <- pml(tree, Laurasiatherian, k=4) #' fit <- optim.pml(fit, optNni=TRUE, model="GTR", optGamma=TRUE) #' data <- simSeq(fit) #' } #' #' #' tree <- rtree(5) #' plot(tree) #' nodelabels() #' #' # Example for simple DNA alignment #' data <- simSeq(tree, l = 10, type="DNA", bf=c(.1,.2,.3,.4), Q=1:6, #' ancestral=TRUE) #' as.character(data) #' #' #' # Example to simulate discrete Gamma rate variation #' rates <- discrete.gamma(1,4) #' data1 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[1]) #' data2 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[2]) #' data3 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[3]) #' data4 <- simSeq(tree, l = 100, type="AA", model="WAG", rate=rates[4]) #' data <- c(data1,data2, data3, data4) #' #' write.phyDat(data, file="temp.dat", format="sequential", nbcol = -1, #' colsep = "") #' unlink("temp.dat") #' #' @rdname simSeq #' @export simSeq simSeq <- function(x, ...) UseMethod("simSeq") #' @rdname simSeq #' @method simSeq phylo #' @export simSeq.phylo <- function(x, l = 1000, Q = NULL, bf = NULL, rootseq = NULL, type = "DNA", model = NULL, levels = NULL, rate = 1, ancestral = FALSE, code=1, ...) { if (!is.null(model)) { model <- match.arg(model, .aamodels) getModelAA(model, bf = is.null(bf), Q = is.null(Q)) type <- "AA" } extras <- match.call(expand.dots = FALSE)$... if (!is.null(extras)) { tmp <- c("dnds", "tstv") names(extras) <- tmp[pmatch(names(extras), tmp)] existing <- match(tmp, names(extras)) } pt <- match.arg(type, c("DNA", "AA", "USER", "CODON")) if (pt == "DNA"){ levels <- c("a", "c", "g", "t") if (!is.null(extras) ) { if (!is.na(existing[2]) & is.null(Q)) tstv <- eval(extras[[existing[2]]], parent.frame()) Q <- c(1, tstv, 1, 1, tstv, 1) } } if (pt == "AA") levels <- c("A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V") # c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", # "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") if (pt == "CODON") { .syn <- synonymous_subs(code=code) .sub <- tstv_subs(code=code) tmp <- .CODON[, as.character(code)] levels <- rownames(.CODON)[tmp != "*"] dnds <- tstv <- 1 if (!is.null(extras)) { if (!is.na(existing[1])) dnds <- eval(extras[[existing[1]]], parent.frame()) if (!is.na(existing[2])) tstv <- eval(extras[[existing[2]]], parent.frame()) } } if (pt == "USER") if (is.null(levels)) stop("levels have to be supplied if type is USER") lbf <- length(levels) if (is.null(bf)) bf <- rep(1 / lbf, lbf) if (is.null(Q)) { if (type == "CODON") Q <- CodonQ(subs = .sub, syn = .syn, tstv = tstv, dnds = dnds) else Q <- rep(1, lbf * (lbf - 1) / 2) } if (is.matrix(Q)) Q <- Q[lower.tri(Q)] eig <- edQt(Q, bf) m <- length(levels) if (is.null(rootseq)) rootseq <- sample(levels, l, replace = TRUE, prob = bf) x <- reorder(x) edge <- x$edge nNodes <- max(edge) res <- matrix(NA, nNodes, l) parent <- as.integer(edge[, 1]) child <- as.integer(edge[, 2]) root <- as.integer(parent[!match(parent, child, 0)][1]) res[root, ] <- rootseq tl <- x$edge.length for (i in seq_along(tl)) { from <- parent[i] to <- child[i] P <- getP(tl[i], eig, rate)[[1]] # avoid numerical problems for larger P and small t if (any(P < 0)) P[P < 0] <- 0 for (j in 1:m) { ind <- res[from, ] == levels[j] res[to, ind] <- sample(levels, sum(ind), replace = TRUE, prob = P[, j]) } } k <- length(x$tip.label) label <- c(x$tip.label, as.character( (k + 1):nNodes)) rownames(res) <- label if (!ancestral) res <- res[x$tip.label, , drop = FALSE] if (pt == "DNA") return(phyDat.DNA(res, return.index = TRUE)) if (pt == "AA") return(phyDat.AA(res, return.index = TRUE)) if (pt == "USER") return(phyDat.default(res, levels = levels, return.index = TRUE)) if (pt == "CODON") { res <- t(apply(res, 1, function(x) unlist(strsplit(x, "")))) return(phyDat.codon(res)) } } #' @rdname simSeq #' @method simSeq pml #' @export simSeq.pml <- function(x, ancestral = FALSE, ...) { g <- x$g w <- x$w if (x$inv > 0) { w <- c(x$inv, w) g <- c(0.0, g) } n <- length(w) res <- vector("list", n) y <- sample(n, sum(x$weight), replace = TRUE, prob = w) levels <- attr(x$data, "levels") type <- attr(x$data, "type") for (i in 1:n) { l <- sum(y == i) res[[i]] <- simSeq(x$tree, l, Q = x$Q, bf = x$bf, type = type, levels = levels, rate = g[i], ancestral = ancestral) } x <- call("c.phyDat", quote(res[[1]])) if (n > 1) x <- parse(text = paste("c(", "res[[1]]", paste0(",res[[", 2:n, "]]", collapse = ""), ")")) eval(x) } phangorn/R/fitch64.R0000644000176200001440000002213014151455474013671 0ustar liggesusersinit_fitch <- function(obj, parsinfo=FALSE, order=FALSE, m=4L, ...){ if(parsinfo) obj <- removeParsimonyUninfomativeSites(obj, ...) if(is.null(attr(obj, "p0"))) attr(obj, "p0") <- 0 attr(obj, "nSeq") <- length(obj) # add lengths if(is.null(attr(obj, "weight"))){ attr(obj, "weight") <- rep(1, length(obj[[1]])) order <- FALSE } if(sum( abs (attr(obj, "weight") %% 1L) ) >1) order <- FALSE if(order){ ord <- order(attr(obj, "weight"), decreasing = TRUE) obj <- subset(obj, select = ord) # inside C (1 less copy) } weight <- attr(obj, "weight") l <- length(weight) # can be NA first_1 <- match(1L, weight) if(is.na(first_1)) first_1 <- l if(first_1 == 1L) first_1 <- 0L if(!all(weight[first_1:l]==1)) first_1 <- l d_con <- dim(attr(obj, "contrast")) contrast <- matrix(0L, d_con[1], d_con[2]) contrast[attr(obj, "contrast") > 1e-8] <- 1L contrast <- rbind(0L, contrast) storage.mode(contrast) <- "integer" attr(obj, "contrast") <- contrast f <- new(Fitch, obj, as.integer(first_1), as.integer(m)) f } #' @rdname parsimony #' @export fitch <- function(tree, data, site = "pscore"){ if(any(!is.binary(tree))) tree <- multi2di(tree) tree <- reorder(tree, "postorder") nr <- attr(data, "nr") fun <- function(tree, site="pscore", nr){ if(site=="pscore") return(f$pscore(tree$edge)) sites <- f$sitewise_pscore(tree$edge) sites[seq_len(nr)] } fun2 <- function(tree, data, site, nr) { data <- subset(data, tree$tip.label) f <- init_fitch(data, FALSE, FALSE, m=2L) if(site=="pscore") return(f$pscore(tree$edge)) sites <- f$sitewise_pscore(tree$edge) sites[seq_len(nr)] } if (inherits(tree, "multiPhylo")) { TL <- attr(tree, "TipLabel") if (!is.null(TL)) { data <- subset(data, TL) f <- init_fitch(data, FALSE, FALSE, m=2L) tree <- unclass(tree) res <- sapply(tree, function(x)fun(x, site=site, nr=nr)) } else{ res <- sapply(tree, fun2, data, site, nr) } return(res) } if(inherits(tree, "phylo")) { data <- subset(data, tree$tip.label) f <- init_fitch(data, FALSE, FALSE, m=2L) return(fun(tree, site, nr)) } NULL } #' @rdname parsimony #' @export random.addition <- function (data, tree=NULL, method = "fitch") { label <- names(data) nTips <- as.integer(length(label)) if (nTips < 4L) return(stree(nTips, tip.label = sample(label))) if(!is.null(tree)){ if(!is.binary(tree)) tree <- multi2di(tree) if(!is.null(tree$edge.length)) tree$edge.length <- NULL tree <- reorder(tree, "postorder") tips <- Ntip(tree) edge <- tree$edge edge[edge>tips] <- edge[edge>tips] + as.integer(nTips - tips) tree$edge <- edge remaining <- sample(setdiff(label, tree$tip.label)) tree$tip.label <- c(tree$tip.label, remaining) tree <- checkLabels(tree, label) remaining <- match(remaining, label) } else{ remaining <- as.integer(sample(nTips)) tree <- structure(list(edge = structure(c(rep(nTips + 1L, 3), remaining[1:3]), .Dim = c(3L, 2L)), tip.label = label, Nnode = 1L), .Names = c("edge", "tip.label", "Nnode"), class = "phylo", order = "postorder") remaining <- remaining[-c(1:3)] } f <- init_fitch(data, parsinfo = TRUE, order = TRUE, m=4L) for (i in remaining) { edge <- tree$edge f$traversetwice(edge, 0L) f$root_all_node(edge) score <- f$pscore_vec(edge[,2] + 2 * nTips, i) nt <- which.min(score) tree <- addOne(tree, i, nt) } attr(tree, "pscore") <- f$pscore(tree$edge) tree } fitch_spr <- function (tree, f, trace=0L) { nTips <- as.integer(length(tree$tip.label)) m <- max(tree$edge) # f <- init_fitch(data, FALSE, FALSE, m=4L) for (i in 1:nTips) { # remove tip treetmp <- dropTip(tree, i) edge <- treetmp$edge f$prep_spr(edge) score <- f$pscore_vec(edge[,2] + 2 * nTips, i) nt <- which.min(score) # check if different tree <- addOne(treetmp, i, nt) } root <- getRoot(tree) ch <- allChildren(tree) for (i in (nTips + 1L):m) { if (i != root) { tmp <- dropNode(tree, i, all.ch = ch) if (!is.null(tmp)) { f$prep_spr(tmp[[1]]$edge) score <- f$pscore_vec(tmp[[1]]$edge[,2] + 2 * nTips, i) nt <- which.min(score) if(!(tmp[[1]]$edge[nt, 2L] %in% tmp[[4]])){ tree <- addOneTree(tmp[[1]], tmp[[2]], nt, tmp[[3]]) ch <- allChildren(tree) if(trace) print(f$pscore(tree$edge)) } } } } attr(tree, "pscore") <- f$pscore(tree$edge) tree } indexNNI_fitch <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- child nTips <- length(tree$tip.label) ind <- ind[ind > nTips] edgeMatrix <- matrix(0L, length(ind), 6L) pvector <- integer(max(parent)) pvector[child] <- parent cvector <- Children(tree) # allChildren # a d # \ / # e-----f d is closest to root, f is root from subtree a,b,c # / \ # b c c(a,b,c,d,e,f) k <- 1 for (i in ind) { f <- pvector[i] ab <- cvector[[i]] ind1 <- cvector[[f]] cd <- ind1[ind1 != i] if (pvector[f]){ cd <- c(cd, f + 2L * nTips) ef <- c(i, f) } else ef <- c(i, cd[2]) edgeMatrix[k, ] <- c(ab, cd, ef) k <- k + 1 } #cbind(edgeMatrix[c(1, 3, 2, 4), ], edgeMatrix[c(2, 3, 1, 4), ]) edgeMatrix } nni2 <- function(x){ INDEX <- indexNNI_fitch(x)[, 1:4] INDEX <- rbind(INDEX[, c(1, 3, 2, 4)], INDEX[, c(2, 3, 1, 4)]) l <- nrow(INDEX) res <- vector("list", l) # for(i in seq_len(l)) res[[i]] <- changeEdge(x, INDEX[c(2, 3), i]) for(i in seq_len(l)) res[[i]] <- changeEdge(x, INDEX[i, c(2, 3)]) class(res) <- "multiPhylo" res } fitch_nni <- function(tree, f) { p0 <- f$pscore(tree$edge) nTips <- as.integer(length(tree$tip.label)) INDEX <- indexNNI_fitch(tree) l <- nrow(INDEX) f$traversetwice(tree$edge, 1L) M <- f$pscore_nni(INDEX[, 1L:4L, drop=FALSE]) M <- M[, -1L] - M[, 1L] M <- as.vector(M) INDEX <- rbind(INDEX[, c(1, 3, 2, 4, 5, 6)], INDEX[, c(2, 3, 1, 4, 5, 6)]) swap <- 0 candidates <- which(M < 0) while (length(candidates)>0) { pscore <- M[candidates] ind <- which.min(pscore) tree2 <- changeEdge(tree, INDEX[candidates[ind], c(2, 3)]) test <- f$pscore(tree2$edge) if (test >= p0) candidates <- candidates[-ind] if (test < p0) { p0 <- test swap <- swap + 1 tree <- tree2 indi <- which(INDEX[, 5] %in% INDEX[candidates[ind],]) candidates <- setdiff(candidates, indi) } } p0 <- f$pscore(tree$edge) list(tree = tree, pscore = p0, swap = swap) } optim.fitch <- function(tree, data, trace = 1, rearrangements = "NNI", ...) { if (!inherits(tree, "phylo")) stop("tree must be of class phylo") if (!is.binary(tree)) { tree <- multi2di(tree) attr(tree, "order") <- NULL } if (is.rooted(tree)) { tree <- unroot(tree) attr(tree, "order") <- NULL } if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") if (class(data)[1] != "phyDat") stop("data must be of class phyDat") rt <- FALSE # New data <- removeParsimonyUninfomativeSites(data, recursive=TRUE) star_tree <- ifelse(attr(data, "nr") == 0, TRUE, FALSE) add_taxa <- ifelse(is.null(attr(data, "duplicated")), FALSE, TRUE) nTips <- length(data) if (nTips < 4L || star_tree) { nam <- names(data) if (star_tree) tree <- stree(length(nam), tip.label = nam) else tree <- stree(nTips, tip.label = nam) if(add_taxa) tree <- addTaxa(tree, attr(data, "duplicated")) tree <- unroot(tree) return(tree) } tree <- keep.tip(tree, names(data)) if(length(tree$tip.label) > 2) tree <- unroot(tree) tree <- reorder(tree, "postorder") p0 <- attr(data, "p0") nr <- attr(data, "nr") nTips <- as.integer(length(tree$tip.label)) if(nTips < 5) rearrangements <- "NNI" data <- subset(data, tree$tip.label, order(attr(data, "weight"), decreasing = TRUE)) f <- init_fitch(data, FALSE, FALSE, m=4L) m <- nr * (2L * nTips - 2L) on.exit({ if (add_taxa) tree <- addTaxa(tree, attr(data, "duplicated")) tree <- unroot(tree) attr(tree, "pscore") <- pscore return(tree) }) tree$edge.length <- NULL swap <- 0 iter <- TRUE if(nTips < 4) iter <- FALSE pscore <- f$pscore(tree$edge) while (iter) { res <- fitch_nni(tree, f) tree <- res$tree psc <- res$pscore if (trace > 1) cat("optimize topology (NNI): ", pscore, "-->", psc, "\n") if(psc < pscore) pscore <- psc swap <- swap + res$swap if (res$swap == 0) { if (rearrangements == "SPR") { tree2 <- fitch_spr(tree, f) psc <- f$pscore(tree2$edge) if (trace > 1) cat("optimize topology (SPR): ", pscore, "-->", psc , "\n") if (pscore < psc + 1e-6) iter <- FALSE else{ pscore <- psc tree <- tree2 } } # if (rearrangements == "TBR") {} else iter <- FALSE } } if (trace > 0) cat("Final p-score", pscore, "after ", swap, "nni operations \n") } phangorn/R/SOWH.R0000644000176200001440000001243513707232051013177 0ustar liggesusers#' Swofford-Olsen-Waddell-Hillis Test #' #' This function computes the Swofford--Olsen--Waddell--Hillis (SOWH) test, a #' parametric bootstrap test. The function is computational very demanding and #' likely to be very slow. #' #' \code{SOWH.test} performs a parametric bootstrap test to compare two trees. #' It makes extensive use \code{simSeq} and \code{optim.pml} and can take quite #' long. #' #' @param x an object of class \code{"pml"}. #' @param n the number of bootstrap replicates. #' @param restricted list of restricted parameter settings. #' @param optNni Logical value indicating whether topology gets optimized #' (NNI). #' @param trace Show output during computations. #' @param \dots Further arguments passed to \code{"optim.pml"}. #' @return an object of class SOWH. That is a list with three elements, one is #' a matrix containing for each bootstrap replicate the (log-) likelihood of #' the restricted and unrestricted estimate and two pml objects of the #' restricted and unrestricted model. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, #' \code{\link{simSeq}}, \code{\link{SH.test}} #' @references Goldman, N., Anderson, J. P., and Rodrigo, A. G. (2000) #' Likelihood -based tests of topologies in phylogenetics. \emph{Systematic #' Biology} \bold{49} 652-670. #' #' Swofford, D.L., Olsen, G.J., Waddell, P.J. and Hillis, D.M. (1996) #' Phylogenetic Inference in Hillis, D.M., Moritz, C. and Mable, B.K. (Eds.) #' \emph{Molecular Systematics} (2nd ed.) 407-514, Sunderland, MA: Sinauer #' @keywords models #' @examples #' #' # in real analysis use larger n, e.g. 500 preferably more #' \dontrun{ #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree <- NJ(dm) #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit, TRUE) #' set.seed(6) #' tree <- rNNI(fit$tree, 1) #' fit <- update(fit, tree = tree) #' (res <- SOWH.test(fit, n=100)) #' summary(res) #' } #' #' @export SOWH.test SOWH.test <- function(x, n = 100, restricted = list(optNni = FALSE), optNni = TRUE, trace = 1, ...) { res <- matrix(NA, n, 2) extras <- match.call(expand.dots = FALSE)$... optU <- list (optNni = optNni, optBf = FALSE, optQ = FALSE, optInv = FALSE, optGamma = FALSE, optEdge = TRUE, optRate = FALSE, optRooted = FALSE, model = NULL) if (!is.null(extras)) { namAll <- names(extras) for (i in seq_along(extras)) optU[[namAll[i]]] <- extras[[i]] } optR <- optU namR <- names(restricted) for (i in seq_along(namR)) optR[[namR[i]]] <- restricted[[i]] restr <- optim.pml(x, optNni = optR$optNni, optBf = optR$optBf, optQ = optR$optQ, optInv = optR$optInv, optGamma = optR$optGamma, optEdge = optR$optEdge, optRate = optR$optRate, optRooted = optR$optRooted, model = optR$model, pml.control(trace = trace - 1L)) unrestr <- optim.pml(restr, optNni = optU$optNni, optBf = optU$optBf, optQ = optU$optQ, optInv = optU$optInv, optGamma = optU$optGamma, optEdge = optU$optEdge, optRate = optU$optRate, optRooted = optU$optRooted, model = optU$model, pml.control(trace = trace - 1L)) for (i in 1:n) { if (trace > 0) cat("iteration: ", i, "\n") newData <- simSeq(restr) restrTmp <- update(restr, data = newData) unrestrTmp <- restrTmp restrTmp <- optim.pml(restrTmp, optNni = optR$optNni, optBf = optR$optBf, optQ = optR$optQ, optInv = optR$optInv, optGamma = optR$optGamma, optEdge = optR$optEdge, optRate = optR$optRate, optRooted = optR$optRooted, model = optR$model, pml.control(trace = trace - 1L)) unrestrTmp <- optim.pml(unrestrTmp, optNni = optU$optNni, optBf = optU$optBf, optQ = optU$optQ, optInv = optU$optInv, optGamma = optU$optGamma, optEdge = optU$optEdge, optRate = optU$optRate, optRooted = optU$optRooted, model = optU$model, pml.control(trace = trace - 1L)) res[i, 1] <- logLik(restrTmp) res[i, 2] <- logLik(unrestrTmp) } result <- list("LL" = res, "restr" = restr, "unrestr" = unrestr) class(result) <- "SOWH" result } #' @export print.SOWH <- function(x, digits = 4L, ...) { resLL <- logLik(x$restr) unresLL <- logLik(x$unrestr) diffLL <- unresLL - resLL pval <- sum( (x$LL[, 2] - x$LL[, 1]) > diffLL) / nrow(x$LL) res <- c(resLL, unresLL, diffLL, pval) names(res) <- c("ln L restr", "ln L unrestr", "Diff ln L", "p-value") print(res, digits = digits) invisible(x) } #' @export summary.SOWH <- function(object, digits = 4L, plot = TRUE, ...) { resLL <- logLik(object$restr) unresLL <- logLik(object$unrestr) diffLL <- unresLL - resLL pval <- sum( (object$LL[, 2] - object$LL[, 1]) > diffLL) / nrow(object$LL) res <- c(resLL, unresLL, diffLL, pval) names(res) <- c("ln L restr", "ln L unrestr", "Diff ln L", "p-value") print(res, digits = digits) if (plot) { d <- object$LL[, 2] - object$LL[, 1] hist(d, freq = FALSE, xlim = c(0, 1.2 * max(d, diffLL))) abline(v = diffLL, col = "red") } invisible(object) } phangorn/R/dist.p.R0000644000176200001440000001341114140455200013606 0ustar liggesusers#' Pairwise Polymorphism P-Distances from DNA Sequences #' #' This function computes a matrix of pairwise uncorrected polymorphism #' p-distances. Polymorphism p-distances include intra-individual site #' polymorphisms (2ISPs; e.g. "R") when calculating genetic distances. #' #' The polymorphism p-distances (Potts et al. 2014) have been developed to #' analyse intra-individual variant polymorphism. For example, the widely used #' ribosomal internal transcribed spacer (ITS) region (e.g. Alvarez and Wendel, #' 2003) consists of 100's to 1000's of units within array across potentially #' multiple nucleolus organizing regions (Bailey et al., 2003; Goeker and #' Grimm, 2008). This can give rise to intra-individual site polymorphisms #' (2ISPs) that can be detected from direct-PCR sequencing or cloning . Clone #' consensus sequences (see Goeker and Grimm, 2008) can be analysed with this #' function. #' #' @param x a matrix containing DNA sequences; this must be of class "phyDat" #' (use as.phyDat to convert from DNAbin objects). #' @param cost A cost matrix or "polymorphism" for a predefined one. #' @param ignore.indels a logical indicating whether gaps are treated as fifth #' state or not. Warning, each gap site is treated as a characters, so an an #' indel that spans a number of base positions would be treated as multiple #' character states. #' @return an object of class \code{dist}. #' @author Klaus Schliep and Alastair Potts #' @seealso \code{\link[ape]{dist.dna}}, \code{\link[phangorn]{dist.hamming}} #' @references Alvarez, I., and J. F. Wendel. (2003) Ribosomal ITS sequences #' and plant phylogenetic inference. \emph{ Molecular Phylogenetics and #' Evolution}, \bold{29}, 417--434. #' #' Bailey, C. D., T. G. Carr, S. A. Harris, and C. E. Hughes. (2003) #' Characterization of angiosperm nrDNA polymorphism, paralogy, and #' pseudogenes. \emph{Molecular Phylogenetics and Evolution} \bold{29}, #' 435--455. #' #' Goeker, M., and G. Grimm. (2008) General functions to transform associate #' data to host data, and their use in phylogenetic inference from sequences #' with intra-individual variability. \emph{BMC Evolutionary Biology}, #' \bold{8}:86. #' #' Potts, A.J., T.A. Hedderson, and G.W. Grimm. (2014) Constructing phylogenies #' in the presence of intra-individual site polymorphisms (2ISPs) with a focus #' on the nuclear ribosomal cistron. \emph{Systematic Biology}, \bold{63}, #' 1--16 #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' laura <- as.DNAbin(Laurasiatherian) #' #' dm <- dist.p(Laurasiatherian, "polymorphism") #' #' ######################################################## #' # Dealing with indel 2ISPs #' # These can be coded using an "x" in the alignment. Note #' # that as.character usage in the read.dna() function. #' ######################################################### #' cat("3 5", #' "No305 ATRA-", #' "No304 ATAYX", #' "No306 ATAGA", #' file = "exdna.txt", sep = "\n") #' (ex.dna <- read.dna("exdna.txt", format = "sequential", as.character=TRUE)) #' dat <- phyDat(ex.dna, "USER", levels=unique(as.vector(ex.dna))) #' dist.p(dat) #' #' unlink("exdna.txt") #' #' @export dist.p dist.p <- function(x, cost = "polymorphism", ignore.indels = TRUE) { if(inherits(x, "DNAbin")) x <- as.phyDat(x) if (!inherits(x, "phyDat")) { stop("x must be of class phyDat") } l <- length(x) weight <- attr(x, "weight") n <- length(attr(x, "allLevels")) d <- numeric((l * (l - 1)) / 2) lev <- attr(x, "allLevels") if (is.null(cost)) { cost <- 1 - diag(n) dimnames(cost) <- list(lev, lev) } # if(cost=="polymorphism" && attr(x, "type")=="DNA"){ if (cost == "polymorphism") { costLev <- c("a", "c", "t", "u", "g", "x", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "-", "?", "n") cost <- matrix(c( # a,c,t,u,g,X,m,r,w,s,y,k,v,h,d,b,-,?,n, 0, 2, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 2, 2, 4, 2, 0, 0, # a 2, 0, 2, 2, 2, 1, 1, 3, 3, 1, 1, 3, 2, 2, 4, 2, 2, 0, 0, # c 2, 2, 0, 0, 2, 1, 3, 3, 1, 3, 1, 1, 4, 2, 2, 2, 2, 0, 0, # t 2, 2, 0, 0, 2, 1, 3, 3, 1, 3, 1, 1, 4, 2, 2, 2, 2, 0, 0, # u 2, 2, 2, 2, 0, 1, 3, 1, 3, 1, 3, 1, 2, 4, 2, 2, 2, 0, 0, # g 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # X 1, 1, 3, 3, 3, 1, 0, 2, 2, 2, 2, 4, 1, 1, 3, 3, 3, 0, 0, # m 1, 3, 3, 3, 1, 1, 2, 0, 2, 2, 4, 2, 1, 3, 1, 3, 3, 0, 0, # r 1, 3, 1, 1, 3, 1, 2, 2, 0, 4, 2, 2, 3, 1, 1, 3, 3, 0, 0, # w 3, 1, 3, 3, 1, 1, 2, 2, 4, 0, 2, 2, 1, 3, 3, 1, 3, 0, 0, # s 3, 1, 1, 1, 3, 1, 2, 4, 2, 2, 0, 2, 3, 1, 3, 1, 3, 0, 0, # y 3, 3, 1, 1, 1, 1, 4, 2, 2, 2, 2, 0, 3, 3, 1, 1, 3, 0, 0, # k 2, 2, 4, 4, 2, 1, 1, 1, 3, 1, 3, 3, 0, 2, 2, 2, 4, 0, 0, # v 2, 2, 2, 2, 4, 1, 1, 3, 1, 3, 1, 3, 2, 0, 2, 2, 4, 0, 0, # h 2, 4, 2, 2, 2, 1, 3, 1, 1, 3, 3, 1, 2, 2, 0, 2, 4, 0, 0, # d 4, 2, 2, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 2, 2, 0, 4, 0, 0, # b 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, #- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # ? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), # n ncol = 19, nrow = 19, dimnames = list(costLev, costLev) ) } lev1 <- dimnames(cost)[[1]] if (any(is.na(match(lev, lev1)))) stop("Levels of x are not in levels of cost matrix!") if (ignore.indels) { cost["-", ] <- 0 cost[, "-"] <- 0 } cost <- cost[lev, lev] k <- 1 for (i in 1:(l - 1)) { for (j in (i + 1):l) { d[k] <- sum(weight * cost[cbind(x[[i]], x[[j]])]) k <- k + 1 } } attr(d, "Size") <- l if (is.list(x)) { attr(d, "Labels") <- names(x) } else { attr(d, "Labels") <- colnames(x) } attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "call") <- match.call() attr(d, "method") <- "p" class(d) <- "dist" return(d) } phangorn/R/distTree.R0000644000176200001440000003577514140462241014214 0ustar liggesusers# # UPGMA, NJ, UNJ, nnls # #' UPGMA and WPGMA #' #' UPGMA and WPGMA clustering. Just a wrapper function around #' \code{\link[stats]{hclust}}. #' #' #' @param D A distance matrix. #' @param method The agglomeration method to be used. This should be (an #' unambiguous abbreviation of) one of "ward", "single", "complete", "average", #' "mcquitty", "median" or "centroid". The default is "average". #' @param \dots Further arguments passed to or from other methods. #' @return A phylogenetic tree of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{hclust}}, \code{\link{dist.hamming}}, \code{\link{NJ}}, #' \code{\link{as.phylo}}, \code{\link{fastme}}, \code{\link{nnls.tree}} #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm <- dist.ml(Laurasiatherian) #' tree <- upgma(dm) #' plot(tree) #' #' @rdname upgma #' @export "upgma" <- function(D, method = "average", ...) { DD <- as.dist(D) hc <- hclust(DD, method = method, ...) result <- as.phylo(hc) result <- reorder(result, "postorder") result } #' @rdname upgma #' @export "wpgma" <- function(D, method = "mcquitty", ...) { DD <- as.dist(D) hc <- hclust(DD, method = method, ...) result <- as.phylo(hc) result <- reorder(result, "postorder") result } #' Neighbor-Joining #' #' This function performs the neighbor-joining tree estimation of Saitou and #' Nei (1987). UNJ is the unweighted version from Gascuel (1997). #' #' #' @param x A distance matrix. #' @return an object of class \code{"phylo"}. #' @author Klaus P. Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{nj}}, \code{\link[ape]{dist.dna}}, #' \code{\link[phangorn]{dist.hamming}}, \code{\link[phangorn]{upgma}}, #' \code{\link[ape]{fastme}} #' @references Saitou, N. and Nei, M. (1987) The neighbor-joining method: a new #' method for reconstructing phylogenetic trees. \emph{Molecular Biology and #' Evolution}, \bold{4}, 406--425. #' #' Studier, J. A and Keppler, K. J. (1988) A Note on the Neighbor-Joining #' Algorithm of Saitou and Nei. \emph{Molecular Biology and Evolution}, #' \bold{6}, 729--731. #' #' Gascuel, O. (1997) Concerning the NJ algorithm and its unweighted version, #' UNJ. in Birkin et. al. \emph{Mathematical Hierarchies and Biology}, #' 149--170. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' dm <- dist.ml(Laurasiatherian) #' tree <- NJ(dm) #' plot(tree) #' #' @rdname NJ #' @export NJ <- function(x) reorder(nj(x), "postorder") #' @rdname NJ #' @export UNJ <- function(x){ x <- as.matrix(x) labels <- attr(x, "Labels")[[1]] edge.length <- NULL edge <- NULL d <- as.matrix(x) if (is.null(labels)) labels <- colnames(d) l <- dim(d)[1] n <- l nam <- as.character(1:l) m <- l - 2 nam <- 1:l k <- 2 * l - 2 w <- rep(1, l) while (l > 2) { r <- rowSums(d) / (l - 2) # i <- 0 # j <- 0 tmp <- out_cpp(d, r, l) # tmp <- .C("out", as.double(d), as.double(r), as.integer(l), as.integer(i), # as.integer(j)) e2 <- tmp[2] e1 <- tmp[1] l1 <- d[e1, e2] / 2 + sum( (d[e1, -c(e1, e2)] - d[e2, -c(e1, e2)]) * w[-c(e1, e2)]) / (2 * (n - w[e1] - w[e2])) l2 <- d[e1, e2] / 2 + sum( (d[e2, -c(e1, e2)] - d[e1, -c(e1, e2)]) * w[-c(e1, e2)]) / (2 * (n - w[e1] - w[e2])) edge.length <- c(l1, l2, edge.length) edge <- rbind(c(k, nam[e2]), edge) edge <- rbind(c(k, nam[e1]), edge) nam <- c(nam[c(-e1, -e2)], k) dnew <- (w[e1] * d[e1, ] + w[e2] * d[e2, ] - w[e1] * l1 - w[e2] * l2) / (w[e1] + w[e2]) d <- cbind(d, dnew) d <- rbind(d, c(dnew, 0)) d <- d[-c(e1, e2), -c(e1, e2)] w <- c(w, w[e1] + w[e2]) w <- w[-c(e1, e2)] k <- k - 1 l <- l - 1 } edge.length <- c(d[2, 1], edge.length) result <- list(edge = rbind(c(nam[2], nam[1]), edge), edge.length = edge.length, tip.label = labels, Nnode = m) class(result) <- "phylo" reorder(result, "postorder") } # # Distance Matrix methods # #' Compute a design matrix or non-negative LS #' #' \code{nnls.tree} estimates the branch length using non-negative least #' squares given a tree and a distance matrix. \code{designTree} and #' \code{designSplits} compute design matrices for the estimation of edge #' length of (phylogenetic) trees using linear models. For larger trees a #' sparse design matrix can save a lot of memory. %\code{designTree} also #' computes a contrast matrix if the method is "rooted". #' #' @param tree an object of class \code{phylo} #' @param method design matrix for an "unrooted" or "rooted" ultrametric tree. #' @param sparse return a sparse design matrix. #' @param x number of taxa. #' @param splits one of "all", "star". #' @param dm a distance matrix. #' @param rooted compute a "rooted" or "unrooted" tree. #' @param trace defines how much information is printed during optimization. #' @param \dots further arguments, passed to other methods. #' @param weight vector of weights to be used in the fitting process. #' Weighted least squares is used with weights w, i.e., sum(w * e^2) is #' minimized. #' @param balanced use weights as in balanced fastME #' @return \code{nnls.tree} return a tree, i.e. an object of class #' \code{phylo}. \code{designTree} and \code{designSplits} a matrix, possibly #' sparse. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[ape]{fastme}}, #' \code{\link[phangorn]{distanceHadamard}}, #' \code{\link[phangorn]{splitsNetwork}}, \code{\link[phangorn]{upgma}} #' @keywords cluster #' @importFrom Matrix Matrix sparseMatrix crossprod solve #' @importFrom quadprog solve.QP.compact #' @examples #' #' example(NJ) #' dm <- as.matrix(dm) #' y <- dm[lower.tri(dm)] #' X <- designTree(tree) #' lm(y~X-1) #' # avoids negative edge weights #' tree2 <- nnls.tree(dm, tree) #' #' @rdname designTree #' @export designTree <- function(tree, method = "unrooted", sparse = FALSE, ...) { if (!is.na(pmatch(method, "all"))) method <- "unrooted" METHOD <- c("unrooted", "rooted") method <- pmatch(method, METHOD) if (is.na(method)) stop("invalid method") if (method == -1) stop("ambiguous method") if (!is.rooted(tree) & method == 2) stop("tree has to be rooted") if (method == 1) { X <- designUnrooted(tree, ...) if (sparse) X <- Matrix(X) } if (method == 2) X <- designUltra(tree, sparse = sparse, ...) X } designUnrooted <- function(tree, order = NULL) { if (inherits(tree, "phylo")) { if (is.rooted(tree)) tree <- unroot(tree) tree <- reorder(tree, "postorder") # p <- as.matrix(as.splits(tree)[tree$edge[,2]]) p <- bipartition(tree) } if (inherits(tree, "splits")) p <- as.matrix(tree) if (!is.null(order)) p <- p[, order] m <- dim(p)[2] ind <- rowSums(p) p <- p[ind != m, ] n <- dim(p)[1] res <- matrix(0, (m - 1) * m / 2, n) k <- 1 for (i in 1:(m - 1)) { for (j in (i + 1):m) { res[k, ] <- p[, i] != p[, j] k <- k + 1 } } if (inherits(tree, "phylo")) colnames(res) <- paste(tree$edge[, 1], tree$edge[, 2], sep = "<->") res } designUltra <- function(tree, sparse = TRUE) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") tree <- reorder(tree, "postorder") leri <- allChildren(tree) bp <- bip(tree) n <- length(tree$tip.label) l <- tree$Nnode nodes <- integer(l) k <- 1L u <- numeric(n * (n - 1) / 2) v <- numeric(n * (n - 1) / 2) m <- 1L for (i in seq_along(leri)) { if (length(leri[[i]]) > 1) { if (length(leri[[i]]) == 2) ind <- getIndex(bp[[leri[[i]][1] ]], bp[[leri[[i]][2] ]], n) else { ind <- NULL le <- leri[[i]] nl <- length(le) for (j in 1:(nl - 1)) ind <- c(ind, getIndex(bp[[le[j] ]], unlist(bp[ le[(j + 1):nl] ]), n)) } li <- length(ind) v[m:(m + li - 1)] <- k u[m:(m + li - 1)] <- ind nodes[k] <- i m <- m + li k <- k + 1L } } if (sparse) X <- sparseMatrix(i = u, j = v, x = 2L) else { X <- matrix(0L, n * (n - 1) / 2, l) X[cbind(u, v)] <- 2L } colnames(X) <- nodes attr(X, "nodes") <- nodes X } designUnrooted2 <- function(tree, sparse = TRUE) { if (is.null(attr(tree, "order")) || attr(tree, "order") != "postorder") tree <- reorder(tree, "postorder") leri <- allChildren(tree) bp <- bip(tree) n <- length(tree$tip.label) l <- tree$Nnode nodes <- integer(l) nTips <- as.integer(length(tree$tip.label)) k <- nTips u <- numeric(n * (n - 1) / 2) v <- numeric(n * (n - 1) / 2) z <- numeric(n * (n - 1) / 2) y <- numeric(n * (n - 1) / 2) p <- 1L m <- 1L for (i in seq_along(leri)) { if (length(leri[[i]]) > 1) { if (length(leri[[i]]) == 2) { ind <- getIndex(bp[[leri[[i]][1] ]], bp[[leri[[i]][2] ]], n) ytmp <- rep(bp[[leri[[i]][1] ]], each = length(bp[[leri[[i]][2] ]])) ztmp <- rep(bp[[leri[[i]][2] ]], length(bp[[leri[[i]][1] ]])) } else { ind <- NULL le <- leri[[i]] nl <- length(le) ytmp <- NULL ztmp <- NULL for (j in 1:(nl - 1)) { bp1 <- bp[[le[j] ]] bp2 <- unlist(bp[le[(j + 1):nl] ]) ind <- c(ind, getIndex(bp1, unlist(bp2), n)) ytmp <- c(ytmp, rep(bp1, each = length(bp2))) ztmp <- c(ztmp, rep(bp2, length(bp1))) } } li <- length(ind) v[m:(m + li - 1)] <- k u[m:(m + li - 1)] <- ind y[m:(m + li - 1)] <- ytmp z[m:(m + li - 1)] <- ztmp nodes[p] <- i m <- m + li k <- k + 1L p <- p + 1L } } jj <- c(y, z) # [ind],v) ii <- c(u, u) # [ind],u) ind <- (jj < nTips) jj <- c(jj[ind], v) ii <- c(ii[ind], u) l1 <- length(u) l2 <- sum(ind) x <- rep(c(-1L, 2L), c(l2, l1)) X <- sparseMatrix(i = ii, j = jj, x = x) if (!sparse) { X <- as.matrix(X) } nodes <- c(1:(nTips - 1L), nodes) colnames(X) <- nodes attr(X, "nodes") <- nodes X } #' @rdname designTree #' @export nnls.tree <- function(dm, tree, rooted = FALSE, trace = 1, weight = NULL, balanced = FALSE) { if (is.rooted(tree) & rooted == FALSE) { tree <- unroot(tree) warning("tree was rooted, I unrooted the tree!") } tree <- reorder(tree, "postorder") if (balanced) { if (!is.binary(tree)) stop("tree must be binary") weight <- rowSums(designTree(unroot(tree))) } dm <- as.matrix(dm) k <- dim(dm)[1] labels <- tree$tip.label dm <- dm[labels, labels] y <- dm[lower.tri(dm)] # computing the design matrix from the tree if (rooted) X <- designUltra(tree) else X <- designUnrooted2(tree) if (!is.null(weight)) { y <- y * sqrt(weight) X <- X * sqrt(weight) } lab <- attr(X, "nodes") # na.action if (any(is.na(y))) { ind <- which(is.na(y)) X <- X[-ind, , drop = FALSE] y <- y[-ind] } # LS solution Dmat <- crossprod(X) # cross-product computations dvec <- crossprod(X, y) betahat <- as.vector(solve(Dmat, dvec)) betahattmp <- betahat bhat <- numeric(max(tree$edge)) bhat[as.integer(lab)] <- betahat betahat <- bhat[tree$edge[, 1]] - bhat[tree$edge[, 2]] if (!any(betahat < 0)) { # if(!rooted){ RSS <- sum((y - (X %*% betahattmp))^2) if (trace) print(paste("RSS:", RSS)) attr(tree, "RSS") <- RSS # } tree$edge.length <- betahat return(tree) } # non-negative LS n <- dim(X)[2] l <- nrow(tree$edge) lab <- attr(X, "nodes") # vielleicht solve.QP.compact ind1 <- match(tree$edge[, 1], lab) ind2 <- match(tree$edge[, 2], lab) Amat <- matrix(0, 2, l) Amat[1, ] <- 1 Amat[2, ] <- -1 Aind <- matrix(0L, 3, l) Aind[1, ] <- 2L Aind[2, ] <- as.integer(ind1) Aind[3, ] <- as.integer(ind2) if (any(is.na(Aind))) { na_ind <- which(is.na(Aind), arr.ind = TRUE) Aind[is.na(Aind)] <- 0L for (i in seq_len(nrow(na_ind)) ){ Aind[1, na_ind[i, 2]] <- Aind[1, na_ind[i, 2]] - 1L } } betahat <- quadprog::solve.QP.compact(as.matrix(Dmat), as.vector(dvec), Amat, Aind)$sol # quadratic programing solving RSS <- sum((y - (X %*% betahat))^2) if (trace) print(paste("RSS:", RSS)) attr(tree, "RSS") <- RSS bhat <- numeric(max(tree$edge)) bhat[as.integer(lab)] <- betahat betahat <- bhat[tree$edge[, 1]] - bhat[tree$edge[, 2]] tree$edge.length <- betahat tree } #' @rdname designTree #' @export nnls.phylo <- function(x, dm, rooted = FALSE, trace = 0, ...) { nnls.tree(dm, x, rooted, trace = trace, ...) } #' @rdname designTree #' @export nnls.splits <- function(x, dm, trace = 0) { labels <- attr(x, "labels") dm <- as.matrix(dm) k <- dim(dm)[1] dm <- dm[labels, labels] y <- dm[lower.tri(dm)] x <- SHORTwise(x) #, k) # use ape version l <- lengths(x) if (any(l == 0)) x <- x[-which(l == 0)] X <- splits2design(x) if (any(is.na(y))) { ind <- which(is.na(y)) X <- X[-ind, , drop = FALSE] y <- y[-ind] } Dmat <- crossprod(X) # cross-product computations dvec <- crossprod(X, y) betahat <- as.vector(solve(Dmat, dvec)) if (!any(betahat < 0)) { RSS <- sum((y - (X %*% betahat))^2) if (trace) print(paste("RSS:", RSS)) attr(x, "RSS") <- RSS attr(x, "weights") <- betahat return(x) } n <- dim(X)[2] int <- lengths(x) # quadratic programing Amat <- matrix(1, 1, n) Aind <- matrix(0L, 2L, n) Aind[1, ] <- 1L Aind[2, ] <- as.integer(1L:n) betahat <- quadprog::solve.QP.compact(as.matrix(Dmat), as.vector(dvec), Amat, Aind)$sol RSS <- sum((y - (X %*% betahat))^2) ind <- (betahat > 1e-8) | int == 1 x <- x[ind] attr(x, "weights") <- betahat[ind] if (trace) print(paste("RSS:", RSS)) attr(x, "RSS") <- RSS x } #' @rdname designTree #' @export nnls.networx <- function(x, dm) { # spl <- attr(x, "splits") spl <- x$splits spl2 <- nnls.splits(spl, dm) weight <- attr(spl, "weight") weight[] <- 0 weight[match(spl2, spl)] <- attr(spl2, "weight") # attr(attr(x, "splits"), "weight") <- weight attr(x$splits, "weight") <- weight x$edge.length <- weight[x$splitIndex] x } #' @rdname designTree #' @export designSplits <- function(x, splits = "all", ...) { if (!is.na(pmatch(splits, "all"))) splits <- "all" if (inherits(x, "splits")) return(designUnrooted(x)) SPLITS <- c("all", "star") # ,"caterpillar") splits <- pmatch(splits, SPLITS) if (is.na(splits)) stop("invalid splits method") if (splits == -1) stop("ambiguous splits method") if (splits == 1) X <- designAll(x) if (splits == 2) X <- designStar(x, ...) return(X) } # add return splits=FALSE designAll <- function(n, add.split = FALSE) { Y <- matrix(0L, n * (n - 1) / 2, n) k <- 1 for (i in 1:(n - 1)) { for (j in (i + 1):n) { Y[k, c(i, j)] <- 1L k <- k + 1L } } m <- n - 1L X <- matrix(0L, m + 1, 2^m) for (i in 1:m) X[i, ] <- rep(rep(c(0L, 1L), each = 2^(i - 1)), 2^(m - i)) X <- X[, -1] if (!add.split) return((Y %*% X) %% 2) list(X = (Y %*% X) %% 2, Splits = t(X)) } # faster sparse version designStar <- function(n, sparse = TRUE) { # res=NULL # for(i in 1:(n-1)) res = rbind(res,cbind(matrix(0,(n-i),i-1),1,diag(n-i))) res <- stree(n) |> as.splits() |> splits2design() if (!sparse) return(as.matrix(res)) res } phangorn/R/parsimony.R0000644000176200001440000004754114151712521014445 0ustar liggesusers# # Maximum Parsimony # sankoff.quartet <- function(dat, cost, p, l, weight) { erg <- .Call('sankoffQuartet', sdat = dat, sn = p, scost = cost, sk = l) sum(weight * erg) } #' Parsimony tree. #' #' #' \code{parsimony} returns the parsimony score of a tree using either the #' sankoff or the fitch algorithm. \code{optim.parsimony} tries to find the #' maximum parsimony tree using either Nearest Neighbor Interchange (NNI) #' rearrangements or sub tree pruning and regrafting (SPR). \code{pratchet} #' implements the parsimony ratchet (Nixon, 1999) and is the preferred way to #' search for the best tree. \code{random.addition} can be used to produce #' starting trees. #' #' The "SPR" rearrangements are so far only available for the "fitch" method, #' "sankoff" only uses "NNI". The "fitch" algorithm only works correct for #' binary trees. #' #' @aliases parsimony #' @aliases optim.parsimony sankoff fitch pratchet #' random.addition acctran #' @param data A object of class phyDat containing sequences. #' @param tree tree to start the nni search from. #' @param method one of 'fitch' or 'sankoff'. #' @param cost A cost matrix for the transitions between two states. #' @param site return either 'pscore' or 'site' wise parsimony scores. #' @param trace defines how much information is printed during optimization. #' @param rearrangements SPR or NNI rearrangements. #' @param start a starting tree can be supplied. #' @param maxit maximum number of iterations in the ratchet. #' @param minit minimum number of iterations in the ratchet. #' @param k number of rounds ratchet is stopped, when there is no improvement. #' @param all return all equally good trees or just one of them. #' @param perturbation whether to use "ratchet", "random_addition" or #' "stochastic" (nni) for shuffling the tree. #' @param ... Further arguments passed to or from other methods (e.g. #' model="sankoff" and cost matrix). #' @return \code{parsimony} returns the maximum parsimony score (pscore). #' \code{optim.parsimony} returns a tree after NNI rearrangements. #' \code{pratchet} returns a tree or list of trees containing the best tree(s) #' found during the search. \code{acctran} returns a tree with edge length #' according to the ACCTRAN criterion. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{bab}}, \code{\link{CI}}, \code{\link{RI}}, \code{\link{ancestral.pml}}, #' \code{\link{nni}}, \code{\link{NJ}}, \code{\link{pml}}, \code{\link{getClans}} #' ,\code{\link{ancestral.pars}}, \code{\link{bootstrap.pml}} #' @references Felsenstein, J. (2004). \emph{Inferring Phylogenies}. Sinauer #' Associates, Sunderland. #' #' Nixon, K. (1999) The Parsimony Ratchet, a New Method for Rapid Parsimony #' Analysis. \emph{Cladistics} \bold{15}, 407-414 #' @keywords cluster #' @examples #' #' set.seed(3) #' data(Laurasiatherian) #' dm <- dist.hamming(Laurasiatherian) #' tree <- NJ(dm) #' parsimony(tree, Laurasiatherian) #' treeRA <- random.addition(Laurasiatherian) #' treeNNI <- optim.parsimony(tree, Laurasiatherian) #' treeRatchet <- pratchet(Laurasiatherian, start=tree, maxit=100, #' minit=5, k=5, trace=0) #' # assign edge length #' treeRatchet <- acctran(treeRatchet, Laurasiatherian) #' #' plot(midpoint(treeRatchet)) #' add.scale.bar(0,0, length=100) #' #' parsimony(c(tree,treeNNI, treeRatchet), Laurasiatherian) #' #' @rdname parsimony #' @export ## parsimony <- function(tree, data, cost=NULL, method = NULL) parsimony <- function(tree, data, method = "fitch", cost=NULL, site = "pscore"){ if (!inherits(data, "phyDat")) stop("data must be of class phyDat") method <- match.arg(method, c("fitch", "sankoff")) if(!any(is.binary(tree)) || !is.null(cost)) method <- "sankoff" if (method == "sankoff") result <- sankoff(tree, data, cost=cost, site = site) if (method == "fitch") result <- fitch(tree, data, site = site) result } compressSites <- function(data) { attrData <- attributes(data) lev <- attr(data, "levels") LEV <- attr(data, "allLevels") l <- length(lev) nr <- attr(data, "nr") nc <- length(data) data <- unlist(data, FALSE, FALSE) attr(data, "dim") <- c(nr, nc) uni <- match(lev, LEV) fun <- function(x, uni) { u <- unique.default(x) res <- if (any(is.na(match(u, uni)))) return(x) match(x, u) } data <- apply(data, 1, fun, uni) index <- grp_duplicated(data, MARGIN=2L) pos <- which(!duplicated(index)) ntaxa <- nrow(data) res <- vector("list", ntaxa) for(i in seq_len(ntaxa)) res[[i]] <- data[i, pos] attrData$weight <- tapply(attrData$weight, index, sum) attrData$index <- NULL attrData$nr <- length(attrData$weight) attrData$compressed <- TRUE attributes(res) <- attrData res } parsinfo <- function(x, exact=TRUE) { nstates <- attr(x, "nc") up <- upperBound(x) eps <- 1e-8 low <- up low[up > (nstates - eps)] <- nstates - 1 if(exact){ ind <- which( (up > (1+eps)) & (up < (nstates-eps)) ) if(length(ind)>0) low[ind] <- lowerBound(getRows( x, ind )) ind <- which(low == up) } else ind <- which(up < (1+eps) ) cbind(ind, low[ind]) } # greedy algorithm of Maximum Set Packing (MSP) problem # (should work in most instances) lowerBound <- function(x, cost = NULL) { nc <- attr(x, "nc") nr <- attr(x, "nr") contrast <- attr(x, "contrast") rownames(contrast) <- attr(x, "allLevels") colnames(contrast) <- attr(x, "levels") nmax <- nrow(contrast) z <- matrix(unlist(x, FALSE, FALSE), length(x), length(attr(x, "weight")), byrow = TRUE) states <- apply(z, 2, unique.default, nmax = nmax) if(inherits(states, "matrix"))states <- asplit(states, 2) singles <- which(rowSums(contrast) == 1) noinfo <- which(rowSums(contrast) == nc) ambiguous <- which( (rowSums(contrast) > 1) & (rowSums(contrast) < nc)) fun <- function(states, contrast, singles, noinfo, ambiguous) { if (length(states) == 1) return(0) states <- setdiff(states, noinfo) # get rid of "-", "?" in DNA if ( (length(states) == 0) | (length(states) == 1)) return(0) if (any(states %in% ambiguous)) { n <- 0 contrast <- contrast[states, , drop = FALSE] while (nrow(contrast) > 0) { m <- which.max(colSums(contrast)) contrast <- contrast[contrast[, m] == 0, , drop = FALSE] n <- n + 1 } return(n - 1) } else return(length(states) - 1) } res <- sapply(states, fun, contrast, singles, noinfo, ambiguous) res } upperBound <- function(x, cost = NULL) { tree <- stree(length(x), tip.label = names(x)) if (is.null(cost)) cost <- 1 - diag(attr(x, "nc")) sankoff(tree, x, cost = cost, site = "site") } #' Consistency Index and Retention Index #' #' \code{CI} and \code{RI} compute the Consistency Index (CI) and Retention #' Index (RI). #' #' @details The Consistency Index is defined as minimum number of changes #' divided by the number of changes required on the tree (parsimony score). The #' Consistency Index is equal to one if there is no homoplasy. #' And the Retention Index is defined as #' \deqn{RI = \frac{MaxChanges - ObsChanges}{MaxChanges - MinChanges}}{RI = (MaxChanges - ObsChanges) / (MaxChanges - MinChanges)} #' #' @param data A object of class phyDat containing sequences. #' @param tree tree to start the nni search from. #' @param cost A cost matrix for the transitions between two states. #' @param sitewise return CI/RI for alignment or sitewise #' #' @seealso \code{\link{parsimony}}, \code{\link{pratchet}}, \code{\link{fitch}}, #' \code{\link{sankoff}}, \code{\link{bab}}, \code{\link{ancestral.pars}} #' #' @rdname CI #' @export CI <- function(tree, data, cost = NULL, sitewise = FALSE) { if (sitewise) pscore <- sankoff(tree, data, cost = cost, site = "site") else pscore <- sankoff(tree, data, cost = cost) weight <- attr(data, "weight") data <- subset(data, tree$tip.label) m <- lowerBound(data, cost = cost) if (sitewise) { return( (m / pscore)[attr(data, "index")]) } sum(m * weight) / pscore } #' @rdname CI #' @export RI <- function(tree, data, cost = NULL, sitewise = FALSE) { if (sitewise) pscore <- sankoff(tree, data, cost = cost, site = "site") else pscore <- sankoff(tree, data, cost = cost) data <- subset(data, tree$tip.label) weight <- attr(data, "weight") m <- lowerBound(data, cost = cost) g <- upperBound(data, cost = cost) if (sitewise) { res <- (g - pscore) / (g - m) return(res[attr(data, "index")]) } m <- sum(m * weight) g <- sum(g * weight) (g - pscore) / (g - m) } # # Sankoff # old2new.phyDat <- function(obj) { att <- attributes(obj) l <- length(obj) contrast <- attr(obj, "contrast") nr <- attr(obj, "nr") X <- matrix(rep(rowSums(contrast), each = nr), nrow = nr) for (i in 1:l) obj[[i]][obj[[i]] > 0] <- 1 res <- vector("list", l) contrast[contrast == 0] <- 1e6 for (i in 1:l) { tmp <- tcrossprod(obj[[i]], contrast) - X res[[i]] <- unlist(apply(tmp, 1, function(x) which(x < 1e-6)[1])) } attributes(res) <- att res } new2old.phyDat <- function(data) { contrast <- attr(data, "contrast") for (i in seq_along(data)) data[[i]] <- contrast[data[[i]], , drop = FALSE] data } prepareDataSankoff <- function(data) { contrast <- attr(data, "contrast") contrast[contrast == 0] <- 1e+06 contrast[contrast == 1] <- 0 for (i in seq_along(data)) data[[i]] <- contrast[data[[i]], , drop = FALSE] data } fit.sankoff <- function(tree, data, cost, returnData = c("pscore", "site", "data")) { tree <- reorder(tree, "postorder") returnData <- match.arg(returnData) node <- tree$edge[, 1] edge <- tree$edge[, 2] weight <- attr(data, "weight") nr <- attr(data, "nr") q <- length(tree$tip.label) nc <- attr(data, "nc") m <- length(edge) + 1 dat <- vector(mode = "list", length = m) dat[1:q] <- data[tree$tip.label] node <- as.integer(node - 1) edge <- as.integer(edge - 1) mNodes <- as.integer(max(node) + 1) tips <- as.integer( (seq_along(tree$tip.label)) - 1) res <- .Call('sankoff3', dat, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge, mNodes, tips) root <- getRoot(tree) erg <- .Call('C_rowMin', res[[root]], as.integer(nr), as.integer(nc)) if (returnData == "site") return(erg) pscore <- sum(weight * erg) result <- pscore if (returnData == "data") { result <- list(pscore = pscore, dat = res) } result } pnodes <- function(tree, data, cost) { tree <- reorder(tree, "postorder") node <- tree$edge[, 1] edge <- tree$edge[, 2] nr <- nrow(data[[1]]) nc <- ncol(data[[1]]) node <- as.integer(node - 1) edge <- as.integer(edge - 1) .Call('pNodes', data, as.numeric(cost), as.integer(nr), as.integer(nc), node, edge) } indexNNI <- function(tree) { parent <- tree$edge[, 1] child <- tree$edge[, 2] ind <- which(child %in% parent) Nnode <- tree$Nnode edgeMatrix <- matrix(0, (Nnode - 1), 5) pvector <- integer(max(parent)) pvector[child] <- parent tips <- !logical(max(parent)) tips[parent] <- FALSE # wahrscheinlich schneller: cvector <- allCildren(tree) cvector <- vector("list", max(parent)) for (i in seq_along(parent)) cvector[[parent[i]]] <- c(cvector[[parent[i]]], child[i]) k <- 0 for (i in ind) { p1 <- parent[i] p2 <- child[i] e34 <- cvector[[p2]] ind1 <- cvector[[p1]] e12 <- ind1[ind1 != p2] if (pvector[p1]) e12 <- c(p1, e12) edgeMatrix[k + 1, ] <- c(e12, e34, p2) k <- k + 1 } # vielleicht raus attr(edgeMatrix, "root") <- cvector[[min(parent)]] edgeMatrix } sankoff.nni <- function(tree, data, cost, ...) { if (is.rooted(tree)) tree <- reorder(unroot(tree), "postorder") INDEX <- indexNNI(tree) rootEdges <- attr(INDEX, "root") if (!inherits(data, "phyDat")) stop("data must be of class phyDat") levels <- attr(data, "levels") l <- length(levels) weight <- attr(data, "weight") p <- attr(data, "nr") i <- 1 tmp <- fit.sankoff(tree, data, cost, returnData = "data") p0 <- tmp[[1]] datf <- tmp[[2]] datp <- pnodes(tree, datf, cost) parent <- tree$edge[, 1] m <- dim(INDEX)[1] k <- min(parent) pscore <- numeric(2 * m) for (i in 1:m) { ei <- INDEX[i, ] datn <- datf[ei[1:4]] if (!(ei[5] %in% rootEdges)) datn[1] <- datp[ei[1]] pscore[(2 * i) - 1] <- sankoff.quartet(datn[ c(1, 3, 2, 4)], cost, p, l, weight) pscore[(2 * i)] <- sankoff.quartet(datn[ c(1, 4, 3, 2)], cost, p, l, weight) } swap <- 0 candidates <- pscore < p0 while (any(candidates)) { ind <- which.min(pscore) pscore[ind] <- Inf if (ind %% 2) swap.edge <- c(2, 3) else swap.edge <- c(2, 4) tree2 <- changeEdge(tree, INDEX[(ind + 1) %/% 2, swap.edge]) test <- fit.sankoff(tree2, data, cost, "pscore") if (test >= p0) candidates[ind] <- FALSE if (test < p0) { p0 <- test swap <- swap + 1 tree <- tree2 candidates[ind] <- FALSE indi <- which(rep(colSums(apply(INDEX, 1, match, INDEX[(ind + 1) %/% 2, ], nomatch = 0)) > 0, each = 2)) candidates[indi] <- FALSE pscore[indi] <- Inf } } list(tree = tree, pscore = p0, swap = swap) } #' @rdname parsimony #' @export optim.parsimony <- function(tree, data, method = "fitch", cost = NULL, trace = 1, rearrangements = "SPR", ...) { if (method == "fitch") result <- optim.fitch(tree = tree, data = data, trace = trace, rearrangements = rearrangements, ...) if (method == "sankoff") result <- optim.sankoff(tree = tree, data = data, cost = cost, trace = trace, ...) result } #' @rdname parsimony #' @export pratchet <- function(data, start = NULL, method = "fitch", maxit = 1000, minit = 10, k = 10, trace = 1, all = FALSE, rearrangements = "SPR", perturbation = "ratchet", ...) { eps <- 1e-08 trace <- trace - 1 start_trees <- vector("list", maxit) search_trees <- vector("list", maxit) tree <- NULL mp <- Inf # TODO use rooted trees if cost is not symmetric ROOTED <- FALSE weight <- attr(data, "weight") v <- rep(seq_along(weight), weight) w <- logical(length(weight)) # remove parsimony uniformative sites or duplicates # check for symmetric or if(method=="fitch") data <- removeParsimonyUninfomativeSites(data, recursive=TRUE) else data <- unique(data) if(!is.null(attr(data, "informative"))) w[attr(data, "informative")] <- TRUE else w[] <- TRUE star_tree <- ifelse(attr(data, "nr") == 0, TRUE, FALSE) add_taxa <- ifelse(is.null(attr(data, "duplicated")), FALSE, TRUE) nTips <- length(data) # check for trivial trees if (nTips < (3L + !ROOTED) || star_tree) { nam <- names(data) if (star_tree) tree <- stree(length(nam), tip.label = nam) else tree <- stree(nTips, tip.label = nam) if(add_taxa) tree <- addTaxa(tree, attr(data, "duplicated")) if(!ROOTED) tree <- unroot(tree) return(tree) } if (perturbation != "random_addition"){ if(is.null(start)) start <- optim.parsimony(fastme.ols(dist.hamming(data)), data, trace = trace-1, method = method, rearrangements = rearrangements, ...) tree <- start label <- intersect(tree$tip.label, names(data)) if (!is.binary(tree)){ tree <- multi2di(tree) if(method=="fitch") tree <- unroot(tree) } data <- subset(data, label) tree <- keep.tip(tree, label) attr(tree, "pscore") <- parsimony(tree, data, method = method, ...) mp <- attr(tree, "pscore") if (trace >= 0) print(paste("Best pscore so far:", attr(tree, "pscore"))) } FUN <- function(data, tree, method, rearrangements, ...) optim.parsimony(tree, data = data, method = method, rearrangements = rearrangements, ...) result <- tree if(!is.null(attr(data, "duplicated"))){ result <- addTaxa(result, attr(data, "duplicated")) } on.exit({ if (!all && inherits(result, "multiPhylo")) result <- result[[1]] # if(!is.null(attr(data, "duplicated"))) # result <- addTaxa(result, attr(data, "duplicated")) # else class(result) <- "multiPhylo" if (length(result) == 1) result <- result[[1]] env <- new.env() start_trees <- start_trees[seq_len(i)] search_trees <- search_trees[seq_len(i)] class(start_trees) <- "multiPhylo" class(search_trees) <- "multiPhylo" start_trees <- .compressTipLabel(start_trees) search_trees <- .compressTipLabel(search_trees) assign("start_trees", start_trees, envir=env) assign("search_trees", search_trees, envir=env) if(perturbation == "ratchet" && all(Ntip(trees) > 3)) { spl <- as.splits(start_trees) result <- addConfidences(result, spl) if (inherits(result, "multiPhylo")) result <- .compressTipLabel(result) } # for ratchet assign bs values attr(result, "env") <- env return(result) }) kmax <- 1 nTips <- length(tree$tip.label) for (i in seq_len(maxit)) { if (perturbation == "ratchet") { # sample and subset more efficient than in bootstrap.phyDat bsw <- tabulate(sample(v, replace = TRUE), length(weight))[w] bs_ind <- which(bsw > 0) bs_data <- getRows(data, bs_ind) attr(bs_data, "weight") <- bsw[bs_ind] if(length(bs_ind) > 0)p_trees <- optim.parsimony(tree, bs_data, trace = trace, method = method, rearrangements = rearrangements, ...) else p_trees <- stree(length(data), tip.label = names(data)) trees <- optim.parsimony(p_trees, data, trace = trace, method = method, rearrangements = rearrangements, ...) } if (perturbation == "stochastic") { p_trees <- rNNI(tree, floor(nTips / 2)) trees <- optim.parsimony(p_trees, data, trace = trace, method = method, rearrangements = rearrangements, ...) } if (perturbation == "random_addition") { p_trees <- random.addition(data) trees <- optim.parsimony(p_trees, data, trace = trace, method = method, rearrangements = rearrangements, ...) } if(!is.null(attr(data, "duplicated"))){ p_trees <- addTaxa(p_trees, attr(data, "duplicated")) trees <- addTaxa(trees, attr(data, "duplicated")) } start_trees[[i]] <- p_trees search_trees[[i]] <- trees pscores <- attr(trees, "pscore") mp1 <- min(pscores) if ( (mp1 + eps) < mp) { kmax <- 1 result <- trees tree <- trees mp <- mp1 } else{ kmax <- kmax + 1 if( all && (mp1 < (mp + eps)) && all(RF.dist(trees, result) > 0)) result <- c(result, trees) } if (trace >= 0) print(paste("Best pscore so far:", mp)) if ( (kmax >= k) && (i >= minit)) break() } # for } # pratchet optim.sankoff <- function(tree, data, cost = NULL, trace = 1, ...) { if (!inherits(tree, "phylo")) stop("tree must be of class phylo") if (is.rooted(tree)) tree <- unroot(tree) tree <- reorder(tree, "postorder") if (!inherits(data, "phyDat")) stop("data must be of class phyDat") addTaxa <- FALSE mapping <- map_duplicates(data) if (!is.null(mapping)) { addTaxa <- TRUE tree2 <- drop.tip(tree, mapping[, 1]) tree2 <- unroot(tree2) tree <- reorder(tree2, "postorder") } rt <- FALSE dat <- prepareDataSankoff(data) l <- attr(dat, "nc") if (is.null(cost)) { cost <- matrix(1, l, l) cost <- cost - diag(l) } tree$edge.length <- NULL swap <- 0 iter <- TRUE pscore <- fit.sankoff(tree, dat, cost, "pscore") on.exit({ if (rt) tree <- acctran(tree, data) if (addTaxa) { if (rt) tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2], edge.length = rep(0, nrow(mapping))) else tree <- add.tips(tree, tips = mapping[, 1], where = mapping[, 2]) } attr(tree, "pscore") <- pscore return(tree) }) while (iter) { res <- sankoff.nni(tree, dat, cost, ...) tree <- res$tree if (trace > 1) cat("optimize topology: ", pscore, "-->", res$pscore, "\n") pscore <- res$pscore swap <- swap + res$swap if (res$swap == 0) iter <- FALSE } if (trace > 0) cat("Final p-score", pscore, "after ", swap, "nni operations \n") } phangorn/R/SH.R0000644000176200001440000000766514140461662012746 0ustar liggesusers#' Shimodaira-Hasegawa Test #' #' This function computes the Shimodaira--Hasegawa test for a set of trees. #' #' #' @param ... either a series of objects of class \code{"pml"} separated by #' commas, a list containing such objects or an object of class \code{"pmlPart"} #' or a matrix containing the site-wise likelihoods in columns. #' @param B the number of bootstrap replicates. #' @param data an object of class \code{"phyDat"}. #' @param weight if a matrix with site (log-)likelihoods is is supplied an #' optional vector containing the number of occurrences of each site pattern. #' @return a numeric vector with the P-value associated with each tree given in #' \code{...}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}}, \code{\link{pmlPart}}, \code{\link{pmlCluster}}, #' \code{\link{SOWH.test}} #' @references Shimodaira, H. and Hasegawa, M. (1999) Multiple comparisons of #' log-likelihoods with applications to phylogenetic inference. \emph{Molecular #' Biology and Evolution}, \bold{16}, 1114--1116. #' @keywords models #' @examples #' #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree1 <- NJ(dm) #' tree2 <- unroot(upgma(dm)) #' fit1 <- pml(tree1, Laurasiatherian) #' fit2 <- pml(tree2, Laurasiatherian) #' fit1 <- optim.pml(fit1) # optimize edge weights #' fit2 <- optim.pml(fit2) #' # with pml objects as input #' SH.test(fit1, fit2, B=1000) #' # in real analysis use larger B, e.g. 10000 #' #' # with matrix as input #' X <- matrix(c(fit1$siteLik, fit2$siteLik), ncol=2) #' SH.test(X, weight=attr(Laurasiatherian, "weight"), B=1000) #' \dontrun{ #' example(pmlPart) #' SH.test(sp, B=1000) #' } #' @export SH.test <- function(..., B = 10000, data = NULL, weight = NULL) { fits <- list(...) if (inherits(fits[[1]], "matrix") || inherits(fits[[1]], "data.frame")) return(SH.tmp(fits[[1]], weight = weight, B = B)) p <- 1 if (inherits(fits[[1]], "pmlPart")) { fits <- fits[[1]]$fits p <- length(fits) } if (inherits(fits[[1]], "list")) { fits <- fits[[1]] } k <- length(fits) if (is.null(data)) data <- fits[[1]]$data res <- NULL for (h in 1:p) { if (p > 1) data <- fits[[h]]$data weight <- attr(data, "weight") lw <- length(weight) siteLik <- matrix(0, lw, k) for (i in 1:k) siteLik[, i] <- update(fits[[i]], data = data)$siteLik ntree <- k Lalpha <- drop(crossprod(siteLik, weight)) Talpha <- max(Lalpha) - Lalpha M <- matrix(NA, k, B) wvec <- rep(1L:lw, weight) for (i in 1:B) { boot <- tabulate(sample(wvec, replace = TRUE), nbins = lw) M[, i] <- crossprod(siteLik, boot) } M <- M - rowMeans(M) # for (i in 1:B) for (j in 1:ntree) S[j, i] <- max(M[j, i] - M[, i]) S <- matrix(apply(M, 2, min), k, B, byrow = TRUE) S <- M - S count <- numeric(ntree) for (j in 1:ntree) count[j] <- sum(S[j, ] > Talpha[j]) count <- count / B trees <- 1:k if (p == 1) res <- cbind(trees, Lalpha, Talpha, count) else res <- rbind(res, cbind(h, trees[-h], Lalpha[-h], Talpha[-h], count[-h])) } if (p == 1) colnames(res) <- c("Trees", "ln L", "Diff ln L", "p-value") else colnames(res) <- c("Partition", "Trees", "ln L", "Diff ln L", "p-value") res } SH.tmp <- function(siteLik, weight = NULL, B = 10000) { lw <- nrow(siteLik) if (is.null(weight)) weight <- rep(1, lw) ntree <- k <- ncol(siteLik) Lalpha <- drop(crossprod(siteLik, weight)) Talpha <- max(Lalpha) - Lalpha M <- matrix(NA, k, B) wvec <- rep(1L:lw, weight) for (i in 1:B) { boot <- tabulate(sample(wvec, replace = TRUE), nbins = lw) M[, i] <- crossprod(siteLik, boot) } M <- M - rowMeans(M) S <- matrix(apply(M, 2, min), k, B, byrow = TRUE) S <- M - S count <- numeric(ntree) for (j in 1:ntree) count[j] <- sum(S[j, ] > Talpha[j]) count <- count / B trees <- 1:k res <- cbind(trees, Lalpha, Talpha, count) colnames(res) <- c("Trees", "ln L", "Diff ln L", "p-value") res } phangorn/R/superTree.R0000644000176200001440000001734713775625451014423 0ustar liggesuserstree2phyDat <- function(trees) { # some minor error checking if (!inherits(trees, "multiPhylo")) stop("trees must be object of class 'multiPhylo.'") labels <- lapply(trees, function(x) sort(x$tip.label)) ulabels <- unique(labels) lul <- length(ulabels) # compute matrix representation phylogenies X <- vector("list", lul) # list of bipartitions characters <- 0 # number of characters weights <- NULL species <- trees[[1]]$tip.label characters <- 0 # number of characters weights <- NULL for (i in 1:lul) { pos <- match(labels, ulabels[i]) ind <- which(!is.na(pos)) temp <- prop.part(trees[ind]) # find all bipartitions # create matrix representation of trees[[i]] in X[[i]] TMP <- matrix(1L, nrow = length(temp) - 1, ncol = length(trees[[ind[1]]]$tip.label)) for (j in seq_len(nrow(TMP))) TMP[j, c(temp[[j + 1]])] <- 2L colnames(TMP) <- attr(temp, "labels") # label rows X[[i]] <- TMP species <- union(species, trees[[ind[1]]]$tip.label) # accumulate labels characters <- characters + nrow(TMP) # count characters weights <- c(weights, attr(temp, "number")[-1]) } data <- matrix(data = 3L, nrow = characters, ncol = length(species), dimnames = list(NULL, species)) j <- 1 for (i in seq_along(X)) { # copy each of X into supermatrix data data[c(j:((j - 1) + nrow(X[[i]]))), colnames(X[[i]])] <- X[[i]] # [1:nrow(X[[i]]),1:ncol(X[[i]])] j <- j + nrow(X[[i]]) } data <- as.data.frame(data) # compute contrast matrix contrast <- matrix(data = c(1, 0, 0, 1, 1, 1), 3, 2, dimnames = list(NULL, c("0", "1")), byrow = TRUE) attr(data, "row.names") <- NULL class(data) <- "phyDat" attr(data, "weight") <- weights attr(data, "nr") <- length(weights) attr(data, "nc") <- 2L attr(data, "levels") <- c("0", "1") attr(data, "allLevels") <- c("0", "1", "?") attr(data, "type") <- "USER" attr(data, "contrast") <- contrast class(data) <- "phyDat" data } my.supertree <- function(trees, trace = 0, ...) { has_edge_length <- vapply(trees, function(x) !is.null(x$edge.length), FALSE) if (all(has_edge_length)){ trees <- .uncompressTipLabel(trees) trees <- di2multi(trees) } XX <- tree2phyDat(trees) supertree <- pratchet(XX, trace = trace, ...) # maybe add edge length supertree <- acctran(supertree, XX) return(supertree) } # Robinson-Foulds supertree fun.rf <- function(x, tree) sum(RF.dist(x, tree)) fun.spr <- function(x, tree) sum(SPR.dist(x, tree)) dist.superTree <- function(tree, trace = 0, fun, start = NULL, multicore = FALSE, mc.cores = NULL) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } if (is.null(start)) start <- superTree(tree, rooted = FALSE) if (inherits(start, "multiPhylo")) start <- start[[1]] best_tree <- unroot(start) best <- fun(best_tree, tree) if (trace > 0) cat("best score so far:", best, "\n") eps <- TRUE while (eps) { nni_trees <- nni(best_tree) if (multicore) { tmp <- mclapply(nni_trees, fun, tree, mc.cores = mc.cores) tmp <- unlist(tmp) } else tmp <- sapply(nni_trees, fun, tree) if (min(tmp) < best) { ind <- which.min(tmp) best_tree <- nni_trees[[ind]] best <- tmp[ind] if (trace > 0) cat("best score so far:", best, "\n") } else eps <- FALSE } attr(best_tree, "score") <- best best_tree } #' Super Tree methods #' #' These function \code{superTree} allows the estimation of a supertree from a #' set of trees using either Matrix representation parsimony, Robinson-Foulds #' or SPR as criterion. #' #' The function \code{superTree} extends the function mrp.supertree from Liam #' Revells, with artificial adding an outgroup on the root of the trees. This #' allows to root the supertree afterwards. The functions is internally used in #' DensiTree. The implementation for the RF- and SPR-supertree are very basic #' so far and assume that all trees share the same set of taxa. #' #' @param tree an object of class \code{multiPhylo} #' @param method An argument defining which algorithm is used to optimize the #' tree. Possible are "MRP", "RF", and "SPR". #' @param rooted should the resulting supertrees be rooted. #' @param trace defines how much information is printed during optimization. #' @param start a starting tree can be supplied. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use, i.e. at most how many child #' processes will be run simultaneously. #' @param \dots further arguments passed to or from other methods. #' @return The function returns an object of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} Liam Revell #' @seealso \code{mrp.supertree}, \code{\link{densiTree}}, #' \code{\link{RF.dist}}, \code{\link{SPR.dist}} #' @references Baum, B. R., (1992) Combining trees as a way of combining data #' sets for phylogenetic inference, and the desirability of combining gene #' trees. \emph{Taxon}, \bold{41}, 3-10. #' #' Ragan, M. A. (1992) Phylogenetic inference based on matrix representation of #' trees. \emph{Molecular Phylogenetics and Evolution}, \bold{1}, 53-58. #' @keywords cluster #' @examples #' #' data(Laurasiatherian) #' set.seed(1) #' bs <- bootstrap.phyDat(Laurasiatherian, #' FUN = function(x) upgma(dist.hamming(x)), bs=50) #' #' mrp_st <- superTree(bs) #' plot(mrp_st) #' \dontrun{ #' rf_st <- superTree(bs, method = "RF") #' spr_st <- superTree(bs, method = "SPR") #' } #' #' @export superTree superTree <- function(tree, method = "MRP", rooted = FALSE, trace = 0, start = NULL, multicore = FALSE, mc.cores = NULL, ...) { fun <- function(x) { x <- reorder(x, "postorder") nTips <- length(x$tip.label) x$edge[x$edge > nTips] <- x$edge[x$edge > nTips] + 2L l <- nrow(x$edge) oldroot <- x$edge[l, 1L] x$edge <- rbind(x$edge, matrix(c(rep(nTips + 2, 2), oldroot, nTips + 1), 2L, 2L)) x$edge.length <- c(x$edge.length, 100, 100) x$tip.label <- c(x$tip.label, "ZZZ") x$Nnode <- x$Nnode + 1L x } # labels_start <- unique(unlist(lapply(tree, function(x)x$tip.label))) # TODO check for missing labels tmp <- Nnode(tree) if(any(tmp < (3 + !rooted))){ tree_tmp <- tree[ tmp > (2 + !rooted) ] if (length(tree_tmp) == 0) return(consensus(tree)) tree <- tree_tmp } if (method != "MRP") rooted <- FALSE if (!rooted) tree <- unroot(tree) if (method == "MRP" | is.null(start)) { if (rooted) { if (!is.null(attr(tree, "TipLabel"))) tree <- .uncompressTipLabel(tree) tree <- unclass(tree) if (rooted) tree <- lapply(tree, fun) class(tree) <- "multiPhylo" } res <- my.supertree(tree, trace = trace, ...) if (rooted) { if (inherits(res, "multiPhylo")) { res <- lapply(res, root, "ZZZ") res <- lapply(res, drop.tip, "ZZZ") class(res) <- "multiPhylo" } else { res <- root(res, "ZZZ") res <- drop.tip(res, "ZZZ") } } if (inherits(res, "multiPhylo")) { fun <- function(x) { x$edge.length <- rep(.1, nrow(x$edge)) x } res <- lapply(res, fun) res <- lapply(res, reorder, "postorder") class(res) <- "multiPhylo" } else { res$edge.length <- rep(.1, nrow(res$edge)) res <- reorder(res, "postorder") } } if (method == "MRP") return(res) if (is.null(start)) start <- res tree <- unroot(tree) tree <- reorder(tree, "postorder") if (method == "RF") res <- dist.superTree(tree, trace = trace, fun.rf, start = start, multicore = multicore, mc.cores = mc.cores) if (method == "SPR") res <- dist.superTree(tree, trace = trace, fun.spr, start = start, multicore = multicore, mc.cores = mc.cores) res } phangorn/R/F3X4.R0000644000176200001440000000222614140763551013106 0ustar liggesusers# compute frequencies for codon positions # TODO: using baseFreq codon should save memory instead of codon2dna bf_by_codon <- function(x) { y <- codon2dna(x) ny <- sum(attr(y, "weight")) M <- matrix(0, nrow = 4, ncol = 3) M[, 1] <- subset(y, select = seq(1, ny, by = 3), site.patter = FALSE) |> baseFreq() M[, 2] <- subset(y, select = seq(2, ny, by = 3), site.patter = FALSE) |> baseFreq() M[, 3] <- subset(y, select = seq(3, ny, by = 3), site.patter = FALSE) |> baseFreq() M } # return frequencies for all 61 states F3x4_freq <- function(M, CodonAlphabet, nucleotideAlphabet = .nucleotideAlphabet) { pos <- CodonAlphabet |> strsplit("") |> unlist() |> match(nucleotideAlphabet) |> matrix(ncol = 3, byrow = TRUE) codon_frequencies <- M[pos[, 1], 1] * M[pos[, 2], 2] * M[pos[, 3], 3] codon_frequencies / sum(codon_frequencies) } F3x4 <- function(x) { BF <- bf_by_codon(x) codon_abc <- attr(x, "levels") F3x4_freq(BF, CodonAlphabet = codon_abc) } F1x4 <- function(x) { bf <- codon2dna(x) |> baseFreq() BF <- matrix(bf, 4, 3) codon_abc <- attr(x, "levels") F3x4_freq(BF, CodonAlphabet = codon_abc) } phangorn/R/delta.score.R0000644000176200001440000000453113707232051014620 0ustar liggesusers################################################################################ # delta.score ################################################################################ # Calculated from mathematical description given in Gray et al. (2010) Phil. # Trans. Roy. Soc. B. # delta.score reference: Holland et al. (2002) Mol. Biol. Evol. ################################################################################ # Calculating Delta and Q-residual scores # internal delta.quartet <- function(quartet, dist.dna) { m1 <- dist.dna[quartet[1], quartet[2]] + dist.dna[quartet[3], quartet[4]] m2 <- dist.dna[quartet[1], quartet[3]] + dist.dna[quartet[2], quartet[4]] m3 <- dist.dna[quartet[1], quartet[4]] + dist.dna[quartet[2], quartet[3]] m <- sort(c(m1, m2, m3), decreasing = TRUE) if ((m[1] - m[3]) != 0) { ret <- (m[1] - m[2]) / (m[1] - m[3]) } else { ret <- 0 } return(ret) } #' Computes the \eqn{\delta} score #' #' Computes the treelikeness #' #' #' @param x an object of class \code{phyDat} #' @param arg Specifies the return value, one of "all", "mean" or "sd" #' @param ... further arguments passed through \code{dist.hamming} #' @return A vector containing the \eqn{\delta} scores. #' @author Alastair Potts and Klaus Schliep #' @seealso \code{\link{dist.hamming}} #' @references BR Holland, KT Huber, A Dress, V Moulton (2002) \eqn{\delta} #' Plots: a tool for analyzing phylogenetic distance data Russell D. Gray, #' David Bryant, Simon J. Greenhill (2010) On the shape and fabric of human #' history \emph{Molecular Biology and Evolution}, \bold{19(12)} 2051--2059 #' #' Russell D. Gray, David Bryant, Simon J. Greenhill (2010) On the shape and #' fabric of human history \emph{Phil. Trans. R. Soc. B}, \bold{365} #' 3923--3933; DOI: 10.1098/rstb.2010.0162 #' @keywords cluster #' @examples #' #' data(yeast) #' hist(delta.score(yeast, "all")) #' #' @export delta.score delta.score <- function(x, arg = "mean", ...) { dist.dna <- as.matrix(dist.hamming(x, ...)) # Create all quartets all.quartets <- t(combn(names(x), 4)) delta.values <- apply(all.quartets[, ], 1, delta.quartet, dist.dna) if (!arg %in% c("all", "mean", "sd")) stop("return options are: all, mean, or sd") if (arg == "all") return(delta.values) if (arg == "mean") return(mean(delta.values)) if (arg == "sd") return(sd(delta.values)) } phangorn/R/cladePar.R0000644000176200001440000000355314065641202014133 0ustar liggesusers#' Utility function to plot.phylo #' #' cladePar can help you coloring (choosing edge width/type) of clades. #' #' #' @param tree an object of class phylo. #' @param node the node which is the common ancestor of the clade. #' @param edge.color see plot.phylo. #' @param tip.color see plot.phylo. #' @param edge.width see plot.phylo. #' @param edge.lty see plot.phylo. #' @param x the result of a previous call to cladeInfo. #' @param plot logical, if TRUE the tree is plotted. #' @param \dots Further arguments passed to or from other methods. #' @return A list containing the information about the edges and tips. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{plot.phylo}} #' @keywords plot #' @examples #' #' tree <- rtree(10) #' plot(tree) #' nodelabels() #' x <- cladePar(tree, 12) #' cladePar(tree, 18, "blue", "blue", x=x, plot=TRUE) #' #' @export cladePar cladePar <- function(tree, node, edge.color = "red", tip.color = edge.color, edge.width = 1, edge.lty = "solid", x = NULL, plot = FALSE, ...) { if (is.null(x)) { m <- max(tree$edge) x <- list( edge = data.frame( color = rep("black", m), width = rep(1, m), lty = rep("solid", m)), tip = rep("black", length(tree$tip.label)) ) } lty_str <- c("blank", "solid", "dashed", "dotted", "dotdash", "longdash", "twodash") if(is.numeric(edge.lty)) edge.lty <- lty_str[edge.lty + 1] ind <- Descendants(tree, node, "all") x$edge$color[ind] <- edge.color x$edge$width[ind] <- edge.width x$edge$lty[ind] <- edge.lty x[[2]][Descendants(tree, node, "tips")[[1]]] <- tip.color if (plot) { tree <- reorder(tree) plot(tree, edge.color = x$edge$color[tree$edge[, 2]], edge.width = x$edge$width[tree$edge[, 2]], edge.lty = x$edge$lty[tree$edge[, 2]], tip.color = x[[2]], ... ) } else { return(x) } } phangorn/R/pmlMix.R0000644000176200001440000004746013707232051013673 0ustar liggesusersoptimMixQ <- function(object, Q = c(1, 1, 1, 1, 1, 1), omega, ...) { l <- length(Q) Q <- Q[-l] Q <- sqrt(Q) fn <- function(Q, object, omega, ...) { Q <- c(Q^2, 1) weight <- object[[1]]$weight n <- length(omega) p <- length(weight) result <- numeric(p) for (i in 1:n) result <- result + as.numeric(update(object[[i]], Q = Q, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optim(par = Q, fn = fn, gr = NULL, method = "L-BFGS-B", lower = 0, upper = Inf, control = list(fnscale = -1, maxit = 25), object = object, omega = omega, ...) res[[1]] <- c(res[[1]]^2, 1) res } optimMixM1a <- function(object, dnds = 0.1, omega, scaleQ = 1, ...) { weight <- object[[1]]$weight l0 <- object[[2]]$lv * omega[2] fn <- function(dnds, object, omega, weight, l0, scaleQ, ...) { result <- l0 + as.numeric(update(object, dnds = dnds, scaleQ = scaleQ, ...)$lv) * omega[1] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0, 1), object = object[[1]], omega = omega, weight = weight, l0 = l0, scaleQ = scaleQ, lower = 0, upper = 1, maximum = TRUE) res } optimMixM2a <- function(object, dnds_old = c(0.1, 2), omega, scaleQ = 1, ...) { weight <- object[[1]]$weight l2 <- object[[2]]$lv * omega[2] fn <- function(dnds, object, omega, weight, l0, scaleQ, ...) { result <- l0 + as.numeric(update(object, dnds = dnds, scaleQ = scaleQ, ...)$lv) * omega[1] sum(weight %*% log(result)) } l3 <- object[[3]]$lv * omega[3] dnds <- dnds_old for (i in 1:3) { res <- optimize(f = fn, c(0, 1), object = object[[1]], omega = omega, weight = weight, l0 = l2 + l3, scaleQ = scaleQ, lower = 0, upper = 1, maximum = TRUE) dnds[1] <- res[[1]] l1 <- update(object[[1]], dnds = res[[1]], scaleQ = scaleQ)$lv * omega[1] res <- optimize(f = fn, c(1, 10), object = object[[3]], omega = omega, weight = weight, l0 = l2 + l1, scaleQ = scaleQ, lower = 1, upper = 10, maximum = TRUE) dnds[2] <- res[[1]] l3 <- update(object[[3]], dnds = res[[1]], scaleQ = scaleQ)$lv * omega[3] } dnds } optimMixM7 <- function(object, pq = c(1, 1), omega, scaleQ = 1, ...) { weight <- object[[1]]$weight fn <- function(pq, object, omega, weight, scaleQ, ...) { dnds <- discrete.beta(pq[1], pq[2], length(omega)) result <- numeric(length(weight)) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], dnds = dnds[i], scaleQ = scaleQ, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(1, 1), object = object[[1]], omega = omega, weight = weight, scaleQ = scaleQ, lower = c(0, 0), upper = c(10, 10), maximum = TRUE) res } # needs to be included optimMixTSTV <- function(object, tstv = 1, omega, scaleQ = 1, ...) { weight <- object[[1]]$weight fn <- function(tstv, object, omega, weight, scaleQ, ...) { result <- numeric(length(weight)) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], tstv = tstv, scaleQ = scaleQ, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0, 100), object = object, omega = omega, weight = weight, scaleQ=scaleQ, lower = 0, upper = 100, maximum = TRUE) res } optimAllRate <- function(object, rate = 1, omega, ...) { weight <- object[[1]]$weight fn <- function(rate, object, omega, weight, ...) { result <- numeric(length(weight)) for (i in seq_along(object)) result <- result + as.numeric(update(object[[i]], rate = rate, ...)$lv) * omega[i] sum(weight %*% log(result)) } res <- optimize(f = fn, c(0.01, 10), object = object, omega = omega, weight = weight, lower = 0, upper = 100, maximum = TRUE) res } optimMixBf <- function(object, bf = c(.25, .25, .25, .25), omega, ...) { l <- length(bf) nenner <- 1 / bf[l] lbf <- log(bf * nenner) lbf <- lbf[-l] fn <- function(lbf, object, omega, ...) { bf <- exp(c(lbf, 0)) bf <- bf / sum(bf) weight <- object[[1]]$weight p <- length(weight) result <- numeric(p) for (i in seq_along(omega)) result <- result + as.numeric(update(object[[i]], bf = bf, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optim(par = lbf, fn = fn, gr = NULL, method = "Nelder-Mead", control = list(fnscale = -1, maxit = 500), object, omega = omega, ...) bf <- exp(c(res[[1]], 0)) bf <- bf / sum(bf) } optimMixInv <- function(object, inv = 0.01, omega, ...) { fn <- function(inv, object, omega, ...) { weight <- object[[1]]$weight p <- length(weight) result <- numeric(p) for (i in seq_along(omega)) result <- result + as.numeric(update(object, inv = inv, ...)$lv) * omega[i] result <- sum(weight %*% log(result)) result } res <- optimize(f = fn, interval = c(0, 1), lower = 0, upper = 1, maximum = TRUE, tol = .0001, object, omega = omega, ...) res[[1]] } optimMixRate <- function(fits, ll, weight, omega, rate = rep(1, length(fits))) { r <- length(fits) rate0 <- c(rate[1], diff(rate)) rate0[rate0 < 1e-8] <- 1e-8 # required by constrOptim R <- matrix(0, r, r) R[lower.tri(R, TRUE)] <- 1 fn <- function(rate, fits, ll, weight, omega, R) { rate <- as.vector(R %*% rate) r <- length(rate) for (i in 1:r) fits[[i]] <- update(fits[[i]], rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv sum(weight * log(ll %*% omega)) } ui <- rbind(R, diag(4)) ci <- rep(0, 2 * r) # Maybe constrain rates * omega res <- constrOptim(rate0, fn, grad = NULL, ui = ui, ci = ci, mu = 1e-04, control = list(fnscale = -1), method = "Nelder-Mead", outer.iterations = 100, outer.eps = 1e-08, fits = fits, ll = ll, weight = weight, omega = omega, R=R) rate <- res[[1]] res[[1]] <- as.vector(R %*% rate) res } optW <- function(ll, weight, omega, ...) { k <- length(omega) nenner <- 1 / omega[1] eta <- log(omega * nenner) eta <- eta[-1] fn <- function(eta, ll, weight) { eta <- c(0, eta) p <- exp(eta) / sum(exp(eta)) res <- sum(weight * log(ll %*% p)) res } if (k == 2) res <- optimize(f = fn, interval = c(-3, 3), lower = -3, upper = 3, maximum = TRUE, tol = .Machine$double.eps^0.25, ll = ll, weight = weight) else res <- optim(eta, fn = fn, method = "L-BFGS-B", lower = -5, upper = 5, control = list(fnscale = -1, maxit = 25), gr = NULL, ll = ll, weight = weight) p <- exp(c(0, res[[1]])) p <- p / sum(p) result <- list(par = p, value = res[[2]]) result } optimMixEdge <- function(object, omega, trace = 1, ...) { tree <- object[[1]]$tree theta <- object[[1]]$tree$edge.length weight <- as.numeric(attr(object[[1]]$data, "weight")) n <- length(omega) p <- length(weight) q <- length(theta) lv1 <- numeric(p) for (i in 1:n) lv1 <- lv1 + as.numeric(object[[i]]$lv) * omega[i] ll0 <- sum(weight * log(lv1)) eps <- 1 iter <- 0 scalep <- 1 if (trace > 0) cat(ll0) while (abs(eps) > .001 & iter < 10) { dl <- matrix(0, p, q) for (i in 1:n) dl <- dl + dl(object[[i]], TRUE) * omega[i] dl <- dl / lv1 sc <- colSums(weight * dl) F <- crossprod(dl * weight, dl) + diag(q) * 1e-6 blub <- TRUE iter2 <- 0 while (blub & iter2 < 10) { thetaNew <- log(theta) + scalep * solve(F, sc) tree$edge.length <- as.numeric(exp(thetaNew)) for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) lv1 <- numeric(p) for (i in 1:n) lv1 <- lv1 + as.numeric(object[[i]]$lv) * omega[i] ll1 <- sum(weight * log(lv1)) eps <- ll1 - ll0 if (eps < 0 || is.nan(eps)) { scalep <- scalep / 2 eps <- 1 thetaNew <- log(theta) ll1 <- ll0 iter2 <- iter2 + 1 } else { scalep <- 1 theta <- exp(thetaNew) blub <- FALSE } } iter <- iter + 1 ll0 <- ll1 } tree$edge.length <- theta for (i in 1:n) object[[i]] <- update(object[[i]], tree = tree) if (trace > 0) cat("->", ll1, "\n") object } #' Phylogenetic mixture model #' #' Phylogenetic mixture model. #' #' The \code{formula} object allows to specify which parameter get optimized. #' The formula is generally of the form \code{edge + bf + Q ~ rate + shape + #' \dots{}}, on the left side are the parameters which get optimized over all #' mixtures, on the right the parameter which are optimized specific to each #' mixture. The parameters available are \code{"nni", "bf", "Q", "inv", #' "shape", "edge", "rate"}. Each parameters can be used only once in the #' formula. \code{"rate"} and \code{"nni"} are only available for the right #' side of the formula. On the other hand parameters for invariable sites are #' only allowed on the left-hand side. The convergence of the algorithm is #' very slow and is likely that the algorithm can get stuck in local optima. #' #' @aliases pmlMix #' @param formula a formula object (see details). #' @param fit an object of class \code{pml}. #' @param m number of mixtures. #' @param omega mixing weights. #' @param control A list of parameters for controlling the fitting process. #' @param \dots Further arguments passed to or from other methods. #' @return \code{pmlMix} returns a list with elements #' \item{logLik}{log-likelihood of the fit} \item{omega}{mixing weights.} #' \item{fits}{fits for the final mixtures.} #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{pml}},\code{\link{pmlPart}},\code{\link{pmlCluster}} #' @keywords cluster #' @examples #' #' \dontrun{ #' X <- allSitePattern(5) #' tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") #' fit <- pml(tree,X, k=4) #' weights <- 1000*exp(fit$siteLik) #' attr(X, "weight") <- weights #' fit1 <- update(fit, data=X, k=1) #' fit2 <- update(fit, data=X) #' #' (fitMixture <- pmlMix(edge~rate, fit1 , m=4)) #' (fit2 <- optim.pml(fit2, optGamma=TRUE)) #' #' #' data(Laurasiatherian) #' dm <- dist.logDet(Laurasiatherian) #' tree <- NJ(dm) #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit) #' #' fit2 <- update(fit, k=4) #' fit2 <- optim.pml(fit2, optGamma=TRUE) #' #' fitMix <- pmlMix(edge ~ rate, fit, m=4) #' fitMix #' #' #' # #' # simulation of mixture models #' # #' \dontrun{ #' X <- allSitePattern(5) #' tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") #' tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") #' tree1 <- unroot(tree1) #' tree2 <- unroot(tree2) #' fit1 <- pml(tree1,X) #' fit2 <- pml(tree2,X) #' #' weights <- 2000*exp(fit1$siteLik) + 1000*exp(fit2$siteLik) #' attr(X, "weight") <- weights #' #' fit1 <- pml(tree1, X) #' fit2 <- optim.pml(fit1) #' logLik(fit2) #' AIC(fit2, k=log(3000)) #' #' fitMixEdge <- pmlMix( ~ edge, fit1, m=2) #' logLik(fitMixEdge) #' AIC(fitMixEdge, k=log(3000)) #' #' fit.p <- pmlPen(fitMixEdge, .25) #' logLik(fit.p) #' AIC(fit.p, k=log(3000)) #' } #' } #' #' @export pmlMix pmlMix <- function(formula, fit, m = 2, omega = rep(1 / m, m), control = pml.control(epsilon = 1e-8, maxit = 20, trace = 1), ...) { call <- match.call() form <- phangornParseFormula(formula) opt <- c("nni", "bf", "Q", "inv", "shape", "edge", "rate", "M1a", "M2a") optAll <- match(opt, form$left) optPart <- match(opt, form$right) AllBf <- !is.na(optAll[2]) AllQ <- !is.na(optAll[3]) AllInv <- !is.na(optAll[4]) AllGamma <- !is.na(optAll[5]) AllEdge <- !is.na(optAll[6]) AllRate <- !is.na(optAll[7]) MixNni <- !is.na(optPart[1]) MixBf <- !is.na(optPart[2]) MixQ <- !is.na(optPart[3]) MixInv <- !is.na(optPart[4]) MixGamma <- !is.na(optPart[5]) MixEdge <- !is.na(optPart[6]) MixRate <- !is.na(optPart[7]) M1a <- !is.na(optPart[8]) M2a <- !is.na(optPart[9]) if (inherits(fit, "pmlMix")){ fits <- fit$fits omega <- fit$omega } if (inherits(fit, "list")) fits <- fit if (inherits(fit, "pml")) { fits <- vector("list", m) for (i in 1:m) fits[[i]] <- fit } dat <- fits[[1]]$data p <- attr(dat, "nr") weight <- attr(dat, "weight") r <- m ll <- matrix(0, p, r) for (i in 1:r) ll[, i] <- fits[[i]]$lv for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } if (MixRate) rate <- rep(1, r) dnds <- NULL CODON <- FALSE if (M1a) { dnds <- c(fits[[1]]$dnds, fits[[2]]$dnds) CODON <- TRUE codon <- "M1a" } if (M2a) { dnds <- c(fits[[1]]$dnds, 1, fits[[3]]$dnds) CODON <- TRUE codon <- "M2a" } llstart <- sum(weight * log(ll %*% omega)) llold <- llstart ll_tmp <- llstart ll3 <- ll1 <- llstart eps0 <- 1 iter0 <- 0 trace <- control$trace on.exit({ parameter <- c(AllBf = AllBf, AllQ = AllQ, AllInv = AllInv, AllGamma = AllGamma, AllEdge = AllEdge, MixNni = MixNni, MixBf = MixBf, MixQ = MixQ, MixInv = MixInv, MixGamma = MixGamma, MixEdge = MixEdge, MixRate = MixRate) df <- matrix(1, 6, 2) colnames(df) <- c("#df", "group") rownames(df) <- c("Edge", "Shape", "Inv", "Bf", "Q", "Rate") df[1, 1] <- length(fits[[1]]$tree$edge.length) df[2, 1] <- fits[[1]]$k > 1 df[3, 1] <- fits[[1]]$inv > 0 df[4, 1] <- length(unique(fits[[1]]$bf)) - 1 df[5, 1] <- length(unique(fits[[1]]$Q)) - 1 df[6, 1] <- 0 if (MixEdge) df[1, 2] <- r if (MixGamma) df[2, 2] <- r if (MixInv) df[3, 2] <- r if (MixBf) df[4, 2] <- r if (MixQ) df[5, 2] <- r if (MixRate) df[6, 1] <- r - 1 attr(logLik, "df") <- sum(df[, 1] * df[, 2]) converge <- c(iter = iter0, eps = eps0) if (CODON){ if(M1a) df[5,1] <- 3 if(M2a) df[5,1] <- 5 df[4, 1] <- df_freq_codon(fits[[1]]$frequencies) result <- list(logLik = ll1, omega = omega, fits = fits, call = call, converge = converge, parameter = parameter, df = df, dnds = dnds, codon = codon) } else result <- list(logLik = ll1, omega = omega, fits = fits, call = call, converge = converge, parameter = parameter, df = df) class(result) <- "pmlMix" return(result) }) while (eps0 > control$eps & iter0 < control$maxit) { eps1 <- 100 iter1 <- 0 if (AllQ) { newQ <- optimMixQ(fits, Q = fits[[1]]$Q, omega = omega)[[1]] for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], Q = newQ) } if (AllBf) { newBf <- optimMixBf(fits, bf = fits[[1]]$bf, omega = omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], bf = newBf) } if (AllInv) { newInv <- optimMixInv(fits, inv = fits[[1]]$inv, omega = omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], Inv = newInv) } if (AllRate) { newrate <- optimAllRate(fits, rate=1, omega) for (i in seq_len(m)) fits[[i]] <- update(fits[[i]], rate = newrate[[1]]) } if (M1a) { tmp <- optimMixM1a(fits, dnds[1], omega, scaleQ = 1) fits[[1]] <- update(fits[[1]], dnds = tmp[[1]], scaleQ = 1) dnds[1] <- tmp[[1]] ll[, 1] <- fits[[1]]$lv } if (M2a) { tmp <- optimMixM2a(fits, dnds[c(1, 3)], omega, scaleQ = 1) # [[1]] fits[[1]] <- update(fits[[1]], dnds = tmp[1], scaleQ = 1) fits[[3]] <- update(fits[[3]], dnds = tmp[2], scaleQ = 1) dnds[c(1, 3)] <- tmp } if (CODON) { tstv <- fits[[2]]$tstv tmp <- optimMixTSTV(fits, tstv, omega, scaleQ = 1) for (i in seq_len(m)) { fits[[i]] <- update(fits[[i]], tstv = tmp[[1]], scaleQ = 1) } tstv <- tmp[[1]] } if (AllEdge) fits <- optimMixEdge(fits, omega, trace = trace - 1) for (i in 1:r) ll[, i] <- fits[[i]]$lv if (MixRate) { res <- optimMixRate(fits, ll, weight, omega, rate) if(res[[2]] > ll1){ rate <- res[[1]] blub <- sum(rate * omega) rate <- rate / blub tree <- fits[[1]]$tree tree$edge.length <- tree$edge.length * blub for (i in 1:r) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv if (trace > 0) cat("optimize rates: ", ll1, "-->", res[[2]], "\n rates", rate, "\n") ll1 <- res[[2]] } } if (any(c(MixNni, MixBf, MixQ, MixInv, MixGamma, MixEdge))) { while (abs(eps1) > 0.001 & iter1 < 3) { for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- optim.pml(fits[[i]], optNni = MixNni, optBf = MixBf, optQ = MixQ, optInv = MixInv, optGamma = MixGamma, optEdge = MixEdge, optRate = FALSE, control = pml.control(epsilon = 1e-8, maxit = 3, trace - 1), llMix = pl0, wMix = omega[i]) ll[, i] <- fits[[i]]$lv res <- optW(ll, weight, omega) omega <- res$p if (MixRate) { blub <- sum(rate * omega) rate <- rate / blub tree <- fits[[1]]$tree tree$edge.length <- tree$edge.length * blub for (i in 1:r){ fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i]) ll[, i] <- fits[[i]]$lv } } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } } ll2 <- sum(weight * log(ll %*% omega)) eps1 <- llold - ll2 iter1 <- iter1 + 1 llold <- ll2 } } res <- optW(ll, weight, omega) omega <- res$p if (MixRate) { blub <- sum(rate * omega) rate <- rate / blub tree <- fits[[1]]$tree tree$edge.length <- tree$edge.length * blub for (i in 1:r) fits[[i]] <- update(fits[[i]], tree = tree, rate = rate[i]) for (i in 1:r) ll[, i] <- fits[[i]]$lv } for (i in 1:r) { pl0 <- ll[, -i, drop = FALSE] %*% omega[-i] fits[[i]] <- update(fits[[i]], llMix = pl0, wMix = omega[i]) } ll1 <- sum(weight * log(ll %*% omega)) eps0 <- (ll3 - ll1) / ll1 iter0 <- iter0 + 1 if (trace > 0) { cat("iteration:", iter0, "\n") cat("omega:", omega, "\n") cat("log-likelihood:", ll3, "==>", ll1, "\n") } ll3 <- ll1 } } #' @export print.pmlMix <- function(x, ...) { nc <- attr(x$fits[[1]]$data, "nc") nr <- attr(x$fits[[1]]$data, "nr") levels <- attr(x$fits[[1]]$data, "levels") r <- length(x$fits) w <- x$fits[[1]]$weight w <- w[w > 0] type <- attr(x$fits[[1]]$data, "type") nc <- attr(x$fits[[1]]$data, "nc") ll0 <- sum(w * log(w / sum(w))) bf <- matrix(0, r, nc) dimnames(bf) <- list(1:r, levels) Q <- matrix(0, r, nc * (nc - 1) / 2) dimnames(Q) <- list(1:r, NULL) rate <- numeric(r) inv <- x$fits[[1]]$inv shape <- numeric(r) for (i in 1:r) { bf[i, ] <- x$fits[[i]]$bf Q[i, ] <- x$fits[[i]]$Q rate[i] <- x$fits[[i]]$rate shape[i] <- x$fits[[i]]$shape } cat("\nloglikelihood:", x$logLik, "\n") cat("\nunconstrained loglikelihood:", ll0, "\n") cat("AIC: ", AIC(x), " BIC: ", AIC(x, k = log(nr)), "\n\n") cat("\nposterior:", x$omega, "\n") if (inv > 0) cat("Proportion of invariant sites:", inv, "\n") cat("\nRates:\n") cat(rate, "\n") if (length(bf) < 21) { cat("\nBase frequencies: \n") print(bf) cat("\nRate matrix:\n") print(Q) } } #' @export logLik.pmlMix <- function(object, ...) { res <- object$logLik attr(res, "df") <- sum(object$df[, 1] * object$df[, 2]) class(res) <- "logLik" res } phangorn/R/read.nexus.splits.R0000644000176200001440000004000114140463456016005 0ustar liggesusers## @aliases read.nexus.splits write.nexus.splits write.splits ## read.nexus.networx write.nexus.networx #' Function to import and export splits and networks #' #' \code{read.nexus.splits}, \code{write.nexus.splits}, \code{read.nexus.networx}, \code{write.nexus.networx} #' can be used to import and export splits and networks with nexus format #' and allow to exchange these object with other software like SplitsTree. #' \code{write.splits} returns a human readable output. #' #' @param file a file name. #' @param obj An object of class splits. #' @param weights Edge weights. #' @param taxa logical. If TRUE a taxa block is added #' @param append logical. If TRUE the nexus blocks will be added to a file. #' @param splits logical. If TRUE the nexus blocks will be added to a file. #' @param x An object of class splits. #' @param zero.print character which should be printed for zeros. #' @param one.print character which should be printed for ones. #' @param print.labels logical. If TRUE labels are printed. #' @param \dots Further arguments passed to or from other methods. #' @param labels names of taxa. #' @return \code{write.nexus.splits} and \code{write.nexus.networx} write out #' the \code{splits} and \code{networx} object to read with #' other software like SplitsTree. #' \code{read.nexus.splits} and \code{read.nexus.networx} return an \code{splits} #' and \code{networx} object. #' @note \code{read.nexus.splits} reads in the splits block of a nexus file. It #' assumes that different co-variables are tab delimited and the bipartition #' are separated with white-space. Comments in square brackets are ignored. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{prop.part}}, \code{\link{lento}}, #' \code{\link{as.splits}}, \code{\link{as.networx}} #' @keywords cluster #' @examples #' #' (sp <- as.splits(rtree(5))) #' write.nexus.splits(sp) #' spl <- allCircularSplits(5) #' plot(as.networx(spl), "2D") #' write.splits(spl, print.labels = FALSE) #' #' @rdname read.nexus.splits #' @export read.nexus.splits <- function(file) { X <- scan(file = file, what = "", sep = "\n", quiet = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments i1 <- grep("TAXLABELS", X, ignore.case = TRUE) taxlab <- ifelse(length(i1) > 0, TRUE, FALSE) if (taxlab) { end <- semico[semico >= i1][1] x <- X[(i1):end] # assumes not a 'new line' after "TRANSLATE" x <- gsub("TAXLABELS", "", x, ignore.case = TRUE) x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\"]", "", x) } sp <- grep("SPLITS;", X, ignore.case = TRUE) spEnd <- grep("END;", X, ignore.case = TRUE) spEnd <- spEnd[spEnd > sp][1] dims <- grep("DIMENSION", X, ignore.case = TRUE) cyc <- grep("CYCLE", X, ignore.case = TRUE) matr <- grep("MATRIX", X, ignore.case = TRUE) format <- grep("FORMAT", X, ignore.case = TRUE) start <- matr[matr > sp][1] + 1 end <- semico[semico > start][1] - 1 format <- format[(format > sp) & (format < spEnd)] res <- vector("list", end - start + 1) weights <- numeric(end - start + 1) j <- 1 flab <- fwei <- fcon <- fint <- FALSE if (length(format) > 0) { tmp <- X[format] tmp <- gsub("\\;", "", tmp) tmp <- gsub("\\s+", "", tmp) flab <- grepl("labels=left", tmp, ignore.case = TRUE) fwei <- grepl("weights=yes", tmp, ignore.case = TRUE) fcon <- grepl("confidences=yes", tmp, ignore.case = TRUE) fint <- grepl("intervals=yes", tmp, ignore.case = TRUE) ind <- cumsum(c(flab, fwei, fcon, fint)) mformat <- sum(c(flab, fwei, fcon, fint)) } if (fint) intervals <- numeric(end - start + 1) if (fcon) confidences <- numeric(end - start + 1) if (flab) labels <- vector("character", end - start + 1) for (i in start:end) { tmp <- X[i] tmp <- sub("\\s+", "", tmp) tmp <- strsplit(tmp, "\t")[[1]] if (flab) { labels[j] <- gsub("'", "", tmp[ind[1]]) |> as.numeric() } if (fwei) weights[j] <- as.numeric(tmp[ind[2]]) if (fcon) confidences[j] <- as.numeric(tmp[ind[3]]) if (fint) intervals[j] <- as.numeric(tmp[ind[4]]) tmp <- tmp[length(tmp)] tmp <- gsub("\\,", "", tmp) res[[j]] <- as.integer(na.omit(as.numeric(strsplit(tmp, " ")[[1]]))) j <- j + 1 } if (length(cyc) > 0) { tmp <- X[cyc] tmp <- gsub("\\;", "", tmp) tmp <- gsub("CYCLE", "", tmp, ignore.case = TRUE) tmp <- sub("\\s+", "", tmp) cyc <- as.integer(na.omit(as.numeric(strsplit(tmp, " ")[[1]]))) } attr(res, "labels") <- x if (fwei) attr(res, "weights") <- weights if (fint) attr(res, "intervals") <- intervals if (fcon) attr(res, "confidences") <- confidences if (flab) attr(res, "splitlabels") <- labels attr(res, "cycle") <- cyc class(res) <- "splits" res } #' @rdname read.nexus.splits #' @export write.nexus.splits <- function(obj, file = "", weights = NULL, taxa = TRUE, append = FALSE) { taxa.labels <- attr(obj, "labels") ntaxa <- length(taxa.labels) obj <- ONEwise(obj) ind <- which(lengths(obj) == ntaxa) if (length(ind)) obj <- obj[-ind] nsplits <- length(obj) if (is.null(weights)) weight <- attr(obj, "weights") if (is.null(weight)) fwei <- FALSE else fwei <- TRUE if (!append) { cat("#NEXUS\n\n", file = file) cat("[Splits block for Spectronet or SplitsTree]\n", file = file, append = TRUE) cat("[generated by phangorn", packageDescription("phangorn", fields = "Version"), "]\n\n", file = file, append = TRUE) } # TAXON BLOCK if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS ntax=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) cat("\tTAXLABELS", paste(taxa.labels, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } # SPLITS BLOCK cat(paste("BEGIN SPLITS;\n\tDIMENSIONS ntax=", ntaxa, " nsplits=", nsplits, ";\n", sep = ""), file = file, append = TRUE) format <- "\tFORMAT labels=left" if (fwei) format <- paste(format, "weights=yes") else format <- paste(format, "weights=no") fcon <- fint <- flab <- FALSE if (!is.null(attr(obj, "confidences"))) { format <- paste(format, "confidences=yes") fcon <- TRUE conf <- attr(obj, "confidences") if (any(is.na(conf))) { conf[is.na(conf)] <- 0 attr(obj, "confidences") <- conf } if (storage.mode(conf) == "character") { conf[conf == ""] <- "0" attr(obj, "confidences") <- conf } } else format <- paste(format, "confidences=no") if (!is.null(attr(obj, "intervals"))) { format <- paste(format, "intervals=yes") fint <- TRUE } else format <- paste(format, "intervals=no") if (!is.null(attr(obj, "splitlabels"))) flab <- TRUE format <- paste(format, ";\n", sep = "") cat(format, file = file, append = TRUE) if (!is.null(attr(obj, "cycle"))) { cycle <- paste(attr(obj, "cycle"), collapse = " ") cat("\tCYCLE\t", cycle, ";\n", sep = "", file = file, append = TRUE) } cat("\tMATRIX\n", file = file, append = TRUE) for (i in 1:nsplits) { slab <- ifelse(flab, attr(obj, "splitlabels")[i], i) swei <- ifelse(fwei, paste(weight[i], "\t"), "") scon <- ifelse(fcon, paste(attr(obj, "confidences")[i], "\t"), "") sint <- ifelse(fint, paste(attr(obj, "intervals")[i], "\t"), "") cat("\t\t", slab, "\t", swei, scon, sint, paste(obj[[i]], collapse = " "), ",\n", file = file, append = TRUE, sep = "") } cat("\t;\nEND;\n", file = file, append = TRUE) } #' @rdname read.nexus.splits #' @export write.nexus.networx <- function(obj, file = "", taxa = TRUE, splits = TRUE, append = FALSE) { if (!append) { cat("#NEXUS\n\n", file = file) cat("[Network block for Spectronet or SplitsTree]\n", file = file, append = TRUE) cat("[generated by phangorn", packageDescription("phangorn", fields = "Version"), "]\n\n", file = file, append = TRUE) } ntaxa <- length(obj$tip.label) # TAXON BLOCK if (taxa) { cat(paste("BEGIN TAXA;\n\tDIMENSIONS NTAX=", ntaxa, ";\n", sep = ""), file = file, append = TRUE) if (splits) taxalabel <- attr(obj$splits, "labels") else taxalabel <- obj$tip.label cat("\tTAXLABELS", paste(taxalabel, sep = " "), ";\nEND;\n\n", file = file, append = TRUE) } # SPLITS BLOCK spl <- obj$splits if (splits) { write.nexus.splits(spl, file = file, weights = NULL, append = TRUE, taxa = FALSE) } nvertices <- max(obj$edge) # if(is.null(attr(obj, "coords"))) if (is.null(obj$.plot$vertices)) vertices <- coords(obj, "2D") else vertices <- obj$.plot$vertices # y-axis differs between R and SplitsTree vertices[, 2] <- -vertices[, 2] if (is.null(obj$.plot)) edge.col <- obj$.plot$edge.color else edge.col <- NULL nedges <- nrow(obj$edge) # NETWORK BLOCK cat(paste("BEGIN NETWORK;\nDIMENSIONS ntax=", ntaxa, "\tnvertices=", nvertices, "\tnedges=", nedges, ";\n", sep = ""), file = file, append = TRUE) cat("DRAW to_scale;\n", file = file, append = TRUE) cat("TRANSLATE\n", file = file, append = TRUE) if (is.null(obj$translate)) { for (i in 1:ntaxa) { cat(i, " ", obj$tip.label[i], ",\n", sep = "", file = file, append = TRUE) } } else { translate <- obj$translate for (i in seq_along(translate$label)) { cat(translate$node[i], " ", translate$label[i], ",\n", sep = "", file = file, append = TRUE) } } cat(";\nVERTICES\n", file = file, append = TRUE) for (i in 1:nvertices) { cat(i, "\t", vertices[i, 1], "\t", vertices[i, 2], ",\n", sep = "", file = file, append = TRUE) } if (!is.null(obj$tip.label)) { cat(";\nVLABELS\n", file = file, append = TRUE) if (is.null(obj$translate)) { for (i in 1:ntaxa) { cat(i, "\t", obj$tip.label[i], ",\n", sep = "", file = file, append = TRUE) } } else { for (i in seq_along(translate$node)) { cat(translate$node[i], " ", translate$label[i], ",\n", sep = "", file = file, append = TRUE) } } } # cnet$splitIndex if splits = TRUE cat(";\nEDGES\n", file = file, append = TRUE) if (is.null(obj$.plot$edge.color)) edge.col <- "black" else edge.col <- obj$.plot$edge.color if (length(edge.col) < nedges) edge.col <- rep(edge.col, length = nedges) splI <- TRUE if (is.null(obj$splitIndex)) splI <- FALSE for (i in 1:nedges) { ecoli <- edge.col[i] spInd <- ifelse(splI, paste("\ts=", obj$splitIndex[i], sep = ""), "") edgeCol <- ifelse(ecoli == "black", "", paste("\tfg=", paste(col2rgb(ecoli), collapse = " "), sep = "")) cat(i, "\t", obj$edge[i, 1], "\t", obj$edge[i, 2], spInd, edgeCol, ",\n", sep = "", file = file, append = TRUE) } cat(";\n", file = file, append = TRUE) cat("END;\n", file = file, append = TRUE) # force SplitsTree to accept the file cat("\nBEGIN st_Assumptions;\n uptodate;\nEND; [st_Assumptions]\n", file = file, append = TRUE) } #' @rdname read.nexus.splits #' @export read.nexus.networx <- function(file, splits = TRUE) { spl <- NULL if (splits) spl <- read.nexus.splits(file) X <- scan(file = file, what = "", sep = "\n", quiet = TRUE) semico <- grep(";", X) X <- gsub("\\[(.*?)\\]", "", X) # get rid of comments netStart <- grep("BEGIN NETWORK;", X, ignore.case = TRUE) netEnd <- grep("END;", X, ignore.case = TRUE) netEnd <- netEnd[netEnd > netStart][1] dims <- grep("DIMENSION", X, ignore.case = TRUE) dims <- dims[(dims > netStart) & (dims < netEnd)] ntaxa <- 0 nvertices <- 0 nedges <- 0 if (length(dims) > 0) { tmp <- X[dims] tmp <- gsub("\\s+", "", tmp) ntaxa <- as.numeric(sub("(.+?)(ntax\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) nvertices <- as.numeric(sub("(.+?)(nvertices\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) nedges <- as.numeric(sub("(.+?)(nedges\\s*\\=\\s*)(\\d+)(.+)", "\\3", tmp, perl = TRUE, ignore.case = TRUE)) } transl <- grep("TRANSLATE", X, ignore.case = TRUE) translation <- if (length(transl) == 1 && transl > netStart) TRUE else FALSE translate.nodes <- FALSE if (translation) { end <- semico[semico > transl][1] x <- X[(transl + 1):end] x <- unlist(strsplit(x, "[,; \t]")) x <- x[nzchar(x)] x <- gsub("['\']", "", x) if (length(x) == 2 * ntaxa) { TRANS <- matrix(x, ncol = 2, byrow = TRUE) TRANS[, 2] <- gsub("['\"]", "", TRANS[, 2]) TRANS <- list(node = as.numeric(TRANS[, 1]), label = TRANS[, 2]) } else { y <- as.numeric(x) node <- numeric(ntaxa) label <- character(ntaxa) k <- 1 for (i in seq_along(x)) { if (!is.na(y[i])) tmp <- y[i] else { node[k] <- tmp label[k] <- x[i] k <- k + 1 } } TRANS <- list(node = node, label = label) } } vert <- grep("VERTICES", X, ignore.case = TRUE) start <- vert[vert > max(dims, netStart)][1] + 1 end <- semico[semico > start][1] - 1 VERT <- matrix(0, nvertices, 3, dimnames = list(NULL, c("id", "x", "y"))) j <- 1 for (i in start:end) { tmp <- X[i] tmp <- gsub("\\,", "", tmp) tmp <- strsplit(tmp, "[[:space:]]")[[1]] VERT[j, 1] <- as.numeric(tmp[1]) VERT[j, 2] <- as.numeric(tmp[2]) VERT[j, 3] <- as.numeric(tmp[3]) j <- j + 1 } edges <- grep("EDGES", X, ignore.case = TRUE) start <- edges[edges > max(dims, netStart)][1] + 1 end <- semico[semico > start][1] - 1 EDGE <- NULL if (splits) EDGE <- matrix(0, nedges, 4, dimnames = list(NULL, c("id", "vert_id_2", "vert_id_2", "splits_id"))) else EDGE <- matrix(0, nedges, 3, dimnames = list(NULL, c("id", "vert_id_2", "vert_id_2"))) j <- 1 for (i in start:end) { tmp <- X[i] tmp <- gsub("\\,", "", tmp) tmp <- strsplit(tmp, "[[:space:]]")[[1]] EDGE[j, 1] <- as.numeric(tmp[1]) EDGE[j, 2] <- as.numeric(tmp[2]) EDGE[j, 3] <- as.numeric(tmp[3]) if (splits) { EDGE[j, 4] <- as.numeric(sub("s=", "", tmp[4], ignore.case = TRUE)) } j <- j + 1 } swapEdge <- function(x, old, new) { x[x == new] <- -1L x[x == old] <- new x[x == -1L] <- old x } swapRow <- function(x, old, new) { tmp <- x[old, ] x[old, ] <- x[new, ] x[new, ] <- tmp x } splitIndex <- if (ncol(EDGE) == 4) EDGE[, 4] else NULL # quick and dirty el <- sqrt(rowSums( (VERT[EDGE[, 2], c(2:3)] - VERT[EDGE[, 3], c(2:3)])^2)) edge <- EDGE[, c(2:3)] vert <- VERT[, c(2:3)] if (translate.nodes) { oldLabel <- as.integer(TRANS$node) for (i in 1:ntaxa) { edge <- swapEdge(edge, oldLabel[i], i) vert <- swapRow(vert, oldLabel[i], i) } } dimnames(edge) <- NULL # y-axis differs between in R and SplitsTree vert[, 2] <- -vert[, 2] obj <- list(edge = edge, tip.label = TRANS$label, edge.length = el, Nnode = max(edge) - ntaxa, splitIndex = splitIndex, splits = spl, translate = TRANS) obj$.plot <- list(vertices = vert, edge.color = "black", edge.width = 3, edge.lty = 1) class(obj) <- c("networx", "phylo") reorder(obj) obj } #' @rdname read.nexus.splits #' @export write.splits <- function(x, file = "", zero.print = ".", one.print = "|", print.labels = TRUE, ...) { labels <- attr(x, "labels") cx <- as.matrix(x, zero.print = zero.print, one.print = one.print) w <- FALSE if (!is.null(attr(x, "names"))) { nam <- TRUE vnames <- format(attr(x, "names")) } nam <- FALSE if (!is.null(attr(x, "weights"))) { w <- TRUE weight <- format(attr(x, "weights")) } d <- FALSE if (!is.null(attr(x, "data"))) { d <- TRUE data <- attr(x, "data") } if (print.labels) { for (i in seq_along(labels)) cat(labels[i], "\n", file = file, append = TRUE) } if (w) cat("weight", "\t", file = file, append = TRUE) if (d) cat(paste(colnames(data), "\t"), file = file, append = TRUE) cat("\n", file = file, append = TRUE) # "Matrix", for (i in seq_along(x)) { if (nam) cat(vnames[i], "\t", file = file, append = TRUE) if (d) cat(paste(data[i, ], "\t"), file = file, append = TRUE) if (w) cat(weight[i], "\t", file = file) cat("\n", paste(cx[i, ], collapse = ""), "\n", file = file, append = TRUE) } } phangorn/R/phyDat2.R0000644000176200001440000002446514140203621013731 0ustar liggesusersgrp_duplicated <- function(x, MARGIN = 1, factor=FALSE, fromLast = FALSE, ...) { ans <- .Call(grpDupAtomMat, x, as.integer(MARGIN), as.logical(fromLast)) if(fromLast) ans[] <- (attr(ans, 'nlevels'):1L)[ans] # ensure the group ids agree with row/col index of result from "unique" if(factor) { attr(ans, 'levels') <- as.character(seq_len(attr(ans, 'nlevels'))) class(ans) <- 'factor' } ans } phyDat.DNA <- function (data, return.index = TRUE, compress = TRUE){ if (is.matrix(data)) nam <- row.names(data) else nam <- names(data) if(inherits(data, "list")) data <- as.data.frame(data) if(inherits(data, "data.frame")) data <- t(as.matrix(data)) if(inherits(data, "character")){ data <- as.matrix(data) } if (inherits(data,"DNAbin")){ if(is.list(data)) data <- as.matrix(data) } if(mode(data)=="character") data <- tolower(data) ac <- c("a", "c", "g", "t", "u", "m", "r", "w", "s", "y", "k", "v", "h", "d", "b", "n", "?", "-") AC <- matrix(c(c(1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1), c(0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1), c(0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1), c(0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1)), 18, 4, dimnames = list(NULL, c("a", "c", "g", "t"))) if(ncol(data)==1) compress <- FALSE if(compress){ index <- grp_duplicated(data, MARGIN=2) attr(index, "nlevels") <- NULL weight <- tabulate(index, max(index)) ind <- which(!duplicated(index)) } else{ p <- ncol(data) weight <- rep(1, p) index <- ind <- 1:p } n <- nrow(data) res <- vector("list", nrow(data)) ind_na <- logical(length(weight)) if(inherits(data,"DNAbin")){ cs <- rep(NA_integer_, 256) # from ape ._bs_ and ._cs_ .cs <- c("a", "g", "c", "t", "r", "m", "w", "s", "k", "y", "v", "h", "d", "b", "n", "-", "?") .bs <- c(136, 72, 40, 24, 192, 160, 144, 96, 80, 48, 224, 176, 208, 112, 240, 4, 2) cs[.bs] <- match(.cs, ac) for(i in seq_len(n)){ res[[i]] <- cs[ as.integer(data[i, ind]) ] # maybe check for NAs # ind_na[is.na(res[[i]])] <- TRUE } } else { for(i in seq_len(n)){ res[[i]] <- match(data[i, ind], ac) ind_na[is.na(res[[i]])] <- TRUE } } # this needs testing if(any(ind_na)){ res <- lapply(res, function(x, ind_na)x[!ind_na], ind_na) weight <- weight[!ind_na] index <- index[which(ind_na == FALSE)] index <- match(index, unique(index)) } names(res) <- nam attr(res, "row.names") <- NULL attr(res, "weight") <- weight attr(res, "nr") <- length(weight) attr(res, "nc") <- 4 if (return.index) attr(res, "index") <- index attr(res, "levels") <- c("a", "c", "g", "t") attr(res, "allLevels") <- ac attr(res, "type") <- "DNA" attr(res, "contrast") <- AC class(res) <- "phyDat" res } phyDat.default <- function (data, levels = NULL, return.index = TRUE, contrast = NULL, ambiguity = "?", compress=TRUE, ...){ if (is.matrix(data)) nam <- row.names(data) else nam <- names(data) if(is.null(nam))stop("data object must contain taxa names") if(inherits(data, "factor")){ if(is.null(levels)) levels <- levels(data) data <- as.matrix(data) } if(inherits(data, "list")) data <- as.data.frame(data) if(inherits(data, "data.frame")) data <- t(as.matrix(data)) if(inherits(data, "character") | inherits(data, "numeric")) data <- as.matrix(data) if (inherits(data, "DNAbin") | inherits(data, "AAbin")) if(is.list(data)) data <- as.matrix(data) if (inherits(data, "DNAbin") | inherits(data, "AAbin") | inherits(data, "phyDat")) data <- as.character(data) if(ncol(data)==1) compress <- FALSE if(compress){ index <- grp_duplicated(data, MARGIN=2) attr(index, "nlevels") <- NULL weight <- tabulate(index, max(index)) ind <- which(!duplicated(index)) } else{ p <- ncol(data) weight <- rep(1, p) index <- ind <- 1:p } if (!is.null(contrast)) { levels <- colnames(contrast) all.levels <- rownames(contrast) rownames(contrast) <- NULL } else { if (is.null(levels)) stop("Either argument levels or contrast has to be supplied") l <- length(levels) contrast <- diag(l) all.levels <- levels if (!is.null(ambiguity)) { all.levels <- c(all.levels, ambiguity) k <- length(ambiguity) if (k > 0) contrast <- rbind(contrast, matrix(1, k, l)) } } n <- nrow(data) res <- vector("list", nrow(data)) ind_na <- logical(length(weight)) for(i in seq_len(n)){ res[[i]] <- match(data[i, ind], all.levels) ind_na[is.na(res[[i]])] <- TRUE } if(any(ind_na)){ warning("Found unknown characters (not supplied in levels). Deleted sites with unknown states.") res <- lapply(res, function(x, ind_na)x[!ind_na], ind_na) weight <- weight[!ind_na] index <- index[which(ind_na == FALSE)] index <- match(index, unique(index)) } p <- length(weight) names(res) <- nam attr(res, "weight") <- weight attr(res, "nr") <- p attr(res, "nc") <- length(levels) if (return.index) attr(res, "index") <- index attr(res, "levels") <- levels attr(res, "allLevels") <- all.levels attr(res, "type") <- "USER" attr(res, "contrast") <- contrast class(res) <- "phyDat" res } phyDat.AA <- function (data, return.index = TRUE){ if(is.matrix(data)) nam <- row.names(data) else nam <- names(data) if(inherits(data, "list")) data <- as.data.frame(data) if(inherits(data, "data.frame")) data <- t(as.matrix(data)) # AAbin if (inherits(data,"AAbin")){ if(is.list(data)) data <- as.matrix(data) data <- as.character(data) } if(inherits(data, "character")) data <- as.matrix(data) data <- toupper(data) # aa <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", # "l", "k", "m", "f", "p", "s", "t", "w", "y", "v") # aa2 <- c("a", "r", "n", "d", "c", "q", "e", "g", "h", "i", # "l", "k", "m", "f", "p", "s", "t", "w", "y", "v", "b", # "z", "x", "-", "?") aa <- c("A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V") aa2 <- c("A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "-", "?") AA <- diag(20) AA <- rbind(AA, matrix(0, 5, 20)) AA[21, 3] <- AA[21, 4] <- 1 # Aspartate or Asparagine AA[22, 6] <- AA[22, 7] <- 1 # AA[23:25, ] <- 1 dimnames(AA) <- list(aa2, aa) compress <- TRUE if(ncol(data)==1) compress <- FALSE if(compress){ index <- grp_duplicated(data, MARGIN=2) attr(index, "nlevels") <- NULL weight <- tabulate(index, max(index)) ind <- which(!duplicated(index)) } else{ p <- ncol(data) weight <- rep(1, p) index <- ind <- 1:p } n <- nrow(data) res <- vector("list", n) ind_na <- logical(length(weight)) for(i in seq_len(n)){ res[[i]] <- match(data[i, ind], aa2) ind_na[is.na(res[[i]])] <- TRUE } if(any(ind_na)){ warning("Found unknown characters (not supplied in levels). Deleted sites with unknown states.") res <- lapply(res, function(x, ind_na)x[!ind_na], ind_na) weight <- weight[!ind_na] index <- index[which(ind_na == FALSE)] index <- match(index, unique(index)) } names(res) <- nam attr(res, "weight") <- weight attr(res, "nr") <- length(weight) attr(res, "nc") <- 20 if (return.index) attr(res, "index") <- index attr(res, "levels") <- aa attr(res, "allLevels") <- aa2 attr(res, "type") <- "AA" attr(res, "contrast") <- AA class(res) <- "phyDat" res } phyDat.codon <- function (data, return.index = TRUE, ambiguity = "---", NA_as_ambiguous=TRUE, code=1, stopcodon="exclude"){ if(is.matrix(data)) nam <- row.names(data) else nam <- names(data) if(inherits(data, "list")) data <- as.data.frame(data) if(inherits(data, "data.frame")) data <- t(as.matrix(data)) if(inherits(data, "character")){ data <- as.matrix(data) data <- tolower(data) } if (inherits(data,"DNAbin") || inherits(data, "phyDat")) data <- as.character(data) data[data=="u"] <- "t" stopcodon <- match.arg(stopcodon, c("exclude", "include")) splseq <- function (seq, frame = 0){ starts <- seq(from = frame + 1, to = length(seq), by = 3L) sapply(starts, function(x) paste(seq[x:(x + 2L)], collapse="")) } data <- apply(data, 1, splseq) tmp <- .CODON[, as.character(code)] codon <- rownames(.CODON) stop_codons <- codon[tmp == "*"] if(stopcodon!="include") codon <- codon[tmp != "*"] # no stop codons if(stopcodon=="exclude"){ for(i in stopcodon){ data[data==i] <- NA } rm_stop <- which(is.na(data), arr.ind = TRUE)[,1] if(length(rm_stop)>0) data[-unique(rm_stop), ] } compress <- TRUE if(nrow(data)==1) compress <- FALSE if(compress){ index <- grp_duplicated(data, MARGIN=1) attr(index, "nlevels") <- NULL weight <- tabulate(index, max(index)) ind <- which(!duplicated(index)) } else{ p <- nrow(data) weight <- rep(1, p) index <- ind <- 1:p } CODON <- diag(length(codon)) if(NA_as_ambiguous){ ambiguity <- unique(c("---", ambiguity)) } if(ambiguity!=""){ codon_amb <- c(codon, ambiguity) CODON <- rbind(CODON, matrix(1, length(ambiguity), length(codon))) } else codon_amb <- codon dimnames(CODON) <- list(codon_amb, codon) n <- ncol(data) res <- vector("list", n) ind_na <- logical(length(weight)) for(i in seq_len(n)){ res[[i]] <- match(data[ind, i], codon_amb) ind_na[is.na(res[[i]])] <- TRUE } if(NA_as_ambiguous){ ind <- match("---", codon_amb) res <- lapply(res, function(x, ind){x[is.na(x)] <- ind; x}, ind) } else if(any(ind_na)){ warning("Found unknown characters. Deleted sites with unknown states.") res <- lapply(res, function(x, ind_na)x[!ind_na], ind_na) weight <- weight[!ind_na] index <- index[which(ind_na == FALSE)] index <- match(index, unique(index)) } p <- length(weight) names(res) <- nam attr(res, "row.names") <- NULL attr(res, "weight") <- weight attr(res, "nr") <- p attr(res, "nc") <- length(codon) if (return.index) attr(res, "index") <- index attr(res, "levels") <- codon attr(res, "allLevels") <- codon_amb attr(res, "type") <- "CODON" attr(res, "code") <- code attr(res, "contrast") <- CODON class(res) <- "phyDat" res } phangorn/R/splitsNetwork.R0000644000176200001440000001021513707232051015301 0ustar liggesusers#' Phylogenetic Network #' #' \code{splitsNetwork} estimates weights for a splits graph from a distance #' matrix. #' #' \code{splitsNetwork} fits non-negative least-squares phylogenetic networks #' using L1 (LASSO), L2(ridge regression) constraints. The function minimizes #' the penalized least squares #' \deqn{\beta = min \sum(dm - X\beta)^2 + \lambda \|\beta \|^2_2 }{ beta = sum(dm - X*beta)^2 + lambda |beta|^2_2 } #' with respect to \deqn{\|\beta \|_1 <= \gamma, \beta >= 0}{ |beta|_1 = gamma, beta >= 0} #' where \eqn{X} is a design matrix constructed with \code{designSplits}. #' External edges are fitted without L1 or L2 constraints. #' #' @param dm A distance matrix. #' @param splits a splits object, containing all splits to consider, otherwise #' all possible splits are used #' @param gamma penalty value for the L1 constraint. #' @param lambda penalty value for the L2 constraint. #' @param weight a vector of weights. #' @return \code{splitsNetwork} returns a splits object with a matrix added. #' The first column contains the indices of the splits, the second column an #' unconstrained fit without penalty terms and the third column the constrained #' fit. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[phangorn]{distanceHadamard}}, #' \code{\link[phangorn]{designTree}} \code{\link[phangorn]{consensusNet}}, #' \code{\link[phangorn]{plot.networx}} #' @references Efron, Hastie, Johnstone and Tibshirani (2004) Least Angle #' Regression (with discussion) \emph{Annals of Statistics} \bold{32(2)}, 407--499 #' #' K. P. Schliep (2009). Some Applications of statistical phylogenetics (PhD #' Thesis) #' @keywords cluster #' @importFrom Matrix sparseMatrix #' @importFrom quadprog solve.QP #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' fit <- splitsNetwork(dm) #' net <- as.networx(fit) #' plot(net, "2D") #' write.nexus.splits(fit) #' #' @export splitsNetwork splitsNetwork <- function(dm, splits = NULL, gamma = .1, lambda = 1e-6, weight = NULL) { dm <- as.matrix(dm) k <- dim(dm)[1] if (!is.null(splits)) { tmp <- which(lengths(splits) == k) splits <- splits[-tmp] lab <- attr(splits, "labels") dm <- dm[lab, lab] } if (is.null(splits)) { X2 <- designAll(k, TRUE) X <- X2[[1]] } else X <- as.matrix(splits2design(splits)) y <- dm[lower.tri(dm)] if (is.null(splits)) ind <- c(2^(0:(k - 2)), 2^(k - 1) - 1) else ind <- which(lengths(splits) == 1) # else ind = which(sapply(splits, length)==1) # y2 = lm(y~X[,ind]-1)$res n <- dim(X)[2] ridge <- lambda * diag(n) ridge[ind, ind] <- 0 if (!is.null(weight)) Dmat <- crossprod(X * sqrt(weight)) + ridge else Dmat <- crossprod(X) + ridge if (!is.null(weight)) dvec <- crossprod(X * sqrt(weight), y * sqrt(weight)) else dvec <- crossprod(X, y) ind1 <- rep(1, n) ind1[ind] <- 0 Amat <- cbind(ind1, diag(n)) bvec <- c(gamma, rep(0, n)) # needs quadprog::solve.QP.compact solution <- quadprog::solve.QP(Dmat, dvec, Amat, bvec = bvec, meq = 1)$sol ind2 <- which(solution > 1e-8) n2 <- length(ind2) ind3 <- which(duplicated(c(ind2, ind), fromLast = TRUE)[1:n2]) ridge2 <- lambda * diag(n2) ridge2[ind3, ind3] <- 0 if (!is.null(weight)) Dmat <- crossprod(X[, ind2] * sqrt(weight)) + ridge2 else Dmat <- crossprod(X[, ind2]) + ridge2 if (!is.null(weight)) dvec <- crossprod(X[, ind2] * sqrt(weight), y * sqrt(weight)) else dvec <- crossprod(X[, ind2], y) Amat2 <- diag(n2) bvec2 <- rep(0, n2) # needs quadprog::solve.QP.compact # bvec2 not used solution2 <- quadprog::solve.QP(Dmat, dvec, Amat2)$sol RSS1 <- sum( (y - X[, ind2] %*% solution[ind2])^2) RSS2 <- sum( (y - X[, ind2] %*% solution2)^2) if (is.null(splits)) { splits <- vector("list", length(ind2)) for (i in seq_along(ind2)) splits[[i]] <- which(X2[[2]][ind2[i], ] == 1) } else splits <- splits[ind2] attr(splits, "weights") <- solution[ind2] attr(splits, "unrestricted") <- solution2 attr(splits, "stats") <- c(df = n2, RSS_p = RSS1, RSS_u = RSS2) attr(splits, "labels") <- dimnames(dm)[[1]] class(splits) <- "splits" return(splits) } phangorn/R/neighborNet.R0000644000176200001440000002231114076545125014666 0ustar liggesusersdistC <- function(d, CL) { l <- length(CL) res <- matrix(0, l, l) for (i in 1:(l - 1)) { for (j in (i + 1):l) res[i, j] <- mean.default(d[CL[[i]], CL[[j]]]) } res + t(res) } updateDM <- function(DM, d, CL, j) { l <- length(CL) for (i in 1:l) { DM[i, j] <- DM[j, i] <- mean.default(d[CL[[i]], CL[[j]]]) } DM[j, j] <- 0 DM } Rx <- function(d, x, CL) { lx <- length(x) res <- numeric(lx) lC <- length(CL) for (i in 1:lx) { xi <- x[i] tmp <- 0 for (j in 1:lx) { if (j != i) tmp <- tmp + d[xi, x[j]] } if (lC > 0) { for (j in 1:lC) { tmp <- tmp + mean.default(d[xi, CL[[j]]]) } } res[i] <- tmp } res } reduc <- function(d, x, y, z) { u <- 2 / 3 * d[x, ] + d[y, ] / 3 v <- 2 / 3 * d[z, ] + d[y, ] / 3 uv <- (d[x, y] + d[x, z] + d[y, z]) / 3 d[x, ] <- u d[, x] <- u d[z, ] <- v d[, z] <- v d[y, ] <- 0 d[, y] <- 0 d[x, z] <- d[z, x] <- uv d[x, x] <- d[z, z] <- 0 # diag(d) <- 0 d } # computes ordering getOrderingNN <- function(x) { x <- as.matrix(x) labels <- attr(x, "Labels") if (is.null(labels)) labels <- colnames(x) d <- x # as.matrix(x) l <- dim(d)[1] CL <- vector("list", l) CL[1:l] <- ORD <- 1:l lCL <- length(CL) ord <- CL DM <- DM_C <- DM_V <- d while (lCL > 1) { # i <- 0 # j <- 0 DM <- distC(d, CL) l <- nrow(DM) if (l > 2) { r <- rowSums(DM) / (l - 2) tmp <- out_cpp(DM, r, l) e1 <- tmp[1] e2 <- tmp[2] } else { e1 <- 1 e2 <- 2 } n1 <- length(CL[[e1]]) n2 <- length(CL[[e2]]) if (n1 == 1 & n2 == 1) { newCL <- c(CL[[e1]], CL[[e2]]) newOrd <- newCL CL <- c(CL[-c(e1, e2)], list(newCL)) ord <- c(ord[-c(e1, e2)], list(newCL)) lCL <- lCL - 1L } else { CLtmp <- c(as.list(CL[[e1]]), as.list(CL[[e2]]), CL[-c(e1, e2)]) ltmp <- length(CLtmp) DM2 <- distC(d, CLtmp) if (ltmp > 2) rtmp <- rowSums(DM2) / (ltmp - 2) DM2 <- DM2 - outer(rtmp, rtmp, "+") # compute only this TMP <- DM2[1:n1, (n1 + 1):(n1 + n2)] blub <- which.min(TMP) # print("blub") if (n1 == 2 & n2 == 1) { if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]]) } else { newCL <- c(CL[[e2]], CL[[e1]][2]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]], CL[[e1]][1], CL[[e1]][2]) } } if (n1 == 1 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]], CL[[e2]][1], CL[[e2]][2]) } else { newCL <- c(CL[[e2]][1], CL[[e1]]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]][1], CL[[e2]][2], CL[[e1]]) } } if (n1 == 2 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]][2], CL[[e2]][2]) newOrd <- c(rev(ord[[e1]]), ord[[e2]]) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][1]) d <- reduc(d, CL[[e1]][2], CL[[e2]][1], CL[[e2]][2]) } if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][1]) d <- reduc(d, CL[[e1]][1], CL[[e2]][1], CL[[e2]][2]) } if (blub == 3) { newCL <- c(CL[[e1]][2], CL[[e2]][1]) newOrd <- c(rev(ord[[e1]]), rev(ord[[e2]])) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][2]) d <- reduc(d, CL[[e1]][2], CL[[e2]][2], CL[[e2]][1]) } if (blub == 4) { newCL <- c(CL[[e1]][1], CL[[e2]][1]) newOrd <- c(ord[[e1]], rev(ord[[e2]])) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][2]) d <- reduc(d, CL[[e1]][1], CL[[e2]][2], CL[[e2]][1]) } } CL <- c(CL[-c(e1, e2)], list(newCL)) ord <- c(ord[-c(e1, e2)], list(newOrd)) lCL <- lCL - 1L } } newOrd } # computes ordering O(n^2) statt O(n^3) !!! # needs debugging getOrderingNN2 <- function(x) { x <- as.matrix(x) labels <- attr(x, "Labels") if (is.null(labels)) labels <- colnames(x) d <- x # as.matrix(x) l <- dim(d)[1] CL <- vector("list", l) CL[] <- seq_len(l) lCL <- length(CL) ord <- CL # DM_C connected components, DM_V vertices DM_C <- DM_V <- DM <- d z <- 0 while (lCL > 1) { # i <- 0 # j <- 0 z <- z + 1 l <- nrow(DM) # compute Q_D from D_C if (l > 2) { r <- rowSums(DM) / (l - 2) tmp <- out_cpp(DM, r, l) # tmp <- .C("out", as.double(DM), as.double(r), as.integer(l), # as.integer(i), as.integer(j), PACKAGE = "phangorn") e1 <- tmp[1] e2 <- tmp[2] } else { e1 <- 1 e2 <- 2 } n1 <- length(CL[[e1]]) n2 <- length(CL[[e2]]) if (n1 == 1 & n2 == 1) { # add edge newCL <- c(CL[[e1]], CL[[e2]]) newOrd <- newCL CL[[e1]] <- newCL # update DM_C DM <- updateDM(DM, d, CL, e1) DM <- DM[-e2, -e2, drop = FALSE] CL <- CL[-e2] ord[[e1]] <- newCL ord <- ord[-e2] lCL <- lCL - 1L } else { CLtmp <- c(as.list(CL[[e1]]), as.list(CL[[e2]]), CL[-c(e1, e2)]) ltmp <- length(CLtmp) CLtmp2 <- c(CL[[e1]], CL[[e2]]) rtmp2 <- Rx(d, CLtmp2, CL[-c(e1, e2)]) if (ltmp > 2) rtmp2 <- rtmp2 / (ltmp - 2) DM3 <- d[CLtmp2, CLtmp2] - outer(rtmp2, rtmp2, "+") TMP2 <- DM3[1:n1, (n1 + 1):(n1 + n2)] blub <- which.min(TMP2) if (n1 == 2 & n2 == 1) { if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]]) } else { newCL <- c(CL[[e2]], CL[[e1]][2]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]], CL[[e1]][1], CL[[e1]][2]) } } if (n1 == 1 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]], CL[[e2]][1], CL[[e2]][2]) } else { newCL <- c(CL[[e2]][1], CL[[e1]]) newOrd <- c(ord[[e2]], ord[[e1]]) d <- reduc(d, CL[[e2]][1], CL[[e2]][2], CL[[e1]]) } } if (n1 == 2 & n2 == 2) { if (blub == 1) { newCL <- c(CL[[e1]][2], CL[[e2]][2]) newOrd <- c(rev(ord[[e1]]), ord[[e2]]) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][1]) d <- reduc(d, CL[[e1]][2], CL[[e2]][1], CL[[e2]][2]) } if (blub == 2) { newCL <- c(CL[[e1]][1], CL[[e2]][2]) newOrd <- c(ord[[e1]], ord[[e2]]) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][1]) d <- reduc(d, CL[[e1]][1], CL[[e2]][1], CL[[e2]][2]) } if (blub == 3) { newCL <- c(CL[[e1]][2], CL[[e2]][1]) newOrd <- c(rev(ord[[e1]]), rev(ord[[e2]])) d <- reduc(d, CL[[e1]][2], CL[[e1]][1], CL[[e2]][2]) d <- reduc(d, CL[[e1]][2], CL[[e2]][2], CL[[e2]][1]) } if (blub == 4) { newCL <- c(CL[[e1]][1], CL[[e2]][1]) newOrd <- c(ord[[e1]], rev(ord[[e2]])) d <- reduc(d, CL[[e1]][1], CL[[e1]][2], CL[[e2]][2]) d <- reduc(d, CL[[e1]][1], CL[[e2]][2], CL[[e2]][1]) } } ord[[e1]] <- newOrd ord <- ord[-e2] CL[[e1]] <- newCL DM <- updateDM(DM, d, CL, e1) DM <- DM[-e2, -e2, drop = FALSE] CL <- CL[-e2] lCL <- lCL - 1L } } newOrd } #' Computes a neighborNet from a distance matrix #' #' Computes a neighborNet, i.e. an object of class \code{networx} from a #' distance matrix. #' #' \code{neighborNet} is still experimental. The cyclic ordering sometimes #' differ from the SplitsTree implementation, the \emph{ord} argument can be #' used to enforce a certain circular ordering. #' #' @param x a distance matrix. #' @param ord a circular ordering. #' @return \code{neighborNet} returns an object of class networx. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{splitsNetwork}}, \code{\link{consensusNet}}, #' \code{\link{plot.networx}}, \code{\link{lento}}, #' \code{\link{cophenetic.networx}}, \code{\link{distanceHadamard}} #' @references Bryant, D. & Moulton, V. (2004) Neighbor-Net: An Agglomerative #' Method for the Construction of Phylogenetic Networks. \emph{Molecular #' Biology and Evolution}, 2004, \bold{21}, 255-265 #' @keywords hplot #' @examples #' #' data(yeast) #' dm <- dist.ml(yeast) #' nnet <- neighborNet(dm) #' plot(nnet, "2D") #' #' @export neighborNet neighborNet <- function(x, ord = NULL) { x <- as.matrix(x) labels <- attr(x, "Labels")[[1]] if (is.null(labels)) labels <- colnames(x) l <- length(labels) if (is.null(ord)) ord <- getOrderingNN(x) spl <- allCircularSplits(l, labels[ord]) spl <- nnls.splits(spl, x) # nnls.split mit nnls statt quadprog attr(spl, "cycle") <- 1:l as.networx(spl) } removeNonsense <- function(obj) { nTips <- length(attr(obj, "label")) l <- lengths(obj) ind <- which( (l == 0L) | (l == nTips)) obj <- obj[-ind] } phangorn/R/hadamard.R0000644000176200001440000002054014140463335014157 0ustar liggesusersdec2Bin <- function(x) { res <- NULL i <- 1L while (x > 0) { if (x %% 2L) res <- c(res, i) x <- x %/% 2L i <- i + 1L } res } # returns binary (0, 1) vector of length k dec2bin <- function(x, k = ceiling(log2(x))) { i <- 1L res <- integer(k) while (x > 0) { if (x %% 2L) res[i] <- 1L x <- x %/% 2L i <- i + 1L } res } # double factorial: log version #' @rdname dfactorial #' @export ldfactorial <- function(x) { x <- (x + 1) / 2 res <- lgamma(2 * x) - (lgamma(x) + (x - 1) * log(2)) res } # double factorial #' Arithmetic Operators #' #' double factorial function #' #' #' @param x a numeric scalar or vector #' @return \code{dfactorial(x)} returns the double factorial, that is #' \eqn{x\!\! = 1 * 3 * 5 * \ldots * x } and \code{ldfactorial(x)} is the #' natural logarithm of it. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link[base:Special]{factorial}}, #' \code{\link[ape]{howmanytrees}} #' @keywords classif #' @examples #' #' dfactorial(1:10) #' #' @rdname dfactorial #' @export dfactorial "dfactorial" <- function(x) exp(ldfactorial(x)) # # Hadamard Conjugation # ### @aliases hadamard fhm h4st h2st #' Hadamard Matrices and Fast Hadamard Multiplication #' #' A collection of functions to perform Hadamard conjugation. %Hv of a #' Hadamard matrix H with a vector v using fast Hadamard multiplication. #' #' \code{h2st} and \code{h4st} perform Hadamard conjugation for 2-state #' (binary, RY-coded) or 4-state (DNA/RNA) data. \code{write.nexus.splits} #' writes splits returned from \code{h2st} or #' \code{\link[phangorn]{distanceHadamard}} to a nexus file, which can be #' processed by Spectronet or SplitsTree. #' #' @param x a vector of length \eqn{2^n}, where n is an integer. #' @param v a vector of length \eqn{2^n}, where n is an integer. #' @param obj a data.frame or character matrix, typical a sequence alignment. #' @param eps Threshold value for splits. #' @param levels levels of the sequences. #' @return \code{hadamard} returns a Hadamard matrix. \code{fhm} returns the #' fast Hadamard multiplication. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{distanceHadamard}}, \code{\link{lento}}, #' \code{\link{plot.networx}} #' @references Hendy, M.D. (1989). The relationship between simple evolutionary #' tree models and observable sequence data. \emph{Systematic Zoology}, #' \bold{38} 310--321. #' #' Hendy, M. D. and Penny, D. (1993). Spectral Analysis of Phylogenetic Data. #' \emph{Journal of Classification}, \bold{10}, 5--24. #' #' Hendy, M. D. (2005). Hadamard conjugation: an analytical tool for #' phylogenetics. In O. Gascuel, editor, \emph{Mathematics of evolution and #' phylogeny}, Oxford University Press, Oxford #' #' Waddell P. J. (1995). Statistical methods of phylogenetic analysis: #' Including hadamard conjugation, LogDet transforms, and maximum likelihood. #' \emph{PhD thesis}. #' @keywords cluster #' @examples #' #' H <- hadamard(3) #' v <- 1:8 #' H %*% v #' fhm(v) #' #' data(yeast) #' #' # RY-coding #' dat_ry <- acgt2ry(yeast) #' fit2 <- h2st(dat_ry) #' lento(fit2) #' #' # write.nexus.splits(fit2, file = "test.nxs") #' # read this file into Spectronet or SplitsTree to show the network #' \dontrun{ #' dat <- as.character(yeast) #' dat4 <- phyDat(dat, type="USER", levels=c("a","c", "g", "t"), ambiguity=NULL) #' fit4 <- h4st(dat4) #' old.par <- par(no.readonly = TRUE) #' par(mfrow=c(3,1)) #' lento(fit4[[1]], main="Transversion") #' lento(fit4[[2]], main="Transition 1") #' lento(fit4[[3]], main="Transition 2") #' par(old.par) #' } #' #' @rdname hadamard #' @export hadamard hadamard <- function(x) { res <- 1 while (x > 0) { res <- rbind(cbind(res, res), cbind(res, -res)) x <- x - 1 } res } #' @rdname hadamard #' @export fhm <- function(v) { n <- length(v) n <- log2(n) res <- .Call("_phangorn_fhm_new", v = as.double(v), n = as.integer(n)) res } seq2split <- function(s) { n <- length(s) res <- fhm(log(fhm(s))) / n res } split2seq <- function(q) { n <- length(q) res <- fhm(exp(fhm(q))) / n res } #' Distance Hadamard #' #' Distance Hadamard produces spectra of splits from a distance matrix. #' #' #' @param dm A distance matrix. #' @param eps Threshold value for splits. #' @return \code{distanceHadamard} returns a matrix. The first column contains #' the distance spectra, the second one the edge-spectra. If eps is positive an #' object of with all splits greater eps is returned. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com}, Tim White #' @seealso \code{\link{hadamard}}, \code{\link{lento}}, #' \code{\link{plot.networx}}, \code{\link{neighborNet}} #' @references Hendy, M. D. and Penny, D. (1993). Spectral Analysis of #' Phylogenetic Data. \emph{Journal of Classification}, \bold{10}, 5-24. #' @keywords cluster #' @examples #' #' data(yeast) #' dm <- dist.hamming(yeast) #' dm <- as.matrix(dm) #' fit <- distanceHadamard(dm) #' lento(fit) #' plot(as.networx(fit), "2D") #' #' @export distanceHadamard distanceHadamard <- function(dm, eps = 0.001) { if (inherits(dm, "dist")) { n <- attr(dm, "Size") Labels <- attr(dm, "Labels") } if (inherits(dm, "matrix")) { n <- dim(dm)[1] Labels <- colnames(dm) dm <- dm[lower.tri(dm)] } ns <- 2^(n - 1) if (n > 23) stop("Hadamard conjugation works only efficient for n < 24") result <- .Call('dist2spectra', dm, as.integer(n), as.integer(ns)) weights <- -fhm(result) / 2^(n - 2) if (eps > 0) { weights <- weights[-1] ind2 <- which(weights > eps) n2 <- length(ind2) splits <- vector("list", n2) for (i in 1:n2) splits[[i]] <- dec2Bin(ind2[i]) attr(splits, "weights") <- weights[ind2] attr(splits, "labels") <- Labels attr(splits, "dm") <- dm class(splits) <- "splits" return(splits) } res <- data.frame(distance = result, edges = weights, index = 0:(ns - 1)) attr(res, "Labels") <- Labels res } #' @rdname hadamard #' @export h4st <- function(obj, levels = c("a", "c", "g", "t")) { if (is.matrix(obj)) obj <- as.data.frame(t(obj)) if (inherits(obj, "phyDat")) obj <- as.data.frame(t(as.character(obj))) n <- dim(obj)[1] p <- dim(obj)[2] if (p > 11) stop("4-state Hadamard conjugation works only efficient for n < 12") DNAX <- matrix(0, n, p) DNAY <- matrix(0, n, p) DNAX[obj == levels[1]] <- 0 DNAX[obj == levels[2]] <- 1 DNAX[obj == levels[3]] <- 1 DNAX[obj == levels[4]] <- 0 DNAY[obj == levels[1]] <- 0 DNAY[obj == levels[2]] <- 1 DNAY[obj == levels[3]] <- 0 DNAY[obj == levels[4]] <- 1 DNAY <- DNAY - DNAY[, p] DNAX <- DNAX - DNAX[, p] DNAY <- abs(DNAY[, -p]) DNAX <- abs(DNAX[, -p]) dy <- DNAY %*% (2^(0:(p - 2))) dx <- DNAX %*% (2^(0:(p - 2))) INDEX <- dx + 2^(p - 1) * dy blub <- table(INDEX) index <- as.numeric(rownames(blub)) + 1 sv <- numeric(4^(p - 1)) sv[index] <- blub qv <- matrix(seq2split(sv), 2^(p - 1), 2^(p - 1)) sv <- matrix(sv, 2^(p - 1), 2^(p - 1)) transversion <- transition.1 <- transition.2 <- allSplits(p, colnames(obj)) attr(transversion, "weights") <- qv[-1, 1] attr(transition.1, "weights") <- diag(qv)[-1] attr(transition.2, "weights") <- qv[1, -1] result <- list(transversion = transversion, transition.1 = transition.1, transition.2 = transition.2, qv = qv, sv = sv, n = sum(sv), names = names(obj)) result } #' @rdname hadamard #' @export h2st <- function(obj, eps = 0.001) { if (!inherits(obj, "phyDat")) stop("Error") if (attr(obj, "nc") != 2) stop("Error") nr <- attr(obj, "nr") # n p <- length(obj) # p weight <- attr(obj, "weight") if (p > 23) stop("Hadamard conjugation works only efficient for n < 24") DNAX <- matrix(0, nr, p - 1) for (i in 1:(p - 1)) DNAX[, i] <- obj[[i]] - 1 DNAX[obj[[p]] == 2, ] <- 1 - DNAX[obj[[p]] == 2, ] index <- DNAX %*% (2^(0:(p - 2))) + 1 sv <- numeric(2^(p - 1)) for (i in 1:nr) sv[index[i]] <- sv[index[i]] + weight[i] qv <- seq2split(sv) if (eps > 0) { qv <- qv[-1] ind2 <- which(qv > eps) indT <- c(2L^(0:(p - 2)), 2L^(p - 1) - 1) ind2 <- union(ind2, indT) n2 <- length(ind2) splits <- vector("list", n2) for (i in 1:n2) splits[[i]] <- dec2Bin(ind2[i]) attr(splits, "weights") <- qv[ind2] attr(splits, "labels") <- names(obj) class(splits) <- "splits" return(splits) } result <- data.frame(edges = qv, splits = sv, index = 0:(2^(p - 1) - 1)) attr(result, "Labels") <- names(obj) result } phangorn/R/Coalescent.R0000644000176200001440000000670413707232051014501 0ustar liggesusersnodeHeight <- function(tree) { if (is.null(attr(tree, "order")) || attr(tree, "order") == "cladewise") { tree <- reorder(tree, "postorder") } node_height_cpp(as.integer(tree$edge[, 1]), as.integer(tree$edge[, 2]), as.double(tree$edge.length)) } ancstat <- function(phy, x) { contrast <- attr(x, "contrast") storage.mode(contrast) <- "integer" phy <- reorder(phy, "postorder") res <- matrix(0L, max(phy$edge), ncol(contrast)) colnames(res) <- attr(x, "levels") nTips <- length(phy$tip.label) pa <- phy$edge[, 1] ch <- phy$edge[, 2] res[1:nTips, ] <- contrast[as.numeric(x)[match(phy$tip.label, names(x))], , drop = FALSE ] for (i in seq_along(pa)) { res[pa[i], ] <- res[pa[i], ] | res[ch[i], ] } res } comp <- function(x, y) { tmp1 <- matrix(rowSums(x), nrow(x), nrow(y)) res <- matrix(rowSums(y), nrow(x), nrow(y), byrow = TRUE) tmp3 <- tcrossprod(x, 1 - y) tmp0 <- tcrossprod(x, y) tmp0[tmp3 > 0] <- 0L res[!(tmp0 > (tmp1 - 1e-8))] <- 10000000L apply(res, 1, which.min) } comp2 <- function(x, y) { res <- matrix(rowSums(x), nrow(x), nrow(y)) tmp1 <- matrix(rowSums(y), nrow(x), nrow(y), byrow = TRUE) tmp3 <- tcrossprod(1 - x, y) tmp0 <- tcrossprod(x, y) tmp0[tmp3 > 0] <- 0L res[tmp0 < 2] <- Inf apply(res, 2, which.min) } #' Species Tree #' #' \code{coalSpeciesTree} estimates species trees and can handle multiple #' individuals per species. #' #' \code{coalSpeciesTree} estimates a single linkage tree as suggested by Liu #' et al. (2010) from the element wise minima of the cophenetic matrices of the #' gene trees. It extends \code{speciesTree} in ape as it allows that have #' several individuals per gene tree. #' #' @param tree an object of class \code{multiPhylo} #' @param X A \code{phyDat} object to define which individual belongs to which #' species. #' @param sTree A species tree which fixes the topology. #' @return The function returns an object of class \code{phylo}. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} Emmanuel Paradies #' @seealso \code{\link{speciesTree}} #' @references Liu, L., Yu, L. and Pearl, D. K. (2010) Maximum tree: a #' consistent estimator of the species tree. \emph{Journal of Mathematical #' Biology}, \bold{60}, 95--106. #' @keywords cluster #' #' @export coalSpeciesTree <- function(tree, X = NULL, sTree = NULL) { if (is.null(X)) return(speciesTree(tree)) trees <- unclass(tree) States <- lapply(tree, ancstat, X) NH <- lapply(tree, nodeHeight) if (is.null(sTree)) { l <- attr(X, "nc") m <- choose(l, 2) SST <- matrix(0L, m, l) k <- 1 for (i in 1:(l - 1)) { for (j in (i + 1):l) { SST[k, i] <- SST[k, j] <- 1L k <- k + 1 } } Y <- matrix(Inf, length(NH), nrow(SST)) dm <- rep(Inf, m) for (i in seq_along(NH)) { ind <- comp2(States[[i]], SST) dm <- pmin(dm, NH[[i]][ind]) # for(j in 1:length(ind))Y[i, ind[j]] = min(Y[i, ind[j]], NH[[i]][j]) } dm <- structure(2 * dm, Labels = attr(X, "levels"), Size = l, class = "dist", Diag = FALSE, Upper = FALSE ) sTree <- upgma(dm, "single") # dm of pairwise states } else { SST <- ancstat(sTree, X) Y <- matrix(Inf, length(NH), nrow(SST)) for (i in seq_along(NH)) { ind <- comp(States[[i]], SST) for (j in seq_along(ind)) Y[i, ind[j]] <- min(Y[i, ind[j]], NH[[i]][j]) } STH <- apply(Y, 2, min) sTree$edge.length <- STH[sTree$edge[, 1]] - STH[sTree$edge[, 2]] } sTree } phangorn/R/bootstrap.R0000644000176200001440000004352314151442736014445 0ustar liggesusersminEdge <- function(tree, tau=1e-8, enforce_ultrametric=FALSE){ if(tau<0) stop("tau must be >= 0!") if(any(tree$edge.length < tau)){ rooted <- is.rooted(tree) if(rooted){ nTip <- Ntip(tree) ind <- seq_len(nTip) nh <- nodeHeight(tree)[ind] if(enforce_ultrametric) nh <- rep(0, nTip) } tree$edge.length[tree$edge.length < tau] <- tau if(rooted){ el <- numeric(max(tree$edge)) el[tree$edge[,2]] <- tree$edge.length nh2 <- nodeHeight(tree)[ind] el[ind] <- el[ind] + (nh2 - nh) tree$edge.length <- el[tree$edge[,2]] } } tree } candidate.tree <- function(x, rooted=FALSE, eps = 1e-8, ...){ if(rooted){ dm <- dist.ml(x, ...) tree <- wpgma(dm) } else{ tree <- random.addition(x) tree <- optim.parsimony(tree, x, trace=0) tree <- multi2di(tree) tree <- unroot(tree) tree <- acctran(tree, x) tree$edge.length <- tree$edge.length / sum(attr(x, "weight")) } minEdge(tree, tau=eps) } #' Bootstrap #' #' \code{bootstrap.pml} performs (non-parametric) bootstrap analysis and #' \code{bootstrap.phyDat} produces a list of bootstrapped data sets. #' \code{plotBS} plots a phylogenetic tree with the bootstrap values assigned #' to the (internal) edges. #' #' It is possible that the bootstrap is performed in parallel, with help of the #' multicore package. Unfortunately the multicore package does not work under #' windows or with GUI interfaces ("aqua" on a mac). However it will speed up #' nicely from the command line ("X11"). #' #' @param x an object of class \code{pml} or \code{phyDat}. #' @param bs number of bootstrap samples. #' @param trees return trees only (default) or whole \code{pml} objects. #' @param multicore logical, whether models should estimated in parallel. #' @param mc.cores The number of cores to use during bootstrap. Only supported #' on UNIX-alike systems. #' @param jumble logical, jumble the order of the sequences. #' @param \dots further parameters used by \code{optim.pml} or #' \code{plot.phylo}. #' @param FUN the function to estimate the trees. #' @return \code{bootstrap.pml} returns an object of class \code{multi.phylo} #' or a list where each element is an object of class \code{pml}. \code{plotBS} #' returns silently a tree, i.e. an object of class \code{phylo} with the #' bootstrap values as node labels. The argument \code{BStrees} is optional and #' if not supplied the tree with labels supplied in the \code{node.label} slot. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{optim.pml}}, \code{\link{pml}}, #' \code{\link{plot.phylo}}, \code{\link{maxCladeCred}} #' \code{\link{nodelabels}},\code{\link{consensusNet}} and #' \code{\link{SOWH.test}} for parametric bootstrap #' @references Felsenstein J. (1985) Confidence limits on phylogenies. An #' approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 #' #' Lemoine, F., Entfellner, J. B. D., Wilkinson, E., Correia, D., Felipe, M. D., #' De Oliveira, T., & Gascuel, O. (2018). Renewing Felsenstein’s phylogenetic #' bootstrap in the era of big data. \emph{Nature}, \bold{556(7702)}, 452--456. #' #' Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree #' construction. \emph{Cladistics} \bold{1}, 266--278 #' #' Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary #' trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 #' @keywords cluster #' @examples #' #' \dontrun{ #' data(Laurasiatherian) #' dm <- dist.hamming(Laurasiatherian) #' tree <- NJ(dm) #' # NJ #' set.seed(123) #' NJtrees <- bootstrap.phyDat(Laurasiatherian, #' FUN=function(x)NJ(dist.hamming(x)), bs=100) #' treeNJ <- plotBS(tree, NJtrees, "phylogram") #' #' # Maximum likelihood #' fit <- pml(tree, Laurasiatherian) #' fit <- optim.pml(fit, rearrangement="NNI") #' set.seed(123) #' bs <- bootstrap.pml(fit, bs=100, optNni=TRUE) #' treeBS <- plotBS(fit$tree,bs) #' #' # Maximum parsimony #' treeMP <- pratchet(Laurasiatherian) #' treeMP <- acctran(treeMP, Laurasiatherian) #' set.seed(123) #' BStrees <- bootstrap.phyDat(Laurasiatherian, pratchet, bs = 100) #' treeMP <- plotBS(treeMP, BStrees, "phylogram") #' add.scale.bar() #' #' # export tree with bootstrap values as node labels #' # write.tree(treeBS) #' } #' #' @rdname bootstrap.pml #' @export bootstrap.pml <- function(x, bs = 100, trees = TRUE, multicore = FALSE, mc.cores = NULL, ...) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } extras <- match.call(expand.dots = FALSE)$... rearr <- c("optNni", "rearrangement") tmp <- pmatch(names(extras), rearr) tmp <- tmp[!is.na(tmp)] do_rearr <- FALSE if(length(tmp)>0){ if(tmp==1){ do_rearr <- extras$optNni if(is.name(do_rearr)) do_rearr <- as.logical(as.character(do_rearr)) } if(tmp==2) do_rearr <- extras$rearrangement %in% c("NNI", "stochastic", "ratchet") } is_ultrametric <- FALSE tmp <- pmatch("optRooted", names(extras)) if(!is.na(tmp)){ is_ultrametric <- extras$optRooted } data <- x$data weight <- attr(data, "weight") v <- rep(seq_along(weight), weight) ntips <- Ntip(x$tree) BS <- vector("list", bs) for (i in 1:bs) BS[[i]] <- tabulate( sample(v, replace = TRUE), length(weight) ) pmlPar <- function(weights, fit, trees = TRUE, do_rearr, ...) { data <- fit$data tree <- fit$tree ind <- which(weights > 0) data <- getRows(data, ind) attr(data, "weight") <- weights[ind] fit <- update(fit, data = data) if(do_rearr){ # if(is_ultrametric){ # tree <- dist.ml(data, bf=fit$bf, Q=fit$Q) |> wpgma() # } # else tree <- candidate.tree(data) # candidate.tree <- function(x, rooted=FALSE, eps = 1e-8, ...) tree <- candidate.tree(data, rooted = is_ultrametric, bf=fit$bf, Q=fit$Q) fit <- update(fit, tree = tree) } fit <- optim.pml(fit, ...) if (trees) { tree <- fit$tree return(tree) } attr(fit, "data") <- NULL fit } eval.success <- FALSE if (!eval.success & multicore) { res <- mclapply(BS, pmlPar, x, trees = trees, do_rearr = do_rearr, ..., mc.cores = mc.cores) eval.success <- TRUE } if (!eval.success) res <- lapply(BS, pmlPar, x, trees = trees, do_rearr = do_rearr, ...) if (trees) { class(res) <- "multiPhylo" res <- .compressTipLabel(res) # save memory } res } #' @rdname bootstrap.pml #' @export bootstrap.phyDat <- function(x, FUN, bs = 100, multicore = FALSE, mc.cores = NULL, jumble = TRUE, ...) { if (multicore && is.null(mc.cores)) { mc.cores <- detectCores() } weight <- attr(x, "weight") v <- rep(seq_along(weight), weight) BS <- vector("list", bs) for (i in 1:bs) BS[[i]] <- tabulate(sample(v, replace = TRUE), length(weight)) if (jumble) { J <- vector("list", bs) l <- length(x) for (i in 1:bs) J[[i]] <- list(BS[[i]], sample(l)) } fitPar <- function(weights, data, ...) { ind <- which(weights > 0) data <- getRows(data, ind) attr(data, "weight") <- weights[ind] FUN(data, ...) } fitParJumble <- function(J, data, ...) { ind <- which(J[[1]] > 0) data <- getRows(data, ind) attr(data, "weight") <- J[[1]][ind] data <- subset(data, J[[2]]) FUN(data, ...) } if (multicore) { if (jumble) { res <- mclapply(J, fitParJumble, x, ..., mc.cores = mc.cores) } else { res <- mclapply(BS, fitPar, x, ..., mc.cores = mc.cores) } } else { if (jumble) { res <- lapply(J, fitParJumble, x, ...) } else { res <- lapply(BS, fitPar, x, ...) } } if (inherits(res[[1]], "phylo")) { class(res) <- "multiPhylo" res <- .compressTipLabel(res) # save memory } res } matchEdges <- function(tree1, tree2) { bp1 <- bip(tree1) bp2 <- bip(tree2) l <- length(tree1$tip.label) fn <- function(x, y) { if (x[1] == 1) { return(x) } else { return(y[-x]) } } bp1[] <- lapply(bp1, fn, 1:l) bp2[] <- lapply(bp2, fn, 1:l) match(bp1, bp2) } checkLabels <- function(tree, tip) { ind <- match(tree$tip.label, tip) if (any(is.na(ind)) | length(tree$tip.label) != length(tip)) { stop("tree has different labels") } tree$tip.label <- tip #tree$tip.label[ind] ind2 <- tree$edge[, 2] <= Ntip(tree) tree$edge[ind2, 2] <- ind[tree$edge[ind2, 2]] tree } #' Plotting trees with bootstrap values #' #' \code{plotBS} plots a phylogenetic tree with the bootstrap values assigned #' to the (internal) edges. It can also used to assign bootstrap values to a #' phylogenetic tree. #' #' \code{plotBS} can either assign the classical Felsenstein’s bootstrap #' proportions (FBP) (Felsenstein (1985), Hendy & Penny (1985)) or the #' transfer bootstrap expectation (TBE) of Lemoine et al. (2018). Using the #' option \code{type=="n"} just assigns the bootstrap values and return the tree #' without plotting it. #' #' @param tree The tree on which edges the bootstrap values are plotted. #' @param BStrees a list of trees (object of class "multiPhylo"). #' @param type the type of tree to plot, one of "phylogram", "cladogram", "fan", #' "unrooted", "radial" or "none". If type is "none" the tree is returned with #' the bootstrap values assigned to the node labels. #' @param method either "FBP" the classical bootstrap (default) or "TBE" #' (transfer bootstrap) #' @param bs.col color of bootstrap support labels. #' @param bs.adj one or two numeric values specifying the horizontal and #' vertical justification of the bootstrap labels. #' @param digits integer indicating the number of decimal places. #' @param p only plot support values higher than this percentage number #' (default is 0). #' @param \dots further parameters used by \code{plot.phylo}. #' @param frame a character string specifying the kind of frame to be printed #' around the bootstrap values. This must be one of "none" (the default), #' "rect" or "circle". #' @return \code{plotBS} returns silently a tree, i.e. an object of class #' \code{phylo} with the bootstrap values as node labels. The argument #' \code{BStrees} is optional and if not supplied the labels supplied #' in the \code{node.label} slot will be used. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{plot.phylo}}, \code{\link{maxCladeCred}} #' \code{\link{nodelabels}}, \code{\link{consensus}}, \code{\link{consensusNet}} #' @references Felsenstein J. (1985) Confidence limits on phylogenies. An #' approach using the bootstrap. \emph{Evolution} \bold{39}, 783--791 #' #' Lemoine, F., Entfellner, J. B. D., Wilkinson, E., Correia, D., Felipe, M. D., #' De Oliveira, T., & Gascuel, O. (2018). Renewing Felsenstein’s phylogenetic #' bootstrap in the era of big data. \emph{Nature}, \bold{556(7702)}, 452--456. #' #' Penny D. and Hendy M.D. (1985) Testing methods evolutionary tree #' construction. \emph{Cladistics} \bold{1}, 266--278 #' #' Penny D. and Hendy M.D. (1986) Estimating the reliability of evolutionary #' trees. \emph{Molecular Biology and Evolution} \bold{3}, 403--417 #' @examples #' fdir <- system.file("extdata/trees", package = "phangorn") #' # RAxML best-known tree with bipartition support (from previous analysis) #' raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) #' # RAxML bootstrap trees (from previous analysis) #' raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) #' par(mfrow=c(1,2)) #' plotBS(raxml.tree, raxml.bootstrap, "p") #' plotBS(raxml.tree, raxml.bootstrap, "p", "TBE") #' @export plotBS <- function(tree, BStrees, type = "unrooted", method="FBP", bs.col = "black", bs.adj = NULL, digits=3, p = 0, frame = "none", ...) { type <- match.arg(type, c("phylogram", "cladogram", "fan", "unrooted", "radial", "none")) method <- match.arg(method, c("FBP", "TBE")) if (hasArg(BStrees)) { if(method=="FBP"){ BStrees <- .uncompressTipLabel(BStrees) # check if needed if (any(is.rooted(BStrees))) BStrees <- unroot(BStrees) x <- prop.clades(tree, BStrees) x <- (x / length(BStrees)) * 100 tree$node.label <- x } else { tree <- transferBootstrap(tree, BStrees) x <- tree$node.label } } else { if (is.null(tree$node.label)) stop("You need to supply 'trees' or the tree needs support-values as node.label") x <- tree$node.label } if(type=="none") return( tree ) plot(tree, type = type, ...) label <- c(rep(0, length(tree$tip.label)), x) ind <- get("last_plot.phylo", envir = .PlotPhyloEnv)$edge[ ,2 ] if (type == "phylogram" | type == "cladogram") { root <- getRoot(tree) label <- c(rep(0, length(tree$tip.label)), x) label[root] <- 0 ind <- which(label > p) if (is.null(bs.adj)) { bs.adj <- c(1, 1) } if (length(ind) > 0) { if(is.numeric(label)) label <- round(label, digits = digits) nodelabels( text = label[ind], node = ind, frame = frame, col = bs.col, adj = bs.adj, ... ) } } else { if (is.null(bs.adj)) { bs.adj <- c(0.5, 0.5) } ind2 <- which(label[ind] > p) if (length(ind2 > 0)) { if(is.numeric(label)) label <- round(label) edgelabels(label[ind][ind2], ind2, frame = frame, col = bs.col, adj = bs.adj, ... ) } } invisible(tree) } #' Maximum clade credibility tree #' #' \code{maxCladeCred} computes the maximum clade credibility tree from a #' sample of trees. #' #' So far just the best tree is returned. No annotations or transformations of #' edge length are performed. #' #' If a list of partition is provided then the clade credibility is computed #' for the trees in x. #' #' \code{allCompat} returns a 50% majority rule consensus tree with added #' compatible splits similar to the option allcompat in MrBayes. #' #' @param x \code{x} is an object of class \code{multiPhylo} or \code{phylo} #' @param tree logical indicating whether return the tree with the clade #' credibility (default) or the clade credibility score for all trees. #' @param rooted logical, if FALSE the tree with highest maximum bipartition #' credibility is returned. #' @param part a list of partitions as returned by \code{prop.part} #' @return a tree (an object of class \code{phylo}) with the highest clade #' credibility or a numeric vector of clade credibilities for each tree. #' @author Klaus Schliep \email{klaus.schliep@@gmail.com} #' @seealso \code{\link{consensus}}, \code{\link{consensusNet}}, #' \code{\link{prop.part}}, \code{\link{bootstrap.pml}}, \code{\link{plotBS}} #' @keywords cluster #' @importFrom fastmatch fmatch #' @examples #' #' #' data(Laurasiatherian) #' set.seed(42) #' bs <- bootstrap.phyDat(Laurasiatherian, #' FUN = function(x)upgma(dist.hamming(x)), bs=100) #' #' strict_consensus <- consensus(bs) #' majority_consensus <- consensus(bs, p=.5) #' all_compat <- allCompat(bs) #' max_clade_cred <- maxCladeCred(bs) #' #' old.par <- par(no.readonly = TRUE) #' par(mfrow = c(2,2), mar = c(1,4,1,1)) #' plot(strict_consensus, main="Strict consensus tree") #' plot(majority_consensus, main="Majority consensus tree") #' plot(all_compat, main="Majority consensus tree with compatible splits") #' plot(max_clade_cred, main="Maximum clade credibility tree") #' par(old.par) #' #' # compute clade credibility for trees given a prop.part object #' pp <- prop.part(bs) #' tree <- rNNI(bs[[1]], 20) #' maxCladeCred(c(tree, bs[[1]]), tree=FALSE, part = pp) #' # first value likely be -Inf #' #' @rdname maxCladeCred #' @export maxCladeCred <- function(x, tree = TRUE, part = NULL, rooted = TRUE) { if (inherits(x, "phylo")) x <- c(x) if (is.null(part)) { if (!rooted) { pp <- unroot(x) |> prop.part() } else { pp <- prop.part(x) } } else { pp <- part } pplabel <- attr(pp, "labels") if (!rooted){ pp <- postprocess.prop.part(pp, method="SHORTwise") } x <- .uncompressTipLabel(x) class(x) <- NULL m <- max(attr(pp, "number")) nb <- log(attr(pp, "number") / m) l <- length(x) res <- numeric(l) for (i in 1:l) { tmp <- checkLabels(x[[i]], pplabel) if (!rooted) tmp <- unroot(tmp) ppi <- prop.part(tmp) # trees[[i]] if (!rooted) ppi <- SHORTwise(ppi) indi <- fmatch(ppi, pp) if (any(is.na(indi))) { res[i] <- -Inf } else { res[i] <- sum(nb[indi]) } } if (tree) { k <- which.max(res) tr <- x[[k]] tr <- addConfidences(tr, pp) attr(tr, "clade.credibility") <- res[k] return(tr) } res } #' @rdname maxCladeCred #' @export mcc <- maxCladeCred #' @rdname maxCladeCred #' @export allCompat <- function(x) { x <- unroot(x) l <- length(x) pp <- prop.part(x) pp <- postprocess.prop.part(pp, method = "SHORTwise") spl <- as.splits(pp) w <- attr(spl, "weights") ind <- (w / l) > 0.5 res <- spl[ind] spl <- spl[!ind] w <- attr(spl, "weights") ord <- order(w, decreasing = TRUE) for(i in ord){ if(all(compatible2(res, spl[i]) == 0)) res <- c(res, spl[i]) } tree <- as.phylo(res, FALSE) tree$edge.length <- NULL tree <- addConfidences(tree, pp) tree } cladeMatrix <- function(x, rooted = FALSE) { if (!rooted) x <- unroot(x) pp <- prop.part(x) pplabel <- attr(pp, "labels") if (!rooted) pp <- SHORTwise(pp) x <- .uncompressTipLabel(x) nnodes <- Nnode(x) class(x) <- NULL # nnodes <- sapply(x, Nnode) l <- length(x) from <- cumsum(c(1, nnodes[-l])) to <- cumsum(nnodes) ivec <- integer(to[l]) pvec <- c(0, to) res <- vector("list", l) k <- 1 for (i in 1:l) { ppi <- prop.part(x[[i]]) if (!rooted) ppi <- SHORTwise(ppi) indi <- sort(fmatch(ppi, pp)) ivec[from[i]:to[i]] <- indi } X <- sparseMatrix(i = ivec, p = pvec, dims = c(length(pp), l)) list(X = X, prop.part = pp) } moving_average <- function(obj, window = 50) { fun <- function(x) { cx <- c(0, cumsum(x)) (cx[(window + 1):length(cx)] - cx[1:(length(cx) - window)]) / (window) } res <- apply(obj$X, 1, fun) rownames(res) <- c() } phangorn/MD50000644000176200001440000003101514156232262012401 0ustar liggesusers436c79627062f3b81e06d004fa4b7b02 *DESCRIPTION e3450c143604fc10b5697f99d34a6056 *NAMESPACE 13c4e557502d46393ab9a6582eede1f3 *NEWS d7288c3406b83d0c79f4e8e2d60fc185 *R/Coalescent.R af441aefb1f1a0c1a6017e9a4503dc70 *R/Densi.R d61a493f9b90ef87aae4fd2b33e57926 *R/F3X4.R 8f24e088af0de1589d9183cbdd1d9f70 *R/RcppExports.R 7c8048d8d21dd4a427d2a7ee4a1c46d5 *R/SH.R c03b06289fa093d49bb4b4d871e534e7 *R/SOWH.R 5ceb204e3979934cebd6986f2131c05a *R/ancestral_pml.R 1925b98117003080b012423d039c70f0 *R/bab.R 471b93d84ec26ed68fecf6542b1a7778 *R/bootstrap.R a33dd057b0265022a8008b23f2179a36 *R/cladePar.R aa093860dd55cf8464453e408452d0a8 *R/clanistic.R e8f62008dc9ad8901a16eeaaa4e178e0 *R/codon.R d1fc727f812b02dffab2ee52892679f5 *R/codonTest.R 8d35028ef5cc61b0a73b24cb1a78ea09 *R/delta.score.R 3017d4646a3e2a0b4ff857da8d6f2ac6 *R/discrete.gamma.R 940aa04f153afa4a1a1a39435f6b903a *R/dist.p.R e259387a0ac6b09bb4c951c8a2280fe1 *R/distSeq.R 0a36eb415f71a4f79430392ec7cc029c *R/distTree.R ae28102fae1fe1648cd8cd9a613c0642 *R/fitch64.R 3fc775b9c9b0cc5397717e39a709995c *R/hadamard.R 7d5eee6139bb3b1463f024749e01a96a *R/lento.R 9e4e3a8aecacbb522b11533ca042850d *R/mast.R 05c85e04efba9b48c30fc61e554f470a *R/modelTest.R 0e992a4f22f5acbf247f94d54002194d *R/neighborNet.R 8747b277cb63824cedb8af97023d7ff4 *R/networx.R 2a8233564c43ea4bce64daa12b0a8ff2 *R/parsimony.R b1809f35f8cfa8b97116d1a845f7d086 *R/phangorn-package.R 17f022723510882d15edfda14af7a9fd *R/phyDat.R ff0a478353ccd50e4ef8370fc21cd290 *R/phyDat2.R 66d5e1eb5f24223b2e25d17cf513a1df *R/phylo.R a14cecc00d867d6a4b810b16eb7456df *R/pmlMix.R a7d26f22a5d51a858876fff8519720e3 *R/pmlPart.R 08eefc8b3f70e1c127afa95d5e0be591 *R/pmlPen.R d16d9b360a9699c466a60ca8b4269ab7 *R/read.nexus.splits.R b5489fb032ddad4f5d7527103eb2e67b *R/read.phyDat.R 67f10f68fccf7ac989920c9773f2b48d *R/sankoff.R 28f1f84de126379304dcd147a6dbda9f *R/simSeq.R 6a9f36d781df9ab0bf4dfd3c84e79973 *R/splits.R 70d76b235e08eea12df1058aff3e45a8 *R/splitsNetwork.R 82eb160d5ef13b382e87320d13201b65 *R/superTree.R dcbc5579e8941e63d79f139db0fd0a32 *R/sysdata.rda 5f516c17102913535e61652cad2476f1 *R/transferBootstrap.R d8b97e3fee97b650d42f2c34a36384e6 *R/treeManipulation.R ef5b159c466ab7bdecd20a71faa9a857 *R/treeRearrangement.R 542eb37bc6c8e6ecd02cc070ea8e4840 *R/treedist.R 66921b5f0ffa64ba42173985ecfb7477 *R/zzz.R 73c75c2af4dd4c5236906c0177983bec *README.md 01b0865258f0ff306cc3fb938e865058 *TODO 28421c6ac965cdb1d1d35c7a4a8fe1de *build/vignette.rds 4a92b07bcd170e85bd237e460acafa93 *data/Laurasiatherian.RData 4b269c2e640293341b9b1c04d4dd7f4e *data/chloroplast.RData 19f84425e8caaf9f605490cdff17dd81 *data/yeast.RData c21707a9314cf74285a9dc2ab8347f27 *inst/CITATION 61b3722df2ead748e0db8595428412a1 *inst/README 9c3734ed968dffd8aa608f47efaad263 *inst/doc/AdvancedFeatures.R 5cd80fa36cd3dcacce129cb79423ca97 *inst/doc/AdvancedFeatures.Rmd 795985777fb53ffe3df8d50432d1f20d *inst/doc/AdvancedFeatures.html a1acd1e6c375ca1d707f08879a266709 *inst/doc/Ancestral.R 60c82ad4aa2e22c6fb220b0f61d83332 *inst/doc/Ancestral.Rmd 154ba4e69d52958c77424d66d8df08f2 *inst/doc/Ancestral.html 9c1bbf302b462611ece066597e8d89da *inst/doc/IntertwiningTreesAndNetworks.R 00bef846273254282f2091ef7c30fc7d *inst/doc/IntertwiningTreesAndNetworks.Rmd ee492987183dfddd817f340de84c7050 *inst/doc/IntertwiningTreesAndNetworks.html ed931565687ee9e4ed7fb1e62dd9a2d5 *inst/doc/Networx.R 01d7816efe646b305a6b68a402f7930e *inst/doc/Networx.Rmd 8e99aa08af296d0cfc81c104c8f58075 *inst/doc/Networx.html ebb039ddf45440d41845e44f17cb5371 *inst/doc/Trees.R 24a44b62426d1cab33de2a4cc884f526 *inst/doc/Trees.Rmd 2f316d559941cf58c508c7a7a2cd135b *inst/doc/Trees.html 3009f9da02a198cb557d435cc5ad8c7f *inst/extdata/Blosum62.dat 72f496d4c6e937ffe744d25bd8891313 *inst/extdata/Dayhoff.dat 5aa357dab0e72b27023e4302bc37dbad *inst/extdata/FLU.dat 7f63f617d5d29421b0bd90ab8511feb7 *inst/extdata/HIVb.dat 29e1aa10906a86bb9bca6d9c7f98a6cb *inst/extdata/HIVw.dat ca86e539345fa57de5c77a60308bed09 *inst/extdata/JTT.dat fdc1176d0c0f2db3de1c9dfd83d3c070 *inst/extdata/MtZoa.dat 106715eba35efc2743ccad7923ac13ce *inst/extdata/RtREV.dat e05f5a0ca507e4e15e7b95d1ce93b9fa *inst/extdata/VT.dat fc090d051ce4f18b937448a254e2764e *inst/extdata/cpREV.dat 50c707c26bf9015b37670f15d5e1c14b *inst/extdata/dayhoff-dcmut.dat 6da24109959f0c7a7db50c8db78d5d42 *inst/extdata/jtt-dcmut.dat ddc4bd45521cd72848aaf2f79b90ac6e *inst/extdata/lg.dat 917303a3df098f9137c651de0afa78fa *inst/extdata/mtArt.dat 1cd5e39670b86d32b5fe5c27dcc79648 *inst/extdata/mtREV24.dat 0ca0d0e987fcebf847a876779eddd934 *inst/extdata/mtmam.dat 20be734137b889e34006f8b8bd969054 *inst/extdata/trees/RAxML_bestTree.3moles 384aa1b8d633aa8c9f533396bd6798cb *inst/extdata/trees/RAxML_bestTree.AIs 757e4718b72d7829b5ceb34f765dc626 *inst/extdata/trees/RAxML_bestTree.Wang.out 5c7b80221c2dc93d4e6a6b857ccb62e8 *inst/extdata/trees/RAxML_bestTree.YCh 0e77d8f9386ddaee1de2f6678530c823 *inst/extdata/trees/RAxML_bestTree.mtG 2f7670326d5ff9235ecd0943944b6d59 *inst/extdata/trees/RAxML_bipartitions.3moles 959bc9ea585c21ab89b3f32a5bb49d25 *inst/extdata/trees/RAxML_bipartitions.AIs 46c172becde7e1d90ab68820b0c48822 *inst/extdata/trees/RAxML_bipartitions.YCh 75061d3e313e19632dcbce0ef48e9cdc *inst/extdata/trees/RAxML_bipartitions.mtG 2212d49c7269978890887be3686c12f9 *inst/extdata/trees/RAxML_bipartitions.woodmouse b1b3ceb83427c63fed23790fd563ef6e *inst/extdata/trees/RAxML_bipartitionsBranchLabels.3moles 41fd855853c4ceb7e28d5212b1c72d9b *inst/extdata/trees/RAxML_bipartitionsBranchLabels.AIs 0d8694f8ea078f981819be215fb724ba *inst/extdata/trees/RAxML_bipartitionsBranchLabels.YCh abcfbaf31212288e26a67c5b6c30ae70 *inst/extdata/trees/RAxML_bipartitionsBranchLabels.mtG 25077ff0b9f822583f5ae13d8bbc181a *inst/extdata/trees/RAxML_bootstrap.3moles bd830645e73afa0ee2cb121c22c4d2f2 *inst/extdata/trees/RAxML_bootstrap.AIs 086fb65b6bd2d40f09fff513b86d55cc *inst/extdata/trees/RAxML_bootstrap.Wang.out 49ade6ade3f8f08033b887a001243c86 *inst/extdata/trees/RAxML_bootstrap.YCh d2016de5a6926dd0b62c49502ec2d6b9 *inst/extdata/trees/RAxML_bootstrap.mtG 000df141b844795d38e5a755aa360f97 *inst/extdata/trees/RAxML_bootstrap.woodmouse 6cd945acf5464dce8e10c350097e2c20 *inst/extdata/trees/RAxML_distances.Wang.nxs 02888c45178001387b7a5397a3a17d3c *inst/extdata/trees/Splits.txt d3069d1eff9e70bed655b8962bf4ee2b *inst/extdata/trees/primates.dna 129e8c41182f3557b1b9911625e100b9 *inst/extdata/trees/woodmouse.fasta 421488c1ce8687879f64a350fca6d055 *inst/extdata/trees/woodmouse.mrbayes.nex.con d83fc4958acba1f1d0ca4092393c5b3d *inst/extdata/trees/woodmouse.mrbayes.nex.run1.t e185a8c9c7aed17a3e216cb78d517fd4 *inst/extdata/trees/woodmouse.mrbayes.nex.run2.t 01399608c5cc2927ebed0659ac78863d *inst/extdata/trees/woodmouse.nxs 87fa1533c4dfe7074237cfa2196bcbeb *inst/extdata/wag.dat 5e5c9da6e7ba15b472b9ea3958876662 *inst/phangorn_sticker.png b3ce1bb1450b5e60d76e7e7d9c5db9ce *inst/tinytest/test_Clanistics.R 47e00e8bb86bf7f5c0ee0397941f8cfd *inst/tinytest/test_SH.R aeaf624004c9e9dcf9265ea47c09389d *inst/tinytest/test_ancestral.R 2a2e8514a73ba4a02d62d9a0cd36e7be *inst/tinytest/test_bootstrap.R 4fd1391e9729fe532820bcbe2f0a5507 *inst/tinytest/test_codon.R 743a9027424289cd96655ed0ea1032cb *inst/tinytest/test_dist_tree.R 9c911e52992a082a978ddaa4879609c8 *inst/tinytest/test_distances.R 7b12bdc75c434700a5095545da261bba *inst/tinytest/test_hadamard.R 49bec950fdf8ff6034c263a231e3bfe3 *inst/tinytest/test_mast.R 44b23c807d72fe05ced3c3b5661e2e13 *inst/tinytest/test_modelTest.R 66273dcf2a72d28287b6179dfbbaa28b *inst/tinytest/test_parsimony.R db95098670cfa6c0d3400238ae48fbe1 *inst/tinytest/test_phyDat.R c908e4255e504e1a783fcf09bd1c32cc *inst/tinytest/test_pml.R 6baabdc92fd297936eb619837320ef35 *inst/tinytest/test_pmlCluster.R 7dda65073f8a0ad4017e9bf4e4e1f71d *inst/tinytest/test_pmlMix.R 5f94576ee5e9a927833da9c1bc336a02 *inst/tinytest/test_pmlPart.R 66a962bcc703434a9afff9b4d05168ea *inst/tinytest/test_pmlPen.R 9fb0c7de01dc40a4eac7d8231c858fa7 *inst/tinytest/test_speciesTree.R 295751370f573fe69dc36f2396cf96f4 *inst/tinytest/test_splits.R dcac0cc9fbe28aeda00dd6a1bc9f2121 *inst/tinytest/test_superTree.R 91f54f28928a7ce4bc48f00718838e6f *inst/tinytest/test_treeManipulation.R 3645bdd96f541961003448d89470e64e *inst/tinytest/test_treeRearrangement.R 9342744307dbafb5d6db1b02d44a0482 *inst/tinytest/test_treedist.R 308cc143865b25766c9577650b87f5c0 *man/Ancestors.Rd 884ef49b5b15c34a389046336d547b94 *man/CI.Rd 2aabd7f30eb4ba55fb913d2defcc8c01 *man/Laurasiatherian.Rd f0c375eb726b230fdd114f0b3bb1b96b *man/NJ.Rd 5912be549b4f8cee8bf5027d112f697a *man/SH.test.Rd 4e98f950b33245fe670bf81f28ba30bf *man/SOWH.test.Rd f822ddacf5ef0e1b2ba42fbc1b614e72 *man/add.tips.Rd 6cef4523dc9eea44b06bc15e173111b7 *man/addConfidences.Rd 6e52ffa9b2657bbd10abb02b2321dcfa *man/allTrees.Rd fdfdb34c9a95ac78dbbede1d7cd19f6c *man/ancestral.pml.Rd 92890c5395de0178256085acddf732bd *man/as.networx.Rd 40fabc27849e290b35daa1b08462cf26 *man/as.splits.Rd a37fb5b6542d063acc1b3468cbe8466d *man/bab.Rd 01f0224fbab4a562ff0de2e07460405b *man/bootstrap.pml.Rd 84449bdbd0b2adefb75bd71de6be5d8d *man/chloroplast.Rd f787e20d86e0066ef16a220d082241f1 *man/cladePar.Rd 7f22c4b1e1385b67ce4f53b86461bd5e *man/coalSpeciesTree.Rd 42471258d0b98e035383fc6fc48e8665 *man/codonTest.Rd fa905f26fbe271df5c6f179880f26557 *man/consensusNet.Rd 9a6059134efdbcae3f438ef949806bfd *man/cophenetic.networx.Rd 5173eb8e2f87b21391e5c49c0927e905 *man/delta.score.Rd dd60dbc9f9eb4f7960ad7fa9a8dd698f *man/densiTree.Rd 91b33d61d135f1139f0d81d738d9c80d *man/designTree.Rd dfbc54435ddc425192da2b8de37a90fe *man/dfactorial.Rd 5962433814147f5f8ecc33c86b031c7c *man/discrete.gamma.Rd 2e3c9424353c887ce0b38dd02814b983 *man/dist.hamming.Rd 8a4bbe826bf261a766136ac74bd13162 *man/dist.p.Rd 13e311418f4e1eaf9c0f23f83a708324 *man/distanceHadamard.Rd dc442f0a525c0dea47e40ecdab46462b *man/dna2codon.Rd d092f8360372abe2b4fcde6d1b9e3605 *man/getClans.Rd 3ff97af050ddd7cb3d7866394f2154b5 *man/hadamard.Rd 88d5f40a3251082914b398fe2c0706cd *man/identify.networx.Rd e77fd8dbf4e3b777f4364f88c074fbed *man/lento.Rd d7eea3b3e99f899cea87f965c1f7aba8 *man/mast.Rd 659037e779db03c39e75216611b96290 *man/maxCladeCred.Rd 7a5d94abd06b0dce47c0d4ba5854ffed *man/midpoint.Rd 7de1582b4f3152fac14b580f74156b49 *man/modelTest.Rd cc7c4671f631780dfdf621343998d6d0 *man/neighborNet.Rd 214b9849369866569e980e7be0bb387a *man/nni.Rd ea84bf2c1c47dd6b308c7494ed35939c *man/parsimony.Rd a25a1cb3777fd0eedabe0a2762ea444f *man/phangorn-internal.Rd 030236df96fce5095434564034fbd1a4 *man/phangorn-package.Rd 8c05d327a610db21a0a62a310ab09f17 *man/phyDat.Rd c9a5efd66577e428e6430babadd00d27 *man/plot.networx.Rd 9c7c786c180e3a5c9fab34ce17aba4a8 *man/plotBS.Rd 879456742f48808156b1cd0a3a546ceb *man/pml.Rd a88f52fcc81ccac61342a3a8f03e5916 *man/pml.fit.Rd d0db98616ba12dfe7b0dda1a6d741241 *man/pmlCluster.Rd 39c628df5e7eb85f6d44e7ef4aae4d47 *man/pmlMix.Rd 621414610dc236312e772e99c018cb59 *man/pmlPart.Rd f80cfdf44cae9a09939e75d72a4222af *man/read.aa.Rd 6128f2022a7c2d199b7649e240159e44 *man/read.nexus.splits.Rd 133c5bb904032971f0b5e69afcfe11c9 *man/read.phyDat.Rd 03065d6d8d2fdbfed0e1fce7561277fc *man/simSeq.Rd a15b2124c0fd514a8f3f5b208d65ddbc *man/splitsNetwork.Rd a33948d6c5b8dd8e1ee6fa32e87cdd11 *man/superTree.Rd 9511f2ce1d961e2a8c5819cd0dff2c5b *man/treedist.Rd 73308bbdef266b537f9a6aa413f539b7 *man/upgma.Rd 8d1ad5757e44f5318adabe5b0d94a2e1 *man/writeDist.Rd 7b4fdcfc85bc945a86723f094057dbcb *man/yeast.Rd 427f79cb72f331e85c03454d5af3f8fe *src/Fitch.h c45a68c7cfa876c9f79acf87d0809a57 *src/Makevars 3449ae67bd61159c30640793f03b5053 *src/RcppExports.cpp dc3cbbe97834227fc3ac5456f58848b1 *src/dist.c a96e879a51643d022766029e97213bb6 *src/dupAtomMat.cpp 6db38ab2c63f35679a2ef493a01bc97c *src/fitch64.cpp 403b0f1d27a423e357f3e96cd7aefe12 *src/lessAndEqual.h 58e8680cb449aede5eb57c90ae0dac7e *src/ml.c 6f7f95f69b4d259fdc28d8a87f144fd2 *src/phangorn.c d514d67124d8dc9755a8b46c72fa2ec7 *src/phangorn_utils.cpp ea95153fdf0e10b2bd67d91094d1bad8 *src/phangorn_utils.h b322aa12ac146cbcdd5d9568a7fdb18b *src/rcSet.h be65a5e85d58c56ab754b21292ab5360 *src/sankoff.c 043d6aef15a889046fbaca1a32433162 *src/sprdist.c 3a302c7e7c5126983bbc108aae9b63e2 *tests/tinytest.R 5cd80fa36cd3dcacce129cb79423ca97 *vignettes/AdvancedFeatures.Rmd 60c82ad4aa2e22c6fb220b0f61d83332 *vignettes/Ancestral.Rmd 00bef846273254282f2091ef7c30fc7d *vignettes/IntertwiningTreesAndNetworks.Rmd 01d7816efe646b305a6b68a402f7930e *vignettes/Networx.Rmd a8250afd3b341e6c3f889e9454d5bc5f *vignettes/Trees.RData 24a44b62426d1cab33de2a4cc884f526 *vignettes/Trees.Rmd 3b1285249eed24e70427c0b56450533a *vignettes/cophylo.png 6af5f4d4c2e93469cc19d46a97ab5d0f *vignettes/exdna.txt 1ca8b1d97a011a9d0ecd9630d548dfb3 *vignettes/movie.gif 9b4ec1e8884f78039e9c13ad4a593077 *vignettes/phangorn.bib d3069d1eff9e70bed655b8962bf4ee2b *vignettes/primates.dna 6b0ad41d4ea31b2e41c1b131c538c69d *vignettes/seqLogo.png phangorn/inst/0000755000176200001440000000000014155651242013050 5ustar liggesusersphangorn/inst/README0000644000176200001440000000123213707232051013721 0ustar liggesusersThe following persons and institutions helped in the development of phangorn at one stage or another. Emmanuel Paradis and all the other authors of the APE package. Tim White for provinding some C-code to compute the Hadamard distances. Bennet McComish for providing the allTrees function. Francois-Joiseph Lapointe for feedback on clans and clips. Further thanks to all the user that send bug reports/fixes and have helped to improve this package. Financial support was provided by the Alan Wilson Centre of Molecular Ecology and Evolution and the Muséum national d'Histoire naturelle and Universidade de Vigo. phangorn/inst/doc/0000755000176200001440000000000014155651242013615 5ustar liggesusersphangorn/inst/doc/AdvancedFeatures.Rmd0000644000176200001440000003233114140464110017455 0ustar liggesusers--- title: "Advanced features" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: > %\VignetteIndexEntry{Advanced features} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ``` # Introduction This document illustrates some of the _phangorn_ [@Schliep2011] specialized features which are useful but maybe not as well-known or just not (yet) described elsewhere. This is mainly interesting for someone who wants to explore different models or set up some simulation studies. We show how to construct data objects for different character states other than nucleotides or amino acids or how to set up different models to estimate transition rate. The vignette *Trees* describes in detail how to estimate phylogenies from nucleotide or amino acids. # User defined data formats To better understand how to define our own data type it is useful to know a bit more about the internal representation of `phyDat` objects. The internal representation of `phyDat` object is very similar to `factor` objects. As an example we will show here several possibilities to define nucleotide data with gaps defined as a fifth state. Ignoring gaps or coding them as ambiguous sites - as it is done in most programs, also in phangorn as default - may be misleading (see [@Warnow2012]). When the number of gaps is low and the gaps are missing at random coding gaps as separate state may be not important. Let assume we have given a matrix where each row contains a character vector of a taxonomic unit: ```{r} library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data ``` Normally we would transform this matrix into an phyDat object and gaps are handled as ambiguous character like "?". ```{r} gapsdata1 = phyDat(data) gapsdata1 ``` Now we will define a "USER" defined object and have to supply a vector levels of the character states for the new data, in our case the for nucleotide states and the gap. Additional we can define ambiguous states which can be any of the states. ```{r} gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 ``` This is not yet what we wanted as two sites of our alignment, which contain the ambiguous characters "r" and "y", got deleted. To define ambiguous characters like "r" and "y" explicitly we have to supply a contrast matrix similar to contrasts for factors. ```{r} contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 ``` Here we defined "n" as a state which can be any nucleotide but not a gap "-" and "?" can be any state including a gap. These data can be used in all functions available in _phangorn_ to compute distance matrices or perform parsimony and maximum likelihood analysis. # Markov models of character evolution To model nucleotide substitutions across the edges of a tree T we can assign a transition matrix. In the case of nucleotides, with four character states, each 4 $\times$ 4 transition matrix has, at most, 12 free parameters. Time-reversible Markov models are used to describe how characters change over time, and use fewer parameters. Time-reversible means that these models need not be directed in time, and the Markov property states that these models depend only on the current state. These models are used in analysis of phylogenies using maximum likelihood and MCMC, computing pairwise distances, as well in simulating sequence evolution. We will now describe the General Time-Reversible (GTR) model [@Tavare1986]. The parameters of the GTR model are the equilibrium frequencies $\pi = (\pi_A ,\pi_C ,\pi_G ,\pi_T)$ and a rate matrix $Q$ which has the form \begin{equation} Q = \begin{pmatrix} \ast & \alpha\pi_C & \beta\pi_G & \gamma\pi_T \\ \alpha\pi_A & \ast & \delta\pi_G & \epsilon\pi_T \\ \beta\pi_A & \delta\pi_C & \ast & \eta\pi_T \\ \gamma\pi_A & \epsilon\pi_C & \eta\pi_G & \ast \\ \end{pmatrix} (1) \end{equation} where we need to assign 6 parameters $\alpha, \dots, \eta$. The elements on the diagonal are chosen so that the rows sum to zero. The Jukes-Cantor (JC) [@Jukes1969] model can be derived as special case from the GTR model, for equal equilibrium frequencies $\pi_A = \pi_C = \pi_G = \pi_T = 0.25$ and equal rates set to $\alpha = \beta = \gamma = \delta = \eta$. Table \@ref(tab:models) lists all built-in nucleotide models in _phangorn_. The transition probabilities which describe the probabilities of change from character $i$ to $j$ in time $t$, are given by the corresponding entries of the matrix exponential \[ P(t) = (p_{ij}(t)) = e^{Qt}, \qquad \sum_j p_{ij}=1 \] where $P(t)$ is the transition matrix spanning a period of time $t$. # Estimation of non-standard transition rate matrices In the last section \@ref(user) we described how to set up user defined data formats. Now we describe how to estimate transition matrices with pml. Again for nucleotide data the most common models can be called directly in the `optim.pml` function (e.g. "JC69", "HKY", "GTR" to name a few). Table 2 lists all the available nucleotide models, which can estimated directly in `optim.pml`. For amino acids several transition matrices are available ("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT","RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff\_DCMut" and "JTT-DCMut") or can be estimated with `optim.pml`. For example Mathews et al. (2010) [@Mathews2010] used this function to estimate a phytochrome amino acid transition matrix. We will now show how to estimate a rate matrix with different transition ($\alpha$) and transversion ratio ($\beta$) and a fixed rate to the gap state ($\gamma$) - a kind of Kimura two-parameter model (K81) for nucleotide data with gaps as fifth state (see table 1). | a | c | g | t | - --|----------|----------|----------|----------|---- a | | | | | c | $\beta$ | | | | g | $\alpha$ | $\beta$ | | | t | $\beta$ | $\alpha$ | $\beta$ | | - | $\gamma$ | $\gamma$ | $\gamma$ | $\gamma$ | : Tab 1. Rate matrix with 3 parameters to optimize. If we want to fit a non-standard transition rate matrices, we have to tell `optim.pml`, which transitions in Q get the same rate. The parameter vector subs accepts a vector of consecutive integers and at least one element has to be zero (these gets the reference rate of 1). Negative values indicate that there is no direct transition is possible and the rate is set to zero. ```{r} library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit ``` Here are some conventions how the models are estimated: If a model is supplied the base frequencies bf and rate matrix Q are optimized according to the model (nucleotides) or the adequate rate matrix and frequencies are chosen (for amino acids). If optQ=TRUE and neither a model or subs are supplied than a symmetric (optBf=FALSE) or reversible model (optBf=TRUE, i.e. the GTR for nucleotides) is estimated. This can be slow if the there are many character states, e.g. for amino acids. Table 2 shows how parameters are optimized and number of parameters to estimate. The elements of the vector subs correspond to $\alpha, \dots, \eta$ in equation (1) model | optQ | optBf | subs | df -------|------|-------|------|---- JC | FALSE | FALSE | $c(0, 0, 0, 0, 0, 0)$ | 0 F81 | FALSE | TRUE | $c(0, 0, 0, 0, 0, 0)$ | 3 K80 | TRUE | FALSE | $c(0, 1, 0, 0, 1, 0)$ | 1 HKY | TRUE | TRUE | $c(0, 1, 0, 0, 1, 0)$ | 4 TrNe | TRUE | FALSE | $c(0, 1, 0, 0, 2, 0)$ | 2 TrN | TRUE | TRUE | $c(0, 1, 0, 0, 2, 0)$ | 5 TPM1 | TRUE | FALSE | $c(0, 1, 2, 2, 1, 0)$ | 2 K81 | TRUE | FALSE | $c(0, 1, 2, 2, 1, 0)$ | 2 TPM1u | TRUE | TRUE | $c(0, 1, 2, 2, 1, 0)$ | 5 TPM2 | TRUE | FALSE | $c(1, 2, 1, 0, 2, 0)$ | 2 TPM2u | TRUE | TRUE | $c(1, 2, 1, 0, 2, 0)$ | 5 TPM3 | TRUE | FALSE | $c(1, 2, 0, 1, 2, 0)$ | 2 TPM3u | TRUE | TRUE | $c(1, 2, 0, 1, 2, 0)$ | 5 TIM1e | TRUE | FALSE | $c(0, 1, 2, 2, 3, 0)$ | 3 TIM1 | TRUE | TRUE | $c(0, 1, 2, 2, 3, 0)$ | 6 TIM2e | TRUE | FALSE | $c(1, 2, 1, 0, 3, 0)$ | 3 TIM2 | TRUE | TRUE | $c(1, 2, 1, 0, 3, 0)$ | 6 TIM3e | TRUE | FALSE | $c(1, 2, 0, 1, 3, 0)$ | 3 TIM3 | TRUE | TRUE | $c(1, 2, 0, 1, 3, 0)$ | 6 TVMe | TRUE | FALSE | $c(1, 2, 3, 4, 2, 0)$ | 4 TVM | TRUE | TRUE | $c(1, 2, 3, 4, 2, 0)$ | 7 SYM | TRUE | FALSE | $c(1, 2, 3, 4, 5, 0)$ | 5 GTR | TRUE | TRUE | $c(1, 2, 3, 4, 5, 0)$ | 8 : Tab 2. DNA models available in phangorn. # Codon substitution models A special case of the transition rates are codon models._phangorn_ now offers the possibility to estimate the $d_N/d_S$ ratio (sometimes called ka/ks), for an overview see [@Yang2014]. These functions extend the option to estimates the $d_N/d_S$ ratio for pairwise sequence comparison as it is available through the function `kaks` in _seqinr_. The transition rate between between codon $i$ and $j$ is defined as follows: \begin{eqnarray} q_{ij}=\left\{ \begin{array}{l@{\quad}l} 0 & \textrm{if i and j differ in more than one position} \\ \pi_j & \textrm{for synonymous transversion} \\ \pi_j\kappa & \textrm{for synonymous transition} \\ \pi_j\omega & \textrm{for non-synonymous transversion} \\ \pi_j\omega\kappa & \textrm{for non synonymous transition} \end{array} \right. \nonumber \end{eqnarray} where $\omega$ is the $d_N/d_S$ ratio, $\kappa$ the transition transversion ratio and $\pi_j$ is the the equilibrium frequencies of codon $j$. For $\omega\sim1$ the an amino acid change is neutral, for $\omega < 1$ purifying selection and $\omega > 1$ positive selection. There are four models available: "codon0", where both parameter $\kappa$ and $\omega$ are fixed to 1, "codon1" where both parameters are estimated and "codon2" or "codon3" where $\kappa$ or $\omega$ is fixed to 1. We compute the $d_N/d_S$ for some sequences given a tree using the ML functions `pml` and `optim.pml`. First we have to transform the the nucleotide sequences into codons (so far the algorithms always takes triplets). ```{r} library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) ``` There are several ways to estimate the codon frequencies $\pi_j$. The simplest model is to assume they have equal frequencies (=1/61). A second is to use the empirical codon frequencies, either computed using `baseFreq` or using the argument `bf="empirical"` in `pml`. Last but not least the frequencies can be derived from the base frequencies at each codon position, the F3x4 model is set by the argument `bf="F3x4"`. One can estimate the codon frequencies setting the option to `optBf=TRUE` in `optim.pml`. As the convergence of the 60 parameters the convergence is likely slow set the maximal iterations to a higher value than the default (e.g. `control = pml.control(maxit=50)`). Similar parameters of the F3x4 can also estimated using ML `optF3x4=TRUE` instead. The "YN98" model [@Yang1998] is similar to the "codon1", but additional optimizes the codon frequencies. # Generating trees _phangorn_ has several functions to generate tree topologies, which may are interesting for simulation studies. `allTrees` computes all possible bifurcating tree topologies either rooted or unrooted for up to 10 taxa. One has to keep in mind that the number of trees is growing exponentially, use `howmanytrees` from _ape_ as a reminder. ```{r} trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") ``` `nni` returns a list of all trees which are one nearest neighbor interchange away. ```{r} nni(trees[[1]]) ``` `rNNI` and `rSPR` generate trees which are a defined number of NNI (nearest neighbor interchange) or SPR (subtree pruning and regrafting) away. # Session info ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/inst/doc/AdvancedFeatures.html0000644000176200001440000037047514155651213017725 0ustar liggesusers Advanced features

Introduction

This document illustrates some of the phangorn (Schliep 2011) specialized features which are useful but maybe not as well-known or just not (yet) described elsewhere. This is mainly interesting for someone who wants to explore different models or set up some simulation studies. We show how to construct data objects for different character states other than nucleotides or amino acids or how to set up different models to estimate transition rate.

The vignette Trees describes in detail how to estimate phylogenies from nucleotide or amino acids.

User defined data formats

To better understand how to define our own data type it is useful to know a bit more about the internal representation of phyDat objects. The internal representation of phyDat object is very similar to factor objects.

As an example we will show here several possibilities to define nucleotide data with gaps defined as a fifth state. Ignoring gaps or coding them as ambiguous sites - as it is done in most programs, also in phangorn as default - may be misleading (see (Warnow 2012)). When the number of gaps is low and the gaps are missing at random coding gaps as separate state may be not important.

Let assume we have given a matrix where each row contains a character vector of a taxonomic unit:

library(phangorn)
## Lade nötiges Paket: ape
data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g",
    "a","a","t","g","g","a","t","-","c","t","c","a",
    "a","a","t","-","g","a","c","c","c","t","?","g"),
    dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE)
data
##    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
## t1 "r"  "a"  "y"  "g"  "g"  "a"  "c"  "-"  "c"  "t"   "c"   "g"  
## t2 "a"  "a"  "t"  "g"  "g"  "a"  "t"  "-"  "c"  "t"   "c"   "a"  
## t3 "a"  "a"  "t"  "-"  "g"  "a"  "c"  "c"  "c"  "t"   "?"   "g"

Normally we would transform this matrix into an phyDat object and gaps are handled as ambiguous character like “?”

gapsdata1 = phyDat(data)
gapsdata1
## 3 sequences with 12 character and 11 different site patterns.
## The states are a c g t

Now we will define a “USER” defined object and have to supply a vector levels of the character states for the new data, in our case the for nucleotide states and the gap. Additional we can define ambiguous states which can be any of the states.

gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"),
    ambiguity = c("?", "n"))
## Warning in phyDat.default(data, levels = levels, return.index = return.index, :
## Found unknown characters (not supplied in levels). Deleted sites with unknown
## states.
gapsdata2
## 3 sequences with 10 character and 9 different site patterns.
## The states are a c g t -

This is not yet what we wanted as two sites of our alignment, which contain the ambiguous characters “r” and “y,” got deleted. To define ambiguous characters like “r” and “y” explicitly we have to supply a contrast matrix similar to contrasts for factors.

contrast = matrix(data = c(1,0,0,0,0,
    0,1,0,0,0,
    0,0,1,0,0,
    0,0,0,1,0,
    1,0,1,0,0,
    0,1,0,1,0,
    0,0,0,0,1,
    1,1,1,1,0,
    1,1,1,1,1),
    ncol = 5, byrow = TRUE)
dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"),
    c("a", "c", "g", "t", "-"))
contrast
##   a c g t -
## a 1 0 0 0 0
## c 0 1 0 0 0
## g 0 0 1 0 0
## t 0 0 0 1 0
## r 1 0 1 0 0
## y 0 1 0 1 0
## - 0 0 0 0 1
## n 1 1 1 1 0
## ? 1 1 1 1 1
gapsdata3 = phyDat(data, type="USER", contrast=contrast)
gapsdata3
## 3 sequences with 12 character and 11 different site patterns.
## The states are a c g t -

Here we defined “n” as a state which can be any nucleotide but not a gap “-” and “?” can be any state including a gap.

These data can be used in all functions available in phangorn to compute distance matrices or perform parsimony and maximum likelihood analysis.

Markov models of character evolution

To model nucleotide substitutions across the edges of a tree T we can assign a transition matrix. In the case of nucleotides, with four character states, each 4 \(\times\) 4 transition matrix has, at most, 12 free parameters.

Time-reversible Markov models are used to describe how characters change over time, and use fewer parameters. Time-reversible means that these models need not be directed in time, and the Markov property states that these models depend only on the current state. These models are used in analysis of phylogenies using maximum likelihood and MCMC, computing pairwise distances, as well in simulating sequence evolution.

We will now describe the General Time-Reversible (GTR) model (Tavaré 1986). The parameters of the GTR model are the equilibrium frequencies \(\pi = (\pi_A ,\pi_C ,\pi_G ,\pi_T)\) and a rate matrix \(Q\) which has the form \[\begin{equation} Q = \begin{pmatrix} \ast & \alpha\pi_C & \beta\pi_G & \gamma\pi_T \\ \alpha\pi_A & \ast & \delta\pi_G & \epsilon\pi_T \\ \beta\pi_A & \delta\pi_C & \ast & \eta\pi_T \\ \gamma\pi_A & \epsilon\pi_C & \eta\pi_G & \ast \\ \end{pmatrix} (1) \end{equation}\]

where we need to assign 6 parameters \(\alpha, \dots, \eta\). The elements on the diagonal are chosen so that the rows sum to zero. The Jukes-Cantor (JC) (Jukes and Cantor 1969) model can be derived as special case from the GTR model, for equal equilibrium frequencies \(\pi_A = \pi_C = \pi_G = \pi_T = 0.25\) and equal rates set to \(\alpha = \beta = \gamma = \delta = \eta\). Table @ref(tab:models) lists all built-in nucleotide models in phangorn. The transition probabilities which describe the probabilities of change from character \(i\) to \(j\) in time \(t\), are given by the corresponding entries of the matrix exponential \[ P(t) = (p_{ij}(t)) = e^{Qt}, \qquad \sum_j p_{ij}=1 \] where \(P(t)\) is the transition matrix spanning a period of time \(t\).

Estimation of non-standard transition rate matrices

In the last section @ref(user) we described how to set up user defined data formats. Now we describe how to estimate transition matrices with pml.

Again for nucleotide data the most common models can be called directly in the optim.pml function (e.g. “JC69,” “HKY,” “GTR” to name a few). Table 2 lists all the available nucleotide models, which can estimated directly in optim.pml. For amino acids several transition matrices are available (“WAG,” “JTT,” “LG,” “Dayhoff,” “cpREV,” “mtmam,” “mtArt,” “MtZoa,” “mtREV24,” “VT,”“RtREV,” “HIVw,” “HIVb,” “FLU,” “Blosum62,” “Dayhoff_DCMut” and “JTT-DCMut”) or can be estimated with optim.pml. For example Mathews et al. (2010) (Mathews, Clements, and Beilstein 2010) used this function to estimate a phytochrome amino acid transition matrix.

We will now show how to estimate a rate matrix with different transition (\(\alpha\)) and transversion ratio (\(\beta\)) and a fixed rate to the gap state (\(\gamma\)) - a kind of Kimura two-parameter model (K81) for nucleotide data with gaps as fifth state (see table 1).

Tab 1. Rate matrix with 3 parameters to optimize.
a c g t -
a
c \(\beta\)
g \(\alpha\) \(\beta\)
t \(\beta\) \(\alpha\) \(\beta\)
- \(\gamma\) \(\gamma\) \(\gamma\) \(\gamma\)

If we want to fit a non-standard transition rate matrices, we have to tell optim.pml, which transitions in Q get the same rate. The parameter vector subs accepts a vector of consecutive integers and at least one element has to be zero (these gets the reference rate of 1). Negative values indicate that there is no direct transition is possible and the rate is set to zero.

library(ape)
tree = unroot(rtree(3))
fit = pml(tree, gapsdata3)
fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2),
    control=pml.control(trace=0))
fit
## 
##  loglikelihood: -33.01 
## 
## unconstrained loglikelihood: -28.43 
## 
## Rate matrix:
##           a         c         g         t      -
## a 0.000e+00 2.584e-06 1.000e+00 2.584e-06 0.6912
## c 2.584e-06 0.000e+00 2.584e-06 1.000e+00 0.6912
## g 1.000e+00 2.584e-06 0.000e+00 2.584e-06 0.6912
## t 2.584e-06 1.000e+00 2.584e-06 0.000e+00 0.6912
## - 6.912e-01 6.912e-01 6.912e-01 6.912e-01 0.0000
## 
## Base frequencies:  
## 0.2 0.2 0.2 0.2 0.2

Here are some conventions how the models are estimated:

If a model is supplied the base frequencies bf and rate matrix Q are optimized according to the model (nucleotides) or the adequate rate matrix and frequencies are chosen (for amino acids). If optQ=TRUE and neither a model or subs are supplied than a symmetric (optBf=FALSE) or reversible model (optBf=TRUE, i.e. the GTR for nucleotides) is estimated. This can be slow if the there are many character states, e.g. for amino acids. Table 2 shows how parameters are optimized and number of parameters to estimate. The elements of the vector subs correspond to \(\alpha, \dots, \eta\) in equation (1)

Tab 2. DNA models available in phangorn.
model optQ optBf subs df
JC FALSE FALSE \(c(0, 0, 0, 0, 0, 0)\) 0
F81 FALSE TRUE \(c(0, 0, 0, 0, 0, 0)\) 3
K80 TRUE FALSE \(c(0, 1, 0, 0, 1, 0)\) 1
HKY TRUE TRUE \(c(0, 1, 0, 0, 1, 0)\) 4
TrNe TRUE FALSE \(c(0, 1, 0, 0, 2, 0)\) 2
TrN TRUE TRUE \(c(0, 1, 0, 0, 2, 0)\) 5
TPM1 TRUE FALSE \(c(0, 1, 2, 2, 1, 0)\) 2
K81 TRUE FALSE \(c(0, 1, 2, 2, 1, 0)\) 2
TPM1u TRUE TRUE \(c(0, 1, 2, 2, 1, 0)\) 5
TPM2 TRUE FALSE \(c(1, 2, 1, 0, 2, 0)\) 2
TPM2u TRUE TRUE \(c(1, 2, 1, 0, 2, 0)\) 5
TPM3 TRUE FALSE \(c(1, 2, 0, 1, 2, 0)\) 2
TPM3u TRUE TRUE \(c(1, 2, 0, 1, 2, 0)\) 5
TIM1e TRUE FALSE \(c(0, 1, 2, 2, 3, 0)\) 3
TIM1 TRUE TRUE \(c(0, 1, 2, 2, 3, 0)\) 6
TIM2e TRUE FALSE \(c(1, 2, 1, 0, 3, 0)\) 3
TIM2 TRUE TRUE \(c(1, 2, 1, 0, 3, 0)\) 6
TIM3e TRUE FALSE \(c(1, 2, 0, 1, 3, 0)\) 3
TIM3 TRUE TRUE \(c(1, 2, 0, 1, 3, 0)\) 6
TVMe TRUE FALSE \(c(1, 2, 3, 4, 2, 0)\) 4
TVM TRUE TRUE \(c(1, 2, 3, 4, 2, 0)\) 7
SYM TRUE FALSE \(c(1, 2, 3, 4, 5, 0)\) 5
GTR TRUE TRUE \(c(1, 2, 3, 4, 5, 0)\) 8

Codon substitution models

A special case of the transition rates are codon models._phangorn_ now offers the possibility to estimate the \(d_N/d_S\) ratio (sometimes called ka/ks), for an overview see (Yang 2014). These functions extend the option to estimates the \(d_N/d_S\) ratio for pairwise sequence comparison as it is available through the function kaks in seqinr. The transition rate between between codon \(i\) and \(j\) is defined as follows: \[\begin{eqnarray} q_{ij}=\left\{ \begin{array}{l@{\quad}l} 0 & \textrm{if i and j differ in more than one position} \\ \pi_j & \textrm{for synonymous transversion} \\ \pi_j\kappa & \textrm{for synonymous transition} \\ \pi_j\omega & \textrm{for non-synonymous transversion} \\ \pi_j\omega\kappa & \textrm{for non synonymous transition} \end{array} \right. \nonumber \end{eqnarray}\] where \(\omega\) is the \(d_N/d_S\) ratio, \(\kappa\) the transition transversion ratio and \(\pi_j\) is the the equilibrium frequencies of codon \(j\). For \(\omega\sim1\) the an amino acid change is neutral, for \(\omega < 1\) purifying selection and \(\omega > 1\) positive selection. There are four models available: “codon0,” where both parameter \(\kappa\) and \(\omega\) are fixed to 1, “codon1” where both parameters are estimated and “codon2” or “codon3” where \(\kappa\) or \(\omega\) is fixed to 1.

We compute the \(d_N/d_S\) for some sequences given a tree using the ML functions pml and optim.pml. First we have to transform the the nucleotide sequences into codons (so far the algorithms always takes triplets).

library(phangorn)
fdir <- system.file("extdata/trees", package = "phangorn")
primates <- read.phyDat(file.path(fdir, "primates.dna"),
                        format = "interleaved")
tree <- NJ(dist.ml(primates))
dat <- dna2codon(primates)
fit <- pml(tree, dat, bf="F3x4")
fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0))
fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0))
fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0))
fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0))
anova(fit0, fit2, fit3, fit1)
## Likelihood Ratio Test Table
##   Log lik. Df Df change Diff log lik. Pr(>|Chi|)    
## 1    -2867 34                                       
## 2    -2866 35         1             2       0.14    
## 3    -2522 35         0           688     <2e-16 ***
## 4    -2521 36         1             2       0.20    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

There are several ways to estimate the codon frequencies \(\pi_j\). The simplest model is to assume they have equal frequencies (=1/61). A second is to use the empirical codon frequencies, either computed using baseFreq or using the argument bf="empirical" in pml. Last but not least the frequencies can be derived from the base frequencies at each codon position, the F3x4 model is set by the argument bf="F3x4". One can estimate the codon frequencies setting the option to optBf=TRUE in optim.pml. As the convergence of the 60 parameters the convergence is likely slow set the maximal iterations to a higher value than the default (e.g. control = pml.control(maxit=50)). Similar parameters of the F3x4 can also estimated using ML optF3x4=TRUE instead.

The “YN98” model (Yang and Nielsen 1998) is similar to the “codon1,” but additional optimizes the codon frequencies.

Generating trees

phangorn has several functions to generate tree topologies, which may are interesting for simulation studies. allTrees computes all possible bifurcating tree topologies either rooted or unrooted for up to 10 taxa. One has to keep in mind that the number of trees is growing exponentially, use howmanytrees from ape as a reminder.

trees <- allTrees(5)
par(mfrow=c(3,5), mar=rep(0,4))
for(i in 1:15)plot(trees[[i]], cex=1, type="u")

nni returns a list of all trees which are one nearest neighbor interchange away.

nni(trees[[1]])
## 4 phylogenetic trees

rNNI and rSPR generate trees which are a defined number of NNI (nearest neighbor interchange) or SPR (subtree pruning and regrafting) away.

Session info

## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3
## 
## locale:
##  [1] LC_CTYPE=de_AT.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_AT.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=de_AT.UTF-8    LC_MESSAGES=de_AT.UTF-8   
##  [7] LC_PAPER=de_AT.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] phangorn_2.8.1 ape_5.5-3     
## 
## loaded via a namespace (and not attached):
##  [1] igraph_1.2.9     Rcpp_1.0.7       knitr_1.36       magrittr_2.0.1  
##  [5] lattice_0.20-45  R6_2.5.1         quadprog_1.5-8   rlang_0.4.12    
##  [9] fastmatch_1.1-3  fastmap_1.1.0    highr_0.9        stringr_1.4.0   
## [13] tools_4.1.2      parallel_4.1.2   grid_4.1.2       nlme_3.1-153    
## [17] xfun_0.28        jquerylib_0.1.4  htmltools_0.5.2  yaml_2.2.1      
## [21] digest_0.6.29    Matrix_1.3-4     codetools_0.2-18 sass_0.4.0      
## [25] prettydoc_0.4.1  evaluate_0.14    rmarkdown_2.11   stringi_1.7.6   
## [29] compiler_4.1.2   bslib_0.3.1      jsonlite_1.7.2   pkgconfig_2.0.3

References

Jukes, Thomas H., and Charles R. Cantor. 1969. “{CHAPTER} 24 - Evolution of Protein Molecules.” In Mammalian Protein Metabolism, edited by H. N. Munro, 21–132. Academic Press.
Mathews, S., M. D. Clements, and M. A. Beilstein. 2010. “A Duplicate Gene Rooting of Seed Plants and the Phylogenetic Position of Flowering Plants.” Phil. Trans. R. Soc. B 365: 383–95.
Schliep, Klaus Peter. 2011. “Phangorn: Phylogenetic Analysis in R.” Bioinformatics 27 (4): 592–93. https://doi.org/10.1093/bioinformatics/btq706.
Tavaré, Simon. 1986. “Some Probabilistic and Statistical Problems in the Analysis of DNA Sequences.” Lectures on Mathematics in the Life Sciences, no. 17: 57–86.
Warnow, Tandy. 2012. “Standard Maximum Likelihood Analyses of Alignments with Gaps Can Be Statistically Inconsistent.” PLOS Currents Tree of Life.
Yang, Ziheng. 2014. Molecular Evolution: A Statistical Approach. Oxford: Oxford University Press.
Yang, Ziheng, and Rasmus Nielsen. 1998. “Synonymous and Nonsynonymous Rate Variation in Nuclear Genes of Mammals.” Journal of Molecular Evolution 46 (4): 409–18. https://doi.org/10.1007/PL00006320.
phangorn/inst/doc/IntertwiningTreesAndNetworks.Rmd0000644000176200001440000003346014140461352022126 0ustar liggesusers--- title: 'Intertwining phylogenetic trees and networks: R Example Script' author: "Klaus Schliep, Alastair Potts, David Morrison and Guido Grimm" date: "`r format(Sys.time(), '%B %d, %Y')`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github vignette: > %\VignetteIndexEntry{Intertwining phylogenetic trees and networks: R Example Script} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- [comment]: # (output: html_document) --- nocite: | @Schliep2017 ... ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ``` *Description:* This script provides examples of the new functions available in the phangorn library to 'intertwine' trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R. *Methodological advancement:* The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualize and further analyze this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community. *What next?:* By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and [support](https://github.com/KlausVigo/phangorn), the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience. ### Installing R 1. Download R Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html 2. Select your operating system and download the relevant installation file. 3. Install R following the instructions. ### Installing the phangorn library Open R and run the two lines of code below in the command line. (You will need to select a region from which to download the library) ```{r, eval=FALSE} install.packages("phangorn", dependencies=TRUE) # install latest development version needs devtools install.packages("devtools", dependencies=TRUE) library(devtools) install_github("KlausVigo/phangorn") ``` ### Getting started ```{r} library(phangorn) # load the phangorn library ``` ### Set the working directory This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input? This is done using the `setwd()` function, e.g. `setwd("C:/TreesNetworks/Example Files")`. We now set it to the folder of the phangorn package, which contains the files we want to load for this example. ### Read in the example file datasets: This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (*Apodemus sylvaticus*) in the Western Palearctic region. Molecular Ecology, 12, 685-697.) ```{r} ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ``` All example files read into R. ### Viewing the data ```{r} par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighborNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ``` ### Intertwining trees and network functions ### 1A: Identification of edge bundles (in black) in a neighbor-net (NN) network that correspond to branches (labelled 1-12) in a tree (a maximum likelihood tree, in this case). ```{r, fig.width=7, fig.height=4, small.mar=TRUE} # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ``` ### 1B: Bootstrap support for all branches (branch labels) in the ML tree mapped on the corresponding edge bundles of the NN network. The edges in the network which are not found as ML tree branches are highlighted in red. ```{r, small.mar=TRUE} # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ``` Again we can write to SplitsTree for viewing... ```{r} # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ``` ### 1C: Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges. ```{r, small.mar=TRUE} y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ``` ### Extras... We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighborNet (this is similar to the process explained in 1C above). ```{r, small.mar=TRUE} cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ``` ### There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstrapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimized trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimized trees anyway, i.e. they are compatible with the tree. Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimized tree for a dataset of @Wang2012. (An advanced user figure...) ```{r, fig.width=7, fig.height=6} Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) |> unroot() raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) |> unique() |> removeTrivialSplits() # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) |> unique() |> removeTrivialSplits() |> addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ``` ### Figure 4 ```{r} YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ``` There are several option plotting a co-phylogeny. In the following we use the `cophylo` function of the `phytools` package. ``` library(phytools) par(mfrow=c(2,1)) obj <- cophylo(YCh, mtG) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("A. YCh B. mtG") obj <- cophylo(ncAI, all_data) plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1)) title("C. ncAI D. All data") ``` ![](cophylo.png) Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions. ```{r} par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ``` We can compare this with consensus network with the different bootstrap values for the different genes. ```{r, small.mar=TRUE} par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) |> addConfidences(mtG_boot, add=TRUE) |> addConfidences(ncAI_boot, add=TRUE) |> addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) ``` phangorn/inst/doc/Networx.html0000644000176200001440000137505314155651220016163 0ustar liggesusers Splits and Networx

This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using phangorn (Schliep 2011) in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks (Holland et al. 2004) and Neighbor-Net (Bryant and Moulton 2004).
Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls).

We first load the phangorn package and a few data sets we use in this vignette.

library(phangorn)
data(Laurasiatherian)
data(yeast)

consensusNet

A consensusNet (Holland et al. 2004) is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequency of the corresponding splits in the provided list of trees.

The input for consensusNet is a list of trees i.e. an object of class multiPhylo.

set.seed(1)
bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), 
    bs=100)
tree <- nj(dist.hamming(yeast))
par("mar" = rep(1, 4))
tree <- plotBS(tree, bs, "phylogram")

cnet <- consensusNet(bs, .3)
plot(cnet, show.edge.label=TRUE)

In many cases, consensusNet will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D.

plot(cnet, "3D")
# rotate 3d plot
play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10)
# create animated gif file 
movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10)

which will result in a spinning graph similar to this

rotatingNetworx

neighborNet

The function neighborNet implements the popular method of Bryant and Moulton (2004). The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls).

dm <- dist.hamming(yeast)
nnet <- neighborNet(dm)
par("mar" = rep(1, 4))
plot(nnet)

The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in phangorn may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the networx is done using the the fantastic igraph package (Csardi and Nepusz 2006).

Adding support values

We can use the generic function addConfidences to add (branch) support values from a tree, i.e. an object of class phylo to a networx, splits or phylo object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects.

nnet <- addConfidences(nnet, tree)
par("mar" = rep(1, 4))
plot(nnet, show.edge.label=TRUE)

Analogously, we can also add support values to a tree:

tree2 <- rNNI(tree, 2)
tree2 <- addConfidences(tree2, tree)
# several support values are missing
par("mar" = rep(1, 4))
plot(tree2, show.node.label=TRUE)

Estimating edge weights (nnls)

Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph.

cnet <- nnls.networx(cnet, dm)
par("mar" = rep(1, 4))
plot(cnet, show.edge.label=TRUE)

Import and export networks, advanced functions for networx objects

The functions read.nexus.networx and write.nexus.networx can read and write nexus files for or from SplitsTree (Huson and Bryant 2006). Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications.

Session Information

sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3
## 
## locale:
##  [1] LC_CTYPE=de_AT.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_AT.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=de_AT.UTF-8    LC_MESSAGES=de_AT.UTF-8   
##  [7] LC_PAPER=de_AT.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] phangorn_2.8.1 ape_5.5-3     
## 
## loaded via a namespace (and not attached):
##  [1] igraph_1.2.9     Rcpp_1.0.7       knitr_1.36       magrittr_2.0.1  
##  [5] lattice_0.20-45  R6_2.5.1         quadprog_1.5-8   rlang_0.4.12    
##  [9] fastmatch_1.1-3  fastmap_1.1.0    highr_0.9        stringr_1.4.0   
## [13] tools_4.1.2      parallel_4.1.2   grid_4.1.2       nlme_3.1-153    
## [17] xfun_0.28        jquerylib_0.1.4  htmltools_0.5.2  yaml_2.2.1      
## [21] digest_0.6.29    Matrix_1.3-4     codetools_0.2-18 sass_0.4.0      
## [25] prettydoc_0.4.1  evaluate_0.14    rmarkdown_2.11   stringi_1.7.6   
## [29] compiler_4.1.2   bslib_0.3.1      jsonlite_1.7.2   pkgconfig_2.0.3

References

Bryant, David, and Vincent Moulton. 2004. Neighbor-Net: An Agglomerative Method for the Construction of Phylogenetic Networks.” Molecular Biology and Evolution 21 (2): 255–65. https://doi.org/10.1093/molbev/msh018.
Csardi, Gabor, and Tamas Nepusz. 2006. “The Igraph Software Package for Complex Network Research.” InterJournal Complex Systems: 1695. https://igraph.org/.
Holland, Barbara R., Katharina T. Huber, Vincent Moulton, and Peter J. Lockhart. 2004. “Using Consensus Networks to Visualize Contradictory Evidence for Species Phylogeny.” Molecular Biology and Evolution 21 (7): 1459–61. https://doi.org/10.1093/molbev/msh145.
Huson, D. H., and D. Bryant. 2006. “Application of Phylogenetic Networks in Evolutionary Studies.” Molecular Biology and Evolution 23 (2): 254–67.
Schliep, Klaus Peter. 2011. “Phangorn: Phylogenetic Analysis in R.” Bioinformatics 27 (4): 592–93. https://doi.org/10.1093/bioinformatics/btq706.
phangorn/inst/doc/AdvancedFeatures.R0000644000176200001440000000504414155651213017145 0ustar liggesusers## ----setup, echo=FALSE-------------------------------------------------------- # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ## ----------------------------------------------------------------------------- library(phangorn) data = matrix(c("r","a","y","g","g","a","c","-","c","t","c","g", "a","a","t","g","g","a","t","-","c","t","c","a", "a","a","t","-","g","a","c","c","c","t","?","g"), dimnames = list(c("t1", "t2", "t3"),NULL), nrow=3, byrow=TRUE) data ## ----------------------------------------------------------------------------- gapsdata1 = phyDat(data) gapsdata1 ## ----------------------------------------------------------------------------- gapsdata2 = phyDat(data, type="USER", levels=c("a","c","g","t","-"), ambiguity = c("?", "n")) gapsdata2 ## ----------------------------------------------------------------------------- contrast = matrix(data = c(1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,1,1), ncol = 5, byrow = TRUE) dimnames(contrast) = list(c("a","c","g","t","r","y","-","n","?"), c("a", "c", "g", "t", "-")) contrast gapsdata3 = phyDat(data, type="USER", contrast=contrast) gapsdata3 ## ----------------------------------------------------------------------------- library(ape) tree = unroot(rtree(3)) fit = pml(tree, gapsdata3) fit = optim.pml(fit, optQ=TRUE, subs=c(1,0,1,2,1,0,2,1,2,2), control=pml.control(trace=0)) fit ## ----------------------------------------------------------------------------- library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- NJ(dist.ml(primates)) dat <- dna2codon(primates) fit <- pml(tree, dat, bf="F3x4") fit0 <- optim.pml(fit, model="codon0", control=pml.control(trace=0)) fit1 <- optim.pml(fit, model="codon1", control=pml.control(trace=0)) fit2 <- optim.pml(fit, model="codon2", control=pml.control(trace=0)) fit3 <- optim.pml(fit, model="codon3", control=pml.control(trace=0)) anova(fit0, fit2, fit3, fit1) ## ----------------------------------------------------------------------------- trees <- allTrees(5) par(mfrow=c(3,5), mar=rep(0,4)) for(i in 1:15)plot(trees[[i]], cex=1, type="u") ## ----------------------------------------------------------------------------- nni(trees[[1]]) ## ----sessionInfo, echo=FALSE-------------------------------------------------- sessionInfo() phangorn/inst/doc/Ancestral.Rmd0000644000176200001440000001077014125321002016163 0ustar liggesusers--- title: "Ancestral Sequence Reconstruction" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: | %\VignetteIndexEntry{Ancestral Sequence Reconstruction} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, echo=FALSE} # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ``` # Introduction These notes describe the ancestral sequence reconstruction using the _phangorn_ package [@Schliep2011]. _phangorn_ provides several methods to estimate ancestral character states with either Maximum Parsimony (MP) or Maximum Likelihood (ML). For more background on all the methods see e.g. [@Felsenstein2004] or [@Yang2006]. # Parsimony reconstructions To reconstruct ancestral sequences we first load some data and reconstruct a tree: ```{r} library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) |> acctran(primates) parsimony(tree, primates) ``` For parsimony analysis of the edge length represent the observed number of changes. Reconstructing ancestral states therefore defines also the edge lengths of a tree. However there can exist several equally parsimonious reconstructions or states can be ambiguous and therefore edge length can differ. "MPR" reconstructs the ancestral states for each (internal) node as if the tree would be rooted in that node. However the nodes are not independent of each other. If one chooses one state for a specific node, this can restrict the choice of neighboring nodes (figures 2 and 3). The function acctran (accelerated transformation) assigns edge length and internal nodes to the tree [@Swofford1987]. ```{r} anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") ``` All the ancestral reconstructions for parsimony are based on the fitch algorithm and so far only bifurcating trees are allowed. However trees can get pruned afterwards using the function `multi2di` from _ape_. The `seqLogo` function from the _seqLogo_ package from Bioconductor provides a neat way to show proportions of a nucleotides of ancestral states (see figure 1). ```{r seqLogo, fig.cap="Fig 1. Ancestral reconstruction for a node.", eval=FALSE} library(seqLogo) seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) ``` ![](seqLogo.png) You may need to install _seqLogo_ before ```{r, eval=FALSE} if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("seqLogo") ``` ```{r MPR, fig.cap="Fig 2. Ancestral reconstruction using MPR."} plotAnc(tree, anc.mpr, 17) title("MPR") ``` ```{r ACCTRAN, fig.cap="Fig 3. Ancestral reconstruction using ACCTRAN."} plotAnc(tree, anc.acctran, 17) title("ACCTRAN") ``` # Likelihood reconstructions _phangorn_ also offers the possibility to estimate ancestral states using a ML. The advantages of ML over parsimony is that the reconstruction accounts for different edge lengths. So far only a marginal construction is implemented (see [@Yang2006]). ```{r} fit <- pml(tree, primates) fit <- optim.pml(fit, model="F81", control = pml.control(trace=0)) ``` We can assign the ancestral states according to the highest likelihood ("ml"): \[ P(x_r = A) = \frac{L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}L(x_r=k)} \] and the highest posterior probability ("bayes") criterion: \[ P(x_r=A) = \frac{\pi_A L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}\pi_k L(x_r=k)}, \] where $L(x_r)$ is the joint probability of states at the tips and the state at the root $x_r$ and $\pi_i$ are the estimated base frequencies of state $i$. Both methods agree if all states (base frequencies) have equal probabilities. ```{r} anc.ml <- ancestral.pml(fit, "ml") anc.bayes <- ancestral.pml(fit, "bayes") ``` The differences of the two approaches for a specific site (17) are represented in the following figures. ```{r plotML, fig.cap="Fig 4. Ancestral reconstruction the using the maximum likelihood."} plotAnc(tree, anc.ml, 17) title("ML") ``` ```{r plotB, fig.cap="Fig 5. Ancestral reconstruction using (empirical) Bayes."} plotAnc(tree, anc.bayes, 17) title("Bayes") ``` # Session info ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/inst/doc/IntertwiningTreesAndNetworks.html0000644000176200001440000167054714155651216022374 0ustar liggesusers Intertwining phylogenetic trees and networks: R Example Script

Description: This script provides examples of the new functions available in the phangorn library to ‘intertwine’ trees and networks, i.e. compare trees and networks and data transferrance. It also provides a step-by-step guide for users new to R.

Methodological advancement: The major advancement in this phangorn update is the introduction of a generic network object with a wide range of related transfer and analysis functions. These new functions provide the first means to directly transfer information amongst a wide range of phylogenetic trees and networks, as well as means to visualize and further analyze this information. This should provide a platform for individuals to easily conduct tree-network comparisons and stimulate further function development by the community.

What next?: By implementing full network handling compatibility in R, and providing exemplar scripts (such as this) and support, the scientific community now has an easy means to analyse and compare the results of phylogenetic trees vs. network approaches. We hope this will open a largely unexplored world to the general phylogenetic audience.

Installing R

  1. Download R
    Select the nearest mirror to your location at https://cran.r-project.org/mirrors.html
  2. Select your operating system and download the relevant installation file.
  3. Install R following the instructions.

Installing the phangorn library

Open R and run the two lines of code below in the command line.
(You will need to select a region from which to download the library)

install.packages("phangorn", dependencies=TRUE)
# install latest development version needs devtools
install.packages("devtools", dependencies=TRUE)
library(devtools)
install_github("KlausVigo/phangorn")

Getting started

library(phangorn)    # load the phangorn library

Set the working directory

This is often a major stumbling block for new R users. You need to specify where in your folder structure you wish to work. i.e, where are the files stored that you wish to input?

This is done using the setwd() function, e.g. setwd("C:/TreesNetworks/Example Files").

We now set it to the folder of the phangorn package, which contains the files we want to load for this example.

Read in the example file datasets:

This example files are based on the woodmouse dataset available in the ape library. Ultimately, this dataset is from this study: Michaux, J. R., Magnanou, E., Paradis, E., Nieberding, C. and Libois, R. (2003) Mitochondrial phylogeography of the Woodmouse (Apodemus sylvaticus) in the Western Palearctic region. Molecular Ecology, 12, 685-697.)

## automatically set the correct working directory for the examples below
# setwd(system.file("extdata/trees", package = "phangorn"))
# for this vignette we create a path to the files we want to load 
fdir <- system.file("extdata/trees", package = "phangorn")
## in your case it may look something like this...
# setwd("C:/TreesNetworks/Example Files")

##DNA Matrix, maybe not needed 
woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") 
## RAxML best-known tree with bipartition support (from previous analysis)
raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse"))
## RAxML bootstrap trees (from previous analysis)
raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse"))
## MrBayes consensus tree (50% majority rule) (from previous analysis)
mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con"))
## MrBayes sample runs 1 and 2 (from previous analysis)
run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t"))
run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t"))
## How many trees are in the MrBayes tree sample?
run1
## 1001 phylogenetic trees
run2
## 1001 phylogenetic trees
## Combining the two runs and removing 25% burn-in
mrbayes.trees <- c(run1[251:1001],run2[251:1001])
## NeigbourNet Nexus file generated by SplitsTree (from previous analysis)
Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs"))

All example files read into R.

Viewing the data

par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters
### Plotting trees with support values:
##  RAxML
plot(raxml.tree)
nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none")
##  MrBayes
plot(mrbayes.tree)
nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none")

par(mfrow=c(1,1)) # Setting plot parameters
# NeighborNet
plot(Nnet,"2D")

## alternatively,
# plot(Nnet,"2D")

Intertwining trees and network functions

1A:

Identification of edge bundles (in black) in a neighbor-net (NN) network that correspond to branches (labelled 1-12) in a tree (a maximum likelihood tree, in this case).

# create a vector of labels for the network corresponding to edges in the tree
edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge")
# could be also 1:27 instead of raxml.tree$edge[,2]

# Show the correspondingly labelled tree and network in R
par(mfrow=c(1,2))  
plot(raxml.tree, "u", rotate.tree = 180, cex=.7) 
edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7)

# find edges that are in the network but not in the tree
edge.col <- rep("black", nrow(Nnet$edge))
edge.col[ is.na(edge.lab) ] <- "red"
# or a simpler alternative...
edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red")

x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col,
                  col.edge.label = "blue", cex=.7)

# the above plot function returns an invisible networx object and this object also  
# contains the colors for the edges.

1B:

Bootstrap support for all branches (branch labels) in the ML tree mapped on the corresponding edge bundles of the NN network. The edges in the network which are not found as ML tree branches are highlighted in red.

# the scaler argument multiplies the confidence values. This is useful to switch
# confidences values between total, percentage or ratios.   
x <- addConfidences(Nnet,raxml.tree, scaler = .01)
# find splits that are in the network but not in the tree
split.col <- rep("black", length(x$splits))
split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red"

# simpler alternative...
split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red")

# Plotting in R
out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue")

Again we can write to SplitsTree for viewing…

# write.nexus.networx(out.x,"woodmouse.tree.support.nxs")
## or we can also export the splits alone (for usage in software other than SplitsTree)
# write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs")

1C:

Frequencies of bipartitions found in the bootstrap pseudoreplicates mapped on the corresponding edge bundles of the NN network using a threshold of 10% (i.e. any edge is labelled that occurs in at least 100 of the 1000 ML-BS pseudoreplicates). Edge bundles not found in the ML tree are labelled using grey edges.

y <- addConfidences(Nnet, as.splits(raxml.bootstrap))
edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey")

y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col)

## Write to SplitsTree for viewing
# write.nexus.networx(y,"NN.with.bs.support.nxs")

Extras…

We can also compare the neighborNet with a consensusNet (Holland BR, Huber KT, Moulton V, Lockhart PJ,2004, Using consensus networks to visualize contradictory evidence for species phylogeny. Molecular Biology and Evolution, 21, 1459-1461). Furthermore, we can extract the support values from the consensus network, and place these on to the NeighborNet (this is similar to the process explained in 1C above).

cnet <- consensusNet(raxml.bootstrap,prob=0.10)
edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey")
cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col)

edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey")
z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col)

obj <- addConfidences(Nnet,cnet)
plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue")

## Write to SplitsTree for viewing
# write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs")

There are four possible data patterns in phylogenetic reconstruction: (1) patterns that are well supported in the network and appear in the bootstrapped trees; (2) patterns that are well supported by (part of) the data/network but do not appear in the optimized trees, i.e. they are incompatible with the tree; (3) patterns that are weakly supported by the network but appear in the optimized trees anyway, i.e. they are compatible with the tree.

Here we demonstrate these patterns by showing the relationships between splits weights, from a NeighborNet splits graph, bootstrap bipartitions support and bootstrap percentages plotted on the optimized tree for a dataset of Wang, Braun, and Kimball (2012).

(An advanced user figure…)

Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs"))
raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) |> unroot()
raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out"))

bs_splits <- as.splits(raxml.bootstrap)
tree_splits <- as.splits(raxml.tree) |> unique() |> removeTrivialSplits()
# we overwrite bootstrap values and set the weights 
# to 1e-6 (almost zero), as we plot them on a log scale later on
attr(bs_splits, "weights")[] <- 1e-6
# combine the splits from the bootstrap and neighbor net
# and delete duplicates and add the confidence values
# we get rid of trivial splits
all_splits <- c(Nnet$splits, bs_splits) |> unique() |> removeTrivialSplits() |> addConfidences(bs_splits, scaler=100)

# For easier plotting we create a matrix with the confidences and 
# weights as columns
tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE)
# we add a logical variable pto indicate which splits are in the RAxML tree
tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE

tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0
tab[,"Bootstrap"] <- round(tab[,"Bootstrap"])
rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="")
tab[1:10,]
##                              SplitWeight Bootstrap  Tree
## ..||........................   0.0171433       100  TRUE
## ..||||......................   0.0013902        14 FALSE
## ..||||......|||||...........   0.0001589         0 FALSE
## ||.........................|   0.0027691         1 FALSE
## ||..........................   0.0840367       100  TRUE
## ...|||......................   0.0001773         0 FALSE
## ...|||........|.|...........   0.0003663         0 FALSE
## |.|.........................   0.0060907         0 FALSE
## ....||......................   0.0385909       100  TRUE
## ||||........................   0.0018195        34  TRUE
col <- rep("blue", nrow(tab))
col[tab[,"Bootstrap"]==0] <- "green"
col[tab[,"SplitWeight"]==1e-6] <- "red"

pch = rep(19, nrow(tab))
pch[tab$Tree] <- 17

par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)
plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch,  
     xlab="Split weight (log scale)", ylab="Bootstrap (%)")
legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n")

Figure 4

YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) 
mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) 
ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) 
all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) 
YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) 
mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) 
ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) 
all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) 

There are several option plotting a co-phylogeny. In the following we use the cophylo function of the phytools package.

library(phytools)
par(mfrow=c(2,1))
obj <- cophylo(YCh, mtG) 
plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1))  
title("A. YCh                                    B. mtG")
obj <-  cophylo(ncAI, all_data)
plot(obj, mar=c(.1,.1,2,.1),scale.bar=c(.005,.05), ylim=c(-.2,1))
title("C. ncAI                              D. All data")

Unfortunately this function does not (yet) offer to add confidences to some splits, but we can do this easily with more basic plot functions.

par(mfrow=c(2,2), mar = c(2,2,4,2))
YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh")
mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG")
ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI")
all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data")

We can compare this with consensus network with the different bootstrap values for the different genes.

par(mfrow=c(1,1))
cn <- consensusNet(c(YCh, mtG, ncAI))
cn <- addConfidences(cn, YCh_boot) |> addConfidences(mtG_boot, add=TRUE) |> 
  addConfidences(ncAI_boot, add=TRUE) |> addConfidences(all_data_boot, add=TRUE)
plot(cn, "2D", show.edge.label=TRUE)

Schliep, Klaus, Alastair J. Potts, David A. Morrison, and Guido W. Grimm. 2017. “Intertwining Phylogenetic Trees and Networks.” Methods in Ecology and Evolution 8 (10): 1212–20. https://doi.org/10.1111/2041-210X.12760.
Wang, Ning, Edward L. Braun, and Rebecca T. Kimball. 2012. “Testing Hypotheses about the Sister Group of the Passeriformes Using an Independent 30-Locus Data Set.” Molecular Biology and Evolution 29 (2): 737–50. https://doi.org/10.1093/molbev/msr230.
phangorn/inst/doc/Trees.Rmd0000644000176200001440000003306314140464134015344 0ustar liggesusers--- title: "Estimating phylogenetic trees with phangorn" author: - name: Klaus Schliep affiliation: Graz University of Technology email: klaus.schliep@gmail.com date: "`r Sys.Date()`" bibliography: phangorn.bib output: prettydoc::html_pretty: theme: cayman highlight: github toc: true toc_depth: 2 vignette: | %\VignetteIndexEntry{Estimating phylogenetic trees with phangorn} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- # Introduction These notes should enable the user to estimate phylogenetic trees from alignment data with different methods using the _phangorn_ package [@Schliep2011] . Several functions of _package_ are also described in more detail in [@Paradis2012]. For more theoretical background on all the methods see e.g. [@Felsenstein2004][@Yang2006]. This document illustrates some of the `package` features to estimate phylogenetic trees using different reconstruction methods. Small adaptations to the scripts in section \@ref(appendix) should enable the user to perform phylogenetic analyses. # Getting started The first thing we have to do is to read in an alignment. Unfortunately there exists many different file formats that alignments can be stored in. The function `read.phyDat` is used to read in an alignment. There are several functions to read in alignments depending on the format of the data set ("nexus", "phylip", "fasta") and the kind of data (amino acid or nucleotides) in the _ape_ package [@Paradis2018] and _phangorn_. The function `read.phyDat` calls these other functions and transform them into a `phyDat` object. For the specific parameter settings available look in the help files of the function `read.dna` (for phylip, fasta, clustal format), `read.nexus.data` for nexus files. For amino acid data additional `read.aa` is called. We start our analysis loading the _phangorn_ package and then reading in an alignment. ```{r} library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") ``` # Distance based methods After reading in the alignment we can build a first tree with distance based methods. The function dist.dna from the ape package computes distances for many DNA substitution models. To use the function dist.dna we have to transform the data to class DNAbin. For amino acids the function `dist.ml` offers common substitution models (for example "WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa" or "mtREV24"). After constructing a distance matrix we reconstruct a rooted tree with UPGMA and alternatively an unrooted tree using Neighbor Joining [@Saitou1987][@Studier1988]. More distance methods like `fastme` are available in the _ape_ package. ```{r} dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) ``` We can plot the trees treeUPGMA and treeNJ with the commands: ```{r plot1, fig.cap="Rooted UPGMA tree.", echo=TRUE} plot(treeUPGMA, main="UPGMA") ``` ```{r plot2, fig.cap="Unrooted NJ tree.", echo=TRUE} plot(treeNJ, "unrooted", main="NJ") ``` ## Bootstrap To run the bootstrap we need to first write a function which computes a tree from an alignment. So we first need to compute a distance matrix and afterwards compute the tree. This function we can than give to the `bootstrap.phyDat` function. ```{r bootstrap_dist, echo=TRUE} fun <- function(x) upgma(dist.ml(x)) bs_upgma <- bootstrap.phyDat(primates, fun) ``` With the new syntax of R 4.1 this can be written a bit shorter: ```{r bootstrap_dist_new, echo=TRUE, eval=FALSE} bs_upgma <- bootstrap.phyDat(primates, \(x){dist.ml(x) |> upgma}) ``` Finally we can plot the tree with bootstrap values added: ```{r plot_bs, fig.cap="Rooted UPGMA tree.", echo=TRUE} plotBS(treeUPGMA, bs_upgma, main="UPGMA") ``` Distance based methods are very fast and we will use the UPGMA and NJ tree as starting trees for the maximum parsimony and maximum likelihood analyses. # Parsimony The function parsimony returns the parsimony score, that is the number of changes which are at least necessary to describe the data for a given tree. We can compare the parsimony score or the two trees we computed so far: ```{r} parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) ``` The function `optim.parsimony` performs tree rearrangements to find trees with a lower parsimony score. The tree rearrangement implemented are nearest-neighbor interchanges (NNI) and subtree pruning and regrafting (SPR). The later one only works so far with the fitch algorithm. ```{r} treePars <- optim.parsimony(treeUPGMA, primates) ``` However is also a version of the parsimony ratchet [@Nixon1999] implemented, which is likely to find better trees than just doing NNI / SPR rearrangements. The current implementation 1. Create a bootstrap data set $D_b$ from the original data set. 2. Take the current best tree and perform tree rearrangements on $D_b$ and save bootstrap tree as $T_b$. 3. Use $T_b$ and perform tree rearrangements on the original data set. If this trees has a lower parsimony score than the currently best tree replace it. 4. Iterate 1:3 until either a given number of iteration is reached or no improvements have been recorded for a number of iterations. ```{r pratchet} treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) ``` Next we assign branch length to the tree. The branch length are proportional to the number of substitutions / site. ```{r} treeRatchet <- acctran(treeRatchet, primates) ``` The parsimony ratchet implicitly performs a bootstrap analysis (step 1). We make use of this and store the trees which where visited. This allows us to add bootstrap support values to the tree. ```{r} plotBS(midpoint(treeRatchet), type="phylogram") ``` ## Branch and bound For data sets with few species it is also possible to find all most parsimonious trees using a branch and bound algorithm [@Hendy1982]. For data sets with more than 10 taxa this can take a long time and depends strongly on how tree like the data are. And for more than 20-30 taxa this will take almost forever. ```{r} (trees <- bab(subset(primates,1:10))) ``` # Maximum likelihood The last method we will describe in this vignette is Maximum Likelihood (ML) as introduced by Felsenstein [@Felsenstein1981]. We can easily compute the likelihood for a tree given the data ```{r} fit = pml(treeNJ, data=primates) fit ``` The function `pml` returns an object of class `pml`. This object contains the data, the tree and many different parameters of the model like the likelihood. There are many generic functions for the class `pml` available, which allow the handling of these objects. ```{r} methods(class="pml") ``` The object fit just estimated the likelihood for the tree it got supplied, but the branch length are not optimized for the Jukes-Cantor model yet, which can be done with the function `optim.pml`. ```{r} fitJC <- optim.pml(fit, TRUE) logLik(fitJC) ``` With the default values`pml` will estimate a Jukes-Cantor model. The generic function `update` allows to change parameters. We will change the model to the GTR + $\Gamma(4)$ + I model and then optimize all the parameters. ```{r} fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR ``` With the control parameters the thresholds for the fitting process can be changed. Here we want just to suppress output during the fitting process. For larger trees the NNI rearrangements often get stuck in a local maximum. We added two stochastic algorithms to improve topology search. The first (set `rearrangement="stochastic"`) performs stochastic rearrangements similar as in [@Nguyen2015], which makes random NNI permutation to the tree, which than gets optimized to escape local optima. The second option (rearrangement="ratchet") perform the likelihood ratchet [@Vos2003]. While these algorithms may find better trees they will also take more time. ```{r} fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR ``` ## Model selection We can compare nested models for the JC and GTR + $\Gamma(4)$ + I model using likelihood ratio statistic ```{r} anova(fitJC, fitGTR) ``` with the Shimodaira-Hasegawa \cite{Shimodaira1999} test ```{r} SH.test(fitGTR, fitJC) ``` or with the AIC ```{r} AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) ``` An alternative is to use the function `modelTest` to compare different nucleotide or protein models the AIC, AICc or BIC, similar to popular programs ModelTest and ProtTest [@Posada1998], [@Posada2008], [@Abascal2005]. ```{r, echo=FALSE} load("Trees.RData") ``` ```{r, echo=TRUE, eval=FALSE} mt = modelTest(primates) ``` The results of `modelTest` is illustrated in following table: ```{r, echo=FALSE} library(knitr) kable(mt, digits=2) ``` The thresholds for the optimization in `modelTest` are not as strict as for `optim.pml` and no tree rearrangements are performed. As `modelTest` computes and optimizes a lot of models it would be a waste of computer time not to save these results. The results are saved as call together with the optimized trees in an environment and this call can be evaluated to get a `pml` object back to use for further optimization or analysis. ```{r, echo=TRUE} env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) ``` ## Bootstrap At last we may want to apply bootstrap to test how well the edges of the tree are supported: ```{r, echo=TRUE, eval=FALSE} bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, control = pml.control(trace = 0)) ``` Now we can plot the tree with the bootstrap support values on the edges and also look at `consensusNet` to identify potential conflict. ```{r plotBS, fig.cap="Tree with bootstrap support. Unrooted tree (midpoint rooted) with bootstrap support values.", echo=TRUE} plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") ``` ```{r ConsensusNet, fig.cap="ConsensusNet from the bootstrap sample.", echo=TRUE} cnet <- consensusNet(bs, p=0.2) plot(cnet, show.edge.label=TRUE) ``` ## Molecular dating with a strict clock We implemented a strict clock as described in [@Felsenstein2004], p. ???. So far the starting tree needs to be ultrametric, so we use the UPGMA tree. When we optimize the tree with `optim.pml` we have to make sure set we set `optRooted = TRUE`! ```{r, echo=TRUE, cache=TRUE} fit_strict <- pml(treeUPGMA, data=primates, k=4, bf=baseFreq(primates)) fit_strict <- optim.pml(fit_strict, model="GTR", optRooted = TRUE, rearrangement = "NNI", optGamma = TRUE, optInv = TRUE, control = pml.control(trace = 0)) ``` ```{r} plot(fit_strict) ``` Several analyses, e.g.`bootstrap` and `modelTest`, can be computationally demanding, but as nowadays most computers have several cores one can distribute the computations using the _parallel_ package. However it is only possible to use this approach if R is running from command line ("X11"), but not using a GUI (for example "Aqua" on Macs) and unfortunately the _parallel_ package does not work at all under Windows. \newpage # Appendix ## Standard scripts for nucleotide analysis Here we provide two standard scripts which can be adapted for the most common tasks. Most likely the arguments for `read.phyDat` have to be adapted to accommodate your file format. Both scripts assume that the _parallel_ package works on your platform, see comments above. ```{r, echo=TRUE, eval=FALSE} library(phangorn) file <- "myfile" dat <- read.phyDat(file) dm <- dist.ml(dat, "F81") tree <- NJ(dm) # as alternative for a starting tree: tree <- pratchet(dat) # parsimony tree tree <- nnls.phylo(tree, dm) # need edge weights # 1. alternative: quick and dirty: GTR + G fitStart <- pml(tree, dat, k=4) fit <- optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") # 2. alternative: prepare with modelTest mt <- modelTest(dat, tree=tree, multicore=TRUE) mt[order(mt$AICc),] # choose best model from the table according to AICc bestmodel <- mt$Model[which.min(mt$AICc)] env <- attr(mt, "env") fitStart <- eval(get("GTR+G+I", env), env) # or let R search the table fitStart <- eval(get(bestmodel, env), env) # equivalent to: fitStart = eval(get("GTR+G+I", env), env) fit <- optim.pml(fitStart, rearrangement = "stochastic", optGamma=TRUE, optInv=TRUE, model="GTR") bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ``` \newpage ## Standard scripts for amino acid analysis You can specify different several models build in which you can specify, e.g. "WAG", "JTT", "Dayhoff", "LG". Optimizing the rate matrix for amino acids is possible, but would take a long, a very long time and you will need to have a large alignment to estimate all the parameters. So make sure to set `optBf=FALSE` and `optQ=FALSE` in the function `optim.pml`, which is also the default. ```{r, echo=TRUE, eval=FALSE} library(phangorn) file <- "myfile" dat <- read.phyDat(file, type = "AA") dm <- dist.ml(dat, model="JTT") tree <- NJ(dm) # parallel will only work safely from command line # and not at all windows (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), multicore=TRUE)) # run all available amino acid models (mt <- modelTest(dat, model="all", multicore=TRUE)) env <- attr(mt, "env") fitStart <- eval(get(mt$Model[which.min(mt$BIC)], env), env) fitNJ <- pml(tree, dat, model="JTT", k=4, inv=.2) fit <- optim.pml(fitNJ, rearrangement = "stochastic", optInv=TRUE, optGamma=TRUE) fit bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ``` # Session info {.unnumbered} ```{r sessionInfo, echo=FALSE} sessionInfo() ``` # References phangorn/inst/doc/Ancestral.R0000644000176200001440000000405714155651214015661 0ustar liggesusers## ----setup, echo=FALSE-------------------------------------------------------- # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=4) #, global.par=TRUE options(digits = 4) ## ----------------------------------------------------------------------------- library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") tree <- pratchet(primates, trace=0) |> acctran(primates) parsimony(tree, primates) ## ----------------------------------------------------------------------------- anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN") anc.mpr <- ancestral.pars(tree, primates, "MPR") ## ----seqLogo, fig.cap="Fig 1. Ancestral reconstruction for a node.", eval=FALSE---- # library(seqLogo) # seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE) ## ---- eval=FALSE-------------------------------------------------------------- # if (!requireNamespace("BiocManager", quietly = TRUE)) # install.packages("BiocManager") # BiocManager::install("seqLogo") ## ----MPR, fig.cap="Fig 2. Ancestral reconstruction using MPR."---------------- plotAnc(tree, anc.mpr, 17) title("MPR") ## ----ACCTRAN, fig.cap="Fig 3. Ancestral reconstruction using ACCTRAN."-------- plotAnc(tree, anc.acctran, 17) title("ACCTRAN") ## ----------------------------------------------------------------------------- fit <- pml(tree, primates) fit <- optim.pml(fit, model="F81", control = pml.control(trace=0)) ## ----------------------------------------------------------------------------- anc.ml <- ancestral.pml(fit, "ml") anc.bayes <- ancestral.pml(fit, "bayes") ## ----plotML, fig.cap="Fig 4. Ancestral reconstruction the using the maximum likelihood."---- plotAnc(tree, anc.ml, 17) title("ML") ## ----plotB, fig.cap="Fig 5. Ancestral reconstruction using (empirical) Bayes."---- plotAnc(tree, anc.bayes, 17) title("Bayes") ## ----sessionInfo, echo=FALSE-------------------------------------------------- sessionInfo() phangorn/inst/doc/Trees.R0000644000176200001440000001465614155651242015036 0ustar liggesusers## ----------------------------------------------------------------------------- library(ape) library(phangorn) fdir <- system.file("extdata/trees", package = "phangorn") primates <- read.phyDat(file.path(fdir, "primates.dna"), format = "interleaved") ## ----------------------------------------------------------------------------- dm <- dist.ml(primates) treeUPGMA <- upgma(dm) treeNJ <- NJ(dm) ## ----plot1, fig.cap="Rooted UPGMA tree.", echo=TRUE--------------------------- plot(treeUPGMA, main="UPGMA") ## ----plot2, fig.cap="Unrooted NJ tree.", echo=TRUE---------------------------- plot(treeNJ, "unrooted", main="NJ") ## ----bootstrap_dist, echo=TRUE------------------------------------------------ fun <- function(x) upgma(dist.ml(x)) bs_upgma <- bootstrap.phyDat(primates, fun) ## ----bootstrap_dist_new, echo=TRUE, eval=FALSE-------------------------------- # bs_upgma <- bootstrap.phyDat(primates, \(x){dist.ml(x) |> upgma}) ## ----plot_bs, fig.cap="Rooted UPGMA tree.", echo=TRUE------------------------- plotBS(treeUPGMA, bs_upgma, main="UPGMA") ## ----------------------------------------------------------------------------- parsimony(treeUPGMA, primates) parsimony(treeNJ, primates) ## ----------------------------------------------------------------------------- treePars <- optim.parsimony(treeUPGMA, primates) ## ----pratchet----------------------------------------------------------------- treeRatchet <- pratchet(primates, trace = 0) parsimony(c(treePars, treeRatchet), primates) ## ----------------------------------------------------------------------------- treeRatchet <- acctran(treeRatchet, primates) ## ----------------------------------------------------------------------------- plotBS(midpoint(treeRatchet), type="phylogram") ## ----------------------------------------------------------------------------- (trees <- bab(subset(primates,1:10))) ## ----------------------------------------------------------------------------- fit = pml(treeNJ, data=primates) fit ## ----------------------------------------------------------------------------- methods(class="pml") ## ----------------------------------------------------------------------------- fitJC <- optim.pml(fit, TRUE) logLik(fitJC) ## ----------------------------------------------------------------------------- fitGTR <- update(fit, k=4, inv=0.2) fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "NNI", control = pml.control(trace = 0)) fitGTR ## ----------------------------------------------------------------------------- fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE, rearrangement = "stochastic", control = pml.control(trace = 0)) fitGTR ## ----------------------------------------------------------------------------- anova(fitJC, fitGTR) ## ----------------------------------------------------------------------------- SH.test(fitGTR, fitJC) ## ----------------------------------------------------------------------------- AIC(fitJC) AIC(fitGTR) AICc(fitGTR) BIC(fitGTR) ## ---- echo=FALSE-------------------------------------------------------------- load("Trees.RData") ## ---- echo=TRUE, eval=FALSE--------------------------------------------------- # mt = modelTest(primates) ## ---- echo=FALSE-------------------------------------------------------------- library(knitr) kable(mt, digits=2) ## ---- echo=TRUE--------------------------------------------------------------- env <- attr(mt, "env") ls(envir=env) (fit <- eval(get("HKY+G+I", env), env)) ## ---- echo=TRUE, eval=FALSE--------------------------------------------------- # bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE, # control = pml.control(trace = 0)) ## ----plotBS, fig.cap="Tree with bootstrap support. Unrooted tree (midpoint rooted) with bootstrap support values.", echo=TRUE---- plotBS(midpoint(fitJC$tree), bs, p = 50, type="p") ## ----ConsensusNet, fig.cap="ConsensusNet from the bootstrap sample.", echo=TRUE---- cnet <- consensusNet(bs, p=0.2) plot(cnet, show.edge.label=TRUE) ## ---- echo=TRUE, cache=TRUE--------------------------------------------------- fit_strict <- pml(treeUPGMA, data=primates, k=4, bf=baseFreq(primates)) fit_strict <- optim.pml(fit_strict, model="GTR", optRooted = TRUE, rearrangement = "NNI", optGamma = TRUE, optInv = TRUE, control = pml.control(trace = 0)) ## ----------------------------------------------------------------------------- plot(fit_strict) ## ---- echo=TRUE, eval=FALSE--------------------------------------------------- # library(phangorn) # file <- "myfile" # dat <- read.phyDat(file) # dm <- dist.ml(dat, "F81") # tree <- NJ(dm) # # as alternative for a starting tree: # tree <- pratchet(dat) # parsimony tree # tree <- nnls.phylo(tree, dm) # need edge weights # # # # 1. alternative: quick and dirty: GTR + G # fitStart <- pml(tree, dat, k=4) # fit <- optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic") # # # 2. alternative: prepare with modelTest # mt <- modelTest(dat, tree=tree, multicore=TRUE) # mt[order(mt$AICc),] # # choose best model from the table according to AICc # bestmodel <- mt$Model[which.min(mt$AICc)] # # env <- attr(mt, "env") # fitStart <- eval(get("GTR+G+I", env), env) # # # or let R search the table # fitStart <- eval(get(bestmodel, env), env) # # equivalent to: fitStart = eval(get("GTR+G+I", env), env) # fit <- optim.pml(fitStart, rearrangement = "stochastic", # optGamma=TRUE, optInv=TRUE, model="GTR") # bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ## ---- echo=TRUE, eval=FALSE--------------------------------------------------- # library(phangorn) # file <- "myfile" # dat <- read.phyDat(file, type = "AA") # dm <- dist.ml(dat, model="JTT") # tree <- NJ(dm) # # # parallel will only work safely from command line # # and not at all windows # (mt <- modelTest(dat, model=c("JTT", "LG", "WAG"), # multicore=TRUE)) # # run all available amino acid models # (mt <- modelTest(dat, model="all", multicore=TRUE)) # # env <- attr(mt, "env") # fitStart <- eval(get(mt$Model[which.min(mt$BIC)], env), env) # # fitNJ <- pml(tree, dat, model="JTT", k=4, inv=.2) # fit <- optim.pml(fitNJ, rearrangement = "stochastic", # optInv=TRUE, optGamma=TRUE) # fit # # bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE) ## ----sessionInfo, echo=FALSE-------------------------------------------------- sessionInfo() phangorn/inst/doc/Networx.Rmd0000644000176200001440000001251114041301653015717 0ustar liggesusers--- title: "Splits and Networx" author: "Klaus Schliep" date: "`r format(Sys.time(), '%B %d, %Y')`" output: prettydoc::html_pretty: theme: cayman highlight: github bibliography: phangorn.bib vignette: > %\VignetteIndexEntry{Splits and Networx} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- This tutorial gives a basic introduction for constructing phylogenetic networks and adding parameters to trees or networx objects using [phangorn](https://cran.r-project.org/package=phangorn) [@Schliep2011] in R. Splits graphs or phylogenetic networks are a useful way to display conflicting data or to summarize different trees. Here, we present two popular networks, consensus networks [@Holland2004] and Neighbor-Net [@Bryant2004]. Trees or networks are often missing either edge weights or edge support values. We show how to improve a tree/networx object by adding support values or estimating edge weights using non-negative Least-Squares (nnls). We first load the phangorn package and a few data sets we use in this vignette. ```{r, eval=TRUE} library(phangorn) data(Laurasiatherian) data(yeast) ``` ## consensusNet A consensusNet [@Holland2004] is a generalization of a consensus tree. Instead of only representing splits (taxon bipartitions) occurring in at least 50% of the trees in a bootstrap or MCMC sample one can use a lower threshold and explore competing splits. Note that, in its basic implementation used here, the consensusNet edge lengths are proportional to the frequency of the corresponding splits in the provided list of trees. The input for `consensusNet` is a list of trees i.e. an object of class `multiPhylo`. ```{r, eval=TRUE} set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, show.edge.label=TRUE) ``` In many cases, `consensusNet` will return more than two incompatible (competing) splits. This cannot be plotted as a planar (2-dimensional) graph. Such as situation requires a n-dimensional graph, where the maximum number of dimensions equals the maximum number of incompatible splits. For example, if we have three alternative incompatible splits: (A,B)|(C,D) vs. (A,C)|(B,D) vs. (A,D)|(B,C), we need a 3-dimensional graph to show all three alternatives. A nice way to get still a good impression of the network is to plot it in 3D. ```{r, eval=FALSE} plot(cnet, "3D") # rotate 3d plot play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # create animated gif file movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ``` which will result in a spinning graph similar to this ![rotatingNetworx](movie.gif) ## neighborNet The function `neighborNet` implements the popular method of @Bryant2004. The Neighbor-Net algorithm is essentially a 2D-version of the Neighbor joining algorithm. The Neighbour-net is computed in two steps: the first computes a circular ordering of the taxa in the data set; the second step involves the estimation of edge weights using non-negative Least-Squares (nnls). ```{r, eval=TRUE} dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet) ``` The advantage of Neighbor-Net is that it returns a circular split system which can be always displayed in a planar (2D) graph. The plots displayed in `phangorn` may (however) not be planar, but re-plotting can give you a planar graph. This unwanted behavior will be improved in future version. The rendering of the `networx` is done using the the fantastic igraph package [@Csardi2006]. ## Adding support values We can use the generic function `addConfidences` to add (branch) support values from a tree, i.e. an object of class `phylo` to a `networx`, `splits` or `phylo` object. The Neighbor-Net object we computed above provides no support values. We can add the support values from the tree we computed to the splits (edges) shared by both objects. ```{r, eval=TRUE} nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, show.edge.label=TRUE) ``` Analogously, we can also add support values to a tree: ```{r, eval=TRUE} tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ``` ## Estimating edge weights (nnls) Consensus networks, on the other hand, provide primarily information about support values corresponding to a split, but no information about the actual difference between the taxon bipartitions defined by that split. For example, one may be interested how the alternative support values correspond with the actual genetic distance between the involved taxa. Given a distance matrix, we can estimate edge weights using non-negative Least-Squares, and plot them onto the consensusNet splits graph. ```{r, eval=TRUE} cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, show.edge.label=TRUE) ``` ### Import and export networks, advanced functions for networx objects The functions `read.nexus.networx` and `write.nexus.networx` can read and write nexus files for or from SplitsTree [@Huson2006]. Check-out the new vignette IntertwiningTreesAndNetworks for additional functions, examples, and advanced applications. ## Session Information ```{r, eval=TRUE} sessionInfo() ``` ## References phangorn/inst/doc/Trees.html0000644000176200001440000067124014155651242015577 0ustar liggesusers Estimating phylogenetic trees with phangorn

Introduction

These notes should enable the user to estimate phylogenetic trees from alignment data with different methods using the phangorn package (Schliep 2011) . Several functions of package are also described in more detail in (Paradis 2012). For more theoretical background on all the methods see e.g. (Felsenstein 2004)(Yang 2006). This document illustrates some of the package features to estimate phylogenetic trees using different reconstruction methods. Small adaptations to the scripts in section @ref(appendix) should enable the user to perform phylogenetic analyses.

Getting started

The first thing we have to do is to read in an alignment. Unfortunately there exists many different file formats that alignments can be stored in. The function read.phyDat is used to read in an alignment. There are several functions to read in alignments depending on the format of the data set (“nexus,” “phylip,” “fasta”) and the kind of data (amino acid or nucleotides) in the ape package (Paradis and Schliep 2019) and phangorn. The function read.phyDat calls these other functions and transform them into a phyDat object. For the specific parameter settings available look in the help files of the function read.dna (for phylip, fasta, clustal format), read.nexus.data for nexus files. For amino acid data additional read.aa is called.

We start our analysis loading the phangorn package and then reading in an alignment.

library(ape)
library(phangorn)
fdir <- system.file("extdata/trees", package = "phangorn")
primates <- read.phyDat(file.path(fdir, "primates.dna"),
                        format = "interleaved")

Distance based methods

After reading in the alignment we can build a first tree with distance based methods. The function dist.dna from the ape package computes distances for many DNA substitution models. To use the function dist.dna we have to transform the data to class DNAbin. For amino acids the function dist.ml offers common substitution models (for example “WAG,” “JTT,” “LG,” “Dayhoff,” “cpREV,” “mtmam,” “mtArt,” “MtZoa” or “mtREV24”).

After constructing a distance matrix we reconstruct a rooted tree with UPGMA and alternatively an unrooted tree using Neighbor Joining (Saitou and Nei 1987)(Studier and Keppler 1988). More distance methods like fastme are available in the ape package.

dm  <- dist.ml(primates)
treeUPGMA  <- upgma(dm)
treeNJ  <- NJ(dm)

We can plot the trees treeUPGMA and treeNJ with the commands:

plot(treeUPGMA, main="UPGMA")

Rooted UPGMA tree.

plot(treeNJ, "unrooted", main="NJ")

Unrooted NJ tree.

Bootstrap

To run the bootstrap we need to first write a function which computes a tree from an alignment. So we first need to compute a distance matrix and afterwards compute the tree. This function we can than give to the bootstrap.phyDat function.

fun <- function(x) upgma(dist.ml(x))
bs_upgma <- bootstrap.phyDat(primates,  fun)

With the new syntax of R 4.1 this can be written a bit shorter:

bs_upgma <- bootstrap.phyDat(primates,  \(x){dist.ml(x) |> upgma})

Finally we can plot the tree with bootstrap values added:

plotBS(treeUPGMA, bs_upgma, main="UPGMA")

Rooted UPGMA tree.

Distance based methods are very fast and we will use the UPGMA and NJ tree as starting trees for the maximum parsimony and maximum likelihood analyses.

Parsimony

The function parsimony returns the parsimony score, that is the number of changes which are at least necessary to describe the data for a given tree. We can compare the parsimony score or the two trees we computed so far:

parsimony(treeUPGMA, primates)
## [1] 751
parsimony(treeNJ, primates)
## [1] 746

The function optim.parsimony performs tree rearrangements to find trees with a lower parsimony score. The tree rearrangement implemented are nearest-neighbor interchanges (NNI) and subtree pruning and regrafting (SPR). The later one only works so far with the fitch algorithm.

treePars  <- optim.parsimony(treeUPGMA, primates)
## Final p-score 746 after  1 nni operations

However is also a version of the parsimony ratchet (Nixon 1999) implemented, which is likely to find better trees than just doing NNI / SPR rearrangements. The current implementation

  1. Create a bootstrap data set \(D_b\) from the original data set.
  2. Take the current best tree and perform tree rearrangements on \(D_b\) and save bootstrap tree as \(T_b\).
  3. Use \(T_b\) and perform tree rearrangements on the original data set. If this trees has a lower parsimony score than the currently best tree replace it.
  4. Iterate 1:3 until either a given number of iteration is reached or no improvements have been recorded for a number of iterations.
treeRatchet  <- pratchet(primates, trace = 0)
parsimony(c(treePars, treeRatchet), primates)
## [1] 746 746

Next we assign branch length to the tree. The branch length are proportional to the number of substitutions / site.

treeRatchet  <- acctran(treeRatchet, primates)

The parsimony ratchet implicitly performs a bootstrap analysis (step 1). We make use of this and store the trees which where visited. This allows us to add bootstrap support values to the tree.

plotBS(midpoint(treeRatchet), type="phylogram")

Branch and bound

For data sets with few species it is also possible to find all most parsimonious trees using a branch and bound algorithm (Hendy and Penny 1982). For data sets with more than 10 taxa this can take a long time and depends strongly on how tree like the data are. And for more than 20-30 taxa this will take almost forever.

(trees <- bab(subset(primates,1:10)))
## 1 phylogenetic tree

Maximum likelihood

The last method we will describe in this vignette is Maximum Likelihood (ML) as introduced by Felsenstein (Felsenstein 1981). We can easily compute the likelihood for a tree given the data

fit = pml(treeNJ, data=primates)
fit
## 
##  loglikelihood: -3075 
## 
## unconstrained loglikelihood: -1230 
## 
## Rate matrix:
##   a c g t
## a 0 1 1 1
## c 1 0 1 1
## g 1 1 0 1
## t 1 1 1 0
## 
## Base frequencies:  
## 0.25 0.25 0.25 0.25

The function pml returns an object of class pml. This object contains the data, the tree and many different parameters of the model like the likelihood. There are many generic functions for the class pml available, which allow the handling of these objects.

methods(class="pml")
## [1] AICc   BIC    anova  logLik plot   print  simSeq update vcov  
## see '?methods' for accessing help and source code

The object fit just estimated the likelihood for the tree it got supplied, but the branch length are not optimized for the Jukes-Cantor model yet, which can be done with the function optim.pml.

fitJC  <- optim.pml(fit, TRUE)
## optimize edge weights:  -3075 --> -3068 
## optimize edge weights:  -3068 --> -3068 
##  optimize topology:  -3068 --> -3068 
##  optimize topology:  -3068 --> -3068 
## NNI moves:  1 
## optimize edge weights:  -3068 --> -3068 
##  optimize topology:  -3068 --> -3068 
## NNI moves:  0
logLik(fitJC)
## 'log Lik.' -3068 (df=25)

With the default valuespml will estimate a Jukes-Cantor model. The generic function update allows to change parameters. We will change the model to the GTR + \(\Gamma(4)\) + I model and then optimize all the parameters.

fitGTR <- update(fit, k=4, inv=0.2)
fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE,
    rearrangement = "NNI", control = pml.control(trace = 0))
fitGTR
## 
##  loglikelihood: -2609 
## 
## unconstrained loglikelihood: -1230 
## Proportion of invariant sites: 0.005674 
## Discrete gamma model
## Number of rate categories: 4 
## Shape parameter: 2.989 
## 
## Rate matrix:
##         a         c         g       t
## a  0.0000  0.606984 35.533580  0.3694
## c  0.6070  0.000000  0.003543 14.9219
## g 35.5336  0.003543  0.000000  1.0000
## t  0.3694 14.921882  1.000000  0.0000
## 
## Base frequencies:  
## 0.3934 0.3792 0.04025 0.1872

With the control parameters the thresholds for the fitting process can be changed. Here we want just to suppress output during the fitting process. For larger trees the NNI rearrangements often get stuck in a local maximum. We added two stochastic algorithms to improve topology search. The first (set rearrangement="stochastic") performs stochastic rearrangements similar as in (Nguyen et al. 2015), which makes random NNI permutation to the tree, which than gets optimized to escape local optima. The second option (rearrangement=“ratchet”) perform the likelihood ratchet (Vos 2003).

While these algorithms may find better trees they will also take more time.

fitGTR <- optim.pml(fitGTR, model="GTR", optInv=TRUE, optGamma=TRUE,
    rearrangement = "stochastic", control = pml.control(trace = 0))
fitGTR
## 
##  loglikelihood: -2607 
## 
## unconstrained loglikelihood: -1230 
## Proportion of invariant sites: 0.005632 
## Discrete gamma model
## Number of rate categories: 4 
## Shape parameter: 2.701 
## 
## Rate matrix:
##         a         c         g       t
## a  0.0000  0.798458 74.041130  0.6375
## c  0.7985  0.000000  0.003006 28.5984
## g 74.0411  0.003006  0.000000  1.0000
## t  0.6375 28.598448  1.000000  0.0000
## 
## Base frequencies:  
## 0.3964 0.3788 0.04029 0.1845

Model selection

We can compare nested models for the JC and GTR + \(\Gamma(4)\) + I model using likelihood ratio statistic

anova(fitJC, fitGTR)
## Likelihood Ratio Test Table
##   Log lik. Df Df change Diff log lik. Pr(>|Chi|)    
## 1    -3068 25                                       
## 2    -2607 35        10           923     <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

with the Shimodaira-Hasegawa test

SH.test(fitGTR, fitJC)
##      Trees  ln L Diff ln L p-value
## [1,]     1 -2607       0.0  0.5039
## [2,]     2 -3068     461.5  0.0000

or with the AIC

AIC(fitJC)
## [1] 6187
AIC(fitGTR)
## [1] 5284
AICc(fitGTR)
## [1] 5296
BIC(fitGTR)
## [1] 5404

An alternative is to use the function modelTest to compare different nucleotide or protein models the AIC, AICc or BIC, similar to popular programs ModelTest and ProtTest (D. Posada and Crandall 1998), (David Posada 2008), (Abascal, Zardoya, and Posada 2005).

mt = modelTest(primates)

The results of modelTest is illustrated in following table:

Model df logLik AIC AICw AICc AICcw BIC
JC 25 -3068 6187 0.00 6193 0.00 6273
JC+I 26 -3063 6177 0.00 6184 0.00 6267
JC+G 26 -3067 6186 0.00 6193 0.00 6275
JC+G+I 27 -3063 6179 0.00 6187 0.00 6272
F81 28 -2918 5892 0.00 5900 0.00 5989
F81+I 29 -2909 5876 0.00 5885 0.00 5976
F81+G 29 -2913 5883 0.00 5892 0.00 5983
F81+G+I 30 -2909 5877 0.00 5886 0.00 5980
K80 26 -2953 5958 0.00 5965 0.00 6048
K80+I 27 -2945 5943 0.00 5950 0.00 6036
K80+G 27 -2945 5944 0.00 5951 0.00 6037
K80+G+I 28 -2942 5941 0.00 5949 0.00 6037
HKY 29 -2625 5308 0.00 5317 0.00 5408
HKY+I 30 -2621 5303 0.00 5312 0.00 5406
HKY+G 30 -2613 5285 0.18 5295 0.45 5389
HKY+G+I 31 -2612 5287 0.08 5297 0.14 5394
SYM 30 -2814 5688 0.00 5697 0.00 5791
SYM+I 31 -2812 5685 0.00 5695 0.00 5792
SYM+G 31 -2805 5671 0.00 5681 0.00 5778
SYM+G+I 32 -2805 5673 0.00 5684 0.00 5784
GTR 33 -2619 5303 0.00 5315 0.00 5417
GTR+I 34 -2614 5295 0.00 5307 0.00 5412
GTR+G 34 -2608 5283 0.47 5295 0.29 5401
GTR+G+I 35 -2607 5284 0.27 5297 0.11 5405

The thresholds for the optimization in modelTest are not as strict as for optim.pml and no tree rearrangements are performed. As modelTest computes and optimizes a lot of models it would be a waste of computer time not to save these results. The results are saved as call together with the optimized trees in an environment and this call can be evaluated to get a pml object back to use for further optimization or analysis.

env <- attr(mt, "env")
ls(envir=env)
##  [1] "F81"          "F81+G"        "F81+G+I"      "F81+I"        "GTR"         
##  [6] "GTR+G"        "GTR+G+I"      "GTR+I"        "HKY"          "HKY+G"       
## [11] "HKY+G+I"      "HKY+I"        "JC"           "JC+G"         "JC+G+I"      
## [16] "JC+I"         "K80"          "K80+G"        "K80+G+I"      "K80+I"       
## [21] "SYM"          "SYM+G"        "SYM+G+I"      "SYM+I"        "data"        
## [26] "tree_F81"     "tree_F81+G"   "tree_F81+G+I" "tree_F81+I"   "tree_GTR"    
## [31] "tree_GTR+G"   "tree_GTR+G+I" "tree_GTR+I"   "tree_HKY"     "tree_HKY+G"  
## [36] "tree_HKY+G+I" "tree_HKY+I"   "tree_JC"      "tree_JC+G"    "tree_JC+G+I" 
## [41] "tree_JC+I"    "tree_K80"     "tree_K80+G"   "tree_K80+G+I" "tree_K80+I"  
## [46] "tree_SYM"     "tree_SYM+G"   "tree_SYM+G+I" "tree_SYM+I"
(fit <- eval(get("HKY+G+I", env), env))
## 
##  loglikelihood: -2612 
## 
## unconstrained loglikelihood: -1230 
## Proportion of invariant sites: 0.002694 
## Discrete gamma model
## Number of rate categories: 4 
## Shape parameter: 2.124 
## 
## Rate matrix:
##       a     c     g     t
## a  0.00  1.00 56.02  1.00
## c  1.00  0.00  1.00 56.02
## g 56.02  1.00  0.00  1.00
## t  1.00 56.02  1.00  0.00
## 
## Base frequencies:  
## 0.4205 0.3622 0.0439 0.1734

Bootstrap

At last we may want to apply bootstrap to test how well the edges of the tree are supported:

bs = bootstrap.pml(fitJC, bs=100, optNni=TRUE,
    control = pml.control(trace = 0))

Now we can plot the tree with the bootstrap support values on the edges and also look at consensusNet to identify potential conflict.

plotBS(midpoint(fitJC$tree), bs, p = 50, type="p")

Tree with bootstrap support. Unrooted tree (midpoint rooted) with bootstrap support values.

cnet <- consensusNet(bs, p=0.2)
plot(cnet, show.edge.label=TRUE)

ConsensusNet from the bootstrap sample.

Molecular dating with a strict clock

We implemented a strict clock as described in (Felsenstein 2004), p. ???.
So far the starting tree needs to be ultrametric, so we use the UPGMA tree. When we optimize the tree with optim.pml we have to make sure set we set optRooted = TRUE!

fit_strict <- pml(treeUPGMA, data=primates, k=4, bf=baseFreq(primates))
fit_strict <- optim.pml(fit_strict, model="GTR", optRooted = TRUE, 
                        rearrangement = "NNI", optGamma = TRUE, optInv = TRUE, 
                        control = pml.control(trace = 0))
plot(fit_strict)

Several analyses, e.g.bootstrap and modelTest, can be computationally demanding, but as nowadays most computers have several cores one can distribute the computations using the parallel package. However it is only possible to use this approach if R is running from command line (“X11”), but not using a GUI (for example “Aqua” on Macs) and unfortunately the parallel package does not work at all under Windows.

Appendix

Standard scripts for nucleotide analysis

Here we provide two standard scripts which can be adapted for the most common tasks. Most likely the arguments for read.phyDat have to be adapted to accommodate your file format. Both scripts assume that the parallel package works on your platform, see comments above.

library(phangorn)
file <- "myfile"
dat <- read.phyDat(file)
dm <- dist.ml(dat, "F81")
tree <- NJ(dm)
# as alternative for a starting tree:
tree <- pratchet(dat)          # parsimony tree
tree <- nnls.phylo(tree, dm)   # need edge weights


# 1. alternative: quick and dirty: GTR + G
fitStart <- pml(tree, dat, k=4)
fit <- optim.pml(fitStart, model="GTR", optGamma=TRUE, rearrangement="stochastic")

# 2. alternative: prepare with modelTest
mt <- modelTest(dat, tree=tree, multicore=TRUE)
mt[order(mt$AICc),]
# choose best model from the table according to AICc
bestmodel <- mt$Model[which.min(mt$AICc)]

env <- attr(mt, "env")
fitStart <- eval(get("GTR+G+I", env), env)

# or let R search the table
fitStart <- eval(get(bestmodel, env), env)
# equivalent to:   fitStart = eval(get("GTR+G+I", env), env)
fit <- optim.pml(fitStart, rearrangement = "stochastic",
    optGamma=TRUE, optInv=TRUE, model="GTR")
bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE)

Standard scripts for amino acid analysis

You can specify different several models build in which you can specify, e.g. “WAG,” “JTT,” “Dayhoff,” “LG.” Optimizing the rate matrix for amino acids is possible, but would take a long, a very long time and you will need to have a large alignment to estimate all the parameters. So make sure to set optBf=FALSE and optQ=FALSE in the function optim.pml, which is also the default.

library(phangorn)
file <- "myfile"
dat <- read.phyDat(file, type = "AA")
dm <- dist.ml(dat, model="JTT")
tree <- NJ(dm)

# parallel will only work safely from command line
# and not at all windows
(mt <- modelTest(dat, model=c("JTT", "LG", "WAG"),
    multicore=TRUE))
# run all available amino acid models
(mt <- modelTest(dat, model="all", multicore=TRUE))

env <- attr(mt, "env")
fitStart <- eval(get(mt$Model[which.min(mt$BIC)], env), env)

fitNJ <- pml(tree, dat, model="JTT", k=4, inv=.2)
fit <- optim.pml(fitNJ, rearrangement = "stochastic",
    optInv=TRUE, optGamma=TRUE)
fit

bs <- bootstrap.pml(fit, bs=100, optNni=TRUE, multicore=TRUE)

Session info

## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3
## 
## locale:
##  [1] LC_CTYPE=de_AT.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_AT.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=de_AT.UTF-8    LC_MESSAGES=de_AT.UTF-8   
##  [7] LC_PAPER=de_AT.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] knitr_1.36     phangorn_2.8.1 ape_5.5-3     
## 
## loaded via a namespace (and not attached):
##  [1] igraph_1.2.9     Rcpp_1.0.7       magrittr_2.0.1   lattice_0.20-45 
##  [5] R6_2.5.1         quadprog_1.5-8   rlang_0.4.12     fastmatch_1.1-3 
##  [9] fastmap_1.1.0    highr_0.9        stringr_1.4.0    tools_4.1.2     
## [13] parallel_4.1.2   grid_4.1.2       nlme_3.1-153     xfun_0.28       
## [17] jquerylib_0.1.4  htmltools_0.5.2  yaml_2.2.1       digest_0.6.29   
## [21] Matrix_1.3-4     codetools_0.2-18 sass_0.4.0       prettydoc_0.4.1 
## [25] evaluate_0.14    rmarkdown_2.11   stringi_1.7.6    compiler_4.1.2  
## [29] bslib_0.3.1      jsonlite_1.7.2   pkgconfig_2.0.3

References

Abascal, Federico, Rafael Zardoya, and David Posada. 2005. “ProtTest: Selection of Best-Fit Models of Protein Evolution.” Bioinformatics 21 (9): 2104–5. https://doi.org/10.1093/bioinformatics/bti263.
Felsenstein, Joseph. 1981. “Evolutionary Trees from DNA Sequences: A Maxumum Likelihood Approach.” Journal of Molecular Evolution 17: 368–76.
———. 2004. Inferring Phylogenies. Sunderland: Sinauer Associates.
Hendy, M. D., and D. Penny. 1982. “Branch and Bound Algorithms to Determine Minimal Evolutionary Trees.” Math. Biosc. 59: 277–90.
Nguyen, Lam-Tung, Heiko A. Schmidt, Arndt von Haeseler, and Bui Quang Minh. 2015. “IQ-TREE: A Fast and Effective Stochastic Algorithm for Estimating Maximum-Likelihood Phylogenies.” Molecular Biology and Evolution 32 (1): 268–74. https://doi.org/10.1093/molbev/msu300.
Nixon, K. 1999. “The Parsimony Ratchet, a New Method for Rapid Rarsimony Analysis.” Cladistics 15: 407–14.
Paradis, Emmanuel. 2012. Analysis of Phylogenetics and Evolution with r. Second. New York: Springer.
Paradis, Emmanuel, and Klaus Schliep. 2019. “Ape 5.0: An Environment for Modern Phylogenetics and Evolutionary Analyses in r.” Bioinformatics 35 (3): 526–28. https://doi.org/10.1093/bioinformatics/bty633.
Posada, D., and K. A. Crandall. 1998. MODELTEST: Testing the Model of DNA Substitution.” Bioinformatics 14 (9): 817–18.
Posada, David. 2008. jModelTest: Phylogenetic Model Averaging.” Molecular Biology and Evolution 25 (7): 1253–56. https://doi.org/10.1093/molbev/msn083.
Saitou, N., and M. Nei. 1987. “The Neighbor-Joining Method - a New Method for Reconstructing Phylogenetic Trees.” Molecular Biology and Evolution 4 (4): 406–25.
Schliep, Klaus Peter. 2011. “Phangorn: Phylogenetic Analysis in R.” Bioinformatics 27 (4): 592–93. https://doi.org/10.1093/bioinformatics/btq706.
Studier, J. A., and K. J. Keppler. 1988. “A Note on the Neighbor-Joining Algorithm of Saitou and Nei.” Molecular Biology and Evolution 5 (6): 729–31.
Vos, R. A. 2003. “Accelerated Likelihood Surface Exploration: The Likelihood Ratchet.” Systematic Biology 52 (3): 368–73.
Yang, Ziheng. 2006. Computational Molecular Evolution. Oxford: Oxford University Press.
phangorn/inst/doc/Networx.R0000644000176200001440000000303314155651217015407 0ustar liggesusers## ---- eval=TRUE--------------------------------------------------------------- library(phangorn) data(Laurasiatherian) data(yeast) ## ---- eval=TRUE--------------------------------------------------------------- set.seed(1) bs <- bootstrap.phyDat(yeast, FUN = function(x)nj(dist.hamming(x)), bs=100) tree <- nj(dist.hamming(yeast)) par("mar" = rep(1, 4)) tree <- plotBS(tree, bs, "phylogram") cnet <- consensusNet(bs, .3) plot(cnet, show.edge.label=TRUE) ## ---- eval=FALSE-------------------------------------------------------------- # plot(cnet, "3D") # # rotate 3d plot # play3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) # # create animated gif file # movie3d(spin3d(axis=c(0,1,0), rpm=6), duration=10) ## ---- eval=TRUE--------------------------------------------------------------- dm <- dist.hamming(yeast) nnet <- neighborNet(dm) par("mar" = rep(1, 4)) plot(nnet) ## ---- eval=TRUE--------------------------------------------------------------- nnet <- addConfidences(nnet, tree) par("mar" = rep(1, 4)) plot(nnet, show.edge.label=TRUE) ## ---- eval=TRUE--------------------------------------------------------------- tree2 <- rNNI(tree, 2) tree2 <- addConfidences(tree2, tree) # several support values are missing par("mar" = rep(1, 4)) plot(tree2, show.node.label=TRUE) ## ---- eval=TRUE--------------------------------------------------------------- cnet <- nnls.networx(cnet, dm) par("mar" = rep(1, 4)) plot(cnet, show.edge.label=TRUE) ## ---- eval=TRUE--------------------------------------------------------------- sessionInfo() phangorn/inst/doc/Ancestral.html0000644000176200001440000103155114155651214016424 0ustar liggesusers Ancestral Sequence Reconstruction

Introduction

These notes describe the ancestral sequence reconstruction using the phangorn package (Schliep 2011). phangorn provides several methods to estimate ancestral character states with either Maximum Parsimony (MP) or Maximum Likelihood (ML). For more background on all the methods see e.g. (Felsenstein 2004) or (Yang 2006).

Parsimony reconstructions

To reconstruct ancestral sequences we first load some data and reconstruct a tree:

library(phangorn)
fdir <- system.file("extdata/trees", package = "phangorn")
primates <- read.phyDat(file.path(fdir, "primates.dna"),
                        format = "interleaved")
tree <- pratchet(primates, trace=0) |> acctran(primates)
parsimony(tree, primates)
## [1] 746

For parsimony analysis of the edge length represent the observed number of changes. Reconstructing ancestral states therefore defines also the edge lengths of a tree. However there can exist several equally parsimonious reconstructions or states can be ambiguous and therefore edge length can differ. “MPR” reconstructs the ancestral states for each (internal) node as if the tree would be rooted in that node. However the nodes are not independent of each other. If one chooses one state for a specific node, this can restrict the choice of neighboring nodes (figures 2 and 3). The function acctran (accelerated transformation) assigns edge length and internal nodes to the tree (Swofford and Maddison 1987).

anc.acctran <- ancestral.pars(tree, primates, "ACCTRAN")
anc.mpr <- ancestral.pars(tree, primates, "MPR")

All the ancestral reconstructions for parsimony are based on the fitch algorithm and so far only bifurcating trees are allowed. However trees can get pruned afterwards using the function multi2di from ape.

The seqLogo function from the seqLogo package from Bioconductor provides a neat way to show proportions of a nucleotides of ancestral states (see figure 1).

library(seqLogo)
seqLogo( t(subset(anc.mpr, getRoot(tree), 1:20)[[1]]), ic.scale=FALSE)

You may need to install seqLogo before

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("seqLogo")
plotAnc(tree, anc.mpr, 17)
title("MPR")

Fig 2. Ancestral reconstruction using MPR.

plotAnc(tree, anc.acctran, 17)
title("ACCTRAN")

Fig 3. Ancestral reconstruction using ACCTRAN.

Likelihood reconstructions

phangorn also offers the possibility to estimate ancestral states using a ML. The advantages of ML over parsimony is that the reconstruction accounts for different edge lengths. So far only a marginal construction is implemented (see (Yang 2006)).

fit <- pml(tree, primates)
fit <- optim.pml(fit, model="F81", control = pml.control(trace=0))

We can assign the ancestral states according to the highest likelihood (“ml”): \[ P(x_r = A) = \frac{L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}L(x_r=k)} \] and the highest posterior probability (“bayes”) criterion: \[ P(x_r=A) = \frac{\pi_A L(x_r=A)}{\sum_{k \in \{A,C,G,T\}}\pi_k L(x_r=k)}, \] where \(L(x_r)\) is the joint probability of states at the tips and the state at the root \(x_r\) and \(\pi_i\) are the estimated base frequencies of state \(i\). Both methods agree if all states (base frequencies) have equal probabilities.

anc.ml <- ancestral.pml(fit, "ml")
anc.bayes <- ancestral.pml(fit, "bayes")

The differences of the two approaches for a specific site (17) are represented in the following figures.

plotAnc(tree, anc.ml, 17)
title("ML")

Fig 4. Ancestral reconstruction the using the maximum likelihood.

plotAnc(tree, anc.bayes, 17)
title("Bayes")

Fig 5. Ancestral reconstruction using (empirical) Bayes.

Session info

## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3
## 
## locale:
##  [1] LC_CTYPE=de_AT.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_AT.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=de_AT.UTF-8    LC_MESSAGES=de_AT.UTF-8   
##  [7] LC_PAPER=de_AT.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] phangorn_2.8.1 ape_5.5-3     
## 
## loaded via a namespace (and not attached):
##  [1] igraph_1.2.9     Rcpp_1.0.7       knitr_1.36       magrittr_2.0.1  
##  [5] lattice_0.20-45  R6_2.5.1         quadprog_1.5-8   rlang_0.4.12    
##  [9] fastmatch_1.1-3  fastmap_1.1.0    highr_0.9        stringr_1.4.0   
## [13] tools_4.1.2      parallel_4.1.2   grid_4.1.2       nlme_3.1-153    
## [17] xfun_0.28        jquerylib_0.1.4  htmltools_0.5.2  yaml_2.2.1      
## [21] digest_0.6.29    Matrix_1.3-4     codetools_0.2-18 sass_0.4.0      
## [25] prettydoc_0.4.1  evaluate_0.14    rmarkdown_2.11   stringi_1.7.6   
## [29] compiler_4.1.2   bslib_0.3.1      jsonlite_1.7.2   pkgconfig_2.0.3

References

Felsenstein, Joseph. 2004. Inferring Phylogenies. Sunderland: Sinauer Associates.
Schliep, Klaus Peter. 2011. “Phangorn: Phylogenetic Analysis in R.” Bioinformatics 27 (4): 592–93. https://doi.org/10.1093/bioinformatics/btq706.
Swofford, D. L., and W. P. Maddison. 1987. “Reconstructing Ancestral Character States Under Wagner Parsimony.” Math. Biosci. 87: 199–229.
Yang, Ziheng. 2006. Computational Molecular Evolution. Oxford: Oxford University Press.
phangorn/inst/doc/IntertwiningTreesAndNetworks.R0000644000176200001440000002125514155651216021612 0ustar liggesusers## ----setup, echo=FALSE-------------------------------------------------------- # set global chunk options: images will be bigger knitr::opts_chunk$set(fig.width=6, fig.height=6) #, global.par=TRUE options(digits = 4) knitr::knit_hooks$set(small.mar=function(before, options, envir){ if (before && options$fig.show!='none') par(mar=c(.5,.5,.5,.5)) }) ## ---- eval=FALSE-------------------------------------------------------------- # install.packages("phangorn", dependencies=TRUE) # # install latest development version needs devtools # install.packages("devtools", dependencies=TRUE) # library(devtools) # install_github("KlausVigo/phangorn") ## ----------------------------------------------------------------------------- library(phangorn) # load the phangorn library ## ----------------------------------------------------------------------------- ## automatically set the correct working directory for the examples below # setwd(system.file("extdata/trees", package = "phangorn")) # for this vignette we create a path to the files we want to load fdir <- system.file("extdata/trees", package = "phangorn") ## in your case it may look something like this... # setwd("C:/TreesNetworks/Example Files") ##DNA Matrix, maybe not needed woodmouse <- read.phyDat(file.path(fdir, "woodmouse.fasta"),format="fasta") ## RAxML best-known tree with bipartition support (from previous analysis) raxml.tree <- read.tree(file.path(fdir,"RAxML_bipartitions.woodmouse")) ## RAxML bootstrap trees (from previous analysis) raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.woodmouse")) ## MrBayes consensus tree (50% majority rule) (from previous analysis) mrbayes.tree <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.con")) ## MrBayes sample runs 1 and 2 (from previous analysis) run1 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run1.t")) run2 <- read.nexus(file.path(fdir,"woodmouse.mrbayes.nex.run2.t")) ## How many trees are in the MrBayes tree sample? run1 run2 ## Combining the two runs and removing 25% burn-in mrbayes.trees <- c(run1[251:1001],run2[251:1001]) ## NeigbourNet Nexus file generated by SplitsTree (from previous analysis) Nnet <- read.nexus.networx(file.path(fdir,"woodmouse.nxs")) ## ----------------------------------------------------------------------------- par(mfrow=c(1,2), mar=c(1,1,1,1)) # Setting plot parameters ### Plotting trees with support values: ## RAxML plot(raxml.tree) nodelabels(raxml.tree$node.label, adj = c(1, 0), frame = "none") ## MrBayes plot(mrbayes.tree) nodelabels(mrbayes.tree$node.label, adj = c(1, 0), frame = "none") par(mfrow=c(1,1)) # Setting plot parameters # NeighborNet plot(Nnet,"2D") ## alternatively, # plot(Nnet,"2D") ## ---- fig.width=7, fig.height=4, small.mar=TRUE------------------------------- # create a vector of labels for the network corresponding to edges in the tree edge.lab <- createLabel(Nnet, raxml.tree, raxml.tree$edge[,2], "edge") # could be also 1:27 instead of raxml.tree$edge[,2] # Show the correspondingly labelled tree and network in R par(mfrow=c(1,2)) plot(raxml.tree, "u", rotate.tree = 180, cex=.7) edgelabels(raxml.tree$edge[,2],col="blue", frame="none", cex=.7) # find edges that are in the network but not in the tree edge.col <- rep("black", nrow(Nnet$edge)) edge.col[ is.na(edge.lab) ] <- "red" # or a simpler alternative... edge.col <- createLabel(Nnet, raxml.tree, "black", nomatch="red") x <- plot(Nnet, edge.label = edge.lab, show.edge.label = T, "2D", edge.color = edge.col, col.edge.label = "blue", cex=.7) # the above plot function returns an invisible networx object and this object also # contains the colors for the edges. ## ---- small.mar=TRUE---------------------------------------------------------- # the scaler argument multiplies the confidence values. This is useful to switch # confidences values between total, percentage or ratios. x <- addConfidences(Nnet,raxml.tree, scaler = .01) # find splits that are in the network but not in the tree split.col <- rep("black", length(x$splits)) split.col[ !matchSplits(as.splits(x), as.splits(raxml.tree)) ] <- "red" # simpler alternative... split.col2 <- createLabel(x, raxml.tree, label="black", "split", nomatch="red") # Plotting in R out.x <- plot(x,"2D",show.edge.label=TRUE, split.color=split.col, col.edge.label = "blue") ## ----------------------------------------------------------------------------- # write.nexus.networx(out.x,"woodmouse.tree.support.nxs") ## or we can also export the splits alone (for usage in software other than SplitsTree) # write.nexus.splits(as.splits(out.x),"woodmouse.splits.support.nxs") ## ---- small.mar=TRUE---------------------------------------------------------- y <- addConfidences(Nnet, as.splits(raxml.bootstrap)) edge.col <- createLabel(y, raxml.tree, label="black", "edge", nomatch="grey") y <- plot(y,"2D",show.edge.label=TRUE, edge.color=edge.col) ## Write to SplitsTree for viewing # write.nexus.networx(y,"NN.with.bs.support.nxs") ## ---- small.mar=TRUE---------------------------------------------------------- cnet <- consensusNet(raxml.bootstrap,prob=0.10) edge.col <- createLabel(cnet, Nnet, label="black", "edge", nomatch="grey") cnet <- plot(cnet, "2D", show.edge.label = TRUE, edge.color=edge.col) edge.col <- createLabel(Nnet, cnet, label="black", "edge", nomatch="grey") z <- plot(Nnet, "2D", show.edge.label = TRUE, edge.color=edge.col) obj <- addConfidences(Nnet,cnet) plot(obj,"2D",show.edge.label=T, edge.color=edge.col, col.edge.label = "blue") ## Write to SplitsTree for viewing # write.nexus.networx(obj,"Nnet.with.ML.Cnet.Bootstrap.nxs") ## ---- fig.width=7, fig.height=6----------------------------------------------- Nnet <- read.nexus.networx(file.path(fdir,"RAxML_distances.Wang.nxs")) raxml.tree <- read.tree(file.path(fdir,"RAxML_bestTree.Wang.out")) |> unroot() raxml.bootstrap <- read.tree(file.path(fdir,"RAxML_bootstrap.Wang.out")) bs_splits <- as.splits(raxml.bootstrap) tree_splits <- as.splits(raxml.tree) |> unique() |> removeTrivialSplits() # we overwrite bootstrap values and set the weights # to 1e-6 (almost zero), as we plot them on a log scale later on attr(bs_splits, "weights")[] <- 1e-6 # combine the splits from the bootstrap and neighbor net # and delete duplicates and add the confidence values # we get rid of trivial splits all_splits <- c(Nnet$splits, bs_splits) |> unique() |> removeTrivialSplits() |> addConfidences(bs_splits, scaler=100) # For easier plotting we create a matrix with the confidences and # weights as columns tab <- data.frame(SplitWeight = attr(all_splits, "weights"), Bootstrap=attr(all_splits, "confidences"), Tree=FALSE) # we add a logical variable pto indicate which splits are in the RAxML tree tab$Tree[matchSplits(tree_splits, all_splits, FALSE)] = TRUE tab[is.na(tab[,"Bootstrap"]),"Bootstrap"] <- 0 tab[,"Bootstrap"] <- round(tab[,"Bootstrap"]) rownames(tab) <- apply(as.matrix(all_splits, zero.print = ".", one.print = "|"), 1, paste0, collapse="") tab[1:10,] col <- rep("blue", nrow(tab)) col[tab[,"Bootstrap"]==0] <- "green" col[tab[,"SplitWeight"]==1e-6] <- "red" pch = rep(19, nrow(tab)) pch[tab$Tree] <- 17 par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) plot(tab[,"SplitWeight"], tab[,"Bootstrap"], log="x", col=col, pch=pch, xlab="Split weight (log scale)", ylab="Bootstrap (%)") legend("topright", inset=c(-0.35,0), c("Pattern 1", "Pattern 2", "Pattern 3", "Pattern in the\nbest tree"), pch=c(19,19,19,17), col=c("blue", "green", "red", "black"), bty="n") ## ----------------------------------------------------------------------------- YCh <- read.tree(file.path(fdir, "RAxML_bestTree.YCh")) mtG <- read.tree(file.path(fdir, "RAxML_bestTree.mtG")) ncAI <- read.tree(file.path(fdir, "RAxML_bestTree.AIs")) all_data <- read.tree(file.path(fdir, "RAxML_bestTree.3moles")) YCh_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.YCh")) mtG_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.mtG")) ncAI_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.AIs")) all_data_boot <- read.tree(file.path(fdir, "RAxML_bootstrap.3moles")) ## ----------------------------------------------------------------------------- par(mfrow=c(2,2), mar = c(2,2,4,2)) YCh <- plotBS(midpoint(YCh), YCh_boot, "phylogram", p=0, main = "YCh") mtG <- plotBS(midpoint(mtG), mtG_boot, "phylogram", p=0, main = "mtG") ncAI <- plotBS(midpoint(ncAI), ncAI_boot, "phylogram", p=0, main = "ncAI") all_data <- plotBS(midpoint(all_data), all_data_boot, "phylogram", p=0, main = "All data") ## ---- small.mar=TRUE---------------------------------------------------------- par(mfrow=c(1,1)) cn <- consensusNet(c(YCh, mtG, ncAI)) cn <- addConfidences(cn, YCh_boot) |> addConfidences(mtG_boot, add=TRUE) |> addConfidences(ncAI_boot, add=TRUE) |> addConfidences(all_data_boot, add=TRUE) plot(cn, "2D", show.edge.label=TRUE) phangorn/inst/extdata/0000755000176200001440000000000013707232051014475 5ustar liggesusersphangorn/inst/extdata/HIVb.dat0000644000176200001440000000337413707232051015766 0ustar liggesusers 0.307507 0.005 0.295543 1.45504 0.005 17.6612 0.123758 0.351721 0.0860642 0.005 0.0551128 3.4215 0.672052 0.005 0.005 1.48135 0.0749218 0.0792633 10.5872 0.005 2.5602 2.13536 3.65345 0.323401 2.83806 0.897871 0.0619137 3.92775 0.0847613 9.04044 7.64585 1.9169 0.240073 7.05545 0.11974 0.005 0.005 0.677289 0.680565 0.0176792 0.005 0.005 0.00609079 0.005 0.103111 0.215256 0.701427 0.005 0.00876048 0.129777 1.49456 0.005 0.005 1.74171 5.95879 0.005 20.45 7.90443 0.005 0.005 6.54737 4.61482 0.521705 0.005 0.322319 0.0814995 0.0186643 2.51394 0.005 0.005 0.005 0.303676 0.175789 0.005 0.005 11.2065 5.31961 1.28246 0.0141269 0.005 0.005 0.005 9.29815 0.005 0.005 0.291561 0.145558 3.39836 8.52484 0.0342658 0.188025 2.12217 1.28355 0.00739578 0.0342658 0.005 4.47211 0.0120226 0.005 2.45318 0.0410593 2.07757 0.0313862 0.005 0.005 2.46633 3.4791 13.1447 0.52823 4.69314 0.116311 0.005 4.38041 0.382747 1.21803 0.927656 0.504111 0.005 0.956472 5.37762 15.9183 2.86868 6.88667 0.274724 0.739969 0.243589 0.289774 0.369615 0.711594 8.61217 0.0437673 4.67142 4.94026 0.0141269 2.01417 8.93107 0.005 0.991338 0.005 0.005 2.63277 0.026656 0.005 1.21674 0.0695179 0.005 0.748843 0.005 0.089078 0.829343 0.0444506 0.0248728 0.005 0.005 0.00991826 1.76417 0.674653 7.57932 0.113033 0.0792633 0.005 18.6943 0.148168 0.111986 0.005 0.005 15.34 0.0304381 0.648024 0.105652 1.28022 7.61428 0.0812454 0.026656 1.04793 0.420027 0.0209153 1.02847 0.953155 0.005 17.7389 1.41036 0.265829 6.8532 0.723274 0.005 0.0749218 0.709226 0.005 0.0410593 0.060490222 0.066039665 0.044127815 0.042109048 0.020075899 0.053606488 0.071567447 0.072308239 0.022293943 0.069730629 0.098851122 0.056968211 0.019768318 0.028809447 0.046025282 0.05060433 0.053636813 0.033011601 0.028350243 0.061625237 phangorn/inst/extdata/MtZoa.dat0000644000176200001440000000261313707232051016223 0ustar liggesusers 3.3 1.7 33.6 16.1 3.2 617.0 272.5 61.1 94.6 9.5 7.3 231.0 190.3 19.3 49.1 17.1 6.4 174.0 883.6 3.4 349.4 289.3 7.2 99.3 26.0 82.4 8.9 43.1 2.3 61.7 228.9 55.6 37.5 421.8 14.9 7.4 33.2 0.2 24.3 1.5 48.8 0.2 7.3 3.4 1.6 15.6 4.1 7.9 0.5 59.7 23.0 1.0 3.5 6.6 425.2 0.2 292.3 413.4 0.2 0.2 334.0 163.2 10.1 23.9 8.4 6.7 136.5 3.8 73.7 0.2 264.8 83.9 0.2 52.2 7.1 449.7 636.3 83.0 26.5 0.2 12.9 2.0 167.8 9.5 0.2 5.8 13.1 90.3 234.2 16.3 215.6 61.8 7.5 22.6 0.2 8.1 52.2 20.6 1.3 15.6 2.6 11.4 24.3 5.4 10.5 644.9 11.8 420.2 51.4 656.3 96.4 38.4 257.1 23.1 7.2 15.2 144.9 95.3 32.2 79.7 378.1 3.2 184.6 2.3 199.0 39.4 34.5 5.2 19.4 222.3 50.0 75.5 305.1 19.3 56.9 666.3 3.1 16.9 6.4 0.2 36.1 6.1 3.5 12.3 4.5 9.7 27.2 6.6 48.7 58.2 1.3 10.3 3.6 2.1 13.8 141.6 13.9 76.7 52.3 10.0 4.3 266.5 13.1 5.7 45.0 41.4 590.5 4.2 29.7 29.0 79.8 321.9 5.1 7.1 3.7 243.8 9.0 16.3 23.7 0.3 1710.6 126.1 11.1 279.6 59.6 17.9 49.5 396.4 13.7 15.6 0.068880 0.021037 0.030390 0.020696 0.009966 0.018623 0.024989 0.071968 0.026814 0.085072 0.156717 0.019276 0.050652 0.081712 0.044803 0.080535 0.056386 0.027998 0.037404 0.066083 Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val // end of file Rota-Stabelli, O., Z. Yang, and M. Telford. 2009. MtZoa: a general mitochondrial amino acid substitutions model for animal evolutionary studies. Mol. Phyl. Evol. phangorn/inst/extdata/Blosum62.dat0000644000176200001440000000561013707232051016602 0ustar liggesusers 0.735790389698 0.485391055466 1.297446705134 0.543161820899 0.500964408555 3.180100048216 1.45999531047 0.227826574209 0.397358949897 0.240836614802 1.199705704602 3.020833610064 1.839216146992 1.190945703396 0.32980150463 1.1709490428 1.36057419042 1.24048850864 3.761625208368 0.140748891814 5.528919177928 1.95588357496 0.418763308518 1.355872344485 0.798473248968 0.418203192284 0.609846305383 0.423579992176 0.716241444998 1.456141166336 2.414501434208 0.778142664022 0.354058109831 2.43534113114 1.626891056982 0.539859124954 0.605899003687 0.232036445142 0.283017326278 0.418555732462 0.774894022794 0.236202451204 0.186848046932 0.189296292376 0.252718447885 0.800016530518 0.622711669692 0.211888159615 0.218131577594 0.831842640142 0.580737093181 0.372625175087 0.217721159236 0.348072209797 3.890963773304 1.295201266783 5.411115141489 1.593137043457 1.032447924952 0.285078800906 3.945277674515 2.802427151679 0.752042440303 1.022507035889 0.406193586642 0.445570274261 1.253758266664 0.983692987457 0.648441278787 0.222621897958 0.76768882348 2.494896077113 0.55541539747 0.459436173579 0.984311525359 3.364797763104 6.030559379572 1.073061184332 0.492964679748 0.371644693209 0.354861249223 0.281730694207 0.441337471187 0.14435695975 0.291409084165 0.368166464453 0.714533703928 1.517359325954 2.064839703237 0.266924750511 1.77385516883 1.173275900924 0.448133661718 0.494887043702 0.730628272998 0.356008498769 0.858570575674 0.926563934846 0.504086599527 0.527007339151 0.388355409206 0.374555687471 1.047383450722 0.454123625103 0.233597909629 4.325092687057 1.12278310421 2.904101656456 1.582754142065 1.197188415094 1.934870924596 1.769893238937 1.509326253224 1.11702976291 0.35754441246 0.352969184527 1.752165917819 0.918723415746 0.540027644824 1.169129577716 1.729178019485 0.914665954563 1.898173634533 0.934187509431 1.119831358516 1.277480294596 1.071097236007 0.641436011405 0.585407090225 1.17909119726 0.915259857694 1.303875200799 1.488548053722 0.488206118793 1.005451683149 5.15155629227 0.465839367725 0.426382310122 0.191482046247 0.145345046279 0.527664418872 0.758653808642 0.407635648938 0.508358924638 0.30124860078 0.34198578754 0.6914746346 0.332243040634 0.888101098152 2.074324893497 0.252214830027 0.387925622098 0.513128126891 0.718206697586 0.720517441216 0.538222519037 0.261422208965 0.470237733696 0.95898974285 0.596719300346 0.308055737035 4.218953969389 0.674617093228 0.811245856323 0.7179934869 0.951682162246 6.747260430801 0.369405319355 0.796751520761 0.801010243199 4.054419006558 2.187774522005 0.438388343772 0.312858797993 0.258129289418 1.116352478606 0.530785790125 0.524253846338 0.25334079019 0.20155597175 8.311839405458 2.231405688913 0.498138475304 2.575850755315 0.838119610178 0.496908410676 0.561925457442 2.253074051176 0.266508731426 1 0.074 0.052 0.045 0.054 0.025 0.034 0.054 0.074 0.026 0.068 0.099 0.058 0.025 0.047 0.039 0.057 0.051 0.013 0.032 0.073 phangorn/inst/extdata/FLU.dat0000644000176200001440000000721113707232051015616 0ustar liggesusers 0.138658764751059 0.0533665787145181 0.161000889039552 0.584852305649886 0.00677184253227681 7.73739287051356 0.0264470951166826 0.16720700818221 1.30249856764315e-005 0.014132062548787 0.353753981649393 3.29271694159791 0.530642655337477 0.145469388422239 0.00254733397966779 1.4842345032161 0.124897616909194 0.0616521921873234 5.37051127867923 3.91106992668137e-011 1.19562912226203 1.13231312248046 1.19062446519178 0.322524647863997 1.93483278448943 0.116941459124876 0.108051341246072 1.59309882471598 0.214757862168721 1.87956993845887 1.38709603234116 0.887570549414031 0.0218446166959521 5.33031341222104 0.256491863423002 0.0587745274250666 0.149926734229061 0.246117171830255 0.21857197541607 0.0140859174993809 0.00111215807314139 0.0288399502994541 0.0142107118685268 1.62662283098296e-005 0.243190142026506 0.0231169515264061 0.296045557460629 0.000835873174542931 0.00573068208525287 0.00561362724916376 1.02036695531654 0.016499535540562 0.00651622937676521 0.321611693603646 3.51207228207807 0.474333610192982 15.3000966197798 2.6468479652886 0.290042980143818 3.83228119049152e-006 2.559587177122 3.88148880863814 0.264148929349066 0.347302791211758 0.227707997165566 0.129223639195248 0.0587454231508643 0.890162345593224 0.00525168778853117 0.0417629637305017 0.111457310321926 0.190259181297527 0.313974351356074 0.00150046692269255 0.00127350890508147 9.01795420287895 6.74693648486614 1.33129161941264 0.0804909094320368 0.0160550314767596 0.000836445615590923 1.0600102849456e-006 0.10405366623526 0.0326806570137471 0.00100350082518749 0.00123664495412902 0.119028506158521 1.46335727834648 2.98680003596399 0.319895904499071 0.279910508981581 0.659311477863896 0.154027179890711 0.0364417719063219 0.188539456415654 1.59312060172652e-013 0.712769599068934 0.319558828428154 0.0386317614553493 0.924466914225534 0.0805433268150369 0.634308520867322 0.195750631825315 0.0568693216513547 0.0071324304661639 3.01134451903854 0.950138410087378 3.88131053061457 0.338372183381345 0.336263344504404 0.487822498528951 0.307140298031341 1.58564657669139 0.580704249811294 0.290381075260226 0.570766693213698 0.283807671568883 0.00702658828739369 0.996685669575839 2.08738534433198 5.4182981753166 0.183076905018197 2.14033231636063 0.135481232622983 0.011975265782196 0.60234096342392 0.2801248951174 0.0188080299490973 0.368713573381758 2.90405228596936 0.0449263566753846 1.52696419998775 2.03151132062208 0.000134906239484254 0.54225109402693 2.2068599339404 0.195966354027106 1.36942940801512 0.000536284040016542 1.4893873721753e-005 0.0941066800969967 0.0440205200833047 0.155245492137294 0.196486447133033 0.0223729191088972 0.0321321499585514 0.431277662888057 4.97641445484395e-005 0.0704600385245663 0.814753093809928 0.000431020702277328 0.0998357527014247 0.207066205546908 0.0182892882245349 0.0998554972524385 0.373101926513925 0.525398542949365 0.601692431136271 0.0722059354079545 0.104092870343653 0.0748149970972622 6.44895444648517 0.273934263183281 0.340058468374384 0.0124162215506117 0.874272174533394 5.39392424532822 0.000182294881489116 0.392552239890831 0.124898020409882 0.42775543040588 3.53200526987468 0.103964386383736 0.0102575172450253 0.297123975243582 0.0549045639492389 0.406697814049488 0.285047948309311 0.337229618868315 0.0986313546653266 14.3940521944257 0.890598579382591 0.0731279296372675 4.90484223478739 0.592587985458668 0.0589719751511691 0.0882564232979724 0.654109108255219 0.256900461407996 0.167581646770807 0.0470718 0.0509102 0.0742143 0.0478596 0.0250216 0.0333036 0.0545874 0.0763734 0.0199642 0.0671336 0.0714981 0.0567845 0.0181507 0.0304961 0.0506561 0.0884091 0.0743386 0.0185237 0.0314741 0.0632292 phangorn/inst/extdata/dayhoff-dcmut.dat0000644000176200001440000000565713707232051017736 0ustar liggesusers0.267828 0.984474 0.327059 1.199805 0.000000 8.931515 0.360016 0.232374 0.000000 0.000000 0.887753 2.439939 1.028509 1.348551 0.000000 1.961167 0.000000 1.493409 11.388659 0.000000 7.086022 2.386111 0.087791 1.385352 1.240981 0.107278 0.281581 0.811907 0.228116 2.383148 5.290024 0.868241 0.282729 6.011613 0.439469 0.106802 0.653416 0.632629 0.768024 0.239248 0.438074 0.180393 0.609526 0.000000 0.076981 0.406431 0.154924 0.341113 0.000000 0.000000 0.730772 0.112880 0.071514 0.443504 2.556685 0.258635 4.610124 3.148371 0.716913 0.000000 1.519078 0.830078 0.267683 0.270475 0.460857 0.180629 0.717840 0.896321 0.000000 0.000000 0.000000 1.127499 0.304803 0.170372 0.000000 3.332732 5.230115 2.411739 0.183641 0.136906 0.138503 0.000000 0.000000 0.000000 0.000000 0.153478 0.475927 1.951951 1.565160 0.000000 0.921860 2.485920 1.028313 0.419244 0.133940 0.187550 1.526188 0.507003 0.347153 0.933709 0.119152 0.316258 0.335419 0.170205 0.110506 4.051870 1.531590 4.885892 0.956097 1.598356 0.561828 0.793999 2.322243 0.353643 0.247955 0.171432 0.954557 0.619951 0.459901 2.427202 3.680365 0.265745 2.271697 0.660930 0.162366 0.525651 0.340156 0.306662 0.226333 1.900739 0.331090 1.350599 1.031534 0.136655 0.782857 5.436674 0.000000 2.001375 0.224968 0.000000 0.000000 0.000000 0.000000 0.000000 0.270564 0.000000 0.461776 0.000000 0.000000 0.762354 0.000000 0.740819 0.000000 0.244139 0.078012 0.946940 0.000000 0.953164 0.000000 0.214717 0.000000 1.265400 0.374834 0.286572 0.132142 0.000000 6.952629 0.000000 0.336289 0.417839 0.608070 2.059564 0.240368 0.158067 0.178316 0.484678 0.346983 0.367250 0.538165 0.438715 8.810038 1.745156 0.103850 2.565955 0.123606 0.485026 0.303836 1.561997 0.000000 0.279379 0.087127 0.040904 0.040432 0.046872 0.033474 0.038255 0.049530 0.088612 0.033619 0.036886 0.085357 0.080481 0.014753 0.039772 0.050680 0.069577 0.058542 0.010494 0.029916 0.064718 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val # #Dayhoff rate matrix prepared using the DCMut method* #---------------------------------------------------- # #The first part above indicates the symmetric 'exchangeability' parameters s_ij, #where s_ij = s_ji. #The second part gives the amino acid equilibrium frequencies pi_i. #The net replacement rate from i to j is q_ij = pi_j*s_ij. # #This model is usually scaled so that the mean rate of change at #equilibrium, Sum_i Sum_j!=i pi_i*q_ij, equals 1. You should check this #scaling before using the matrix above. The PAML package will perform #this scaling. # # # #*Prepared by Carolin Kosiol and Nick Goldman, December 2003. # #See the following paper for more details: #Kosiol, C., and Goldman, N. 2005. Different versions of the Dayhoff rate matrix. #Molecular Biology and Evolution 22:193-199. # #See also http://www.ebi.ac.uk/goldman/dayhoff phangorn/inst/extdata/mtmam.dat0000644000176200001440000000726613707232051016315 0ustar liggesusers 32 2 4 11 0 864 0 186 0 0 0 246 8 49 0 0 0 0 569 0 274 78 18 47 79 0 0 22 8 232 458 11 305 550 22 0 75 0 19 0 41 0 0 0 0 21 6 0 0 27 20 0 0 26 232 0 50 408 0 0 242 215 0 0 6 4 76 0 21 0 0 22 0 0 0 378 609 59 0 0 6 5 7 0 0 0 0 57 246 0 11 53 9 33 2 0 51 0 0 53 5 43 18 0 17 342 3 446 16 347 30 21 112 20 0 74 65 47 90 202 681 0 110 0 114 0 4 0 1 360 34 50 691 8 78 614 5 16 6 0 65 0 0 0 0 0 12 0 13 0 7 17 0 0 0 156 0 530 54 0 1 1525 16 25 67 0 682 8 107 0 14 398 0 0 10 0 33 20 5 0 2220 100 0 832 6 0 0 237 0 0 0.0692 0.0184 0.0400 0.0186 0.0065 0.0238 0.0236 0.0557 0.0277 0.0905 0.1675 0.0221 0.0561 0.0611 0.0536 0.0725 0.0870 0.0293 0.0340 0.0428 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val //End of File Symmetrical part of the rate matrix and aa frequencies, estimated from the 12 mt proteins (atp6 atp8 cox1 cox2 cox3 cytb nd1 nd2 nd3 nd4 nd4l nd5) on the same strand of the mitochondrial DNA (3331 sites). The data are from 20 species of mammals and three close outgroups (wallaroo, opossum, and platypus). The model used is REVaa+dGamma(K=8) with the estimated gamma parameter to be 0.37. The first part is S_ij = S_ji, and the second part has the amino acid frequencies (PI_i). The substitution rate from amino acid i to j is Q_ij=S_ij*PI_j. The data are from Cao, Y. et al. 1998 Conflict amongst individual mitochondrial proteins in resolving the phylogeny of eutherian orders. Journal of Molecular Evolution 15:1600-1611. The species are listed below 1 SB17F Homo sapiens (African) # D38112 2 CHIMP Pan troglodytes (chimpanzee) # D38113 3 PyGC Pan paniscus (bonobo) # D38116 4 GORIL Gorilla gorilla (gorilla) # D38114 5 ORANG Pongo pygmaeus (orangutan) # D38115 6 Ponpy Pongo pygmaeus abelii (Sumatran orangutan) # X97707 7 Hylla Hylobates lar (common gibbon) # X99256 (lar gibbon) 8 Phovi Phoca vitulina (harbor seal) # X63726 9 Halgr Halichoerus grypus (grey seal) # X72004 10 Felca Felis catus (cat) # U20753 11 Equca Equus caballus (horse) # X79547 12 Rhiun Rhinoceros unicornis (Indian rhinoceros) # X97336 13 Bosta Bos taurus (cow) # J01394 14 Balph Balaenoptera physalus (fin whale) # X61145 15 Balmu Balaenoptera musculus (blue whale) # X72204 16 Ratno Rattus norvegicus (rat) # X14848 17 Musmu Mus musculus (mouse) # J01420 18 Macro Macropus robustus (wallaroo) # Y10524 19 Didvi Didelphis virginiana (opossum) # Z29573 20 Ornan Ornithorhynchus anatinus (platypus) # X83427 The results and details of the model are published in Yang, Z., R. Nielsen, and M. Hasegawa. 1998. Models of amino acid substitution and applications to Mitochondrial protein evolution, Molecular Biology and Evolution 15:1600-1611. Prepared by Z. Yang, April 1998. phangorn/inst/extdata/trees/0000755000176200001440000000000013707232051015617 5ustar liggesusersphangorn/inst/extdata/trees/woodmouse.nxs0000644000176200001440000007751513707232051020411 0ustar liggesusers#nexus BEGIN Taxa; DIMENSIONS ntax=15; TAXLABELS [1] 'No305' [2] 'No304' [3] 'No306' [4] 'No0906S' [5] 'No0908S' [6] 'No0909S' [7] 'No0910S' [8] 'No0912S' [9] 'No0913S' [10] 'No1103S' [11] 'No1007S' [12] 'No1114S' [13] 'No1202S' [14] 'No1206S' [15] 'No1208S' ; END; [Taxa] BEGIN Characters; DIMENSIONS nchar=965; FORMAT datatype=DNA missing=? gap=- symbols="atgc" labels=left transpose=no interleave=no; MATRIX 'No305' nttcgaaaaacacacccactactaaaanttatcagtcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatacatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaanttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagccacactgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgtccacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcagaccctata 'No304' attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtagtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattncaaatttactntcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctgtn 'No306' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacnncatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctata 'No0906S' attcgaaaaacacacccactactaaaaatcatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtatgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataataatttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaatacnnnn 'No0908S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagccccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggggctacagtaattacaaatttactatcagcaattccatatatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatcctcccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0909S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0910S' attcgaaaaacacacccactactaaaaattatcaatcactctttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttgcaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0912S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacggggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgctttccacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagacattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No0913S' attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatgcatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1103S' attcgaaaaacacacccactactaaaaattattaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1007S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1114S' nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagnaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatatattacggctcatacattctcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagtcacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttcctatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaggatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccattccttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1202S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1206S' attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttgccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgtgcacctcttgtttcttcatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagacctcttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn 'No1208S' nnncgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccctctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn ; END; [Characters] BEGIN Distances; DIMENSIONS ntax=15; FORMAT labels=left diagonal triangle=both; MATRIX [1] 'No305' 0.0 0.016684046 0.013541667 0.018789144 0.016701462 0.016701462 0.017745303 0.014613778 0.018789144 0.012526096 0.016701462 0.015317286 0.016701462 0.016701462 0.018828452 [2] 'No304' 0.016684046 0.0 0.0052083335 0.0135557875 0.0114702815 0.015641293 0.012513034 0.0135557875 0.0052137645 0.0114702815 0.015641293 0.016429354 0.0114702815 0.012513034 0.017782427 [3] 'No306' 0.013541667 0.0052083335 0.0 0.0093847755 0.00729927 0.0114702815 0.008342023 0.0093847755 0.0052137645 0.00729927 0.0114702815 0.015334063 0.00729927 0.008342023 0.013598327 [4] 'No0906S' 0.018789144 0.0135557875 0.0093847755 0.0 0.012486992 0.016649324 0.009365245 0.014568158 0.012486992 0.012486992 0.016649324 0.020765027 0.008324662 0.01144641 0.018789144 [5] 'No0908S' 0.016701462 0.0114702815 0.00729927 0.012486992 0.0 0.014568158 0.01144641 0.012486992 0.012486992 0.010405827 0.014568158 0.020765027 0.010405827 0.009365245 0.016701462 [6] 'No0909S' 0.016701462 0.015641293 0.0114702815 0.016649324 0.014568158 0.0 0.015608741 0.010405827 0.016649324 0.008324662 0.0020811656 0.020765027 0.014568158 0.015608741 0.0020876827 [7] 'No0910S' 0.017745303 0.012513034 0.008342023 0.009365245 0.01144641 0.015608741 0.0 0.013527576 0.009365245 0.01144641 0.015608741 0.019672131 0.003121748 0.010405827 0.017745303 [8] 'No0912S' 0.014613778 0.0135557875 0.0093847755 0.014568158 0.012486992 0.010405827 0.013527576 0.0 0.014568158 0.004162331 0.010405827 0.018579235 0.012486992 0.013527576 0.012526096 [9] 'No0913S' 0.018789144 0.0052137645 0.0052137645 0.012486992 0.012486992 0.016649324 0.009365245 0.014568158 0.0 0.012486992 0.016649324 0.018579235 0.008324662 0.013527576 0.018789144 [10] 'No1103S' 0.012526096 0.0114702815 0.00729927 0.012486992 0.010405827 0.008324662 0.01144641 0.004162331 0.012486992 0.0 0.008324662 0.015300547 0.010405827 0.01144641 0.010438413 [11] 'No1007S' 0.016701462 0.015641293 0.0114702815 0.016649324 0.014568158 0.0020811656 0.015608741 0.010405827 0.016649324 0.008324662 0.0 0.018579235 0.012486992 0.015608741 0.0020876827 [12] 'No1114S' 0.015317286 0.016429354 0.015334063 0.020765027 0.020765027 0.020765027 0.019672131 0.018579235 0.018579235 0.015300547 0.018579235 0.0 0.01748634 0.021857923 0.020765027 [13] 'No1202S' 0.016701462 0.0114702815 0.00729927 0.008324662 0.010405827 0.014568158 0.003121748 0.012486992 0.008324662 0.010405827 0.012486992 0.01748634 0.0 0.009365245 0.014613778 [14] 'No1206S' 0.016701462 0.012513034 0.008342023 0.01144641 0.009365245 0.015608741 0.010405827 0.013527576 0.013527576 0.01144641 0.015608741 0.021857923 0.009365245 0.0 0.017745303 [15] 'No1208S' 0.018828452 0.017782427 0.013598327 0.018789144 0.016701462 0.0020876827 0.017745303 0.012526096 0.018789144 0.010438413 0.0020876827 0.020765027 0.014613778 0.017745303 0.0 ; END; [Distances] BEGIN Splits; DIMENSIONS ntax=15 nsplits=43; FORMAT labels=no weights=yes confidences=no intervals=no; PROPERTIES fit=97.76178978414268 cyclic; CYCLE 1 12 3 2 9 13 7 4 14 5 11 15 6 8 10; MATRIX [1, size=1] 0.007878401 1 2 3 4 5 6 7 8 9 10 11 13 14 15, [2, size=4] 9.67039E-4 1 4 5 6 7 8 10 11 13 14 15, [3, size=7] 3.0405898E-4 1 5 6 8 10 11 14 15, [4, size=4] 8.927283E-5 1 6 8 10, [5, size=1] 0.006068427 1, [6, size=1] 4.1818016E-4 1 2 4 5 6 7 8 9 10 11 12 13 14 15, [7, size=3] 6.354771E-4 1 4 5 6 7 8 10 11 12 13 14 15, [8, size=7] 0.0018286711 1 6 8 10 11 12 15, [9, size=3] 3.1608884E-5 1 10 12, [10, size=2] 0.0030639141 1 12, [11, size=1] 0.0020751753 1 3 4 5 6 7 8 9 10 11 12 13 14 15, [12, size=2] 0.0022168073 1 3 4 5 6 7 8 10 11 12 13 14 15, [13, size=1] 0.0012816527 1 2 3 4 5 6 7 8 10 11 12 13 14 15, [14, size=3] 9.066461E-4 1 2 3 4 5 6 8 10 11 12 14 15, [15, size=4] 7.542655E-4 1 2 3 5 6 8 10 11 12 14 15, [16, size=5] 1.0719955E-4 1 2 3 5 6 8 10 11 12 15, [17, size=6] 6.0168037E-5 1 2 3 6 8 10 11 12 15, [18, size=1] 7.864587E-4 1 2 3 4 5 6 7 8 9 10 11 12 14 15, [19, size=2] 0.0011441667 1 2 3 4 5 6 8 9 10 11 12 14 15, [20, size=3] 3.7099395E-5 1 2 3 5 6 8 9 10 11 12 14 15, [21, size=4] 7.577939E-4 1 2 3 5 6 8 9 10 11 12 15, [22, size=6] 8.6808155E-5 1 2 3 9 10 12, [23, size=5] 1.3156666E-4 1 2 3 9 12, [24, size=1] 0.0020897626 1 2 3 4 5 6 8 9 10 11 12 13 14 15, [25, size=3] 1.0902213E-4 1 2 3 5 6 8 9 10 11 12 13 15, [26, size=4] 1.458757E-4 1 2 3 6 8 9 10 11 12 13 15, [27, size=1] 0.0051963497 1 2 3 5 6 7 8 9 10 11 12 13 14 15, [28, size=3] 1.40733355E-5 1 2 3 6 7 8 9 10 11 12 13 15, [29, size=1] 0.004156471 1 2 3 4 5 6 7 8 9 10 11 12 13 15, [30, size=2] 0.0010121305 1 2 3 4 6 7 8 9 10 11 12 13 15, [31, size=1] 0.004199673 1 2 3 4 6 7 8 9 10 11 12 13 14 15, [32, size=2] 8.544509E-4 1 2 3 4 5 6 7 8 9 10 12 13 14, [33, size=3] 0.0051881927 1 2 3 4 5 7 8 9 10 12 13 14, [34, size=4] 6.061471E-6 1 2 3 4 5 7 9 10 12 13 14, [35, size=5] 0.0010072162 1 2 3 4 5 7 9 12 13 14, [36, size=1] 0.0010342944 1 2 3 4 5 6 7 8 9 10 11 12 13 14, [37, size=2] 0.0010670845 1 2 3 4 5 7 8 9 10 11 12 13 14, [38, size=4] 2.1973468E-5 1 2 3 4 5 7 9 11 12 13 14, [39, size=2] 3.0782125E-5 1 2 3 4 5 7 9 10 11 12 13 14 15, [40, size=3] 7.4452415E-5 1 2 3 4 5 7 9 11 12 13 14 15, [41, size=1] 0.0030889313 1 2 3 4 5 6 7 9 10 11 12 13 14 15, [42, size=2] 0.0010669535 1 2 3 4 5 6 7 9 11 12 13 14 15, [43, size=1] 9.133177E-4 1 2 3 4 5 6 7 8 9 11 12 13 14 15, ; END; [Splits] BEGIN Network; DIMENSIONS ntax=15 nvertices=130 nedges=215; DRAW to_scale; TRANSLATE 2 'No305', 3 'No1114S', 4 'No306', 5 'No304', 6 'No0913S', 7 'No1202S', 8 'No0910S', 9 'No0906S', 10 'No1206S', 11 'No0908S', 12 'No1208S', 13 'No0912S', 14 'No1103S', 117 'No1007S', 123 'No0909S', ; VERTICES 1 -0.006068427 0.0 s=n, 2 0.0 0.0 s=n, 3 0.0015083641 0.0043967813 s=n, 4 -0.009464912 0.002829434 s=n, 5 -0.008871745 0.006696938 s=n, 6 -0.010746697 0.0074311504 s=n, 7 -0.013563724 0.0042226063 s=n, 8 -0.015113663 0.004792512 s=n, 9 -0.017300652 0.003006176 s=n, 10 -0.016641626 -2.3478366E-4 s=n, 11 -0.015087945 -0.0022330103 s=n, 12 -0.009807543 -0.009778595 s=n, 13 -0.0059371023 -0.004773448 s=n, 14 -0.00708383 -0.002765694 s=n, 15 -0.009065388 -6.370236E-4 s=n, 16 -0.009096996 -6.370236E-4 s=n, 17 -0.0061406503 5.2473253E-5 s=n, 18 -0.009137611 -5.845503E-4 s=n, 19 -0.009169219 -5.845503E-4 s=n, 20 -0.009257255 -6.823234E-4 s=n, 21 -0.009185032 -7.3479663E-4 s=n, 22 -0.009153423 -7.3479663E-4 s=n, 23 -0.009327484 -7.3334796E-4 s=n, 24 -0.009255261 -7.858212E-4 s=n, 25 -0.010392839 7.7441713E-4 s=n, 26 -0.010480874 6.7664403E-4 s=n, 27 -0.010551103 6.256195E-4 s=n, 28 -0.006172433 3.5486656E-4 s=n, 29 -0.009169393 -2.82157E-4 s=n, 30 -0.009201002 -2.82157E-4 s=n, 31 -0.010424622 0.0010768104 s=n, 32 -0.010512657 9.790374E-4 s=n, 33 -0.010582887 9.280128E-4 s=n, 34 -0.010479588 0.001101283 s=n, 35 -0.010567623 0.00100351 s=n, 36 -0.010637853 9.5248537E-4 s=n, 37 -0.01060607 6.50092E-4 s=n, 38 -0.010566315 0.0011642933 s=n, 39 -0.01065435 0.0010665202 s=n, 40 -0.010724579 0.0010154956 s=n, 41 -0.010692797 7.1310234E-4 s=n, 42 -0.009016237 -0.0016912675 s=n, 43 -0.008944014 -0.0017437408 s=n, 44 -0.008873785 -0.0016927161 s=n, 45 -0.008842176 -0.0016927161 s=n, 46 -0.0056889136 0.0011923469 s=n, 47 -0.008685874 5.553234E-4 s=n, 48 -0.008717483 5.553234E-4 s=n, 49 -0.009941103 0.0019142908 s=n, 50 -0.009996069 0.0019387633 s=n, 51 -0.010082795 0.0020017736 s=n, 52 -0.010587498 0.0025623022 s=n, 53 -0.011071017 0.0017248219 s=n, 54 -0.011159052 0.0016270487 s=n, 55 -0.011229281 0.0015760242 s=n, 56 -0.01192156 0.0018842467 s=n, 57 -0.011416858 0.0013237182 s=n, 58 -0.011385076 0.0010213249 s=n, 59 -0.012067436 0.0018842467 s=n, 60 -0.011562734 0.0013237182 s=n, 61 -0.011530952 0.0010213249 s=n, 62 -0.010838672 7.1310234E-4 s=n, 63 -0.010751946 6.50092E-4 s=n, 64 -0.009015604 -0.0016972957 s=n, 65 -0.00894338 -0.001749769 s=n, 66 -0.009004617 -0.0017163253 s=n, 67 -0.008932394 -0.0017687986 s=n, 68 -0.008933027 -0.0017627702 s=n, 69 -0.008862798 -0.0017117457 s=n, 70 -0.008831189 -0.0017117457 s=n, 71 -0.009744729 0.0025186655 s=n, 72 -0.009799696 0.0025431379 s=n, 73 -0.009886422 0.0026061484 s=n, 74 -0.010391124 0.0031666767 s=n, 75 -0.010844447 0.0039518555 s=n, 76 -0.01104082 0.0033474807 s=n, 77 -0.01152434 0.0025100003 s=n, 78 -0.011612375 0.0024122272 s=n, 79 -0.011682604 0.0023612028 s=n, 80 -0.0123748835 0.0026694252 s=n, 81 -0.012520759 0.0026694252 s=n, 82 -0.012404897 0.0026912317 s=n, 83 -0.012550773 0.0026912317 s=n, 84 -0.01209745 0.0019060532 s=n, 85 -0.012657413 0.0027138987 s=n, 86 -0.01220409 0.0019287202 s=n, 87 -0.0121740755 0.0019069137 s=n, 88 -0.011669374 0.0013463852 s=n, 89 -0.011637591 0.0010439919 s=n, 90 -0.012217856 0.0019257942 s=n, 91 -0.012187841 0.0019039877 s=n, 92 -0.01168314 0.0013434592 s=n, 93 -0.011651357 0.0010410659 s=n, 94 -0.011544717 0.0010183989 s=n, 95 -0.0108524375 7.1017636E-4 s=n, 96 -0.010765712 6.4716605E-4 s=n, 97 -0.009557918 -0.006857067 s=n, 98 -0.009546931 -0.0068760966 s=n, 99 -0.009474708 -0.0069285696 s=n, 100 -0.0094248885 -0.0069838986 s=n, 101 -0.008882575 -0.0018241275 s=n, 102 -0.008883209 -0.0018180992 s=n, 103 -0.00881298 -0.0017670747 s=n, 104 -0.008781371 -0.0017670747 s=n, 105 -0.00951301 0.0047233286 s=n, 106 -0.009567976 0.0047478015 s=n, 107 -0.009654703 0.0048108115 s=n, 108 -0.010159405 0.00537134 s=n, 109 -0.010612727 0.0061565186 s=n, 110 -0.013170495 0.0035415133 s=n, 111 -0.013316371 0.0035415133 s=n, 112 -0.01342301 0.0035641803 s=n, 113 -0.012575984 6.293953E-4 s=n, 114 -0.012469344 6.067283E-4 s=n, 115 -0.011777065 2.9850577E-4 s=n, 116 -0.011690339 2.3549546E-4 s=n, 117 -0.009821957 -0.007669698 s=n, 118 -0.00981097 -0.0076887277 s=n, 119 -0.009699429 -0.0087499665 s=n, 120 -0.00943539 -0.007937335 s=n, 121 -0.009363167 -0.007989809 s=n, 122 -0.009313349 -0.008045138 s=n, 123 -0.009297958 -0.008071796 s=n, 124 -0.0094094975 -0.0070105568 s=n, 125 -0.008867184 -0.0018507856 s=n, 126 -0.008004 -0.002477925 s=n, 127 -0.008019391 -0.002451267 s=n, 128 -0.008020026 -0.0024452389 s=n, 129 -0.007949796 -0.0023942143 s=n, 130 -0.007918187 -0.0023942143 s=n, ; VLABELS 2 'No305' x=12 y=9 f='Dialog-PLAIN-16', 3 'No1114S' x=11 y=14, 4 'No306' x=-15 y=26, 5 'No304' x=-19 y=28, 6 'No0913S' x=-34 y=29, 7 'No1202S' x=-39 y=27, 8 'No0910S' x=-77 y=16, 9 'No0906S' x=-79 y=11, 10 'No1206S' x=-79 y=6, 11 'No0908S' x=-77 y=2, 12 'No1208S' x=-34 y=-19, 13 'No0912S' x=-25 y=-16, 14 'No1103S' x=11 y=4, 117 'No1007S' x=-37 y=-18, 123 'No0909S' x=-31 y=-24, ; EDGES 1 1 2 s=5 w=0.006068427, 2 15 1 s=10 w=0.0030639141, 3 16 15 s=9 w=3.1608884E-5, 4 17 1 s=4 w=8.927283E-5, 5 18 15 s=4 w=8.927283E-5, 6 18 17 s=10 w=0.0030639141, 7 19 16 s=4 w=8.927283E-5, 8 19 18 s=9 w=3.1608884E-5, 9 20 19 s=23 w=1.3156666E-4, 10 21 16 s=23 w=1.3156666E-4, 11 21 20 s=4 w=8.927283E-5, 12 22 15 s=23 w=1.3156666E-4, 13 22 21 s=9 w=3.1608884E-5, 14 23 20 s=22 w=8.6808155E-5, 15 24 21 s=22 w=8.6808155E-5, 16 24 23 s=4 w=8.927283E-5, 17 25 19 s=8 w=0.0018286711, 18 26 20 s=8 w=0.0018286711, 19 26 25 s=23 w=1.3156666E-4, 20 27 23 s=8 w=0.0018286711, 21 27 26 s=22 w=8.6808155E-5, 22 28 17 s=3 w=3.0405898E-4, 23 29 18 s=3 w=3.0405898E-4, 24 29 28 s=10 w=0.0030639141, 25 30 19 s=3 w=3.0405898E-4, 26 30 29 s=9 w=3.1608884E-5, 27 31 25 s=3 w=3.0405898E-4, 28 31 30 s=8 w=0.0018286711, 29 32 26 s=3 w=3.0405898E-4, 30 32 31 s=23 w=1.3156666E-4, 31 33 27 s=3 w=3.0405898E-4, 32 33 32 s=22 w=8.6808155E-5, 33 34 31 s=17 w=6.0168037E-5, 34 35 32 s=17 w=6.0168037E-5, 35 35 34 s=23 w=1.3156666E-4, 36 36 33 s=17 w=6.0168037E-5, 37 36 35 s=22 w=8.6808155E-5, 38 37 27 s=17 w=6.0168037E-5, 39 37 36 s=3 w=3.0405898E-4, 40 38 34 s=16 w=1.0719955E-4, 41 39 35 s=16 w=1.0719955E-4, 42 39 38 s=23 w=1.3156666E-4, 43 40 36 s=16 w=1.0719955E-4, 44 40 39 s=22 w=8.6808155E-5, 45 41 37 s=16 w=1.0719955E-4, 46 41 40 s=3 w=3.0405898E-4, 47 42 23 s=35 w=0.0010072162, 48 43 24 s=35 w=0.0010072162, 49 43 42 s=4 w=8.927283E-5, 50 44 21 s=35 w=0.0010072162, 51 44 43 s=22 w=8.6808155E-5, 52 45 22 s=35 w=0.0010072162, 53 45 44 s=9 w=3.1608884E-5, 54 46 28 s=2 w=9.67039E-4, 55 46 3 s=1 w=0.007878401, 56 47 29 s=2 w=9.67039E-4, 57 47 46 s=10 w=0.0030639141, 58 48 30 s=2 w=9.67039E-4, 59 48 47 s=9 w=3.1608884E-5, 60 49 31 s=2 w=9.67039E-4, 61 49 48 s=8 w=0.0018286711, 62 50 34 s=2 w=9.67039E-4, 63 50 49 s=17 w=6.0168037E-5, 64 51 38 s=2 w=9.67039E-4, 65 51 50 s=16 w=1.0719955E-4, 66 52 51 s=15 w=7.542655E-4, 67 53 38 s=15 w=7.542655E-4, 68 53 52 s=2 w=9.67039E-4, 69 54 39 s=15 w=7.542655E-4, 70 54 53 s=23 w=1.3156666E-4, 71 55 40 s=15 w=7.542655E-4, 72 55 54 s=22 w=8.6808155E-5, 73 56 55 s=21 w=7.577939E-4, 74 57 40 s=21 w=7.577939E-4, 75 57 56 s=15 w=7.542655E-4, 76 58 41 s=21 w=7.577939E-4, 77 58 57 s=3 w=3.0405898E-4, 78 59 56 s=26 w=1.458757E-4, 79 60 57 s=26 w=1.458757E-4, 80 60 59 s=15 w=7.542655E-4, 81 61 58 s=26 w=1.458757E-4, 82 61 60 s=3 w=3.0405898E-4, 83 62 41 s=26 w=1.458757E-4, 84 62 61 s=21 w=7.577939E-4, 85 63 37 s=26 w=1.458757E-4, 86 63 62 s=16 w=1.0719955E-4, 87 64 42 s=34 w=6.061471E-6, 88 65 43 s=34 w=6.061471E-6, 89 65 64 s=4 w=8.927283E-5, 90 66 64 s=38 w=2.1973468E-5, 91 67 65 s=38 w=2.1973468E-5, 92 67 66 s=4 w=8.927283E-5, 93 68 43 s=38 w=2.1973468E-5, 94 68 67 s=34 w=6.061471E-6, 95 69 44 s=38 w=2.1973468E-5, 96 69 68 s=22 w=8.6808155E-5, 97 70 45 s=38 w=2.1973468E-5, 98 70 69 s=9 w=3.1608884E-5, 99 71 49 s=7 w=6.354771E-4, 100 71 4 s=6 w=4.1818016E-4, 101 72 50 s=7 w=6.354771E-4, 102 72 71 s=17 w=6.0168037E-5, 103 73 51 s=7 w=6.354771E-4, 104 73 72 s=16 w=1.0719955E-4, 105 74 52 s=7 w=6.354771E-4, 106 74 73 s=15 w=7.542655E-4, 107 75 74 s=14 w=9.066461E-4, 108 76 52 s=14 w=9.066461E-4, 109 76 75 s=7 w=6.354771E-4, 110 77 53 s=14 w=9.066461E-4, 111 77 76 s=2 w=9.67039E-4, 112 78 54 s=14 w=9.066461E-4, 113 78 77 s=23 w=1.3156666E-4, 114 79 55 s=14 w=9.066461E-4, 115 79 78 s=22 w=8.6808155E-5, 116 80 56 s=14 w=9.066461E-4, 117 80 79 s=21 w=7.577939E-4, 118 81 59 s=14 w=9.066461E-4, 119 81 80 s=26 w=1.458757E-4, 120 82 80 s=20 w=3.7099395E-5, 121 83 81 s=20 w=3.7099395E-5, 122 83 82 s=26 w=1.458757E-4, 123 84 59 s=20 w=3.7099395E-5, 124 84 83 s=14 w=9.066461E-4, 125 85 83 s=25 w=1.0902213E-4, 126 86 84 s=25 w=1.0902213E-4, 127 86 85 s=14 w=9.066461E-4, 128 87 59 s=25 w=1.0902213E-4, 129 87 86 s=20 w=3.7099395E-5, 130 88 60 s=25 w=1.0902213E-4, 131 88 87 s=15 w=7.542655E-4, 132 89 61 s=25 w=1.0902213E-4, 133 89 88 s=3 w=3.0405898E-4, 134 90 86 s=28 w=1.40733355E-5, 135 90 9 s=27 w=0.0051963497, 136 91 87 s=28 w=1.40733355E-5, 137 91 90 s=20 w=3.7099395E-5, 138 92 88 s=28 w=1.40733355E-5, 139 92 91 s=15 w=7.542655E-4, 140 93 89 s=28 w=1.40733355E-5, 141 93 92 s=3 w=3.0405898E-4, 142 94 61 s=28 w=1.40733355E-5, 143 94 93 s=25 w=1.0902213E-4, 144 95 62 s=28 w=1.40733355E-5, 145 95 94 s=21 w=7.577939E-4, 146 96 63 s=28 w=1.40733355E-5, 147 96 95 s=16 w=1.0719955E-4, 148 97 64 s=33 w=0.0051881927, 149 98 66 s=33 w=0.0051881927, 150 98 97 s=38 w=2.1973468E-5, 151 99 67 s=33 w=0.0051881927, 152 99 98 s=4 w=8.927283E-5, 153 100 99 s=40 w=7.4452415E-5, 154 101 67 s=40 w=7.4452415E-5, 155 101 100 s=33 w=0.0051881927, 156 102 68 s=40 w=7.4452415E-5, 157 102 101 s=34 w=6.061471E-6, 158 103 69 s=40 w=7.4452415E-5, 159 103 102 s=22 w=8.6808155E-5, 160 104 70 s=40 w=7.4452415E-5, 161 104 103 s=9 w=3.1608884E-5, 162 105 71 s=12 w=0.0022168073, 163 105 5 s=11 w=0.0020751753, 164 106 72 s=12 w=0.0022168073, 165 106 105 s=17 w=6.0168037E-5, 166 107 73 s=12 w=0.0022168073, 167 107 106 s=16 w=1.0719955E-4, 168 108 74 s=12 w=0.0022168073, 169 108 107 s=15 w=7.542655E-4, 170 109 75 s=12 w=0.0022168073, 171 109 108 s=14 w=9.066461E-4, 172 109 6 s=13 w=0.0012816527, 173 110 82 s=19 w=0.0011441667, 174 110 7 s=18 w=7.864587E-4, 175 111 83 s=19 w=0.0011441667, 176 111 110 s=26 w=1.458757E-4, 177 112 85 s=19 w=0.0011441667, 178 112 111 s=25 w=1.0902213E-4, 179 112 8 s=24 w=0.0020897626, 180 113 93 s=30 w=0.0010121305, 181 113 10 s=29 w=0.004156471, 182 114 94 s=30 w=0.0010121305, 183 114 113 s=25 w=1.0902213E-4, 184 115 95 s=30 w=0.0010121305, 185 115 114 s=21 w=7.577939E-4, 186 116 96 s=30 w=0.0010121305, 187 116 115 s=16 w=1.0719955E-4, 188 116 11 s=31 w=0.004199673, 189 117 97 s=32 w=8.544509E-4, 190 118 98 s=32 w=8.544509E-4, 191 118 117 s=38 w=2.1973468E-5, 192 119 118 s=37 w=0.0010670845, 193 119 12 s=36 w=0.0010342944, 194 120 98 s=37 w=0.0010670845, 195 120 119 s=32 w=8.544509E-4, 196 121 99 s=37 w=0.0010670845, 197 121 120 s=4 w=8.927283E-5, 198 122 100 s=37 w=0.0010670845, 199 122 121 s=40 w=7.4452415E-5, 200 123 122 s=39 w=3.0782125E-5, 201 124 100 s=39 w=3.0782125E-5, 202 124 123 s=37 w=0.0010670845, 203 125 101 s=39 w=3.0782125E-5, 204 125 124 s=33 w=0.0051881927, 205 126 125 s=42 w=0.0010669535, 206 126 13 s=41 w=0.0030889313, 207 127 101 s=42 w=0.0010669535, 208 127 126 s=39 w=3.0782125E-5, 209 128 102 s=42 w=0.0010669535, 210 128 127 s=34 w=6.061471E-6, 211 129 103 s=42 w=0.0010669535, 212 129 128 s=22 w=8.6808155E-5, 213 130 104 s=42 w=0.0010669535, 214 130 129 s=9 w=3.1608884E-5, 215 130 14 s=43 w=9.133177E-4, ; END; [Network] BEGIN st_Assumptions; uptodate; chartransform=Uncorrected_P; disttransform=NeighborNet; splitstransform=EqualAngle; SplitsPostProcess filter=dimension value=4; exclude no missing; autolayoutnodelabels; END; [st_Assumptions] phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.run2.t0000644000176200001440000025045013707232051023152 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; translate 1 No305, 2 No304, 3 No306, 4 No0906S, 5 No0908S, 6 No0909S, 7 No0910S, 8 No0912S, 9 No0913S, 10 No1103S, 11 No1007S, 12 No1114S, 13 No1202S, 14 No1206S, 15 No1208S; tree rep.1 = ((((3,(((4,(8,(15,5))),2),((14,11),12))),(9,13)),7),(10,6),1); tree rep.10000 = (12,(((8,((15,6),11)),10),((((2,9),3),(14,((7,13),4))),5)),1); tree rep.20000 = (12,((8,((6,(11,15)),10)),(((14,((13,7),5)),4),((9,2),3))),1); tree rep.30000 = (12,(((3,(9,2)),(5,((14,4),(7,13)))),((8,10),((6,15),11))),1); tree rep.40000 = ((((12,5),((2,9),3)),(14,((7,13),4))),((8,((11,15),6)),10),1); tree rep.50000 = (((((11,(6,15)),(8,10)),((4,((13,7),14)),5)),((2,9),3)),12,1); tree rep.60000 = ((10,(8,(((4,(((9,2),3),((7,13),14))),5),(11,(15,6))))),12,1); tree rep.70000 = (12,((10,(((11,15),6),8)),((((13,7),4),(5,14)),((9,2),3))),1); tree rep.80000 = (12,(((3,(9,2)),(((7,13),4),(14,5))),((8,(11,(15,6))),10)),1); tree rep.90000 = (((((((13,7),4),5),((2,9),3)),14),((10,8),((11,15),6))),12,1); tree rep.100000 = (12,((10,8),(((9,2),((13,7),4)),(((5,14),(6,(11,15))),3))),1); tree rep.110000 = (12,((((7,13),4),(14,(5,((9,2),3)))),(10,(8,(11,(6,15))))),1); tree rep.120000 = (((10,(8,((6,15),11))),((5,(3,(2,9))),(14,(4,(13,7))))),12,1); tree rep.130000 = (((((4,((7,13),14)),5),(3,(2,9))),(8,(10,((15,6),11)))),12,1); tree rep.140000 = ((((10,8),((15,11),6)),((((7,13),(4,14)),5),(3,(2,9)))),12,1); tree rep.150000 = ((((5,(((9,2),3),14)),((7,13),4)),12),((8,10),((15,11),6)),1); tree rep.160000 = (((((11,(6,15)),10),8),((5,(((7,13),4),14)),((9,2),3))),12,1); tree rep.170000 = (12,((((10,8),((15,6),11)),4),((((9,2),3),5),(14,(7,13)))),1); tree rep.180000 = ((((3,(9,2)),(5,(4,(14,(13,7))))),((8,((15,11),6)),10)),12,1); tree rep.190000 = (12,(((((9,2),3),5),((14,4),(13,7))),((((6,15),11),8),10)),1); tree rep.200000 = (12,((14,((5,(7,13)),(((((11,6),15),10),8),4))),((9,2),3)),1); tree rep.210000 = ((((5,(3,(9,2))),(((13,4),7),14)),((8,10),((15,11),6))),12,1); tree rep.220000 = (12,(((((13,7),14),4),5),(((9,2),3),((11,(6,15)),(8,10)))),1); tree rep.230000 = (12,(((6,15),11),(((5,((13,(4,7)),(3,(9,2)))),14),(8,10))),1); tree rep.240000 = ((((13,7),(((11,(6,15)),(8,10)),((5,4),14))),((2,9),3)),12,1); tree rep.250000 = (((4,(13,7)),((5,14),((2,9),3))),(((10,8),((11,15),6)),12),1); tree rep.260000 = ((((((4,(13,7)),14),(3,(2,9))),5),(8,(((15,11),6),10))),12,1); tree rep.270000 = (12,((8,(10,((11,15),6))),(3,((13,7),(((9,2),5),(4,14))))),1); tree rep.280000 = (((((9,2),3),(5,((7,13),(14,4)))),(((11,15),6),(8,10))),12,1); tree rep.290000 = ((((((7,13),14),4),((3,(2,9)),5)),((10,8),(11,(15,6)))),12,1); tree rep.300000 = ((((((8,(6,(11,15))),10),5),((9,2),3)),(((13,7),14),4)),12,1); tree rep.310000 = (12,(((((2,9),3),5),(((13,7),14),4)),(8,((11,(15,6)),10))),1); tree rep.320000 = (12,((10,((6,(15,11)),8)),((5,((4,(13,7)),14)),((2,9),3))),1); tree rep.330000 = (12,(((8,10),((6,15),11)),(((13,7),(4,(5,14))),((2,9),3))),1); tree rep.340000 = ((((((11,15),6),((((2,9),3),5),(4,((13,7),14)))),10),8),12,1); tree rep.350000 = (12,((8,(((15,6),11),10)),((((9,2),3),5),(14,(4,(7,13))))),1); tree rep.360000 = ((((((11,15),6),8),10),((5,((9,2),3)),((7,13),(14,4)))),12,1); tree rep.370000 = ((((((11,15),6),(8,10)),(3,(5,(9,2)))),((4,(7,13)),14)),12,1); tree rep.380000 = ((((((14,(7,13)),4),(3,(9,2))),5),(((6,15),11),(10,8))),12,1); tree rep.390000 = (12,((14,((((9,2),3),((13,7),4)),5)),(((11,(6,15)),8),10)),1); tree rep.400000 = (12,((5,((14,((7,13),4)),(3,(9,2)))),(10,((6,(15,11)),8))),1); tree rep.410000 = (((10,((6,(15,11)),8)),(((3,(9,2)),5),(((7,13),14),4))),12,1); tree rep.420000 = (12,((5,((7,13),((14,4),((9,2),3)))),((11,(15,6)),(10,8))),1); tree rep.430000 = ((((7,13),5),((((9,2),3),4),14)),((10,(8,(6,(11,15)))),12),1); tree rep.440000 = (12,(((4,(14,(13,7))),(5,(3,(9,2)))),((8,((15,11),6)),10)),1); tree rep.450000 = (((((9,2),3),((((7,13),4),14),5)),((8,10),((11,15),6))),12,1); tree rep.460000 = (12,((((15,11),6),(10,8)),((4,((9,2),((3,5),(13,7)))),14)),1); tree rep.470000 = (12,((8,((6,(11,15)),10)),(5,((3,(9,2)),((7,(13,4)),14)))),1); tree rep.480000 = (12,(((5,((9,2),3)),((11,(15,6)),(8,10))),(((7,13),14),4)),1); tree rep.490000 = (12,(((((13,7),4),(5,14)),(3,(9,2))),(((6,15),11),(8,10))),1); tree rep.500000 = (((((13,7),4),(14,5)),(12,((9,2),3))),((8,((11,15),6)),10),1); tree rep.510000 = ((((8,10),(6,(15,11))),((7,13),(((9,2),3),(5,(14,4))))),12,1); tree rep.520000 = (12,((((((9,2),3),((5,14),(13,(7,4)))),(6,(15,11))),8),10),1); tree rep.530000 = (12,((5,(((2,9),3),((13,7),(4,14)))),((10,8),(11,(6,15)))),1); tree rep.540000 = ((((((15,6),11),8),10),((((7,13),4),(14,5)),(3,(2,9)))),12,1); tree rep.550000 = ((((12,(9,2)),(4,(13,7))),((14,5),3)),(((15,6),11),(10,8)),1); tree rep.560000 = (12,((((7,13),((9,2),3)),(4,(14,5))),((10,8),((6,15),11))),1); tree rep.570000 = (12,((((5,14),(4,(7,13))),((2,9),3)),((6,(15,11)),(8,10))),1); tree rep.580000 = (12,(((8,10),((6,15),11)),(((13,4),7),(((2,9),3),(14,5)))),1); tree rep.590000 = ((5,(3,(9,2))),((12,(10,(8,(6,(11,15))))),((4,14),(7,13))),1); tree rep.600000 = (12,(((8,(15,(6,11))),10),(((9,2),3),(((7,13),(5,14)),4))),1); tree rep.610000 = (12,(((3,(2,9)),(5,((4,7),(14,13)))),(8,(((15,6),11),10))),1); tree rep.620000 = (((((6,(11,15)),8),10),(((14,((7,13),4)),5),((2,9),3))),12,1); tree rep.630000 = (((((2,9),3),(5,(14,((7,13),4)))),(((11,(15,6)),10),8)),12,1); tree rep.640000 = (12,(((((9,2),3),(13,(7,4))),(14,5)),(10,(8,((6,15),11)))),1); tree rep.650000 = (12,((8,(((15,11),6),10)),(((3,(9,2)),(4,(7,13))),(14,5))),1); tree rep.660000 = ((((3,(2,9)),(((13,(7,4)),14),5)),(((15,11),6),(8,10))),12,1); tree rep.670000 = ((((11,(15,6)),(8,10)),(((14,(7,13)),4),(5,(3,(2,9))))),12,1); tree rep.680000 = (((((11,15),6),(8,10)),(((4,(14,(7,13))),5),(3,(9,2)))),12,1); tree rep.690000 = (12,(((8,10),((11,6),15)),((3,(9,2)),((14,4),(5,(7,13))))),1); tree rep.700000 = (((((5,(7,13)),14),(((2,9),3),4)),((6,(11,15)),(8,10))),12,1); tree rep.710000 = (12,(((10,8),(11,(6,15))),((((14,(7,13)),4),(3,(9,2))),5)),1); tree rep.720000 = (12,((5,((3,(9,2)),((4,14),(7,13)))),(8,(10,(11,(6,15))))),1); tree rep.730000 = ((((13,7),((3,(9,2)),(((15,6),11),(10,8)))),((14,5),4)),12,1); tree rep.740000 = (12,((8,(10,((15,6),11))),((3,(9,2)),(4,((7,13),(14,5))))),1); tree rep.750000 = (((5,((((8,10),((11,15),6)),12),((2,9),3))),((7,13),4)),14,1); tree rep.760000 = (12,(((14,4),5),((((8,10),(11,(6,15))),(3,(2,9))),(13,7))),1); tree rep.770000 = ((((14,(7,13)),4),(((((11,6),15),(8,10)),((2,9),3)),5)),12,1); tree rep.780000 = (((((3,(2,9)),((8,10),((11,15),6))),(14,5)),(4,(13,7))),12,1); tree rep.790000 = (((((4,(13,7)),14),(5,(3,(9,2)))),((10,8),(6,(11,15)))),12,1); tree rep.800000 = (12,(8,((10,(((14,(4,(7,13))),5),((9,2),3))),(11,(6,15)))),1); tree rep.810000 = (12,(((10,((6,15),11)),8),(14,(((4,(13,7)),(3,(2,9))),5))),1); tree rep.820000 = ((((5,(14,((13,7),4))),(3,(2,9))),((10,8),(11,(15,6)))),12,1); tree rep.830000 = ((4,(13,7)),((14,((((2,9),12),3),(((6,15),11),(8,10)))),5),1); tree rep.840000 = ((((10,8),(6,(11,15))),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.850000 = (((8,(10,((15,11),6))),((((9,2),3),14),(((13,7),4),5))),12,1); tree rep.860000 = (12,((((6,(11,15)),8),10),((4,(7,13)),((14,5),((9,2),3)))),1); tree rep.870000 = (12,(((4,(7,13)),(((9,2),3),(14,5))),(8,(((15,6),11),10))),1); tree rep.880000 = (12,(((3,(9,2)),(((4,13),7),(5,14))),((((11,6),15),8),10)),1); tree rep.890000 = (((2,9),((5,(((13,7),14),4)),3)),(12,((11,(15,6)),(10,8))),1); tree rep.900000 = (12,(8,((((3,(9,2)),(5,((4,(13,7)),14))),((15,11),6)),10)),1); tree rep.910000 = ((12,5),(((((7,13),4),((((15,11),6),8),10)),((2,9),3)),14),1); tree rep.920000 = (((((9,2),3),((14,(4,(13,7))),5)),((11,(6,15)),(8,10))),12,1); tree rep.930000 = (((8,((6,(15,11)),10)),(((14,(5,4)),(7,13)),((9,2),3))),12,1); tree rep.940000 = ((((10,8),((15,11),6)),((7,13),(14,(((2,(9,3)),4),5)))),12,1); tree rep.950000 = (((5,(3,(2,9))),(14,((4,7),13))),(12,(8,(10,(6,(15,11))))),1); tree rep.960000 = (((((((6,15),11),8),10),5),(4,((3,(9,2)),(14,(13,7))))),12,1); tree rep.970000 = ((((10,((11,15),6)),8),(((3,(2,9)),((14,4),(7,13))),5)),12,1); tree rep.980000 = (12,((3,(2,9)),((((8,((15,11),6)),10),5),((4,(13,7)),14))),1); tree rep.990000 = (12,(((14,((7,13),4)),(((9,2),3),5)),((10,((6,15),11)),8)),1); tree rep.1000000 = ((((6,(11,15)),8),(10,((((9,2),3),((7,13),4)),(14,5)))),12,1); tree rep.1010000 = ((((10,(11,(15,6))),8),(5,(((2,9),3),(((13,7),4),14)))),12,1); tree rep.1020000 = ((((10,(11,(6,15))),8),((5,(14,(4,(13,7)))),((9,2),3))),12,1); tree rep.1030000 = ((((5,(4,(3,(9,2)))),(14,(7,13))),(8,((11,(15,6)),10))),12,1); tree rep.1040000 = ((((((11,15),6),8),10),(4,((14,(5,(3,(9,2)))),(13,7)))),12,1); tree rep.1050000 = (12,((5,(14,4)),((((9,2),3),(13,7)),(10,(8,((11,6),15))))),1); tree rep.1060000 = (((((4,(7,13)),(5,14)),(3,(9,2))),((10,8),((15,6),11))),12,1); tree rep.1070000 = ((((10,(11,(15,6))),8),((((9,2),14),((13,5),7)),(4,3))),12,1); tree rep.1080000 = ((((10,8),(11,(15,6))),(((2,3),5),(14,((9,4),(13,7))))),12,1); tree rep.1090000 = (12,((8,(((6,11),15),10)),(((4,5),(14,(13,7))),(3,(2,9)))),1); tree rep.1100000 = (((11,(6,15)),((4,(((7,13),(14,5)),(3,(9,2)))),(8,10))),12,1); tree rep.1110000 = ((((((4,13),7),14),5),(3,(9,2))),(12,(10,(8,(6,(15,11))))),1); tree rep.1120000 = ((((((13,7),14),4),(5,((9,2),3))),((10,(15,(6,11))),8)),12,1); tree rep.1130000 = (12,((10,(8,((15,11),6))),(5,(((9,2),3),(14,(4,(7,13)))))),1); tree rep.1140000 = (12,(((4,((6,(11,15)),(8,10))),14),(((2,9),3),((7,13),5))),1); tree rep.1150000 = (12,((((6,(11,15)),8),10),((5,((2,9),3)),((7,13),(4,14)))),1); tree rep.1160000 = (12,((((3,(2,9)),((7,13),4)),(5,14)),(8,(((15,11),6),10))),1); tree rep.1170000 = ((((3,(2,9)),(((7,13),14),4)),5),((10,8),((11,(6,15)),12)),1); tree rep.1180000 = (((5,14),(((7,13),4),(3,(2,9)))),(12,((8,((15,11),6)),10)),1); tree rep.1190000 = (((7,13),(4,(14,(5,(3,(9,2)))))),((((15,6),11),(10,8)),12),1); tree rep.1200000 = ((((10,(11,(6,15))),8),(((13,7),4),(((9,2),3),(14,5)))),12,1); tree rep.1210000 = ((((8,((6,15),11)),10),(((3,5),(2,9)),((14,4),(7,13)))),12,1); tree rep.1220000 = (((((15,(6,11)),8),10),(((5,((9,2),3)),14),(4,(13,7)))),12,1); tree rep.1230000 = (12,((4,((((2,9),3),((13,7),14)),5)),((10,(15,(11,6))),8)),1); tree rep.1240000 = (12,(((10,8),(6,(11,15))),((5,((2,9),3)),((13,7),(14,4)))),1); tree rep.1250000 = ((12,(3,(9,2))),(((10,8),((15,6),11)),(5,((14,4),(7,13)))),1); tree rep.1260000 = (((14,(7,13)),(4,(((9,2),3),5))),(12,(10,(((15,6),11),8))),1); tree rep.1270000 = (12,(((15,6),11),(10,(8,((((9,2),3),(14,(4,(13,7)))),5)))),1); tree rep.1280000 = ((((10,8),((15,11),6)),(((5,14),(4,(7,13))),(3,(9,2)))),12,1); tree rep.1290000 = (((14,5),(((3,(2,9)),(((10,8),(11,(15,6))),(7,13))),4)),12,1); tree rep.1300000 = (12,((((10,(6,(15,11))),8),5),(((7,13),(14,4)),(3,(2,9)))),1); tree rep.1310000 = (((((15,11),6),(((7,13),(14,4)),(((9,2),3),5))),(10,8)),12,1); tree rep.1320000 = (12,(((14,5),((4,(7,13)),(3,(9,2)))),((6,(15,11)),(8,10))),1); tree rep.1330000 = ((((3,(2,9)),((13,7),14)),(4,5)),((8,(10,(6,(15,11)))),12),1); tree rep.1340000 = ((((10,8),((6,15),11)),((5,(3,(2,9))),(((13,7),4),14))),12,1); tree rep.1350000 = (((((14,(7,4)),13),(((9,2),3),5)),((10,(11,(6,15))),8)),12,1); tree rep.1360000 = (12,((((15,11),6),(8,10)),((7,13),((4,14),(((2,9),3),5)))),1); tree rep.1370000 = (12,((((5,(14,(13,(7,4)))),3),(2,9)),(10,((15,(11,6)),8))),1); tree rep.1380000 = ((8,((11,(15,6)),10)),((12,(14,((7,13),4))),(5,((2,9),3))),1); tree rep.1390000 = ((((3,(2,9)),(4,((7,13),14))),5),(((((6,15),11),8),10),12),1); tree rep.1400000 = ((((13,7),((5,(2,9)),(4,((10,(6,(11,15))),8)))),(14,3)),12,1); tree rep.1410000 = ((((6,(11,15)),(8,10)),(((3,(9,2)),((14,5),(13,7))),4)),12,1); tree rep.1420000 = (12,((((13,7),4),5),(((((11,15),6),(8,10)),((9,2),3)),14)),1); tree rep.1430000 = (12,(((6,(11,15)),(8,10)),(((13,7),((14,5),4)),(3,(9,2)))),1); tree rep.1440000 = (((((3,(9,2)),5),(14,(4,(13,7)))),(8,(10,((15,6),11)))),12,1); tree rep.1450000 = (12,(((5,(((13,7),4),14)),(3,(9,2))),((8,((15,6),11)),10)),1); tree rep.1460000 = (((11,(6,15)),((10,8),(((5,14),((9,2),3)),((13,7),4)))),12,1); tree rep.1470000 = ((((11,(15,6)),(((14,5),((13,7),4)),(10,8))),12),(3,(9,2)),1); tree rep.1480000 = (((12,(8,(((15,11),6),10))),((2,9),3)),(((4,(7,13)),5),14),1); tree rep.1490000 = (((10,((6,(15,11)),8)),((5,((2,9),3)),(14,((7,13),4)))),12,1); tree rep.1500000 = (12,((5,(14,((3,(9,2)),(13,(4,7))))),((8,(6,(11,15))),10)),1); tree rep.1510000 = (12,(((5,((9,2),3)),(4,((7,13),14))),((10,8),(6,(15,11)))),1); tree rep.1520000 = (12,((((14,(3,(9,2))),(5,((13,7),4))),(10,8)),((15,6),11)),1); tree rep.1530000 = (12,(((8,10),((11,15),6)),(((3,(9,2)),5),(((13,7),4),14))),1); tree rep.1540000 = ((((11,(15,6)),(10,8)),((((13,7),4),(14,5)),(3,(9,2)))),12,1); tree rep.1550000 = (12,((((8,(10,(11,(15,6)))),(5,14)),((3,9),2)),((13,7),4)),1); tree rep.1560000 = (((((3,(2,9)),((13,7),(14,5))),4),((11,(6,15)),(10,8))),12,1); tree rep.1570000 = (12,((6,(15,11)),((10,(4,(((3,(2,9)),(14,(13,7))),5))),8)),1); tree rep.1580000 = (12,((((2,9),3),(5,((14,4),(7,13)))),(10,(((15,6),11),8))),1); tree rep.1590000 = ((((10,8),((11,15),6)),((4,5),((3,(9,2)),((7,13),14)))),12,1); tree rep.1600000 = (12,((10,8),((14,((3,(9,2)),(((13,7),4),5))),((11,15),6))),1); tree rep.1610000 = ((((5,(((13,7),4),14)),((2,9),3)),(10,(8,(6,(15,11))))),12,1); tree rep.1620000 = ((12,((3,(2,9)),(((14,4),5),(7,13)))),(((6,(11,15)),8),10),1); tree rep.1630000 = (12,((4,((14,(5,(7,13))),(3,(2,9)))),((8,10),((15,11),6))),1); tree rep.1640000 = (12,((((10,8),(11,(15,6))),((3,(9,2)),((14,4),(7,13)))),5),1); tree rep.1650000 = (((((6,15),11),(10,8)),(((3,(9,2)),5),((7,13),(14,4)))),12,1); tree rep.1660000 = (((((11,15),6),10),8),(12,(14,(((7,13),(3,(2,9))),(5,4)))),1); tree rep.1670000 = (((((2,9),3),((((13,7),4),14),5)),(((6,15),11),(10,8))),12,1); tree rep.1680000 = (((10,(8,(11,(15,6)))),(5,((((7,13),4),14),(3,(9,2))))),12,1); tree rep.1690000 = ((((3,(9,2)),5),(4,(14,(7,13)))),(12,((11,(15,6)),(8,10))),1); tree rep.1700000 = (((((13,7),(4,14)),((9,2),3)),(12,(((6,15),11),(10,8)))),5,1); tree rep.1710000 = (((((14,((7,13),(5,3))),4),(9,2)),((10,((15,6),11)),8)),12,1); tree rep.1720000 = (12,(((((13,7),4),(5,14)),((9,2),3)),((10,8),((15,11),6))),1); tree rep.1730000 = (((((6,(11,15)),10),8),(((2,9),3),((14,(5,(13,7))),4))),12,1); tree rep.1740000 = (((((9,2),3),(14,5)),((13,7),4)),(((8,10),((11,15),6)),12),1); tree rep.1750000 = (((8,(11,(15,6))),10),(((3,(9,2)),12),(((4,(7,13)),14),5)),1); tree rep.1760000 = (((((13,7),4),(14,((3,(2,9)),5))),12),(8,(10,(6,(15,11)))),1); tree rep.1770000 = (((10,8),(11,(15,6))),(((13,7),4),((5,14),(12,((2,9),3)))),1); tree rep.1780000 = ((12,((5,(14,((13,7),((2,9),3)))),4)),(((6,15),11),(8,10)),1); tree rep.1790000 = (12,((6,(11,15)),(((((9,2),3),4),((13,7),(14,5))),(10,8))),1); tree rep.1800000 = ((((3,((13,7),(14,4))),5),(9,2)),(12,((15,(6,11)),(8,10))),1); tree rep.1810000 = (12,((((15,6),11),(8,10)),(((5,(3,(2,9))),(4,(13,7))),14)),1); tree rep.1820000 = (((((((15,11),6),(10,8)),((9,2),3)),5),(((13,7),4),14)),12,1); tree rep.1830000 = ((((10,8),((6,15),11)),((5,(((13,7),4),14)),(3,(9,2)))),12,1); tree rep.1840000 = (((12,(11,(15,6))),(8,10)),((((9,2),3),(7,13)),((14,4),5)),1); tree rep.1850000 = ((10,((((14,(((7,13),5),4)),((2,9),3)),((6,15),11)),8)),12,1); tree rep.1860000 = (((((4,(13,7)),((2,9),3)),(5,14)),((10,8),((15,6),11))),12,1); tree rep.1870000 = (((10,(8,((6,15),11))),((5,(3,(9,2))),((4,14),(7,13)))),12,1); tree rep.1880000 = (12,((10,(((15,6),11),8)),((7,13),(((4,5),14),((9,2),3)))),1); tree rep.1890000 = ((((3,(2,9)),((14,5),((7,13),4))),12),(10,(((11,15),6),8)),1); tree rep.1900000 = (((8,10),(6,(15,11))),(12,(((3,(2,9)),5),(14,(4,(7,13))))),1); tree rep.1910000 = ((((14,(((13,7),4),(9,2))),(5,3)),(((6,(11,15)),10),8)),12,1); tree rep.1920000 = (12,((3,(9,2)),((((13,7),5),(4,14)),(8,(10,((6,15),11))))),1); tree rep.1930000 = (((((5,(4,(7,13))),14),((9,2),3)),((10,8),(11,(6,15)))),12,1); tree rep.1940000 = (12,((13,(4,(((9,2),3),(7,(14,5))))),((10,8),((15,11),6))),1); tree rep.1950000 = (((8,10),(11,(6,15))),((((((13,7),4),3),((9,2),14)),5),12),1); tree rep.1960000 = ((((14,((13,7),4)),(((2,9),3),5)),((10,8),((6,15),11))),12,1); tree rep.1970000 = ((12,((10,8),(6,(15,11)))),((14,5),(((9,2),3),(4,(7,13)))),1); tree rep.1980000 = (12,(((((15,11),6),8),10),(5,(((9,2),3),((13,7),(4,14))))),1); tree rep.1990000 = (12,(((((2,9),3),(5,(14,(4,(7,13))))),(10,8)),((11,15),6)),1); tree rep.2000000 = (12,((((7,13),3),(14,(((9,2),5),4))),((10,8),((6,11),15))),1); tree rep.2010000 = (12,((((15,6),11),(8,10)),((5,(((4,7),13),14)),(3,(9,2)))),1); tree rep.2020000 = ((14,(((9,2),3),((4,(13,7)),5))),(12,(8,(10,(11,(15,6))))),1); tree rep.2030000 = (((((3,(9,2)),((7,4),13)),(14,5)),((10,8),(11,(15,6)))),12,1); tree rep.2040000 = ((5,((3,(9,2)),((((6,(11,15)),8),10),(((7,13),4),14)))),12,1); tree rep.2050000 = ((12,(5,(((9,2),3),(14,((13,7),4))))),((10,((11,15),6)),8),1); tree rep.2060000 = ((((((11,15),6),8),10),12),((4,((14,5),(7,13))),(3,(9,2))),1); tree rep.2070000 = (((14,(5,(((9,2),3),((7,13),4)))),(((15,6),11),(10,8))),12,1); tree rep.2080000 = (((((9,2),3),(((7,13),4),14)),(5,((8,(11,(15,6))),10))),12,1); tree rep.2090000 = (12,(((11,(6,15)),(10,8)),(((4,14),(13,7)),(((2,9),3),5))),1); tree rep.2100000 = ((((((15,6),11),8),10),((3,(2,9)),((14,(4,(13,7))),5))),12,1); tree rep.2110000 = (12,(((14,(((2,9),3),5)),((7,13),4)),(10,(8,((15,6),11)))),1); tree rep.2120000 = (12,((8,(((15,6),11),10)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.2130000 = ((((((15,11),6),8),10),(((5,14),((2,9),3)),(4,(7,13)))),12,1); tree rep.2140000 = (((6,(15,11)),(10,8)),(((5,(3,(2,9))),(14,((13,7),4))),12),1); tree rep.2150000 = (12,(((8,10),((6,15),11)),((5,14),(((2,9),3),(4,(13,7))))),1); tree rep.2160000 = (12,((((9,2),3),((14,(5,4)),(7,13))),(8,(10,(11,(6,15))))),1); tree rep.2170000 = (((11,(15,6)),(10,8)),(((((13,7),(14,4)),(3,(9,2))),5),12),1); tree rep.2180000 = ((((6,(15,11)),(8,10)),(((14,5),(4,(3,(9,2)))),(13,7))),12,1); tree rep.2190000 = (12,((5,((14,((7,13),4)),((2,9),3))),((8,10),((15,6),11))),1); tree rep.2200000 = ((((((14,5),3),4),((13,7),(2,9))),(((15,6),11),(8,10))),12,1); tree rep.2210000 = ((((((((7,13),4),((2,9),3)),(14,5)),((11,15),6)),10),8),12,1); tree rep.2220000 = (((8,((6,(11,15)),10)),(((13,7),4),((14,5),(3,(9,2))))),12,1); tree rep.2230000 = (12,(((8,10),((4,(7,13)),((5,14),((9,2),3)))),(11,(15,6))),1); tree rep.2240000 = (((((5,(7,13)),14),(4,((2,9),3))),(10,((6,(11,15)),8))),12,1); tree rep.2250000 = (((((15,6),11),(10,8)),((5,(3,(9,2))),((7,13),(4,14)))),12,1); tree rep.2260000 = (12,(((5,(14,(7,13))),(4,((2,9),3))),(10,(8,((6,15),11)))),1); tree rep.2270000 = (((((14,(13,7)),(4,5)),((2,9),3)),(8,((11,(6,15)),10))),12,1); tree rep.2280000 = ((((10,((6,15),11)),8),(((14,(7,13)),4),(5,((9,2),3)))),12,1); tree rep.2290000 = ((((8,10),(14,(((9,2),3),(5,((7,13),4))))),12),(11,(15,6)),1); tree rep.2300000 = (((((11,6),15),(8,10)),(((9,2),3),(5,(14,(4,(7,13)))))),12,1); tree rep.2310000 = (12,(5,(((4,(7,13)),14),(((2,9),3),(((15,6),11),(10,8))))),1); tree rep.2320000 = (12,(((4,14),((2,9),3)),(((8,(((6,15),11),10)),(13,7)),5)),1); tree rep.2330000 = ((((10,8),(11,(15,6))),(((14,5),(((7,13),4),(2,9))),3)),12,1); tree rep.2340000 = ((((5,(7,13)),((3,(2,9)),(4,14))),12),(10,(((11,15),6),8)),1); tree rep.2350000 = ((((((9,2),3),((4,14),(7,13))),5),(10,(8,(11,(15,6))))),12,1); tree rep.2360000 = (((5,(((4,(7,13)),14),((9,2),3))),((6,(15,11)),(10,8))),12,1); tree rep.2370000 = (12,((((11,15),6),(8,10)),(((7,13),((4,((9,2),3)),5)),14)),1); tree rep.2380000 = ((8,(10,(15,(6,11)))),(12,((3,(9,2)),(14,((4,(7,13)),5)))),1); tree rep.2390000 = (((((14,5),(3,(9,2))),(4,(7,13))),((10,8),((15,6),11))),12,1); tree rep.2400000 = (12,(((6,(11,15)),(10,8)),(((4,(14,(13,7))),5),((2,9),3))),1); tree rep.2410000 = (((((3,(2,9)),5),((7,13),(14,4))),(((11,(6,15)),8),10)),12,1); tree rep.2420000 = ((5,(((13,7),(14,4)),(3,(9,2)))),(((10,8),(6,(11,15))),12),1); tree rep.2430000 = ((((6,(11,15)),10),8),((5,12),((3,(9,2)),((13,7),(14,4)))),1); tree rep.2440000 = (12,((((8,10),(6,(11,15))),((9,2),3)),((7,13),((5,14),4))),1); tree rep.2450000 = ((12,((8,(10,(6,(15,11)))),(14,((7,13),(4,5))))),((2,9),3),1); tree rep.2460000 = (12,((5,(((13,7),14),((10,8),((6,15),11)))),(((9,2),3),4)),1); tree rep.2470000 = ((((10,8),(6,(15,11))),((4,(13,7)),((3,(9,2)),(5,14)))),12,1); tree rep.2480000 = (12,((((4,(7,13)),((8,10),(6,(15,11)))),((9,2),3)),(5,14)),1); tree rep.2490000 = ((((7,13),(14,(4,(((9,2),3),5)))),(8,((6,(15,11)),10))),12,1); tree rep.2500000 = ((((((9,2),3),((13,7),5)),(14,4)),((10,(6,(15,11))),8)),12,1); tree rep.2510000 = ((12,(((2,(3,9)),5),(((7,13),4),14))),(8,(10,(6,(11,15)))),1); tree rep.2520000 = (12,(((11,(15,6)),(10,8)),((14,(((13,7),4),(3,(2,9)))),5)),1); tree rep.2530000 = ((((11,(15,6)),8),10),(12,(5,(((14,(13,7)),4),((2,9),3)))),1); tree rep.2540000 = ((((11,(6,15)),(8,10)),((5,((9,2),3)),(((13,7),14),4))),12,1); tree rep.2550000 = (12,(((10,8),(6,(11,15))),((5,(14,((7,13),4))),(3,(2,9)))),1); tree rep.2560000 = (12,(((14,(4,(13,7))),((5,3),(9,2))),((6,(11,15)),(10,8))),1); tree rep.2570000 = (((11,(15,6)),(10,8)),(12,((14,5),((4,(7,13)),((2,9),3)))),1); tree rep.2580000 = (12,((((3,(2,9)),5),(4,(14,(7,13)))),(((11,(15,6)),8),10)),1); tree rep.2590000 = (((10,((11,15),6)),8),(((5,(3,(9,2))),((14,4),(13,7))),12),1); tree rep.2600000 = ((((5,((14,((13,7),4)),3)),(2,9)),(((11,(6,15)),8),10)),12,1); tree rep.2610000 = (((8,(((15,6),11),10)),12),(((14,5),(3,(9,2))),(4,(7,13))),1); tree rep.2620000 = (((11,(6,15)),(10,8)),(((((7,13),(14,5)),4),(3,(9,2))),12),1); tree rep.2630000 = (12,(5,((((4,14),(13,7)),((9,2),3)),((8,10),((6,15),11)))),1); tree rep.2640000 = (12,(((5,14),((4,(7,13)),(3,(9,2)))),(10,((6,(11,15)),8))),1); tree rep.2650000 = (12,((5,(((14,(13,7)),4),((9,2),3))),(10,(8,(11,(15,6))))),1); tree rep.2660000 = (12,((7,(((13,14),(5,(3,(9,2)))),4)),(10,(8,((11,15),6)))),1); tree rep.2670000 = ((8,10),((6,(11,15)),(((5,((9,2),3)),(((7,13),14),4)),12)),1); tree rep.2680000 = ((((5,((7,13),((2,9),3))),(4,14)),((15,(11,6)),(8,10))),12,1); tree rep.2690000 = (12,(((10,(6,(15,11))),8),(((((7,13),4),14),5),((9,2),3))),1); tree rep.2700000 = ((((8,10),((6,15),11)),((5,((3,(9,2)),14)),((7,13),4))),12,1); tree rep.2710000 = (((4,((13,7),14)),(((2,9),3),5)),(((10,8),(11,(15,6))),12),1); tree rep.2720000 = (((5,(((4,(13,7)),(3,(2,9))),14)),((8,((15,11),6)),10)),12,1); tree rep.2730000 = (((((13,7),4),(5,(14,(3,(9,2))))),((10,8),((15,11),6))),12,1); tree rep.2740000 = (12,(((8,10),(6,(11,15))),(5,((((7,13),14),4),((9,2),3)))),1); tree rep.2750000 = (((((13,7),(14,4)),((3,(9,2)),5)),((8,((15,6),11)),10)),12,1); tree rep.2760000 = ((((((13,7),(2,9)),3),((4,14),5)),((11,(6,15)),(8,10))),12,1); tree rep.2770000 = ((((14,(3,(2,9))),(5,(4,(13,7)))),((10,8),(11,(15,6)))),12,1); tree rep.2780000 = (12,((((5,14),(((2,9),3),4)),(13,7)),(((11,15),6),(8,10))),1); tree rep.2790000 = (12,(((13,7),4),(((14,5),((2,9),3)),((10,((15,6),11)),8))),1); tree rep.2800000 = ((((8,((6,15),11)),10),((((2,(3,9)),((7,13),14)),4),5)),12,1); tree rep.2810000 = ((((5,(3,(9,2))),(14,(4,(7,13)))),(((11,(6,15)),10),8)),12,1); tree rep.2820000 = (12,(((10,((11,15),6)),8),((4,((13,7),14)),((3,(9,2)),5))),1); tree rep.2830000 = ((12,((11,(6,15)),(8,10))),(((9,2),3),(5,((14,4),(7,13)))),1); tree rep.2840000 = ((10,(8,((11,15),6))),((5,(14,(((7,13),4),(3,(9,2))))),12),1); tree rep.2850000 = (((11,(6,15)),(8,10)),((((9,2),3),((((13,7),4),14),5)),12),1); tree rep.2860000 = ((((15,6),11),(10,8)),(((12,5),(3,(9,2))),(14,((7,13),4))),1); tree rep.2870000 = (12,(((((13,7),4),((2,9),3)),(5,14)),((8,10),(11,(6,15)))),1); tree rep.2880000 = ((((8,10),(15,(6,11))),(((7,13),((3,(2,9)),(4,14))),5)),12,1); tree rep.2890000 = (12,(((10,(6,(15,11))),8),((7,13),(((5,14),((2,9),3)),4))),1); tree rep.2900000 = (12,((5,(3,(9,2))),((8,((6,(11,15)),10)),(((7,13),4),14))),1); tree rep.2910000 = ((((10,((15,6),11)),8),12),((((14,4),(13,7)),((2,9),3)),5),1); tree rep.2920000 = (12,((((6,15),11),(10,8)),((5,(((4,(7,13)),14),3)),(9,2))),1); tree rep.2930000 = (((((9,2),3),(14,(5,(4,(13,7))))),((8,10),(11,(15,6)))),12,1); tree rep.2940000 = (12,(((3,(2,9)),(((13,7),(14,5)),4)),(((11,(6,15)),8),10)),1); tree rep.2950000 = ((((((7,13),14),4),5),(12,((2,9),3))),((8,((11,15),6)),10),1); tree rep.2960000 = (((4,(((13,7),3),((2,9),5))),14),(12,((10,8),((6,15),11))),1); tree rep.2970000 = (12,(((((13,7),(14,5)),4),((9,2),3)),((6,(15,11)),(10,8))),1); tree rep.2980000 = (((10,(8,((14,(5,((7,13),(3,(2,9))))),4))),((11,15),6)),12,1); tree rep.2990000 = (((((6,11),15),(8,10)),(((14,4),(13,7)),((5,3),(2,9)))),12,1); tree rep.3000000 = (12,((5,(((2,9),3),(((15,11),6),(10,8)))),(14,((13,7),4))),1); tree rep.3010000 = ((((((13,7),4),14),((3,(2,9)),5)),((6,(11,15)),(8,10))),12,1); tree rep.3020000 = (12,(((14,5),(((9,2),3),(4,(13,7)))),((11,(6,15)),(8,10))),1); tree rep.3030000 = ((((8,(11,(15,6))),10),(((9,2),3),((5,14),((13,7),4)))),12,1); tree rep.3040000 = ((((8,(6,(15,11))),10),(5,((4,(14,(7,13))),((2,9),3)))),12,1); tree rep.3050000 = (12,((((((13,7),14),4),((2,9),3)),5),((8,10),((15,6),11))),1); tree rep.3060000 = (12,(((10,8),(6,(11,15))),(((7,4),13),((3,(2,9)),(14,5)))),1); tree rep.3070000 = ((((11,(15,6)),10),8),(((3,(2,9)),(((13,7),(14,5)),4)),12),1); tree rep.3080000 = (12,((8,((6,(11,15)),10)),((((13,7),(4,14)),(3,(2,9))),5)),1); tree rep.3090000 = (12,((((3,(2,9)),5),((14,(7,13)),4)),(10,(8,((15,6),11)))),1); tree rep.3100000 = (((((15,6),11),(((2,9),(5,(14,(4,(13,7))))),3)),(10,8)),12,1); tree rep.3110000 = (((10,((11,(15,6)),8)),((3,(2,9)),((14,5),(7,(4,13))))),12,1); tree rep.3120000 = (((((14,4),(13,7)),(((2,9),3),5)),((8,(11,(15,6))),10)),12,1); tree rep.3130000 = ((12,((6,(11,15)),(8,10))),((((2,9),3),(14,(4,(7,13)))),5),1); tree rep.3140000 = (((10,((11,(6,15)),8)),(((4,(14,(7,13))),5),((2,9),3))),12,1); tree rep.3150000 = (((10,8),((((9,2),3),((14,((7,13),4)),5)),((6,15),11))),12,1); tree rep.3160000 = (((10,(((15,11),6),8)),((5,14),((4,(3,(2,9))),(7,13)))),12,1); tree rep.3170000 = ((5,(((((13,7),4),12),(3,(2,9))),14)),((10,8),((15,6),11)),1); tree rep.3180000 = ((((((9,2),3),((4,(14,5)),(13,7))),(6,(11,15))),(8,10)),12,1); tree rep.3190000 = (((((15,11),6),(10,8)),(5,(((9,2),3),(((13,7),4),14)))),12,1); tree rep.3200000 = (((((15,11),6),8),10),(12,(((5,(4,(13,7))),14),(3,(9,2)))),1); tree rep.3210000 = (((((3,(9,2)),(7,13)),(4,(5,14))),((11,(15,6)),(8,10))),12,1); tree rep.3220000 = (((5,((4,(14,(13,7))),((9,2),3))),((10,((15,6),11)),8)),12,1); tree rep.3230000 = ((((((4,(13,7)),14),((9,2),3)),5),((10,8),((15,6),11))),12,1); tree rep.3240000 = ((((5,((3,9),2)),(14,(4,(13,7)))),((10,(11,(15,6))),8)),12,1); tree rep.3250000 = (12,(((15,(11,6)),(10,8)),(4,(((14,5),((9,2),3)),(7,13)))),1); tree rep.3260000 = (12,((8,((11,(6,15)),10)),((((7,13),4),((2,9),3)),(5,14))),1); tree rep.3270000 = (((14,(4,(5,(13,7)))),(((((6,15),11),8),10),(3,(2,9)))),12,1); tree rep.3280000 = (((10,(8,((6,11),15))),12),((4,14),((3,(2,9)),(5,(13,7)))),1); tree rep.3290000 = (((8,10),((15,6),11)),((14,((7,13),(5,(12,(3,(2,9)))))),4),1); tree rep.3300000 = ((((5,((2,9),3)),((4,14),(7,13))),((10,8),((11,15),6))),12,1); tree rep.3310000 = (((10,((6,(15,11)),8)),(5,(((9,2),3),((14,4),(13,7))))),12,1); tree rep.3320000 = ((((((14,(4,13)),7),5),(3,(9,2))),((10,8),(6,(11,15)))),12,1); tree rep.3330000 = (12,((8,(((15,11),6),10)),((14,(7,13)),(4,(5,((9,2),3))))),1); tree rep.3340000 = (12,((3,(9,2)),(5,(((4,(13,7)),14),(10,(((6,11),15),8))))),1); tree rep.3350000 = (12,((10,(((15,11),6),8)),(((9,2),3),((14,5),(4,(7,13))))),1); tree rep.3360000 = (12,(((10,8),(((14,(13,7)),4),(5,(3,(9,2))))),((11,6),15)),1); tree rep.3370000 = ((12,((14,(13,7)),4)),(((9,2),(5,3)),(((11,15),6),(10,8))),1); tree rep.3380000 = ((((4,((14,5),(7,13))),(3,(2,9))),(8,((6,(15,11)),10))),12,1); tree rep.3390000 = ((((3,(2,9)),5),((14,4),(13,7))),((((15,11),6),(10,8)),12),1); tree rep.3400000 = (((10,((11,(6,15)),8)),(((7,13),(14,(5,4))),(3,(9,2)))),12,1); tree rep.3410000 = (12,((((9,2),3),((((13,7),4),14),5)),(10,(((15,11),6),8))),1); tree rep.3420000 = (12,(((((4,(13,7)),((2,9),3)),(((6,15),11),(8,10))),14),5),1); tree rep.3430000 = (12,(((7,13),((4,((3,(2,9)),5)),14)),((10,8),((11,15),6))),1); tree rep.3440000 = (((14,((3,(2,9)),5)),((10,(((11,15),6),8)),(13,7))),(12,4),1); tree rep.3450000 = ((((4,(7,13)),((5,14),((9,2),3))),((15,(11,6)),(10,8))),12,1); tree rep.3460000 = (((((15,6),11),(10,8)),(((3,(9,2)),5),(14,((13,7),4)))),12,1); tree rep.3470000 = ((((9,2),3),(5,((4,14),(7,13)))),((((15,6),11),(10,8)),12),1); tree rep.3480000 = (12,(((8,(11,(6,15))),10),((((9,2),3),(14,5)),(4,(7,13)))),1); tree rep.3490000 = (((5,((3,14),(((7,13),4),(9,2)))),(10,((6,(15,11)),8))),12,1); tree rep.3500000 = (12,((((2,9),3),(5,(((13,7),4),14))),(10,(8,(15,(11,6))))),1); tree rep.3510000 = (12,(((14,5),((4,(7,13)),(3,(9,2)))),(10,(((15,6),11),8))),1); tree rep.3520000 = ((12,(((3,(2,9)),(5,14)),(4,(13,7)))),(((11,(6,15)),8),10),1); tree rep.3530000 = ((((6,(11,15)),(10,8)),(((13,7),4),((2,9),(3,(5,14))))),12,1); tree rep.3540000 = ((((5,(3,(2,9))),((4,(13,7)),14)),((10,8),((6,15),11))),12,1); tree rep.3550000 = (12,((3,(2,9)),((5,14),((4,(13,7)),((10,8),(11,(6,15)))))),1); tree rep.3560000 = (12,((((((9,2),3),(7,13)),5),4),(((8,(15,(11,6))),10),14)),1); tree rep.3570000 = ((((10,8),(11,(6,15))),((5,(14,(4,(13,7)))),(3,(9,2)))),12,1); tree rep.3580000 = (12,((((9,2),3),((5,14),((7,13),4))),(8,(10,(15,(11,6))))),1); tree rep.3590000 = ((((8,(6,(15,11))),10),(((9,2),3),((14,(4,(13,7))),5))),12,1); tree rep.3600000 = (12,(((((4,(7,13)),14),(((6,(15,11)),10),8)),5),((9,2),3)),1); tree rep.3610000 = (((5,((14,(4,(7,13))),(3,(9,2)))),((8,10),(11,(6,15)))),12,1); tree rep.3620000 = (12,((((((7,13),(8,(10,(11,(6,15))))),5),14),4),((9,2),3)),1); tree rep.3630000 = ((12,((6,(11,15)),(10,8))),((5,14),((3,(9,2)),(7,(4,13)))),1); tree rep.3640000 = ((((8,(11,(15,6))),10),((5,((2,9),3)),(((13,7),4),14))),12,1); tree rep.3650000 = (((5,(3,(9,2))),((14,4),(13,7))),(12,(10,((11,(15,6)),8))),1); tree rep.3660000 = ((((4,(7,13)),(5,14)),((9,2),3)),(12,((8,10),((11,15),6))),1); tree rep.3670000 = (12,((((11,(15,6)),8),10),(5,(4,(((9,2),3),((7,13),14))))),1); tree rep.3680000 = ((((((9,2),3),((4,(7,13)),14)),5),(((15,6),11),(10,8))),12,1); tree rep.3690000 = (12,(((8,10),((15,11),6)),((3,(9,2)),((14,((13,7),4)),5))),1); tree rep.3700000 = ((14,(((4,(7,13)),5),((9,2),3))),(12,(8,((6,(15,11)),10))),1); tree rep.3710000 = ((((5,14),(((7,13),4),(3,(2,9)))),12),(8,((11,(15,6)),10)),1); tree rep.3720000 = (12,(((5,((2,9),3)),((7,13),(4,14))),((8,((15,6),11)),10)),1); tree rep.3730000 = (12,(((5,((9,2),3)),((14,(7,13)),4)),((15,(6,11)),(8,10))),1); tree rep.3740000 = (((4,(9,(13,7))),((3,2),((14,5),(((11,15),6),(8,10))))),12,1); tree rep.3750000 = ((((14,5),(((7,13),4),(3,(9,2)))),12),((10,8),((15,6),11)),1); tree rep.3760000 = (((8,10),((5,((9,2),(((4,(7,13)),14),3))),((11,15),6))),12,1); tree rep.3770000 = ((((5,(((13,7),4),(3,(9,2)))),14),((10,((11,15),6)),8)),12,1); tree rep.3780000 = (12,(5,((14,(4,(13,7))),(((11,(15,6)),(8,10)),(3,(2,9))))),1); tree rep.3790000 = (12,((((10,8),((15,6),11)),((3,(9,2)),(14,(13,7)))),(5,4)),1); tree rep.3800000 = (((((11,15),6),(8,10)),(((9,2),3),(14,(((7,13),4),5)))),12,1); tree rep.3810000 = ((((6,(11,15)),(8,10)),(((7,13),(4,((9,2),3))),(5,14))),12,1); tree rep.3820000 = (((((15,6),11),(8,10)),((((13,7),4),14),(5,((9,2),3)))),12,1); tree rep.3830000 = (((((15,6),11),8),10),((5,((9,2),3)),((12,14),(4,(13,7)))),1); tree rep.3840000 = (12,((((13,7),4),(((3,(9,2)),14),5)),((10,(11,(6,15))),8)),1); tree rep.3850000 = (12,(((14,(4,(7,13))),(5,(3,(9,2)))),(10,(((15,6),11),8))),1); tree rep.3860000 = (((4,(13,7)),(((2,9),3),(5,14))),(((8,((11,15),6)),10),12),1); tree rep.3870000 = (12,(((((6,15),11),10),8),((4,((((9,2),3),(7,13)),14)),5)),1); tree rep.3880000 = (((5,((14,(4,(13,7))),(3,(9,2)))),(10,((11,(15,6)),8))),12,1); tree rep.3890000 = (12,(((3,(9,2)),(((4,(7,13)),14),5)),(((11,6),15),(8,10))),1); tree rep.3900000 = (((((9,2),3),((14,(4,(13,7))),5)),(10,(((15,11),6),8))),12,1); tree rep.3910000 = ((((3,(9,2)),((7,13),14)),(5,4)),(((10,(6,(15,11))),8),12),1); tree rep.3920000 = ((((8,10),((11,15),6)),(((4,(7,13)),14),(5,((2,9),3)))),12,1); tree rep.3930000 = (((12,(14,(4,(13,7)))),((3,(2,9)),5)),((10,8),(11,(15,6))),1); tree rep.3940000 = (12,(((4,((14,5),((9,2),3))),(13,7)),(((15,(11,6)),10),8)),1); tree rep.3950000 = (12,(((10,(6,(15,11))),8),(((14,5),(4,(13,7))),((9,2),3))),1); tree rep.3960000 = (12,(((3,(9,2)),((5,14),((7,13),4))),((10,8),((11,15),6))),1); tree rep.3970000 = (((14,((((7,13),4),5),(3,(9,2)))),((8,10),(6,(15,11)))),12,1); tree rep.3980000 = (((5,((((9,2),3),14),((13,7),4))),(10,(8,(11,(6,15))))),12,1); tree rep.3990000 = ((((4,((14,5),(3,(2,9)))),((8,10),((15,11),6))),(7,13)),12,1); tree rep.4000000 = (12,(((((2,9),3),5),(14,(4,(7,13)))),(10,((6,(11,15)),8))),1); tree rep.4010000 = ((((15,6),11),(10,8)),((12,((9,2),3)),((5,14),((13,7),4))),1); tree rep.4020000 = (12,((((15,6),11),(8,10)),(((((2,9),3),(14,5)),4),(7,13))),1); tree rep.4030000 = ((((((9,2),3),((8,10),(11,(15,6)))),(((13,7),4),14)),5),12,1); tree rep.4040000 = (12,(((((11,15),6),10),8),((13,(7,4)),((((9,2),3),14),5))),1); tree rep.4050000 = (((8,(10,((11,15),6))),(5,((4,((2,9),3)),(14,(7,13))))),12,1); tree rep.4060000 = ((((6,(11,15)),(10,8)),(((13,7),14),(((2,9),3),(5,4)))),12,1); tree rep.4070000 = ((((((3,(2,9)),5),((13,7),4)),14),(((15,6),11),(8,10))),12,1); tree rep.4080000 = ((((((2,9),3),5),(14,(4,(13,7)))),12),(((11,(6,15)),8),10),1); tree rep.4090000 = (((((13,(7,4)),(5,14)),(3,(2,9))),(8,(10,((15,11),6)))),12,1); tree rep.4100000 = (((((9,2),3),(5,(14,((7,13),4)))),((6,(11,15)),(10,8))),12,1); tree rep.4110000 = ((((10,8),(11,(6,15))),((3,(9,2)),((4,(14,(13,7))),5))),12,1); tree rep.4120000 = (((((9,2),3),(((4,14),(7,13)),5)),(10,(8,((15,6),11)))),12,1); tree rep.4130000 = ((((10,8),(11,(6,15))),12),((3,5),((9,2),((7,13),(4,14)))),1); tree rep.4140000 = (12,((4,((14,(7,13)),(5,((9,2),3)))),((8,10),((15,11),6))),1); tree rep.4150000 = (((10,(8,((6,15),11))),((5,((14,4),(7,13))),((9,2),3))),12,1); tree rep.4160000 = (12,((5,(((9,2),3),((4,14),(13,7)))),(((6,(15,11)),10),8)),1); tree rep.4170000 = (12,(((((9,2),3),((14,(7,13)),5)),4),(((15,11),6),(8,10))),1); tree rep.4180000 = (12,(((5,(3,(9,2))),((4,14),(7,13))),(10,(((15,6),11),8))),1); tree rep.4190000 = (((((15,6),11),(8,10)),12),((5,(3,(2,9))),((13,7),(4,14))),1); tree rep.4200000 = ((((8,(6,(15,11))),10),(((3,(2,9)),((7,13),(14,4))),5)),12,1); tree rep.4210000 = (((((11,15),6),8),10),((((((13,7),14),4),5),(3,(2,9))),12),1); tree rep.4220000 = ((((7,13),4),(((5,((10,8),((6,15),11))),(3,(2,9))),14)),12,1); tree rep.4230000 = (((((11,15),6),(10,8)),12),(4,((5,((7,14),13)),((2,9),3))),1); tree rep.4240000 = ((((14,((7,13),4)),5),((9,2),3)),(((((11,15),6),8),10),12),1); tree rep.4250000 = (((((15,6),11),(10,8)),(((4,(3,(2,9))),(14,(7,13))),5)),12,1); tree rep.4260000 = ((((3,(2,9)),(4,(14,((13,7),5)))),((10,8),((15,6),11))),12,1); tree rep.4270000 = (5,((((11,(6,15)),(10,8)),(((13,7),4),14)),(12,((9,2),3))),1); tree rep.4280000 = (((10,((15,6),11)),8),(12,((5,(((2,9),3),(4,14))),(7,13))),1); tree rep.4290000 = ((12,(10,8)),(((15,6),11),((5,((14,(13,7)),4)),((9,2),3))),1); tree rep.4300000 = (12,(((((9,(3,2)),4),(7,13)),(14,5)),(10,((15,(6,11)),8))),1); tree rep.4310000 = (12,(((((13,7),4),14),(5,(3,(9,2)))),((10,((15,11),6)),8)),1); tree rep.4320000 = (((10,(8,(6,(15,11)))),(4,(((13,7),((2,9),(14,5))),3))),12,1); tree rep.4330000 = (((10,(((15,6),11),8)),(((13,7),4),((14,5),(3,(9,2))))),12,1); tree rep.4340000 = (((12,(5,(((4,14),(7,13)),(3,(9,2))))),(10,(11,(15,6)))),8,1); tree rep.4350000 = (12,((14,((13,7),4)),((((6,15),11),(10,8)),(((9,2),3),5))),1); tree rep.4360000 = ((((10,8),(6,(15,11))),(((7,(13,14)),4),(5,(3,(2,9))))),12,1); tree rep.4370000 = ((((((2,9),3),((14,4),(13,7))),5),((8,(6,(15,11))),10)),12,1); tree rep.4380000 = (((((9,2),3),(5,((7,13),(4,14)))),(8,(10,(6,(15,11))))),12,1); tree rep.4390000 = (((10,(8,(11,(6,15)))),(((14,(4,(7,13))),(3,(2,9))),5)),12,1); tree rep.4400000 = ((10,((11,(15,6)),8)),(12,(((5,14),(4,(7,13))),(3,(9,2)))),1); tree rep.4410000 = ((((((11,15),6),(10,8)),((((13,7),(9,2)),5),(3,4))),12),14,1); tree rep.4420000 = ((12,(((5,(9,2)),((14,4),(7,13))),3)),((10,8),((15,11),6)),1); tree rep.4430000 = ((((11,(15,6)),(8,10)),(14,(5,((3,(2,9)),(4,(13,7)))))),12,1); tree rep.4440000 = (12,((((7,13),4),((14,5),((2,9),3))),(10,(8,((11,15),6)))),1); tree rep.4450000 = (12,(((((7,13),4),((2,9),3)),(5,14)),((11,(6,15)),(10,8))),1); tree rep.4460000 = (((10,8),((11,(6,15)),12)),((((7,13),4),14),(5,(9,(3,2)))),1); tree rep.4470000 = (12,((((11,15),6),(10,8)),((5,((14,(7,13)),4)),((2,9),3))),1); tree rep.4480000 = (((8,10),((6,15),11)),(12,(((5,14),((7,13),4)),(3,(2,9)))),1); tree rep.4490000 = (((((2,9),3),((8,10),((15,6),11))),((5,(14,4)),(13,7))),12,1); tree rep.4500000 = ((((8,((6,11),15)),10),((14,((((9,2),3),5),(13,7))),4)),12,1); tree rep.4510000 = ((5,(12,((2,9),3))),((((6,15),11),(10,8)),(14,((13,7),4))),1); tree rep.4520000 = (((8,(10,(6,(15,11)))),(((5,((((9,2),13),7),14)),4),3)),12,1); tree rep.4530000 = (((15,6),11),(12,((((((9,2),3),(14,(4,(13,7)))),5),8),10)),1); tree rep.4540000 = (12,((((((((2,9),3),5),((13,7),4)),14),10),8),((6,15),11)),1); tree rep.4550000 = (12,(((((2,9),5),3),((13,7),(14,4))),(((6,15),11),(10,8))),1); tree rep.4560000 = (((((2,9),3),((4,(13,7)),(14,5))),((10,(6,(15,11))),8)),12,1); tree rep.4570000 = ((((10,(8,(6,(15,11)))),((2,9),(3,12))),5),(14,(4,(7,13))),1); tree rep.4580000 = (((((14,((13,7),4)),5),(3,(9,2))),((8,(6,(15,11))),10)),12,1); tree rep.4590000 = (12,(((5,14),((3,(9,2)),((7,13),4))),(((15,6),11),(8,10))),1); tree rep.4600000 = (12,((((3,(2,9)),((13,7),(4,14))),5),((15,(11,6)),(10,8))),1); tree rep.4610000 = ((((7,(13,4)),((8,10),((15,11),6))),((5,((2,9),3)),14)),12,1); tree rep.4620000 = (((10,(((6,11),15),8)),((5,((9,2),3)),((4,14),(7,13)))),12,1); tree rep.4630000 = ((((5,((4,((13,7),(3,(9,2)))),14)),((11,15),6)),(8,10)),12,1); tree rep.4640000 = (((10,8),(6,(15,11))),(5,(14,(((7,13),4),(((9,2),3),12)))),1); tree rep.4650000 = (((7,13),(((((((11,15),6),(8,10)),5),(2,(9,3))),4),14)),12,1); tree rep.4660000 = ((((2,9),3),(((14,(7,(13,4))),5),((6,(15,11)),(8,10)))),12,1); tree rep.4670000 = (12,(((3,(2,9)),(((7,13),4),(5,14))),((10,((15,6),11)),8)),1); tree rep.4680000 = (((((9,2),3),(5,(14,((7,4),13)))),((10,(11,(15,6))),8)),12,1); tree rep.4690000 = (12,(((14,5),(((13,7),4),(3,(2,9)))),((8,((6,15),11)),10)),1); tree rep.4700000 = (12,((10,(((15,11),6),8)),((4,(13,7)),((5,14),((2,9),3)))),1); tree rep.4710000 = (((10,(((6,15),11),8)),12),((3,(2,9)),((((13,4),7),14),5)),1); tree rep.4720000 = (12,(((((4,(7,13)),14),5),((2,9),3)),((6,(11,15)),(10,8))),1); tree rep.4730000 = (12,((8,((11,(15,6)),10)),(5,((3,(9,2)),((4,(13,7)),14)))),1); tree rep.4740000 = (12,(((11,(6,15)),(8,10)),((5,((14,4),(7,13))),(3,(2,9)))),1); tree rep.4750000 = (12,((((2,9),3),(((13,7),4),(5,14))),(((15,11),6),(8,10))),1); tree rep.4760000 = (((((15,6),11),(8,10)),(((14,5),((13,7),4)),(3,(2,9)))),12,1); tree rep.4770000 = (((14,((13,7),4)),(((2,9),3),5)),(12,((10,(6,(15,11))),8)),1); tree rep.4780000 = (((((10,8),(((13,7),4),(5,(11,(6,15))))),14),(3,(9,2))),12,1); tree rep.4790000 = ((((3,(2,9)),((13,7),4)),(14,5)),(12,((10,(6,(15,11))),8)),1); tree rep.4800000 = ((((((3,(9,2)),((7,13),4)),14),5),((10,(11,(15,6))),8)),12,1); tree rep.4810000 = (12,((((11,15),6),(10,8)),((((3,(2,9)),((7,13),4)),14),5)),1); tree rep.4820000 = (12,(((8,(6,(15,11))),10),(((2,9),3),((4,(7,13)),(14,5)))),1); tree rep.4830000 = (12,(5,((((8,10),(11,(6,15))),(14,(13,(7,4)))),((9,2),3))),1); tree rep.4840000 = (((10,(((11,6),15),8)),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.4850000 = (12,((((4,(13,7)),(14,5)),((9,2),3)),((10,(11,(6,15))),8)),1); tree rep.4860000 = (((((3,(9,2)),5),((14,4),(13,7))),((((6,15),11),8),10)),12,1); tree rep.4870000 = ((((((10,8),((6,11),15)),((9,2),3)),(4,(14,(7,13)))),5),12,1); tree rep.4880000 = ((((8,10),(11,(6,15))),(5,((((4,7),13),14),((2,9),3)))),12,1); tree rep.4890000 = ((((((9,2),14),(3,(5,4))),(7,13)),((10,8),(6,(15,11)))),12,1); tree rep.4900000 = (((10,((15,6),11)),8),(12,((((2,9),(14,(4,(13,7)))),3),5)),1); tree rep.4910000 = ((((((15,11),6),10),8),((4,((7,13),14)),((3,(9,2)),5))),12,1); tree rep.4920000 = (((8,10),((15,11),6)),((((7,13),(14,4)),(((9,2),3),5)),12),1); tree rep.4930000 = (((14,((5,(3,(9,2))),(4,(13,7)))),(10,(((6,15),11),8))),12,1); tree rep.4940000 = (12,((((14,4),(7,13)),((8,10),(6,(11,15)))),(((9,2),3),5)),1); tree rep.4950000 = (12,((((15,6),11),(8,10)),((3,(((4,(7,13)),14),5)),(2,9))),1); tree rep.4960000 = (12,((8,(10,((15,6),11))),(((3,(9,2)),5),(((7,13),4),14))),1); tree rep.4970000 = ((3,(9,2)),(((5,14),((6,(11,15)),(10,8))),((13,7),(12,4))),1); tree rep.4980000 = (12,(((3,(2,9)),(5,(((13,7),14),4))),(((11,15),6),(10,8))),1); tree rep.4990000 = (((((6,11),15),(10,8)),12),((3,(((14,(7,13)),4),(2,9))),5),1); tree rep.5000000 = ((((((2,9),3),((10,8),((15,11),6))),(5,14)),(4,(7,13))),12,1); tree rep.5010000 = (((((((4,(7,13)),14),3),(((11,15),6),(8,10))),(2,9)),5),12,1); tree rep.5020000 = (((((2,9),3),(4,(5,((13,7),14)))),(8,(10,(11,(6,15))))),12,1); tree rep.5030000 = ((((6,(15,11)),(10,8)),((14,5),(((7,13),4),(3,(2,9))))),12,1); tree rep.5040000 = (12,(((((13,7),14),5),(4,(3,(2,9)))),(((11,15),6),(10,8))),1); tree rep.5050000 = ((4,(((3,(2,9)),(7,13)),((5,(8,(10,((15,11),6)))),14))),12,1); tree rep.5060000 = ((((4,(14,(7,13))),(((2,9),3),5)),((8,10),(11,(6,15)))),12,1); tree rep.5070000 = ((((((15,11),6),(10,8)),(3,(9,2))),((13,7),((5,14),4))),12,1); tree rep.5080000 = (12,(10,((((15,11),6),(((3,(9,2)),14),((4,(13,7)),5))),8)),1); tree rep.5090000 = ((((8,10),((15,6),11)),((4,((13,7),14)),((3,(9,2)),5))),12,1); tree rep.5100000 = (((((6,15),11),(10,8)),((5,14),((4,(7,13)),((2,9),3)))),12,1); tree rep.5110000 = ((((((13,7),4),14),(((2,9),3),5)),((((15,11),6),8),10)),12,1); tree rep.5120000 = (12,((((14,4),(7,13)),((3,(9,2)),5)),(((11,15),6),(10,8))),1); tree rep.5130000 = (12,(((5,((9,2),3)),(4,((13,7),14))),(10,((11,(15,6)),8))),1); tree rep.5140000 = (((10,((6,(11,15)),8)),(5,((3,(9,2)),((4,14),(13,7))))),12,1); tree rep.5150000 = ((((((15,6),11),10),8),((((13,7),4),((9,2),3)),(14,5))),12,1); tree rep.5160000 = ((((3,((((7,13),4),14),5)),(9,2)),(8,(((15,11),6),10))),12,1); tree rep.5170000 = ((((7,13),((5,(4,14)),((9,2),3))),((10,((6,15),11)),8)),12,1); tree rep.5180000 = ((((((9,2),3),((4,(13,7)),14)),5),(10,(8,((15,6),11)))),12,1); tree rep.5190000 = ((12,(8,(((15,6),11),10))),(((9,2),3),((14,((13,7),4)),5)),1); tree rep.5200000 = (((((7,13),(4,14)),(5,(3,(9,2)))),((8,(6,(15,11))),10)),12,1); tree rep.5210000 = (12,((10,(8,(6,(15,11)))),((3,(9,2)),(5,(4,((13,7),14))))),1); tree rep.5220000 = ((((((4,(7,13)),((9,2),3)),14),5),(((11,6),15),(8,10))),12,1); tree rep.5230000 = (12,(((8,(11,(6,15))),10),(((4,(13,7)),(14,5)),(3,(9,2)))),1); tree rep.5240000 = ((((((4,(13,7)),14),(3,(9,2))),5),(10,(8,((6,15),11)))),12,1); tree rep.5250000 = ((12,((10,8),(6,(11,15)))),(((14,4),((13,7),5)),(3,(9,2))),1); tree rep.5260000 = (12,(((8,10),(11,(15,6))),((14,((4,(13,7)),((9,2),3))),5)),1); tree rep.5270000 = (12,((14,(((2,9),3),(((7,13),4),5))),((8,(11,(6,15))),10)),1); tree rep.5280000 = (((((6,15),11),(10,8)),(((14,5),(4,(7,13))),((2,9),3))),12,1); tree rep.5290000 = (((((13,7),(14,4)),(((2,9),3),5)),(((6,15),11),(8,10))),12,1); tree rep.5300000 = ((14,(13,7)),((4,(((2,9),3),5)),(12,((8,((6,11),15)),10))),1); tree rep.5310000 = (12,(((10,8),(6,(15,11))),(5,(((3,2),9),(14,(4,(7,13)))))),1); tree rep.5320000 = (12,((((9,2),3),((4,5),(14,(13,7)))),(8,(10,(11,(15,6))))),1); tree rep.5330000 = ((((((7,13),4),(5,14)),(3,(9,2))),((15,(6,11)),(8,10))),12,1); tree rep.5340000 = ((((((13,7),4),14),(5,(3,(9,2)))),((8,(6,(15,11))),10)),12,1); tree rep.5350000 = ((((4,(13,7)),((5,14),((2,9),3))),((8,(11,(6,15))),10)),12,1); tree rep.5360000 = (((((6,15),11),(10,8)),((3,(2,9)),(((14,(13,7)),4),5))),12,1); tree rep.5370000 = ((((8,10),(11,(15,6))),(((((7,13),4),14),((9,2),3)),5)),12,1); tree rep.5380000 = ((((5,(((7,13),4),14)),(3,(9,2))),(((6,(11,15)),8),10)),12,1); tree rep.5390000 = (((5,((3,(9,2)),((4,(13,7)),14))),(8,(10,((15,11),6)))),12,1); tree rep.5400000 = (12,(((7,13),((14,5),(((2,9),3),4))),((8,10),((15,6),11))),1); tree rep.5410000 = (12,((((2,9),3),((((13,7),4),14),5)),(10,(((11,6),15),8))),1); tree rep.5420000 = (12,((5,(((13,(4,7)),14),(3,(2,9)))),(10,((11,(15,6)),8))),1); tree rep.5430000 = (12,(((3,(((4,(7,13)),(2,9)),14)),5),((10,(6,(15,11))),8)),1); tree rep.5440000 = (((10,(8,(11,(6,15)))),(((5,(3,(9,2))),(4,(13,7))),14)),12,1); tree rep.5450000 = ((((10,(6,(11,15))),8),((14,5),(((2,9),3),((7,4),13)))),12,1); tree rep.5460000 = ((((2,9),3),((((6,(15,11)),(10,8)),5),(((13,7),4),14))),12,1); tree rep.5470000 = (12,(((5,(14,((7,13),4))),(3,(2,9))),(((6,15),11),(10,8))),1); tree rep.5480000 = ((8,(10,(11,(6,15)))),(12,(5,(((2,9),3),(((7,13),4),14)))),1); tree rep.5490000 = (((((6,15),11),(10,8)),(((((7,13),4),14),5),(3,(9,2)))),12,1); tree rep.5500000 = ((5,((14,((9,2),3)),(4,(13,7)))),((8,((6,(11,15)),10)),12),1); tree rep.5510000 = ((12,((((4,(13,7)),14),((9,2),3)),5)),((10,((6,15),11)),8),1); tree rep.5520000 = ((12,((10,(6,(15,11))),8)),(((14,(4,(7,13))),5),(3,(9,2))),1); tree rep.5530000 = (12,(((3,(9,2)),((13,7),(4,(5,14)))),(((6,15),11),(10,8))),1); tree rep.5540000 = (12,((8,(10,(6,(11,15)))),(((4,(7,13)),(3,(9,2))),(5,14))),1); tree rep.5550000 = (((((15,(11,6)),8),10),(5,((14,((7,13),4)),((9,2),3)))),12,1); tree rep.5560000 = (12,(((14,5),(((7,13),4),((9,2),3))),((((6,15),11),8),10)),1); tree rep.5570000 = (((((2,9),3),((5,14),(4,(13,7)))),(((15,6),11),(8,10))),12,1); tree rep.5580000 = (((((4,((13,7),14)),(3,(9,2))),5),((((11,6),15),8),10)),12,1); tree rep.5590000 = (12,(((((5,((8,10),(11,(6,15)))),9),(2,3)),14),((7,13),4)),1); tree rep.5600000 = (12,(((10,8),((15,6),11)),((((3,5),14),(2,9)),((13,7),4))),1); tree rep.5610000 = (12,((((((((8,10),((6,11),15)),14),(13,7)),4),5),(2,9)),3),1); tree rep.5620000 = (12,((8,(10,((11,15),6))),(4,((13,7),((3,(9,2)),(14,5))))),1); tree rep.5630000 = (12,((5,(((2,9),3),((4,(13,7)),14))),((11,(6,15)),(10,8))),1); tree rep.5640000 = (((((3,(9,2)),((14,((7,13),4)),5)),(11,(6,15))),(8,10)),12,1); tree rep.5650000 = (12,(((3,(8,(10,((15,6),11)))),(((4,(7,13)),(2,9)),14)),5),1); tree rep.5660000 = (12,((((2,9),3),((7,(13,4)),(5,14))),((10,(11,(6,15))),8)),1); tree rep.5670000 = (((((11,(6,15)),(10,8)),(5,14)),(((2,9),3),(4,(7,13)))),12,1); tree rep.5680000 = (((((15,11),6),(10,8)),(4,((7,13),((3,(2,9)),(5,14))))),12,1); tree rep.5690000 = (12,((((15,11),6),(8,10)),((5,(14,((7,13),4))),(3,(9,2)))),1); tree rep.5700000 = (((((6,15),11),(10,8)),(5,(((9,2),3),(4,(14,(7,13)))))),12,1); tree rep.5710000 = (12,((8,(10,((11,15),6))),((5,4),(((7,13),14),((2,9),3)))),1); tree rep.5720000 = (((((15,11),6),(8,10)),12),(((2,9),3),((7,13),((5,14),4))),1); tree rep.5730000 = ((((15,(11,6)),(8,10)),(3,((5,((13,7),(4,14))),(2,9)))),12,1); tree rep.5740000 = (12,(((8,10),((15,11),6)),((((2,9),3),5),(14,((7,13),4)))),1); tree rep.5750000 = (12,((((4,((7,13),((2,9),3))),14),5),(((15,11),6),(8,10))),1); tree rep.5760000 = (((((2,9),3),((7,13),((5,14),4))),(8,((11,(15,6)),10))),12,1); tree rep.5770000 = ((((2,9),3),(((5,(13,7)),(4,14)),((((6,15),11),10),8))),12,1); tree rep.5780000 = (((10,8),((15,6),11)),(12,((((4,14),(7,13)),(3,(9,2))),5)),1); tree rep.5790000 = (((((9,2),3),((14,(4,(7,13))),5)),((((6,15),11),10),8)),12,1); tree rep.5800000 = (((3,(2,9)),(12,(((7,13),(4,14)),(((6,(15,11)),8),10)))),5,1); tree rep.5810000 = (12,(((11,(15,6)),(((((7,13),14),4),((3,5),(2,9))),8)),10),1); tree rep.5820000 = ((((3,(9,2)),((10,8),(11,(15,6)))),(5,((4,(7,13)),14))),12,1); tree rep.5830000 = (12,(((3,(9,2)),((4,(14,(13,7))),5)),(((11,(15,6)),8),10)),1); tree rep.5840000 = (12,(((10,(6,(11,15))),8),((4,((13,7),14)),(5,((9,2),3)))),1); tree rep.5850000 = (12,(((11,(6,15)),(8,10)),((4,(7,13)),((14,5),(2,(9,3))))),1); tree rep.5860000 = (12,(((4,((14,5),(7,13))),((9,2),3)),((11,(15,6)),(10,8))),1); tree rep.5870000 = (12,((14,(9,2)),((5,3),(((10,8),((15,6),11)),((7,13),4)))),1); tree rep.5880000 = ((12,((3,(9,2)),((((7,13),14),4),5))),(((11,(6,15)),8),10),1); tree rep.5890000 = (((((11,15),6),8),10),(12,((((13,7),4),14),(5,(3,(9,2))))),1); tree rep.5900000 = (((3,(2,9)),(5,(4,((7,13),14)))),(12,((10,8),((15,6),11))),1); tree rep.5910000 = (12,(((5,((13,7),(14,4))),((2,9),3)),((8,10),((15,11),6))),1); tree rep.5920000 = ((((15,(11,6)),(8,10)),12),((((13,7),14),((3,(2,9)),5)),4),1); tree rep.5930000 = (((3,(2,9)),((4,((7,13),14)),(5,((11,(15,6)),(10,8))))),12,1); tree rep.5940000 = (12,(((13,7),4),((3,(2,9)),(((10,8),((11,15),6)),(5,14)))),1); tree rep.5950000 = (12,(((((6,15),11),8),10),(((4,14),(7,13)),((3,(9,2)),5))),1); tree rep.5960000 = (12,(((5,(14,(4,(13,7)))),((2,9),3)),((10,8),(11,(15,6)))),1); tree rep.5970000 = ((14,((5,((9,2),(((8,((15,6),11)),10),12))),3)),(13,(7,4)),1); tree rep.5980000 = (12,(((((9,2),3),5),(14,((7,13),4))),((((15,11),6),8),10)),1); tree rep.5990000 = ((((8,10),(6,(15,11))),(((14,(9,2)),(5,3)),(4,(13,7)))),12,1); tree rep.6000000 = ((((5,((9,2),3)),(14,(4,(13,7)))),12),((10,8),(11,(15,6))),1); tree rep.6010000 = ((((4,(13,7)),((9,2),3)),(14,5)),((((15,11),6),(8,10)),12),1); tree rep.6020000 = ((10,(8,(6,(15,11)))),((((3,(2,9)),((4,(7,13)),5)),14),12),1); tree rep.6030000 = (12,((((2,9),3),((14,5),(4,(7,13)))),((8,10),(6,(15,11)))),1); tree rep.6040000 = (12,((((15,(6,11)),10),8),((((13,7),4),(3,(2,9))),(5,14))),1); tree rep.6050000 = ((((6,(15,11)),(8,10)),(((13,7),(14,4)),((3,(2,9)),5))),12,1); tree rep.6060000 = ((((8,(11,(15,6))),10),((((2,9),3),(5,14)),(13,(4,7)))),12,1); tree rep.6070000 = (12,((((4,(14,5)),(13,7)),((9,2),3)),((8,10),(11,(6,15)))),1); tree rep.6080000 = (12,(((10,8),(11,(15,6))),(((9,2),3),((14,5),(4,(13,7))))),1); tree rep.6090000 = (12,(((((2,9),3),(14,4)),((13,7),5)),(((11,15),6),(10,8))),1); tree rep.6100000 = ((((((8,(10,(11,(15,6)))),3),(12,(9,2))),(4,(7,13))),14),5,1); tree rep.6110000 = (((8,10),(11,(15,6))),(((((9,2),3),((12,14),4)),(7,13)),5),1); tree rep.6120000 = (((5,((3,(9,2)),(14,(4,(13,7))))),(8,((6,(15,11)),10))),12,1); tree rep.6130000 = (((12,((14,((13,7),4)),5)),((9,2),3)),(((11,15),6),(10,8)),1); tree rep.6140000 = (((8,(10,((15,11),6))),(5,((3,(9,2)),(14,(4,(13,7)))))),12,1); tree rep.6150000 = ((((10,(11,(15,6))),8),((5,(((7,13),4),14)),((2,9),3))),12,1); tree rep.6160000 = (12,(((8,((15,6),11)),10),(((14,5),((2,9),3)),((13,7),4))),1); tree rep.6170000 = (12,(((((2,9),3),(14,(4,(13,7)))),5),((10,8),((11,15),6))),1); tree rep.6180000 = ((((3,(9,2)),((((13,7),4),14),5)),((11,(6,15)),(10,8))),12,1); tree rep.6190000 = ((((((10,8),(11,(6,15))),((2,9),3)),(7,(13,4))),(14,5)),12,1); tree rep.6200000 = (12,(((10,8),((15,6),11)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.6210000 = (((5,(((2,9),3),((7,13),(14,4)))),(10,(8,(15,(6,11))))),12,1); tree rep.6220000 = (((((13,7),4),((5,14),((2,9),3))),(((11,15),6),(10,8))),12,1); tree rep.6230000 = (12,(((5,((3,(2,9)),14)),(8,((6,(15,11)),10))),(4,(13,7))),1); tree rep.6240000 = (12,(((((2,9),3),((14,(7,4)),13)),5),((8,10),((15,11),6))),1); tree rep.6250000 = (((((15,6),11),10),8),((12,(3,(2,9))),(5,((14,(13,7)),4))),1); tree rep.6260000 = (12,(((3,(9,2)),(((4,(7,13)),14),5)),((((15,6),11),8),10)),1); tree rep.6270000 = ((((((6,11),15),8),10),(((4,((9,2),3)),((13,7),14)),5)),12,1); tree rep.6280000 = (((((15,6),11),(8,10)),12),(((3,(9,2)),((4,(13,7)),14)),5),1); tree rep.6290000 = (((((14,4),((9,2),3)),((7,13),5)),12),(10,(8,((15,11),6))),1); tree rep.6300000 = (12,((5,(((4,13),7),14)),((3,(9,2)),((8,10),(11,(15,6))))),1); tree rep.6310000 = (12,((((11,(15,6)),(10,8)),(14,(((13,7),4),((9,2),3)))),5),1); tree rep.6320000 = (12,(((((2,9),3),5),((4,(7,13)),14)),((10,8),(15,(6,11)))),1); tree rep.6330000 = ((10,8),(((5,(3,(9,2))),(12,((4,(13,7)),14))),(6,(11,15))),1); tree rep.6340000 = ((((10,(11,(6,15))),8),((5,((13,7),(4,14))),((2,9),3))),12,1); tree rep.6350000 = (12,((((13,7),(14,((3,(2,9)),4))),5),((8,10),(6,(15,11)))),1); tree rep.6360000 = ((((8,(11,(6,15))),10),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.6370000 = ((((((7,13),4),(3,(9,2))),(14,5)),(((6,(15,11)),8),10)),12,1); tree rep.6380000 = ((8,((6,(15,11)),10)),(((14,((13,7),4)),((3,(9,2)),5)),12),1); tree rep.6390000 = ((((6,(15,11)),(10,8)),(((3,(2,9)),((13,7),4)),(5,14))),12,1); tree rep.6400000 = (((((13,7),4),14),(5,(3,(2,9)))),((((11,(15,6)),10),8),12),1); tree rep.6410000 = (12,((10,(8,((11,6),15))),(((14,(4,(7,13))),5),((2,9),3))),1); tree rep.6420000 = (12,(((5,(4,((7,13),14))),((9,2),3)),((((15,11),6),8),10)),1); tree rep.6430000 = ((((10,((11,15),6)),8),(3,((9,2),((4,(13,7)),(14,5))))),12,1); tree rep.6440000 = (((8,(10,((15,6),11))),(5,(3,(14,(((13,7),4),(9,2)))))),12,1); tree rep.6450000 = (12,(((14,4),(((7,13),5),((9,2),3))),(((6,15),11),(8,10))),1); tree rep.6460000 = ((((((13,7),4),((3,(2,9)),5)),14),(10,(8,((6,15),11)))),12,1); tree rep.6470000 = (12,(((6,(15,11)),(10,8)),(((13,7),(4,(14,5))),((2,9),3))),1); tree rep.6480000 = ((((3,(2,9)),((14,5),(4,(7,13)))),((6,(11,15)),(10,8))),12,1); tree rep.6490000 = ((((3,(2,9)),(((4,14),(13,7)),5)),((10,8),(11,(15,6)))),12,1); tree rep.6500000 = (((8,10),((15,6),11)),(5,((14,((13,7),4)),(12,(3,(9,2))))),1); tree rep.6510000 = (((8,((6,(11,15)),10)),(((9,2),3),((14,5),((7,13),4)))),12,1); tree rep.6520000 = ((((((9,2),3),5),((14,4),(13,7))),((8,((11,15),6)),10)),12,1); tree rep.6530000 = (12,((((3,(9,2)),(14,(4,(13,7)))),5),(8,(10,((6,15),11)))),1); tree rep.6540000 = (12,((5,(((13,7),(14,4)),(3,(9,2)))),(((11,(15,6)),8),10)),1); tree rep.6550000 = ((8,(10,((15,6),11))),(12,(5,((((7,13),14),4),((9,2),3)))),1); tree rep.6560000 = (12,(((6,(11,15)),(8,10)),(((13,7),(14,4)),(5,((9,2),3)))),1); tree rep.6570000 = (((((6,15),11),(10,8)),12),((14,5),((4,(7,13)),(3,(9,2)))),1); tree rep.6580000 = ((((8,10),((15,11),6)),12),((14,4),((7,13),(5,(3,(9,2))))),1); tree rep.6590000 = (12,(((5,(3,(9,2))),(14,((7,13),4))),((8,10),((11,15),6))),1); tree rep.6600000 = (12,((((6,(11,15)),10),8),(((13,7),(4,(5,14))),((9,2),3))),1); tree rep.6610000 = (12,((((11,15),6),(8,10)),(5,((14,(4,(13,7))),((9,2),3)))),1); tree rep.6620000 = (((((((2,9),3),14),(4,(13,7))),5),((8,10),(6,(15,11)))),12,1); tree rep.6630000 = ((12,((10,8),(11,(6,15)))),(((14,(9,2)),((4,(13,7)),5)),3),1); tree rep.6640000 = ((12,((8,(6,(11,15))),10)),(5,((14,(4,(13,7))),((9,2),3))),1); tree rep.6650000 = ((((8,10),(6,(11,15))),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.6660000 = ((((6,(15,11)),(10,8)),(((5,(4,(7,13))),14),(3,(2,9)))),12,1); tree rep.6670000 = ((((12,((8,((15,11),6)),10)),5),((9,2),3)),(4,((7,13),14)),1); tree rep.6680000 = (12,((((15,6),11),(10,8)),(((4,(14,(7,13))),((9,2),3)),5)),1); tree rep.6690000 = ((((6,(11,15)),(8,10)),((3,(9,2)),((((13,7),14),4),5))),12,1); tree rep.6700000 = (12,(((11,(6,15)),(8,10)),((((2,9),3),5),(4,(14,(7,13))))),1); tree rep.6710000 = (12,((10,((15,11),6)),(8,((((13,7),4),(3,(9,2))),(14,5)))),1); tree rep.6720000 = ((14,((((9,2),3),5),((13,7),4))),((((15,6),11),(8,10)),12),1); tree rep.6730000 = ((((10,8),((11,15),6)),((((2,9),3),((14,4),5)),(7,13))),12,1); tree rep.6740000 = (((((13,7),(14,4)),(3,(9,2))),5),(12,((8,10),(11,(15,6)))),1); tree rep.6750000 = ((((14,((9,2),3)),((4,(7,13)),5)),(8,(((6,15),11),10))),12,1); tree rep.6760000 = (12,(((((9,2),(14,5)),((7,13),4)),3),(10,(((15,6),11),8))),1); tree rep.6770000 = (((((((11,15),6),(8,10)),5),(3,(9,2))),(14,((7,13),4))),12,1); tree rep.6780000 = (((10,8),(11,(6,15))),((5,(((2,9),3),(4,(14,(13,7))))),12),1); tree rep.6790000 = (((((3,(2,9)),(((13,7),14),4)),5),((10,(11,(6,15))),8)),12,1); tree rep.6800000 = ((((8,10),(11,(15,6))),((((2,9),3),((13,7),5)),(4,14))),12,1); tree rep.6810000 = (12,(((8,(11,(15,6))),10),((((14,(9,2)),((7,13),4)),5),3)),1); tree rep.6820000 = ((8,(((15,6),11),10)),(12,((13,7),(((5,(3,(9,2))),14),4))),1); tree rep.6830000 = (12,(((((11,15),6),8),10),((14,5),(((7,13),((2,9),4)),3))),1); tree rep.6840000 = ((((8,(11,(15,6))),10),((5,(((2,9),3),(4,14))),(7,13))),12,1); tree rep.6850000 = (((((10,8),(6,(11,15))),4),(((7,13),(((2,9),3),12)),14)),5,1); tree rep.6860000 = (12,(((((4,((7,13),14)),3),(9,2)),5),(((15,(11,6)),8),10)),1); tree rep.6870000 = (12,(((6,(15,11)),((9,2),((14,(((13,7),4),3)),5))),(10,8)),1); tree rep.6880000 = (12,((((6,15),11),(8,10)),((3,(9,2)),(5,(14,(4,(13,7)))))),1); tree rep.6890000 = (((((6,(15,11)),8),10),((((7,13),14),5),(4,((2,3),9)))),12,1); tree rep.6900000 = ((((8,10),(15,(11,6))),(3,((4,((9,2),((7,13),14))),5))),12,1); tree rep.6910000 = (12,(((8,(11,(6,15))),10),((3,(9,2)),(((13,7),(4,14)),5))),1); tree rep.6920000 = ((((((6,15),11),10),8),(((2,9),(((5,(13,7)),4),3)),14)),12,1); tree rep.6930000 = ((5,(((8,10),(11,(6,15))),((((13,7),4),14),(3,(2,9))))),12,1); tree rep.6940000 = (12,((5,((14,(4,(7,13))),(3,(2,9)))),((6,(11,15)),(10,8))),1); tree rep.6950000 = (12,((((2,9),3),(14,((4,(7,13)),5))),(8,(((15,6),11),10))),1); tree rep.6960000 = ((((8,10),(6,(15,11))),(((5,14),(3,(9,2))),((7,13),4))),12,1); tree rep.6970000 = (((((11,(6,15)),8),10),(((9,2),3),((4,(13,7)),(5,14)))),12,1); tree rep.6980000 = (12,(((14,((2,9),(3,5))),((7,13),4)),((8,10),(15,(11,6)))),1); tree rep.6990000 = (12,((8,((6,(11,15)),10)),((5,14),(((4,13),7),((9,2),3)))),1); tree rep.7000000 = ((((8,10),((3,(2,9)),(5,((7,13),(4,14))))),(6,(11,15))),12,1); tree rep.7010000 = ((8,(((3,((((4,7),13),14),(5,(2,9)))),(6,(11,15))),10)),12,1); tree rep.7020000 = ((((14,5),((13,7),4)),((8,(10,(11,(15,6)))),((9,2),3))),12,1); tree rep.7030000 = (12,(((4,((3,(2,9)),(5,14))),(7,13)),(10,(((11,15),6),8))),1); tree rep.7040000 = (((((13,7),(((11,(6,15)),(8,10)),(5,((2,9),3)))),4),14),12,1); tree rep.7050000 = ((((8,10),((15,11),6)),(((3,5),(13,7)),((14,4),(2,9)))),12,1); tree rep.7060000 = (12,((((4,(7,13)),(5,14)),((9,2),3)),((11,(15,6)),(8,10))),1); tree rep.7070000 = (12,(((10,((15,6),11)),8),((((7,13),4),14),(5,(3,(2,9))))),1); tree rep.7080000 = (12,(((8,10),((11,15),6)),(5,(((2,9),3),((4,(13,7)),14)))),1); tree rep.7090000 = ((((6,(15,11)),(10,8)),(5,(((9,2),3),((13,7),(14,4))))),12,1); tree rep.7100000 = (((5,(((9,2),3),(14,((13,7),4)))),(8,(((15,6),11),10))),12,1); tree rep.7110000 = (12,((((6,15),11),(8,10)),((4,((14,5),((2,9),3))),(7,13))),1); tree rep.7120000 = ((5,(((9,2),3),(4,(14,(7,13))))),((((15,11),6),(10,8)),12),1); tree rep.7130000 = ((((11,15),6),(8,10)),((4,(14,(7,13))),((3,(2,9)),(12,5))),1); tree rep.7140000 = (((((4,((7,13),9)),(14,5)),(3,2)),(((15,11),6),(10,8))),12,1); tree rep.7150000 = (((((6,(11,15)),10),8),12),(4,(((9,2),3),((7,13),(14,5)))),1); tree rep.7160000 = (12,((((11,15),6),(8,10)),(((3,(9,2)),(((13,7),4),14)),5)),1); tree rep.7170000 = (((10,((((4,(13,7)),14),(((2,9),3),5)),(6,(15,11)))),8),12,1); tree rep.7180000 = ((14,((13,7),(((10,8),((15,11),6)),((3,(9,2)),(5,4))))),12,1); tree rep.7190000 = (((6,(15,11)),12),(((3,(2,9)),((4,14),5)),((7,13),(10,8))),1); tree rep.7200000 = (((((13,7),5),14),(((10,8),((11,15),6)),(4,((9,2),3)))),12,1); tree rep.7210000 = ((12,((((4,14),(7,13)),5),(3,(2,9)))),((10,8),(11,(6,15))),1); tree rep.7220000 = ((((10,((15,11),6)),8),(((5,((13,7),4)),14),((9,2),3))),12,1); tree rep.7230000 = ((8,(((15,11),6),10)),(12,((((9,2),3),(14,((7,13),4))),5)),1); tree rep.7240000 = ((12,((5,4),((14,(7,13)),((9,2),3)))),(10,((11,(15,6)),8)),1); tree rep.7250000 = ((((3,(9,2)),(((13,7),4),(5,14))),(8,(10,(11,(15,6))))),12,1); tree rep.7260000 = (((((9,2),3),14),(5,((4,7),13))),(12,((8,10),(6,(11,15)))),1); tree rep.7270000 = (((((6,15),11),(10,8)),(14,((13,7),((4,(3,(2,9))),5)))),12,1); tree rep.7280000 = (((10,8),(11,(15,6))),(12,(((14,(7,13)),(4,((9,2),3))),5)),1); tree rep.7290000 = ((((((11,15),6),10),8),((((13,7),(3,(9,2))),4),(14,5))),12,1); tree rep.7300000 = (12,((14,((3,(2,9)),(5,(4,(13,7))))),((((6,15),11),10),8)),1); tree rep.7310000 = (12,(((14,5),(((3,(2,9)),(7,4)),13)),((((6,15),11),10),8)),1); tree rep.7320000 = ((((3,(2,9)),(((7,13),4),(5,14))),((15,(6,11)),(8,10))),12,1); tree rep.7330000 = (((5,((2,9),3)),(((13,7),14),4)),((((11,(15,6)),10),8),12),1); tree rep.7340000 = (12,(4,(((14,(13,7)),(5,((15,(6,11)),(8,10)))),((3,9),2))),1); tree rep.7350000 = (12,(((9,2),3),((5,(((15,6),11),(10,8))),((4,(7,13)),14))),1); tree rep.7360000 = (12,((3,(9,2)),(5,(((4,(13,7)),14),((10,8),(11,(6,15)))))),1); tree rep.7370000 = (12,((((7,13),((9,2),3)),(5,(14,4))),((((6,15),11),8),10)),1); tree rep.7380000 = (12,((((4,((7,13),14)),5),((2,9),3)),(((15,11),6),(8,10))),1); tree rep.7390000 = ((((10,8),((15,6),11)),(14,((4,(13,7)),(5,(3,(9,2)))))),12,1); tree rep.7400000 = (12,(((14,(4,(7,13))),(5,(3,(9,2)))),((8,10),((6,15),11))),1); tree rep.7410000 = (12,((3,(((4,(5,14)),(13,7)),(9,2))),(8,((11,(15,6)),10))),1); tree rep.7420000 = (((((11,6),15),(8,10)),(((2,9),3),((13,7),(5,(14,4))))),12,1); tree rep.7430000 = ((5,(((7,13),(14,4)),((9,2),3))),(12,(8,(10,(11,(15,6))))),1); tree rep.7440000 = ((((5,14),(3,(2,9))),(((((11,15),6),10),8),12)),((4,7),13),1); tree rep.7450000 = (12,(((5,(((7,13),4),14)),((9,2),3)),(((6,15),11),(10,8))),1); tree rep.7460000 = ((((5,((3,(9,2)),(4,(13,7)))),14),(8,(10,(6,(15,11))))),12,1); tree rep.7470000 = ((10,8),(((((4,(13,7)),((12,3),(2,9))),(6,(15,11))),14),5),1); tree rep.7480000 = ((((3,(2,9)),(((4,14),(13,7)),5)),(10,(((15,11),6),8))),12,1); tree rep.7490000 = (12,(5,((((7,13),14),4),(((6,(15,11)),(10,8)),(3,(9,2))))),1); tree rep.7500000 = (((5,(((2,9),3),((14,4),(13,7)))),(((6,(11,15)),10),8)),12,1); tree rep.7510000 = (((((6,(11,15)),8),10),12),(((2,9),3),(((4,(7,13)),5),14)),1); tree rep.7520000 = (12,(((3,(9,2)),(5,(14,((7,13),4)))),((11,(6,15)),(8,10))),1); tree rep.7530000 = (((((6,15),11),(10,8)),((3,(9,2)),(((14,4),(13,7)),5))),12,1); tree rep.7540000 = ((((4,5),(14,(7,13))),((12,3),(2,9))),((8,(11,(15,6))),10),1); tree rep.7550000 = (12,((8,(10,(15,(11,6)))),(5,((((9,2),3),14),(4,(13,7))))),1); tree rep.7560000 = ((((((6,15),11),8),10),(5,(((4,14),(7,13)),(3,(2,9))))),12,1); tree rep.7570000 = (12,(((5,(3,(9,2))),(4,(14,(7,13)))),((11,(6,15)),(10,8))),1); tree rep.7580000 = ((((((11,15),6),8),10),(((7,13),((5,(3,(9,2))),14)),4)),12,1); tree rep.7590000 = ((((6,11),15),(10,8)),(((3,(((14,4),(13,7)),12)),(2,9)),5),1); tree rep.7600000 = (12,((8,(((5,((4,(13,14)),7)),(3,(2,9))),(11,(6,15)))),10),1); tree rep.7610000 = ((5,((3,(9,2)),((4,(14,(7,13))),(((11,(15,6)),10),8)))),12,1); tree rep.7620000 = (12,((10,(((15,6),11),8)),((5,((14,(13,7)),4)),(3,(9,2)))),1); tree rep.7630000 = ((((6,(15,11)),8),10),(12,(((2,9),3),((4,(13,7)),(5,14)))),1); tree rep.7640000 = ((14,((5,(4,(7,13))),(3,(2,9)))),(((8,10),((11,15),6)),12),1); tree rep.7650000 = ((((2,9),((5,3),(14,((7,13),4)))),((8,10),(6,(11,15)))),12,1); tree rep.7660000 = (((((5,3),(4,((7,13),14))),(2,9)),((8,10),(6,(11,15)))),12,1); tree rep.7670000 = (12,((((7,4),13),((((2,9),3),14),5)),((10,(11,(15,6))),8)),1); tree rep.7680000 = (12,((10,((6,(11,15)),8)),(14,((((7,13),4),((2,9),3)),5))),1); tree rep.7690000 = (((((6,(11,15)),10),8),((4,((((9,2),3),5),14)),(7,13))),12,1); tree rep.7700000 = (((((2,9),3),(((10,8),(15,(6,11))),(7,13))),(4,(14,5))),12,1); tree rep.7710000 = (((((15,6),11),(10,8)),((3,(2,9)),(5,(14,(4,(7,13)))))),12,1); tree rep.7720000 = (12,(((7,13),(4,(14,(((9,2),3),5)))),((8,(11,(15,6))),10)),1); tree rep.7730000 = ((((5,(6,(11,15))),(((14,4),(13,7)),((9,2),3))),(8,10)),12,1); tree rep.7740000 = (12,((8,(10,(6,(11,15)))),((4,((5,14),(3,(2,9)))),(13,7))),1); tree rep.7750000 = ((((10,8),(6,(15,11))),((((3,(2,9)),5),14),(4,(13,7)))),12,1); tree rep.7760000 = (12,((((14,(7,13)),((3,(9,2)),5)),4),(((6,(11,15)),8),10)),1); tree rep.7770000 = (5,(4,(((12,((11,(15,6)),(8,10))),(13,7)),(14,((9,2),3)))),1); tree rep.7780000 = (((((9,2),(((11,(15,6)),(10,8)),3)),(14,5)),((7,13),4)),12,1); tree rep.7790000 = (12,(((4,(13,7)),(5,(14,(3,(9,2))))),((((15,6),11),10),8)),1); tree rep.7800000 = (((8,10),(((5,14),(((9,2),3),(13,(4,7)))),(6,(15,11)))),12,1); tree rep.7810000 = (((((6,15),11),8),10),(12,(((9,2),3),(((14,(7,13)),4),5))),1); tree rep.7820000 = ((((9,2),3),(((7,13),(4,14)),((((6,(11,15)),8),10),5))),12,1); tree rep.7830000 = ((8,(((((5,((2,9),3)),14),((4,7),13)),((11,15),6)),10)),12,1); tree rep.7840000 = (12,((((4,(13,7)),14),(((2,9),3),5)),((8,((15,11),6)),10)),1); tree rep.7850000 = (12,((5,(((7,13),4),(14,(3,(2,9))))),(((11,(15,6)),10),8)),1); tree rep.7860000 = ((12,(3,((2,9),(14,((13,7),(5,4)))))),((10,(11,(6,15))),8),1); tree rep.7870000 = (((10,(((6,15),11),8)),(((9,2),3),(5,((14,4),(7,13))))),12,1); tree rep.7880000 = (12,(((9,2),3),((((((15,11),6),8),10),((5,14),(7,13))),4)),1); tree rep.7890000 = (((5,((((13,7),14),4),((9,2),3))),12),(10,(8,(6,(15,11)))),1); tree rep.7900000 = ((((12,(14,5)),((9,2),3)),((13,7),4)),((8,10),(11,(15,6))),1); tree rep.7910000 = (((3,((9,2),((14,5),(4,(7,13))))),(((6,(11,15)),10),8)),12,1); tree rep.7920000 = ((12,((10,8),(11,(15,6)))),((5,(14,((13,7),(3,(9,2))))),4),1); tree rep.7930000 = ((((6,(11,15)),(10,8)),(((9,2),3),(5,((7,4),(14,13))))),12,1); tree rep.7940000 = (12,(((15,(11,6)),(8,10)),((14,((3,((13,7),4)),5)),(2,9))),1); tree rep.7950000 = (12,(((4,(13,7)),5),((((8,10),((15,6),11)),((2,9),3)),14)),1); tree rep.7960000 = ((((((14,4),(7,13)),(3,(2,9))),5),((10,8),((15,11),6))),12,1); tree rep.7970000 = (((3,(2,9)),((5,(10,(((6,15),11),8))),(14,(4,(7,13))))),12,1); tree rep.7980000 = (12,((((6,(15,11)),8),10),((((3,2),9),5),((13,(7,4)),14))),1); tree rep.7990000 = ((((((7,13),14),4),5),(3,(2,9))),(12,((10,8),((11,15),6))),1); tree rep.8000000 = (((((11,15),6),(8,10)),((3,(2,9)),(5,((7,13),(14,4))))),12,1); tree rep.8010000 = (12,(((4,(9,(3,2))),((((10,8),((11,15),6)),14),5)),(13,7)),1); tree rep.8020000 = (((3,(((2,9),5),14)),((13,7),4)),(12,(((15,11),6),(8,10))),1); tree rep.8030000 = (12,(((3,(2,9)),((14,((7,13),4)),5)),((10,8),((6,15),11))),1); tree rep.8040000 = ((((10,8),((11,15),6)),(((2,9),3),(14,(4,(5,(7,13)))))),12,1); tree rep.8050000 = ((((10,8),((6,11),15)),(((5,14),((7,13),4)),(3,(2,9)))),12,1); tree rep.8060000 = (12,(((8,10),((15,6),11)),(5,(((7,13),(4,14)),((9,2),3)))),1); tree rep.8070000 = ((((4,(7,13)),((14,5),(3,(2,9)))),(10,(8,((11,15),6)))),12,1); tree rep.8080000 = (((8,(10,((6,15),11))),(((3,(9,2)),5),(14,((7,13),4)))),12,1); tree rep.8090000 = ((((((7,13),4),(5,14)),(3,(9,2))),(10,(8,(11,(15,6))))),12,1); tree rep.8100000 = (((14,((4,(13,7)),(5,((2,9),3)))),((((6,11),15),8),10)),12,1); tree rep.8110000 = (((((6,15),11),(10,8)),(((14,(4,(13,7))),((2,9),3)),5)),12,1); tree rep.8120000 = (((5,(((9,2),3),(14,((7,13),4)))),(8,((15,(6,11)),10))),12,1); tree rep.8130000 = ((((8,10),((6,15),11)),(((13,7),4),((5,(3,(9,2))),14))),12,1); tree rep.8140000 = (12,(((8,((6,15),11)),10),((4,(13,(14,7))),((3,(9,2)),5))),1); tree rep.8150000 = (((5,((((7,13),4),(3,(2,9))),14)),((((11,15),6),10),8)),12,1); tree rep.8160000 = (12,((((((7,13),5),4),((9,2),3)),14),(8,(10,(6,(15,11))))),1); tree rep.8170000 = (((((9,2),3),(((13,7),4),14)),((((11,6),15),(8,10)),5)),12,1); tree rep.8180000 = (12,(((((6,15),11),8),10),(((3,(5,(2,9))),(4,14)),(13,7))),1); tree rep.8190000 = (12,(((8,(6,(15,11))),10),((5,(3,(2,9))),((4,(13,7)),14))),1); tree rep.8200000 = (12,((5,((3,(9,2)),((4,(13,7)),14))),(((15,11),6),(10,8))),1); tree rep.8210000 = (((2,9),(5,(((((6,15),11),(8,10)),(((13,4),7),14)),3))),12,1); tree rep.8220000 = ((((3,(2,9)),((((7,13),14),4),5)),12),((8,10),(6,(11,15))),1); tree rep.8230000 = (((((3,(2,9)),(14,((7,13),4))),5),(8,((11,(15,6)),10))),12,1); tree rep.8240000 = (((((11,(6,15)),10),8),(((3,(2,9)),12),5)),(((7,13),4),14),1); tree rep.8250000 = ((((((13,7),14),4),(5,(3,(2,9)))),((((6,15),11),8),10)),12,1); tree rep.8260000 = (12,(((11,(6,15)),(10,8)),((((13,7),(4,14)),5),((2,9),3))),1); tree rep.8270000 = (((((4,14),(13,7)),(((2,9),3),5)),((8,(6,(11,15))),10)),12,1); tree rep.8280000 = (12,(((((6,(11,15)),10),8),(((13,7),(14,4)),(3,(2,9)))),5),1); tree rep.8290000 = (((10,(8,((11,15),6))),((2,(9,3)),(5,(((7,13),4),14)))),12,1); tree rep.8300000 = ((((8,10),((11,15),6)),(5,((((13,7),4),(3,(9,2))),14))),12,1); tree rep.8310000 = (12,(((5,14),(((13,7),4),(3,(2,9)))),((10,8),(6,(11,15)))),1); tree rep.8320000 = (12,((10,(8,(11,(15,6)))),(((3,(2,9)),((13,7),4)),(14,5))),1); tree rep.8330000 = ((14,((8,(10,(6,(11,15)))),(((13,7),4),((3,(9,2)),5)))),12,1); tree rep.8340000 = ((((((2,9),3),(((7,13),4),14)),5),(8,(10,(11,(15,6))))),12,1); tree rep.8350000 = (12,((10,((6,(15,11)),8)),(14,((4,(((2,9),3),5)),(7,13)))),1); tree rep.8360000 = (12,((8,(10,((11,15),6))),(((3,(9,2)),(14,(13,(4,7)))),5)),1); tree rep.8370000 = (12,((10,(((6,15),11),8)),((4,(14,(13,7))),(5,((9,2),3)))),1); tree rep.8380000 = ((((9,2),3),((4,(13,7)),(5,14))),(12,((((6,11),15),10),8)),1); tree rep.8390000 = (12,(((((14,5),4),(7,13)),((9,2),3)),(((11,15),6),(8,10))),1); tree rep.8400000 = (12,((8,((11,(6,15)),10)),((((14,(7,13)),4),5),((2,9),3))),1); tree rep.8410000 = (((((11,15),6),(8,10)),(((((7,13),14),4),5),(3,(9,2)))),12,1); tree rep.8420000 = (12,(((10,8),(11,(15,6))),(((13,(7,4)),14),((3,(9,2)),5))),1); tree rep.8430000 = (12,((((7,13),4),((5,((2,9),3)),14)),(((11,(6,15)),8),10)),1); tree rep.8440000 = (5,((14,((7,13),4)),((12,(3,(9,2))),(((11,15),6),(10,8)))),1); tree rep.8450000 = ((4,(((7,13),((12,14),5)),((2,9),3))),((((15,11),6),10),8),1); tree rep.8460000 = (((3,(2,9)),((4,(13,7)),((5,14),((8,10),((15,11),6))))),12,1); tree rep.8470000 = (12,(((5,((9,2),3)),(14,(7,(13,4)))),((6,(11,15)),(8,10))),1); tree rep.8480000 = (12,(((((15,6),11),10),8),((3,((14,(13,7)),4)),(5,(2,9)))),1); tree rep.8490000 = ((((5,4),(((3,(2,9)),(((6,15),11),(8,10))),(13,7))),14),12,1); tree rep.8500000 = (12,(((10,8),(6,(15,11))),((5,(3,((4,14),(7,13)))),(9,2))),1); tree rep.8510000 = (((14,((((6,(11,15)),(10,8)),((2,9),3)),5)),(4,(7,13))),12,1); tree rep.8520000 = ((((4,((13,7),14)),((3,(9,2)),5)),(((6,(15,11)),8),10)),12,1); tree rep.8530000 = (12,(((5,(((7,13),4),14)),((2,3),9)),((8,10),((11,15),6))),1); tree rep.8540000 = (12,(((8,10),(11,(15,6))),((5,(((13,7),4),14)),(3,(2,9)))),1); tree rep.8550000 = ((((6,(15,11)),(10,8)),(((13,7),4),(12,((9,2),3)))),(14,5),1); tree rep.8560000 = ((((10,8),((15,11),6)),((((9,2),3),5),((13,7),(4,14)))),12,1); tree rep.8570000 = (12,(((10,((11,15),6)),8),(5,((3,(9,2)),(14,(4,(7,13)))))),1); tree rep.8580000 = (((((15,6),11),10),8),(12,(((4,(13,7)),14),(5,((9,2),3)))),1); tree rep.8590000 = ((((3,((13,7),(2,9))),(14,(5,4))),((((6,15),11),10),8)),12,1); tree rep.8600000 = (((5,((2,9),3)),(4,((8,10),((6,15),11)))),(((7,13),14),12),1); tree rep.8610000 = (((((7,13),4),(5,(((2,9),3),14))),((10,(6,(11,15))),8)),12,1); tree rep.8620000 = (((10,(11,(15,6))),8),((5,((14,(4,(13,7))),(3,(2,9)))),12),1); tree rep.8630000 = ((((((15,11),6),8),10),(((5,(3,(2,9))),14),((4,7),13))),12,1); tree rep.8640000 = ((((5,((8,10),(6,(15,11)))),(((7,13),4),14)),((2,9),3)),12,1); tree rep.8650000 = (12,(((((9,2),3),(4,(5,(13,7)))),14),((10,8),((11,15),6))),1); tree rep.8660000 = (((12,5),(9,2)),(((3,((8,((11,15),6)),10)),(14,4)),(13,7)),1); tree rep.8670000 = (12,(((8,10),((15,6),11)),(((14,4),(7,13)),(5,(3,(9,2))))),1); tree rep.8680000 = ((((14,((13,7),4)),(5,(3,(2,9)))),((6,(11,15)),(10,8))),12,1); tree rep.8690000 = (((((3,(9,2)),(4,((13,7),14))),5),((10,8),((15,6),11))),12,1); tree rep.8700000 = (12,((10,((11,(6,15)),8)),(5,(((7,13),(14,4)),(3,(9,2))))),1); tree rep.8710000 = (12,((10,8),((((9,2),3),((14,((13,7),4)),5)),(11,(6,15)))),1); tree rep.8720000 = (12,(((3,(9,2)),(14,5)),(((7,13),4),((10,(11,(6,15))),8))),1); tree rep.8730000 = (12,(5,(((4,14),((7,13),((9,2),3))),(((6,15),11),(8,10)))),1); tree rep.8740000 = (((((((13,7),4),14),(3,(9,2))),5),((6,(11,15)),(8,10))),12,1); tree rep.8750000 = (((10,(8,(11,(15,6)))),((((13,7),4),((2,9),3)),(5,14))),12,1); tree rep.8760000 = ((((((2,9),3),((7,13),(4,14))),5),((10,((6,15),11)),8)),12,1); tree rep.8770000 = (((((11,(6,15)),(10,8)),((((7,13),4),((2,9),3)),14)),5),12,1); tree rep.8780000 = (12,(((5,((14,((7,13),4)),((10,8),((15,11),6)))),3),(2,9)),1); tree rep.8790000 = (12,(((10,8),((15,6),11)),(((5,14),(3,(9,2))),((7,13),4))),1); tree rep.8800000 = (12,((((5,14),(4,(13,7))),(3,(9,2))),((8,10),(11,(6,15)))),1); tree rep.8810000 = (((((15,6),11),(8,10)),((((4,(13,7)),14),5),((2,9),3))),12,1); tree rep.8820000 = (12,((3,(2,9)),(((14,5),((6,(15,11)),(10,8))),((7,13),4))),1); tree rep.8830000 = (12,(((3,(2,9)),(((14,5),4),(13,7))),((10,((6,15),11)),8)),1); tree rep.8840000 = ((12,((((3,(2,9)),4),5),(14,(7,13)))),((((11,15),6),8),10),1); tree rep.8850000 = (12,((3,(9,2)),(((((15,11),6),8),10),(5,(14,(13,(4,7)))))),1); tree rep.8860000 = (12,((3,(5,((9,2),((13,7),(14,4))))),(8,(((6,15),11),10))),1); tree rep.8870000 = (12,((((2,9),3),((14,5),((10,(6,(11,15))),8))),(4,(7,13))),1); tree rep.8880000 = (12,((((9,2),3),((14,4),(13,7))),(5,((8,10),((6,15),11)))),1); tree rep.8890000 = (12,(((((13,7),4),5),14),(((9,2),3),(((15,6),11),(8,10)))),1); tree rep.8900000 = ((((6,(11,15)),(8,10)),(((3,(2,9)),(13,(7,(4,14)))),5)),12,1); tree rep.8910000 = ((5,(((8,10),(6,(11,15))),(((7,13),(14,4)),((2,9),3)))),12,1); tree rep.8920000 = (12,(((((7,13),4),(14,5)),((9,2),3)),(((11,(6,15)),10),8)),1); tree rep.8930000 = (12,(((8,((15,6),11)),10),(((14,(4,5)),(13,7)),(3,(2,9)))),1); tree rep.8940000 = (12,(((3,(2,9)),((13,7),(14,(4,5)))),(((6,(15,11)),10),8)),1); tree rep.8950000 = (12,(((3,(2,9)),((5,4),(14,(13,7)))),(((11,15),6),(10,8))),1); tree rep.8960000 = ((12,((10,(11,(15,6))),8)),((3,(2,9)),(5,(14,((7,13),4)))),1); tree rep.8970000 = (12,(((3,(2,9)),((14,((7,13),5)),4)),(10,(8,((15,6),11)))),1); tree rep.8980000 = (12,((((14,5),(13,(4,7))),((2,9),3)),((((15,6),11),8),10)),1); tree rep.8990000 = ((((11,(6,15)),(8,10)),12),((((((9,2),3),5),14),4),(13,7)),1); tree rep.9000000 = ((((3,(9,2)),((((13,7),4),14),5)),((10,8),((15,11),6))),12,1); tree rep.9010000 = ((((8,(11,(6,15))),10),(((3,(9,2)),14),(((13,7),4),5))),12,1); tree rep.9020000 = ((((3,(5,(9,2))),14),(4,(7,13))),(12,((8,10),(6,(11,15)))),1); tree rep.9030000 = ((((13,7),(4,14)),(5,(3,(9,2)))),(((10,((6,15),11)),8),12),1); tree rep.9040000 = ((((7,13),4),(((2,9),3),(14,5))),((10,(8,((11,15),6))),12),1); tree rep.9050000 = ((((((9,2),3),4),((10,(8,((6,15),11))),(14,(13,7)))),5),12,1); tree rep.9060000 = (12,((((6,15),11),(10,8)),(((9,2),3),(((14,(7,13)),4),5))),1); tree rep.9070000 = (((10,8),((((14,4),(7,13)),5),((11,(15,6)),((2,9),3)))),12,1); tree rep.9080000 = (12,((((13,7),(14,4)),((8,10),(11,(15,6)))),((2,9),(5,3))),1); tree rep.9090000 = (((((2,9),3),((((7,13),14),4),(((15,6),11),(8,10)))),5),12,1); tree rep.9100000 = ((((((2,9),3),(4,(7,13))),(5,14)),(((15,11),6),(10,8))),12,1); tree rep.9110000 = (12,(((3,(9,2)),(((13,7),4),(14,5))),(8,(10,((11,15),6)))),1); tree rep.9120000 = (12,(14,((2,9),(((7,13),(5,((((15,6),11),(8,10)),4))),3))),1); tree rep.9130000 = ((((14,(7,13)),(4,((3,(9,2)),5))),((((6,15),11),10),8)),12,1); tree rep.9140000 = (((((((6,15),11),(8,10)),(14,(4,(13,7)))),(9,(2,3))),5),12,1); tree rep.9150000 = (((8,((11,(15,6)),10)),(((3,(2,9)),((7,13),(14,4))),5)),12,1); tree rep.9160000 = ((12,((10,(11,(15,6))),8)),(((((7,13),4),14),(3,(2,9))),5),1); tree rep.9170000 = (((((6,(15,11)),10),8),((((4,(7,13)),14),((2,9),3)),5)),12,1); tree rep.9180000 = ((((9,2),3),((((11,15),6),(8,10)),((13,7),(4,(5,14))))),12,1); tree rep.9190000 = ((((11,6),15),(10,8)),(12,(5,(((2,9),3),(14,((7,13),4))))),1); tree rep.9200000 = (((((2,9),3),((6,(15,11)),(10,8))),((14,4),((7,13),5))),12,1); tree rep.9210000 = ((10,(8,((15,11),6))),((5,(((7,13),(14,4)),((2,9),3))),12),1); tree rep.9220000 = (((10,(8,((((13,7),(((9,2),3),4)),14),5))),((6,15),11)),12,1); tree rep.9230000 = (((((((7,13),(14,4)),(((2,9),3),5)),12),8),10),((15,6),11),1); tree rep.9240000 = (12,((10,(8,(15,(6,11)))),((5,((13,7),(14,4))),((9,2),3))),1); tree rep.9250000 = (((((4,(13,7)),5),(((9,2),3),14)),((6,(15,11)),(8,10))),12,1); tree rep.9260000 = (((((15,6),11),(8,10)),(((7,13),14),(4,(5,(3,(2,9)))))),12,1); tree rep.9270000 = ((14,(5,((4,(13,7)),((((11,(15,6)),8),10),((9,2),3))))),12,1); tree rep.9280000 = (((((3,(2,9)),((4,14),(7,13))),5),(8,(10,((11,15),6)))),12,1); tree rep.9290000 = (12,(((11,(6,15)),(8,10)),(((2,9),3),(4,((13,(5,14)),7)))),1); tree rep.9300000 = (((8,10),(11,(6,15))),(12,(((3,(2,9)),5),((14,(13,7)),4))),1); tree rep.9310000 = ((((15,6),11),((((13,7),4),14),((2,9),(3,(12,5))))),(10,8),1); tree rep.9320000 = (12,(((8,10),(6,(15,11))),((13,(((14,((9,2),3)),7),5)),4)),1); tree rep.9330000 = (12,(((5,14),((3,(2,9)),(((15,11),6),(10,8)))),(4,(7,13))),1); tree rep.9340000 = (12,(((((2,9),3),5),((14,(13,7)),4)),(((15,6),11),(10,8))),1); tree rep.9350000 = (((((((13,7),14),4),5),(3,(9,2))),((8,10),(11,(15,6)))),12,1); tree rep.9360000 = (12,((5,((3,(9,2)),((4,(7,13)),14))),((10,((11,15),6)),8)),1); tree rep.9370000 = ((((3,(9,2)),(14,(5,((13,7),4)))),(((11,15),6),(8,10))),12,1); tree rep.9380000 = ((((6,(15,11)),(10,8)),(((4,(7,13)),(5,14)),(3,(9,2)))),12,1); tree rep.9390000 = (12,(((((3,(2,9)),5),4),((13,7),14)),((8,10),(6,(11,15)))),1); tree rep.9400000 = ((((3,(9,2)),(((13,7),14),4)),5),(12,((10,((6,15),11)),8)),1); tree rep.9410000 = ((((3,(2,9)),(((7,13),4),14)),5),(12,(8,(10,((11,15),6)))),1); tree rep.9420000 = (12,((8,(((15,6),11),10)),((4,((7,13),14)),(5,((9,2),3)))),1); tree rep.9430000 = (((3,(9,2)),((((11,(6,15)),(10,8)),((4,14),(7,13))),5)),12,1); tree rep.9440000 = ((12,(8,10)),(((15,6),11),((((2,9),3),4),((14,5),(13,7)))),1); tree rep.9450000 = (12,((8,10),(((11,6),15),(5,((3,(2,9)),((4,(13,7)),14))))),1); tree rep.9460000 = (((14,(((2,9),3),4)),(((((11,15),6),8),(12,10)),(7,13))),5,1); tree rep.9470000 = (12,((((7,13),4),((10,8),(15,(6,11)))),(5,(((2,9),3),14))),1); tree rep.9480000 = ((3,(((((8,10),(11,(15,6))),5),(14,((7,13),4))),(2,9))),12,1); tree rep.9490000 = (12,(((3,(9,2)),((((7,13),4),14),5)),(((15,6),11),(10,8))),1); tree rep.9500000 = (12,((((3,(2,9)),(4,(14,(13,7)))),5),((10,((6,15),11)),8)),1); tree rep.9510000 = ((((5,14),(((2,9),3),((13,7),4))),(((6,15),11),(10,8))),12,1); tree rep.9520000 = (((((9,2),3),12),(5,((4,(7,13)),14))),(((6,15),11),(8,10)),1); tree rep.9530000 = (12,((5,(((14,4),(13,7)),((2,9),3))),((11,(15,6)),(10,8))),1); tree rep.9540000 = (12,((10,(8,((11,15),6))),(((((13,7),4),14),(3,(2,9))),5)),1); tree rep.9550000 = (((((2,9),3),((4,(13,7)),14)),(5,(((11,(6,15)),8),10))),12,1); tree rep.9560000 = ((12,(10,(8,(15,(6,11))))),((3,(2,9)),(((4,(7,13)),14),5)),1); tree rep.9570000 = (((10,((6,15),11)),((((5,14),(7,13)),(4,(3,(2,9)))),8)),12,1); tree rep.9580000 = (((14,((13,7),4)),((3,(2,9)),5)),(12,(((6,(15,11)),8),10)),1); tree rep.9590000 = (((((((2,9),3),5),(4,(7,13))),14),12),(((11,15),6),(10,8)),1); tree rep.9600000 = ((((8,10),(15,(11,6))),(5,((4,((7,13),14)),((9,2),3)))),12,1); tree rep.9610000 = (((((6,15),11),(8,10)),((3,(9,2)),(((13,7),4),(5,14)))),12,1); tree rep.9620000 = (((((14,(4,(7,13))),((9,2),3)),5),(((6,(11,15)),10),8)),12,1); tree rep.9630000 = (((5,((9,2),3)),(((6,(15,11)),(8,10)),(14,((7,13),4)))),12,1); tree rep.9640000 = (12,((5,(((7,(13,4)),(((11,(15,6)),8),10)),14)),((9,2),3)),1); tree rep.9650000 = ((((5,(3,(2,9))),(14,(4,(7,13)))),12),((8,((15,6),11)),10),1); tree rep.9660000 = (12,((8,((6,(15,11)),10)),((3,(2,9)),(((5,(13,7)),4),14))),1); tree rep.9670000 = (12,(((6,(15,11)),(8,10)),((4,(7,13)),((14,5),(3,(2,9))))),1); tree rep.9680000 = ((((6,(11,15)),(10,8)),((14,((13,7),4)),(((2,9),3),5))),12,1); tree rep.9690000 = (((((2,9),3),(((13,7),4),14)),(((6,(15,11)),(10,8)),5)),12,1); tree rep.9700000 = ((((6,(11,15)),8),10),((5,(3,(9,2))),((((13,7),4),12),14)),1); tree rep.9710000 = ((((13,7),((5,14),(4,((9,2),3)))),((8,10),(6,(15,11)))),12,1); tree rep.9720000 = (12,(((8,10),(11,(6,15))),(((5,(3,(9,2))),(4,(7,13))),14)),1); tree rep.9730000 = (((10,8),((15,6),11)),(((2,9),((5,(13,7)),3)),(12,(4,14))),1); tree rep.9740000 = (12,(((8,10),(6,(15,11))),(((3,(2,9)),5),(14,(4,(13,7))))),1); tree rep.9750000 = (((((9,2),3),(5,(4,((7,13),14)))),12),((8,10),((6,15),11)),1); tree rep.9760000 = (12,(((5,((9,2),3)),((4,14),(13,7))),((((11,15),6),10),8)),1); tree rep.9770000 = ((((10,((6,15),11)),8),((9,(2,3)),((4,((7,13),14)),5))),12,1); tree rep.9780000 = ((((14,(5,(3,(2,9)))),(7,(4,13))),12),(10,(((11,15),6),8)),1); tree rep.9790000 = (12,(((((9,2),3),(4,(13,7))),(14,5)),((6,(11,15)),(8,10))),1); tree rep.9800000 = (12,(((10,8),((6,15),11)),((5,((4,(13,7)),14)),((9,2),3))),1); tree rep.9810000 = ((((6,(15,11)),(8,10)),((5,14),((7,(13,4)),(3,(2,9))))),12,1); tree rep.9820000 = (((((3,(9,2)),((7,13),(4,14))),((6,(15,11)),(10,8))),5),12,1); tree rep.9830000 = ((12,((3,(9,2)),(((4,(7,13)),5),14))),((((15,11),6),10),8),1); tree rep.9840000 = (12,(((((11,15),6),10),8),(((14,((13,7),4)),5),((9,2),3))),1); tree rep.9850000 = ((12,(((4,((2,9),3)),(14,(7,13))),5)),(10,(8,((6,15),11))),1); tree rep.9860000 = ((((11,(6,15)),(10,8)),(14,(((7,4),13),(5,(3,(9,2)))))),12,1); tree rep.9870000 = (((8,((6,15),11)),10),(12,(3,((14,4),(((9,2),5),(13,7))))),1); tree rep.9880000 = (((14,(((4,(13,7)),5),((2,9),3))),((((6,15),11),8),10)),12,1); tree rep.9890000 = (12,(((5,((13,7),(4,14))),((2,9),3)),((((11,15),6),10),8)),1); tree rep.9900000 = (12,(((10,8),(6,(15,11))),(((14,((7,13),4)),5),(3,(9,2)))),1); tree rep.9910000 = (12,(((((14,4),(7,13)),((8,((11,15),6)),10)),(3,(9,2))),5),1); tree rep.9920000 = (12,((10,((6,(11,15)),8)),((5,14),((3,(9,2)),(4,(7,13))))),1); tree rep.9930000 = (((3,(9,2)),(((14,(7,13)),4),(5,(10,(8,(11,(6,15))))))),12,1); tree rep.9940000 = ((((5,((9,2),3)),((13,7),(14,4))),(8,(((11,15),6),10))),12,1); tree rep.9950000 = (12,(((10,((15,6),11)),8),(5,(((13,(14,7)),4),(3,(2,9))))),1); tree rep.9960000 = (12,((((4,((7,13),14)),((9,2),3)),((8,10),(11,(15,6)))),5),1); tree rep.9970000 = ((((3,(2,9)),(10,(8,((11,6),15)))),(4,((5,14),(7,13)))),12,1); tree rep.9980000 = (((8,(10,((11,6),15))),((((14,(7,13)),4),5),((2,9),3))),12,1); tree rep.9990000 = (12,((8,(10,((15,11),6))),((((13,7),(14,4)),((9,2),3)),5)),1); tree rep.10000000 = (((((6,(11,15)),10),8),(((4,(13,7)),(5,(3,(2,9)))),14)),12,1); end; phangorn/inst/extdata/trees/primates.dna0000644000176200001440000001010013707232051020117 0ustar liggesusers 14 232 Mouse ACCAAAAAAA CATCCAAACA CCAACCCCAG CCCTTACGCA ATAGCCATAC AAAGAATATT Bovine ACCAAACCTG TCCCCACCAT CTAACACCAA CCCACATATA CAAGCTAAAC CAAAAATACC Lemur ACCAAACTAA CATCTAACAA CTACCTCCAA CTCTAAAAAA GCACTCTTAC CAAACCCATC Tarsier ATCTACCTTA TCTCCCCCAA TCAATACCAA CCTAAAAACT CTACAATTAA AAACCCCACC Squir MonkACCCCAGCAA CTCGTTGTGA CCAACATCAA TCCAAAATTA GCAAACGTAC CAACAATCTC Jpn Macaq ACTCCACCTG CTCACCTCAT CCACTACTAC TCCTCAAGCA ATACATAAAC TAAAAACTTC Rhesus MacACTTCACCCG TTCACCTCAT CCACTACTAC TCCTCAAGCG ATACATAAAT CAAAAACTTC Crab-E.MacACCCCACCTA CCCGCCTCGT CCGCTACTGC TTCTCAAACA ATATATAGAC CAACAACTTC BarbMacaq ACCCTATCTA TCTACCTCAC CCGCCACCAC CCCCCAAACA ACACACAAAC CAACAACTTT Gibbon ACTATACCCA CCCAACTCGA CCTACACCAA TCCCCACATA GCACACAGAC CAACAACCTC Orang ACCCCACCCG TCTACACCAG CCAACACCAA CCCCCACCTA CTATACCAAC CAATAACCTC Gorilla ACCCCATTTA TCCATAAAAA CCAACACCAA CCCCCATCTA ACACACAAAC TAATGACCCC Chimp ACCCCATCCA CCCATACAAA CCAACATTAC CCTCCATCCA ATATACAAAC TAACAACCTC Human ACCCCACTCA CCCATACAAA CCAACACCAC TCTCCACCTA ATATACAAAT TAATAACCTC ATACTACTAA AAACTCAAAT TAACTCTTTA ATCTTTATAC AACATTCCAC CAACCTATCC ATACAACCAT AAATAAGACT AATCTATTAA AATAACCCAT TACGATACAA AATCCCTTTC ACAACTCTAT CAACCTAACC AAACTATCAA CATGCCCTCT CCTAATTAAA AACATTGCCA GCTCAATTAC TAGCAAAAAT AGACATTCAA CTCCTCCCAT CATAACATAA AACATTCCTC CCAAATTTAA AAACACATCC TACCTTTACA ATTAATAACC ATTGTCTAGA TATACCCCTA TCACCTCTAA TACTACACAC CACTCCTGAA ATCAATGCCC TCCACTAAAA AACATCACCA TCACCTCCAA TACTACGCAC CGCTCCTAAA ATCAATGCCC CCCACCAAAA AACATCACCA TCACCTTTAA CACTACATAT CACTCCTGAG CTTAACACCC TCCGCTAAAA AACACCACTA TTATCTTTAG CACCACACAT CACCCCCAAA AGCAATACCC TTCACCAAAA AGCACCATCA CCACCTTCCA TACCAAGCCC CGACTTTACC GCCAACGCAC CTCATCAAAA CATACCTACA TCAACCCCTA AACCAAACAC TATCCCCAAA ACCAACACAC TCTACCAAAA TACACCCCCA CCACCCTCAA AGCCAAACAC CAACCCTATA ATCAATACGC CTTATCAAAA CACACCCCCA CCACTCTTCA GACCGAACAC CAATCTCACA ACCAACACGC CCCGTCAAAA CACCCCTTCA CCACCTTCAG AACTGAACGC CAATCTCATA ACCAACACAC CCCATCAAAG CACCCCTCCA ACACAAAAAA ACTCATATTT ATCTAAATAC GAACTTCACA CAACCTTAAC ACATAAACAT GTCTAGATAC AAACCACAAC ACACAATTAA TACACACCAC AATTACAATA CTAAACTCCC CACTAAACCT ACACACCTCA TCACCATTAA CGCATAACTC CTCAGTCATA TCTACTACAC GCTCCAATAA ACACATCACA ATCCCAATAA CGCATATACC TAAATACATC ATTTAATAAT AAATAAATGA ATATAAACCC TCGCCGATAA CATA-ACCCC TAAAATCAAG ACATCCTCTC GCCCAAACAA ACACCTATCT ACCCCCCCGG TCCACGCCCC TAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTACCC ATCCCCCCGG TTCACGCCTC AAACTCCATC ATTCCCCCTC ACCCAAACAA ACACCTATCT ATCCCCCCGG TCCACGCCCC AAACCCCGCT ATTCCCCCCT AATCAAACAA ACACCTATTT ATTCCCCTAA TTCACGTCCC AAATCCCATT ATCTCTCCCC ACACAAACAA ATGCCCCCCC ACCCTCCTTC TTCAAGCCCA CTAGACCATC CTACCTTCCT ATTCACATCC GCACACCCCC ACCCCCCCTG CCCACGTCCA TCCCATCACC CTCTCCTCCC ACATAAACCC ACGCACCCCC ACCCCTTCCG CCCATGCTCA CCACATCATC TCTCCCCTTC GCACAAATTC ATACACCCCT ACCTTTCCTA CCCACGTTCA CCACATCATC CCCCCCTCTC ACACAAACCC GCACACCTCC ACCCCCCTCG TCTACGCTTA CCACGTCATC CCTCCCTCTC ACCCCAGCCC AACACCCTTC CACAAATCCT TAATATACGC ACCATAAATA AC ATCCCACCAA ATCACCCTCC ATCAAATCCA CAAATTACAC AACCATTAAC CC ACCCTAACAA TTTATCCCTC CCATAATCCA AAAACTCCAT AAACACAAAT TC AATACTCCAA CTCCCATAAC ACAGCATACA TAAACTCCAT AAGTTTGAAC AC ACAACGCCAA ACCCCCCTCT CATAACTCTA CAAAATACAC AATCACCAAC AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTGCAT AAGCAAACAG AC AATACATCAA ACAATTCCCC CCAATACCCA CAAACTACAT AAACAAACAA AC AATACACCAA ACAATTTTCT CCAACACCCA CAAACTGTAT AAACAAACAA AC AACATACCAA ACAATTCTCC CTAATATACA CAAACCACGC AAACAAACAA AC AGCACGCCAA GCTCTCTACC ATCAAACGCA CAACTTACAC ATACAGAACC AC AACACCCTAA GCCACCTTCC TCAAAATCCA AAACCCACAC AACCGAAACA AC AACACCTCAA TCCACCTCCC CCCAAATACA CAATTCACAC AAACAATACC AC AACATCTTGA CTCGCCTCTC TCCAAACACA CAATTCACGC AAACAACGCC AC AACACCTTAA CTCACCTTCT CCCAAACGCA CAATTCGCAC ACACAACGCC AC phangorn/inst/extdata/trees/RAxML_bipartitions.AIs0000644000176200001440000000054313707232051021731 0ustar liggesusers(Ame:0.02681059329595153473,((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155)39:0.00087036069658183684)42:0.00122506270256386740,((Uar:0.00052373856518729458,Uma:0.00247018618187345041)83:0.00167792487939210548,Uam:0.00184159984063642979)41:0.00107249327886021345)100:0.00382497683824970002,Tor:0.00848622429823414105); phangorn/inst/extdata/trees/woodmouse.fasta0000644000176200001440000003447113707232051020671 0ustar liggesusers>No305 nttcgaaaaacacacccactactaaaanttatcagtcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatacatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaanttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagccacactgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgtccacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcagaccctata >No304 attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtagtccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattncaaatttactntcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctgtn >No306 attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacnncatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaaccctata >No0906S attcgaaaaacacacccactactaaaaatcatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtatgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataataatttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaatacnnnn >No0908S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagccccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggggctacagtaattacaaatttactatcagcaattccatatatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatcctcccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0909S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0910S attcgaaaaacacacccactactaaaaattatcaatcactctttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttgcaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0912S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacggggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgctttccacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagacattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No0913S attcgaaaaacacacccactactaaaaattatcaaccactccttcatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatgcatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagaatgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactctagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1103S attcgaaaaacacacccactactaaaaattattaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacattttcatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1007S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1114S nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnatcgacttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggagtctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagnaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatatattacggctcatacattctcatagaaacatgaaacatcggtgtggtccttttattcgcagtaatagtcacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttcctatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaggatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatatttcctatttgcctatgcaatcctacggtccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccattccttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1202S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttaccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccagatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacggatcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggcgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1206S attcgaaaaacacacccactactaaaaattatcaatcactccttcatcgatttgccagctccatctaacatttcatcatgatgaaacttcggctcattactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgtcgagacgtaaattatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttctccatgtaggacgaggaatgtattacgggtcatacatttttatagaaacatgaaacatcggtgtgatccttttattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccttctgaggagctacagtaattacaaatttactatcagcaattccatacatcggaactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcacttcatccttccatttatcattgccgccctagtaattgtgcacctcttgtttcttcatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagacctcttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaattctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn >No1208S nnncgaaaaacacacccactactaaaaattatcaatcactccttcatcgacttaccagctccatctaacatctcatcatgatgaaacttcggctccttactaggaatctgcctaataatccaaatcctcacaggcttattcctagcaatacactacacatcagacacaataacagcattctcttcagtaacccatatttgccgagacgtaaactatggctgactaattcgatatatacatgcaaacggagcctcaatattttttatttgcctatttcttcatgtaggacgaggaatgtattacgggtcatacactttcatagaaacatgaaacatcggtgtgatccttctattcgcagtaatagccacagcattcataggatatgttcttccatgaggacaaatatccctctgaggagctacagtaattacaaatttactatcagcaattccatacatcgggactaccctagtagagtgaatctgaggaggattctcagtagacaaagctacattgacacgttttttcgcttttcactttatccttccatttatcattgccgccctagtaattgttcacctcttgtttctccatgaaactggatctaataacccaacaggccttaactcagacgccgataaaatcccatttcacccttactatacaattaaagatattctaggtgtactaataatagtttccttcctaataactttagtccttttctttccagaccttttaggtgacccggacaactacatgcctgctaacccacttaacaccccacctcatattaaaccagaatgatacttcctatttgcctatgcaatcctacgatccatccccaataaactaggcggagtcctagccctaatcctatcaatcttaattttagccttattaccatttcttcacacttccaaacaacgcagcctaatattccgcccaattactcaaacccnnnn phangorn/inst/extdata/trees/Splits.txt0000644000176200001440000000427713707232051017650 0ustar liggesusersSplitWeight Bootstrap Color 0.07060404 100 Blue 0.04792795 100 Blue 0.042704593 100 Blue 0.030850368 100 Blue 0.023994952 100 Blue 0.02331487 100 Blue 0.012582252 100 Blue 0.007275392 97 Blue 0.0051821293 0 Pink 0.0036041164 99.2 Blue 0.0032304472 96.4 Blue 0.0026902487 0 Pink 0.0022065418 100 Blue 0.0019132489 81.3 Blue 0.001341845 0 Pink 0.0009478839 0 Pink 0.0008527216 3.2 Blue 0.0002126253 0 Pink 0.0001476501 0 Pink 0.015339644 100 Blue 0.0023547208 2.6 Blue 0.0014287664 0 Pink 0.0008373248 0 Pink 0.0006076867 2.6 Blue 0.0006041702 0 Pink 0.000297436 0 Pink 0.0002735536 0 Pink 5.794991E-05 0 Pink 3.466567E-05 12.1 Blue 1.5231282E-05 0 Pink 0.0012366334 41.9 Blue 0.0009923275 0 Pink 0.0009782094 0 Pink 0.0009185735 0 Pink 0.0007710702 54.9 Blue 0.0006963874 0 Pink 0.0006019617 10.4 Blue 0.0003462597 0 Pink 0.0089485 100 Blue 0.0020022863 0 Pink 0.0010558827 71 Blue 0.0004692516 0 Pink 0.0004601492 5.8 Blue 0.020771 100 Blue 0.0008540598 0 Pink 0.000244999 0 Pink 0.0009483108 0 Pink 0.0007954276 0 Pink 0.0003385545 47.9 Blue 0.0001838823 1.3 Blue 0.0012166464 55.1 Blue 0.0008818683 29 Blue 0.0002556656 0 Pink 0.000698773 0 Pink 0.0006747867 1.2 Blue 0.0006746581 44.1 Blue 0.0001867169 0 Pink 0.0008441487 0 Pink 0.00001 87.1 Green 0.00001 53.7 Green 0.00001 45.8 Green 0.00001 42.6 Green 0.00001 36.4 Green 0.00001 36.1 Green 0.00001 34.7 Green 0.00001 26.1 Green 0.00001 24.5 Green 0.00001 22.3 Green 0.00001 21 Green 0.00001 13.8 Green 0.00001 12.7 Green 0.00001 11 Green 0.00001 9.9 Green 0.00001 9.2 Green 0.00001 8.1 Green 0.00001 7.6 Green 0.00001 6.1 Green 0.00001 5.6 Green 0.00001 5.5 Green 0.00001 4.8 Green 0.00001 4.6 Green 0.00001 4.3 Green 0.00001 4.2 Green 0.00001 4.2 Green 0.00001 4.1 Green 0.00001 4 Green 0.00001 3.4 Green 0.00001 3.2 Green 0.00001 3.2 Green 0.00001 3 Green 0.00001 2.9 Green 0.00001 2.6 Green 0.00001 2.5 Green 0.00001 2.5 Green 0.00001 2.4 Green 0.00001 2.4 Green 0.00001 2.1 Green 0.00001 2.1 Green 0.00001 2 Green 0.00001 1.8 Green 0.00001 1.7 Green 0.00001 1.6 Green 0.00001 1.6 Green 0.00001 1.5 Green 0.00001 1.5 Green 0.00001 1.4 Green 0.00001 1.4 Green 0.00001 1.3 Green 0.00001 1.2 Green 0.00001 1.1 Green 0.00001 1.1 Green 0.00001 1 Green 0.00001 1 Green 0.00001 1 Green phangorn/inst/extdata/trees/RAxML_bootstrap.mtG0000644000176200001440000001062413707232051021313 0ustar liggesusers(Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uth,(Hma,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Uth,(Uam,Hma)),(Mur,(Uma,Uar))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (((Uar,Uma),(Mur,((Hma,Uam),Uth))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Uth,(Hma,Uam)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Tor,Ame); (Tor,(Mur,((Uth,(Hma,Uam)),(Uma,Uar))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Hma,(Uam,Uth)),((Uma,Uar),Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Uth,(Hma,Uam)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); (((Hma,(Uth,Uam)),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),(Uth,(Hma,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),(Uth,(Hma,Uam)))),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); phangorn/inst/extdata/trees/RAxML_bestTree.AIs0000644000176200001440000000053413707232051020777 0ustar liggesusers(((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155):0.00087036069658183684):0.00122506270256386740,((Uar:0.00052373856518729458,Uma:0.00247018618187345041):0.00167792487939210548,Uam:0.00184159984063642979):0.00107249327886021345):0.00382497683824970002,Tor:0.00848622429823414105,Ame:0.02681059329595153473):0.0; phangorn/inst/extdata/trees/RAxML_bestTree.mtG0000644000176200001440000000053413707232051021052 0ustar liggesusers((Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073):0.05944338095871280064,((Uam:0.06376626308156593814,Uth:0.05419104627017570786):0.00666893477206217944,Hma:0.06896198930015005890):0.00974981555038798714):0.00145717534115081442):0.13909717574901725445,Tor:0.19825987246617926552,Ame:0.42623829669506568818):0.0; phangorn/inst/extdata/trees/RAxML_bipartitions.mtG0000644000176200001440000000054513707232051022006 0ustar liggesusers(Ame:0.42623829669506568818,(Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073)100:0.05944338095871280064,((Uam:0.06376626308156593814,Uth:0.05419104627017570786)92:0.00666893477206217944,Hma:0.06896198930015005890)100:0.00974981555038798714)66:0.00145717534115081442)100:0.13909717574901725445,Tor:0.19825987246617926552); phangorn/inst/extdata/trees/RAxML_bootstrap.3moles0000644000176200001440000012771013707232051021773 0ustar liggesusers((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Mur,(Uth,Uam))),Hma),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); ((((Uar,Uma),Hma),((Uth,Uam),Mur)),Tor,Ame); ((Hma,((Uth,Mur),(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((((Uar,Uma),Uam),(Uth,Mur)),Hma),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Uar,Uma),(((Uam,Uth),Mur),Hma)),Tor,Ame); ((Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Tor,Ame); ((((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); ((Mur,((Hma,Uth),(Uam,(Uar,Uma)))),Tor,Ame); (Tor,((Uma,Uar),((Mur,(Uth,Uam)),Hma)),Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Mur,(Uma,Uar)),((Uam,Uth),Hma)),Ame); (Tor,((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Ame); (Tor,(((Uth,Hma),((Uma,Uar),Uam)),Mur),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Uma,Uar),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Hma,Mur)),Tor,Ame); ((((Uma,Uar),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Uth,(Uam,(Uma,Uar))),Mur),Hma),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Ame); (Tor,((Uar,Uma),(Mur,(Uth,(Hma,Uam)))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Uam,Uth),(Hma,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uar,Uma),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uma,Uar))),Ame); (Tor,((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uma,Uar)),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); ((((Hma,Mur),Uth),((Uma,Uar),Uam)),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); ((Uth,((Uam,(Uma,Uar)),(Hma,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Hma,((Uth,((Uma,Uar),Uam)),Mur)),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (Tor,(Mur,((Uar,Uma),(Hma,(Uam,Uth)))),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,(((Uth,(Uam,(Uar,Uma))),Hma),Mur),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uar,Uma)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uar,Uma)),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Hma),Mur)),Ame); ((((Uth,Uam),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Mur,(Uth,((Uar,Uma),Uam))),Hma),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Hma,(Uam,Uth))),Mur),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Tor,Ame); (((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),((Uam,Uth),Hma)),Mur),Tor,Ame); (((Uar,Uma),(Uam,(Uth,(Hma,Mur)))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uar,Uma),Uam),Uth))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uth,Hma),Mur),(Uam,(Uar,Uma))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Hma,(Uth,Uam)),((Uar,Uma),Mur)),Ame); (Tor,((Uar,Uma),(Hma,(Mur,(Uth,Uam)))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((Uma,Uar),(((Uam,Uth),Hma),Mur)),Ame); (Tor,((((Uma,Uar),Uam),Uth),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uma,Uar))),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uth,Uam),Hma),((Uma,Uar),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,Uam),(Hma,((Uma,Uar),Mur))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Ame); (Tor,(((Uma,Uar),(Hma,(Uam,Uth))),Mur),Ame); (Tor,((Uma,Uar),((Mur,Hma),(Uam,Uth))),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,((Uam,(Uma,Uar)),Uth)),Mur),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,(Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(((Uma,Uar),Uam),(Mur,(Uth,Hma))),Ame); (Tor,(Hma,((Uma,Uar),((Uth,Uam),Mur))),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((((Uam,(Uma,Uar)),Hma),Uth),Mur),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Uma,Uar),(((Uth,Uam),Hma),Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,Uth),((Uma,Uar),(Mur,Hma))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); ((((Uam,Uth),Hma),((Uma,Uar),Mur)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((((Uth,Uam),Mur),((Uar,Uma),Hma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uam,Uth),Mur),((Uar,Uma),Hma)),Tor,Ame); ((((Hma,(Uam,Uth)),Mur),(Uar,Uma)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Uar,Uma),((Uth,Uam),(Mur,Hma))),Tor,Ame); (Tor,((Hma,(Uth,Uam)),((Uar,Uma),Mur)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,(Mur,((Uar,Uma),((Uth,Uam),Hma))),Ame); (Tor,(((Hma,Mur),Uth),((Uar,Uma),Uam)),Ame); (Tor,(((Uth,Mur),Uam),(Hma,(Uar,Uma))),Ame); (Tor,(Hma,((Uar,Uma),((Uth,Uam),Mur))),Ame); (Tor,((Uar,Uma),(Hma,((Uth,Uam),Mur))),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Uam,Uth),((Mur,Hma),(Uar,Uma))),Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,(Uth,(Uam,(Uar,Uma)))),Hma),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Hma,(Uam,Uth)),(Uar,Uma)),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((((Uam,Uth),Hma),Mur),(Uma,Uar)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((Hma,((Uam,(Uar,Uma)),(Mur,Uth))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); ((Mur,((Hma,(Uth,Uam)),(Uar,Uma))),Tor,Ame); ((((Uma,Uar),(Hma,Mur)),(Uam,Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Uam,((Uma,Uar),((Mur,Hma),Uth))),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uma,Uar)),Tor,Ame); ((((Hma,Uth),Mur),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((Mur,(((Uam,(Uma,Uar)),Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Uam,(Uma,Uar)),Uth),(Hma,Mur)),Tor,Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,(((Mur,(Uth,Uam)),Hma),(Uma,Uar)),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Hma,Mur),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,(Mur,(Hma,((Uam,(Uma,Uar)),Uth))),Ame); (Tor,(((Mur,Uth),(Uam,(Uma,Uar))),Hma),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,(((Uam,Uth),Mur),(Hma,(Uar,Uma))),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,((Mur,Hma),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(((Uar,Uma),(Mur,(Uth,Uam))),Hma),Ame); (Tor,(((Mur,Hma),Uth),((Uar,Uma),Uam)),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((((Uam,Uth),Hma),(Uar,Uma)),Mur),Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Uar,Uma),(Mur,((Uth,Uam),Hma))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); ((Mur,((Uth,Hma),(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,((Uth,Uam),Mur)),(Uar,Uma)),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((Mur,(((Uam,(Uar,Uma)),Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uar,Uma),((Mur,Hma),(Uam,Uth))),Tor,Ame); (((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Mur,((Uam,(Uma,Uar)),Uth)),Hma),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uma,Uar),(((Uth,Uam),Hma),Mur)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uth,Hma),Mur),(Uam,(Uma,Uar))),Tor,Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Mur),Hma)),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); ((((Hma,Mur),Uth),((Uar,Uma),Uam)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Uth),(Uam,(Uma,Uar))),Mur),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((Hma,((Uth,Mur),((Uma,Uar),Uam))),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Mur,Hma),(Uma,Uar)),(Uam,Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Uth),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uma,Uar)),Tor,Ame); ((Mur,((Uth,((Uma,Uar),Uam)),Hma)),Tor,Ame); (((Mur,(Uth,Uam)),((Uma,Uar),Hma)),Tor,Ame); (((Uma,Uar),(Hma,(Mur,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Tor,Ame); ((Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Hma,Mur),(((Uma,Uar),Uam),Uth)),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,((Uma,Uar),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,Uma),(((Uth,Uam),Hma),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,((((Uth,Uam),Hma),Mur),(Uar,Uma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(((Uam,(Uar,Uma)),(Mur,Uth)),Hma),Ame); (Tor,((Uar,Uma),((Mur,(Uam,Uth)),Hma)),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,((Uma,Uar),(Mur,((Uth,Uam),Hma))),Ame); (Tor,(Mur,(Uth,((Uam,(Uma,Uar)),Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Hma,Mur))),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Hma,Uth))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,(((Uam,Uth),Hma),((Uar,Uma),Mur)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,Uth),((Uar,Uma),(Hma,Mur))),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,(Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (((Mur,(Hma,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,(Uam,(Uar,Uma))),Mur),Hma),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Uam),Hma),((Uar,Uma),Mur)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),((Mur,Hma),(Uth,Uam))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uma,Uar),(Mur,(Uam,(Hma,Uth)))),Tor,Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),((Uam,Uth),Hma)),Mur),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Hma),Mur)),Ame); (Tor,(Hma,((((Uar,Uma),Uam),Uth),Mur)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Mur,Hma))),Ame); (Tor,(((Uth,Mur),((Uar,Uma),Uam)),Hma),Ame); (Tor,(((Mur,Uth),Hma),((Uar,Uma),Uam)),Ame); (Tor,(((Mur,Uth),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (((Uma,Uar),((Uam,(Hma,Uth)),Mur)),Tor,Ame); ((((Uth,Mur),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Mur,(Uma,Uar)),(Hma,(Uam,Uth))),Tor,Ame); ((Hma,((((Uma,Uar),Uam),Uth),Mur)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,(Hma,((Mur,Uth),((Uar,Uma),Uam))),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uar,Uma),(Hma,(Uth,Uam))),Mur),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Mur,Hma)),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Mur,(Uth,((Uar,Uma),Uam))),Hma),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Mur,Uth))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (Tor,((Uth,Uam),((Hma,Mur),(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Hma,(Uma,Uar)),((Uth,Uam),Mur)),Ame); (Tor,((Hma,Mur),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(((Uma,Uar),(Hma,(Uth,Uam))),Mur),Ame); (Tor,(Hma,((Mur,Uth),(Uam,(Uma,Uar)))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uma,Uar),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Uma,Uar),(Mur,((Uam,Uth),Hma))),Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Uth,Mur),Hma)),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((Mur,(((Uth,Uam),Hma),(Uar,Uma))),Tor,Ame); (Tor,(((Uth,Mur),Hma),((Uma,Uar),Uam)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,(Mur,(Hma,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Mur),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(((Uar,Uma),Uam),Uth)),Mur),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Uar,Uma),(Mur,((Uam,Uth),Hma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Mur,(Uth,Hma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uth,Uam))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Mur,((Uam,(Uma,Uar)),Uth)),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Mur,(Hma,Uth))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(((Uth,Uam),Hma),(Mur,(Uma,Uar))),Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(Hma,(((Uam,Uth),Mur),(Uma,Uar))),Ame); (Tor,(((Uma,Uar),Mur),(Hma,(Uam,Uth))),Ame); (Tor,(((Uth,Uam),Hma),(Mur,(Uar,Uma))),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,(Mur,(((Uar,Uma),(Uth,Uam)),Hma)),Ame); (Tor,(((Uth,Mur),((Uar,Uma),Uam)),Hma),Ame); (Tor,((Mur,(((Uar,Uma),Uam),Uth)),Hma),Ame); (Tor,(((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Hma,(Uam,Uth))),Mur),Ame); (Tor,((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Uth,Mur))),Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Uth,Mur))),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,((Hma,(Uth,Uam)),(Mur,(Uma,Uar))),Ame); (Tor,(Hma,((Uth,Mur),(Uam,(Uma,Uar)))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((((Uma,Uar),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Mur),Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); ((Mur,((Uma,Uar),((Uam,Uth),Hma))),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uam,Uth))),Tor,Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(((Uma,Uar),Uam),((Uth,Mur),Hma)),Ame); (Tor,(Hma,(((Uma,Uar),Uam),(Uth,Mur))),Ame); (Tor,(Hma,(((Uma,Uar),Uam),(Uth,Mur))),Ame); (Tor,((Uth,Mur),(Hma,((Uma,Uar),Uam))),Ame); (Tor,(((Uma,Uar),(Hma,(Uam,Uth))),Mur),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uma,Uar),Uam),(Mur,(Uth,Hma))),Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((Mur,((((Uma,Uar),Uam),Uth),Hma)),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Hma),Mur)),Tor,Ame); (((Uma,Uar),((Uth,Uam),(Hma,Mur))),Tor,Ame); ((Mur,((Uma,Uar),((Uth,Uam),Hma))),Tor,Ame); ((Mur,((Uma,Uar),((Uth,Uam),Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (Tor,(((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Ame); (Tor,(((Uar,Uma),Hma),(Mur,(Uth,Uam))),Ame); (Tor,((Hma,(Uth,(Uam,(Uar,Uma)))),Mur),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Mur)),Hma),Ame); (Tor,(Mur,((Uth,(Uam,(Uar,Uma))),Hma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(((Uar,Uma),((Uth,Uam),Hma)),Mur),Ame); (Tor,(((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,(((Uar,Uma),(Hma,(Uam,Uth))),Mur),Ame); (((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Uth,Mur))),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); ((Mur,((((Uar,Uma),Uam),Uth),Hma)),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); ((Hma,(Mur,((Uam,(Uar,Uma)),Uth))),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uma,Uar),(Mur,((Uam,Uth),Hma))),Tor,Ame); ((Mur,(((Uam,Uth),Hma),(Uma,Uar))),Tor,Ame); (((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Tor,Ame); ((Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Tor,Ame); ((((Hma,(Uam,(Uma,Uar))),Uth),Mur),Tor,Ame); ((((Hma,(Uam,Uth)),(Uma,Uar)),Mur),Tor,Ame); ((Hma,((((Uma,Uar),Uam),Uth),Mur)),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((((Uma,Uar),Uam),Uth),Mur),Hma),Tor,Ame); (Tor,(((Mur,(Uam,Uth)),Hma),(Uar,Uma)),Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uar,Uma))),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (Tor,(((Uar,Uma),Uam),((Uth,Mur),Hma)),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Mur,Hma)),Ame); (Tor,((((Uar,Uma),Uam),Uth),(Mur,Hma)),Ame); ((Hma,((Uma,Uar),(Mur,(Uth,Uam)))),Tor,Ame); (((Uam,(Uma,Uar)),(Mur,(Hma,Uth))),Tor,Ame); (((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); ((((Uma,Uar),((Uam,Uth),Hma)),Mur),Tor,Ame); (((Uma,Uar),((Uth,(Hma,Uam)),Mur)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uma,Uar))),Tor,Ame); ((((Mur,(Uam,Uth)),Hma),(Uma,Uar)),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uam,Uth)))),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); ((((Uma,Uar),Uam),(Mur,(Hma,Uth))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((((Uam,Uth),Hma),(Mur,(Uar,Uma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); ((Mur,((Uar,Uma),((Uam,Uth),Hma))),Tor,Ame); (((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); (((((Uar,Uma),Uam),Uth),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Uma,Uar),(Mur,((Uth,Uam),Hma))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,((Uma,Uar),((Uam,Uth),(Hma,Mur))),Ame); (Tor,((Mur,(Uma,Uar)),((Uam,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),Mur),((Uma,Uar),Hma)),Ame); (Tor,(Hma,((Mur,Uth),(Uam,(Uma,Uar)))),Ame); (Tor,(((Uam,(Uma,Uar)),Uth),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,(((Uar,Uma),Uam),((Hma,Mur),Uth)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),Uam),(Uth,(Hma,Mur))),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),(Uam,(Uar,Uma))),Hma),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((((Uam,Uth),Mur),(Uar,Uma)),Hma),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(((Uth,Uam),Hma),Mur)),Tor,Ame); ((((Uth,((Uar,Uma),Uam)),Hma),Mur),Tor,Ame); ((((Uar,Uma),(Uam,Uth)),(Hma,Mur)),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); (((Uar,Uma),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Uth),Mur)),Tor,Ame); (Tor,((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Ame); (Tor,(((Uma,Uar),Hma),((Uth,Uam),Mur)),Ame); (Tor,((((Uma,Uar),Hma),(Uth,Mur)),Uam),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (((((Uar,Uma),Uam),(Mur,Uth)),Hma),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Hma,(Uth,Uam)),(Uar,Uma)),Mur),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((((Uth,Uam),Hma),Mur),(Uar,Uma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uth,Mur),(Uam,(Uar,Uma))),Hma),Tor,Ame); (((Uar,Uma),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (Tor,((Hma,Mur),(((Uma,Uar),Uam),Uth)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); ((Hma,((Mur,Uth),((Uar,Uma),Uam))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((((Mur,Hma),Uth),((Uar,Uma),Uam)),Tor,Ame); ((Hma,((Uth,((Uar,Uma),Uam)),Mur)),Tor,Ame); (((Mur,(Uth,Hma)),((Uar,Uma),Uam)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uam,Uth)))),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Mur,Hma)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); ((Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Tor,Ame); (((Hma,Mur),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((Hma,((Uam,(Uma,Uar)),(Mur,Uth))),Tor,Ame); ((Mur,((Hma,Uth),(Uam,(Uma,Uar)))),Tor,Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Ame); (Tor,(Mur,((Hma,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Mur,(Uth,(Uam,(Uma,Uar)))),Hma),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Ame); (Tor,((Uma,Uar),(Hma,(Mur,(Uth,Uam)))),Ame); (Tor,(((Uam,(Uma,Uar)),(Uth,Mur)),Hma),Ame); (((Hma,(Uth,Uam)),(Mur,(Uar,Uma))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uar,Uma))),Tor,Ame); (((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Mur,Hma),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uar,Uma),(Hma,(Uam,Uth))),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (Tor,((Mur,(Uam,Uth)),((Uar,Uma),Hma)),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,((Uar,Uma),(Hma,((Uth,Uam),Mur))),Ame); (Tor,(((Uth,Uam),Mur),((Uar,Uma),Hma)),Ame); (Tor,(((Hma,(Uth,Uam)),Mur),(Uar,Uma)),Ame); (Tor,(((Uar,Uma),Uam),((Mur,Hma),Uth)),Ame); (Tor,((Mur,Hma),(Uth,((Uar,Uma),Uam))),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Hma,(Uam,Uth)),((Uar,Uma),Mur)),Ame); (Tor,(Hma,(Mur,(((Uma,Uar),Uam),Uth))),Ame); (Tor,(((Uma,Uar),Uam),(Uth,(Hma,Mur))),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Ame); (Tor,(Hma,((Uth,((Uma,Uar),Uam)),Mur)),Ame); (Tor,((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Ame); (Tor,((Mur,((Uth,Uam),Hma)),(Uma,Uar)),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Mur,(Uth,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,((((Uma,Uar),Uam),Uth),(Mur,Hma)),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Ame); (Tor,((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Ame); (Tor,(Mur,((Hma,(Uam,Uth)),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,((Uma,Uar),Uam)))),Ame); (Tor,(Mur,((Uma,Uar),((Uth,Uam),Hma))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,(Uam,Uth)),((Uar,Uma),Mur)),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uma,Uar),Uam),Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uma,Uar))),Tor,Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); (((Uar,Uma),(Mur,((Uam,Uth),Hma))),Tor,Ame); (((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uar,Uma))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Uam,(Uth,Hma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Uma,Uar),((Hma,(Uam,Uth)),Mur)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Tor,Ame); ((((Uam,Uth),Mur),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uma,Uar)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Uam),Hma),(Mur,(Uma,Uar))),Tor,Ame); ((Mur,((Uth,((Uma,Uar),Uam)),Hma)),Tor,Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,((Uar,Uma),(((Uam,Uth),Mur),Hma)),Ame); (Tor,((Hma,((Uam,(Uar,Uma)),Uth)),Mur),Ame); (Tor,((Uar,Uma),(Mur,(Hma,(Uam,Uth)))),Ame); (Tor,((Uar,Uma),((Uam,Uth),(Mur,Hma))),Ame); (Tor,((Hma,(Uar,Uma)),((Uam,Uth),Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((((Uth,Uam),Hma),(Uar,Uma)),Mur),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); ((((Hma,Mur),Uth),((Uma,Uar),Uam)),Tor,Ame); (((Hma,Mur),(Uth,((Uma,Uar),Uam))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Hma,(Uth,((Uma,Uar),Uam))),Mur),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Hma),Mur)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Mur,Hma))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Mur,Hma))),Tor,Ame); (Tor,(Mur,((Uam,(Uar,Uma)),(Hma,Uth))),Ame); (Tor,(((Hma,(Uth,Uam)),(Uar,Uma)),Mur),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,(Hma,((Uam,(Uar,Uma)),(Mur,Uth))),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,(((Uam,Uth),Hma),(Mur,(Uar,Uma))),Ame); (Tor,(Mur,((Uar,Uma),((Uam,Uth),Hma))),Ame); (Tor,((Hma,Mur),(Uth,((Uar,Uma),Uam))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Mur,Uth))),Ame); (Tor,(((Uar,Uma),((Uth,Uam),Hma)),Mur),Ame); ((Hma,((Uar,Uma),(Mur,(Uam,Uth)))),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,(Uth,Uam))),Mur),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); ((Hma,(Mur,(((Uar,Uma),Uam),Uth))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); ((Hma,(((Uar,Uma),Uam),(Uth,Mur))),Tor,Ame); (Tor,((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,(((Uth,Uam),Mur),(Hma,(Uma,Uar))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uth,Mur),(Uam,(Uma,Uar))),Hma),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Hma,(Mur,(Uth,Uam))),(Uma,Uar)),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Hma,Mur))),Ame); (((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Tor,Ame); ((((Uth,Uam),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Uth,Uam),Mur),(Hma,(Uar,Uma))),Tor,Ame); ((((Hma,(Uth,Uam)),Mur),(Uar,Uma)),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uar,Uma))),Tor,Ame); ((Hma,(Mur,(Uth,((Uar,Uma),Uam)))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); (((((Uam,Uth),Hma),(Uar,Uma)),Mur),Tor,Ame); (((((Uam,Uth),Hma),(Uar,Uma)),Mur),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (Tor,(((Hma,Mur),Uth),((Uar,Uma),Uam)),Ame); (Tor,((((Uth,Uam),Hma),Mur),(Uar,Uma)),Ame); (Tor,(((Uth,(Uam,(Uar,Uma))),Mur),Hma),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Mur,Hma)),Ame); (Tor,((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uar,Uma))),Mur)),Ame); (Tor,(((Uar,Uma),Hma),((Uth,Uam),Mur)),Ame); (Tor,(Mur,(((Uar,Uma),Hma),(Uth,Uam))),Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Mur,(Hma,Uth)),((Uar,Uma),Uam)),Tor,Ame); ((((Mur,Uth),((Uar,Uma),Uam)),Hma),Tor,Ame); ((((Hma,Mur),Uth),((Uar,Uma),Uam)),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uam,Uth)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Hma),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((Mur,((Uth,(Uam,(Uar,Uma))),Hma)),Tor,Ame); ((Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Hma,(Uth,Uam)),Mur),(Uma,Uar)),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); ((((Uth,Uam),(Uma,Uar)),(Hma,Mur)),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,(((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(((Uar,Uma),(Mur,(Uth,Uam))),Hma),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,((Mur,(Hma,(Uth,Uam))),(Uar,Uma)),Ame); (Tor,((Mur,(Hma,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Mur,Hma),(Uar,Uma)),(Uam,Uth)),Tor,Ame); ((Uam,(Uth,(Mur,(Hma,(Uar,Uma))))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); ((((Uam,(Uar,Uma)),Uth),(Hma,Mur)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Hma,(Uam,Uth))),(Uar,Uma)),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Hma,(Mur,(Uth,Uam)))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uar,Uma),((Mur,(Uth,Uam)),Hma)),Tor,Ame); ((((Uth,(Uam,(Uar,Uma))),Hma),Mur),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Mur,(((Uma,Uar),Uam),Uth)),Hma),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Hma,Mur)),Tor,Ame); ((Mur,((((Uma,Uar),Uam),Uth),Hma)),Tor,Ame); (((Mur,(((Uma,Uar),Uam),Uth)),Hma),Tor,Ame); ((((Uma,Uar),(Uam,Uth)),(Hma,Mur)),Tor,Ame); ((((Mur,Uth),(Uam,(Uma,Uar))),Hma),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Mur,Hma)),Tor,Ame); (((Uma,Uar),(((Uam,Uth),Mur),Hma)),Tor,Ame); (Tor,(Hma,((Uam,(Uma,Uar)),(Mur,Uth))),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uma,Uar))),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uma,Uar))))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Ame); (Tor,(((Uma,Uar),(Uam,(Uth,Hma))),Mur),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(Mur,(Uth,(Hma,(Uam,(Uma,Uar))))),Ame); (Tor,(Mur,(((Uth,Uam),Hma),(Uma,Uar))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,(Mur,((Uma,Uar),(Hma,(Uth,Uam)))),Ame); (Tor,(((Uma,Uar),((Uth,Uam),Mur)),Hma),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Hma),Mur)),Ame); (Tor,(((Uam,(Uma,Uar)),Uth),(Mur,Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Ame); (Tor,(Hma,(((Uam,(Uma,Uar)),Uth),Mur)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,(((Mur,(Uth,Uam)),(Uma,Uar)),Hma),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Uth,Mur))),Ame); (Tor,(((Uar,Uma),Uam),(Hma,(Uth,Mur))),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Hma,Mur)),Ame); (Tor,((Uar,Uma),((Uam,Uth),(Mur,Hma))),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Mur)),Hma),Ame); (Tor,(((Uam,(Uar,Uma)),(Uth,Hma)),Mur),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Ame); ((Hma,((Uam,(Uar,Uma)),(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uma,Uar),(Mur,(Hma,(Uth,Uam)))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uma,Uar))),Tor,Ame); (((Uma,Uar),((Hma,(Uth,Uam)),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Uth),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Mur,(Hma,Uth)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); ((Uam,((Uth,(Mur,Hma)),(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Hma),((Uam,Uth),Mur)),Tor,Ame); phangorn/inst/extdata/trees/RAxML_bootstrap.Wang.out0000644000176200001440000045657013707232051022304 0ustar liggesusers(t1,((((((t14,t15),(t13,t12)),((t11,(((t6,t7),t8),(t9,t10))),(t24,t25))),t16),(((t17,t18),((t22,t21),(t20,t19))),t23)),((t2,t3),((t4,t5),(t27,t26)))),t0); (t1,((t2,t3),((t4,t5),((((((t14,t15),(t13,t12)),(t11,(((t6,t7),t8),(t9,t10)))),t16),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)))),t0); (t1,((((((t11,(((t6,t7),t8),(t9,t10))),(t16,(t14,t15))),(t13,t12)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((((t16,(t14,t15)),((t13,t12),(t11,(((t6,t7),t8),(t9,t10))))),((t24,t25),((((t17,t18),(t21,(t20,t19))),t22),t23))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((t27,t26),(t2,t3)),((t4,t5),(t16,((t14,t15),(((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))),((t24,t25),(((t17,t18),((t20,t19),(t21,t22))),t23))))))),t0); (t1,(((t2,t3),(t4,t5)),((((t24,t25),(((t17,t18),((t20,t19),(t21,t22))),t23)),((t16,(t14,t15)),((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26))),t0); (t1,((t2,t3),((((((t17,t18),((t20,t19),(t21,t22))),t23),((t13,t12),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),(t14,t15)))),t16),((t27,t26),(t4,t5)))),t0); (t1,(((t2,t3),(t4,t5)),(((((t17,t18),((t20,t19),(t21,t22))),t23),((((t13,t12),(t24,t25)),(t11,(((t6,t7),t8),(t9,t10)))),((t14,t15),t16))),(t27,t26))),t0); (t1,(((t2,t3),(t4,t5)),((((((t24,t25),((t17,t18),((t20,t19),(t21,t22)))),t23),((t13,t12),((t11,(((t6,t7),t8),(t9,t10))),(t14,t15)))),t16),(t27,t26))),t0); (t1,((t2,t3),((t4,t5),(((((t17,t18),((t20,t19),(t21,t22))),t23),((t14,t15),(t16,(((t24,t25),(t13,t12)),(t11,(((t6,t7),t8),(t9,t10))))))),(t27,t26)))),t0); (((t2,t3),((t5,t4),((t26,t27),(((t16,(t15,t14)),(((t12,t13),(t24,t25)),(t11,((t9,t10),(t8,(t7,t6)))))),(((t18,t17),((t19,t20),(t22,t21))),t23))))),t1,t0); (((t2,t3),((t5,t4),((t26,t27),((((((t12,t13),(t24,t25)),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14)),(((t18,t17),((t19,t20),(t22,t21))),t23)),t16)))),t1,t0); (((t5,t4),(((t26,t27),(((t11,((t9,t10),(t8,(t7,t6)))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)))),(t2,t3))),t1,t0); (((((((t15,t14),(t11,((t9,t10),(t8,(t7,t6))))),t16),(t12,t13)),((t24,t25),(((t22,(t18,t17)),((t19,t20),t21)),t23))),(((t2,t3),(t5,t4)),(t26,t27))),t1,t0); ((((t26,t27),(t5,t4)),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13))),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t2,t3))),t1,t0); ((((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13))),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t2,t3),(t27,((t5,t4),t26)))),t1,t0); (((t2,t3),((t5,t4),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t12,t13),t16)),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t26,t27)))),t1,t0); (((t2,t3),((t5,t4),(((((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t12,t13),t16)),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t26,t27)))),t1,t0); ((((t26,t27),(t2,t3)),((t5,t4),(((t16,(t15,t14)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13))),((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23))))),t1,t0); ((((t5,t4),(((((t18,t17),((t19,t20),(t21,t22))),t23),(((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t15,t14))),(t16,(t24,t25)))),(t26,t27))),(t2,t3)),t1,t0); (((t2,t3),(((t26,t27),((((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))),((t15,t14),t16)),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t4,t5))),t1,t0); (((t4,t5),((((t2,t3),((((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))),((t15,t14),t16)),(((t20,t19),((t18,t17),(t22,t21))),t23))),t27),t26)),t1,t0); ((((t27,t26),((((((t22,t21),(t20,t19)),(t18,t17)),((t25,t24),t23)),(((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t15,t14))),t16)),(t4,t5))),(t2,t3)),t1,t0); (((t4,t5),(((t27,t26),(((((t22,t21),(t20,t19)),(t18,t17)),((t25,t24),t23)),(((t12,t13),(((t9,t10),((t6,t7),t8)),t11)),(t16,(t15,t14))))),(t2,t3))),t1,t0); (((t4,t5),((t16,((t15,t14),(((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),((t12,t13),(((t9,t10),((t6,t7),t8)),t11))))),((t27,t26),(t2,t3)))),t1,t0); ((((t4,t5),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t25,t24),(t12,t13)))),(t27,t26))),(t2,t3)),t1,t0); (((t4,t5),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t25,t24),(t12,t13)))),((t2,t3),(t27,t26)))),t1,t0); (((t2,t3),((((((t25,t24),t23),(((t22,t21),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t12,t13),t16),(((((t9,t10),((t6,t7),t8)),t11),(t25,t24)),(t15,t14)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),(((t23,(((t22,t21),(t20,t19)),(t18,t17))),((((((t9,t10),((t6,t7),t8)),t11),(t25,t24)),((t15,t14),(t12,t13))),t16)),((t27,t26),(t4,t5)))),t1,t0); (t1,((t3,t2),(((t5,t4),(t27,t26)),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t12,t13),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),t16))),t0); (t1,(((t27,t26),(t3,t2)),((t5,t4),(((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))))),t0); (t1,((t5,t4),((((t23,((t17,t18),((t22,t21),(t19,t20)))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),((t25,t24),(t12,t13))))),(t27,t26)),(t3,t2))),t0); (t1,((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))),(((t5,t4),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),(((t23,((t17,t18),((t22,t21),(t19,t20)))),((t16,(((t25,t24),(((t10,t9),(t8,(t6,t7))),t11)),(t15,t14))),(t12,t13))),(t27,t26)))),t0); (t1,((t3,t2),((t5,t4),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),(((((t10,t9),(t8,(t6,t7))),t11),(t15,t14)),(t16,(t12,t13)))),(t27,t26)))),t0); (t1,((t3,t2),((((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t15,t14),(t16,((t12,t13),(((t10,t9),(t8,(t6,t7))),t11))))),((t27,t26),(t5,t4)))),t0); (t1,((t3,t2),((((t23,((t17,t18),((t22,t21),(t19,t20)))),(((t12,t13),(((((t10,t9),(t8,(t6,t7))),t11),(t15,t14)),t16)),(t25,t24))),(t27,t26)),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20)))))),(t27,t26)))),t0); (t1,((t3,t2),((((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t25,t24),(t23,((t17,t18),((t22,t21),(t19,t20)))))),((t27,t26),(t5,t4)))),t0); (t1,(((t4,t5),(t27,t26)),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t16,(t15,t14)),((t12,t13),((t25,t24),(t11,((t10,t9),(t8,(t7,t6)))))))))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),((t11,((t10,t9),(t8,(t7,t6)))),((t12,t13),(t25,t24)))))),(t27,t26)),(t4,t5))),t0); (t1,((t3,t2),((t16,((t15,t14),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),((t25,t24),((((t22,t21),(t19,t20)),(t18,t17)),t23))))),(((t4,t5),t26),t27))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6)))))))),(t26,t27)),(t4,t5))),t0); (t1,((t3,t2),(((((t25,t24),((((t21,(t19,t20)),(t18,t17)),t22),t23)),(((t12,t13),(t11,((t10,t9),(t8,(t7,t6))))),(t16,(t15,t14)))),(t26,t27)),(t4,t5))),t0); (t1,((t3,t2),((t4,t5),(((((t18,t17),((t21,t22),(t19,t20))),t23),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6)))))))),(t26,t27)))),t0); (t1,((t4,t5),(((((t21,(t19,t20)),((t18,t17),t22)),t23),(t16,(((t15,t14),((t11,((t10,t9),(t8,(t7,t6)))),(t25,t24))),(t12,t13)))),((t3,t2),(t26,t27)))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),((t15,t14),t16)))),(t4,t5))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t15,t14),((t25,t24),(t11,((t10,t9),(t8,(t7,t6)))))),(t12,t13)),t16))),(t4,t5))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t12,t13),(t25,t24)),(t11,((t10,t9),(t8,(t7,t6))))),(t16,(t15,t14))))),(t4,t5))),t0); (((((t23,((t21,(t18,t17)),(t22,(t20,t19)))),(t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9))))))),(t26,t27)),((t4,t5),(t3,t2))),t1,t0); (((t3,t2),((t16,(((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),(t23,((t25,t24),((t18,t17),((t21,t22),(t20,t19))))))),((t26,t27),(t4,t5)))),t1,t0); ((((t26,t27),(t4,t5)),((t3,t2),(((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))))),t1,t0); (((t3,t2),((((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),((t26,t27),(t4,t5)))),t1,t0); ((((t26,t27),(((t15,t14),(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)))),t16)),((t3,t2),(t4,t5))),t1,t0); (((t4,t5),(((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),(t23,(t25,t24))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))))),(t3,t2))),t1,t0); (((t3,t2),(((t4,t5),(t26,t27)),(((t23,((t25,t24),((t18,t17),((t21,t22),(t20,t19))))),((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); ((((t3,t2),(t26,t27)),(((((t18,t17),((t21,t22),(t20,t19))),t23),((t15,t14),((((t25,t24),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),t16))),(t4,t5))),t1,t0); (((t4,t5),(((t3,t2),(t26,t27)),(((t25,t24),(((t18,t17),((t21,t22),(t20,t19))),t23)),(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t15,t14)))))),t1,t0); (((t3,t2),(((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),t23),((t16,((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))))),(t25,t24)))),(t4,t5))),t1,t0); (t1,((t5,t4),((t3,t2),(t27,(t26,((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,(((t15,t14),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))),(t13,t12)))))))),t0); (t1,((t3,t2),((t5,t4),((t27,t26),((t23,((t25,t24),((t18,t17),((t19,t20),(t22,t21))))),(((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14)),((t13,t12),t16)))))),t0); (t1,((t5,t4),(((t3,t2),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t13,t12),(t15,t14)),(((t25,t24),(t11,((t9,t10),(t8,(t6,t7))))),t16))))),t0); (t1,((t3,t2),((t5,t4),((t27,t26),((((t25,t24),((t18,t17),((t19,t20),(t22,t21)))),t23),(t16,(((t15,t14),(t13,t12)),(t11,((t9,t10),(t8,(t6,t7)))))))))),t0); (t1,(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),(t23,(t25,t24))),(((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))))),((t3,t2),(t5,t4))),t0); (t1,(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(t16,((t15,t14),((t13,t12),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))))))),((t3,t2),(t5,t4))),t0); (t1,((t5,t4),(((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),((((t13,t12),(t25,t24)),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),t16)))),(t3,t2))),t0); (t1,(((t3,t2),(((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),t16))))),((t27,t26),(t5,t4))),t0); (t1,((t3,t2),((t5,t4),((((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14))),t16)),(t27,t26)))),t0); (t1,((t5,t4),((((((t18,t17),((t19,t20),(t22,t21))),t23),(((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24)),((t16,(t15,t14)),(t13,t12)))),(t27,t26)),(t3,t2))),t0); (((t2,t3),((t4,t5),(((t16,(((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))),((t13,t12),(t25,t24)))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t1,t0); ((((((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t25,t24))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t26,t27),((t2,t3),(t4,t5)))),t1,t0); (((t4,t5),(((((t13,t12),((t25,t24),(t11,(((t7,t6),t8),(t9,t10))))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t2,t3),(t26,t27)))),t1,t0); ((((t16,((t14,t15),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))),(t2,t3)),((t4,t5),(t26,t27))),t1,t0); ((((t4,t5),((t26,t27),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t16,((t14,t15),(((t25,t24),(t11,(((t7,t6),t8),(t9,t10)))),(t13,t12))))))),(t2,t3)),t1,t0); (((((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12)))),((t4,t5),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))))),t1,t0); ((((t26,t27),(((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))))),((t2,t3),(t4,t5))),t1,t0); (((t4,t5),(((t26,t27),(t2,t3)),((t23,(((t18,t17),((t22,t21),(t19,t20))),(t25,t24))),((t16,(t14,t15)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12)))))),t1,t0); ((((t2,t3),(t4,t5)),((t26,t27),(((t23,(((t18,t17),((t22,t21),(t19,t20))),(t25,t24))),((t13,t12),((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))))),t16))),t1,t0); ((((t4,t5),(t27,t26)),((t3,t2),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),(t24,t25)),(t11,((t8,(t6,t7)),(t9,t10)))),(t16,(t14,t15)))))),t1,t0); ((((t3,t2),(t4,t5)),((t27,t26),(t16,((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t24,t25),(t12,t13)),((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); (((t4,t5),(((t27,t26),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),t16),(t14,t15)),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))))),(t3,t2))),t1,t0); (((((t3,t2),(t27,t26)),((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t12,t13),t16),((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),(t24,t25)))),(t4,t5)),t1,t0); (((((t3,t2),(t27,t26)),((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t14,t15),(((t12,t13),(t24,t25)),(t11,((t8,(t6,t7)),(t9,t10))))),t16))),(t4,t5)),t1,t0); (((((t3,t2),(t27,t26)),((t16,(t14,t15)),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t11,((t8,(t6,t7)),(t9,t10))),(t12,t13))))),(t4,t5)),t1,t0); (((t3,t2),(((t27,t26),(t4,t5)),((t23,((t18,t17),((t22,t21),(t20,t19)))),((t16,((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),((t24,t25),(t12,t13)))))),t1,t0); (((t3,t2),((t4,t5),((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t16,((t14,t15),(t11,((t8,(t6,t7)),(t9,t10))))),(t12,t13))),(t27,t26)))),t1,t0); ((((((t16,(t14,t15)),((t24,t25),((t12,t13),(t11,((t8,(t6,t7)),(t9,t10)))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26)),((t3,t2),(t4,t5))),t1,t0); (((t3,t2),((t4,t5),((((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t9,t10))),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26)))),t1,t0); ((((t27,t26),((t16,(t15,t14)),(((t24,t25),(t23,((t17,t18),((t19,t20),(t21,t22))))),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10))))))),((t5,t4),(t2,t3))),t1,t0); ((((t27,t26),(t5,t4)),((t2,t3),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),(((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25)),(t13,t12)))))),t1,t0); ((((t5,t4),((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t15,t14),(((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))),((t24,t25),t16)))))),(t2,t3)),t1,t0); (((t5,t4),(((t2,t3),(t27,t26)),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t24,t25),((t16,(t15,t14)),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); ((((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))))))),((t5,t4),(t2,t3))),t1,t0); (((t5,t4),(((t2,t3),(t27,t26)),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))))))),t1,t0); (((t2,t3),(((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,(((t24,t25),(t13,t12)),((t15,t14),(t11,((t8,(t6,t7)),(t9,t10)))))))),(t5,t4))),t1,t0); (((t2,t3),(((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t15,t14)),((t13,t12),t16)))),(t5,t4))),t1,t0); (((t5,t4),((t2,t3),((t27,t26),((t23,((t17,t18),((t19,t20),(t21,t22)))),((t16,(t15,t14)),((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))))))))),t1,t0); (((t2,t3),(((t26,((t23,((t22,(t17,t18)),((t19,t20),t21))),(((t11,((t8,(t6,t7)),(t9,t10))),(t16,(t15,t14))),((t13,t12),(t24,t25))))),(t5,t4)),t27)),t1,t0); (((((t5,t4),(t27,t26)),(((t16,(t14,t15)),((t12,t13),((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t3,t2)),t1,t0); (((t5,t4),((t27,t26),(((t16,(((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15))),((t24,t25),(t23,((t17,t18),(t22,(t21,(t19,t20))))))),(t3,t2)))),t1,t0); ((((((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),((t14,t15),t16)),((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21)))))),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t16,((((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15))),(t23,((t17,t18),((t19,t20),(t22,t21)))))))),t1,t0); ((((t16,((((t23,((t17,t18),((t19,t20),(t22,t21)))),(t24,t25)),((t14,t15),(t12,t13))),(t11,((t8,(t6,t7)),(t10,t9))))),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),(((t26,t27),(((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),(t12,t13))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((((t11,((t8,(t6,t7)),(t10,t9))),((t14,t15),t16)),((t12,t13),(t24,t25))),(t23,((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((((t14,t15),t16),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),(((t24,t25),t23),((t17,t18),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t3,t2),(((t26,t27),((t16,(((t11,((t8,(t6,t7)),(t10,t9))),((t24,t25),(t12,t13))),(t14,t15))),((t22,((t17,t18),(t21,(t19,t20)))),t23))),(t5,t4))),t1,t0); ((((((t12,t13),((t11,((t8,(t6,t7)),(t10,t9))),(t24,t25))),((t14,t15),t16)),(((t17,t18),((t22,t21),(t19,t20))),t23)),(((t26,(t5,t4)),(t3,t2)),t27)),t1,t0); (((t2,t3),((((t23,((t24,t25),(((t21,t22),(t19,t20)),(t17,t18)))),((t12,t13),((t16,(t15,t14)),(t11,((t8,(t6,t7)),(t9,t10)))))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t15,t14),((t12,t13),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25)))),t16)),((t4,t5),(t26,t27)))),t1,t0); ((((t4,t5),(t26,t27)),((t2,t3),(((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))),(t16,(t15,t14)))))),t1,t0); (((t4,t5),((((t24,t25),((((t21,t22),(t19,t20)),(t17,t18)),t23)),(((t11,((t8,(t6,t7)),(t9,t10))),(t12,t13)),(t16,(t15,t14)))),((t26,t27),(t2,t3)))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(t16,(((t15,t14),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))),(t12,t13)))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),((t16,(t15,t14)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t12,t13)))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(t16,((t15,t14),((t11,((t8,(t6,t7)),(t9,t10))),((t12,t13),(t24,t25)))))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t24,t25),(t11,((t8,(t6,t7)),(t9,t10))))),(t16,(t15,t14)))),(t26,t27)),(t4,t5))),t1,t0); (((((((t24,t25),(((t21,t22),(t19,t20)),(t17,t18))),t23),((t12,t13),(((t15,t14),(t11,((t8,(t6,t7)),(t9,t10)))),t16))),((t2,t3),(t26,t27))),(t4,t5)),t1,t0); ((((t26,t27),((((t22,(t19,t20)),(t21,(t17,t18))),t23),((((t12,t13),(t11,((t8,(t6,t7)),(t9,t10)))),(t16,(t15,t14))),(t24,t25)))),((t4,t5),(t2,t3))),t1,t0); (((t4,t5),(((((t15,t14),((((t10,t9),((t6,t7),t8)),t11),((t24,t25),(t13,t12)))),((((t19,t20),(t21,t22)),(t17,t18)),t23)),t16),((t26,t27),(t3,t2)))),t1,t0); ((((t26,t27),(t3,t2)),((t4,t5),(((t15,t14),(((((t10,t9),((t6,t7),t8)),t11),(t24,t25)),(t16,(t13,t12)))),((((t19,t20),(t21,t22)),(t17,t18)),t23)))),t1,t0); ((((t26,t27),(t4,t5)),((((((t10,t9),((t6,t7),t8)),t11),(t16,((t13,t12),(t15,t14)))),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t24,t25))),(t3,t2))),t1,t0); (((t3,t2),(((t26,t27),(t4,t5)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t16,((t15,t14),(((t24,t25),(((t10,t9),((t6,t7),t8)),t11)),(t13,t12))))))),t1,t0); (((t4,t5),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((((t24,t25),(((t10,t9),((t6,t7),t8)),t11)),(t15,t14)),((t13,t12),t16))),((t3,t2),(t26,t27)))),t1,t0); (((t4,t5),((t26,t27),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t15,t14)),((t13,t12),(((t10,t9),((t6,t7),t8)),t11)))),(t3,t2)))),t1,t0); (((t4,t5),((t3,t2),((t26,t27),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((((t10,t9),((t6,t7),t8)),t11),(t16,((t15,t14),(t13,t12)))))))),t1,t0); (((((t3,t2),(t26,t27)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t15,t14)),(((((t10,t9),((t6,t7),t8)),t11),(t24,t25)),(t13,t12))))),(t4,t5)),t1,t0); (((((t3,t2),(t26,t27)),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(t16,((t15,t14),((((t10,t9),((t6,t7),t8)),t11),((t24,t25),(t13,t12))))))),(t4,t5)),t1,t0); ((((t3,t2),((t26,t27),(((((t19,t20),(t21,t22)),(t17,t18)),t23),(((t13,t12),((((t10,t9),((t6,t7),t8)),t11),(t24,t25))),(t16,(t15,t14)))))),(t4,t5)),t1,t0); (t1,((t5,t4),((((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),t16))),((t26,t27),(t3,t2)))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t11,((t9,t10),((t7,t6),t8))),((t15,t14),(((t24,t25),(t12,t13)),t16))))))),t0); (t1,(((t3,t2),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))))),((t5,t4),(t26,t27))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t12,t13)),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))))))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t24,t25),(t12,t13)),(t16,((t15,t14),(t11,((t9,t10),((t7,t6),t8)))))))))),t0); (t1,(((t3,t2),(t5,t4)),((((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t12,t13)),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14)))),(t26,t27))),t0); (t1,(t27,(((t26,(t3,t2)),(t5,t4)),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14))),(t24,t25))))),t0); (t1,((t5,t4),((t27,t26),((t3,t2),(((t12,t13),(t16,((t15,t14),(t11,((t9,t10),((t7,t6),t8)))))),((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)))))),t0); (t1,((t3,t2),(((((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t12,t13),((t24,t25),(t11,((t9,t10),((t7,t6),t8))))),((t15,t14),t16))),(t27,t26)),(t5,t4))),t0); (t1,((t3,t2),((t27,t26),((t5,t4),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t24,t25),(((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t15,t14)))))))),t0); (t1,(((t5,t4),(t27,t26)),((t16,((t14,t15),(((t24,t25),(t23,((t21,(t18,t17)),(t22,(t19,t20))))),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13))))),(t2,t3))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),((((t18,t17),((t21,t22),(t19,t20))),((t24,t25),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t7,t6))))))))),t0); (t1,((t2,t3),((((t24,t25),(t23,((t21,(t18,t17)),(t22,(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t14,t15)),((t12,t13),t16))))),t0); (t1,((((t23,(((t18,t17),((t21,t22),(t19,t20))),(t24,t25))),((t14,t15),(((t12,t13),t16),(t11,((t10,t9),(t8,(t7,t6))))))),(t2,t3)),((t5,t4),(t26,t27))),t0); (t1,((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,(t14,t15)),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t7,t6))))))),(t5,t4)),((t26,t27),(t2,t3))),t0); (t1,((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t11,((t10,t9),(t8,(t7,t6)))),((t16,(t14,t15)),((t24,t25),(t12,t13))))),(t5,t4)),((t26,t27),(t2,t3))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),(t16,(((t14,t15),((t12,t13),(t11,((t10,t9),(t8,(t7,t6)))))),((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))))))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,((t12,t13),((t11,((t10,t9),(t8,(t7,t6)))),(t24,t25)))),(t14,t15))))),t0); (t1,(((t2,t3),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t14,t15),t16),((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t25,t24))))))),(t5,t4)),t0); (t1,((t2,t3),(((t26,t27),((((t25,t24),(t23,((t17,t18),(((t19,t20),t21),t22)))),((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t12,t13)))),t16)),(t5,t4))),t0); (t1,(((t26,t27),((t23,(((t17,t18),((t19,t20),(t21,t22))),(t25,t24))),(((t14,t15),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13))))),((t5,t4),(t2,t3))),t0); (t1,((t27,((((t25,t24),(t23,((t17,t18),((t19,t20),(t21,t22))))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)))),t26)),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),((((t23,((t17,t18),((t19,t20),(t21,t22)))),(((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13))),(t25,t24))),(t26,t27)),(t5,t4))),t0); (t1,((t2,t3),((((t23,((t17,t18),(t21,(t22,(t19,t20))))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13))))),(t26,t27)),(t5,t4))),t0); (t1,(((t2,t3),(t26,t27)),((t5,t4),((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13)))))))),t0); (t1,((t27,((t2,t3),t26)),((t5,t4),((((t23,(((t19,t20),t21),(t22,(t17,t18)))),(t25,t24)),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t14,t15))))),t0); (t1,(((((t23,(((t19,t20),(t22,t21)),(t17,t18))),(t25,t24)),((t12,t13),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15)))),t16),(((t2,t3),(t26,t27)),(t5,t4))),t0); (t1,((t2,t3),((((((t19,t20),(t22,t21)),(t17,t18)),((t25,t24),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t7,t6))))))),((t5,t4),(t26,t27)))),t0); ((((((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),(t16,(t12,t13)))),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t5,t4),((t26,t27),(t2,t3)))),t1,t0); ((((t26,t27),(((t16,(t12,t13)),((t11,((t9,t10),(t8,(t6,t7)))),(t15,t14))),((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))))),((t2,t3),(t5,t4))),t1,t0); (((t2,t3),((t5,t4),((t26,t27),((t23,((t21,(t19,t20)),(t22,(t18,t17)))),(((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),(t24,t25)))))),t1,t0); (((t5,t4),(((t2,t3),(t26,t27)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((t15,t14),(t16,(((t11,((t9,t10),(t8,(t6,t7)))),(t24,t25)),(t12,t13))))))),t1,t0); (((t5,t4),(((t2,t3),(t26,t27)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t11,((t9,t10),(t8,(t6,t7)))),(t24,t25)),(t15,t14)),(t16,(t12,t13)))))),t1,t0); ((((t26,t27),(((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),(((t15,t14),t16),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))))),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),t16)))),((t26,t27),(t5,t4)))),t1,t0); ((((t26,t27),((((t24,t25),(((t18,t17),((t19,t20),(t21,t22))),t23)),((t15,t14),((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))))),t16)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),(((t26,t27),((((t18,t17),((t19,t20),(t21,t22))),t23),((t16,(t12,t13)),((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((((t18,t17),((t19,t20),(t21,t22))),t23),(((t24,t25),(t11,((t9,t10),(t8,(t6,t7))))),((t16,(t12,t13)),(t15,t14))))),(t5,t4))),t1,t0); (((t2,t3),(t27,((t5,t4),(t26,((t16,((t14,t15),((t24,t25),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))))),(t23,((t18,t17),((t22,t21),(t19,t20))))))))),t1,t0); ((((((t12,t13),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15))),((t24,t25),(t23,((t18,t17),(t22,(t21,(t19,t20))))))),(((t2,t3),(t26,t27)),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),(((((t12,t13),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t14,t15))),(t24,t25)),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),(((t16,(t14,t15)),((t11,((t9,t10),(t8,(t7,t6)))),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((((t12,t13),(t11,((t9,t10),(t8,(t7,t6))))),((t14,t15),t16)),((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t11,((t9,t10),(t8,(t7,t6)))),((t12,t13),(t24,t25))),(t14,t15)),t16))),(t5,t4))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25))),((t12,t13),t16)))),(t5,t4))),t1,t0); ((((t26,t27),((t23,((t24,t25),((t18,t17),((t19,t20),(t22,t21))))),(t16,((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t12,t13)))))),((t5,t4),(t2,t3))),t1,t0); ((((t26,t27),(t2,t3)),((((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)),((t11,((t9,t10),(t8,(t7,t6)))),((t14,t15),(t16,(t12,t13))))),(t5,t4))),t1,t0); ((((t5,t4),((t26,t27),(((t24,t25),(((t18,t17),(t22,(t21,(t19,t20)))),t23)),((t12,t13),((t16,(t11,((t9,t10),(t8,(t7,t6))))),(t14,t15)))))),(t2,t3)),t1,t0); ((((t27,t26),((t23,((t18,t17),((t20,t19),(t22,t21)))),((t16,(t14,t15)),((t12,t13),((t11,((t10,t9),(t8,(t7,t6)))),(t24,t25)))))),((t5,t4),(t2,t3))),t1,t0); (((((t2,t3),(t27,t26)),(((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t7,t6)))))))),(t5,t4)),t1,t0); ((((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t11,((t10,t9),(t8,(t7,t6)))),((t14,t15),(t12,t13)))),t16),(((t5,t4),(t2,t3)),(t27,t26))),t1,t0); (((t5,t4),((t2,t3),((t27,t26),((t23,((t18,t17),((t20,t19),(t22,t21)))),(((t12,t13),((t24,t25),(t11,((t10,t9),(t8,(t7,t6)))))),(t16,(t14,t15))))))),t1,t0); (((((t23,((t18,t17),((t20,t19),(t22,t21)))),(t16,((t14,t15),((t11,((t10,t9),(t8,(t7,t6)))),((t12,t13),(t24,t25)))))),(t5,t4)),((t2,t3),(t27,t26))),t1,t0); ((((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),(t16,(t14,t15)))),(t5,t4)),(t27,(t26,(t2,t3)))),t1,t0); ((((t27,t26),((t16,(t14,t15)),((((t18,t17),((t20,t19),(t22,t21))),((t24,t25),t23)),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13))))),((t2,t3),(t5,t4))),t1,t0); ((((t27,t26),((((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),(((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)),(t14,t15))),t16)),((t2,t3),(t5,t4))),t1,t0); (((((t2,t3),(t27,t26)),(((t14,t15),(((t24,t25),(t23,((t18,t17),((t20,t19),(t22,t21))))),((t11,((t10,t9),(t8,(t7,t6)))),(t12,t13)))),t16)),(t5,t4)),t1,t0); ((((((t23,((t18,t17),((t20,t19),(t22,t21)))),((t14,t15),(t16,((t11,((t10,t9),(t8,(t7,t6)))),((t24,t25),(t12,t13)))))),(t2,t3)),(t27,t26)),(t5,t4)),t1,t0); (((t2,t3),(((((t25,t24),(((t20,t19),(t21,t22)),(t17,t18))),t23),((t26,t27),(t5,t4))),((t13,t12),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11))))),t1,t0); (((t2,t3),((t5,t4),((((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t14,t15)),((t25,t24),((((t20,t19),(t21,t22)),(t17,t18)),t23))),t16),(t26,t27)))),t1,t0); (((((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t16,(t14,t15))),(t23,((t25,t24),(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); ((((((t16,((((t8,(t6,t7)),(t9,t10)),t11),((t13,t12),(t25,t24)))),(t14,t15)),((((t20,t19),(t21,t22)),(t17,t18)),t23)),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); ((((t2,t3),((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),((t14,t15),t16)),((t25,t24),(((t20,t19),((t21,t22),(t17,t18))),t23)))),((t26,t27),(t5,t4))),t1,t0); ((((t2,t3),(t5,t4)),((((((t8,(t6,t7)),(t9,t10)),t11),((t14,t15),((t13,t12),t16))),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23))),(t26,t27))),t1,t0); ((((t2,t3),((((t14,t15),(((t25,t24),(t13,t12)),(((t8,(t6,t7)),(t9,t10)),t11))),t16),((((t22,t21),(t20,t19)),(t17,t18)),t23))),((t26,t27),(t5,t4))),t1,t0); ((((t2,t3),((((t13,t12),(((t8,(t6,t7)),(t9,t10)),t11)),(t16,(t14,t15))),(((t25,t24),((t21,((t20,t19),t22)),(t17,t18))),t23))),(t27,((t5,t4),t26))),t1,t0); (((t5,t4),(((t26,t27),(t2,t3)),((t16,((t14,t15),(((t25,t24),(t13,t12)),(((t8,(t6,t7)),(t9,t10)),t11)))),((((t20,t19),(t22,t21)),(t17,t18)),t23)))),t1,t0); ((t27,(((t2,t3),t26),(((((((t8,(t6,t7)),(t9,t10)),t11),(t25,t24)),(((t13,t12),t16),(t14,t15))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t5,t4)))),t1,t0); (t1,(((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12)))),t16)),((t5,t4),(t27,((t3,t2),t26)))),t0); (t1,((t5,t4),(((t3,t2),(t26,t27)),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t14,t15))),((t25,t24),t16))))),t0); (t1,(((t5,t4),(t3,t2)),((t26,t27),((t23,((t18,t17),((t21,t22),(t20,t19)))),(t16,((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12)))))))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15))))),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),((t25,t24),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15))))))),t0); (t1,((t3,t2),(((t5,t4),(t26,t27)),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))))),t0); (t1,(((t23,((t18,t17),((t21,t22),(t20,t19)))),((t14,t15),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t25,t24),t16)))),((t5,t4),((t3,t2),(t26,t27)))),t0); (t1,((t16,((((t23,((t18,t17),((t21,t22),(t20,t19)))),(t25,t24)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))),(t14,t15))),((t3,t2),((t26,t27),(t5,t4)))),t0); (t1,((t16,((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t13,t12))),(t14,t15)))),((t5,t4),((t3,t2),(t26,t27)))),t0); (t1,(((t3,t2),(t26,t27)),(((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t25,t24),(t13,t12)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))),(t5,t4))),t0); (t1,((t2,t3),((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t12,t13),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t15,t14))),t16)),(t27,t26)),(t5,t4))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t15,t14),((((t24,t25),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),t16))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((t2,t3),(t27,t26)),((t5,t4),((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t24,t25),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14)))))),t0); (t1,((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t12,t13),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((((t24,t25),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t12,t13),t16),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9)))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t12,t13),t16),((t15,t14),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9))))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((t5,t4),(((t2,t3),((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),t16),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t12,t13))))),(t27,t26))),t0); (t1,(((t2,t3),((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),(t15,t14))),t16))),((t27,t26),(t5,t4))),t0); (t1,((((((t18,t17),((t20,t19),(t21,t22))),t23),(t16,(((t24,t25),(((((t7,t6),t8),(t9,t10)),t11),(t13,t12))),(t14,t15)))),(t27,t26)),((t4,t5),(t2,t3))),t0); (t1,((((((t18,t17),(t22,((t20,t19),t21))),t23),(((t13,t12),(t24,t25)),((((((t7,t6),t8),(t9,t10)),t11),(t14,t15)),t16))),(t27,t26)),((t4,t5),(t2,t3))),t0); (t1,((t2,t3),((((((t18,t17),((t20,t19),(t21,t22))),t23),((t14,t15),(t16,(((((t7,t6),t8),(t9,t10)),t11),((t24,t25),(t13,t12)))))),(t27,t26)),(t4,t5))),t0); (t1,((t4,t5),((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((t13,t12),t16),(((((t7,t6),t8),(t9,t10)),t11),(t14,t15)))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),(t2,t3)),((t27,t26),((((t18,t17),((t20,t19),(t21,t22))),t23),(((t24,t25),(t13,t12)),(((((t7,t6),t8),(t9,t10)),t11),(t16,(t14,t15))))))),t0); (t1,((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),((t16,(t14,t15)),((t13,t12),((((t7,t6),t8),(t9,t10)),t11)))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),((t23,((t24,t25),((t18,t17),((t20,t19),(t21,t22))))),((t16,(t14,t15)),((t13,t12),((((t7,t6),t8),(t9,t10)),t11)))))),t0); (t1,((t2,t3),(((t27,t26),(t4,t5)),(((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((((t7,t6),t8),(t9,t10)),t11),(t16,((t14,t15),(t13,t12))))))),t0); (t1,(((t26,(t4,t5)),(((((t24,t25),(((t18,t17),((t20,t19),(t21,t22))),t23)),(((((t7,t6),t8),(t9,t10)),t11),((t14,t15),(t13,t12)))),t16),(t2,t3))),t27),t0); (t1,((((((t18,t17),((t20,t19),(t21,t22))),t23),(((t14,t15),((t24,t25),((((t7,t6),t8),(t9,t10)),t11))),(t16,(t13,t12)))),(t2,t3)),((t26,t27),(t4,t5))),t0); (t1,(((t26,t27),(((((t21,t22),(t19,t20)),(t17,t18)),t23),(((t12,t13),((t24,t25),(t11,((t10,t9),(t8,(t6,t7)))))),((t14,t15),t16)))),((t3,t2),(t5,t4))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),((((t24,t25),((((t21,t22),(t19,t20)),(t17,t18)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),(t12,t13)))),t16)))),t0); (t1,(((t3,t2),(((t24,t25),(((t22,((t19,t20),t21)),(t17,t18)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),(t16,(t12,t13)))))),((t5,t4),(t26,t27))),t0); (t1,((t5,t4),((t26,t27),((t3,t2),(((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t12,t13)),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15))))))),t0); (t1,((t3,t2),((t5,t4),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t14,t15),t16),((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))))),(t26,t27)))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((t14,t15),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),t0); (t1,((t3,t2),((((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))))),((t26,t27),(t5,t4)))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t12,t13),t16),((t14,t15),(t11,((t10,t9),(t8,(t6,t7))))))))),t0); (t1,(((t26,t27),((t3,t2),(t5,t4))),(((t24,t25),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),((t14,t15),t16)))),t0); (t1,((t5,t4),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t12,t13)),((t14,t15),t16))),((t3,t2),(t26,t27)))),t0); ((((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),((t13,t12),(((t14,t15),t16),(t11,(((t6,t7),t8),(t10,t9)))))),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); ((((t27,t26),(t4,t5)),((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),(((t14,t15),t16),((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)))),(t2,t3))),t1,t0); (((t2,t3),(((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),(((t14,t15),t16),((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)))),(t26,t27)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),((((t14,t15),t16),(((t11,(((t6,t7),t8),(t10,t9))),(t13,t12)),((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)))),(t26,t27)))),t1,t0); (((t2,t3),(((((t24,t25),(((t18,t17),((t22,t21),(t19,t20))),t23)),((t14,t15),(t16,((t11,(((t6,t7),t8),(t10,t9))),(t13,t12))))),(t26,t27)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),(((((t18,t17),((t22,t21),(t19,t20))),t23),(((t14,t15),t16),((t13,t12),((t11,(((t6,t7),t8),(t10,t9))),(t24,t25))))),(t26,t27)))),t1,t0); ((((((t16,(t13,t12)),((t14,t15),(t11,(((t6,t7),t8),(t10,t9))))),((((t18,t17),((t22,t21),(t19,t20))),t23),(t24,t25))),(t26,t27)),((t4,t5),(t2,t3))),t1,t0); (((t2,t3),(((((t18,t17),((t22,t21),(t19,t20))),t23),((t14,t15),(t16,((t13,t12),((t11,(((t6,t7),t8),(t10,t9))),(t24,t25)))))),((t26,t27),(t4,t5)))),t1,t0); ((((t4,t5),((((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),(t16,(t13,t12))),(t11,(((t6,t7),t8),(t10,t9))))),t26)),(t27,(t2,t3))),t1,t0); (((t4,t5),((((t23,(((t18,t17),((t22,t21),(t19,t20))),(t24,t25))),(((t13,t12),(t11,(((t6,t7),t8),(t10,t9)))),(t16,(t14,t15)))),(t26,t27)),(t2,t3))),t1,t0); (t1,((t3,t2),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),((t16,(t13,t12)),((((t9,t10),(t8,(t6,t7))),t11),(t15,t14)))),((t4,t5),(t27,t26)))),t0); (t1,((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t13,t12)),(((t25,t24),(((t9,t10),(t8,(t6,t7))),t11)),(t15,t14)))),(t27,t26)),((t3,t2),(t4,t5))),t0); (t1,((t4,t5),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),((t27,t26),(t3,t2)))),t0); (t1,(((t4,t5),(t3,t2)),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),(t27,t26))),t0); (t1,((t4,t5),((((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t13,t12),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16))),((t3,t2),(t27,t26)))),t0); (t1,((t4,t5),((t27,(t26,((((t18,t17),((t21,t22),(t19,t20))),t23),(((t25,t24),t16),((((t9,t10),(t8,(t6,t7))),t11),((t13,t12),(t15,t14))))))),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),((((t16,(t13,t12)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),((((t18,t17),((t21,t22),(t19,t20))),t23),(t25,t24))),(t27,t26)))),t0); (t1,((t4,t5),(((((t15,t14),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12)))),(((t18,t17),((t21,t22),(t19,t20))),t23)),t16),((t27,t26),(t3,t2)))),t0); (t1,(((((t25,t24),(t13,t12)),((t16,(t15,t14)),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t21,t22),(t19,t20))),t23)),(((t27,t26),(t3,t2)),(t4,t5))),t0); (t1,(((((t16,(t15,t14)),((((t9,t10),(t8,(t6,t7))),t11),(t13,t12))),((t25,t24),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t3,t2)),((t4,t5),(t27,t26))),t0); (((t5,t4),((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),((t7,t6),t8)))))),((t3,t2),(t26,t27)))),t1,t0); (((t3,t2),(((t5,t4),(t26,t27)),((t16,(t15,t14)),(((t12,t13),(t11,((t10,t9),((t7,t6),t8)))),((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),(((t25,t24),(t23,(((t18,t17),((t19,t20),t21)),t22))),((t16,((t15,t14),(t11,((t10,t9),((t7,t6),t8))))),(t12,t13))))),t1,t0); ((((t3,t2),(t26,t27)),((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t11,((t10,t9),((t7,t6),t8))),(((t12,t13),t16),(t15,t14)))),(t5,t4))),t1,t0); ((((t3,t2),(t5,t4)),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t15,t14))),(t25,t24))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t15,t14),((t11,((t10,t9),((t7,t6),t8))),((t25,t24),(t12,t13)))),t16)))),t1,t0); ((((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t25,t24),(t12,t13)),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),((t5,t4),(t3,t2))),t1,t0); ((((t26,((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t25,t24),(t12,t13)),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),((t5,t4),(t3,t2))),t27),t1,t0); ((((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t12,t13),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8)))))),((t27,t26),(t3,t2))),(t5,t4)),t1,t0); ((((t5,t4),(t3,t2)),(((t23,((t18,t17),((t19,t20),(t22,t21)))),((t25,t24),((t12,t13),((t16,(t15,t14)),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26))),t1,t0); (((t5,t4),((t26,t27),(((((((t9,t10),((t6,t7),t8)),t11),(t12,t13)),(t16,(t14,t15))),((((t18,t17),((t20,t19),(t22,t21))),t23),(t25,t24))),(t2,t3)))),t1,t0); (((t2,t3),(((t5,t4),(t26,t27)),(t16,((t14,t15),(((((t18,t17),((t20,t19),(t22,t21))),t23),(t25,t24)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13))))))),t1,t0); (((t5,t4),(((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(((t12,t13),(t14,t15)),t16)),(((t18,t17),((t20,t19),(t22,t21))),t23)),((t26,t27),(t2,t3)))),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),(t16,(t14,t15)))))),(t2,t3)),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,((t14,t15),(((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13))))))),(t2,t3)),t1,t0); (((t5,t4),((t27,t26),((t2,t3),((((t18,t17),((t20,t19),(t22,t21))),t23),(((t14,t15),((t25,t24),(((t9,t10),((t6,t7),t8)),t11))),(t16,(t12,t13))))))),t1,t0); ((((t2,t3),((((t18,t17),((t20,t19),(t22,t21))),t23),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(((t9,t10),((t6,t7),t8)),t11))))),((t5,t4),(t27,t26))),t1,t0); ((((t5,t4),((t27,t26),((((t18,t17),((t20,t19),(t22,t21))),t23),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(((t9,t10),((t6,t7),t8)),t11)))))),(t2,t3)),t1,t0); ((((t5,t4),((((t18,t17),((t20,t19),(t22,t21))),t23),(((t16,(t14,t15)),((((t9,t10),((t6,t7),t8)),t11),(t12,t13))),(t25,t24)))),((t27,t26),(t2,t3))),t1,t0); (((t5,t4),(((((t18,t17),(t22,(t21,(t20,t19)))),t23),(t16,((t14,t15),((((t9,t10),((t6,t7),t8)),t11),((t25,t24),(t12,t13)))))),((t27,t26),(t2,t3)))),t1,t0); ((((t26,((t4,t5),(((((t24,t25),(t12,t13)),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),t16))),t27),(t3,t2)),t1,t0); (((t4,t5),(((t16,(((t12,t13),(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9))))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),((t27,t26),(t3,t2)))),t1,t0); ((((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(((t27,t26),(t3,t2)),(t4,t5))),t1,t0); ((((t27,t26),(t3,t2)),((t4,t5),((t16,(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),(t15,t14)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t1,t0); ((((t4,t5),((((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t24,t25))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t27,t26))),(t3,t2)),t1,t0); (((t4,t5),(((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),((t3,t2),(t27,t26)))),t1,t0); (((t3,t2),(((t27,t26),(((t15,t14),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t4,t5))),t1,t0); (((t3,t2),((t27,(t26,((((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t16,(t15,t14))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))))),(t4,t5))),t1,t0); (((t4,t5),((t3,t2),(((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t12,t13),((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25))),(t16,(t15,t14)))),(t27,t26)))),t1,t0); (((t3,t2),(((t23,((t18,t17),((t22,t21),(t20,t19)))),(((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),t16),(t15,t14)),(t24,t25))),((t4,t5),(t27,t26)))),t1,t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),(((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t16,(t15,t14)),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))))))),t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),(((((t22,t21),(t20,t19)),(t18,t17)),t23),((t16,(t15,t14)),((t12,t13),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9))))))))),t0); (t1,(((t5,t4),((((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14))),(t12,t13)),(((((t22,t21),(t20,t19)),(t18,t17)),t23),(t25,t24)))),((t26,t27),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),(t27,(t26,(((t15,t14),(((t11,((t8,(t7,t6)),(t10,t9))),((t25,t24),(t12,t13))),t16)),((((t22,t21),(t20,t19)),(t18,t17)),t23)))))),t0); (t1,((t5,t4),((((((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)),(t16,(t15,t14))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t5,t4),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t16,((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t12,t13)))),(t25,t24))),(t27,t26)))),t0); (t1,(((t3,t2),(t27,t26)),((t5,t4),((((t12,t13),((t15,t14),(t11,((t8,(t7,t6)),(t10,t9))))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),t16))),t0); (t1,((((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((t25,t24),((((t22,t21),(t20,t19)),(t18,t17)),t23))),((t27,t26),(t5,t4))),(t3,t2)),t0); (t1,((t5,t4),((((((t25,t24),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t3,t2),(t27,t26)))),t0); (t1,((((((t25,t24),(t12,t13)),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t15,t14))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(((t3,t2),(t27,t26)),(t5,t4))),t0); (((t5,t4),((((t16,(t14,t15)),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10))))),(((t25,t24),(((t19,t20),(t22,t21)),(t17,t18))),t23)),((t3,t2),(t27,t26)))),t1,t0); (((((t16,((t25,t24),(t13,t12))),((t11,((t8,(t7,t6)),(t9,t10))),(t14,t15))),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t5,t4),((t3,t2),(((t16,(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t14,t15))),((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23))),(t27,t26)))),t1,t0); (((t5,t4),((t16,((((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10))))),(t14,t15))),((t27,t26),(t3,t2)))),t1,t0); (((t3,t2),(((((((t19,t20),(t22,t21)),(t17,t18)),t23),(((t13,t12),((t11,((t8,(t7,t6)),(t9,t10))),(t25,t24))),((t14,t15),t16))),(t27,t26)),(t5,t4))),t1,t0); (((t5,t4),((((((t19,t20),(t22,t21)),(t17,t18)),t23),(t16,(((t25,t24),(t13,t12)),((t14,t15),(t11,((t8,(t7,t6)),(t9,t10))))))),((t3,t2),(t27,t26)))),t1,t0); (((((((t19,t20),(t22,t21)),(t17,t18)),t23),(t16,((t14,t15),((t25,t24),((t11,((t8,(t7,t6)),(t9,t10))),(t13,t12)))))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t3,t2),(((t27,t26),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t16,(t14,t15))))),(t5,t4))),t1,t0); ((((t27,t26),(((((t25,t24),(((t19,t20),(t22,t21)),(t17,t18))),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t14,t15))),t23),t16)),((t5,t4),(t3,t2))),t1,t0); (((((t3,t2),(t27,t26)),(t16,((t14,t15),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))))))),(t5,t4)),t1,t0); (t1,((t5,t4),(((t27,t26),((t16,((t14,t15),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),(t23,(((t17,t18),((t22,t21),(t20,t19))),(t25,t24))))),(t3,t2))),t0); (t1,((((t16,(t14,t15)),(((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),(t3,t2)),((t5,t4),(t27,t26))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t11,((t10,t9),(t8,(t6,t7)))),((t25,t24),(t13,t12))),(t16,(t14,t15)))),(t3,t2)),(t27,(t26,(t5,t4)))),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t25,t24),((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12))),(t16,(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,((((t23,((t17,t18),((t22,t21),(t20,t19)))),((((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7)))))),(t14,t15)),t16)),(t27,t26)),((t5,t4),(t3,t2))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),((t16,(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),((t27,t26),(t3,t2))),(t5,t4)),t0); (t1,((t3,t2),((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t16,(t13,t12)),(((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15)))),(t27,t26)),(t5,t4))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t11,((t10,t9),(t8,(t6,t7)))),((t14,t15),t16)),(t13,t12))),(t27,t26)),((t5,t4),(t3,t2))),t0); (t1,(((((t25,t24),(t23,((t17,t18),((t22,t21),(t20,t19))))),(((t13,t12),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t14,t15)))),(t27,t26)),((t5,t4),(t3,t2))),t0); ((((t26,t27),(((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),(((t14,t15),t16),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11))))),((t5,t4),(t2,t3))),t1,t0); ((((t26,t27),(((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),((((t10,t9),(t8,(t6,t7))),t11),((t14,t15),(t16,(t13,t12)))))),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),(((t26,t27),((t23,((t19,t20),((t18,t17),(t21,t22)))),(((t13,t12),((t24,t25),(((t10,t9),(t8,(t6,t7))),t11))),(t16,(t14,t15))))),(t5,t4))),t1,t0); ((((t2,t3),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),((t24,t25),(((t10,t9),(t8,(t6,t7))),t11))),(t16,(t14,t15))))),((t5,t4),(t26,t27))),t1,t0); (((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t24,t25),((((t10,t9),(t8,(t6,t7))),t11),(t13,t12))),(t16,(t14,t15)))),(t26,t27)),((t2,t3),(t5,t4))),t1,t0); (((((((t24,t25),t23),(((t22,t21),(t19,t20)),(t18,t17))),((t13,t12),((t16,(t14,t15)),(((t10,t9),(t8,(t6,t7))),t11)))),((t26,t27),(t2,t3))),(t5,t4)),t1,t0); ((((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t13,t12)),((t14,t15),(((t10,t9),(t8,(t6,t7))),t11)))),(t26,t27)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((((t10,t9),(t8,(t6,t7))),t11),((t16,(t13,t12)),(t14,t15))),(t24,t25))),(t26,t27)),(t5,t4))),t1,t0); ((((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),(((t14,t15),(((t10,t9),(t8,(t6,t7))),t11)),((t13,t12),t16))),(t26,t27)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t16,(t14,t15)),((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t24,t25))))),(t26,t27)),(t5,t4))),t1,t0); (((((t23,(((t20,t19),t22),(t21,(t18,t17)))),((t24,t25),((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t16,(t15,t14)))))),(t27,t26)),((t5,t4),(t2,t3))),t1,t0); (((t2,t3),((((((t13,t12),((((t10,t9),(t8,(t6,t7))),t11),(t15,t14))),((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t24,t25))),t16),(t27,t26)),(t5,t4))),t1,t0); (((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),((t16,(t15,t14)),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11))))),((t2,t3),(t27,t26))),(t5,t4)),t1,t0); (((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),(((t15,t14),(t16,(t13,t12))),(((t10,t9),(t8,(t6,t7))),t11)))),((t2,t3),(t27,t26))),(t5,t4)),t1,t0); (((t2,t3),(((t26,t27),(t5,t4)),(t16,((t15,t14),(((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t24,t25))))))),t1,t0); (((t5,t4),((((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t15,t14),(((t13,t12),(t24,t25)),(t16,(((t10,t9),(t8,(t6,t7))),t11))))),(t2,t3)),(t26,t27))),t1,t0); ((((t26,t27),(t2,t3)),((t5,t4),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t16,(t15,t14)),((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)))))),t1,t0); (((t5,t4),(((t23,(((t20,t19),(t21,t22)),(t18,t17))),((((t24,t25),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),(t13,t12))),t16)),(t27,((t2,t3),t26)))),t1,t0); ((((t2,t3),(t26,t27)),((t5,t4),((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t24,t25),(((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),t16)))))),t1,t0); (((t5,t4),(((((t13,t12),(((t10,t9),(t8,(t6,t7))),t11)),((t15,t14),t16)),((t23,((t21,(t22,(t20,t19))),(t18,t17))),(t24,t25))),((t2,t3),(t26,t27)))),t1,t0); (((t3,t2),(((t27,t26),(((((t22,t21),(t20,t19)),(t18,t17)),t23),((((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t14,t15))))),(t4,t5))),t1,t0); (((((((t22,t21),(t20,t19)),(t18,t17)),t23),(((t13,t12),((t11,((t8,(t6,t7)),(t10,t9))),(t24,t25))),(t16,(t14,t15)))),((t4,t5),((t3,t2),(t27,t26)))),t1,t0); ((((((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))),(t27,t26)),((t4,t5),(t3,t2))),t1,t0); ((((((t24,t25),(((t20,t19),((t18,t17),(t22,t21))),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),(t16,(t14,t15)))),((t3,t2),(t27,t26))),(t4,t5)),t1,t0); (((t4,t5),((((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),((((t18,t17),((t22,t21),(t20,t19))),t23),((t13,t12),(t14,t15)))),t16),(t27,t26)),(t3,t2))),t1,t0); (((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),((t24,t25),t23)),((t13,t12),((t11,((t8,(t6,t7)),(t10,t9))),(t16,(t14,t15))))),(t27,t26)))),t1,t0); (((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),((t24,t25),t23)),(((t14,t15),((t13,t12),(t11,((t8,(t6,t7)),(t10,t9))))),t16)),(t27,t26)))),t1,t0); ((((t3,t2),(t16,((t11,((t8,(t6,t7)),(t10,t9))),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t14,t15),(t13,t12)))))),((t27,t26),(t4,t5))),t1,t0); (((t4,t5),(((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),(t14,t15)),(t16,(t13,t12)))),((t3,t2),(t27,t26)))),t1,t0); ((((t4,t5),(((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,((t13,t12),((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t27,t26))),(t3,t2)),t1,t0); (t1,(((t2,t3),((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23))))),((t5,t4),(t27,t26))),t0); (t1,((((t27,t26),(t2,t3)),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12))))),(t5,t4)),t0); (t1,(((t27,t26),(t2,t3)),((((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t13,t12),((t16,(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9)))))),(t5,t4))),t0); (t1,((t5,t4),(((t27,t26),(t2,t3)),(((t24,t25),((((t22,t21),(t19,t20)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)))))),t0); (t1,(((t27,t26),(t2,t3)),((((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t15,t14),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t13,t12)))),(t24,t25))),(t5,t4))),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(t16,((t15,t14),(((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)),(t16,(t15,t14))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),(t13,t12)),(t16,(t15,t14))))),(t5,t4)),(t2,t3)),t0); (t1,((((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),(((t13,t12),(t24,t25)),((t16,(t15,t14)),(t11,((t8,(t7,t6)),(t10,t9))))))),(t5,t4)),(t2,t3)),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((((t22,t21),(t19,t20)),(t18,t17)),t23),((t16,(t15,t14)),(((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25)),(t13,t12))))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),(((t18,t17),((t22,t21),(t19,t20))),t23))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t15,t14),((((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))),t16)),(((t18,t17),((t22,t21),(t19,t20))),t23))))),t0); (t1,((t2,t3),((t4,t5),(t27,(t26,((t16,((t15,t14),(((t25,t24),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7))))))),(((t18,t17),((t22,t21),(t19,t20))),t23)))))),t0); (t1,((t2,t3),((t4,t5),(((((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24))),(t16,(t15,t14))),(((t18,t17),((t22,t21),(t19,t20))),t23)),(t27,t26)))),t0); (t1,(((t27,t26),(t2,t3)),((t4,t5),((t16,(((t15,t14),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(((t25,t24),((t18,t17),((t22,t21),(t19,t20)))),t23)))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t15,t14)))),((t25,t24),(((t18,t17),((t22,t21),(t19,t20))),t23)))))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),(((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(((t18,t17),((t21,(t19,t20)),t22)),t23))))),t0); (t1,((((t16,(t15,t14)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t4,t5),(((((((t25,t24),(t11,((t9,t10),(t8,(t6,t7))))),((t15,t14),(t12,t13))),(((t18,t17),((t19,t20),(t22,t21))),t23)),t16),(t2,t3)),(t27,t26))),t0); (t1,((t2,t3),(((t27,t26),(((t15,t14),(((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)))),t16)),(t4,t5))),t0); ((((((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(((t13,t12),(((t9,t10),((t7,t6),t8)),t11)),((t15,t14),t16))),((t5,t4),(t26,t27))),(t3,t2)),t1,t0); ((((t5,t4),((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t16,((t13,t12),(((t24,t25),(((t9,t10),((t7,t6),t8)),t11)),(t15,t14))))))),(t3,t2)),t1,t0); ((((t5,t4),((t26,t27),(((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))))),(t3,t2)),t1,t0); (((t27,(t26,(t5,t4))),((((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),(t3,t2))),t1,t0); ((((t5,t4),(t27,t26)),(((((t15,t14),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),t16),(t3,t2))),t1,t0); (((((t3,t2),(t5,t4)),(t27,t26)),(((t15,t14),((((t24,t25),(((t9,t10),((t7,t6),t8)),t11)),(t13,t12)),((((t22,t21),(t19,t20)),(t17,t18)),t23))),t16)),t1,t0); (((t3,t2),((t5,t4),((t27,t26),(((((t22,t21),(t19,t20)),(t17,t18)),t23),((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t24,t25)))))))),t1,t0); (((t3,t2),((t5,t4),((t27,t26),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t16,(t15,t14)),((((t9,t10),((t7,t6),t8)),t11),(t13,t12))))))),t1,t0); ((((t27,t26),(t5,t4)),((((((t22,t21),(t19,t20)),(t17,t18)),t23),((((t13,t12),t16),(t15,t14)),((t24,t25),(((t9,t10),((t7,t6),t8)),t11)))),(t3,t2))),t1,t0); (((t5,t4),((((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t15,t14),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t24,t25)))),t16)),((t3,t2),(t27,t26)))),t1,t0); (t1,((t5,t4),((t26,t27),((t2,t3),((t23,(((t18,t17),t22),((t21,t19),t20))),(((t15,t14),t16),((t13,t12),((t25,t24),(((t9,t10),((t7,t6),t8)),t11)))))))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t25,t24),(t23,((t18,t17),(t22,(t21,(t19,t20)))))),((((t9,t10),((t7,t6),t8)),t11),(((t15,t14),t16),(t13,t12))))))),t0); (t1,((t2,t3),(((t27,t26),(t5,t4)),(((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((((t9,t10),((t7,t6),t8)),t11),(((t13,t12),t16),(t15,t14)))))),t0); (t1,((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t16,(t15,t14))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,((((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t15,t14),(((t25,t24),(((t9,t10),((t7,t6),t8)),t11)),(t13,t12))),t16)),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,((((t23,((t18,t17),((t19,t20),(t22,t21)))),(((((t9,t10),((t7,t6),t8)),t11),((t13,t12),(t25,t24))),(t16,(t15,t14)))),(t2,t3)),(t27,(t26,(t5,t4)))),t0); (t1,((t2,t3),((t5,t4),((t27,t26),((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,((t15,t14),(((((t9,t10),((t7,t6),t8)),t11),(t13,t12)),(t25,t24)))))))),t0); (t1,(((t27,t26),((t23,((t18,t17),((t19,t20),(t22,t21)))),((t15,t14),(((((t9,t10),((t7,t6),t8)),t11),(t13,t12)),(t16,(t25,t24)))))),((t2,t3),(t5,t4))),t0); (t1,(((t27,t26),((t2,t3),((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t15,t14),((((t9,t10),((t7,t6),t8)),t11),(t13,t12)))),t16))),(t5,t4)),t0); (t1,(((((t23,((t18,t17),((t19,t20),(t22,t21)))),(t25,t24)),((t13,t12),((t16,(t15,t14)),(((t9,t10),((t7,t6),t8)),t11)))),((t27,t26),(t2,t3))),(t5,t4)),t0); ((((((((t20,t19),t21),t22),(t17,t18)),t23),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),((t25,t24),(t12,t13))))),((t5,t4),((t3,t2),(t27,t26)))),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),((((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t25,t24),(t12,t13)),((t14,t15),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); (((t5,t4),((t3,t2),((t27,t26),(((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t12,t13),(t16,(t14,t15))),((t11,((t8,(t6,t7)),(t10,t9))),(t25,t24))))))),t1,t0); (((((t25,t24),(((((t20,t19),t21),(t17,t18)),t22),t23)),(((t14,t15),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13))),t16)),(((t5,t4),(t3,t2)),(t27,t26))),t1,t0); (((((t3,t2),(t27,t26)),(t16,(((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),((t12,t13),(t14,t15)))))),(t5,t4)),t1,t0); ((((t3,t2),(t27,((((t25,t24),((((t20,t19),(t22,t21)),(t17,t18)),t23)),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13)))),t26))),(t5,t4)),t1,t0); ((((t3,t2),(((t23,((t25,t24),(((t20,t19),(t22,t21)),(t17,t18)))),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t12,t13)))),(t26,t27))),(t5,t4)),t1,t0); ((((t3,t2),(((((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),((t12,t13),(t14,t15)))),t16),(t26,t27))),(t5,t4)),t1,t0); ((((t3,t2),((((((t20,t19),(t22,t21)),(t17,t18)),t23),((((t12,t13),(t25,t24)),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t14,t15)))),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),(((((((t20,t19),(t22,t21)),(t17,t18)),t23),((t25,t24),((t12,t13),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9))))))),(t26,t27)),(t5,t4))),t1,t0); (((t3,t2),(((t27,t26),((t16,((t14,t15),((t11,((t10,t9),((t6,t7),t8))),((t24,t25),(t13,t12))))),((((t20,t19),(t21,t22)),(t18,t17)),t23))),(t4,t5))),t1,t0); (((((t3,t2),(t27,t26)),(((t14,t15),(((t11,((t10,t9),((t6,t7),t8))),((t24,t25),(t13,t12))),t16)),((((t20,t19),(t21,t22)),(t18,t17)),t23))),(t4,t5)),t1,t0); (((t3,t2),(((t27,t26),(((t13,t12),((t16,(t14,t15)),(t11,((t10,t9),((t6,t7),t8))))),(((t21,(t22,(t20,t19))),(t18,t17)),((t24,t25),t23)))),(t4,t5))),t1,t0); (((t3,t2),(((t27,t26),((t23,(((t20,t19),(t21,t22)),(t18,t17))),((t16,(t14,t15)),(((t24,t25),(t13,t12)),(t11,((t10,t9),((t6,t7),t8))))))),(t4,t5))),t1,t0); (((t4,t5),(((t27,t26),(t3,t2)),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t13,t12),((t11,((t10,t9),((t6,t7),t8))),(t16,(t14,t15))))))),t1,t0); (((t3,t2),((((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((t16,(t14,t15)),((t13,t12),(t11,((t10,t9),((t6,t7),t8)))))),((t27,t26),(t4,t5)))),t1,t0); (((t4,t5),(((t27,t26),(t3,t2)),(((t24,t25),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),(((t13,t12),t16),((t14,t15),(t11,((t10,t9),((t6,t7),t8)))))))),t1,t0); (((t3,t2),((((t24,t25),(t23,(((t20,t19),t22),(t21,(t18,t17))))),((t13,t12),((t11,((t10,t9),((t6,t7),t8))),(t16,(t14,t15))))),((t27,t26),(t4,t5)))),t1,t0); (((t4,t5),(((t23,((((t20,t19),t21),(t22,(t18,t17))),(t24,t25))),((t16,(t13,t12)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15)))),((t3,t2),(t27,t26)))),t1,t0); (((t3,t2),(((t4,t5),(t27,t26)),(((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22))))),(((t14,t15),((t13,t12),(t11,((t10,t9),((t6,t7),t8))))),t16)))),t1,t0); (((t4,t5),((((t25,t24),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13)))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),(((t25,t24),(t23,((t18,t17),(t22,(t21,(t19,t20)))))),(((t16,(t14,t15)),(t11,((t9,t10),(t8,(t7,t6))))),(t12,t13)))))),t1,t0); (((t2,t3),(((t23,((t18,t17),((t19,t20),(t22,t21)))),(((t14,t15),((t25,t24),(t11,((t9,t10),(t8,(t7,t6)))))),(t16,(t12,t13)))),((t4,t5),(t26,t27)))),t1,t0); ((((t2,t3),(t4,t5)),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,((t12,t13),((t14,t15),((t25,t24),(t11,((t9,t10),(t8,(t7,t6))))))))))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((t16,(t14,t15)),(((t12,t13),(t25,t24)),(t11,((t9,t10),(t8,(t7,t6)))))))))),t1,t0); ((((((t25,t24),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t14,t15),((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)))),t16),(((t4,t5),(t26,t27)),(t2,t3))),t1,t0); (((t2,t3),((t4,t5),(((t23,((t18,t17),((t19,t20),(t22,t21)))),(t16,(((t11,((t9,t10),(t8,(t7,t6)))),((t25,t24),(t12,t13))),(t14,t15)))),(t26,t27)))),t1,t0); ((((t2,t3),(t26,t27)),((t4,t5),(((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)),(((t11,((t9,t10),(t8,(t7,t6)))),(t12,t13)),((t14,t15),t16))))),t1,t0); (((t2,t3),(t27,(((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t25,t24),(t11,((t9,t10),(t8,(t7,t6))))),(t16,(t12,t13))),(t14,t15))),((t4,t5),t26)))),t1,t0); (((t2,t3),(((t27,t26),(((t25,t24),(t23,((t21,(t22,(t18,t17))),(t19,t20)))),(((t14,t15),t16),((t12,t13),(t11,((t9,t10),(t8,(t7,t6)))))))),(t4,t5))),t1,t0); (((t3,t2),(((t27,t26),(((((t20,t19),(t22,t21)),(t17,t18)),t23),(((t15,t14),((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),(t5,t4))),t1,t0); ((((t27,t26),((((t21,((t20,t19),t22)),(t17,t18)),t23),(((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t25,t24))),(t16,(t15,t14))))),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),(((((t21,(t20,t19)),(t17,t18)),t22),t23),((((t13,t12),((t25,t24),(t11,((t10,t9),(t8,(t6,t7)))))),(t15,t14)),t16))),(t5,t4))),t1,t0); (((t16,((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t25,t24))),(t15,t14)))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((((t3,t2),(t27,t26)),(t5,t4)),(((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),(((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14))))),t1,t0); (((t5,t4),((t3,t2),((((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),(((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14)))),(t27,t26)))),t1,t0); (((t5,t4),((t27,t26),((t3,t2),(((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t13,t12),(t16,((t15,t14),(t11,((t10,t9),(t8,(t6,t7))))))))))),t1,t0); ((((t5,t4),(t3,t2)),(((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14))),((t25,t24),(t13,t12)))),(t27,t26))),t1,t0); ((((((t25,t24),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),(t8,(t6,t7))))))),((t3,t2),(t27,t26))),(t5,t4)),t1,t0); ((((t27,t26),((((t17,t18),((t21,t22),(t20,t19))),t23),(((t25,t24),(t13,t12)),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14)))))),((t5,t4),(t3,t2))),t1,t0); (((t4,t5),(((t26,t27),(t3,t2)),((t16,(((t12,t13),(t15,t14)),(t11,((t10,t9),(t8,(t6,t7)))))),((t25,t24),(t23,((t21,(t20,t19)),(t22,(t17,t18)))))))),t1,t0); ((((t3,t2),(((t16,(t15,t14)),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13))),((t25,t24),(t23,(((t22,t21),(t20,t19)),(t17,t18)))))),((t4,t5),(t26,t27))),t1,t0); (((t4,t5),((t26,t27),((t3,t2),((((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((t12,t13),(t15,t14)))),t16)))),t1,t0); ((((t3,t2),((((t25,t24),(t23,(((t22,t21),(t20,t19)),(t17,t18)))),(((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),(t15,t14))),t16)),((t4,t5),(t26,t27))),t1,t0); ((((t3,t2),((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((t16,(((t25,t24),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7)))))),(t15,t14))))),(t4,t5)),t1,t0); ((((t3,t2),((t26,t27),(((t23,(((t22,t21),(t20,t19)),(t17,t18))),((((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),(t25,t24)),(t15,t14))),t16))),(t4,t5)),t1,t0); (((t3,t2),(((t26,((t23,((t25,t24),(((t22,t21),(t20,t19)),(t17,t18)))),(((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)),((t12,t13),t16)))),(t4,t5)),t27)),t1,t0); (((t4,t5),((t3,t2),((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),((((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),((t12,t13),t16)))))),t1,t0); (((t3,t2),(((t26,t27),((t23,(((t22,t21),(t20,t19)),(t17,t18))),(((t15,t14),((t12,t13),((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))))),t16))),(t4,t5))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t17,t18),(t22,(t21,(t20,t19))))),(((t12,t13),(t25,t24)),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14)))))),(t4,t5))),t1,t0); (t1,((t3,t2),(((t26,t27),(((((t21,(t19,t20)),t22),(t17,t18)),t23),((t25,t24),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15)))))),(t5,t4))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),(t16,((t11,((t9,t10),((t6,t7),t8))),((t14,t15),(t13,t12)))))))),t0); (t1,(((t26,t27),((t23,((t25,t24),(((t19,t20),(t22,t21)),(t17,t18)))),(t16,((t13,t12),((t11,((t9,t10),((t6,t7),t8))),(t14,t15)))))),((t5,t4),(t3,t2))),t0); (t1,((t5,t4),((t3,t2),((t26,t27),(((t25,t24),((((t19,t20),(t22,t21)),(t17,t18)),t23)),((t11,((t9,t10),((t6,t7),t8))),((t16,(t14,t15)),(t13,t12))))))),t0); (t1,((t3,t2),(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),((t13,t12),((t25,t24),(t11,((t9,t10),((t6,t7),t8)))))),t16))),(t5,t4))),t0); (t1,((t3,t2),(((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),((t25,t24),(t11,((t9,t10),((t6,t7),t8))))),((t13,t12),t16))),((t5,t4),(t26,t27)))),t0); (t1,((t3,t2),((t5,t4),((t26,t27),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))))))),t0); (t1,((((t3,t2),(t26,t27)),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))))),(t5,t4)),t0); (t1,(((t26,(t27,(t3,t2))),((t23,(((t19,t20),(t22,t21)),(t17,t18))),((((t13,t12),(t11,((t9,t10),((t6,t7),t8)))),(t16,(t14,t15))),(t25,t24)))),(t5,t4)),t0); (t1,((t3,t2),(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),(((t14,t15),(((t25,t24),(t13,t12)),(t11,((t9,t10),((t6,t7),t8))))),t16))),(t5,t4))),t0); (t1,((t2,t3),((t5,t4),((((t12,t13),((t11,((t8,(t6,t7)),(t10,t9))),(t16,(t15,t14)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(t26,t27)))),t0); (t1,((t2,t3),(((((((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9)))),((t15,t14),t16)),(((t20,t19),((t18,t17),(t21,t22))),t23)),(t26,(t5,t4))),t27)),t0); (t1,((t2,t3),((t5,t4),((t26,t27),((((t24,t25),(t11,((t8,(t6,t7)),(t10,t9)))),((t15,t14),((t12,t13),t16))),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),(((t24,t25),(((t12,t13),t16),((t11,((t8,(t6,t7)),(t10,t9))),(t15,t14)))),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,(((t2,t3),((((t15,t14),(((t24,t25),(t12,t13)),(t11,((t8,(t6,t7)),(t10,t9))))),t16),(((t21,t22),(t20,t19)),(t23,(t18,t17))))),((t5,t4),(t26,t27))),t0); (t1,(((t2,t3),(t5,t4)),((t26,t27),((((t15,t14),((t12,t13),(t11,((t8,(t6,t7)),(t10,t9))))),t16),((t24,t25),(((t20,t19),((t18,t17),(t21,t22))),t23))))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),((((t18,t17),((t21,t22),(t20,t19))),t23),((((t12,t13),(t11,((t8,(t6,t7)),(t10,t9)))),(t16,(t15,t14))),(t24,t25)))))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),((((t12,t13),t16),((t15,t14),(t11,((t8,(t6,t7)),(t10,t9))))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))))),t0); (t1,((t5,t4),((t26,t27),((((t16,((t12,t13),(t15,t14))),(t11,((t8,(t6,t7)),(t10,t9)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(t2,t3)))),t0); (t1,(((((t15,t14),(t16,(t12,t13))),(t11,((t8,(t6,t7)),(t10,t9)))),((t24,t25),(((t18,t17),((t21,t22),(t20,t19))),t23))),(((t26,t27),(t2,t3)),(t5,t4))),t0); (((((((t15,t14),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t27,t26)),((t4,t5),(t3,t2))),t1,t0); (((t3,t2),((t16,((((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t15,t14))),((t27,t26),(t4,t5)))),t1,t0); (((t3,t2),((t4,t5),(((((t17,t18),(t19,((t22,t21),t20))),(t23,(t24,t25))),(((t15,t14),t16),((t11,((t10,t9),(t8,(t6,t7)))),(t12,t13)))),(t27,t26)))),t1,t0); (((t4,t5),((((((t17,t18),((t22,t21),(t20,t19))),t23),(((t15,t14),t16),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t12,t13)))),(t27,t26)),(t3,t2))),t1,t0); (((t4,t5),((t27,t26),((t3,t2),((((t12,t13),((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25))),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16))))),t1,t0); (((t4,t5),((t3,t2),((((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25)),(((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)),(t16,(t12,t13)))),(t27,t26)))),t1,t0); ((((((((t17,t18),((t22,t21),(t20,t19))),t23),(t24,t25)),(((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t15,t14))),(t12,t13))),((t3,t2),(t27,t26))),(t4,t5)),t1,t0); ((((t4,t5),(t3,t2)),((t27,t26),((((t17,t18),((t22,t21),(t20,t19))),t23),((((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),(t16,(t12,t13)))))),t1,t0); (((t4,t5),((t3,t2),((t27,t26),((((t17,t18),((t22,t21),(t20,t19))),t23),((t15,t14),(((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t24,t25)))))))),t1,t0); (((t3,t2),(((t4,t5),(t27,t26)),((((t17,t18),((t22,t21),(t20,t19))),t23),((t16,(t15,t14)),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))))),t1,t0); ((((((((t25,t24),t23),((t18,t17),((t21,t22),(t19,t20)))),((t14,t15),((t12,t13),(t11,((t9,t10),((t7,t6),t8)))))),t16),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((((t16,(t14,t15)),((t12,t13),((t25,t24),(t11,((t9,t10),((t7,t6),t8)))))),(t23,((t18,t17),((t21,t22),(t19,t20))))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); (((((t2,t3),(((t12,t13),((t16,(t14,t15)),(t11,((t9,t10),((t7,t6),t8))))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20))))))),(t26,t27)),(t4,t5)),t1,t0); ((((t2,t3),((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t26,t27))),(t4,t5)),t1,t0); ((((t26,t27),(t2,t3)),((t4,t5),(((t11,((t9,t10),((t7,t6),t8))),((t12,t13),(t16,(t14,t15)))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))))),t1,t0); ((((t2,t3),(((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),(t23,(((t18,t17),((t21,t22),(t19,t20))),(t25,t24))))),((t26,t27),(t4,t5))),t1,t0); (((t2,t3),((t4,t5),((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),(t12,t13))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t26,t27)))),t1,t0); (((t4,t5),(((((t16,(t14,t15)),((t11,((t9,t10),((t7,t6),t8))),((t25,t24),(t12,t13)))),(t23,((t18,t17),((t21,t22),(t19,t20))))),(t26,t27)),(t2,t3))),t1,t0); ((((t26,t27),(t2,t3)),((t4,t5),((t16,((t14,t15),((t12,t13),((t11,((t9,t10),((t7,t6),t8))),(t25,t24))))),(t23,((t18,t17),((t21,t22),(t19,t20))))))),t1,t0); ((((t26,t27),(t4,t5)),(((((t12,t13),(t11,((t9,t10),((t7,t6),t8)))),(t16,(t14,t15))),((t25,t24),(t23,((t18,t17),((t21,t22),(t19,t20)))))),(t2,t3))),t1,t0); (((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),(t25,t24))),((t3,t2),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),(((((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t15,t14))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),(t3,t2))),t1,t0); ((((t4,t5),(t3,t2)),((t26,t27),(((t11,((t9,t10),(t8,(t6,t7)))),((t16,(t15,t14)),(t13,t12))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))))),t1,t0); (((t3,t2),(((t26,t27),(t4,t5)),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t15,t14)))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))))),t1,t0); (((t3,t2),((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((((t11,((t9,t10),(t8,(t6,t7)))),((t15,t14),(t13,t12))),(t25,t24)),t16)),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),(((((t11,((t9,t10),(t8,(t6,t7)))),((t13,t12),(t15,t14))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),t16),(t3,t2))),t1,t0); (((t3,t2),((t26,t27),(((((t13,t12),((t15,t14),(t11,((t9,t10),(t8,(t6,t7)))))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17))))),t16),(t4,t5)))),t1,t0); (((t3,t2),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),(t16,(((t25,t24),(t13,t12)),((t15,t14),(t11,((t9,t10),(t8,(t6,t7)))))))),((t4,t5),(t26,t27)))),t1,t0); (((t4,t5),((t26,t27),((t3,t2),((t23,(((t19,t20),(t22,t21)),(t18,t17))),(((t15,t14),((t25,t24),(t11,((t9,t10),(t8,(t6,t7)))))),(t16,(t13,t12))))))),t1,t0); (((t3,t2),((t4,t5),(((t23,(((t19,t20),(t22,t21)),(t18,t17))),((t15,t14),(t16,((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))),(t26,t27)))),t1,t0); (t1,(((t5,t4),(t27,t26)),((((t12,t13),(t16,((t11,((t10,t9),(t8,(t6,t7)))),(t15,t14)))),(((t21,(t19,t20)),(t22,(t18,t17))),((t25,t24),t23))),(t2,t3))),t0); (t1,(((t5,t4),(t27,t26)),((((t16,(t12,t13)),(((t25,t24),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14))),(t23,((t18,t17),((t19,t20),(t21,t22))))),(t2,t3))),t0); (t1,((t2,t3),(((t27,t26),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16)),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))),(t5,t4))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),((t15,t14),t16)),(t25,t24))))),t0); (t1,(((t5,t4),(t2,t3)),((t27,t26),((((t16,(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))),(t15,t14)),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),((((t12,t13),(t11,((t10,t9),(t8,(t6,t7))))),(t16,(t15,t14))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))))),t0); (t1,((t5,t4),((t27,t26),((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t15,t14)),(t12,t13))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))),(t2,t3)))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22))))))))),t0); (t1,(((t2,t3),(t5,t4)),((t26,((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t16,(t15,t14)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),(t25,t24)))),t27)),t0); (t1,((t5,t4),(((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t15,t14)),(t12,t13))),((t25,t24),(t23,((t18,t17),((t19,t20),(t21,t22)))))),(t27,t26)),(t2,t3))),t0); (((t3,t2),((t5,t4),((((t15,t14),(t16,((t12,t13),((t24,t25),(t11,(((t7,t6),t8),(t9,t10))))))),(((t17,t18),((t22,t21),(t20,t19))),t23)),(t26,t27)))),t1,t0); (((t5,t4),(((t3,t2),(((t15,t14),(((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t12,t13)))),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t26,t27))),t1,t0); (((t5,t4),(((((t15,t14),(t11,(((t7,t6),t8),(t9,t10)))),((t12,t13),t16)),((t24,t25),(((t20,t19),((t17,t18),(t22,t21))),t23))),((t26,t27),(t3,t2)))),t1,t0); ((((t5,t4),(t27,t26)),((((t11,(((t7,t6),t8),(t9,t10))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),(((t11,(((t7,t6),t8),(t9,t10))),(((t12,t13),t16),(t15,t14))),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23)))),(t5,t4))),t1,t0); (((t3,t2),((((((t11,(((t7,t6),t8),(t9,t10))),(t12,t13)),t16),(t15,t14)),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23))),((t5,t4),(t27,t26)))),t1,t0); (((t3,t2),(((((t11,(((t7,t6),t8),(t9,t10))),((t12,t13),((t24,t25),(((t17,t18),((t22,t21),(t20,t19))),t23)))),(t16,(t15,t14))),(t27,t26)),(t5,t4))),t1,t0); ((((t3,t2),(t16,((t15,t14),((((t17,t18),((t22,t21),(t20,t19))),t23),(((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t12,t13)))))),((t27,t26),(t5,t4))),t1,t0); ((((((t17,t18),((t22,t21),(t20,t19))),t23),((((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t12,t13)),(t16,(t15,t14)))),(((t3,t2),(t27,t26)),(t5,t4))),t1,t0); (((t3,t2),((((((t17,t18),((t22,t21),(t20,t19))),t23),((((t11,(((t7,t6),t8),(t9,t10))),(t12,t13)),(t16,(t15,t14))),(t24,t25))),(t27,t26)),(t5,t4))),t1,t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((t16,(t15,t14)),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t12,t13)))),(((t18,t17),((t19,t20),(t21,t22))),t23)))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),(t12,t13)),(t16,(t15,t14))),(((t18,t17),((t19,t20),(t21,t22))),t23)))),t0); (t1,(((t3,t2),(t26,t27)),(((((t25,t24),(t12,t13)),(t16,((((t9,t10),(t8,(t6,t7))),t11),(t15,t14)))),(((t18,t17),((t19,t20),(t21,t22))),t23)),(t4,t5))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),((((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),t16)),((t25,t24),(((t18,t17),((t19,t20),(t21,t22))),t23))))),t0); (t1,((t4,t5),((t3,t2),((t26,t27),((t16,(((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),((t12,t13),(t15,t14)))),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),t0); (t1,((((t16,(t15,t14)),(((((t9,t10),(t8,(t6,t7))),t11),(t25,t24)),(t12,t13))),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t26,t27),((t3,t2),(t4,t5)))),t0); (t1,((((t15,t14),(((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),t16)),((t25,t24),(((t4,t5),(t26,t27)),(((t18,t17),((t19,t20),(t21,t22))),t23)))),(t3,t2)),t0); (t1,(((t4,t5),(t26,t27)),((((t15,t14),(((t12,t13),(((t9,t10),(t8,(t6,t7))),t11)),((t25,t24),(((t18,t17),(((t19,t20),t22),t21)),t23)))),t16),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t16,(t15,t14)),((t12,t13),(((t9,t10),(t8,(t6,t7))),t11))),(t25,t24)))))),t0); (t1,((t3,t2),((t4,t5),(t27,((((t16,(t15,t14)),(((t25,t24),(t12,t13)),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t19,t20),(t22,t21))),t23)),t26)))),t0); (((t3,t2),((t5,t4),(((t16,(((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t24,t25))),(t15,t14))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),(((t16,(((t24,t25),(t12,t13)),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),((((t20,t19),(t22,t21)),(t17,t18)),t23)),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((((t16,(t15,t14)),(((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),(t24,t25))),((((t20,t19),t22),(t21,(t17,t18))),t23)),(t26,t27)))),t1,t0); ((((((t24,t25),((t16,(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)))),((((t20,t19),(t21,t22)),(t17,t18)),t23)),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t3,t2),((((t5,t4),t26),t27),((((t15,t14),((((t10,t9),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))),t16),((((t20,t19),(t21,t22)),(t17,t18)),t23)))),t1,t0); (((t3,t2),(((t5,t4),(t26,t27)),((((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),(t16,(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),((t24,t25),t23))))),t1,t0); (((t3,t2),(((((t12,t13),(t16,((t15,t14),(((t10,t9),(t8,(t6,t7))),t11)))),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)),(t5,t4))),t1,t0); (((t5,t4),((t3,t2),(((((t15,t14),t16),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t26,t27)))),t1,t0); (((((t5,t4),(t16,((((((t10,t9),(t8,(t6,t7))),t11),(t12,t13)),((t24,t25),(t23,(((t20,t19),(t21,t22)),(t17,t18))))),(t15,t14)))),(t26,t27)),(t3,t2)),t1,t0); (((t5,t4),(((t23,(((t20,t19),(t21,t22)),(t17,t18))),((((t15,t14),t16),((((t10,t9),(t8,(t6,t7))),t11),(t12,t13))),(t24,t25))),((t26,t27),(t3,t2)))),t1,t0); (t1,((t5,t4),((t26,t27),((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t13,t12),(t16,((((t9,t10),(t8,(t6,t7))),t11),(t15,t14))))),(t2,t3)))),t0); (t1,((t5,t4),((t26,t27),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),(t15,t14)),(t16,((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),(t2,t3)))),t0); (t1,((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t13,t12),(t16,(t15,t14))),((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)))),((t26,t27),(t2,t3))),(t5,t4)),t0); (t1,(((t26,t27),(t2,t3)),((t5,t4),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t15,t14),((((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),(t13,t12)),t16))))),t0); (t1,((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t13,t12),(t24,t25)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16)),((t5,t4),(t26,t27)))),t0); (t1,((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t24,t25),((t16,((t13,t12),(t15,t14))),(((t9,t10),(t8,(t6,t7))),t11)))),((t5,t4),(t26,t27)))),t0); (t1,(((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t15,t14),(((((t9,t10),(t8,(t6,t7))),t11),(t24,t25)),((t13,t12),t16)))),(t26,t27))),(t5,t4)),t0); (t1,((t2,t3),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t24,t25),(t13,t12)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16)),(t26,t27)),(t5,t4))),t0); (t1,(((t2,t3),(t16,((t15,t14),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)))))),((t26,t27),(t5,t4))),t0); (t1,((((t26,t27),(t2,t3)),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),((t15,t14),(t13,t12))),t16))),(t5,t4)),t0); (((t5,t4),(((((t15,t14),t16),((t13,t12),(t11,(((t7,t6),t8),(t10,t9))))),((((t21,t22),(t20,t19)),(t18,t17)),((t25,t24),t23))),((t3,t2),(t27,t26)))),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),(((t11,(((t7,t6),t8),(t10,t9))),(((t15,t14),t16),(t13,t12))),((t25,t24),(t23,(((t21,t22),(t20,t19)),(t18,t17))))))),t1,t0); (((((t5,t4),(t27,t26)),(((t11,(((t7,t6),t8),(t10,t9))),((t15,t14),(t16,(t13,t12)))),((t25,t24),(t23,(((t21,t22),(t20,t19)),(t18,t17)))))),(t3,t2)),t1,t0); (((t5,t4),(((t3,t2),(t27,t26)),((((t15,t14),((t13,t12),(t11,(((t7,t6),t8),(t10,t9))))),t16),(((t22,((t20,t19),t21)),(t18,t17)),((t25,t24),t23))))),t1,t0); ((((t3,t2),(t27,t26)),((t16,((((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),((t25,t24),(t23,(((t20,t19),(t21,t22)),(t18,t17))))),(t15,t14))),(t5,t4))),t1,t0); (((t5,t4),(((t3,t2),(((t25,t24),(t23,(((t20,t19),(t21,t22)),(t18,t17)))),((((t13,t12),(t15,t14)),(t11,(((t7,t6),t8),(t10,t9)))),t16))),(t27,t26))),t1,t0); (((t3,t2),(((t23,(((t20,t19),(t21,t22)),(t18,t17))),(t16,(((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),((t25,t24),(t15,t14))))),((t27,t26),(t5,t4)))),t1,t0); ((((t5,t4),(((t23,((t18,t17),(((t20,t19),t21),t22))),(t16,((t13,t12),((t15,t14),((t11,(((t7,t6),t8),(t10,t9))),(t25,t24)))))),(t27,t26))),(t3,t2)),t1,t0); ((((t5,t4),(((t23,((t18,t17),((t20,t19),(t21,t22)))),((((t13,t12),(t11,(((t7,t6),t8),(t10,t9)))),(t25,t24)),(t16,(t15,t14)))),(t27,t26))),(t3,t2)),t1,t0); ((((t16,(((t11,(((t7,t6),t8),(t10,t9))),(t15,t14)),((t13,t12),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24))))),(t27,t26)),((t3,t2),(t5,t4))),t1,t0); (((t2,t3),((((t16,(((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t14,t15))),(((t19,t20),((t18,t17),t21)),((t23,t22),(t24,t25)))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))))),(t27,t26)),(t4,t5))),t1,t0); (((((((t18,t17),((t21,t22),(t19,t20))),t23),((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))))),(t27,t26)),((t4,t5),(t2,t3))),t1,t0); ((((((((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23)),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))),(t14,t15)),t16),(t27,t26)),((t4,t5),(t2,t3))),t1,t0); ((((((((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),(t13,t12)),((t14,t15),t16)),(((t18,t17),((t21,t22),(t19,t20))),t23)),(t2,t3)),((t27,t26),(t4,t5))),t1,t0); ((((((t11,((t10,t9),((t7,t6),t8))),(t16,((t13,t12),(t14,t15)))),((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t2,t3)),((t27,t26),(t4,t5))),t1,t0); (((t2,t3),(((((t14,t15),(t16,((t11,((t10,t9),((t7,t6),t8))),(t13,t12)))),((t24,t25),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((((t18,t17),((t21,t22),(t19,t20))),t23),((((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t14,t15)),(t16,(t24,t25)))),(t27,t26)),(t4,t5))),t1,t0); (((t4,t5),((t2,t3),(((((t18,t17),((t21,t22),(t19,t20))),t23),((((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12))),(t14,t15)),t16)),(t27,t26)))),t1,t0); (((t4,t5),(((((t19,t20),((t18,t17),(t21,t22))),(t23,(t24,t25))),((t16,(t13,t12)),((t14,t15),(t11,((t10,t9),((t7,t6),t8)))))),((t27,t26),(t2,t3)))),t1,t0); (t1,(((t5,t4),(t27,t26)),((t2,t3),(((t25,t24),(t23,((t17,t18),((t21,t22),(t19,t20))))),((t16,(t14,t15)),((t12,t13),(t11,(((t6,t7),t8),(t9,t10)))))))),t0); (t1,(((t23,((t17,t18),((t21,t22),(t19,t20)))),(((t25,t24),(t12,t13)),((t11,(((t6,t7),t8),(t9,t10))),(t16,(t14,t15))))),(((t5,t4),(t27,t26)),(t2,t3))),t0); (t1,((t2,t3),((t5,t4),(((t23,((t17,t18),((t21,t22),(t19,t20)))),((t16,(t14,t15)),((t12,t13),((t11,(((t6,t7),t8),(t9,t10))),(t25,t24))))),(t27,t26)))),t0); (t1,((((t23,((t17,t18),((t21,t22),(t19,t20)))),(((t11,(((t6,t7),t8),(t9,t10))),((t12,t13),(t25,t24))),((t14,t15),t16))),((t2,t3),(t27,t26))),(t5,t4)),t0); (t1,((((t25,t24),(t23,((t17,t18),((t21,t22),(t19,t20))))),((t12,t13),(((t14,t15),t16),(t11,(((t6,t7),t8),(t9,t10)))))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,(((t2,t3),(t5,t4)),(t27,(t26,((t23,((t17,t18),((t21,t22),(t19,t20)))),((t16,(t12,t13)),((t14,t15),((t25,t24),(t11,(((t6,t7),t8),(t9,t10)))))))))),t0); (t1,((t5,t4),((((((t12,t13),(t11,(((t6,t7),t8),(t9,t10)))),(t16,(t14,t15))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))),(t27,t26)),(t2,t3))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),(((t11,(((t6,t7),t8),(t9,t10))),(t16,((t14,t15),(t12,t13)))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))))),t0); (t1,((t2,t3),((((t16,(t14,t15)),((t11,(((t6,t7),t8),(t9,t10))),(t12,t13))),((t23,((t17,t18),((t21,t22),(t19,t20)))),(t25,t24))),(t27,(t26,(t5,t4))))),t0); (t1,((t5,t4),((t27,(((t16,(((t14,t15),((t25,t24),(t11,(((t6,t7),t8),(t9,t10))))),(t12,t13))),(t23,((t17,t18),((t21,t22),(t19,t20))))),t26)),(t2,t3))),t0); (((t4,t5),((t27,t26),((((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),t16)))),(t2,t3)))),t1,t0); (((((t27,t26),((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t13,t12),(((t24,t25),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14))),t16))),(t2,t3)),(t4,t5)),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t24,t25),((t13,t12),(t11,((t9,t10),(t8,(t7,t6)))))),(t15,t14)),t16))))),t1,t0); ((((t2,t3),(((t23,((t18,t17),((t19,t20),(t21,t22)))),(t24,t25)),(((t13,t12),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)))),((t4,t5),(t27,t26))),t1,t0); ((((t2,t3),((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t24,t25),(t13,t12)),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)))),((t4,t5),(t27,t26))),t1,t0); ((((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t24,t25),(t13,t12)),((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),t16)))),(((t4,t5),(t27,t26)),(t2,t3))),t1,t0); (((t4,t5),(((((t13,t12),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),((t23,((t18,t17),((t19,t20),(t21,t22)))),(t24,t25))),((t2,t3),(t27,t26)))),t1,t0); (((t2,t3),(t27,((((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t15,t14),((t24,t25),(t11,((t9,t10),(t8,(t7,t6)))))),((t13,t12),t16))),t26),(t4,t5)))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),((t23,((t18,t17),((t19,t20),(t21,t22)))),((t16,(t15,t14)),(((t24,t25),(t11,((t9,t10),(t8,(t7,t6))))),(t13,t12))))))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),(((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t16,(t15,t14)),((t11,((t9,t10),(t8,(t7,t6)))),(t13,t12))))))),t1,t0); (t1,((t5,t4),((t3,t2),((t26,t27),((((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12))),((t15,t14),t16)),(((t18,t17),((t21,t22),(t19,t20))),t23))))),t0); (t1,((t3,t2),(((t26,t27),((((t25,t24),(t13,t12)),(((t15,t14),t16),(((t9,t10),(t8,(t6,t7))),t11))),(((t18,t17),((t21,t22),(t19,t20))),t23))),(t5,t4))),t0); (t1,(((t26,t27),(((t25,t24),(((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)),(t16,(t15,t14)))),(((t18,t17),((t21,t22),(t19,t20))),t23))),((t5,t4),(t3,t2))),t0); (t1,((t3,t2),(((t26,t27),(((t25,t24),(((((t9,t10),(t8,(t6,t7))),t11),(t13,t12)),(t16,(t15,t14)))),((t22,(((t19,t20),t21),(t18,t17))),t23))),(t5,t4))),t0); (t1,((((t3,t2),(t26,t27)),((t16,((t15,t14),((((t9,t10),(t8,(t6,t7))),t11),((t25,t24),(t13,t12))))),((((t19,t20),(t22,t21)),(t18,t17)),t23))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),(((t15,t14),(t16,((t13,t12),((t25,t24),(((t9,t10),(t8,(t6,t7))),t11))))),((((t19,t20),(t22,t21)),(t18,t17)),t23)))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),((((t15,t14),((t13,t12),((t25,t24),(((t9,t10),(t8,(t6,t7))),t11)))),((((t19,t20),(t22,t21)),(t18,t17)),t23)),t16))),(t5,t4)),t0); (t1,((((t3,t2),(t26,t27)),(((((t9,t10),(t8,(t6,t7))),t11),((t16,(t15,t14)),(t13,t12))),((t25,t24),(t23,(((t19,t20),(t22,t21)),(t18,t17)))))),(t5,t4)),t0); (t1,(((t3,t2),((t26,t27),(((((t13,t12),t16),(t15,t14)),(((t9,t10),(t8,(t6,t7))),t11)),((t25,t24),(t23,((t19,t20),((t22,t21),(t18,t17)))))))),(t5,t4)),t0); (t1,(((t26,t27),((t23,((t18,t17),((t19,t20),(t22,t21)))),((((t13,t12),(t25,t24)),((t15,t14),(((t9,t10),(t8,(t6,t7))),t11))),t16))),((t5,t4),(t3,t2))),t0); (t1,(((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),(t13,t12)))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,(((t4,t5),(t27,t26)),((t2,t3),(((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t11,(((t6,t7),t8),(t9,t10))),((t16,(t13,t12)),(t15,t14)))))),t0); (t1,((((t23,((((t21,t22),(t20,t19)),(t18,t17)),(t24,t25))),((t16,(t13,t12)),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),((t27,t26),(t2,t3))),(t4,t5)),t0); (t1,((t2,t3),((((t23,(((t21,t22),(t20,t19)),(t18,t17))),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t16,(t13,t12)),(t15,t14)))),(t27,t26)),(t4,t5))),t0); (t1,((t2,t3),((t26,((t4,t5),((t23,(((t21,t22),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),((t24,t25),(t13,t12))))))),t27)),t0); (t1,(((t4,t5),((t23,(((t21,t22),(t20,t19)),(t18,t17))),((t16,(t15,t14)),((t11,(((t6,t7),t8),(t9,t10))),((t24,t25),(t13,t12)))))),((t2,t3),(t27,t26))),t0); (t1,(((t4,t5),(((t23,((((t21,t22),(t20,t19)),(t18,t17)),(t24,t25))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26))),(t2,t3)),t0); (t1,(((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))),(t27,t26)),((t2,t3),(t4,t5))),t0); (t1,((((t24,t25),(t23,(((t21,t22),(t20,t19)),(t18,t17)))),((t13,t12),((t16,(t15,t14)),(t11,(((t6,t7),t8),(t9,t10)))))),(((t27,t26),(t4,t5)),(t2,t3))),t0); (t1,(((t4,t5),((t27,t26),(((t24,t25),((t18,t17),(t23,((t21,t22),(t20,t19))))),(((t13,t12),t16),((t15,t14),(t11,(((t6,t7),t8),(t9,t10)))))))),(t2,t3)),t0); (((t2,t3),((t5,t4),((t27,t26),(((t15,t14),(((t25,t24),(t23,(((t20,t19),(t21,t22)),(t17,t18)))),((t13,t12),(t11,((t9,t10),((t7,t6),t8)))))),t16)))),t1,t0); ((((t27,t26),(((t23,(((t20,t19),(t21,t22)),(t17,t18))),(((t25,t24),(t13,t12)),(t11,((t9,t10),((t7,t6),t8))))),(t16,(t15,t14)))),((t2,t3),(t5,t4))),t1,t0); ((((((t25,t24),(t23,(((t20,t19),(t21,t22)),(t17,t18)))),((t15,t14),((t16,(t13,t12)),(t11,((t9,t10),((t7,t6),t8)))))),((t27,t26),(t2,t3))),(t5,t4)),t1,t0); ((((t27,t26),((t2,t3),((t23,(((t20,t19),(t21,t22)),(t17,t18))),(t16,(((t15,t14),(t13,t12)),((t25,t24),(t11,((t9,t10),((t7,t6),t8))))))))),(t5,t4)),t1,t0); (((t2,t3),((((t23,(((t20,t19),(t21,t22)),(t17,t18))),((t16,(t13,t12)),(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),(t15,t14)))),(t27,t26)),(t5,t4))),t1,t0); (((t2,t3),((((t23,(((t20,t19),(t21,t22)),(t17,t18))),(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),(t16,(t13,t12))))),(t27,t26)),(t5,t4))),t1,t0); (((t2,t3),((((t23,((t25,t24),(((t20,t19),(t21,t22)),(t17,t18)))),(((t11,((t9,t10),((t7,t6),t8))),((t15,t14),(t13,t12))),t16)),(t27,t26)),(t5,t4))),t1,t0); (((((t25,t24),((((t20,t19),(t21,t22)),(t17,t18)),t23)),(((t15,t14),t16),((t13,t12),(t11,((t9,t10),((t7,t6),t8)))))),((t27,((t5,t4),t26)),(t2,t3))),t1,t0); (((t2,t3),(((((((t20,t19),(t21,t22)),(t17,t18)),t23),(t16,(((t25,t24),(t11,((t9,t10),((t7,t6),t8)))),((t15,t14),(t13,t12))))),(t26,t27)),(t5,t4))),t1,t0); (((((((t22,((t20,t19),t21)),(t17,t18)),t23),(((t11,((t9,t10),((t7,t6),t8))),((t13,t12),(t25,t24))),((t15,t14),t16))),((t2,t3),(t26,t27))),(t5,t4)),t1,t0); (((((t27,t26),(t5,t4)),(((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t13,t12),t16),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),(t3,t2)),t1,t0); ((((t5,t4),((((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20))))),(((t13,t12),t16),((t15,t14),(((t9,t10),((t6,t7),t8)),t11)))),(t27,t26))),(t3,t2)),t1,t0); (((((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),((t13,t12),(t24,t25)))),((t27,t26),(t5,t4))),(t3,t2)),t1,t0); (((((t5,t4),(((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t15,t14),((((t9,t10),((t6,t7),t8)),t11),(t24,t25))),(t16,(t13,t12)))),t26)),(t3,t2)),t27),t1,t0); (((((t23,((t18,t17),((t21,t22),(t19,t20)))),((t16,(t15,t14)),(((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),(t24,t25)))),((t27,t26),(t5,t4))),(t3,t2)),t1,t0); ((((t3,t2),(t5,t4)),(t27,(((t23,((t18,t17),((t21,t22),(t19,t20)))),((((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),((t15,t14),t16)),(t24,t25))),t26))),t1,t0); (((t3,t2),((t5,t4),(((t23,((t18,t17),((t21,t22),(t19,t20)))),((((t13,t12),(((t9,t10),((t6,t7),t8)),t11)),((t15,t14),t16)),(t24,t25))),(t26,t27)))),t1,t0); (((t5,t4),((((t23,((t18,t17),((t21,t22),(t19,t20)))),(((t15,t14),t16),(((t24,t25),(t13,t12)),(((t9,t10),((t6,t7),t8)),t11)))),(t26,t27)),(t3,t2))),t1,t0); (((t5,t4),((((((t9,t10),((t6,t7),t8)),t11),((t15,t14),(t16,(t13,t12)))),((t24,t25),(t23,((t18,t17),((t21,t22),(t19,t20)))))),((t3,t2),(t26,t27)))),t1,t0); (((((t23,((t19,t20),((t18,t17),(t21,t22)))),((t13,t12),((t24,t25),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),t16),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); ((((t4,t5),(t26,t27)),((t2,t3),(((t15,t14),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t11,((t8,(t7,t6)),(t9,t10))),((t24,t25),(t13,t12))))),t16))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t11,((t8,(t7,t6)),(t9,t10))),((t24,t25),(t13,t12))),(t16,(t15,t14))))))),t1,t0); (((t4,t5),(((t26,t27),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t24,t25),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t15,t14)))),t16)),(t2,t3))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((t11,((t8,(t7,t6)),(t9,t10))),((t16,(t15,t14)),(t13,t12))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)))))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25))),(t15,t14)),t16)))),t1,t0); (((t4,t5),((t26,t27),((t2,t3),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),(((t11,((t8,(t7,t6)),(t9,t10))),(t15,t14)),(t16,(t13,t12))))))),t1,t0); (((t2,t3),((t4,t5),((((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t24,t25)),((((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),(t15,t14)),t16)),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),(((t23,((((t22,t21),(t19,t20)),(t18,t17)),(t24,t25))),(((t13,t12),(t11,((t8,(t7,t6)),(t9,t10)))),((t15,t14),t16))),(t26,t27)))),t1,t0); (((t4,t5),(((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t15,t14),((t24,t25),(t11,((t8,(t7,t6)),(t9,t10))))),(t16,(t13,t12)))),((t2,t3),(t26,t27)))),t1,t0); ((((t26,t27),(t4,t5)),((((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t11,((t8,(t7,t6)),(t9,t10))),(t13,t12)))),(t2,t3))),t1,t0); (t1,((t2,t3),((((t23,((t22,(t21,(t20,t19))),(t18,t17))),((t16,((t14,t15),((t12,t13),(((t9,t10),((t7,t6),t8)),t11)))),(t25,t24))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),(((((t12,t13),((((t9,t10),((t7,t6),t8)),t11),((t14,t15),t16))),((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17))))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),((((((t14,t15),t16),((t12,t13),(((t9,t10),((t7,t6),t8)),t11))),((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17))))),(t26,t27)),(t4,t5))),t0); (t1,(((t14,t15),((((t12,t13),(((t9,t10),((t7,t6),t8)),t11)),t16),(t23,((((t20,t19),(t22,t21)),(t18,t17)),(t25,t24))))),(((t2,t3),(t26,t27)),(t4,t5))),t0); (t1,(((((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),(((t14,t15),(t12,t13)),(((t9,t10),((t7,t6),t8)),t11))),t16),(((t26,t27),(t4,t5)),(t2,t3))),t0); (t1,(((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t14,t15),(((t12,t13),((t25,t24),(((t9,t10),((t7,t6),t8)),t11))),t16))),(t26,t27)),(t4,t5)),(t2,t3)),t0); (t1,((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t14,t15),((t25,t24),(((t9,t10),((t7,t6),t8)),t11))),(t12,t13)),t16)),(t26,t27)),((t4,t5),(t2,t3))),t0); (t1,((t4,t5),((t26,t27),((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t14,t15),(((t12,t13),(t25,t24)),(((t9,t10),((t7,t6),t8)),t11))),t16))))),t0); (t1,(((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((((t9,t10),((t7,t6),t8)),t11),(t12,t13)),(t16,(t14,t15))),(t25,t24)))),((t4,t5),(t26,t27))),t0); (t1,((((t2,t3),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t14,t15)),((t12,t13),((((t9,t10),((t7,t6),t8)),t11),(t25,t24)))))),((t4,t5),t27)),t26),t0); (t1,((t2,t3),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),(t16,((((t25,t24),(t13,t12)),(t11,((t9,t10),((t7,t6),t8)))),(t15,t14)))),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),((t16,(((((((t21,t22),(t19,t20)),(t18,t17)),t23),(t25,t24)),((t13,t12),(t11,((t9,t10),((t7,t6),t8))))),(t15,t14))),((t4,t5),(t26,t27)))),t0); (t1,((t2,t3),((t26,((((((t21,t22),(t19,t20)),(t18,t17)),t23),(((t13,t12),((t25,t24),(t11,((t9,t10),((t7,t6),t8))))),((t15,t14),t16))),(t4,t5))),t27)),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t11,((t9,t10),((t7,t6),t8))),(t13,t12)),((t15,t14),t16)))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t11,((t9,t10),((t7,t6),t8))),(t16,(t13,t12))),(t15,t14)))))),t0); (t1,((((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),((t11,((t9,t10),((t7,t6),t8))),((t13,t12),(t16,(t15,t14))))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,(((t2,t3),(t27,t26)),((((t25,t24),((((t21,t22),(t19,t20)),(t18,t17)),t23)),((t13,t12),((t16,(t15,t14)),(t11,((t9,t10),((t7,t6),t8)))))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t21,(t22,(t19,t20))),(t18,t17)),t23),(((t25,t24),(t13,t12)),((t16,(t15,t14)),(t11,((t9,t10),((t7,t6),t8))))))),(t4,t5))),t0); (t1,((((t2,t3),(t27,t26)),((((t21,(t22,(t19,t20))),(t18,t17)),t23),((t16,(t15,t14)),((t11,((t9,t10),((t7,t6),t8))),((t25,t24),(t13,t12)))))),(t4,t5)),t0); (t1,(((t27,t26),(((t25,t24),((((t19,t20),(t21,t22)),(t18,t17)),t23)),((t16,(t15,t14)),((t11,((t9,t10),((t7,t6),t8))),(t13,t12))))),((t4,t5),(t2,t3))),t0); (((t3,t2),((((t5,t4),t26),((t23,((t18,t17),((t20,t19),(t21,t22)))),((t16,(t25,t24)),(((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13)),(t14,t15))))),t27)),t1,t0); ((((t5,t4),(t26,t27)),((t3,t2),(((((t8,(t6,t7)),(t10,t9)),t11),((t12,t13),(t16,(t14,t15)))),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24))))),t1,t0); (((t3,t2),(((((t14,t15),(((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13)),((t23,((t18,t17),((t20,t19),(t21,t22)))),(t25,t24)))),t16),(t26,t27)),(t5,t4))),t1,t0); (((((t23,((t18,t17),((t20,t19),(t21,t22)))),((t16,((((t8,(t6,t7)),(t10,t9)),t11),(t14,t15))),((t12,t13),(t25,t24)))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),((((t23,((t18,t17),((t20,t19),(t21,t22)))),((((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),((t12,t13),(t14,t15))),t16)),(t26,t27)),(t5,t4))),t1,t0); ((((t3,t2),(t26,t27)),((t5,t4),(t16,((t23,((t18,t17),((t20,t19),(t21,t22)))),(((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),((t12,t13),(t14,t15))))))),t1,t0); ((((t5,t4),(((t23,((t18,t17),((t20,t19),(t21,t22)))),((t14,t15),((((((t8,(t6,t7)),(t10,t9)),t11),(t25,t24)),(t12,t13)),t16))),(t26,t27))),(t3,t2)),t1,t0); (((t5,t4),(((t23,((t18,t17),(t22,((t20,t19),t21)))),(((((t8,(t6,t7)),(t10,t9)),t11),((t25,t24),(t12,t13))),(t16,(t14,t15)))),((t3,t2),(t26,t27)))),t1,t0); (((t5,t4),((t3,t2),((t26,t27),((t16,(t14,t15)),(((t25,t24),(t23,((t18,t17),((t20,t19),(t21,t22))))),((((t8,(t6,t7)),(t10,t9)),t11),(t12,t13))))))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t18,t17),((t20,t19),(t21,t22)))),((((t25,t24),(((t8,(t6,t7)),(t10,t9)),t11)),(t12,t13)),(t16,(t14,t15))))),(t5,t4))),t1,t0); (t1,(((((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20))))),(((t14,t15),t16),((t12,t13),(t11,((t10,t9),((t6,t7),t8)))))),(t26,t27)),((t5,t4),(t2,t3))),t0); (t1,(((t26,t27),(t2,t3)),(((t23,((t18,t17),((t22,t21),(t19,t20)))),(t16,(((t24,t25),(t12,t13)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15))))),(t5,t4))),t0); (t1,(((t5,t4),((t26,t27),(((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25)),((t16,(t12,t13)),((t11,((t10,t9),((t6,t7),t8))),(t14,t15)))))),(t2,t3)),t0); (t1,(((((t23,((t18,t17),(t22,(t21,(t19,t20))))),(t24,t25)),(((t11,((t10,t9),((t6,t7),t8))),((t14,t15),(t12,t13))),t16)),((t5,t4),(t26,t27))),(t2,t3)),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(t16,(((t23,((t18,t17),((t19,t20),(t22,t21)))),(t24,t25)),((t14,t15),((t12,t13),(t11,((t10,t9),((t6,t7),t8))))))))),t0); (t1,(((t23,((t21,(t18,t17)),((t19,t20),t22))),((t16,(t14,t15)),((t12,t13),((t24,t25),(t11,((t10,t9),((t6,t7),t8))))))),((t5,t4),((t2,t3),(t26,t27)))),t0); (t1,((t5,t4),((t2,t3),((t27,t26),(((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22))))),((t16,(t14,t15)),((t11,((t10,t9),((t6,t7),t8))),(t12,t13))))))),t0); (t1,((((t2,t3),(t27,t26)),((t23,((t18,t17),((t19,t20),(t21,t22)))),(((t24,t25),(t12,t13)),((t16,(t14,t15)),(t11,((t10,t9),((t6,t7),t8))))))),(t5,t4)),t0); (t1,(((t16,((t14,t15),(((t11,((t10,t9),((t6,t7),t8))),(t12,t13)),((t24,t25),(t23,((t18,t17),((t19,t20),(t21,t22)))))))),(t2,t3)),((t5,t4),(t27,t26))),t0); (t1,((t5,t4),(((t23,((t18,t17),((t19,t20),(t21,t22)))),((((t14,t15),((t11,((t10,t9),((t6,t7),t8))),(t24,t25))),(t12,t13)),t16)),((t2,t3),(t27,t26)))),t0); ((((t27,t26),(((t23,((t18,t17),((t21,t22),(t20,t19)))),(t16,(((t24,t25),(((t9,t10),(t8,(t6,t7))),t11)),((t12,t13),(t15,t14))))),(t2,t3))),(t4,t5)),t1,t0); (((t2,t3),((t27,t26),((t4,t5),(((t24,t25),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),(t12,t13))))))),t1,t0); (((t4,t5),(((t2,t3),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))))),(t27,t26))),t1,t0); (((t4,t5),((t2,t3),(((((t24,t25),t23),(((t18,t17),(t21,(t20,t19))),t22)),(((t15,t14),t16),((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)))),(t27,t26)))),t1,t0); (((t2,t3),((((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22))))),((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),((t15,t14),t16)))),((t4,t5),(t27,t26)))),t1,t0); (((t2,t3),(((((t18,t17),((t20,t19),(t21,t22))),t23),(((t15,t14),(t12,t13)),(t16,((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),((t4,t5),(t27,t26)))),t1,t0); (((t4,t5),(((((t18,t17),((t20,t19),(t21,t22))),t23),(t16,(((t24,t25),((t12,t13),(((t9,t10),(t8,(t6,t7))),t11))),(t15,t14)))),((t2,t3),(t26,t27)))),t1,t0); (((t4,t5),((((((t18,t17),((t20,t19),(t21,t22))),t23),(t24,t25)),(t16,((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t15,t14))))),((t2,t3),(t26,t27)))),t1,t0); (((t4,t5),((t2,t3),((t26,t27),(((t15,t14),(t16,((t12,t13),((t24,t25),(((t9,t10),(t8,(t6,t7))),t11))))),(t23,((t18,t17),((t20,t19),(t21,t22)))))))),t1,t0); ((((t4,t5),(t26,t27)),((((((t9,t10),(t8,(t6,t7))),t11),((t16,(t12,t13)),(t15,t14))),((t24,t25),(t23,((t18,t17),((t20,t19),(t21,t22)))))),(t2,t3))),t1,t0); (t1,((t5,t4),((t26,t27),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t12,t13),((((t7,t6),t8),(t9,t10)),t11)))),(t2,t3)))),t0); (t1,(((t16,((t15,t14),(((t12,t13),((((t7,t6),t8),(t9,t10)),t11)),((t25,t24),(t23,(((t22,t21),(t19,t20)),(t18,t17))))))),(t2,t3)),((t5,t4),(t26,t27))),t0); (t1,((t2,t3),(((t26,t27),(t16,((t23,(((t22,t21),(t19,t20)),(t18,t17))),(((t25,t24),(t12,t13)),((t15,t14),((((t7,t6),t8),(t9,t10)),t11)))))),(t5,t4))),t0); (t1,((t2,t3),((((t12,t13),(t16,((t15,t14),((((t7,t6),t8),(t9,t10)),t11)))),((((t22,t21),(t19,t20)),((t18,t17),t23)),(t25,t24))),((t26,t27),(t5,t4)))),t0); (t1,((((((((t7,t6),t8),(t9,t10)),t11),(t12,t13)),(t16,(t15,t14))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),(((t26,t27),(t5,t4)),(t2,t3))),t0); (t1,(((((t12,t13),((t16,(t15,t14)),((((t7,t6),t8),(t9,t10)),t11))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),((t2,t3),(t26,t27))),(t5,t4)),t0); (t1,(((t26,t27),((((t15,t14),(((((t7,t6),t8),(t9,t10)),t11),(t12,t13))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24))),t16)),((t5,t4),(t2,t3))),t0); (t1,(((t26,t27),(((t16,(t15,t14)),(((((t7,t6),t8),(t9,t10)),t11),(t12,t13))),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t25,t24)))),((t5,t4),(t2,t3))),t0); (t1,((((t2,t3),(t26,t27)),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t25,t24),(((((t7,t6),t8),(t9,t10)),t11),(((t12,t13),t16),(t15,t14)))))),(t5,t4)),t0); (t1,((((t26,t27),((t23,(((t22,t21),(t19,t20)),(t18,t17))),(t16,((t15,t14),((t12,t13),((t25,t24),((((t7,t6),t8),(t9,t10)),t11))))))),(t5,t4)),(t2,t3)),t0); (t1,((t3,t2),(((t26,(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),((((t8,(t6,t7)),(t9,t10)),t11),((t14,t15),t16))))),(t4,t5)),t27)),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),(((t14,t15),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11)))),t16))),t0); (t1,((t3,t2),(((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(((t8,(t6,t7)),(t9,t10)),t11)),(((t12,t13),t16),(t14,t15))))),(t4,t5))),t0); (t1,(((t26,t27),((t3,t2),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),(((t14,t15),t16),(((t8,(t6,t7)),(t9,t10)),t11)))))),(t4,t5)),t0); (t1,(((((t14,t15),((((t24,t25),(((t8,(t6,t7)),(t9,t10)),t11)),(t12,t13)),((((t22,t21),(t19,t20)),(t17,t18)),t23))),t16),((t26,t27),(t3,t2))),(t4,t5)),t0); (t1,((t3,t2),((((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t12,t13),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11)))),((t4,t5),(t26,t27)))),t0); (t1,((t4,t5),(((t3,t2),(t26,t27)),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t24,t25),(t12,t13)),((t16,(t14,t15)),(((t8,(t6,t7)),(t9,t10)),t11)))))),t0); (t1,((t27,((t3,t2),t26)),((((t12,t13),((((t8,(t6,t7)),(t9,t10)),t11),(t16,(t14,t15)))),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(t24,t25))),(t4,t5))),t0); (t1,((t27,(t26,(((((t22,t21),(t19,t20)),(t17,t18)),t23),((t24,t25),((t16,(t14,t15)),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11))))))),((t4,t5),(t3,t2))),t0); (t1,((t3,t2),((((((t24,t25),(((t22,t21),(t19,t20)),(t17,t18))),t23),(t16,((t14,t15),((t12,t13),(((t8,(t6,t7)),(t9,t10)),t11))))),(t27,t26)),(t4,t5))),t0); ((((t26,((t5,t4),(t3,t2))),t27),(((t16,(t14,t15)),(((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t9,t10))))),(((t18,t17),((t19,t20),(t22,t21))),t23))),t1,t0); (((t3,t2),(((t27,t26),(t5,t4)),(((t13,t12),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t9,t10))))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23))))),t1,t0); (((t3,t2),((t5,t4),(((((t18,t17),((t19,t20),(t22,t21))),t23),((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t13,t12)))),(t27,t26)))),t1,t0); (((t5,t4),((((((t18,t17),((t19,t20),(t22,t21))),t23),(((t13,t12),(t24,t25)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t9,t10)))))),(t27,t26)),(t3,t2))),t1,t0); (((((((t18,t17),((t19,t20),(t22,t21))),t23),((((t14,t15),((t11,((t8,(t6,t7)),(t9,t10))),(t24,t25))),(t13,t12)),t16)),(t27,t26)),((t3,t2),(t5,t4))),t1,t0); ((((t3,t2),((((t18,t17),((t19,t20),(t22,t21))),t23),((t24,t25),(((t14,t15),(t11,((t8,(t6,t7)),(t9,t10)))),((t13,t12),t16))))),((t27,t26),(t5,t4))),t1,t0); ((((t27,t26),(((t16,(t14,t15)),(((t24,t25),(t11,((t8,(t6,t7)),(t9,t10)))),(t13,t12))),(((t18,t17),((t19,t20),(t22,t21))),t23))),((t5,t4),(t3,t2))),t1,t0); (((((t11,((t8,(t6,t7)),(t9,t10))),(((t13,t12),t16),(t14,t15))),(((t18,t17),((t19,t20),(t22,t21))),((t24,t25),t23))),(((t3,t2),(t27,t26)),(t5,t4))),t1,t0); (((((t14,t15),t16),(((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))))),((t3,t2),((t27,t26),(t5,t4)))),t1,t0); (((t3,t2),(((((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))),(((t13,t12),(t11,((t8,(t6,t7)),(t9,t10)))),((t14,t15),t16))),(t27,t26)),(t5,t4))),t1,t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t14,t15))),((t24,t25),(((t21,(t20,t19)),((t18,t17),t22)),t23))),((t2,t3),(t27,t26))),(t4,t5)),t0); (t1,((t2,t3),(((t27,t26),(((((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t12,t13)),(t16,(t14,t15))),((((t22,t21),(t20,t19)),(t18,t17)),t23))),(t4,t5))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),(((t16,(t12,t13)),((t14,t15),(t11,((t10,t9),((t7,t6),t8))))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,(((t2,t3),(t4,t5)),((t27,t26),(((t16,(t14,t15)),((t11,((t10,t9),((t7,t6),t8))),(t12,t13))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,((t4,t5),(((((t24,t25),(t12,t13)),((t16,(t14,t15)),(t11,((t10,t9),((t7,t6),t8))))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t2,t3),(t27,t26)))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),(((t16,((t12,t13),(t14,t15))),(t11,((t10,t9),((t7,t6),t8)))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))))),t0); (t1,(((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t16,(t14,t15))),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))),((t4,t5),((t2,t3),(t27,t26)))),t0); (t1,((t2,t3),(((t27,t26),((((t16,(t12,t13)),(t11,((t10,t9),((t7,t6),t8)))),(t14,t15)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))),(t4,t5))),t0); (t1,(((t2,t3),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)))),((t4,t5),(t27,t26))),t0); (t1,((t2,t3),(((((t16,(t12,t13)),((t14,t15),(t11,((t10,t9),((t7,t6),t8))))),((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25)))),(t27,t26)),(t4,t5))),t0); (t1,((t4,t5),((t26,t27),((t3,t2),((((t18,t17),((t22,t21),(t20,t19))),t23),(t16,((t14,t15),((t24,t25),((t12,t13),((((t6,t7),t8),(t10,t9)),t11))))))))),t0); (t1,((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),t23),((t16,(t14,t15)),(((t24,t25),(t12,t13)),((((t6,t7),t8),(t10,t9)),t11)))),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((((((t18,t17),((t22,t21),(t20,t19))),t23),(((t12,t13),t16),((t14,t15),(((((t6,t7),t8),(t10,t9)),t11),(t24,t25))))),(t26,t27)),(t4,t5))),t0); (t1,((((t3,t2),(((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),(((t12,t13),t16),((t14,t15),((((t6,t7),t8),(t10,t9)),t11))))),(t26,(t4,t5))),t27),t0); (t1,((t4,t5),(((t3,t2),(((t14,t15),((((((t6,t7),t8),(t10,t9)),t11),(t12,t13)),((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)))),t16)),(t27,t26))),t0); (t1,(((t3,t2),(((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t16,((t14,t15),((((t6,t7),t8),(t10,t9)),t11))),(t12,t13)))),((t27,t26),(t4,t5))),t0); (t1,((t4,t5),(((t3,t2),((((t24,t25),(((t20,t19),((t18,t17),(t22,t21))),t23)),(((((t6,t7),t8),(t10,t9)),t11),(t12,t13))),(t16,(t14,t15)))),(t27,t26))),t0); (t1,((t3,t2),((t4,t5),(((((t18,t17),((t22,t21),(t20,t19))),t23),((((t14,t15),((((t6,t7),t8),(t10,t9)),t11)),((t24,t25),(t12,t13))),t16)),(t27,t26)))),t0); (t1,((t3,t2),((t4,t5),((((t24,t25),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t16,(t14,t15)),(((((t6,t7),t8),(t10,t9)),t11),(t12,t13)))),(t27,t26)))),t0); (t1,((t4,t5),((((((t18,t17),((t22,t21),(t20,t19))),t23),(((t24,t25),(t12,t13)),((t14,t15),(((((t6,t7),t8),(t10,t9)),t11),t16)))),(t27,t26)),(t3,t2))),t0); ((((t27,t26),(((((t24,t25),t23),((t17,t18),((t21,t22),(t19,t20)))),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))))),(t3,t2))),(t5,t4)),t1,t0); (((t5,t4),(((t27,t26),(t3,t2)),((((t14,t15),(((t24,t25),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(t23,((t17,t18),((t21,t22),(t19,t20))))),t16))),t1,t0); ((((t27,t26),(t3,t2)),((((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t24,t25),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); ((((t27,t26),(t3,t2)),((((t16,((t12,t13),(t14,t15))),(t11,((t9,t10),(t8,(t6,t7))))),((t24,t25),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); (((t27,(t3,t2)),((t26,((t16,((t12,t13),((t14,t15),((t24,t25),(t11,((t9,t10),(t8,(t6,t7)))))))),(t23,((t17,t18),((t21,t22),(t19,t20)))))),(t5,t4))),t1,t0); (((((t16,(((t12,t13),(t11,((t9,t10),(t8,(t6,t7))))),(t14,t15))),(t23,((t24,t25),((t17,t18),((t21,t22),(t19,t20)))))),(t3,t2)),((t26,t27),(t5,t4))),t1,t0); (((((((t24,t25),(t12,t13)),((t11,((t9,t10),(t8,(t6,t7)))),((t14,t15),t16))),(t23,(((t21,t22),(t19,t20)),(t17,t18)))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); ((((((t14,t15),t16),((t12,t13),(t11,((t9,t10),(t8,(t6,t7)))))),((t24,t25),(t23,(((t21,t22),(t19,t20)),(t17,t18))))),((t26,t27),((t5,t4),(t3,t2)))),t1,t0); (((t3,t2),(((((t12,t13),((t11,((t9,t10),(t8,(t6,t7)))),((t14,t15),t16))),((t24,t25),(t23,(((t21,t22),(t19,t20)),(t17,t18))))),(t26,t27)),(t5,t4))),t1,t0); (((((((t14,t15),t16),(((t24,t25),(t12,t13)),(t11,((t9,t10),(t8,(t6,t7)))))),(t23,(((t21,t22),(t19,t20)),(t17,t18)))),((t3,t2),(t26,t27))),(t5,t4)),t1,t0); (((t4,t5),((t27,t26),(((t16,(((t13,t12),(t14,t15)),((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))))),(((t20,t19),((t22,t21),(t18,t17))),t23)),(t2,t3)))),t1,t0); (((t16,((t14,t15),(((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12)),((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),(((t4,t5),(t2,t3)),(t27,t26))),t1,t0); ((((t4,t5),(t2,t3)),(t27,((((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t13,t12),((t16,(t14,t15)),(t11,((t10,t9),(t8,(t6,t7))))))),t26))),t1,t0); ((((t4,t5),(((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25))),((((t13,t12),t16),(t14,t15)),(t11,((t10,t9),(t8,(t6,t7))))))),((t26,t27),(t2,t3))),t1,t0); (((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),(t23,(t24,t25))),(((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12)),(t16,(t14,t15)))),(t27,((t2,t3),t26)))),t1,t0); ((((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t14,t15),(((t24,t25),((t11,((t10,t9),(t8,(t6,t7)))),(t13,t12))),t16))),(t26,t27))),(t2,t3)),t1,t0); ((((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t14,t15),((t11,((t10,t9),(t8,(t6,t7)))),((t13,t12),(t24,t25))))),t16),((t2,t3),((t4,t5),(t26,t27)))),t1,t0); ((((t2,t3),(t26,t27)),((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),((t13,t12),((t14,t15),((t24,t25),(t11,((t10,t9),(t8,(t6,t7)))))))),t16))),t1,t0); (((t4,t5),((((((t22,t21),(t20,t19)),(t18,t17)),t23),(t16,((t13,t12),(((t24,t25),(t11,((t10,t9),(t8,(t6,t7))))),(t14,t15))))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),((((t4,t5),t26),t27),(((t24,t25),((((t22,t21),(t20,t19)),(t18,t17)),t23)),((t11,((t10,t9),(t8,(t6,t7)))),(((t13,t12),t16),(t14,t15)))))),t1,t0); (t1,((t2,t3),(((t26,t27),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t14,t15))),(((t25,t24),(((t22,t21),(t20,t19)),(t18,t17))),t23))),(t5,t4))),t0); (t1,((t2,t3),(((t26,t27),((((t14,t15),((t11,((t8,(t7,t6)),(t10,t9))),((t25,t24),(t13,t12)))),t16),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t5,t4))),t0); (t1,((((t2,t3),(t26,t27)),((((t14,t15),((t13,t12),((t11,((t8,(t7,t6)),(t10,t9))),(t25,t24)))),t16),(((t18,t17),((t22,t21),(t20,t19))),t23))),(t5,t4)),t0); (t1,(((t26,t27),((((((t11,((t8,(t7,t6)),(t10,t9))),(t25,t24)),(t14,t15)),(t16,(t13,t12))),(((t18,t17),((t22,t21),(t20,t19))),t23)),(t2,t3))),(t5,t4)),t0); (t1,((((t26,t27),(((t14,t15),(t16,((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))))),(((t18,t17),((t22,t21),(t20,t19))),((t25,t24),t23)))),(t2,t3)),(t5,t4)),t0); (t1,((((t16,(((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9))))),(t14,t15))),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t2,t3),(t26,t27))),(t5,t4)),t0); (t1,(((t26,t27),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),((t14,t15),t16)),((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)))),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),((t27,(((((t18,t17),((t22,t21),(t20,t19))),t23),((((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),((t14,t15),t16)),(t25,t24))),t26)),(t5,t4))),t0); (t1,(((t2,t3),(((t14,t15),(((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))))),t16)),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(((t25,t24),(((t18,t17),((t22,t21),(t20,t19))),t23)),((t13,t12),((t16,(t14,t15)),(t11,((t8,(t7,t6)),(t10,t9))))))),((t5,t4),(t2,t3))),t0); (t1,((t2,t3),(((t26,t27),(t5,t4)),((((t24,t25),(t12,t13)),((t11,((t8,(t7,t6)),(t10,t9))),(t16,(t15,t14)))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t5,t4),((t2,t3),(((((t12,t13),(((t11,((t8,(t7,t6)),(t10,t9))),(t24,t25)),(t15,t14))),t16),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t0); (t1,((t2,t3),((((((t15,t14),t16),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9))))),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25))),(t26,t27)),(t5,t4))),t0); (t1,((t16,((((t12,t13),(t11,((t8,(t7,t6)),(t10,t9)))),((t23,((t18,t17),((t22,t21),(t19,t20)))),(t24,t25))),(t15,t14))),((t5,t4),((t26,t27),(t2,t3)))),t0); (t1,((t5,t4),((((t23,((t18,t17),((t22,t21),(t19,t20)))),((t24,t25),(((t15,t14),t16),((t12,t13),(t11,((t8,(t7,t6)),(t10,t9))))))),(t26,t27)),(t2,t3))),t0); (t1,((t2,t3),((t5,t4),((((t16,(t15,t14)),((t12,t13),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t26,t27)))),t0); (t1,((t5,t4),((t26,t27),((t2,t3),(((t16,((t11,((t8,(t7,t6)),(t10,t9))),(t15,t14))),((t12,t13),(t24,t25))),(t23,((t18,t17),((t22,t21),(t19,t20)))))))),t0); (t1,(t27,(((t2,t3),(t26,((((t11,((t8,(t7,t6)),(t10,t9))),((t15,t14),(t12,t13))),t16),(((t24,t25),t23),((t18,t17),((t22,t21),(t19,t20))))))),(t5,t4))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),(((t16,(t15,t14)),((t12,t13),((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t5,t4),(((t26,t27),(t2,t3)),((((t24,t25),(t11,((t8,(t7,t6)),(t10,t9)))),((t15,t14),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t19,t20))))))),t0); (t1,((t4,t5),((((t11,((t10,t9),(t8,(t6,t7)))),((t16,(t12,t13)),(t14,t15))),((t24,t25),(t23,((t18,t17),(t22,((t19,t20),t21)))))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),(t27,t26)),(((t16,((t14,t15),(((t24,t25),(t12,t13)),(t11,((t10,t9),(t8,(t6,t7))))))),(t23,(((t22,t21),(t18,t17)),(t19,t20)))),(t2,t3))),t0); (t1,((t2,t3),(((t27,t26),((((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t11,((t10,t9),(t8,(t6,t7)))),((t24,t25),(t12,t13))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21)))))),(t4,t5))),t0); (t1,((t2,t3),(((((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t19,t20),(t22,t21))))),((t4,t5),(t27,t26)))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((t12,t13),((t11,((t10,t9),(t8,(t6,t7)))),(t16,(t14,t15)))),((t24,t25),(t23,((t18,t17),((t19,t20),(t22,t21))))))))),t0); (t1,((((t2,t3),(t27,t26)),(((t12,t13),(t16,((t14,t15),(t11,((t10,t9),(t8,(t6,t7))))))),((t24,t25),((t18,t17),(((t19,t20),(t22,t21)),t23))))),(t4,t5)),t0); (t1,((((t2,t3),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),(t23,(t24,t25))),((t11,((t10,t9),(t8,(t6,t7)))),(t16,((t12,t13),(t14,t15)))))),(t4,t5)),t0); (t1,((((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),(t24,t25)))),(t4,t5)),(t2,t3)),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((t16,(t14,t15)),((t12,t13),(t11,((t10,t9),(t8,(t6,t7)))))),((t24,t25),(((t18,t17),((t19,t20),(t22,t21))),t23)))))),t0); (((t3,t2),(((t5,t4),(t26,t27)),(((t24,t25),(t23,((t19,t20),((t21,t22),(t18,t17))))),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),((t7,t6),t8)))))))),t1,t0); (((t5,t4),((t26,t27),((((t15,t14),(((t13,t12),(t11,((t10,t9),((t7,t6),t8)))),((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))))),t16),(t3,t2)))),t1,t0); ((((t5,t4),(((t24,t25),(t23,(((t22,t21),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))))),((t26,t27),(t3,t2))),t1,t0); ((((t5,t4),(t26,t27)),((t3,t2),((t23,(((t22,t21),(t19,t20)),(t18,t17))),((t16,(t15,t14)),(((t24,t25),(t13,t12)),(t11,((t10,t9),((t7,t6),t8)))))))),t1,t0); (((t5,t4),(((t26,t27),((t23,((t22,(t19,t20)),(t21,(t18,t17)))),(((t13,t12),t16),((t15,t14),((t11,((t10,t9),((t7,t6),t8))),(t24,t25)))))),(t3,t2))),t1,t0); (((t5,t4),((t26,t27),((((t24,t25),(t23,(((t21,t22),(t19,t20)),(t18,t17)))),((t16,(t15,t14)),((t11,((t10,t9),((t7,t6),t8))),(t13,t12)))),(t3,t2)))),t1,t0); ((((t26,t27),(t3,t2)),((t5,t4),((t23,((t22,(t19,t20)),(t21,(t18,t17)))),((((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)),((t15,t14),t16))))),t1,t0); (((t5,t4),((t26,t27),((t3,t2),(((t24,t25),((((t21,t22),(t19,t20)),(t18,t17)),t23)),(((t13,t12),(t15,t14)),(t16,(t11,((t10,t9),((t7,t6),t8))))))))),t1,t0); ((((t26,t27),(t3,t2)),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),((t15,t14),((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))))),t16),(t5,t4))),t1,t0); ((((t26,t27),(t3,t2)),(((((((t21,t22),(t19,t20)),(t18,t17)),t23),((t24,t25),(((t13,t12),(t15,t14)),(t11,((t10,t9),((t7,t6),t8)))))),t16),(t5,t4))),t1,t0); (t1,((t3,t2),(((t26,t27),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t12,t13),((t25,t24),(((t9,t10),((t6,t7),t8)),t11))),(t16,(t15,t14))))),(t4,t5))),t0); (t1,(((t26,t27),(((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((((t9,t10),((t6,t7),t8)),t11),((t16,(t15,t14)),(t12,t13))))),((t4,t5),(t3,t2))),t0); (t1,(((((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((t16,((t12,t13),(t15,t14))),(((t9,t10),((t6,t7),t8)),t11))),(t3,t2)),((t26,t27),(t4,t5))),t0); (t1,(((((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t12,t13),((t25,t24),((t15,t14),(((t9,t10),((t6,t7),t8)),t11))))),t16),((t3,t2),(t26,t27))),(t4,t5)),t0); (t1,((t3,t2),((t26,(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t15,t14)),((((t9,t10),((t6,t7),t8)),t11),((t12,t13),(t25,t24))))),t27)),(t4,t5))),t0); (t1,((t27,(t3,t2)),((t26,((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t15,t14)),((t25,t24),((((t9,t10),((t6,t7),t8)),t11),(t12,t13)))))),(t4,t5))),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),((((t16,(t15,t14)),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(t25,t24))))),t0); (t1,((t4,t5),((t26,t27),((t3,t2),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t15,t14),((((t9,t10),((t6,t7),t8)),t11),(t25,t24))),(t16,(t12,t13))))))),t0); (t1,(((t3,t2),(((t25,t24),(t23,(((t20,t19),(t22,t21)),(t18,t17)))),((t16,(t15,t14)),((t12,t13),(((t9,t10),((t6,t7),t8)),t11))))),((t4,t5),(t26,t27))),t0); (t1,(((t3,t2),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t25,t24),(((t9,t10),((t6,t7),t8)),t11)),(t12,t13)),(t16,(t15,t14))))),((t4,t5),(t26,t27))),t0); (((((t16,((t14,t15),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))))),(((t18,t17),((t22,t21),(t19,t20))),t23)),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); (((((((t14,t15),t16),((t13,t12),(t11,(((t7,t6),t8),(t9,t10))))),((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20)))))),(t27,t26)),((t2,t3),(t4,t5))),t1,t0); ((((t16,(((t13,t12),(t11,(((t7,t6),t8),(t9,t10)))),(t14,t15))),((t24,t25),(t23,((t18,t17),((t22,t21),(t19,t20)))))),((t4,t5),((t27,t26),(t2,t3)))),t1,t0); ((((t27,t26),(t2,t3)),((t16,((((t13,t12),((t24,t25),(t11,(((t7,t6),t8),(t9,t10))))),(t14,t15)),(t23,((t18,t17),((t22,t21),(t19,t20)))))),(t4,t5))),t1,t0); (((((t16,((t14,t15),(t11,(((t7,t6),t8),(t9,t10))))),((t13,t12),(t24,t25))),(t23,((t18,t17),((t22,t21),(t19,t20))))),((t4,t5),((t27,t26),(t2,t3)))),t1,t0); ((((t27,t26),(((((t14,t15),((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t24,t25)))),(t23,((t18,t17),((t22,t21),(t19,t20))))),t16),(t2,t3))),(t4,t5)),t1,t0); ((((t27,t26),((((t14,t15),(t16,((t11,(((t7,t6),t8),(t9,t10))),((t13,t12),(t24,t25))))),(t23,((t18,t17),((t22,t21),(t19,t20))))),(t2,t3))),(t4,t5)),t1,t0); ((((t27,t26),((t23,((t18,t17),((t22,t21),(t19,t20)))),(((t13,t12),t16),((t24,t25),((t14,t15),(t11,(((t7,t6),t8),(t9,t10)))))))),((t2,t3),(t4,t5))),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t23,((t18,t17),((t22,t21),(t19,t20)))),((((t24,t25),(t13,t12)),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t14,t15))))))),t1,t0); (((t2,t3),((t4,t5),((t27,t26),((t16,(t14,t15)),((t23,((t18,t17),((t22,t21),(t19,t20)))),((t13,t12),((t11,(((t7,t6),t8),(t9,t10))),(t24,t25)))))))),t1,t0); (t1,((((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),(((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12)),(t16,(t14,t15)))),((t5,t4),((t2,t3),(t27,t26)))),t0); (t1,((t5,t4),(((t2,t3),(t27,t26)),(t16,((t14,t15),(((t25,t24),(t23,((t18,t17),((t21,t22),(t20,t19))))),((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12))))))),t0); (t1,((t2,t3),(((t27,t26),((t23,((t21,(t20,t19)),(t22,(t18,t17)))),((t14,t15),(((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24)),((t13,t12),t16))))),(t5,t4))),t0); (t1,((t2,t3),(((t27,t26),(((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t6,t7)))),(t13,t12))))),(t5,t4))),t0); (t1,((t5,t4),((t27,t26),((t2,t3),((t23,(((t22,t21),(t20,t19)),(t18,t17))),((t16,(t14,t15)),((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))))),t0); (t1,(((t23,(((t22,t21),(t20,t19)),(t18,t17))),(t16,((t14,t15),((t11,((t9,t10),(t8,(t6,t7)))),((t25,t24),(t13,t12)))))),((t27,t26),((t5,t4),(t2,t3)))),t0); (t1,((((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t13,t12),((t11,((t9,t10),(t8,(t6,t7)))),(t25,t24))),(t16,(t14,t15)))),((t27,t26),(t2,t3))),(t5,t4)),t0); (t1,(((t2,t3),((((t25,t24),(t23,(((t22,t21),(t20,t19)),(t18,t17)))),(((t13,t12),(t11,((t9,t10),(t8,(t6,t7))))),(t16,(t14,t15)))),(t27,t26))),(t5,t4)),t0); (t1,((((t23,((((t22,t21),(t20,t19)),(t18,t17)),(t25,t24))),((t11,((t9,t10),(t8,(t6,t7)))),(t16,((t14,t15),(t13,t12))))),(t27,t26)),((t5,t4),(t2,t3))),t0); (t1,(((t5,t4),((t23,(((t22,t21),(t20,t19)),(t18,t17))),(((t25,t24),(t13,t12)),((t11,((t9,t10),(t8,(t6,t7)))),(t16,(t14,t15)))))),((t27,t26),(t2,t3))),t0); (t1,((t5,t4),(((t27,t26),(((((t13,t12),(t24,t25)),(t16,(t11,(((t6,t7),t8),(t9,t10))))),(t15,t14)),((((t20,t19),(t21,t22)),(t17,t18)),t23))),(t3,t2))),t0); (t1,(((t27,t26),(t3,t2)),((t5,t4),(((((t13,t12),(t24,t25)),((t11,(((t6,t7),t8),(t9,t10))),(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),t23)),t16))),t0); (t1,((t3,t2),((((((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t15,t14),(t13,t12))),t16),((((t20,t19),(t21,t22)),(t17,t18)),t23)),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),(((t26,t27),(t3,t2)),(t16,(((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t24,t25),(t11,(((t6,t7),t8),(t9,t10)))),((t15,t14),(t13,t12))))))),t0); (t1,((((((t20,t19),(t21,t22)),(t17,t18)),t23),((((t15,t14),t16),((t11,(((t6,t7),t8),(t9,t10))),(t13,t12))),(t24,t25))),((t26,t27),((t5,t4),(t3,t2)))),t0); (t1,(((((((t20,t19),(t21,t22)),(t17,t18)),t23),(((t16,(t13,t12)),((t15,t14),(t11,(((t6,t7),t8),(t9,t10))))),(t24,t25))),((t3,t2),(t26,t27))),(t5,t4)),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t11,(((t6,t7),t8),(t9,t10))),((t16,(t13,t12)),(t15,t14))),((t24,t25),((((t20,t19),(t21,t22)),(t17,t18)),t23))))),t0); (t1,(((t3,t2),(((t11,(((t6,t7),t8),(t9,t10))),(((t24,t25),(t13,t12)),((t15,t14),t16))),((((t20,t19),(t21,t22)),(t17,t18)),t23))),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(t3,t2)),(((t16,(((t13,t12),(t11,(((t6,t7),t8),(t9,t10)))),(t15,t14))),((t24,t25),((((t20,t19),(t21,t22)),(t17,t18)),t23))),(t5,t4))),t0); (t1,(((t5,t4),(t3,t2)),((t26,((((t13,t12),t16),((t11,(((t6,t7),t8),(t9,t10))),(t15,t14))),((((t20,t19),(t21,t22)),(t17,t18)),(t23,(t24,t25))))),t27)),t0); (t1,((t27,(t3,t2)),((t4,t5),(t26,((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),t16),((t12,t13),((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)))))))),t0); (t1,(((t26,t27),((t3,t2),(t4,t5))),((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),t16),((t12,t13),((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)))))),t0); (t1,((t3,t2),((t4,t5),(((((t25,t24),t23),(((t22,t21),(t19,t20)),(t17,t18))),((((t14,t15),t16),(((t8,(t7,t6)),(t10,t9)),t11)),(t12,t13))),(t26,t27)))),t0); (t1,((t3,t2),((t4,t5),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)))),(t26,t27)))),t0); (t1,((t4,t5),((((t25,t24),(t23,(((t22,t21),(t19,t20)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)))),((t3,t2),(t26,t27)))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((t23,((t22,(t21,(t19,t20))),(t17,t18))),((((((t8,(t7,t6)),(t10,t9)),t11),((t25,t24),(t12,t13))),(t14,t15)),t16))))),t0); (t1,(((t3,t2),(((t25,t24),(t23,(((t19,t20),(t22,t21)),(t17,t18)))),(((t14,t15),t16),((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13))))),((t4,t5),(t26,t27))),t0); (t1,((t4,t5),((((t14,t15),(((((t8,(t7,t6)),(t10,t9)),t11),(t12,t13)),((((t19,t20),(t22,t21)),(t17,t18)),((t25,t24),t23)))),t16),((t26,t27),(t3,t2)))),t0); (t1,(((t26,t27),((t23,(((t19,t20),(t22,t21)),(t17,t18))),((t16,(t12,t13)),(((t25,t24),(((t8,(t7,t6)),(t10,t9)),t11)),(t14,t15))))),((t3,t2),(t4,t5))),t0); (t1,((t3,t2),((t4,t5),((t26,t27),((((((t8,(t7,t6)),(t10,t9)),t11),(t14,t15)),(((t12,t13),(t25,t24)),(t23,((t21,((t19,t20),t22)),(t17,t18))))),t16)))),t0); (((t2,t3),(((t23,((t17,t18),((t19,t20),(t21,t22)))),(t16,((t14,t15),(((t24,t25),(t13,t12)),(t11,((t8,(t6,t7)),(t10,t9))))))),((t4,t5),(t26,t27)))),t1,t0); ((((t4,t5),((t26,t27),(((t24,t25),((t17,t18),(((t19,t20),(t21,t22)),t23))),(t16,(((t13,t12),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t2,t3)),t1,t0); ((((t4,t5),((t26,t27),(((((t17,t18),((t19,t20),t21)),t22),t23),(((t24,t25),(t13,t12)),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),(t2,t3)),t1,t0); (((t4,t5),(((t26,t27),(((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))))),(t2,t3))),t1,t0); (((t2,t3),(((t4,t5),(t26,t27)),((((t24,t25),(((t19,t20),((t22,t21),(t17,t18))),t23)),((t13,t12),((t14,t15),(t11,((t8,(t6,t7)),(t10,t9)))))),t16))),t1,t0); (((t2,t3),(((t4,t5),(t26,t27)),(((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),(t16,(((t13,t12),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))))),t1,t0); (((((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)),(((t16,(t13,t12)),(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9))))),((t2,t3),((t4,t5),(t26,t27)))),t1,t0); (((t2,t3),((t4,t5),(((((t17,t18),((t19,t20),(t22,t21))),t23),((t16,(t14,t15)),((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t24,t25))))),(t26,t27)))),t1,t0); (((((((t17,t18),((t19,t20),(t22,t21))),t23),(((t16,(t24,t25)),((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12))),(t14,t15))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21))))),((t13,t12),((t16,(t14,t15)),(t11,((t8,(t6,t7)),(t10,t9)))))),(t26,t27)),((t2,t3),(t4,t5))),t1,t0); ((((t26,t27),((t23,((t18,t17),((t22,t21),(t20,t19)))),(((t14,t15),t16),((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t24,t25)))))),((t5,t4),(t3,t2))),t1,t0); ((((t3,t2),((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,((((t9,t10),(t8,(t6,t7))),t11),((t12,t13),(t24,t25))))))),((t5,t4),(t26,t27))),t1,t0); (((t5,t4),(((t26,t27),(((t24,t25),(t23,((t22,(t18,t17)),(t21,(t20,t19))))),(((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)),((t14,t15),t16)))),(t3,t2))),t1,t0); ((((t26,t27),(((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(((((t9,t10),(t8,(t6,t7))),t11),(t12,t13)),((t14,t15),t16)))),((t3,t2),(t5,t4))),t1,t0); ((((t26,t27),(t3,t2)),((t5,t4),((((t14,t15),t16),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t1,t0); (((t5,t4),(((((((t9,t10),(t8,(t6,t7))),t11),(t24,t25)),((t14,t15),((t12,t13),t16))),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t26,t27),(t3,t2)))),t1,t0); (((t5,t4),(((((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,(t27,(t3,t2))))),t1,t0); (((((t16,((t14,t15),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,t27)),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),((((t16,((t14,t15),((((t9,t10),(t8,(t6,t7))),t11),((t24,t25),(t12,t13))))),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t26,t27)),(t5,t4))),t1,t0); (((t5,t4),(((((t12,t13),((((t9,t10),(t8,(t6,t7))),t11),(t24,t25))),(t16,(t14,t15))),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t3,t2),(t26,t27)))),t1,t0); (t1,(((((t16,(t14,t15)),((t11,((t9,t10),((t6,t7),t8))),(t12,t13))),((t25,t24),(t23,((t17,t18),((t19,t20),(t21,t22)))))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,(((((t16,(t14,t15)),((t11,((t9,t10),((t6,t7),t8))),(t12,t13))),((t25,t24),(((t19,t20),(t21,t22)),(t23,(t17,t18))))),((t4,t5),(t26,t27))),(t3,t2)),t0); (t1,((t4,t5),((((t11,((t9,t10),((t6,t7),t8))),((t12,t13),(t16,(t14,t15)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23))),((t26,t27),(t3,t2)))),t0); (t1,(((((t16,(t14,t15)),(((t25,t24),(t11,((t9,t10),((t6,t7),t8)))),(t12,t13))),((((t19,t20),(t21,t22)),(t17,t18)),t23)),(t26,t27)),((t4,t5),(t3,t2))),t0); (t1,((t4,t5),((((t11,((t9,t10),((t6,t7),t8))),(((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t14,t15),(t12,t13)))),t16),((t26,t27),(t3,t2)))),t0); (t1,(((t16,(t14,t15)),(((t11,((t9,t10),((t6,t7),t8))),((t25,t24),(t12,t13))),((((t19,t20),(t21,t22)),(t17,t18)),t23))),(((t4,t5),(t26,t27)),(t3,t2))),t0); (t1,((t4,t5),((t16,((t14,t15),(((t12,t13),(t11,((t9,t10),((t6,t7),t8)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23))))),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((t3,t2),((((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)),((t16,(t14,t15)),((t12,t13),(t11,((t9,t10),((t6,t7),t8)))))),(t26,t27)))),t0); (t1,((t4,t5),((((((t19,t20),(t21,t22)),(t17,t18)),t23),((t16,(t14,t15)),(((t25,t24),(t12,t13)),(t11,((t9,t10),((t6,t7),t8)))))),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((((t14,t15),(((t12,t13),(t11,((t9,t10),((t6,t7),t8)))),((t25,t24),((((t19,t20),(t21,t22)),(t17,t18)),t23)))),t16),((t26,t27),(t3,t2)))),t0); (t1,((t4,t5),((((((((t7,t6),t8),(t9,t10)),t11),((t24,t25),(t12,t13))),(t16,(t15,t14))),(t23,(t22,(((t20,t19),t21),(t18,t17))))),((t2,t3),(t27,t26)))),t0); (t1,(((t4,t5),((t27,t26),(((t12,t13),(t16,(((((t7,t6),t8),(t9,t10)),t11),(t15,t14)))),((t24,t25),(t23,(((t20,t19),(t22,t21)),(t18,t17))))))),(t2,t3)),t0); (t1,((((t4,t5),(t26,((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t12,t13),((((t7,t6),t8),(t9,t10)),t11)),((t15,t14),t16)),(t24,t25))))),(t2,t3)),t27),t0); (t1,((((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t16,(t12,t13)),((t24,t25),((((t7,t6),t8),(t9,t10)),t11))),(t15,t14))),((t4,t5),(t27,t26))),(t2,t3)),t0); (t1,((t4,t5),(((t27,t26),(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((((t12,t13),(t24,t25)),((((t7,t6),t8),(t9,t10)),t11)),(t15,t14))),t16)),(t2,t3))),t0); (t1,(((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(((t12,t13),(t24,t25)),((((t7,t6),t8),(t9,t10)),t11))),(t15,t14))),((t2,t3),((t4,t5),(t27,t26)))),t0); (t1,((t2,t3),((t27,(t26,(t4,t5))),((t23,((((t20,t19),(t22,t21)),(t18,t17)),(t24,t25))),((((((t7,t6),t8),(t9,t10)),t11),(t12,t13)),((t15,t14),t16))))),t0); (t1,((t2,t3),(((t27,t26),((t23,(((t20,t19),(t22,t21)),(t18,t17))),(((t24,t25),((((t7,t6),t8),(t9,t10)),t11)),((t16,(t12,t13)),(t15,t14))))),(t4,t5))),t0); (t1,(((t27,t26),((t23,(((t20,t19),(t22,t21)),(t18,t17))),((t16,(t24,t25)),((((((t7,t6),t8),(t9,t10)),t11),(t15,t14)),(t12,t13))))),((t4,t5),(t2,t3))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),(((((((t7,t6),t8),(t9,t10)),t11),(t16,(t15,t14))),((t24,t25),(t12,t13))),(t23,(((t20,t19),(t22,t21)),(t18,t17))))))),t0); (t1,(((t23,((t18,t17),((t22,t21),(t20,t19)))),((((t24,t25),(t11,(((t7,t6),t8),(t9,t10)))),(t15,t14)),((t13,t12),t16))),(((t26,t27),(t3,t2)),(t5,t4))),t0); (t1,((t5,t4),((((t11,(((t7,t6),t8),(t9,t10))),((t15,t14),((t13,t12),t16))),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t24,t25))),((t26,t27),(t3,t2)))),t0); (t1,(((t5,t4),(t26,t27)),((t3,t2),((((t13,t12),(t11,(((t7,t6),t8),(t9,t10)))),(t16,(t15,t14))),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t24,t25))))),t0); (t1,(((t3,t2),(t26,t27)),((t5,t4),(((t11,(((t7,t6),t8),(t9,t10))),((t16,(t15,t14)),((t24,t25),(t13,t12)))),(t23,((t18,t17),((t22,t21),(t20,t19))))))),t0); (t1,(((t3,t2),(t5,t4)),((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t26,t27))),t0); (t1,(((t3,t2),(t5,t4)),((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19)))))),(t26,t27))),t0); (t1,((((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),(t13,t12))),((t24,t25),(((t22,t21),(t20,t19)),(t23,(t18,t17))))),((t5,t4),((t26,t27),(t3,t2)))),t0); (t1,((t5,t4),((t3,t2),((t27,t26),(((t16,(t15,t14)),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12)))),((((t22,t21),(t20,t19)),(t18,t17)),t23))))),t0); (t1,(((t27,t26),(t3,t2)),(((t16,((t15,t14),((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))))),((((t22,t21),(t20,t19)),(t18,t17)),t23)),(t5,t4))),t0); (t1,(((t3,t2),((((t11,(((t7,t6),t8),(t9,t10))),((t24,t25),(t13,t12))),(t16,(t15,t14))),(((t21,(t22,(t20,t19))),(t18,t17)),t23))),((t5,t4),(t27,t26))),t0); (t1,(((t16,((((t24,t25),(t13,t12)),(t11,((t9,t10),(t8,(t7,t6))))),(t15,t14))),(((t17,t18),(t22,(t21,(t19,t20)))),t23)),((t5,t4),((t27,t26),(t2,t3)))),t0); (t1,((t2,t3),((t5,t4),(((((t13,t12),(t11,((t9,t10),(t8,(t7,t6))))),((t15,t14),t16)),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),(t27,t26)))),t0); (t1,((t5,t4),((((((t17,t18),((t19,t20),(t22,t21))),t23),(((t16,(t13,t12)),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),(t24,t25))),(t27,t26)),(t2,t3))),t0); (t1,((t5,t4),((((t11,((t9,t10),(t8,(t7,t6)))),((t15,t14),(t16,(t13,t12)))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),((t27,t26),(t2,t3)))),t0); (t1,((t2,t3),((t5,t4),(((((t15,t14),t16),((t11,((t9,t10),(t8,(t7,t6)))),((t24,t25),(t13,t12)))),(((t17,t18),((t19,t20),(t22,t21))),t23)),(t27,t26)))),t0); (t1,(((((t15,t14),t16),((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25)))),(((t17,t18),((t19,t20),(t22,t21))),t23)),((t2,t3),((t27,t26),(t5,t4)))),t0); (t1,((((((t15,t14),t16),((t11,((t9,t10),(t8,(t7,t6)))),(t13,t12))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23))),((t2,t3),(t27,t26))),(t5,t4)),t0); (t1,(((t2,t3),(t27,t26)),((t5,t4),((((t17,t18),((t19,t20),(t22,t21))),t23),(t16,(((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14)),((t13,t12),(t24,t25))))))),t0); (t1,((t16,(((t13,t12),((t11,((t9,t10),(t8,(t7,t6)))),(t15,t14))),((t24,t25),(((t17,t18),((t19,t20),(t22,t21))),t23)))),(((t2,t3),(t27,t26)),(t5,t4))),t0); (t1,((t5,t4),((((((t17,t18),((t19,t20),(t22,t21))),t23),((t16,((t11,((t9,t10),(t8,(t7,t6)))),(t24,t25))),((t13,t12),(t15,t14)))),(t2,t3)),(t27,t26))),t0); (t1,(((t16,((t15,t14),((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24))))),(((t18,t17),((t20,t19),(t22,t21))),t23)),(((t5,t4),(t27,t26)),(t2,t3))),t0); (t1,((((((t16,(t12,t13)),(((t10,t9),(t8,(t6,t7))),t11)),(t15,t14)),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),(t5,t4)),((t2,t3),(t26,t27))),t0); (t1,(((((t12,t13),(((t10,t9),(t8,(t6,t7))),t11)),(t16,(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),((t5,t4),((t2,t3),(t26,t27)))),t0); (t1,((((((t12,t13),(((t10,t9),(t8,(t6,t7))),t11)),(t16,(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))),(t2,t3)),((t26,t27),(t5,t4))),t0); (t1,(((t26,t27),(((((t10,t9),(t8,(t6,t7))),t11),(t16,((t15,t14),(t12,t13)))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23)))),((t2,t3),(t5,t4))),t0); (t1,((t2,t3),(((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,(((t12,t13),(t15,t14)),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24))))),((t5,t4),(t26,t27)))),t0); (t1,((t5,t4),((t2,t3),((t26,t27),((((t18,t17),((t20,t19),(t22,t21))),t23),(t16,((t15,t14),((((t10,t9),(t8,(t6,t7))),t11),((t25,t24),(t12,t13))))))))),t0); (t1,((t2,t3),((t16,(((t15,t14),((t12,t13),((((t10,t9),(t8,(t6,t7))),t11),(t25,t24)))),(((t18,t17),((t20,t19),(t22,t21))),t23))),((t5,t4),(t26,t27)))),t0); (t1,((t2,t3),((t5,t4),((t26,t27),(((((t10,t9),(t8,(t6,t7))),t11),((t16,(t12,t13)),(t15,t14))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23)))))),t0); (t1,((t5,t4),(((t2,t3),(t26,t27)),(((t16,(t12,t13)),((t15,t14),(((t10,t9),(t8,(t6,t7))),t11))),((t25,t24),(((t18,t17),((t20,t19),(t22,t21))),t23))))),t0); ((((t27,t26),(t4,t5)),((t2,t3),((t23,((t18,t17),((t22,t21),(t20,t19)))),(t16,((((t24,t25),(t12,t13)),(t11,((t10,t9),((t7,t6),t8)))),(t14,t15)))))),t1,t0); (((t2,t3),((((t23,((t18,t17),((t22,t21),(t20,t19)))),((t14,t15),(t16,(((t24,t25),(t12,t13)),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),(((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16))),(t27,t26)),(t4,t5))),t1,t0); (((t2,t3),((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),(t16,(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t14,t15)))),((t27,t26),(t4,t5)))),t1,t0); (((((t24,t25),(t23,((t18,t17),((t22,t21),(t20,t19))))),((t11,((t10,t9),((t7,t6),t8))),((t14,t15),((t12,t13),t16)))),(((t27,t26),(t4,t5)),(t2,t3))),t1,t0); (((t4,t5),(((t23,(((t18,t17),((t22,t21),(t20,t19))),(t24,t25))),((t12,t13),(t16,((t11,((t10,t9),((t7,t6),t8))),(t14,t15))))),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),(((t23,((t21,(t18,t17)),(t22,(t20,t19)))),(((t24,t25),(t12,t13)),((t11,((t10,t9),((t7,t6),t8))),((t14,t15),t16)))),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),((((t24,t25),(t23,((t18,t17),((t21,t22),(t20,t19))))),((((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),(t14,t15)),t16)),((t2,t3),(t27,t26)))),t1,t0); (((t4,t5),((((((t18,t17),((t21,t22),(t20,t19))),((t24,t25),t23)),(((t11,((t10,t9),((t7,t6),t8))),(t12,t13)),((t14,t15),t16))),(t27,t26)),(t2,t3))),t1,t0); (((t4,t5),(((t2,t3),((t23,((t18,t17),((t21,t22),(t20,t19)))),(((t24,t25),(t12,t13)),(((t14,t15),t16),(t11,((t10,t9),((t7,t6),t8))))))),(t27,t26))),t1,t0); (((t3,t2),(((((((t25,t24),(t11,((t8,(t6,t7)),(t10,t9)))),(t13,t12)),((t15,t14),t16)),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(t27,t26)),(t5,t4))),t1,t0); ((((((t25,t24),((t11,((t8,(t6,t7)),(t10,t9))),((t15,t14),((t13,t12),t16)))),((((t22,t21),(t20,t19)),(t17,t18)),t23)),((t3,t2),(t27,t26))),(t5,t4)),t1,t0); (((t3,t2),(((t27,t26),((t16,(((t11,((t8,(t6,t7)),(t10,t9))),((t13,t12),(t25,t24))),(t15,t14))),((((t22,t21),(t20,t19)),(t17,t18)),t23))),(t5,t4))),t1,t0); ((((t27,t26),((((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t15,t14),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))),((t5,t4),(t3,t2))),t1,t0); (((t3,t2),(((t27,t26),((((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t15,t14),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))),(t5,t4))),t1,t0); (((t5,t4),(((t27,t26),(t3,t2)),((((t15,t14),(t11,((t8,(t6,t7)),(t10,t9)))),((t13,t12),t16)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23))))),t1,t0); (((((((t15,t14),((t25,t24),(t11,((t8,(t6,t7)),(t10,t9))))),(t16,(t13,t12))),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(t27,t26)),((t5,t4),(t3,t2))),t1,t0); (((t5,t4),(((t3,t2),(t16,((t15,t14),(((t11,((t8,(t6,t7)),(t10,t9))),(t13,t12)),((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)))))),(t27,t26))),t1,t0); (((t3,t2),((((t25,t24),((((t22,t21),(t20,t19)),(t17,t18)),t23)),(((t11,((t8,(t6,t7)),(t10,t9))),((t15,t14),(t13,t12))),t16)),((t27,t26),(t5,t4)))),t1,t0); ((((t27,t26),(t5,t4)),((t3,t2),(((((t22,t21),(t20,t19)),(t17,t18)),t23),((((t11,((t8,(t6,t7)),(t10,t9))),(t15,t14)),t16),((t25,t24),(t13,t12)))))),t1,t0); (t1,(((t4,t5),((((t14,t15),t16),((t11,((t10,t9),((t7,t6),t8))),(t13,t12))),((t24,t25),(t23,((t17,t18),((t22,t21),(t19,t20))))))),((t26,t27),(t3,t2))),t0); (t1,((t4,t5),(((((t24,t25),(t13,t12)),(((t14,t15),t16),(t11,((t10,t9),((t7,t6),t8))))),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((((((t14,t15),t16),((t11,((t10,t9),((t7,t6),t8))),((t24,t25),(t13,t12)))),(t23,((t17,t18),((t22,t21),(t19,t20))))),(t26,t27)),(t4,t5))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),((t13,t12),((t14,t15),t16))),(t23,((t17,t18),((t22,t21),(t19,t20))))),((t3,t2),(t26,t27))),(t4,t5)),t0); (t1,((((((t14,t15),t16),(((t11,((t10,t9),((t7,t6),t8))),(t24,t25)),(t13,t12))),(t23,((t17,t18),((t22,t21),(t19,t20))))),(t3,t2)),((t4,t5),(t26,t27))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t14,t15))),t16),(((t24,t25),t23),((t17,t18),((t22,t21),(t19,t20))))),((t27,t26),(t3,t2))),(t4,t5)),t0); (t1,((t3,t2),((((((t11,((t10,t9),((t7,t6),t8))),(t13,t12)),(t16,(t14,t15))),((((t17,t18),((t22,t21),(t19,t20))),t23),(t24,t25))),(t27,t26)),(t4,t5))),t0); (t1,(((t3,t2),((((t17,t18),((t22,t21),(t19,t20))),t23),((t14,t15),(t16,(((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)))))),((t27,t26),(t4,t5))),t0); (t1,((t4,t5),((((((t17,t18),((t22,t21),(t19,t20))),t23),(((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))),((t14,t15),t16))),(t27,t26)),(t3,t2))),t0); (t1,((t3,t2),((t4,t5),(((((t17,t18),((t22,t21),(t19,t20))),t23),(((t13,t12),((t24,t25),(t11,((t10,t9),((t7,t6),t8))))),((t14,t15),t16))),(t27,t26)))),t0); (((t4,t5),(((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),(t25,t24))),((t13,t12),t16))),((t2,t3),(t26,t27)))),t1,t0); (((t2,t3),(((t26,t27),(t4,t5)),((t23,((t17,t18),((t22,t21),(t20,t19)))),(((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),((t13,t12),(t25,t24)))),t16)))),t1,t0); (((t4,t5),((((t23,((t17,t18),((t22,t21),(t20,t19)))),((t15,t14),(((t25,t24),(((((t6,t7),t8),(t10,t9)),t11),(t13,t12))),t16))),(t2,t3)),(t26,t27))),t1,t0); (((t2,t3),((t4,t5),((t26,t27),((t23,((t17,t18),((t22,t21),(t20,t19)))),((t25,t24),((((((t6,t7),t8),(t10,t9)),t11),(t13,t12)),(t16,(t15,t14)))))))),t1,t0); (((t4,t5),(((t2,t3),(t26,t27)),((((t15,t14),(((((t6,t7),t8),(t10,t9)),t11),((t25,t24),(t13,t12)))),(t23,((t17,t18),((t22,t21),(t20,t19))))),t16))),t1,t0); ((((t2,t3),(t26,t27)),(((((t13,t12),(((((t6,t7),t8),(t10,t9)),t11),(t25,t24))),(t16,(t15,t14))),(t23,((t17,t18),((t22,t21),(t20,t19))))),(t4,t5))),t1,t0); ((((t2,t3),((((((((t6,t7),t8),(t10,t9)),t11),((t25,t24),(t13,t12))),(t15,t14)),(t23,((t17,t18),((t22,t21),(t20,t19))))),t16)),((t4,t5),(t26,t27))),t1,t0); (((t2,t3),(((((t25,t24),(((t15,t14),t16),((t13,t12),((((t6,t7),t8),(t10,t9)),t11)))),(t23,((t17,t18),((t22,t21),(t20,t19))))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),((((t16,(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),(t15,t14))),((t23,((t17,t18),((t22,t21),(t20,t19)))),(t25,t24))),(t26,t27)),(t4,t5))),t1,t0); (((t2,t3),(((((t13,t12),(((((t6,t7),t8),(t10,t9)),t11),((t15,t14),t16))),((t23,((t17,t18),((t22,t21),(t20,t19)))),(t25,t24))),(t26,t27)),(t4,t5))),t1,t0); (t1,((t2,t3),((t4,t5),((((((t13,t12),(t24,t25)),(((t8,(t7,t6)),(t10,t9)),t11)),((t15,t14),t16)),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,((t2,t3),((t4,t5),((((t15,t14),(t16,(((t13,t12),(t24,t25)),(((t8,(t7,t6)),(t10,t9)),t11)))),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,((t2,t3),((t4,t5),((((t16,(t15,t14)),((t13,t12),((t24,t25),(((t8,(t7,t6)),(t10,t9)),t11)))),((((t22,t21),(t19,t20)),(t17,t18)),t23)),(t26,t27)))),t0); (t1,(((t2,t3),(t16,((t15,t14),(((((t8,(t7,t6)),(t10,t9)),t11),(t13,t12)),((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)))))),((t26,t27),(t4,t5))),t0); (t1,((((t24,t25),(((t8,(t7,t6)),(t10,t9)),t11)),(((t15,t14),(t13,t12)),(t16,((((t22,t21),(t19,t20)),(t17,t18)),t23)))),(((t2,t3),(t26,t27)),(t4,t5))),t0); (t1,((t2,t3),(((t26,t27),(t4,t5)),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t16,(t15,t14)),(((t8,(t7,t6)),(t10,t9)),t11)),((t24,t25),(t13,t12)))))),t0); (t1,(((t26,t27),(t4,t5)),((((((t22,t21),(t19,t20)),(t17,t18)),t23),(((t16,(t15,t14)),(((t8,(t7,t6)),(t10,t9)),t11)),((t24,t25),(t13,t12)))),(t2,t3))),t0); (t1,(((t26,t27),(((t24,t25),((((t22,t21),(t19,t20)),(t17,t18)),t23)),((t16,((t15,t14),(((t8,(t7,t6)),(t10,t9)),t11))),(t13,t12)))),((t2,t3),(t4,t5))),t0); (t1,((t4,t5),(((t26,t27),(((((t22,t21),(t19,t20)),(t17,t18)),t23),(((((t8,(t7,t6)),(t10,t9)),t11),((t16,(t15,t14)),(t13,t12))),(t24,t25)))),(t2,t3))),t0); (t1,((t2,t3),((t4,t5),((t26,t27),(((t16,(t15,t14)),((t13,t12),(((t8,(t7,t6)),(t10,t9)),t11))),((t24,t25),(((t19,t20),((t17,t18),(t22,t21))),t23)))))),t0); (t1,((((((t17,t18),((t21,t22),(t20,t19))),t23),(((t11,((t10,t9),((t7,t6),t8))),(((t14,t15),t16),(t13,t12))),(t24,t25))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((((t14,t15),t16),((t13,t12),(t11,((t10,t9),((t7,t6),t8))))),(t24,t25))),(t26,t27)),(t3,t2))),t0); (t1,((t4,t5),(((t26,t27),(t3,t2)),((((t11,((t10,t9),((t7,t6),t8))),(t14,t15)),(t16,(t13,t12))),((t24,t25),(((t17,t18),((t21,t22),(t20,t19))),t23))))),t0); (t1,((((((t11,((t10,t9),((t7,t6),t8))),(t14,t15)),(t13,t12)),((t24,t25),(((t20,t19),((t17,t18),(t21,t22))),t23))),t16),((t3,t2),((t4,t5),(t26,t27)))),t0); (t1,(((t4,t5),(t26,t27)),(((((t17,t18),((t21,t22),(t20,t19))),t23),((t16,(t14,t15)),(((t13,t12),(t24,t25)),(t11,((t10,t9),((t7,t6),t8)))))),(t3,t2))),t0); (t1,((t3,t2),(((t26,t27),((((t17,t18),((t21,t22),(t20,t19))),t23),(((t13,t12),(t24,t25)),((t14,t15),((t11,((t10,t9),((t7,t6),t8))),t16))))),(t4,t5))),t0); (t1,((((t24,t25),(((t17,t18),((t21,t22),(t20,t19))),t23)),((t11,((t10,t9),((t7,t6),t8))),(t16,((t13,t12),(t14,t15))))),((t4,t5),((t26,t27),(t3,t2)))),t0); (t1,((t3,t2),((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((((t11,((t10,t9),((t7,t6),t8))),(t16,(t13,t12))),(t14,t15)),(t24,t25))),t26),t27))),t0); (t1,((t4,t5),((((((t17,t18),((t21,t22),(t20,t19))),t23),((t16,(t14,t15)),(((t24,t25),(t11,((t10,t9),((t7,t6),t8)))),(t13,t12)))),(t26,t27)),(t3,t2))),t0); (t1,((((((t17,t18),((t21,t22),(t20,t19))),t23),((t14,t15),(((t11,((t10,t9),((t7,t6),t8))),((t13,t12),(t24,t25))),t16))),(t26,t27)),((t3,t2),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((t15,t14),t16),((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13)))),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((t16,(((t12,t13),((((t9,t10),(t8,(t7,t6))),t11),(t25,t24))),(t15,t14))),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t2,t3),(((t27,t26),((((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13))),((t15,t14),t16)),(((t18,t17),((t19,t20),(t22,t21))),t23))),(t4,t5))),t0); (t1,((t4,t5),((t2,t3),((t27,t26),((((((t9,t10),(t8,(t7,t6))),t11),(t12,t13)),((t15,t14),t16)),((t25,t24),(((t18,t17),((t19,t20),(t22,t21))),t23)))))),t0); (t1,((t2,t3),(((t4,t5),(t27,t26)),((((t18,t17),((t19,t20),(t22,t21))),t23),(t16,(((((t9,t10),(t8,(t7,t6))),t11),((t25,t24),(t12,t13))),(t15,t14)))))),t0); (t1,((t2,t3),((t4,t5),((t27,t26),((((t18,t17),((t19,t20),(t22,t21))),t23),(((t12,t13),((((t9,t10),(t8,(t7,t6))),t11),(t25,t24))),((t15,t14),t16)))))),t0); (t1,(((t2,t3),((((t18,t17),((t19,t20),(t22,t21))),t23),((t12,t13),((((((t9,t10),(t8,(t7,t6))),t11),(t25,t24)),(t15,t14)),t16)))),((t4,t5),(t27,t26))),t0); (t1,((t4,t5),((t27,t26),((t2,t3),(((t15,t14),(((((t9,t10),(t8,(t7,t6))),t11),((t12,t13),(t25,t24))),(((t18,t17),((t19,t20),(t22,t21))),t23))),t16)))),t0); (t1,((t2,t3),(((((t18,t17),((t19,t20),(t22,t21))),t23),((((t25,t24),(((t9,t10),(t8,(t7,t6))),t11)),((t15,t14),(t12,t13))),t16)),((t4,t5),(t27,t26)))),t0); (t1,((t4,t5),(((t2,t3),(t27,t26)),((((t18,t17),(t22,(t21,(t19,t20)))),t23),(((t25,t24),(((t9,t10),(t8,(t7,t6))),t11)),((t15,t14),(t16,(t12,t13))))))),t0); (((t3,t2),((t5,t4),(((t23,((t17,t18),(t22,(t21,(t19,t20))))),((t24,t25),(t16,(((((t6,t7),t8),(t10,t9)),t11),((t14,t15),(t13,t12)))))),(t26,t27)))),t1,t0); ((((t3,t2),(t26,t27)),((t5,t4),((t23,((t17,t18),((t19,t20),(t22,t21)))),((t24,t25),(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),((t14,t15),t16)))))),t1,t0); ((((t3,t2),(t5,t4)),(((t23,((t17,t18),((t19,t20),(t22,t21)))),((t24,t25),((t16,(t13,t12)),(((((t6,t7),t8),(t10,t9)),t11),(t14,t15))))),(t26,t27))),t1,t0); (((t3,t2),((t5,t4),(((((t14,t15),(((t24,t25),(t13,t12)),((((t6,t7),t8),(t10,t9)),t11))),(t23,((t17,t18),((t19,t20),(t22,t21))))),t16),(t26,t27)))),t1,t0); (((t3,t2),(((t16,((t14,t15),((t13,t12),((((t6,t7),t8),(t10,t9)),t11)))),((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21)))))),((t26,t27),(t5,t4)))),t1,t0); ((((t5,t4),((t23,((t17,t18),((t19,t20),(t22,t21)))),((t14,t15),(t16,(((((t6,t7),t8),(t10,t9)),t11),((t13,t12),(t24,t25))))))),((t3,t2),(t26,t27))),t1,t0); ((((t5,t4),((t26,t27),(((t24,t25),(t23,((t17,t18),((t19,t20),(t22,t21))))),(((((t6,t7),t8),(t10,t9)),t11),(t16,((t13,t12),(t14,t15))))))),(t3,t2)),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t19,t20),((t22,t21),(t17,t18)))),(((t24,t25),(t13,t12)),(((((t6,t7),t8),(t10,t9)),t11),((t14,t15),t16)))))),t1,t0); ((((t23,(((t22,t21),(t19,t20)),(t17,t18))),(((t14,t15),((t13,t12),t16)),((t24,t25),((((t6,t7),t8),(t10,t9)),t11)))),((t3,t2),((t5,t4),(t26,t27)))),t1,t0); ((((t3,t2),(t5,t4)),((t26,t27),((((t24,t25),t23),(((t22,t21),(t19,t20)),(t17,t18))),(((t13,t12),((((t6,t7),t8),(t10,t9)),t11)),((t14,t15),t16))))),t1,t0); (((t5,t4),((((t25,t24),(t23,((t17,t18),((t19,t20),(t22,t21))))),(((t11,((t8,(t7,t6)),(t10,t9))),((t14,t15),t16)),(t13,t12))),((t3,t2),(t26,t27)))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t14,t15),((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9)))))),t16))))),t1,t0); (((t5,t4),(((t3,t2),(t26,t27)),((t23,((t17,t18),((t19,t20),(t22,t21)))),(((t13,t12),(t25,t24)),(((t14,t15),(t11,((t8,(t7,t6)),(t10,t9)))),t16))))),t1,t0); (((t3,t2),(((t26,t27),((t23,((t17,t18),(t21,((t19,t20),t22)))),((t25,t24),(((t13,t12),(t11,((t8,(t7,t6)),(t10,t9)))),(t16,(t14,t15)))))),(t5,t4))),t1,t0); (((t5,t4),((t26,t27),((t3,t2),((((t14,t15),((t13,t12),((t25,t24),(t11,((t8,(t7,t6)),(t10,t9)))))),(t23,((t17,t18),((t19,t20),(t22,t21))))),t16)))),t1,t0); (((t3,t2),((((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t14,t15)),((t25,t24),(t23,((t17,t18),((t19,t20),(t22,t21)))))),t16),((t5,t4),(t26,t27)))),t1,t0); ((((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t16,(t14,t15))),(t25,t24))))),(t3,t2)),t1,t0); (((t5,t4),(((t26,t27),((t23,((t17,t18),((t19,t20),(t22,t21)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t13,t12)),(t16,(t14,t15))),(t25,t24)))),(t3,t2))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,(((t17,t18),((t19,t20),t21)),t22)),((((t11,((t8,(t7,t6)),(t10,t9))),(t14,t15)),((t25,t24),(t13,t12))),t16))))),t1,t0); (((t3,t2),((t5,t4),((t26,t27),((t23,((t17,t18),((t19,t20),(t21,t22)))),((((t11,((t8,(t7,t6)),(t10,t9))),(t14,t15)),((t25,t24),(t13,t12))),t16))))),t1,t0); phangorn/inst/extdata/trees/RAxML_bipartitions.woodmouse0000644000176200001440000000142213707232051023273 0ustar liggesusers(No305:0.00622878382196208596,(((No1007S:0.00000170671604060440,(No0909S:0.00108390188878723214,No1208S:0.00108436668237289475)52:0.00108405665369984980)99:0.00776063902846151413,(No0912S:0.00328637227135690751,No1103S:0.00109428209179901806)77:0.00000170671604060440)74:0.00223367776102044056,((No0908S:0.00552992494657482316,(No1206S:0.00557570157809361960,((No1202S:0.00108229934579785574,No0910S:0.00222680065047513396)95:0.00225951139716124754,No0906S:0.00571167759421415972)73:0.00108738027363135628)52:0.00108364136649804653)49:0.00000170671604060440,(No306:0.00000170671604060440,(No0913S:0.00331906405569605848,No304:0.00275623272441480370)81:0.00275326022717664034)76:0.00218358914928350797)74:0.00218629437313406583)88:0.00379919491759181556,No1114S:0.01098665288440475382); phangorn/inst/extdata/trees/RAxML_bipartitions.3moles0000644000176200001440000000054413707232051022460 0ustar liggesusers(Ame:0.24240784786309346743,(((Hma:0.03262045163347984666,Mur:0.03886458455630492637)36:0.00225499947410235475,Uth:0.02580682933153511174)30:0.00059392541543651757,(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231)100:0.02934241311799383120)60:0.00269684120306867619)100:0.06379221863907107160,Tor:0.09747395533792581335); phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.3moles0000644000176200001440000000055613707232051024724 0ustar liggesusers(Ame:0.24240784786309346743,(((Hma:0.03262045163347984666,Mur:0.03886458455630492637):0.00225499947410235475[36],Uth:0.02580682933153511174):0.00059392541543651757[30],(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231):0.02934241311799383120[100]):0.00269684120306867619[60]):0.06379221863907107160[100],Tor:0.09747395533792581335); phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.AIs0000644000176200001440000000055513707232051024175 0ustar liggesusers(Ame:0.02681059329595153473,((Hma:0.00312706379726812329,(Uth:0.00121026052477198292,Mur:0.00312046250563168155):0.00087036069658183684[39]):0.00122506270256386740[42],((Uar:0.00052373856518729458,Uma:0.00247018618187345041):0.00167792487939210548[83],Uam:0.00184159984063642979):0.00107249327886021345[41]):0.00382497683824970002[100],Tor:0.00848622429823414105); phangorn/inst/extdata/trees/RAxML_bestTree.Wang.out0000644000176200001440000000254213707232051022026 0ustar liggesusers(((t2:0.14211731987709066982,t3:0.06053783689898680626):0.01915320533263515854,(((t26:0.10076663346788350406,t27:0.09012377576079726171):0.00617748657056873228,(((t24:0.05083401775033660058,t25:0.04968730003684527358):0.12390520932858628544,(((t18:0.22659556680242753934,t17:0.09828171476802796680):0.01533921899764495791,((t19:0.10129875525132767122,t20:0.12134488266574683379):0.00849558744650705938,(t21:0.14505926027183771443,t22:0.17551017119642836617):0.00877793060138474905):0.00308912190361631612):0.00325025398389936155,t23:0.13360283374445222626):0.00171491633371120703):0.00160215446139677989,(((t15:0.03914802254136381943,t14:0.07040398566638517153):0.03746247464686409262,t16:0.07327896602473775445):0.00145565313441271263,((t12:0.05709523870354735187,t13:0.05346362539908256634):0.06851532854988398591,(t11:0.11034742412225925778,((t9:0.09630285720604085664,t10:0.09806651845861839856):0.01228546588769166559,(t8:0.05668846472663713332,(t6:0.06757767233543143792,t7:0.07178189518727731699):0.05036938539158694605):0.02478913815739459264):0.01159461463256000746):0.04912118273441323790):0.00191152082391572308):0.00157222714633921249):0.00574371179431406795):0.00298952648360721086,(t5:0.10213446240655763009,t4:0.08638068218703777446):0.04442405900560150028):0.00219766117784960489):0.08957057546751605315,t1:0.08141632437271865974,t0:0.18549589738394117733):0.0; phangorn/inst/extdata/trees/RAxML_bipartitions.YCh0000644000176200001440000000054413707232051021741 0ustar liggesusers(Ame:0.02707461606876413254,(((Mur:0.00215666997155560154,Uth:0.00192023592185219349)63:0.00016696946772137622,Hma:0.00368686670740361357)81:0.00018687639400160564,(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918)94:0.00033775695210929856)100:0.00157503466397103213)100:0.00634369057289599098,Tor:0.00989995418842323435); phangorn/inst/extdata/trees/RAxML_distances.Wang.nxs0000644000176200001440000014142413707232051022232 0ustar liggesusers#nexus BEGIN Taxa; DIMENSIONS ntax=28; TAXLABELS [1] 't0' [2] 't1' [3] 't2' [4] 't3' [5] 't4' [6] 't5' [7] 't6' [8] 't7' [9] 't8' [10] 't9' [11] 't10' [12] 't11' [13] 't12' [14] 't13' [15] 't14' [16] 't15' [17] 't16' [18] 't17' [19] 't18' [20] 't19' [21] 't20' [22] 't21' [23] 't22' [24] 't23' [25] 't24' [26] 't25' [27] 't26' [28] 't27' ; END; [Taxa] BEGIN Distances; DIMENSIONS ntax=28; FORMAT labels=no diagonal triangle=both; MATRIX 0.0 0.258843 0.409325 0.343611 0.386997 0.415368 0.467334 0.473925 0.408069 0.420966 0.43411 0.394818 0.389391 0.391833 0.378215 0.350729 0.345639 0.384907 0.508726 0.36965 0.401646 0.425956 0.475112 0.398581 0.446356 0.436988 0.369089 0.354247 0.258843 0.0 0.323278 0.239842 0.290738 0.303712 0.355727 0.361451 0.303126 0.328877 0.330235 0.305238 0.287997 0.28925 0.273233 0.243648 0.237544 0.285948 0.408866 0.273934 0.300483 0.316453 0.371314 0.289605 0.336424 0.335047 0.274434 0.251616 0.409325 0.323278 0.0 0.192319 0.275137 0.292431 0.35189 0.362158 0.296773 0.310806 0.326997 0.296513 0.272283 0.273158 0.265655 0.23153 0.229852 0.269492 0.391463 0.269358 0.28426 0.330917 0.349753 0.285794 0.307787 0.311625 0.257636 0.248276 0.343611 0.239842 0.192319 0.0 0.198776 0.213667 0.27468 0.280565 0.218724 0.241622 0.240754 0.218819 0.204383 0.202528 0.189195 0.15777 0.149061 0.201101 0.313442 0.193414 0.209843 0.237999 0.269041 0.214494 0.250222 0.253596 0.178383 0.171646 0.386997 0.290738 0.275137 0.198776 0.0 0.18134 0.319484 0.333494 0.263994 0.288442 0.294154 0.26471 0.243803 0.240583 0.227367 0.205057 0.198308 0.234238 0.355626 0.239961 0.25183 0.273172 0.3179 0.251589 0.285163 0.292887 0.221681 0.211134 0.415368 0.303712 0.292431 0.213667 0.18134 0.0 0.333731 0.340654 0.278111 0.300698 0.31011 0.28522 0.256139 0.258498 0.242481 0.221987 0.217595 0.24785 0.376793 0.252101 0.265266 0.293642 0.330253 0.272678 0.301029 0.302205 0.236378 0.229261 0.467334 0.355727 0.35189 0.27468 0.319484 0.333731 0.0 0.134287 0.168048 0.234852 0.24194 0.242607 0.30195 0.305477 0.288246 0.259075 0.256117 0.302991 0.41738 0.288657 0.317827 0.340062 0.383568 0.3144 0.350638 0.345894 0.292802 0.279407 0.473925 0.361451 0.362158 0.280565 0.333494 0.340654 0.134287 0.0 0.168357 0.231526 0.237933 0.239547 0.309204 0.307881 0.30116 0.27246 0.262342 0.317714 0.443878 0.299024 0.320617 0.343873 0.390457 0.316104 0.350009 0.345356 0.296305 0.28984 0.408069 0.303126 0.296773 0.218724 0.263994 0.278111 0.168048 0.168357 0.0 0.18008 0.181142 0.185641 0.244912 0.248834 0.236322 0.207572 0.201513 0.24871 0.372027 0.240296 0.259989 0.292156 0.320957 0.261104 0.294639 0.291276 0.240866 0.224824 0.420966 0.328877 0.310806 0.241622 0.288442 0.300698 0.234852 0.231526 0.18008 0.0 0.188549 0.209353 0.26783 0.265944 0.259007 0.231976 0.232078 0.276663 0.390486 0.266511 0.289918 0.309126 0.350459 0.278135 0.310626 0.303923 0.262268 0.254853 0.43411 0.330235 0.326997 0.240754 0.294154 0.31011 0.24194 0.237933 0.181142 0.188549 0.0 0.200935 0.276708 0.271141 0.260416 0.23615 0.238456 0.275479 0.390198 0.26919 0.289665 0.316638 0.352527 0.291514 0.320199 0.321656 0.269881 0.254806 0.394818 0.305238 0.296513 0.218819 0.26471 0.28522 0.242607 0.239547 0.185641 0.209353 0.200935 0.0 0.254629 0.248918 0.238901 0.214572 0.209137 0.247335 0.362256 0.244905 0.267859 0.289265 0.340281 0.26744 0.293766 0.290507 0.242726 0.227337 0.389391 0.287997 0.272283 0.204383 0.243803 0.256139 0.30195 0.309204 0.244912 0.26783 0.276708 0.254629 0.0 0.106404 0.215913 0.18846 0.188488 0.229021 0.350267 0.227728 0.243568 0.27675 0.298806 0.241919 0.279501 0.27594 0.228754 0.217302 0.391833 0.28925 0.273158 0.202528 0.240583 0.258498 0.305477 0.307881 0.248834 0.265944 0.271141 0.248918 0.106404 0.0 0.215622 0.188337 0.187822 0.231728 0.359961 0.226188 0.246065 0.271509 0.301748 0.242827 0.27931 0.272526 0.223715 0.214143 0.378215 0.273233 0.265655 0.189195 0.227367 0.242481 0.288246 0.30116 0.236322 0.259007 0.260416 0.238901 0.215913 0.215622 0.0 0.105689 0.170273 0.214167 0.335401 0.21004 0.227981 0.248821 0.290917 0.229404 0.267494 0.265412 0.20581 0.199473 0.350729 0.243648 0.23153 0.15777 0.205057 0.221987 0.259075 0.27246 0.207572 0.231976 0.23615 0.214572 0.18846 0.188337 0.105689 0.0 0.143812 0.184106 0.311927 0.183622 0.201611 0.220634 0.253471 0.201767 0.235578 0.234455 0.175537 0.16857 0.345639 0.237544 0.229852 0.149061 0.198308 0.217595 0.256117 0.262342 0.201513 0.232078 0.238456 0.209137 0.188488 0.187822 0.170273 0.143812 0.0 0.184446 0.309875 0.181246 0.200167 0.221079 0.254232 0.201279 0.233194 0.23272 0.174841 0.166217 0.384907 0.285948 0.269492 0.201101 0.234238 0.24785 0.302991 0.317714 0.24871 0.276663 0.275479 0.247335 0.229021 0.231728 0.214167 0.184106 0.184446 0.0 0.30631 0.205173 0.220753 0.263666 0.288162 0.231847 0.273379 0.270824 0.212613 0.200892 0.508726 0.408866 0.391463 0.313442 0.355626 0.376793 0.41738 0.443878 0.372027 0.390486 0.390198 0.362256 0.350267 0.359961 0.335401 0.311927 0.309875 0.30631 0.0 0.328767 0.345767 0.375018 0.413708 0.353073 0.377324 0.383577 0.326556 0.324104 0.36965 0.273934 0.269358 0.193414 0.239961 0.252101 0.288657 0.299024 0.240296 0.266511 0.26919 0.244905 0.227728 0.226188 0.21004 0.183622 0.181246 0.205173 0.328767 0.0 0.20445 0.244817 0.276658 0.231816 0.269496 0.272141 0.210992 0.20783 0.401646 0.300483 0.28426 0.209843 0.25183 0.265266 0.317827 0.320617 0.259989 0.289918 0.289665 0.267859 0.243568 0.246065 0.227981 0.201611 0.200167 0.220753 0.345767 0.20445 0.0 0.26742 0.303242 0.250707 0.278888 0.278873 0.227446 0.228395 0.425956 0.316453 0.330917 0.237999 0.273172 0.293642 0.340062 0.343873 0.292156 0.309126 0.316638 0.289265 0.27675 0.271509 0.248821 0.220634 0.221079 0.263666 0.375018 0.244817 0.26742 0.0 0.317486 0.270538 0.308484 0.306739 0.264346 0.244066 0.475112 0.371314 0.349753 0.269041 0.3179 0.330253 0.383568 0.390457 0.320957 0.350459 0.352527 0.340281 0.298806 0.301748 0.290917 0.253471 0.254232 0.288162 0.413708 0.276658 0.303242 0.317486 0.0 0.305015 0.339609 0.342366 0.282416 0.276724 0.398581 0.289605 0.285794 0.214494 0.251589 0.272678 0.3144 0.316104 0.261104 0.278135 0.291514 0.26744 0.241919 0.242827 0.229404 0.201767 0.201279 0.231847 0.353073 0.231816 0.250707 0.270538 0.305015 0.0 0.285912 0.284949 0.228325 0.220458 0.446356 0.336424 0.307787 0.250222 0.285163 0.301029 0.350638 0.350009 0.294639 0.310626 0.320199 0.293766 0.279501 0.27931 0.267494 0.235578 0.233194 0.273379 0.377324 0.269496 0.278888 0.308484 0.339609 0.285912 0.0 0.097874 0.268769 0.255562 0.436988 0.335047 0.311625 0.253596 0.292887 0.302205 0.345894 0.345356 0.291276 0.303923 0.321656 0.290507 0.27594 0.272526 0.265412 0.234455 0.23272 0.270824 0.383577 0.272141 0.278873 0.306739 0.342366 0.284949 0.097874 0.0 0.270444 0.256659 0.369089 0.274434 0.257636 0.178383 0.221681 0.236378 0.292802 0.296305 0.240866 0.262268 0.269881 0.242726 0.228754 0.223715 0.20581 0.175537 0.174841 0.212613 0.326556 0.210992 0.227446 0.264346 0.282416 0.228325 0.268769 0.270444 0.0 0.183681 0.354247 0.251616 0.248276 0.171646 0.211134 0.229261 0.279407 0.28984 0.224824 0.254853 0.254806 0.227337 0.217302 0.214143 0.199473 0.16857 0.166217 0.200892 0.324104 0.20783 0.228395 0.244066 0.276724 0.220458 0.255562 0.256659 0.183681 0.0 ; END; [Distances] BEGIN Splits; DIMENSIONS ntax=28 nsplits=90; FORMAT labels=no weights=yes confidences=no intervals=no; PROPERTIES fit=98.91263210217491 cyclic; CYCLE 1 3 4 5 6 17 15 16 13 14 12 10 11 9 8 7 26 25 19 18 21 20 23 22 24 27 28 2; MATRIX [1, size=1] 0.1279713 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [2, size=2] 0.017143281 1 2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [3, size=4] 0.0013902244 1 2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [4, size=9] 1.5893235E-4 1 2 7 8 9 10 11 12 18 19 20 21 22 23 24 25 26 27 28, [5, size=3] 0.002769119 1 2 28, [6, size=2] 0.08403672 1 2, [7, size=1] 0.17367192 1, [8, size=1] 0.057841897 1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [9, size=3] 1.7729466E-4 1 2 3 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [10, size=5] 3.662799E-4 1 2 3 7 8 9 10 11 12 13 14 16 18 19 20 21 22 23 24 25 26 27 28, [11, size=2] 0.0060906718 1 3, [12, size=1] 0.08134686 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [13, size=2] 0.038590923 1 2 3 4 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [14, size=4] 0.0018195357 1 2 3 4, [15, size=1] 0.09856205 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [16, size=8] 4.167727E-4 1 2 3 4 5 24 27 28, [17, size=4] 0.0012588556 1 3 4 5, [18, size=1] 0.0688266 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28, [19, size=3] 8.21237E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 18 19 20 21 22 23 24 25 26 27 28, [20, size=12] 8.992125E-4 1 2 3 4 5 6 18 19 20 21 22 23 24 25 27 28, [21, size=8] 0.0022681346 1 2 3 4 5 6 27 28, [22, size=1] 0.0665534 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28, [23, size=2] 0.03262534 1 2 3 4 5 6 7 8 9 10 11 12 13 14 17 18 19 20 21 22 23 24 25 26 27 28, [24, size=3] 4.7089203E-4 1 2 3 4 5 6 7 8 9 10 11 12 14 17 18 19 20 21 22 23 24 25 26 27 28, [25, size=4] 4.685271E-4 1 2 3 4 5 6 7 8 9 10 11 12 17 18 19 20 21 22 23 24 25 26 27 28, [26, size=9] 0.0010168224 1 2 3 4 5 6 17 27 28, [27, size=1] 0.03859058 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28, [28, size=3] 3.5754856E-4 1 2 3 4 5 6 7 8 9 10 11 12 15 17 18 19 20 21 22 23 24 25 26 27 28, [29, size=1] 0.052748006 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [30, size=2] 0.06064433 1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [31, size=7] 0.0010652957 1 2 3 4 5 6 7 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [32, size=9] 7.895848E-4 1 2 3 4 5 6 15 16 17 18 19 20 21 22 23 24 25 27 28, [33, size=1] 0.05142635 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [34, size=4] 0.0011806624 1 2 3 4 5 6 7 8 9 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [35, size=8] 1.787175E-4 1 2 3 4 5 6 13 15 16 17 18 19 20 21 22 23 24 25 27 28, [36, size=9] 8.855418E-4 1 2 3 4 5 6 13 15 16 17 18 19 20 21 22 23 24 27 28, [37, size=1] 0.0914247 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [38, size=5] 0.0012966593 1 2 3 4 5 6 7 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [39, size=6] 0.038550336 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [40, size=9] 0.001203692 1 2 3 4 5 6 13 14 15 16 17 18 20 21 22 23 24 27 28, [41, size=1] 0.092642605 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [42, size=2] 0.0044335932 1 2 3 4 5 6 7 8 9 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [43, size=4] 0.0014246248 1 2 3 4 5 6 7 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [44, size=5] 0.012698617 1 2 3 4 5 6 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [45, size=7] 2.5534217E-4 1 2 3 4 5 6 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [46, size=1] 0.09702029 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [47, size=4] 0.0010406735 1 2 3 4 5 6 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [48, size=1] 0.05344081 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [49, size=3] 0.021949023 1 2 3 4 5 6 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [50, size=14] 3.9997647E-4 1 2 3 4 5 6 10 11 12 13 14 15 16 17, [51, size=1] 0.06783958 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [52, size=2] 0.04591966 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [53, size=3] 2.8627258E-4 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28, [54, size=4] 4.0487162E-4 1 2 3 4 5 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [55, size=1] 0.064194575 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, [56, size=1] 0.047182973 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28, [57, size=2] 0.10500158 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28, [58, size=3] 0.0014762296 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 27 28, [59, size=5] 0.001466786 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 22 23 24 27 28, [60, size=8] 8.702291E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 24 27 28, [61, size=9] 0.0010516174 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 27 28, [62, size=1] 0.044313457 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28, [63, size=2] 0.004750093 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 26 27 28, [64, size=6] 1.337294E-5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 22 24 26 27 28, [65, size=1] 0.20566262 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28, [66, size=2] 0.013317523 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 28, [67, size=4] 0.0021476466 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 22 23 24 25 26 27 28, [68, size=8] 0.0015038507 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 25 26 28, [69, size=1] 0.09029672 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 28, [70, size=2] 1.5751319E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 22 23 24 25 26 27 28, [71, size=4] 0.0019187863 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 22 24 25 26 27 28, [72, size=1] 0.109228075 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28, [73, size=2] 0.006326371 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28, [74, size=4] 0.0023116763 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 24 25 26 27 28, [75, size=1] 0.089916565 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28, [76, size=2] 1.050739E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 24 25 26 27 28, [77, size=3] 0.0016833246 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 24 25 26 27 28, [78, size=1] 0.17474917 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28, [79, size=2] 0.0022174222 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 24 25 26 27 28, [80, size=3] 0.001391344 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 25 26 27 28, [81, size=5] 4.242624E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 25 26, [82, size=1] 0.13961297 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28, [83, size=2] 0.0013124112 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 25 26 27 28, [84, size=1] 0.1194786 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 26 27 28, [85, size=2] 4.8682792E-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 26 28, [86, size=1] 0.09366718 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28, [87, size=2] 0.0045568696 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, [88, size=1] 0.08093566 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27, [89, size=2] 0.0015117239 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27, [90, size=1] 0.076351464 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28, ; END; [Splits] BEGIN Network; DIMENSIONS ntax=28 nvertices=346 nedges=600; DRAW to_scale; TRANSLATE 2 't0', 3 't2', 4 't3', 5 't4', 6 't5', 7 't16', 8 't14', 9 't15', 10 't12', 11 't13', 12 't11', 13 't9', 14 't10', 15 't8', 16 't7', 17 't6', 18 't25', 19 't24', 20 't18', 21 't17', 22 't20', 23 't19', 24 't22', 25 't21', 26 't23', 27 't26', 28 't27', 29 't1', ; VERTICES 1 -0.17367192 0.0 w=2 h=2 s=n, 2 0.0 0.0 w=2 h=2 s=n, 3 -0.11768977 0.045046512 w=2 h=2 s=n, 4 -0.19602421 0.041381847 w=2 h=2 s=n, 5 -0.17523988 0.08842624 w=2 h=2 s=n, 6 -0.17898935 0.1143971 w=2 h=2 s=n, 7 -0.24188966 0.07239327 w=2 h=2 s=n, 8 -0.2543338 0.10839781 w=2 h=2 s=n, 9 -0.26945123 0.082165845 w=2 h=2 s=n, 10 -0.30659822 0.12002788 w=2 h=2 s=n, 11 -0.31904063 0.11555596 w=2 h=2 s=n, 12 -0.3723963 0.09579757 w=2 h=2 s=n, 13 -0.40555912 0.08773562 w=2 h=2 s=n, 14 -0.4215746 0.07218595 w=2 h=2 s=n, 15 -0.40375552 0.03841092 w=2 h=2 s=n, 16 -0.46578634 0.021180429 w=2 h=2 s=n, 17 -0.457186 0.0051984675 w=2 h=2 s=n, 18 -0.4112275 -0.0713001 w=2 h=2 s=n, 19 -0.40493098 -0.082802355 w=2 h=2 s=n, 20 -0.41573197 -0.17496379 w=2 h=2 s=n, 21 -0.32123187 -0.093300976 w=2 h=2 s=n, 22 -0.29972327 -0.1157434 w=2 h=2 s=n, 23 -0.27406484 -0.09962054 w=2 h=2 s=n, 24 -0.23216128 -0.17543635 w=2 h=2 s=n, 25 -0.2095651 -0.12994294 w=2 h=2 s=n, 26 -0.19596717 -0.09110639 w=2 h=2 s=n, 27 -0.19119321 -0.05464892 w=2 h=2 s=n, 28 -0.1878907 -0.030641899 w=2 h=2 s=n, 29 -0.10504844 -0.018586801 w=2 h=2 s=n, 30 -0.25718024 0.009409128 w=2 h=2 s=n, 31 -0.26323262 0.008727189 w=2 h=2 s=n, 32 -0.17972429 -6.819389E-4 w=2 h=2 s=n, 33 -0.25987992 0.010025315 w=2 h=2 s=n, 34 -0.2659323 0.009343375 w=2 h=2 s=n, 35 -0.2677404 0.009139652 w=2 h=2 s=n, 36 -0.2650407 0.008523465 w=2 h=2 s=n, 37 -0.26892862 0.008723878 w=2 h=2 s=n, 38 -0.2662289 0.008107692 w=2 h=2 s=n, 39 -0.2644208 0.008311415 w=2 h=2 s=n, 40 -0.18091251 -0.0010977125 w=2 h=2 s=n, 41 -0.26934275 0.008770542 w=2 h=2 s=n, 42 -0.27159664 0.008516592 w=2 h=2 s=n, 43 -0.27118248 0.008469928 w=2 h=2 s=n, 44 -0.27258795 0.008290328 w=2 h=2 s=n, 45 -0.27217382 0.008243664 w=2 h=2 s=n, 46 -0.27272007 0.007912797 w=2 h=2 s=n, 47 -0.2723059 0.007866133 w=2 h=2 s=n, 48 -0.2713146 0.008092397 w=2 h=2 s=n, 49 -0.2690607 0.008346348 w=2 h=2 s=n, 50 -0.26636103 0.007730161 w=2 h=2 s=n, 51 -0.27223247 0.009152431 w=2 h=2 s=n, 52 -0.2732238 0.008926167 w=2 h=2 s=n, 53 -0.2733559 0.008548636 w=2 h=2 s=n, 54 -0.25981095 0.010168508 w=2 h=2 s=n, 55 -0.26586333 0.009486569 w=2 h=2 s=n, 56 -0.26767144 0.009282845 w=2 h=2 s=n, 57 -0.26885965 0.008867072 w=2 h=2 s=n, 58 -0.2692738 0.008913736 w=2 h=2 s=n, 59 -0.27152768 0.008659785 w=2 h=2 s=n, 60 -0.2721635 0.009295625 w=2 h=2 s=n, 61 -0.27315485 0.00906936 w=2 h=2 s=n, 62 -0.27386624 0.009411948 w=2 h=2 s=n, 63 -0.2739352 0.009268755 w=2 h=2 s=n, 64 -0.27406728 0.008891224 w=2 h=2 s=n, 65 -0.27472958 0.009609 w=2 h=2 s=n, 66 -0.27479854 0.009465806 w=2 h=2 s=n, 67 -0.27493063 0.009088275 w=2 h=2 s=n, 68 -0.27421924 0.008745687 w=2 h=2 s=n, 69 -0.2735834 0.008109848 w=2 h=2 s=n, 70 -0.27600223 0.009465806 w=2 h=2 s=n, 71 -0.27613434 0.009088275 w=2 h=2 s=n, 72 -0.27542293 0.008745687 w=2 h=2 s=n, 73 -0.2747871 0.008109848 w=2 h=2 s=n, 74 -0.27392375 0.007912797 w=2 h=2 s=n, 75 -0.27636832 0.008063024 w=2 h=2 s=n, 76 -0.27565694 0.0077204364 w=2 h=2 s=n, 77 -0.2750211 0.007084597 w=2 h=2 s=n, 78 -0.27415776 0.0068875453 w=2 h=2 s=n, 79 -0.27295408 0.0068875453 w=2 h=2 s=n, 80 -0.2725399 0.0068408814 w=2 h=2 s=n, 81 -0.27489826 0.009668026 w=2 h=2 s=n, 82 -0.27496722 0.009524833 w=2 h=2 s=n, 83 -0.2761709 0.009524833 w=2 h=2 s=n, 84 -0.27630302 0.009147302 w=2 h=2 s=n, 85 -0.27653703 0.008122051 w=2 h=2 s=n, 86 -0.27682444 0.0073006563 w=2 h=2 s=n, 87 -0.27665576 0.0072416295 w=2 h=2 s=n, 88 -0.27594435 0.0068990416 w=2 h=2 s=n, 89 -0.27530852 0.006263202 w=2 h=2 s=n, 90 -0.27444518 0.0060661505 w=2 h=2 s=n, 91 -0.2732415 0.0060661505 w=2 h=2 s=n, 92 -0.2742768 0.004571756 w=2 h=2 s=n, 93 -0.2730731 0.004571756 w=2 h=2 s=n, 94 -0.2727857 0.0053931507 w=2 h=2 s=n, 95 -0.27237153 0.005346487 w=2 h=2 s=n, 96 -0.27213752 0.006371738 w=2 h=2 s=n, 97 -0.2711462 0.0065980023 w=2 h=2 s=n, 98 -0.26889235 0.006851953 w=2 h=2 s=n, 99 -0.27469912 0.010076149 w=2 h=2 s=n, 100 -0.27556247 0.0102732 w=2 h=2 s=n, 101 -0.27573115 0.010332228 w=2 h=2 s=n, 102 -0.2758001 0.010189034 w=2 h=2 s=n, 103 -0.2770038 0.010189034 w=2 h=2 s=n, 104 -0.2771359 0.009811503 w=2 h=2 s=n, 105 -0.27725914 0.010189034 w=2 h=2 s=n, 106 -0.27739123 0.009811503 w=2 h=2 s=n, 107 -0.27655837 0.009147302 w=2 h=2 s=n, 108 -0.27679238 0.008122051 w=2 h=2 s=n, 109 -0.2770798 0.0073006563 w=2 h=2 s=n, 110 -0.2769111 0.0072416295 w=2 h=2 s=n, 111 -0.2761997 0.0068990416 w=2 h=2 s=n, 112 -0.27556387 0.006263202 w=2 h=2 s=n, 113 -0.31339082 0.022921404 w=2 h=2 s=n, 114 -0.31364617 0.022921404 w=2 h=2 s=n, 115 -0.31377825 0.022543872 w=2 h=2 s=n, 116 -0.31294537 0.021879671 w=2 h=2 s=n, 117 -0.27556828 0.00625058 w=2 h=2 s=n, 118 -0.27531293 0.00625058 w=2 h=2 s=n, 119 -0.2744496 0.0060535283 w=2 h=2 s=n, 120 -0.27428123 0.004559133 w=2 h=2 s=n, 121 -0.27307752 0.004559133 w=2 h=2 s=n, 122 -0.26563498 0.009772938 w=2 h=2 s=n, 123 -0.26744306 0.009569215 w=2 h=2 s=n, 124 -0.26863128 0.009153441 w=2 h=2 s=n, 125 -0.26904544 0.0092001045 w=2 h=2 s=n, 126 -0.2712993 0.008946154 w=2 h=2 s=n, 127 -0.27193514 0.009581993 w=2 h=2 s=n, 128 -0.27292648 0.009355729 w=2 h=2 s=n, 129 -0.31455907 0.023484003 w=2 h=2 s=n, 130 -0.31481442 0.023484003 w=2 h=2 s=n, 131 -0.3149465 0.02310647 w=2 h=2 s=n, 132 -0.32719463 0.02630971 w=2 h=2 s=n, 133 -0.32732674 0.02593218 w=2 h=2 s=n, 134 -0.3261585 0.02536958 w=2 h=2 s=n, 135 -0.3253256 0.024705378 w=2 h=2 s=n, 136 -0.2779943 0.0061538764 w=2 h=2 s=n, 137 -0.27782562 0.00609485 w=2 h=2 s=n, 138 -0.27711424 0.005752262 w=2 h=2 s=n, 139 -0.27647838 0.0051164227 w=2 h=2 s=n, 140 -0.27648282 0.0051038004 w=2 h=2 s=n, 141 -0.27622747 0.0051038004 w=2 h=2 s=n, 142 -0.27536413 0.004906749 w=2 h=2 s=n, 143 -0.27519575 0.0034123538 w=2 h=2 s=n, 144 -0.27399206 0.0034123538 w=2 h=2 s=n, 145 -0.272813 0.0042274315 w=2 h=2 s=n, 146 -0.27280858 0.004240054 w=2 h=2 s=n, 147 -0.27252117 0.005061449 w=2 h=2 s=n, 148 -0.272107 0.005014785 w=2 h=2 s=n, 149 -0.271873 0.006040036 w=2 h=2 s=n, 150 -0.27088168 0.0062663006 w=2 h=2 s=n, 151 -0.26862782 0.0065202513 w=2 h=2 s=n, 152 -0.26879618 0.008014646 w=2 h=2 s=n, 153 -0.2660965 0.007398459 w=2 h=2 s=n, 154 -0.25863382 0.010908152 w=2 h=2 s=n, 155 -0.2646862 0.010226212 w=2 h=2 s=n, 156 -0.26445782 0.010512582 w=2 h=2 s=n, 157 -0.26626593 0.010308859 w=2 h=2 s=n, 158 -0.26745415 0.009893085 w=2 h=2 s=n, 159 -0.26786828 0.009939749 w=2 h=2 s=n, 160 -0.27297893 0.009821311 w=2 h=2 s=n, 161 -0.2732073 0.009534941 w=2 h=2 s=n, 162 -0.2739187 0.009877529 w=2 h=2 s=n, 163 -0.27475157 0.010541731 w=2 h=2 s=n, 164 -0.27561492 0.010738782 w=2 h=2 s=n, 165 -0.2757836 0.010797808 w=2 h=2 s=n, 166 -0.27661845 0.011632663 w=2 h=2 s=n, 167 -0.276566 0.011167082 w=2 h=2 s=n, 168 -0.27663496 0.011023888 w=2 h=2 s=n, 169 -0.27783865 0.011023888 w=2 h=2 s=n, 170 -0.31422567 0.023756258 w=2 h=2 s=n, 171 -0.31539392 0.024318857 w=2 h=2 s=n, 172 -0.31564927 0.024318857 w=2 h=2 s=n, 173 -0.32802948 0.027144564 w=2 h=2 s=n, 174 -0.32937416 0.027615089 w=2 h=2 s=n, 175 -0.3285393 0.026780235 w=2 h=2 s=n, 176 -0.32867143 0.026402703 w=2 h=2 s=n, 177 -0.3304083 0.027731607 w=2 h=2 s=n, 178 -0.32957345 0.026896752 w=2 h=2 s=n, 179 -0.32970557 0.026519222 w=2 h=2 s=n, 180 -0.3283609 0.026048698 w=2 h=2 s=n, 181 -0.32719263 0.025486099 w=2 h=2 s=n, 182 -0.32635975 0.024821898 w=2 h=2 s=n, 183 -0.3300877 0.026385501 w=2 h=2 s=n, 184 -0.32874304 0.025914976 w=2 h=2 s=n, 185 -0.3275748 0.025352377 w=2 h=2 s=n, 186 -0.3267419 0.024688177 w=2 h=2 s=n, 187 -0.32570776 0.024571659 w=2 h=2 s=n, 188 -0.31332752 0.02174595 w=2 h=2 s=n, 189 -0.2769405 0.009013581 w=2 h=2 s=n, 190 -0.2771745 0.00798833 w=2 h=2 s=n, 191 -0.27746195 0.0071669356 w=2 h=2 s=n, 192 -0.27837646 0.006020156 w=2 h=2 s=n, 193 -0.27820778 0.0059611294 w=2 h=2 s=n, 194 -0.27749637 0.0056185415 w=2 h=2 s=n, 195 -0.27686054 0.004982702 w=2 h=2 s=n, 196 -0.27686495 0.0049700798 w=2 h=2 s=n, 197 -0.27590507 0.001385226 w=2 h=2 s=n, 198 -0.2747014 0.001385226 w=2 h=2 s=n, 199 -0.27378684 0.0025320055 w=2 h=2 s=n, 200 -0.2749162 -5.2149536E-4 w=2 h=2 s=n, 201 -0.2740017 6.252841E-4 w=2 h=2 s=n, 202 -0.27329236 0.002652412 w=2 h=2 s=n, 203 -0.27302784 0.0023207103 w=2 h=2 s=n, 204 -0.2746574 -0.0028186364 w=2 h=2 s=n, 205 -0.27374285 -0.0016718569 w=2 h=2 s=n, 206 -0.27303353 3.55271E-4 w=2 h=2 s=n, 207 -0.272769 2.3569324E-5 w=2 h=2 s=n, 208 -0.2725542 0.0019302907 w=2 h=2 s=n, 209 -0.27254978 0.0019429132 w=2 h=2 s=n, 210 -0.2643192 0.0106231235 w=2 h=2 s=n, 211 -0.26612732 0.0104194 w=2 h=2 s=n, 212 -0.26731554 0.010003626 w=2 h=2 s=n, 213 -0.26772967 0.01005029 w=2 h=2 s=n, 214 -0.2717524 0.01038264 w=2 h=2 s=n, 215 -0.27274373 0.010156376 w=2 h=2 s=n, 216 -0.27279618 0.0106219575 w=2 h=2 s=n, 217 -0.27302456 0.010335588 w=2 h=2 s=n, 218 -0.27279618 0.011092849 w=2 h=2 s=n, 219 -0.27302456 0.01080648 w=2 h=2 s=n, 220 -0.2732073 0.010005834 w=2 h=2 s=n, 221 -0.2739187 0.0103484215 w=2 h=2 s=n, 222 -0.27475157 0.011012622 w=2 h=2 s=n, 223 -0.27310413 0.011155064 w=2 h=2 s=n, 224 -0.27328685 0.010354417 w=2 h=2 s=n, 225 -0.27399826 0.010697005 w=2 h=2 s=n, 226 -0.27483115 0.011361206 w=2 h=2 s=n, 227 -0.27483115 0.010890314 w=2 h=2 s=n, 228 -0.2756945 0.011087365 w=2 h=2 s=n, 229 -0.27586317 0.011146393 w=2 h=2 s=n, 230 -0.27669802 0.011981247 w=2 h=2 s=n, 231 -0.3516546 0.026519222 w=2 h=2 s=n, 232 -0.3520367 0.026385501 w=2 h=2 s=n, 233 -0.35069206 0.025914976 w=2 h=2 s=n, 234 -0.3495238 0.025352377 w=2 h=2 s=n, 235 -0.34869093 0.024688177 w=2 h=2 s=n, 236 -0.3523158 0.026321799 w=2 h=2 s=n, 237 -0.35097113 0.025851276 w=2 h=2 s=n, 238 -0.34980288 0.025288677 w=2 h=2 s=n, 239 -0.34897003 0.024624474 w=2 h=2 s=n, 240 -0.327021 0.024624474 w=2 h=2 s=n, 241 -0.32598686 0.024507957 w=2 h=2 s=n, 242 -0.31360662 0.02168225 w=2 h=2 s=n, 243 -0.2772196 0.00894988 w=2 h=2 s=n, 244 -0.2774536 0.007924628 w=2 h=2 s=n, 245 -0.27774104 0.007103234 w=2 h=2 s=n, 246 -0.27865556 0.005956454 w=2 h=2 s=n, 247 -0.2798097 0.00503604 w=2 h=2 s=n, 248 -0.2795306 0.0050997417 w=2 h=2 s=n, 249 -0.27936193 0.0050407154 w=2 h=2 s=n, 250 -0.27865055 0.004698127 w=2 h=2 s=n, 251 -0.27801472 0.004062288 w=2 h=2 s=n, 252 -0.27801913 0.0040496653 w=2 h=2 s=n, 253 -0.27763698 0.004183386 w=2 h=2 s=n, 254 -0.27738163 0.004183386 w=2 h=2 s=n, 255 -0.2765183 0.0039863344 w=2 h=2 s=n, 256 -0.2763499 0.0024919398 w=2 h=2 s=n, 257 -0.27705923 4.648119E-4 w=2 h=2 s=n, 258 -0.2733683 -0.003312977 w=2 h=2 s=n, 259 -0.27265897 -0.0012858491 w=2 h=2 s=n, 260 -0.27239445 -0.0016175507 w=2 h=2 s=n, 261 -0.2721796 2.891706E-4 w=2 h=2 s=n, 262 -0.2721752 3.017931E-4 w=2 h=2 s=n, 263 -0.27179077 -0.0028711085 w=2 h=2 s=n, 264 -0.27157593 -9.64387E-4 w=2 h=2 s=n, 265 -0.27157152 -9.517645E-4 w=2 h=2 s=n, 266 -0.27194607 6.893556E-4 w=2 h=2 s=n, 267 -0.2722049 0.0029864965 w=2 h=2 s=n, 268 -0.2719175 0.0038078912 w=2 h=2 s=n, 269 -0.27150333 0.0037612275 w=2 h=2 s=n, 270 -0.24245258 0.016570218 w=2 h=2 s=n, 271 -0.24850495 0.01588828 w=2 h=2 s=n, 272 -0.24827658 0.016174648 w=2 h=2 s=n, 273 -0.24813797 0.01628519 w=2 h=2 s=n, 274 -0.23883942 0.037707303 w=2 h=2 s=n, 275 -0.24002762 0.03729153 w=2 h=2 s=n, 276 -0.24044177 0.037338194 w=2 h=2 s=n, 277 -0.2691433 0.04351305 w=2 h=2 s=n, 278 -0.2693717 0.043226678 w=2 h=2 s=n, 279 -0.26945123 0.043575265 w=2 h=2 s=n, 280 -0.2948607 0.068602376 w=2 h=2 s=n, 281 -0.2948607 0.068131484 w=2 h=2 s=n, 282 -0.29572403 0.06832854 w=2 h=2 s=n, 283 -0.29589272 0.06838756 w=2 h=2 s=n, 284 -0.29672757 0.06922242 w=2 h=2 s=n, 285 -0.3331282 0.029973902 w=2 h=2 s=n, 286 -0.33416232 0.030090421 w=2 h=2 s=n, 287 -0.39794675 0.021180429 w=2 h=2 s=n, 288 -0.39660206 0.020709904 w=2 h=2 s=n, 289 -0.3954338 0.020147305 w=2 h=2 s=n, 290 -0.39460093 0.019483104 w=2 h=2 s=n, 291 -0.3687171 -0.05082817 w=2 h=2 s=n, 292 -0.368438 -0.050764468 w=2 h=2 s=n, 293 -0.36826932 -0.050823495 w=2 h=2 s=n, 294 -0.3675579 -0.051166084 w=2 h=2 s=n, 295 -0.36692208 -0.051801924 w=2 h=2 s=n, 296 -0.3669265 -0.051814545 w=2 h=2 s=n, 297 -0.37028533 -0.055173367 w=2 h=2 s=n, 298 -0.28137794 6.908425E-4 w=2 h=2 s=n, 299 -0.2809958 8.2456315E-4 w=2 h=2 s=n, 300 -0.28074044 8.2456315E-4 w=2 h=2 s=n, 301 -0.27987713 6.275116E-4 w=2 h=2 s=n, 302 -0.27970874 -8.668832E-4 w=2 h=2 s=n, 303 -0.28041807 -0.002894011 w=2 h=2 s=n, 304 -0.2875034 -0.01417028 w=2 h=2 s=n, 305 -0.28414458 -0.0108114565 w=2 h=2 s=n, 306 -0.28299043 -0.0098910425 w=2 h=2 s=n, 307 -0.28178674 -0.0098910425 w=2 h=2 s=n, 308 -0.28200155 -0.011797764 w=2 h=2 s=n, 309 -0.2820536 -0.011946438 w=2 h=2 s=n, 310 -0.27496824 -6.701694E-4 w=2 h=2 s=n, 311 -0.2747094 -0.0029673104 w=2 h=2 s=n, 312 -0.27541775 -0.009253902 w=2 h=2 s=n, 313 -0.2753657 -0.009105228 w=2 h=2 s=n, 314 -0.2744512 -0.0079584485 w=2 h=2 s=n, 315 -0.2740766 -0.009599569 w=2 h=2 s=n, 316 -0.27406484 -0.009703982 w=2 h=2 s=n, 317 -0.27335653 -0.0034173902 w=2 h=2 s=n, 318 -0.2726472 -0.0013902623 w=2 h=2 s=n, 319 -0.27238268 -0.001721964 w=2 h=2 s=n, 320 -0.271779 -0.0029755216 w=2 h=2 s=n, 321 -0.27104664 -0.0050685094 w=2 h=2 s=n, 322 -0.27105838 -0.0049640965 w=2 h=2 s=n, 323 -0.27084357 -0.0030573749 w=2 h=2 s=n, 324 -0.27083912 -0.0030447524 w=2 h=2 s=n, 325 -0.2701409 -0.004156003 w=2 h=2 s=n, 326 -0.27087325 -0.0020630148 w=2 h=2 s=n, 327 -0.27124783 -4.218947E-4 w=2 h=2 s=n, 328 -0.27150667 0.0018752463 w=2 h=2 s=n, 329 -0.27121925 0.002696641 w=2 h=2 s=n, 330 -0.2708051 0.0026499773 w=2 h=2 s=n, 331 -0.27046084 0.002305738 w=2 h=2 s=n, 332 -0.2711591 0.0034169883 w=2 h=2 s=n, 333 -0.2717628 0.004670546 w=2 h=2 s=n, 334 -0.27152878 0.005695797 w=2 h=2 s=n, 335 -0.27053744 0.0059220614 w=2 h=2 s=n, 336 -0.26828358 0.0061760116 w=2 h=2 s=n, 337 -0.26442516 0.003751611 w=2 h=2 s=n, 338 -0.2647694 0.0040958505 w=2 h=2 s=n, 339 -0.2649378 0.005590245 w=2 h=2 s=n, 340 -0.2622381 0.0049740584 w=2 h=2 s=n, 341 -0.26081118 0.0044747675 w=2 h=2 s=n, 342 -0.2646696 0.0068991682 w=2 h=2 s=n, 343 -0.26493412 0.00723087 w=2 h=2 s=n, 344 -0.26480204 0.007608401 w=2 h=2 s=n, 345 -0.26299393 0.007812124 w=2 h=2 s=n, 346 -0.17948562 -0.0015970032 w=2 h=2 s=n, ; VLABELS 2 't0' x=12 y=6 f='Dialog-PLAIN-10', 3 't2' x=12 y=9, 4 't3' x=11 y=11, 5 't4' x=9 y=13, 6 't5' x=3 y=20, 7 't16' x=-3 y=22, 8 't14' x=-5 y=23, 9 't15' x=-8 y=23, 10 't12' x=-11 y=23, 11 't13' x=-13 y=17, 12 't11' x=-16 y=20, 13 't9' x=-19 y=13, 14 't10' x=-27 y=11, 15 't8' x=-22 y=9, 16 't7' x=-22 y=6, 17 't6' x=-22 y=3, 18 't25' x=-27 y=1, 19 't24' x=-25 y=-1, 20 't18' x=-15 y=-13, 21 't17' x=-13 y=-15, 22 't20' x=-11 y=-16, 23 't19' x=-8 y=-16, 24 't22' x=-5 y=-16, 25 't21' x=-3 y=-15, 26 't23' x=-1 y=-13, 27 't26' x=9 y=-1, 28 't27' x=11 y=1, 29 't1' x=12 y=3, ; EDGES 1 1 2 s=7 w=0.17367192, 2 30 1 s=6 w=0.08403672, 3 31 30 s=11 w=0.0060906718, 4 32 1 s=11 w=0.0060906718, 5 32 31 s=6 w=0.08403672, 6 33 30 s=5 w=0.002769119, 7 34 31 s=5 w=0.002769119, 8 34 33 s=11 w=0.0060906718, 9 35 34 s=14 w=0.0018195357, 10 36 31 s=14 w=0.0018195357, 11 36 35 s=5 w=0.002769119, 12 37 35 s=17 w=0.0012588556, 13 38 36 s=17 w=0.0012588556, 14 38 37 s=5 w=0.002769119, 15 39 31 s=17 w=0.0012588556, 16 39 38 s=14 w=0.0018195357, 17 40 32 s=17 w=0.0012588556, 18 40 39 s=6 w=0.08403672, 19 41 37 s=16 w=4.167727E-4, 20 42 41 s=21 w=0.0022681346, 21 43 37 s=21 w=0.0022681346, 22 43 42 s=16 w=4.167727E-4, 23 44 42 s=26 w=0.0010168224, 24 45 43 s=26 w=0.0010168224, 25 45 44 s=16 w=4.167727E-4, 26 46 44 s=50 w=3.9997647E-4, 27 47 45 s=50 w=3.9997647E-4, 28 47 46 s=16 w=4.167727E-4, 29 48 43 s=50 w=3.9997647E-4, 30 48 47 s=26 w=0.0010168224, 31 49 37 s=50 w=3.9997647E-4, 32 49 48 s=21 w=0.0022681346, 33 50 38 s=50 w=3.9997647E-4, 34 50 49 s=5 w=0.002769119, 35 51 42 s=20 w=8.992125E-4, 36 52 44 s=20 w=8.992125E-4, 37 52 51 s=26 w=0.0010168224, 38 53 46 s=20 w=8.992125E-4, 39 53 52 s=50 w=3.9997647E-4, 40 54 33 s=4 w=1.5893235E-4, 41 55 34 s=4 w=1.5893235E-4, 42 55 54 s=11 w=0.0060906718, 43 56 35 s=4 w=1.5893235E-4, 44 56 55 s=14 w=0.0018195357, 45 57 37 s=4 w=1.5893235E-4, 46 57 56 s=17 w=0.0012588556, 47 58 41 s=4 w=1.5893235E-4, 48 58 57 s=16 w=4.167727E-4, 49 59 42 s=4 w=1.5893235E-4, 50 59 58 s=21 w=0.0022681346, 51 60 51 s=4 w=1.5893235E-4, 52 60 59 s=20 w=8.992125E-4, 53 61 52 s=4 w=1.5893235E-4, 54 61 60 s=26 w=0.0010168224, 55 62 61 s=32 w=7.895848E-4, 56 63 52 s=32 w=7.895848E-4, 57 63 62 s=4 w=1.5893235E-4, 58 64 53 s=32 w=7.895848E-4, 59 64 63 s=50 w=3.9997647E-4, 60 65 62 s=36 w=8.855418E-4, 61 66 63 s=36 w=8.855418E-4, 62 66 65 s=4 w=1.5893235E-4, 63 67 64 s=36 w=8.855418E-4, 64 67 66 s=50 w=3.9997647E-4, 65 68 53 s=36 w=8.855418E-4, 66 68 67 s=32 w=7.895848E-4, 67 69 46 s=36 w=8.855418E-4, 68 69 68 s=20 w=8.992125E-4, 69 70 66 s=40 w=0.001203692, 70 71 67 s=40 w=0.001203692, 71 71 70 s=50 w=3.9997647E-4, 72 72 68 s=40 w=0.001203692, 73 72 71 s=32 w=7.895848E-4, 74 73 69 s=40 w=0.001203692, 75 73 72 s=20 w=8.992125E-4, 76 74 46 s=40 w=0.001203692, 77 74 73 s=36 w=8.855418E-4, 78 75 71 s=61 w=0.0010516174, 79 76 72 s=61 w=0.0010516174, 80 76 75 s=32 w=7.895848E-4, 81 77 73 s=61 w=0.0010516174, 82 77 76 s=20 w=8.992125E-4, 83 78 74 s=61 w=0.0010516174, 84 78 77 s=36 w=8.855418E-4, 85 79 46 s=61 w=0.0010516174, 86 79 78 s=40 w=0.001203692, 87 80 47 s=61 w=0.0010516174, 88 80 79 s=16 w=4.167727E-4, 89 81 65 s=35 w=1.787175E-4, 90 82 66 s=35 w=1.787175E-4, 91 82 81 s=4 w=1.5893235E-4, 92 83 70 s=35 w=1.787175E-4, 93 83 82 s=40 w=0.001203692, 94 84 71 s=35 w=1.787175E-4, 95 84 83 s=50 w=3.9997647E-4, 96 85 75 s=35 w=1.787175E-4, 97 85 84 s=61 w=0.0010516174, 98 86 85 s=60 w=8.702291E-4, 99 87 75 s=60 w=8.702291E-4, 100 87 86 s=35 w=1.787175E-4, 101 88 76 s=60 w=8.702291E-4, 102 88 87 s=32 w=7.895848E-4, 103 89 77 s=60 w=8.702291E-4, 104 89 88 s=20 w=8.992125E-4, 105 90 78 s=60 w=8.702291E-4, 106 90 89 s=36 w=8.855418E-4, 107 91 79 s=60 w=8.702291E-4, 108 91 90 s=40 w=0.001203692, 109 92 90 s=68 w=0.0015038507, 110 93 91 s=68 w=0.0015038507, 111 93 92 s=40 w=0.001203692, 112 94 79 s=68 w=0.0015038507, 113 94 93 s=60 w=8.702291E-4, 114 95 80 s=68 w=0.0015038507, 115 95 94 s=16 w=4.167727E-4, 116 96 47 s=68 w=0.0015038507, 117 96 95 s=61 w=0.0010516174, 118 97 48 s=68 w=0.0015038507, 119 97 96 s=26 w=0.0010168224, 120 98 49 s=68 w=0.0015038507, 121 98 97 s=21 w=0.0022681346, 122 99 62 s=31 w=0.0010652957, 123 100 65 s=31 w=0.0010652957, 124 100 99 s=36 w=8.855418E-4, 125 101 81 s=31 w=0.0010652957, 126 101 100 s=35 w=1.787175E-4, 127 102 82 s=31 w=0.0010652957, 128 102 101 s=4 w=1.5893235E-4, 129 103 83 s=31 w=0.0010652957, 130 103 102 s=40 w=0.001203692, 131 104 84 s=31 w=0.0010652957, 132 104 103 s=50 w=3.9997647E-4, 133 105 103 s=45 w=2.5534217E-4, 134 106 104 s=45 w=2.5534217E-4, 135 106 105 s=50 w=3.9997647E-4, 136 107 84 s=45 w=2.5534217E-4, 137 107 106 s=31 w=0.0010652957, 138 108 85 s=45 w=2.5534217E-4, 139 108 107 s=61 w=0.0010516174, 140 109 86 s=45 w=2.5534217E-4, 141 109 108 s=60 w=8.702291E-4, 142 110 87 s=45 w=2.5534217E-4, 143 110 109 s=35 w=1.787175E-4, 144 111 88 s=45 w=2.5534217E-4, 145 111 110 s=32 w=7.895848E-4, 146 112 89 s=45 w=2.5534217E-4, 147 112 111 s=20 w=8.992125E-4, 148 113 103 s=39 w=0.038550336, 149 114 105 s=39 w=0.038550336, 150 114 113 s=45 w=2.5534217E-4, 151 115 106 s=39 w=0.038550336, 152 115 114 s=50 w=3.9997647E-4, 153 116 107 s=39 w=0.038550336, 154 116 115 s=31 w=0.0010652957, 155 117 112 s=64 w=1.337294E-5, 156 118 89 s=64 w=1.337294E-5, 157 118 117 s=45 w=2.5534217E-4, 158 119 90 s=64 w=1.337294E-5, 159 119 118 s=36 w=8.855418E-4, 160 120 92 s=64 w=1.337294E-5, 161 120 119 s=68 w=0.0015038507, 162 121 93 s=64 w=1.337294E-5, 163 121 120 s=40 w=0.001203692, 164 122 55 s=10 w=3.662799E-4, 165 123 56 s=10 w=3.662799E-4, 166 123 122 s=14 w=0.0018195357, 167 124 57 s=10 w=3.662799E-4, 168 124 123 s=17 w=0.0012588556, 169 125 58 s=10 w=3.662799E-4, 170 125 124 s=16 w=4.167727E-4, 171 126 59 s=10 w=3.662799E-4, 172 126 125 s=21 w=0.0022681346, 173 127 60 s=10 w=3.662799E-4, 174 127 126 s=20 w=8.992125E-4, 175 128 61 s=10 w=3.662799E-4, 176 128 127 s=26 w=0.0010168224, 177 129 113 s=38 w=0.0012966593, 178 130 114 s=38 w=0.0012966593, 179 130 129 s=45 w=2.5534217E-4, 180 131 115 s=38 w=0.0012966593, 181 131 130 s=50 w=3.9997647E-4, 182 132 130 s=44 w=0.012698617, 183 133 131 s=44 w=0.012698617, 184 133 132 s=50 w=3.9997647E-4, 185 134 115 s=44 w=0.012698617, 186 134 133 s=38 w=0.0012966593, 187 135 116 s=44 w=0.012698617, 188 135 134 s=31 w=0.0010652957, 189 136 109 s=59 w=0.001466786, 190 137 110 s=59 w=0.001466786, 191 137 136 s=35 w=1.787175E-4, 192 138 111 s=59 w=0.001466786, 193 138 137 s=32 w=7.895848E-4, 194 139 112 s=59 w=0.001466786, 195 139 138 s=20 w=8.992125E-4, 196 140 117 s=59 w=0.001466786, 197 140 139 s=64 w=1.337294E-5, 198 141 118 s=59 w=0.001466786, 199 141 140 s=45 w=2.5534217E-4, 200 142 119 s=59 w=0.001466786, 201 142 141 s=36 w=8.855418E-4, 202 143 120 s=59 w=0.001466786, 203 143 142 s=68 w=0.0015038507, 204 144 121 s=59 w=0.001466786, 205 144 143 s=40 w=0.001203692, 206 145 121 s=81 w=4.242624E-4, 207 146 93 s=81 w=4.242624E-4, 208 146 145 s=64 w=1.337294E-5, 209 147 94 s=81 w=4.242624E-4, 210 147 146 s=60 w=8.702291E-4, 211 148 95 s=81 w=4.242624E-4, 212 148 147 s=16 w=4.167727E-4, 213 149 96 s=81 w=4.242624E-4, 214 149 148 s=61 w=0.0010516174, 215 150 97 s=81 w=4.242624E-4, 216 150 149 s=26 w=0.0010168224, 217 151 98 s=81 w=4.242624E-4, 218 151 150 s=21 w=0.0022681346, 219 152 49 s=81 w=4.242624E-4, 220 152 151 s=68 w=0.0015038507, 221 153 50 s=81 w=4.242624E-4, 222 153 152 s=5 w=0.002769119, 223 154 54 s=3 w=0.0013902244, 224 155 55 s=3 w=0.0013902244, 225 155 154 s=11 w=0.0060906718, 226 156 122 s=3 w=0.0013902244, 227 156 155 s=10 w=3.662799E-4, 228 157 123 s=3 w=0.0013902244, 229 157 156 s=14 w=0.0018195357, 230 158 124 s=3 w=0.0013902244, 231 158 157 s=17 w=0.0012588556, 232 159 125 s=3 w=0.0013902244, 233 159 158 s=16 w=4.167727E-4, 234 160 128 s=25 w=4.685271E-4, 235 161 61 s=25 w=4.685271E-4, 236 161 160 s=10 w=3.662799E-4, 237 162 62 s=25 w=4.685271E-4, 238 162 161 s=32 w=7.895848E-4, 239 163 99 s=25 w=4.685271E-4, 240 163 162 s=31 w=0.0010652957, 241 164 100 s=25 w=4.685271E-4, 242 164 163 s=36 w=8.855418E-4, 243 165 101 s=25 w=4.685271E-4, 244 165 164 s=35 w=1.787175E-4, 245 166 165 s=34 w=0.0011806624, 246 167 101 s=34 w=0.0011806624, 247 167 166 s=25 w=4.685271E-4, 248 168 102 s=34 w=0.0011806624, 249 168 167 s=4 w=1.5893235E-4, 250 169 103 s=34 w=0.0011806624, 251 169 168 s=40 w=0.001203692, 252 170 113 s=34 w=0.0011806624, 253 170 169 s=39 w=0.038550336, 254 171 129 s=34 w=0.0011806624, 255 171 170 s=38 w=0.0012966593, 256 171 12 s=37 w=0.0914247, 257 172 130 s=34 w=0.0011806624, 258 172 171 s=45 w=2.5534217E-4, 259 173 132 s=34 w=0.0011806624, 260 173 172 s=44 w=0.012698617, 261 174 173 s=43 w=0.0014246248, 262 175 132 s=43 w=0.0014246248, 263 175 174 s=34 w=0.0011806624, 264 176 133 s=43 w=0.0014246248, 265 176 175 s=50 w=3.9997647E-4, 266 177 174 s=47 w=0.0010406735, 267 178 175 s=47 w=0.0010406735, 268 178 177 s=34 w=0.0011806624, 269 179 176 s=47 w=0.0010406735, 270 179 178 s=50 w=3.9997647E-4, 271 180 133 s=47 w=0.0010406735, 272 180 179 s=43 w=0.0014246248, 273 181 134 s=47 w=0.0010406735, 274 181 180 s=38 w=0.0012966593, 275 182 135 s=47 w=0.0010406735, 276 182 181 s=31 w=0.0010652957, 277 183 179 s=54 w=4.0487162E-4, 278 184 180 s=54 w=4.0487162E-4, 279 184 183 s=43 w=0.0014246248, 280 185 181 s=54 w=4.0487162E-4, 281 185 184 s=38 w=0.0012966593, 282 186 182 s=54 w=4.0487162E-4, 283 186 185 s=31 w=0.0010652957, 284 187 135 s=54 w=4.0487162E-4, 285 187 186 s=47 w=0.0010406735, 286 188 116 s=54 w=4.0487162E-4, 287 188 187 s=44 w=0.012698617, 288 189 107 s=54 w=4.0487162E-4, 289 189 188 s=39 w=0.038550336, 290 190 108 s=54 w=4.0487162E-4, 291 190 189 s=61 w=0.0010516174, 292 191 109 s=54 w=4.0487162E-4, 293 191 190 s=60 w=8.702291E-4, 294 192 136 s=54 w=4.0487162E-4, 295 192 191 s=59 w=0.001466786, 296 193 137 s=54 w=4.0487162E-4, 297 193 192 s=35 w=1.787175E-4, 298 194 138 s=54 w=4.0487162E-4, 299 194 193 s=32 w=7.895848E-4, 300 195 139 s=54 w=4.0487162E-4, 301 195 194 s=20 w=8.992125E-4, 302 196 140 s=54 w=4.0487162E-4, 303 196 195 s=64 w=1.337294E-5, 304 197 143 s=67 w=0.0021476466, 305 198 144 s=67 w=0.0021476466, 306 198 197 s=40 w=0.001203692, 307 199 121 s=67 w=0.0021476466, 308 199 198 s=59 w=0.001466786, 309 200 198 s=71 w=0.0019187863, 310 201 199 s=71 w=0.0019187863, 311 201 200 s=59 w=0.001466786, 312 202 121 s=71 w=0.0019187863, 313 202 201 s=67 w=0.0021476466, 314 203 145 s=71 w=0.0019187863, 315 203 202 s=81 w=4.242624E-4, 316 204 200 s=74 w=0.0023116763, 317 205 201 s=74 w=0.0023116763, 318 205 204 s=59 w=0.001466786, 319 206 202 s=74 w=0.0023116763, 320 206 205 s=67 w=0.0021476466, 321 207 203 s=74 w=0.0023116763, 322 207 206 s=81 w=4.242624E-4, 323 208 145 s=74 w=0.0023116763, 324 208 207 s=71 w=0.0019187863, 325 209 146 s=74 w=0.0023116763, 326 209 208 s=64 w=1.337294E-5, 327 210 156 s=9 w=1.7729466E-4, 328 211 157 s=9 w=1.7729466E-4, 329 211 210 s=14 w=0.0018195357, 330 212 158 s=9 w=1.7729466E-4, 331 212 211 s=17 w=0.0012588556, 332 213 159 s=9 w=1.7729466E-4, 333 213 212 s=16 w=4.167727E-4, 334 214 127 s=19 w=8.21237E-4, 335 214 7 s=18 w=0.0688266, 336 215 128 s=19 w=8.21237E-4, 337 215 214 s=26 w=0.0010168224, 338 216 160 s=19 w=8.21237E-4, 339 216 215 s=25 w=4.685271E-4, 340 217 161 s=19 w=8.21237E-4, 341 217 216 s=10 w=3.662799E-4, 342 218 216 s=24 w=4.7089203E-4, 343 219 217 s=24 w=4.7089203E-4, 344 219 218 s=10 w=3.662799E-4, 345 220 161 s=24 w=4.7089203E-4, 346 220 219 s=19 w=8.21237E-4, 347 221 162 s=24 w=4.7089203E-4, 348 221 220 s=32 w=7.895848E-4, 349 222 163 s=24 w=4.7089203E-4, 350 222 221 s=31 w=0.0010652957, 351 223 219 s=28 w=3.5754856E-4, 352 224 220 s=28 w=3.5754856E-4, 353 224 223 s=19 w=8.21237E-4, 354 225 221 s=28 w=3.5754856E-4, 355 225 224 s=32 w=7.895848E-4, 356 226 222 s=28 w=3.5754856E-4, 357 226 225 s=31 w=0.0010652957, 358 227 163 s=28 w=3.5754856E-4, 359 227 226 s=24 w=4.7089203E-4, 360 228 164 s=28 w=3.5754856E-4, 361 228 227 s=36 w=8.855418E-4, 362 229 165 s=28 w=3.5754856E-4, 363 229 228 s=35 w=1.787175E-4, 364 230 166 s=28 w=3.5754856E-4, 365 230 229 s=34 w=0.0011806624, 366 231 179 s=49 w=0.021949023, 367 231 15 s=48 w=0.05344081, 368 232 183 s=49 w=0.021949023, 369 232 231 s=54 w=4.0487162E-4, 370 233 184 s=49 w=0.021949023, 371 233 232 s=43 w=0.0014246248, 372 234 185 s=49 w=0.021949023, 373 234 233 s=38 w=0.0012966593, 374 235 186 s=49 w=0.021949023, 375 235 234 s=31 w=0.0010652957, 376 236 232 s=53 w=2.8627258E-4, 377 237 233 s=53 w=2.8627258E-4, 378 237 236 s=43 w=0.0014246248, 379 238 234 s=53 w=2.8627258E-4, 380 238 237 s=38 w=0.0012966593, 381 239 235 s=53 w=2.8627258E-4, 382 239 238 s=31 w=0.0010652957, 383 240 186 s=53 w=2.8627258E-4, 384 240 239 s=49 w=0.021949023, 385 241 187 s=53 w=2.8627258E-4, 386 241 240 s=47 w=0.0010406735, 387 242 188 s=53 w=2.8627258E-4, 388 242 241 s=44 w=0.012698617, 389 243 189 s=53 w=2.8627258E-4, 390 243 242 s=39 w=0.038550336, 391 244 190 s=53 w=2.8627258E-4, 392 244 243 s=61 w=0.0010516174, 393 245 191 s=53 w=2.8627258E-4, 394 245 244 s=60 w=8.702291E-4, 395 246 192 s=53 w=2.8627258E-4, 396 246 245 s=59 w=0.001466786, 397 247 246 s=58 w=0.0014762296, 398 248 192 s=58 w=0.0014762296, 399 248 247 s=53 w=2.8627258E-4, 400 249 193 s=58 w=0.0014762296, 401 249 248 s=35 w=1.787175E-4, 402 250 194 s=58 w=0.0014762296, 403 250 249 s=32 w=7.895848E-4, 404 251 195 s=58 w=0.0014762296, 405 251 250 s=20 w=8.992125E-4, 406 252 196 s=58 w=0.0014762296, 407 252 251 s=64 w=1.337294E-5, 408 253 140 s=58 w=0.0014762296, 409 253 252 s=54 w=4.0487162E-4, 410 254 141 s=58 w=0.0014762296, 411 254 253 s=45 w=2.5534217E-4, 412 255 142 s=58 w=0.0014762296, 413 255 254 s=36 w=8.855418E-4, 414 256 143 s=58 w=0.0014762296, 415 256 255 s=68 w=0.0015038507, 416 257 197 s=58 w=0.0014762296, 417 257 256 s=67 w=0.0021476466, 418 258 205 s=77 w=0.0016833246, 419 259 206 s=77 w=0.0016833246, 420 259 258 s=67 w=0.0021476466, 421 260 207 s=77 w=0.0016833246, 422 260 259 s=81 w=4.242624E-4, 423 261 208 s=77 w=0.0016833246, 424 261 260 s=71 w=0.0019187863, 425 262 209 s=77 w=0.0016833246, 426 262 261 s=64 w=1.337294E-5, 427 263 260 s=80 w=0.001391344, 428 264 261 s=80 w=0.001391344, 429 264 263 s=71 w=0.0019187863, 430 265 262 s=80 w=0.001391344, 431 265 264 s=64 w=1.337294E-5, 432 266 209 s=80 w=0.001391344, 433 266 265 s=77 w=0.0016833246, 434 267 146 s=80 w=0.001391344, 435 267 266 s=74 w=0.0023116763, 436 268 147 s=80 w=0.001391344, 437 268 267 s=60 w=8.702291E-4, 438 269 148 s=80 w=0.001391344, 439 269 268 s=16 w=4.167727E-4, 440 270 154 s=2 w=0.017143281, 441 270 3 s=1 w=0.1279713, 442 271 155 s=2 w=0.017143281, 443 271 270 s=11 w=0.0060906718, 444 272 156 s=2 w=0.017143281, 445 272 271 s=10 w=3.662799E-4, 446 273 210 s=2 w=0.017143281, 447 273 272 s=9 w=1.7729466E-4, 448 273 4 s=8 w=0.057841897, 449 274 211 s=13 w=0.038590923, 450 274 5 s=12 w=0.08134686, 451 275 212 s=13 w=0.038590923, 452 275 274 s=17 w=0.0012588556, 453 276 213 s=13 w=0.038590923, 454 276 275 s=16 w=4.167727E-4, 455 276 6 s=15 w=0.09856205, 456 277 218 s=23 w=0.03262534, 457 277 8 s=22 w=0.0665534, 458 278 219 s=23 w=0.03262534, 459 278 277 s=10 w=3.662799E-4, 460 279 223 s=23 w=0.03262534, 461 279 278 s=28 w=3.5754856E-4, 462 279 9 s=27 w=0.03859058, 463 280 226 s=30 w=0.06064433, 464 280 10 s=29 w=0.052748006, 465 281 227 s=30 w=0.06064433, 466 281 280 s=24 w=4.7089203E-4, 467 282 228 s=30 w=0.06064433, 468 282 281 s=36 w=8.855418E-4, 469 283 229 s=30 w=0.06064433, 470 283 282 s=35 w=1.787175E-4, 471 284 230 s=30 w=0.06064433, 472 284 283 s=34 w=0.0011806624, 473 284 11 s=33 w=0.05142635, 474 285 174 s=42 w=0.0044335932, 475 285 13 s=41 w=0.092642605, 476 286 177 s=42 w=0.0044335932, 477 286 285 s=47 w=0.0010406735, 478 286 14 s=46 w=0.09702029, 479 287 236 s=52 w=0.04591966, 480 287 16 s=51 w=0.06783958, 481 288 237 s=52 w=0.04591966, 482 288 287 s=43 w=0.0014246248, 483 289 238 s=52 w=0.04591966, 484 289 288 s=38 w=0.0012966593, 485 290 239 s=52 w=0.04591966, 486 290 289 s=31 w=0.0010652957, 487 290 17 s=55 w=0.064194575, 488 291 247 s=57 w=0.10500158, 489 291 18 s=56 w=0.047182973, 490 292 248 s=57 w=0.10500158, 491 292 291 s=53 w=2.8627258E-4, 492 293 249 s=57 w=0.10500158, 493 293 292 s=35 w=1.787175E-4, 494 294 250 s=57 w=0.10500158, 495 294 293 s=32 w=7.895848E-4, 496 295 251 s=57 w=0.10500158, 497 295 294 s=20 w=8.992125E-4, 498 296 252 s=57 w=0.10500158, 499 296 295 s=64 w=1.337294E-5, 500 297 296 s=63 w=0.004750093, 501 297 19 s=62 w=0.044313457, 502 298 252 s=63 w=0.004750093, 503 298 297 s=57 w=0.10500158, 504 299 253 s=63 w=0.004750093, 505 299 298 s=54 w=4.0487162E-4, 506 300 254 s=63 w=0.004750093, 507 300 299 s=45 w=2.5534217E-4, 508 301 255 s=63 w=0.004750093, 509 301 300 s=36 w=8.855418E-4, 510 302 256 s=63 w=0.004750093, 511 302 301 s=68 w=0.0015038507, 512 303 257 s=63 w=0.004750093, 513 303 302 s=67 w=0.0021476466, 514 304 303 s=66 w=0.013317523, 515 304 20 s=65 w=0.20566262, 516 305 257 s=66 w=0.013317523, 517 305 304 s=63 w=0.004750093, 518 306 197 s=66 w=0.013317523, 519 306 305 s=58 w=0.0014762296, 520 307 198 s=66 w=0.013317523, 521 307 306 s=40 w=0.001203692, 522 308 200 s=66 w=0.013317523, 523 308 307 s=71 w=0.0019187863, 524 309 308 s=70 w=1.5751319E-4, 525 309 21 s=69 w=0.09029672, 526 310 200 s=70 w=1.5751319E-4, 527 310 309 s=66 w=0.013317523, 528 311 204 s=70 w=1.5751319E-4, 529 311 310 s=74 w=0.0023116763, 530 312 311 s=73 w=0.006326371, 531 312 22 s=72 w=0.109228075, 532 313 204 s=73 w=0.006326371, 533 313 312 s=70 w=1.5751319E-4, 534 314 205 s=73 w=0.006326371, 535 314 313 s=59 w=0.001466786, 536 315 258 s=73 w=0.006326371, 537 315 314 s=77 w=0.0016833246, 538 316 315 s=76 w=1.050739E-4, 539 316 23 s=75 w=0.089916565, 540 317 258 s=76 w=1.050739E-4, 541 317 316 s=73 w=0.006326371, 542 318 259 s=76 w=1.050739E-4, 543 318 317 s=67 w=0.0021476466, 544 319 260 s=76 w=1.050739E-4, 545 319 318 s=81 w=4.242624E-4, 546 320 263 s=76 w=1.050739E-4, 547 320 319 s=80 w=0.001391344, 548 321 320 s=79 w=0.0022174222, 549 321 24 s=78 w=0.17474917, 550 322 263 s=79 w=0.0022174222, 551 322 321 s=76 w=1.050739E-4, 552 323 264 s=79 w=0.0022174222, 553 323 322 s=71 w=0.0019187863, 554 324 265 s=79 w=0.0022174222, 555 324 323 s=64 w=1.337294E-5, 556 325 324 s=83 w=0.0013124112, 557 325 25 s=82 w=0.13961297, 558 326 265 s=83 w=0.0013124112, 559 326 325 s=79 w=0.0022174222, 560 327 266 s=83 w=0.0013124112, 561 327 326 s=77 w=0.0016833246, 562 328 267 s=83 w=0.0013124112, 563 328 327 s=74 w=0.0023116763, 564 329 268 s=83 w=0.0013124112, 565 329 328 s=60 w=8.702291E-4, 566 330 269 s=83 w=0.0013124112, 567 330 329 s=16 w=4.167727E-4, 568 331 330 s=85 w=4.8682792E-4, 569 331 26 s=84 w=0.1194786, 570 332 269 s=85 w=4.8682792E-4, 571 332 331 s=83 w=0.0013124112, 572 333 148 s=85 w=4.8682792E-4, 573 333 332 s=80 w=0.001391344, 574 334 149 s=85 w=4.8682792E-4, 575 334 333 s=61 w=0.0010516174, 576 335 150 s=85 w=4.8682792E-4, 577 335 334 s=26 w=0.0010168224, 578 336 151 s=85 w=4.8682792E-4, 579 336 335 s=21 w=0.0022681346, 580 337 336 s=87 w=0.0045568696, 581 337 27 s=86 w=0.09366718, 582 338 151 s=87 w=0.0045568696, 583 338 337 s=85 w=4.8682792E-4, 584 339 152 s=87 w=0.0045568696, 585 339 338 s=68 w=0.0015038507, 586 340 153 s=87 w=0.0045568696, 587 340 339 s=5 w=0.002769119, 588 341 340 s=89 w=0.0015117239, 589 341 28 s=88 w=0.08093566, 590 342 153 s=89 w=0.0015117239, 591 342 341 s=87 w=0.0045568696, 592 343 50 s=89 w=0.0015117239, 593 343 342 s=81 w=4.242624E-4, 594 344 38 s=89 w=0.0015117239, 595 344 343 s=50 w=3.9997647E-4, 596 345 39 s=89 w=0.0015117239, 597 345 344 s=14 w=0.0018195357, 598 346 40 s=89 w=0.0015117239, 599 346 345 s=6 w=0.08403672, 600 346 29 s=90 w=0.076351464, ; END; [Network] BEGIN st_Assumptions; uptodate; disttransform=NeighborNet; splitstransform=EqualAngle; SplitsPostProcess filter=dimension value=4; exclude no missing; autolayoutnodelabels; END; [st_Assumptions] phangorn/inst/extdata/trees/RAxML_bootstrap.AIs0000644000176200001440000006025613707232051021246 0ustar liggesusers(((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Uma,((Mur,Uth),Hma)),(Uar,Uam)),Tor,Ame); (((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Mur,Hma))),Tor,Ame); (((Uth,(Mur,Uam)),((Uma,Uar),Hma)),Tor,Ame); ((Hma,((Uam,(Uth,(Uma,Uar))),Mur)),Tor,Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Mur,Uth))),Ame); (Tor,((Uth,Uam),((Uma,(Hma,Mur)),Uar)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,(((Hma,Mur),Uth),((Uam,Uar),Uma)),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Hma,Mur))),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Ame); (Tor,((Uam,(Uth,Mur)),((Uar,Uma),Hma)),Ame); (Tor,((Hma,Mur),(((Uar,Uma),Uam),Uth)),Ame); (Tor,((Hma,(Uar,Uma)),((Uth,Mur),Uam)),Ame); (Tor,(Hma,(Mur,(Uth,(Uam,(Uar,Uma))))),Ame); (Tor,((((Hma,Mur),Uma),Uar),(Uam,Uth)),Ame); (Tor,((Hma,((Uam,Uth),Mur)),(Uma,Uar)),Ame); (Tor,(Uam,((Mur,Hma),((Uma,Uar),Uth))),Ame); (Tor,((Hma,(Uma,Uar)),(Uth,(Uam,Mur))),Ame); (Tor,((Mur,((Hma,(Uma,Uar)),Uth)),Uam),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,(((Uth,Uam),(Uma,Uar)),(Mur,Hma)),Ame); (Tor,((Uar,(Uma,(Hma,Mur))),(Uth,Uam)),Ame); (Tor,((Uar,(Uma,(Hma,(Uth,Mur)))),Uam),Ame); (Tor,(((Uth,(Uar,Uma)),(Hma,Mur)),Uam),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); (Tor,(((Mur,Hma),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uam,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Ame); (Tor,(((Hma,Uma),(Uam,(Mur,Uth))),Uar),Ame); (Tor,(((Uar,Uma),((Mur,Uth),Hma)),Uam),Ame); (Tor,((Mur,Hma),(Uam,(Uth,(Uar,Uma)))),Ame); (Tor,((Uth,Mur),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,(Hma,((Mur,(Uth,Uam)),(Uar,Uma))),Ame); (Tor,(Hma,((Uam,(Mur,Uth)),(Uar,Uma))),Ame); (Tor,((Uam,Uth),(Uar,(Uma,(Hma,Mur)))),Ame); (Tor,(Uam,(Uar,(Uma,(Hma,(Uth,Mur))))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,((Mur,(Uam,Uth)),((Uma,Uar),Hma)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,(Hma,((Uar,Uma),(Mur,(Uam,Uth)))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,(Uma,Uar)),((Uth,Mur),Uam)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,((Uma,((Uth,Mur),Hma)),Uar)),Ame); (Tor,(Uam,((Uth,Mur),(Hma,(Uar,Uma)))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,(Uam,(((Hma,(Uth,Mur)),Uma),Uar)),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,(((Mur,Uth),Uam),(Hma,(Uma,Uar))),Ame); (Tor,(((Uth,Hma),Mur),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,(((Mur,Uth),Uam),(Hma,(Uar,Uma))),Ame); (Tor,((((Hma,Mur),Uth),Uam),(Uar,Uma)),Ame); (Tor,((Uth,Uam),((Mur,Hma),(Uar,Uma))),Ame); (Tor,((Mur,((Hma,(Uar,Uma)),Uth)),Uam),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Hma,(Uth,Mur)),((Uam,Uar),Uma)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,(Uma,Uar)),((Mur,Uth),Uam)),Ame); (Tor,((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Mur,(Uth,Hma))),Ame); (Tor,((Uth,Uam),((Uma,Uar),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((((Uth,Mur),Uam),(Uar,Uma)),Hma),Ame); (Tor,(((Uth,(Mur,Uam)),(Uar,Uma)),Hma),Ame); (((Uam,(Uth,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Uar,Uam),Uma),(Hma,(Uth,Mur))),Tor,Ame); ((((Uth,Mur),((Uar,Uma),Hma)),Uam),Tor,Ame); (((Uth,(Uar,((Hma,Mur),Uma))),Uam),Tor,Ame); (((Hma,(Uma,(Uam,Uar))),(Uth,Mur)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((Hma,((Uth,(Uam,(Uma,Uar))),Mur)),Tor,Ame); (((Hma,(Uar,Uma)),(Uam,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); (((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Tor,Ame); ((((Uar,Uma),(Uth,Uam)),(Hma,Mur)),Tor,Ame); ((Uar,(Uma,(((Mur,Uth),Uam),Hma))),Tor,Ame); ((Uam,((Hma,(Uar,Uma)),(Mur,Uth))),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,((Hma,Mur),Uth)),Uar),Uam),Tor,Ame); (((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Tor,Ame); ((Uam,((Hma,(Mur,Uth)),(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,((Hma,Mur),Uma)),(Uth,Uam)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),(Uam,(Mur,Uth))),Hma),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((Mur,((Uth,Uam),((Uar,Uma),Hma))),Tor,Ame); ((Uam,((Uth,Mur),((Uma,Uar),Hma))),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Uam),Mur)),Tor,Ame); ((((Uma,(Uam,Uar)),Hma),(Mur,Uth)),Tor,Ame); (Tor,((((Uma,Uar),Uth),(Mur,Hma)),Uam),Ame); (Tor,((((Uth,Mur),Hma),Uma),(Uam,Uar)),Ame); (Tor,((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Mur,Hma),((Uth,(Uam,Uar)),Uma)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,((Hma,(Uar,Uma)),(Mur,(Uth,Uam))),Ame); (Tor,((Uar,(Uma,((Mur,Uth),Hma))),Uam),Ame); (Tor,(((Mur,Hma),(Uar,Uma)),(Uth,Uam)),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(((Uma,Uar),Uam),((Mur,Uth),Hma)),Ame); (Tor,(((Uth,(Uma,Uar)),Uam),(Mur,Hma)),Ame); (Tor,(Uam,(((Uth,Mur),Hma),(Uar,Uma))),Ame); (Tor,((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Ame); (Tor,(((Uar,Uma),Hma),((Uth,Uam),Mur)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((((Uar,Uma),Uth),(Mur,Hma)),Uam),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uar,Uma))),Ame); ((((Mur,Hma),((Uar,Uma),Uth)),Uam),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Tor,Ame); ((((Mur,Uth),Uam),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Uam,Mur)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uar,Uma))),Tor,Ame); (((Uth,Uam),(Mur,(Hma,(Uar,Uma)))),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Hma,(Uar,Uma)),(Uth,Uam)),Mur),Tor,Ame); ((((Uam,Uar),Uma),((Mur,Uth),Hma)),Tor,Ame); ((((Mur,Hma),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((((Uth,Mur),Hma),(Uma,(Uam,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,Uth),(Uar,((Mur,Hma),Uma))),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,(Uth,Mur)),(Uma,(Uar,Uam))),Tor,Ame); (((Uth,Mur),(((Uam,Uma),Uar),Hma)),Tor,Ame); ((((Uth,(Hma,Mur)),(Uma,Uar)),Uam),Tor,Ame); (((Uth,(Hma,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,Uam),(Uar,((Hma,Mur),Uma))),Tor,Ame); ((((Mur,Uth),Hma),((Uma,Uar),Uam)),Tor,Ame); ((Uam,((Uma,((Mur,Uth),Hma)),Uar)),Tor,Ame); ((Uam,((Uth,(Hma,Mur)),(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Uam,Uar),(Uma,(Uth,(Hma,Mur)))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Tor,Ame); (((Uar,(Hma,Uma)),((Mur,Uth),Uam)),Tor,Ame); ((((Mur,Uth),Hma),((Uma,Uar),Uam)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,(((Uar,Uma),Uth),(Mur,Hma))),Tor,Ame); (((Uam,(Mur,Uth)),(Hma,(Uar,Uma))),Tor,Ame); ((Uam,((Hma,Mur),((Uar,Uma),Uth))),Tor,Ame); ((Uam,((Hma,Mur),((Uar,Uma),Uth))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),((Uar,Uma),Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); ((((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (Tor,((Uma,(((Uth,Mur),Hma),Uar)),Uam),Ame); (Tor,(Uam,(Uar,(Uma,(Uth,(Mur,Hma))))),Ame); (Tor,(((Mur,Hma),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Hma,((Uar,Uma),(Mur,Uth))),Uam),Ame); (Tor,((Mur,Hma),((Uma,Uar),(Uth,Uam))),Ame); (Tor,(((Mur,Uth),Hma),((Uma,Uar),Uam)),Ame); (Tor,(((Uam,(Mur,Uth)),Hma),(Uma,Uar)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,((Uth,Uam),(((Hma,Mur),Uma),Uar)),Ame); (Tor,((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Ame); (Tor,((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Hma,Mur)),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,(((Mur,Uth),Uam),((Uar,Uma),Hma)),Ame); ((Hma,((Uam,(Uth,Mur)),(Uma,Uar))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uma,Uar))),Tor,Ame); (((((Uma,Uar),Uth),(Hma,Mur)),Uam),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Mur),Uam)),Tor,Ame); (((Hma,Mur),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Tor,Ame); (((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((((Uma,Uar),Uth),(Mur,Hma)),Uam),Tor,Ame); (((Uma,Uar),((Uth,(Mur,Hma)),Uam)),Tor,Ame); (((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Uth,Mur))),Tor,Ame); ((((Uth,Mur),Uam),(Hma,(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Mur,Hma),(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Hma,(Uma,Uar)),Mur)),Tor,Ame); ((((Uma,Uar),Hma),((Mur,Uth),Uam)),Tor,Ame); ((Uam,((Hma,Mur),((Uma,Uar),Uth))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uma,Uar)),(Uam,(Mur,Uth))),Tor,Ame); (((Hma,(Uma,Uar)),(Mur,(Uth,Uam))),Tor,Ame); (((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Tor,Ame); ((Uth,(Uam,(((Hma,Mur),Uma),Uar))),Tor,Ame); ((Hma,(Mur,((Uam,(Uma,Uar)),Uth))),Tor,Ame); ((Uam,((Hma,Mur),((Uma,Uar),Uth))),Tor,Ame); (((Uma,(Uar,(Hma,(Uth,Mur)))),Uam),Tor,Ame); ((((Uth,(Mur,Hma)),(Uma,Uar)),Uam),Tor,Ame); (((Mur,Hma),((Uam,(Uma,Uar)),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uth,(Uam,(Uma,Uar))),(Mur,Hma)),Tor,Ame); ((Hma,((Uam,(Uth,Mur)),(Uma,Uar))),Tor,Ame); (Tor,((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Ame); (Tor,((Uma,Uar),(Uam,(Uth,(Mur,Hma)))),Ame); (Tor,((Uma,Uar),((Mur,(Uam,Uth)),Hma)),Ame); (Tor,(((Mur,Uth),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(Uam,((Uma,Uar),(Uth,(Hma,Mur)))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,(Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Ame); (Tor,(Uam,(Mur,(Uth,((Uar,Uma),Hma)))),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Hma,Mur),(Uth,((Uma,Uar),Uam))),Ame); (Tor,(Uam,((Mur,Hma),((Uma,Uar),Uth))),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,((Uma,((Uth,Mur),Hma)),(Uam,Uar)),Ame); (Tor,((Mur,Hma),((Uth,Uam),(Uar,Uma))),Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(Uam,((Uar,Uma),(Hma,(Uth,Mur)))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Hma,Mur))),Ame); (Tor,(((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); (((Mur,Uth),(Hma,((Uma,Uar),Uam))),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((Uam,(((Hma,Mur),Uth),(Uma,Uar))),Tor,Ame); ((Uam,((Mur,Uth),(Hma,(Uma,Uar)))),Tor,Ame); (((Uth,Uam),(((Hma,Mur),Uma),Uar)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Mur,((Uma,Uar),Uth))),Hma),Tor,Ame); (((((Uma,Uar),Uam),Uth),(Mur,Hma)),Tor,Ame); ((((Uma,Uar),Uam),(Mur,(Uth,Hma))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uam,Mur),Uth),((Uma,Uar),Hma)),Tor,Ame); (((Mur,Hma),((Uar,(Uam,Uth)),Uma)),Tor,Ame); (((Mur,Hma),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Hma,(Uma,Uar)),((Uam,Uth),Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(((Uma,Uar),Uam),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,(Mur,((Hma,(Uma,Uar)),Uth))),Ame); (Tor,((Mur,Hma),((Uma,Uar),(Uam,Uth))),Ame); (Tor,(((Uth,Uma),(Mur,Hma)),(Uar,Uam)),Ame); (Tor,(Hma,(Mur,((Uma,Uar),(Uam,Uth)))),Ame); (Tor,((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Ame); (Tor,(((Uam,Uth),Mur),((Uma,Uar),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,(((Uar,Uma),Hma),(Uth,Mur))),Ame); (Tor,(((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Ame); (Tor,(Uam,((Uma,Uar),(Hma,(Mur,Uth)))),Ame); (Tor,((((Uam,(Uma,Uar)),Uth),Mur),Hma),Ame); (Tor,(((Uth,Uam),Uar),(Uma,(Hma,Mur))),Ame); (Tor,(Uam,((Uar,Uma),(Uth,(Hma,Mur)))),Ame); (Tor,((Hma,Mur),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Hma,Mur),(Uth,(Uar,Uma))),Uam),Ame); (Tor,(((Hma,Mur),(Uth,(Uar,Uma))),Uam),Ame); (Tor,((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(((Uar,Uma),Hma),((Uam,Uth),Mur)),Ame); ((Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Tor,Ame); ((Uam,((Hma,(Uar,Uma)),(Mur,Uth))),Tor,Ame); ((Uam,(((Hma,Mur),Uth),(Uar,Uma))),Tor,Ame); ((Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Tor,Ame); (((Uar,(Uth,Uam)),((Hma,Mur),Uma)),Tor,Ame); (((Hma,Mur),((Uar,Uma),(Uth,Uam))),Tor,Ame); (((Uth,(Uma,(Hma,Mur))),(Uar,Uam)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,((Uth,Mur),((Uar,Uma),Hma))),Tor,Ame); ((Uam,(Uma,((Hma,(Uth,Mur)),Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); ((((Uam,Mur),Uth),(Hma,(Uar,Uma))),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Mur,((Uam,(Uar,Uma)),Uth)),Hma),Tor,Ame); ((Uam,(Uar,(Uma,((Hma,Mur),Uth)))),Tor,Ame); (((Uth,Uam),(Uar,((Hma,Mur),Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uma,(Hma,Mur)),((Uth,Uam),Uar)),Tor,Ame); ((((Uma,(Hma,(Uth,Mur))),Uar),Uam),Tor,Ame); ((((Uth,(Mur,Hma)),(Uar,Uma)),Uam),Tor,Ame); ((Uam,(((Hma,(Uth,Mur)),Uma),Uar)),Tor,Ame); ((Hma,((Uma,Uar),((Uth,Mur),Uam))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((((Hma,Mur),Uth),Uam),(Uar,Uma)),Tor,Ame); ((Uam,(((Hma,(Mur,Uth)),Uar),Uma)),Tor,Ame); (((Hma,Mur),(Uma,(Uth,(Uar,Uam)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uma,Uar),(((Uth,Hma),Mur),Uam)),Tor,Ame); (((Mur,(Hma,(Uma,Uar))),(Uth,Uam)),Tor,Ame); (((((Hma,(Mur,Uth)),Uma),Uar),Uam),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); (((Uth,(Uma,(Uar,Uam))),(Hma,Mur)),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); (Tor,((Uth,Uam),((Uar,Uma),(Mur,Hma))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,(((Uth,Uam),(Uar,Uma)),(Mur,Hma)),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Ame); (Tor,(Uam,((Uth,(Uar,Uma)),(Mur,Hma))),Ame); (Tor,((Mur,Hma),((Uth,Uam),(Uar,Uma))),Ame); (Tor,(((Mur,Hma),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uth,Uam))),Ame); (Tor,(((Uth,Mur),Hma),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Uam,(Uar,Uma))),(Hma,Mur)),Ame); (Tor,(Uam,(((Hma,(Uth,Mur)),Uar),Uma)),Ame); (Tor,((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Ame); (Tor,(Uam,(Uar,(((Mur,Uth),Hma),Uma))),Ame); (Tor,(Uam,((Uth,(Hma,Mur)),(Uma,Uar))),Ame); (Tor,((Uam,(Uth,(Hma,Mur))),(Uma,Uar)),Ame); (Tor,((Hma,(Mur,Uth)),(Uma,(Uam,Uar))),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uma,Uar))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Ame); (Tor,(((Uma,Uar),((Hma,Mur),Uth)),Uam),Ame); (((Uth,Uam),(Uar,(Uma,(Mur,Hma)))),Tor,Ame); ((((Mur,Hma),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uth,Mur)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Uar,(((Mur,Uth),Hma),Uma)),Uam),Tor,Ame); ((((Mur,Uth),Hma),(Uma,(Uam,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); ((((Mur,Uth),Uam),((Uma,Uar),Hma)),Tor,Ame); (((Uth,Uam),(Uar,((Mur,Hma),Uma))),Tor,Ame); ((Uam,(Uar,(((Uth,Mur),Hma),Uma))),Tor,Ame); ((Uam,(((Uma,Uar),Uth),(Mur,Hma))),Tor,Ame); ((Uam,(((Uma,Uar),Uth),(Mur,Hma))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Hma,(Uma,Uar)),(Mur,Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(Uar,(Uma,(Hma,(Mur,Uth))))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(Mur,((Uth,Hma),(Uar,Uma)))),Tor,Ame); ((Uam,(Mur,((Uth,Hma),(Uar,Uma)))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Tor,Ame); (((Uth,Uam),((Uma,(Hma,Mur)),Uar)),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uar,Uma))),Tor,Ame); ((Uam,((Mur,Hma),(Uth,(Uma,Uar)))),Tor,Ame); (((Mur,Hma),((Uam,Uth),(Uma,Uar))),Tor,Ame); (((Uam,Uth),(Uar,(Uma,(Mur,Hma)))),Tor,Ame); ((Hma,((Uar,Uma),(Uam,(Mur,Uth)))),Tor,Ame); (((Uar,Uma),(Uam,((Hma,Mur),Uth))),Tor,Ame); (((Uam,Uar),(Uma,(Hma,(Mur,Uth)))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Mur,Uth)))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uth,Uam)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (Tor,((Hma,(Uth,Mur)),((Uam,Uar),Uma)),Ame); (Tor,(((Uth,Mur),(Hma,(Uar,Uma))),Uam),Ame); (Tor,((Mur,(Hma,(Uar,Uma))),(Uth,Uam)),Ame); (Tor,((Uth,Uam),((Mur,Hma),(Uar,Uma))),Ame); (Tor,((Mur,(Uth,Uam)),(Hma,(Uar,Uma))),Ame); (Tor,(Uam,((Hma,Mur),((Uar,Uma),Uth))),Ame); (Tor,(Uam,((Hma,Mur),((Uar,Uma),Uth))),Ame); (Tor,((Hma,(Uar,Uma)),((Uth,Mur),Uam)),Ame); (Tor,((Hma,Mur),((Uam,Uth),(Uar,Uma))),Ame); (Tor,((Hma,Mur),((Uam,Uth),(Uar,Uma))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,(Uam,((Uar,Uma),(Uth,(Hma,Mur)))),Ame); (Tor,((Uar,Uma),((Uth,(Hma,Mur)),Uam)),Ame); (Tor,((((Uar,Uma),Uth),(Hma,Mur)),Uam),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,((Hma,Mur),((Uar,Uma),(Uth,Uam))),Ame); (Tor,(((Hma,Mur),((Uar,Uma),Uth)),Uam),Ame); (Tor,((Hma,Mur),((Uam,(Uar,Uma)),Uth)),Ame); (((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Tor,Ame); ((Uam,((Uth,Mur),((Uma,Uar),Hma))),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uth,Uam),((Hma,Mur),(Uma,Uar))),Tor,Ame); (((Uth,(Mur,Uam)),(Hma,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Mur,Hma),((Uth,Uam),(Uma,Uar))),Tor,Ame); ((Hma,(((Uam,Uth),Mur),(Uma,Uar))),Tor,Ame); (((Uth,Mur),((Uma,(Uam,Uar)),Hma)),Tor,Ame); ((Hma,((Uth,(Uam,Mur)),(Uma,Uar))),Tor,Ame); (((Mur,Hma),(Uam,((Uma,Uar),Uth))),Tor,Ame); (((Mur,((Uma,Uar),Hma)),(Uam,Uth)),Tor,Ame); ((((Uma,(Uam,Uar)),Uth),(Hma,Mur)),Tor,Ame); (((Mur,(Uth,Uam)),((Uar,Uma),Hma)),Tor,Ame); (((Uma,(Uam,Uar)),(Hma,(Uth,Mur))),Tor,Ame); ((((Uam,Uth),Mur),((Uma,Uar),Hma)),Tor,Ame); ((((Uam,Uth),Mur),((Uma,Uar),Hma)),Tor,Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,(Uam,((Uth,Mur),((Uar,Uma),Hma))),Ame); (Tor,((Uar,Uma),(Uam,(Uth,(Hma,Mur)))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uam,Uth))),Ame); (Tor,((Mur,Hma),((Uar,Uma),(Uam,Uth))),Ame); (Tor,((Mur,(Uam,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,((Uam,(Uth,Mur)),(Hma,(Uar,Uma))),Ame); (Tor,((Uth,(Hma,Mur)),((Uar,Uma),Uam)),Ame); (Tor,(Uam,((Hma,Mur),(Uth,(Uar,Uma)))),Ame); (Tor,((Uar,(Hma,Uma)),(Uth,(Uam,Mur))),Ame); (Tor,((Uam,(Mur,Uth)),(Hma,(Uar,Uma))),Ame); (Tor,(Uam,((Hma,(Mur,Uth)),(Uar,Uma))),Ame); (Tor,((Hma,(Mur,Uth)),((Uar,Uma),Uam)),Ame); (Tor,(Hma,(Mur,(((Uar,Uma),Uam),Uth))),Ame); (Tor,(Uam,(Uar,((Hma,(Mur,Uth)),Uma))),Ame); (Tor,(Uam,(Uar,((Hma,(Mur,Uth)),Uma))),Ame); (Tor,(((Uth,(Hma,Mur)),Uma),(Uam,Uar)),Ame); (Tor,(((Uth,Mur),Hma),(Uam,(Uma,Uar))),Ame); (Tor,(((Uam,(Uth,Mur)),Hma),(Uma,Uar)),Ame); (((Uma,(Uth,(Hma,Mur))),(Uam,Uar)),Tor,Ame); ((((Uth,Mur),Hma),(Uam,(Uar,Uma))),Tor,Ame); (((Mur,Hma),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); ((Uam,(Uar,(((Uth,Mur),Hma),Uma))),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); (((Uam,Uth),(Uar,((Hma,Mur),Uma))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,(Uar,(Uma,((Uth,Mur),Hma)))),Tor,Ame); ((Uam,(Uar,(Uma,((Uth,Mur),Hma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uam,(Mur,Uth)),((Uma,Uar),Hma)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Uam),((Uma,Uar),(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((Uam,(((Hma,(Mur,Uth)),Uma),Uar)),Tor,Ame); ((((Uma,Uar),Hma),((Uth,Uam),Mur)),Tor,Ame); ((((Hma,Mur),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Hma,Mur),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Hma,((Uma,Uar),(Mur,Uth))),Uam),Tor,Ame); (((Mur,(Uam,Uth)),(Hma,(Uma,Uar))),Tor,Ame); ((((Uma,Uar),Uam),((Mur,Hma),Uth)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Mur,Hma)),Tor,Ame); (((Mur,Hma),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Mur,Hma),((Uma,Uar),Uth)),Uam),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Mur,Hma),((Uma,Uar),(Uth,Uam))),Tor,Ame); (((Uth,(Mur,Hma)),((Uma,Uar),Uam)),Tor,Ame); (((Uma,Uar),(Uam,(Uth,(Mur,Hma)))),Tor,Ame); (((Hma,(Uth,Mur)),((Uma,Uar),Uam)),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); (((Uth,Uam),((Uar,Uma),(Hma,Mur))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((Uam,(Uar,(Uma,(Uth,(Mur,Hma))))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uma,(Uam,Uar)),((Uth,Mur),Hma)),Tor,Ame); (((Uth,Mur),(Hma,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (Tor,(Uam,(Uar,(Uma,(Hma,(Uth,Mur))))),Ame); (Tor,((Hma,((Uth,Mur),Uma)),(Uam,Uar)),Ame); (Tor,(Uam,(((Hma,(Uma,Uar)),Mur),Uth)),Ame); (Tor,(((Uma,Uar),(Mur,Hma)),(Uth,Uam)),Ame); (Tor,((Uth,(Mur,Hma)),(Uam,(Uma,Uar))),Ame); (Tor,(((Uma,Uar),(Mur,Hma)),(Uam,Uth)),Ame); (Tor,(((Uma,Uar),Hma),(Mur,(Uam,Uth))),Ame); (Tor,((Uth,(Uam,(Uma,Uar))),(Hma,Mur)),Ame); (Tor,((Uam,(Uth,Mur)),((Uma,Uar),Hma)),Ame); (Tor,((Hma,(Uth,Mur)),(Uam,(Uma,Uar))),Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((((Uar,Uma),((Hma,Mur),Uth)),Uam),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); ((Uam,((Uar,Uma),(Hma,(Uth,Mur)))),Tor,Ame); ((((Uam,Uar),Uma),(Hma,(Uth,Mur))),Tor,Ame); (((Mur,Hma),((Uam,(Uar,Uma)),Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); ((((Uth,(Mur,Uam)),(Uar,Uma)),Hma),Tor,Ame); ((((Uar,Uma),(Hma,Mur)),(Uam,Uth)),Tor,Ame); ((((Uar,Uma),Hma),((Mur,Uam),Uth)),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Uth,Mur)),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,Mur),((Uth,Uam),(Uar,Uma))),Tor,Ame); (((Uar,(Uma,(Hma,(Uth,Mur)))),Uam),Tor,Ame); (((Mur,Hma),(((Uar,Uma),Uam),Uth)),Tor,Ame); (((Mur,Hma),((Uar,Uma),(Uam,Uth))),Tor,Ame); (((Mur,Hma),((Uar,Uma),(Uam,Uth))),Tor,Ame); (((Uar,((Mur,Hma),Uma)),(Uam,Uth)),Tor,Ame); ((((Mur,Hma),Uma),((Uam,Uar),Uth)),Tor,Ame); (((Uth,((Uma,Uar),Uam)),(Hma,Mur)),Tor,Ame); ((((Uma,Uar),(Uth,Uam)),(Hma,Mur)),Tor,Ame); (((Uar,Uam),(Uma,(Uth,(Hma,Mur)))),Tor,Ame); ((((Uam,Uth),(Uar,Uma)),(Hma,Mur)),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Uth,((Uar,Uma),Uam)),(Mur,Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,Mur),((Uma,(Uam,Uar)),Uth)),Tor,Ame); phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.run1.t0000644000176200001440000025045013707232051023151 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; translate 1 No305, 2 No304, 3 No306, 4 No0906S, 5 No0908S, 6 No0909S, 7 No0910S, 8 No0912S, 9 No0913S, 10 No1103S, 11 No1007S, 12 No1114S, 13 No1202S, 14 No1206S, 15 No1208S; tree rep.1 = ((((((3,((((((13,6),15),(5,9)),12),2),11)),7),8),4),10),14,1); tree rep.10000 = (12,((8,(10,(11,(15,6)))),(((14,((7,13),4)),(3,(9,2))),5)),1); tree rep.20000 = (((8,(10,((6,15),11))),(((2,9),((14,5),3)),(4,(7,13)))),12,1); tree rep.30000 = (((4,(((7,(9,13)),(3,2)),(14,5))),((10,8),((15,6),11))),12,1); tree rep.40000 = (((((6,11),15),(10,8)),(((3,(2,9)),(4,(14,(13,7)))),5)),12,1); tree rep.50000 = (((((7,13),4),((11,(6,15)),(10,8))),((3,(2,9)),(14,5))),12,1); tree rep.60000 = (12,(((8,10),((15,6),11)),(((4,(7,13)),(5,(3,(9,2)))),14)),1); tree rep.70000 = (((4,(13,7)),(((((9,2),3),12),5),14)),((8,10),(11,(6,15))),1); tree rep.80000 = (12,(((5,(14,((7,13),4))),(3,(2,9))),((8,((11,6),15)),10)),1); tree rep.90000 = (12,((((2,9),3),(14,(5,(4,(7,13))))),(((11,(15,6)),8),10)),1); tree rep.100000 = (((((9,2),3),(5,((14,(13,7)),4))),(8,(((15,6),11),10))),12,1); tree rep.110000 = (((((6,15),11),(8,10)),(5,(((4,14),(7,13)),((2,9),3)))),12,1); tree rep.120000 = (12,(((5,(14,(3,(9,2)))),((7,4),13)),(10,(((6,11),15),8))),1); tree rep.130000 = (12,(((10,8),(11,(6,15))),((3,(2,9)),(5,((4,(13,7)),14)))),1); tree rep.140000 = (12,(((3,(9,2)),((15,(11,6)),(10,8))),((5,(13,7)),(14,4))),1); tree rep.150000 = (((4,(((9,2),3),(5,(14,(7,13))))),12),(((11,(6,15)),10),8),1); tree rep.160000 = (((5,((14,((3,(9,2)),4)),(7,13))),(((15,11),6),(10,8))),12,1); tree rep.170000 = (12,((((15,6),11),(8,10)),((14,(((13,7),4),5)),((2,9),3))),1); tree rep.180000 = (((((7,13),4),5),((10,(8,(11,(6,15)))),(((9,2),3),14))),12,1); tree rep.190000 = (12,((3,(9,2)),(((8,10),((15,6),11)),(5,(14,((13,7),4))))),1); tree rep.200000 = ((((6,(11,15)),(10,8)),(((4,(13,7)),((2,9),3)),(14,5))),12,1); tree rep.210000 = (((8,(10,(11,(15,6)))),(((13,7),4),(5,((3,(2,9)),14)))),12,1); tree rep.220000 = ((((4,(7,13)),(((3,(9,2)),5),14)),(10,((11,(15,6)),8))),12,1); tree rep.230000 = (12,((14,((((8,(11,(15,6))),10),(((13,7),5),4)),3)),(2,9)),1); tree rep.240000 = ((((14,((2,9),3)),((((6,(15,11)),8),10),5)),(4,(13,7))),12,1); tree rep.250000 = (12,(((6,(11,15)),(10,8)),((3,(9,2)),(5,((14,(13,7)),4)))),1); tree rep.260000 = (((((11,(15,6)),10),8),((((3,(2,9)),14),(4,(13,7))),5)),12,1); tree rep.270000 = (12,((5,14),((((8,10),((6,15),11)),((9,2),(4,(7,13)))),3)),1); tree rep.280000 = ((((((7,13),((2,9),3)),(5,14)),((11,(15,6)),(10,8))),4),12,1); tree rep.290000 = (((8,(((11,6),15),10)),((5,((2,9),3)),((4,14),(7,13)))),12,1); tree rep.300000 = (12,((((3,(5,((7,13),4))),(2,9)),14),(8,(((11,15),6),10))),1); tree rep.310000 = (((11,(6,15)),((5,((14,((13,7),4)),(3,(2,9)))),(10,8))),12,1); tree rep.320000 = (12,((((15,6),11),(10,8)),(((3,(2,9)),(4,(14,(7,13)))),5)),1); tree rep.330000 = ((((((11,(6,15)),(10,8)),(5,((7,13),(4,14)))),3),(2,9)),12,1); tree rep.340000 = ((((10,8),(11,(15,6))),(((((2,9),3),(4,14)),(7,13)),5)),12,1); tree rep.350000 = (12,((5,(((6,15),11),(10,8))),(((2,9),3),(4,(14,(7,13))))),1); tree rep.360000 = (12,(((((6,15),11),8),10),((5,((2,9),3)),((14,(7,13)),4))),1); tree rep.370000 = (12,((4,(14,((7,13),(5,(3,(9,2)))))),((11,(15,6)),(10,8))),1); tree rep.380000 = (((((14,5),(4,(13,7))),((2,9),3)),(8,((6,(15,11)),10))),12,1); tree rep.390000 = ((((((7,13),4),5),((2,9),3)),((((11,(15,6)),10),8),14)),12,1); tree rep.400000 = (12,(((9,2),3),((((6,11),15),(8,10)),((14,5),(4,(7,13))))),1); tree rep.410000 = ((5,((((4,(13,7)),14),((10,8),((11,15),6))),(3,(9,2)))),12,1); tree rep.420000 = ((((8,(11,(15,6))),10),(5,((14,((13,7),4)),(3,(9,2))))),12,1); tree rep.430000 = (12,((((9,2),((7,13),4)),(14,(3,5))),((8,(11,(6,15))),10)),1); tree rep.440000 = (12,((5,((4,((3,(9,2)),(13,7))),14)),((8,((11,15),6)),10)),1); tree rep.450000 = ((((8,10),((6,15),11)),(5,(((2,9),3),(14,((13,7),4))))),12,1); tree rep.460000 = (((14,((5,((2,9),3)),(4,(13,7)))),((8,10),((15,11),6))),12,1); tree rep.470000 = (((4,(13,7)),(14,(5,(3,(2,9))))),((10,((11,(15,6)),8)),12),1); tree rep.480000 = (12,((((15,6),11),(8,10)),((((2,9),3),((4,(13,7)),14)),5)),1); tree rep.490000 = ((((10,8),(11,(6,15))),(((9,2),3),(((4,(13,7)),14),5))),12,1); tree rep.500000 = (12,(((10,(6,(15,11))),8),(((2,9),3),(5,(((7,13),4),14)))),1); tree rep.510000 = (12,((8,(((11,6),15),10)),((4,(((2,9),3),5)),((13,7),14))),1); tree rep.520000 = ((((11,(6,15)),(8,10)),12),((4,(13,7)),((5,14),(3,(9,2)))),1); tree rep.530000 = (12,((((13,7),4),(14,5)),(((9,2),3),((15,(11,6)),(8,10)))),1); tree rep.540000 = (12,((14,((4,((13,7),9)),(2,(3,5)))),((((15,11),6),8),10)),1); tree rep.550000 = ((((3,((9,2),(14,((7,13),4)))),5),12),(10,(((11,15),6),8)),1); tree rep.560000 = (12,((5,(3,((14,(4,(13,7))),(2,9)))),((10,8),((15,6),11))),1); tree rep.570000 = (((((6,(15,11)),10),8),(((3,(2,9)),(((7,13),4),14)),5)),12,1); tree rep.580000 = ((((5,(14,(7,(4,13)))),(3,(9,2))),(8,(10,(6,(11,15))))),12,1); tree rep.590000 = (12,((5,(((4,(7,13)),14),((2,9),3))),(8,(10,(11,(6,15))))),1); tree rep.600000 = ((10,(((((7,13),4),(5,(3,(2,9)))),14),8)),(12,((11,6),15)),1); tree rep.610000 = (((((3,(2,9)),(14,((4,13),7))),5),(10,(8,(6,(15,11))))),12,1); tree rep.620000 = (((3,(9,2)),(((((7,13),4),14),(((15,11),6),(8,10))),5)),12,1); tree rep.630000 = (12,((((15,6),11),(8,10)),((((13,7),(14,4)),((2,9),3)),5)),1); tree rep.640000 = (((((14,(7,13)),4),(3,(9,2))),(5,12)),(8,(((15,6),11),10)),1); tree rep.650000 = (12,(((((11,15),6),10),8),(((5,3),4),(14,((13,7),(9,2))))),1); tree rep.660000 = ((((6,(15,11)),(8,10)),(14,(((9,2),3),(((7,13),4),5)))),12,1); tree rep.670000 = (((((11,(6,15)),8),10),(14,((7,13),(((3,(2,9)),5),4)))),12,1); tree rep.680000 = (12,(((((2,9),3),5),(4,(14,(13,7)))),(8,(10,(11,(6,15))))),1); tree rep.690000 = (((((13,7),((14,5),4)),(3,(9,2))),((10,8),((15,11),6))),12,1); tree rep.700000 = (((5,((4,(3,(2,9))),(7,(13,14)))),(((6,11),15),(10,8))),12,1); tree rep.710000 = (((5,14),((7,13),(4,((2,9),3)))),(12,(8,(((15,6),11),10))),1); tree rep.720000 = (((2,9),3),((7,13),(5,(4,(14,((10,(8,(6,(11,15)))),12))))),1); tree rep.730000 = (((((11,15),6),(10,8)),((4,(14,(7,13))),(5,(3,(2,9))))),12,1); tree rep.740000 = ((12,((11,(15,6)),(10,8))),((14,4),(((7,13),5),((2,9),3))),1); tree rep.750000 = (12,(((((9,2),3),(14,((13,7),4))),5),((10,8),((15,11),6))),1); tree rep.760000 = ((((10,8),((11,6),15)),(5,((4,(14,(13,7))),(3,(2,9))))),12,1); tree rep.770000 = (12,(((3,(2,9)),((10,((6,(11,15)),8)),(5,14))),((13,7),4)),1); tree rep.780000 = (((3,(2,9)),(5,(14,(((8,10),((11,15),6)),12)))),(4,(13,7)),1); tree rep.790000 = (12,(((14,(((3,(2,9)),(7,13)),4)),5),(8,(10,((15,6),11)))),1); tree rep.800000 = (12,(((((9,2),3),5),(14,(4,(7,13)))),((8,((15,6),11)),10)),1); tree rep.810000 = (12,((((15,11),6),(10,8)),(((9,2),3),((14,5),(4,(7,13))))),1); tree rep.820000 = ((((14,(4,((7,13),(3,(9,2))))),5),(10,(8,(11,(15,6))))),12,1); tree rep.830000 = (12,((((3,(2,9)),5),(14,(4,(7,13)))),(8,(10,(6,(15,11))))),1); tree rep.840000 = ((((8,10),(11,(15,6))),(((14,(13,7)),4),(5,((2,9),3)))),12,1); tree rep.850000 = (12,(((10,((15,11),6)),8),(((5,((7,13),4)),14),(3,(9,2)))),1); tree rep.860000 = ((((((3,(9,2)),(14,(13,7))),4),5),((((6,15),11),10),8)),12,1); tree rep.870000 = (12,(((((9,2),3),(5,14)),((8,(11,(15,6))),10)),((4,13),7)),1); tree rep.880000 = ((((14,4),(13,7)),((((2,9),3),(10,((15,(6,11)),8))),5)),12,1); tree rep.890000 = ((((4,(13,7)),(14,(5,(3,(2,9))))),(10,(((15,6),11),8))),12,1); tree rep.900000 = (12,(((8,10),((6,15),11)),((5,14),((3,(2,9)),(4,(7,13))))),1); tree rep.910000 = (((((14,(7,13)),((2,9),3)),(4,5)),(10,(8,(6,(11,15))))),12,1); tree rep.920000 = ((12,(((9,2),3),(5,(((13,7),4),14)))),((8,(11,(6,15))),10),1); tree rep.930000 = (((((3,(9,2)),5),(14,((13,7),4))),((8,((6,15),11)),10)),12,1); tree rep.940000 = (12,(((8,10),(11,(15,6))),((((3,(2,9)),(7,13)),(5,14)),4)),1); tree rep.950000 = (((((6,(15,11)),8),10),(((13,7),(14,4)),(5,(3,(2,9))))),12,1); tree rep.960000 = ((((8,10),((6,15),11)),((((7,13),14),4),(((2,9),3),5))),12,1); tree rep.970000 = ((((((4,14),5),(3,(9,2))),(7,13)),(8,((11,(15,6)),10))),12,1); tree rep.980000 = (12,(((((14,4),(8,(10,(11,(15,6))))),5),(7,13)),((9,2),3)),1); tree rep.990000 = (((5,((3,(9,2)),((7,(14,13)),4))),(10,(((6,11),15),8))),12,1); tree rep.1000000 = (12,(((5,(((13,7),14),4)),((2,9),3)),((11,(15,6)),(10,8))),1); tree rep.1010000 = (12,((((14,5),(((15,6),11),(10,8))),(4,(13,7))),(3,(2,9))),1); tree rep.1020000 = (12,(((6,15),11),((4,(5,(((2,9),3),(14,(13,7))))),(8,10))),1); tree rep.1030000 = (((5,3),((4,(7,13)),((2,9),14))),(((((15,11),6),8),10),12),1); tree rep.1040000 = (12,(3,(((((14,4),((8,10),(6,(11,15)))),5),(13,7)),(2,9))),1); tree rep.1050000 = (12,(((5,((4,(13,7)),14)),(3,(2,9))),(10,(8,(6,(15,11))))),1); tree rep.1060000 = ((((4,((13,7),14)),(5,((8,10),(6,(15,11))))),(3,(2,9))),12,1); tree rep.1070000 = (12,((((8,(10,((15,11),6))),14),((((9,2),3),5),(13,7))),4),1); tree rep.1080000 = ((((10,8),((15,11),6)),12),((5,(14,(3,(9,2)))),(4,(7,13))),1); tree rep.1090000 = (12,((10,8),(((6,11),15),((((7,13),(3,(2,9))),(5,14)),4))),1); tree rep.1100000 = (12,((((13,(7,14)),(5,4)),(3,(2,9))),((8,((15,11),6)),10)),1); tree rep.1110000 = ((((10,8),(6,(15,11))),((4,(((13,7),14),(3,(9,2)))),5)),12,1); tree rep.1120000 = (((10,((6,(11,15)),8)),(((7,13),14),((4,5),((2,9),3)))),12,1); tree rep.1130000 = ((((((9,2),(14,((13,7),4))),5),3),(8,(((15,11),6),10))),12,1); tree rep.1140000 = ((((5,((10,8),((6,15),11))),((9,2),3)),(((13,7),14),4)),12,1); tree rep.1150000 = ((10,8),((12,((5,3),((2,9),((4,(7,13)),14)))),((11,15),6)),1); tree rep.1160000 = (12,(5,(((2,9),3),(((6,(15,11)),(10,8)),((13,7),(14,4))))),1); tree rep.1170000 = (((14,(((7,13),4),(5,((9,2),3)))),(8,((6,(15,11)),10))),12,1); tree rep.1180000 = ((((10,(11,(15,6))),8),(((7,(4,13)),14),(5,((2,9),3)))),12,1); tree rep.1190000 = (12,((5,(((4,(7,13)),14),((9,2),3))),(8,(10,((6,15),11)))),1); tree rep.1200000 = ((((14,(4,(7,13))),5),(3,(9,2))),(((10,8),((15,6),11)),12),1); tree rep.1210000 = (12,(((8,10),((11,15),6)),((((13,7),4),5),(((9,3),2),14))),1); tree rep.1220000 = ((((9,2),3),((14,((6,(15,11)),(8,10))),(((13,7),4),5))),12,1); tree rep.1230000 = (((((9,2),3),((4,14),(13,7))),5),(12,((8,10),(11,(15,6)))),1); tree rep.1240000 = ((((8,10),((15,11),6)),((5,((13,7),14)),((3,(9,2)),4))),12,1); tree rep.1250000 = (12,((10,8),(((15,11),6),(14,((4,(13,7)),(5,((9,2),3)))))),1); tree rep.1260000 = ((((((6,15),11),10),8),((14,((7,13),4)),((3,(9,2)),5))),12,1); tree rep.1270000 = (12,(((7,13),(((2,9),3),((5,14),4))),((((6,11),15),10),8)),1); tree rep.1280000 = ((14,((((10,8),((6,15),11)),5),(((3,(9,2)),(7,13)),4))),12,1); tree rep.1290000 = (12,((8,(10,(11,(15,6)))),(((4,7),13),(14,(5,(3,(9,2)))))),1); tree rep.1300000 = (((((13,7),((14,5),((9,2),3))),4),(10,(((6,15),11),8))),12,1); tree rep.1310000 = ((((8,((6,15),11)),10),((3,(2,9)),((14,5),(4,(13,7))))),12,1); tree rep.1320000 = (12,((((2,9),3),(5,((4,(7,13)),14))),((10,((15,11),6)),8)),1); tree rep.1330000 = (12,(((3,(2,9)),(14,((5,4),(13,7)))),((((15,6),11),8),10)),1); tree rep.1340000 = ((8,((((15,11),6),(5,(((4,14),(13,7)),((2,9),3)))),10)),12,1); tree rep.1350000 = (((((5,14),((4,7),13)),((2,9),3)),(((11,(6,15)),10),8)),12,1); tree rep.1360000 = ((12,((((15,11),6),8),10)),(5,((14,((7,13),4)),((9,2),3))),1); tree rep.1370000 = ((((8,(6,(11,15))),10),(((5,14),((7,13),4)),(3,(9,2)))),12,1); tree rep.1380000 = (((((13,7),14),(5,4)),((12,(2,9)),3)),((8,10),(6,(11,15))),1); tree rep.1390000 = (12,(((4,(7,13)),((5,14),((2,9),3))),(10,(8,((15,11),6)))),1); tree rep.1400000 = ((12,(8,(((15,6),11),10))),(((3,(9,2)),5),(14,((13,7),4))),1); tree rep.1410000 = (((3,((5,(9,2)),12)),((4,(7,13)),14)),((10,((15,6),11)),8),1); tree rep.1420000 = ((((10,(11,(15,6))),8),((14,5),(((9,2),3),(4,(7,13))))),12,1); tree rep.1430000 = (12,(((11,(6,15)),(8,10)),((3,((13,7),4)),(((9,2),5),14))),1); tree rep.1440000 = ((((5,((14,(4,(7,13))),((2,9),3))),(8,10)),(6,(11,15))),12,1); tree rep.1450000 = (((((14,(5,(2,3))),4),((10,8),((11,15),6))),(9,(7,13))),12,1); tree rep.1460000 = ((((((4,(13,7)),((5,14),(3,(9,2)))),10),8),(6,(11,15))),12,1); tree rep.1470000 = (12,((8,(10,(11,(15,6)))),((((4,(7,13)),14),((2,9),3)),5)),1); tree rep.1480000 = (((((7,(4,13)),(5,((9,2),3))),14),(((6,(15,11)),8),10)),12,1); tree rep.1490000 = ((12,((3,(9,2)),((((7,4),13),14),5))),(((6,15),11),(8,10)),1); tree rep.1500000 = ((7,((5,(14,((3,(2,9)),(4,((10,8),((15,6),11)))))),13)),12,1); tree rep.1510000 = (((((6,11),15),(10,8)),((((13,7),14),4),(((2,9),3),5))),12,1); tree rep.1520000 = ((((14,5),(((7,13),4),((2,9),3))),((8,10),((15,11),6))),12,1); tree rep.1530000 = ((5,((4,(7,13)),(14,(3,(2,9))))),(12,(8,(10,(11,(15,6))))),1); tree rep.1540000 = (12,(((3,(2,9)),((4,((14,13),7)),5)),(10,(8,((6,15),11)))),1); tree rep.1550000 = (12,(((11,(15,6)),(10,8)),(5,(((9,2),3),(14,((7,13),4))))),1); tree rep.1560000 = ((((3,(9,2)),((4,(13,7)),(5,14))),((11,(15,6)),(8,10))),12,1); tree rep.1570000 = (((15,11),6),(5,((2,9),(((14,((4,3),12)),(13,7)),(10,8)))),1); tree rep.1580000 = ((((11,(15,6)),(10,8)),(((4,(7,13)),14),(((2,9),3),5))),12,1); tree rep.1590000 = (((((2,9),3),(4,((7,13),(14,5)))),((8,(6,(15,11))),10)),12,1); tree rep.1600000 = ((((11,(15,6)),(10,8)),12),((((14,4),(13,7)),((2,9),3)),5),1); tree rep.1610000 = ((((10,8),((11,15),6)),((((2,9),3),5),(14,(4,(7,13))))),12,1); tree rep.1620000 = (((((2,9),3),((14,5),(4,(7,13)))),(10,(8,((6,15),11)))),12,1); tree rep.1630000 = (((((7,13),((5,4),14)),((9,2),3)),(10,(8,(6,(11,15))))),12,1); tree rep.1640000 = (((((14,5),((2,9),3)),(4,(13,7))),((11,(6,15)),(8,10))),12,1); tree rep.1650000 = (((((3,(9,2)),(((13,7),14),4)),5),(((6,15),11),(8,10))),12,1); tree rep.1660000 = ((((10,((15,11),6)),8),(4,(((14,(7,13)),5),(3,(2,9))))),12,1); tree rep.1670000 = (((14,(((13,7),4),(5,((9,2),3)))),(8,(10,((15,11),6)))),12,1); tree rep.1680000 = (12,(((8,10),(11,(6,15))),(((7,13),(4,14)),(((9,2),3),5))),1); tree rep.1690000 = (((8,((6,(15,11)),10)),(5,((14,((13,4),7)),((9,2),3)))),12,1); tree rep.1700000 = (12,(((4,(5,(13,7))),(((9,2),3),14)),((8,(15,(6,11))),10)),1); tree rep.1710000 = (((((((9,2),3),(4,(7,13))),((8,10),(6,(11,15)))),5),14),12,1); tree rep.1720000 = (((8,((6,(11,15)),10)),(((14,4),(13,7)),((3,(2,9)),5))),12,1); tree rep.1730000 = (((5,((4,14),(13,7))),((2,9),3)),((((11,15),6),(10,8)),12),1); tree rep.1740000 = (12,(((((2,9),3),5),(((13,7),4),14)),((8,((15,6),11)),10)),1); tree rep.1750000 = (12,((((4,(5,14)),(7,13)),((9,2),3)),(10,(8,(11,(15,6))))),1); tree rep.1760000 = ((((5,(14,((7,13),4))),(3,(9,2))),((11,(15,6)),(10,8))),12,1); tree rep.1770000 = ((10,(8,(6,(11,15)))),((((14,4),(13,7)),(5,(3,(2,9)))),12),1); tree rep.1780000 = (12,((((((7,13),4),14),5),((2,9),3)),((10,8),(6,(11,15)))),1); tree rep.1790000 = ((((8,10),(11,(15,6))),((3,(2,9)),(((7,13),(4,14)),5))),12,1); tree rep.1800000 = (((10,8),(11,(6,15))),((((((4,(7,13)),9),3),2),(14,5)),12),1); tree rep.1810000 = (((10,(8,(11,(15,6)))),(((((9,2),3),(7,13)),5),(14,4))),12,1); tree rep.1820000 = (12,((4,((3,(9,2)),(5,((7,13),14)))),((10,8),(11,(6,15)))),1); tree rep.1830000 = (12,((((11,(6,15)),8),10),((14,5),((4,(13,7)),(3,(9,2))))),1); tree rep.1840000 = (12,(((4,(14,((13,7),(3,(9,2))))),5),(((11,(15,6)),10),8)),1); tree rep.1850000 = ((((14,(9,2)),(7,13)),5),(4,(3,(12,((10,8),((15,11),6))))),1); tree rep.1860000 = ((((8,10),(6,(15,11))),((14,5),(((7,13),((9,2),3)),4))),12,1); tree rep.1870000 = (12,(((8,10),(11,(6,15))),(((3,(9,2)),5),((4,(7,13)),14))),1); tree rep.1880000 = ((((((14,((13,7),4)),5),(3,(2,9))),(10,8)),(6,(15,11))),12,1); tree rep.1890000 = ((((10,(11,(6,15))),8),(((7,13),4),(((9,2),3),(14,5)))),12,1); tree rep.1900000 = (12,(((14,5),((3,(2,9)),((13,7),4))),((((6,15),11),8),10)),1); tree rep.1910000 = (((((11,15),6),(10,8)),(5,(14,((7,(13,4)),((2,9),3))))),12,1); tree rep.1920000 = (((((9,2),(5,(7,(4,(14,13))))),3),(10,((6,(15,11)),8))),12,1); tree rep.1930000 = ((((9,2),3),(5,(((13,7),4),14))),(12,(((6,(15,11)),10),8)),1); tree rep.1940000 = (12,((((9,2),3),(5,(((13,7),4),14))),(10,((6,(11,15)),8))),1); tree rep.1950000 = ((((((13,7),(5,4)),((2,9),3)),14),(10,(8,((11,15),6)))),12,1); tree rep.1960000 = (12,(((3,(2,9)),((14,4),((13,7),5))),(((11,(6,15)),10),8)),1); tree rep.1970000 = (12,(((((7,13),(14,5)),4),(3,(2,9))),((10,8),((15,6),11))),1); tree rep.1980000 = ((((6,11),15),(8,10)),(((3,(2,9)),(5,(4,(14,(13,7))))),12),1); tree rep.1990000 = (((8,(10,((15,6),11))),((3,(2,9)),((5,14),((13,7),4)))),12,1); tree rep.2000000 = ((((6,(11,15)),(8,10)),(5,(((((2,9),3),4),14),(7,13)))),12,1); tree rep.2010000 = ((((10,8),(11,(15,6))),((((4,(13,7)),5),14),((2,9),3))),12,1); tree rep.2020000 = (12,(5,(((6,(11,15)),(10,8)),((3,(9,2)),(((13,7),14),4)))),1); tree rep.2030000 = (12,(((((15,11),6),8),10),((((4,(13,7)),14),5),(3,(2,9)))),1); tree rep.2040000 = (8,(((15,11),6),(((((3,(2,9)),((4,14),(13,7))),5),12),10)),1); tree rep.2050000 = (((((15,11),6),(((((7,13),4),14),((2,9),3)),5)),(10,8)),12,1); tree rep.2060000 = ((((8,(11,(15,6))),10),((3,(2,9)),((14,((7,13),4)),5))),12,1); tree rep.2070000 = (12,(((5,((3,(2,9)),14)),(4,(13,7))),((8,((11,15),6)),10)),1); tree rep.2080000 = (12,(((15,6),11),((10,8),((4,(13,7)),((9,2),((14,5),3))))),1); tree rep.2090000 = (12,((((((7,13),4),((9,2),3)),5),14),(((15,11),6),(10,8))),1); tree rep.2100000 = (((9,2),(((((8,10),(6,(15,11))),(((13,7),4),14)),5),3)),12,1); tree rep.2110000 = ((((14,(7,(13,4))),(((2,9),3),5)),((10,8),((11,15),6))),12,1); tree rep.2120000 = (12,((((8,10),(6,(11,15))),(((7,13),4),(5,14))),(3,(9,2))),1); tree rep.2130000 = (12,(((5,(3,(((7,13),4),14))),(9,2)),(((15,(6,11)),8),10)),1); tree rep.2140000 = (12,(((10,8),(6,(11,15))),((7,13),(4,((((2,9),3),5),14)))),1); tree rep.2150000 = (12,((((6,15),11),(10,8)),(((14,(4,(7,13))),(3,(2,9))),5)),1); tree rep.2160000 = ((((((4,14),5),(7,13)),((2,9),3)),((8,10),(11,(15,6)))),12,1); tree rep.2170000 = ((((((13,7),4),14),5),(3,(2,9))),(12,((11,(15,6)),(10,8))),1); tree rep.2180000 = ((12,(((3,(9,2)),((4,(13,7)),14)),5)),((10,(6,(15,11))),8),1); tree rep.2190000 = ((((8,((3,(2,9)),(5,((4,(13,7)),14)))),10),(11,(15,6))),12,1); tree rep.2200000 = (12,(((9,2),3),((((8,10),((15,11),6)),(14,((13,4),7))),5)),1); tree rep.2210000 = ((12,((((15,6),11),8),10)),(((2,9),3),(5,(14,(4,(13,7))))),1); tree rep.2220000 = (((5,(12,((2,9),3))),((4,(13,7)),14)),(((15,11),6),(10,8)),1); tree rep.2230000 = (((5,((4,(14,(13,7))),((9,2),3))),((((15,6),11),8),10)),12,1); tree rep.2240000 = (12,((((11,(6,15)),10),8),((5,(3,(9,2))),(((13,7),4),14))),1); tree rep.2250000 = ((((((3,2),9),(14,((13,7),4))),5),12),((8,10),((6,15),11)),1); tree rep.2260000 = ((((8,10),(11,(15,6))),(((3,(9,2)),4),(5,((14,7),13)))),12,1); tree rep.2270000 = (((8,10),(11,(6,15))),(((((14,4),(13,7)),5),(3,(2,9))),12),1); tree rep.2280000 = (((((6,(11,15)),8),10),(((2,9),((14,5),((13,7),4))),3)),12,1); tree rep.2290000 = (12,(((14,(4,(7,13))),((9,2),3)),(((10,8),(11,(6,15))),5)),1); tree rep.2300000 = (12,((((4,(14,(13,7))),(3,(2,9))),5),((11,(15,6)),(10,8))),1); tree rep.2310000 = (12,(((4,((13,7),(5,14))),((2,9),3)),((6,(11,15)),(10,8))),1); tree rep.2320000 = ((((4,(7,13)),(((3,(9,2)),((10,8),(11,(15,6)))),14)),5),12,1); tree rep.2330000 = (12,((4,(13,7)),(((5,((9,2),3)),14),(((6,(11,15)),8),10))),1); tree rep.2340000 = (12,((((3,(9,2)),5),(14,((7,13),4))),((8,10),(15,(6,11)))),1); tree rep.2350000 = (12,(((4,((13,7),14)),(5,((2,9),3))),((10,8),((11,6),15))),1); tree rep.2360000 = (((((6,15),11),(10,8)),(5,(14,((4,(13,7)),((2,9),3))))),12,1); tree rep.2370000 = (12,(((13,7),(5,((14,4),((10,8),((15,11),6))))),(3,(9,2))),1); tree rep.2380000 = (((6,(15,11)),(8,10)),(12,((5,(14,(7,(4,13)))),(3,(2,9)))),1); tree rep.2390000 = ((((10,8),((6,15),11)),(((14,5),((7,13),4)),(3,(2,9)))),12,1); tree rep.2400000 = ((((10,8),((11,15),6)),((5,14),((4,(7,13)),((9,2),3)))),12,1); tree rep.2410000 = (((8,((11,(15,6)),10)),12),(((5,14),((9,2),3)),((7,13),4)),1); tree rep.2420000 = (12,((((13,7),(4,14)),((((15,6),11),(8,10)),5)),(3,(9,2))),1); tree rep.2430000 = (((((5,14),(4,(13,7))),((9,2),3)),(8,(10,((11,15),6)))),12,1); tree rep.2440000 = ((((13,((14,7),4)),(((9,2),3),5)),12),((10,8),(11,(6,15))),1); tree rep.2450000 = ((((((6,15),11),8),10),((3,(9,2)),(((5,14),4),(7,13)))),12,1); tree rep.2460000 = ((((5,(((7,14),4),13)),((9,2),3)),((10,(15,(11,6))),8)),12,1); tree rep.2470000 = ((((5,14),(7,13)),(((9,2),3),4)),((((6,(15,11)),8),10),12),1); tree rep.2480000 = (((14,((3,(9,2)),(5,(4,(7,13))))),(((15,11),6),(8,10))),12,1); tree rep.2490000 = (12,((((8,((15,(11,6)),10)),(((7,13),4),14)),5),((9,2),3)),1); tree rep.2500000 = (12,(((((9,2),3),5),(14,((13,7),4))),((15,(11,6)),(10,8))),1); tree rep.2510000 = ((6,(15,11)),(8,(10,(12,((5,(14,(4,(7,13)))),(3,(2,9)))))),1); tree rep.2520000 = ((((10,((11,15),6)),8),(((2,9),3),(5,(14,(4,(7,13)))))),12,1); tree rep.2530000 = (14,(((4,(12,(3,(9,2)))),((13,7),5)),((8,10),((11,6),15))),1); tree rep.2540000 = ((((8,(11,(6,15))),10),((4,(13,7)),((3,(2,9)),(14,5)))),12,1); tree rep.2550000 = ((((5,14),(((13,7),4),((9,2),3))),(((15,6),11),(10,8))),12,1); tree rep.2560000 = (12,(((11,15),6),(8,(10,((((7,13),5),(14,4)),((9,2),3))))),1); tree rep.2570000 = (((14,(((13,7),4),5)),((9,2),3)),(12,((11,(6,15)),(10,8))),1); tree rep.2580000 = ((((8,10),((6,15),11)),(3,((9,2),(((14,4),(7,13)),5)))),12,1); tree rep.2590000 = (12,(((10,(11,(15,6))),8),((14,((3,(9,2)),5)),((13,7),4))),1); tree rep.2600000 = ((((10,8),(6,(15,11))),(5,(((13,7),(14,4)),(3,(9,2))))),12,1); tree rep.2610000 = (((8,(((14,(4,(7,13))),(5,(3,(9,2)))),10)),(6,(11,15))),12,1); tree rep.2620000 = (12,(((10,8),(11,(6,15))),((5,(7,13)),(((2,9),3),(4,14)))),1); tree rep.2630000 = ((((2,9),3),((5,14),(4,(13,7)))),((10,(8,((11,15),6))),12),1); tree rep.2640000 = (((10,8),((11,15),6)),(((((7,13),14),4),(((9,2),3),5)),12),1); tree rep.2650000 = (12,(((5,((13,7),4)),(((2,9),3),14)),((8,(11,(6,15))),10)),1); tree rep.2660000 = (12,(((14,((7,13),4)),(5,(3,(2,9)))),(8,((15,(6,11)),10))),1); tree rep.2670000 = ((((8,10),((6,15),11)),(((4,(7,13)),((3,(2,9)),5)),14)),12,1); tree rep.2680000 = (((8,10),((15,6),11)),((((((2,9),3),5),14),(4,(7,13))),12),1); tree rep.2690000 = ((((((14,4),(7,13)),5),(3,(9,2))),(8,((6,(15,11)),10))),12,1); tree rep.2700000 = (((5,(((7,13),4),14)),(3,(9,2))),(12,(((11,(15,6)),10),8)),1); tree rep.2710000 = ((((6,(11,15)),8),10),(((14,5),(((9,2),3),((13,7),4))),12),1); tree rep.2720000 = (((((10,8),(11,(15,6))),((2,9),3)),(4,(5,((7,13),14)))),12,1); tree rep.2730000 = (((10,((15,6),11)),8),(12,(5,((((4,14),7),13),(3,(2,9))))),1); tree rep.2740000 = (12,((((11,15),6),(10,8)),((5,4),((13,7),(14,(3,(2,9)))))),1); tree rep.2750000 = ((((8,10),((15,11),6)),12),(((2,9),3),(((7,13),4),(5,14))),1); tree rep.2760000 = (((((5,14),(3,(2,9))),((13,7),4)),((8,(11,(15,6))),10)),12,1); tree rep.2770000 = (12,((4,((5,(14,((9,2),3))),(7,13))),((8,(11,(6,15))),10)),1); tree rep.2780000 = (12,((3,(9,2)),((7,(4,13)),(((8,((15,6),11)),10),(5,14)))),1); tree rep.2790000 = (12,((10,((11,(15,6)),8)),((4,((14,5),(7,13))),(3,(9,2)))),1); tree rep.2800000 = (((((11,(15,6)),8),10),((4,((14,5),(13,7))),(3,(2,9)))),12,1); tree rep.2810000 = (((12,((9,2),3)),(5,((11,(15,6)),(10,8)))),((4,14),(7,13)),1); tree rep.2820000 = ((((6,(11,15)),(10,8)),((5,((2,9),3)),((13,7),(4,14)))),12,1); tree rep.2830000 = ((((10,8),(11,(15,6))),((4,((13,7),((9,2),3))),(14,5))),12,1); tree rep.2840000 = (((5,((((2,9),3),14),(4,(13,7)))),(10,(8,(6,(15,11))))),12,1); tree rep.2850000 = ((((((13,7),(3,(2,9))),(14,5)),4),(((11,15),6),(10,8))),12,1); tree rep.2860000 = (12,((5,(((14,(13,7)),4),(3,(2,9)))),((6,(15,11)),(10,8))),1); tree rep.2870000 = (((5,((((13,7),4),((2,9),3)),14)),((10,((15,6),11)),8)),12,1); tree rep.2880000 = ((((10,8),((11,15),6)),((14,(((9,2),3),(4,5))),(7,13))),12,1); tree rep.2890000 = (12,((((3,(2,9)),(14,((13,7),4))),5),((11,(6,15)),(8,10))),1); tree rep.2900000 = ((((((7,13),4),(5,14)),(3,(2,9))),((((6,15),11),10),8)),12,1); tree rep.2910000 = (12,(5,(((7,13),4),((14,((9,2),3)),((11,(6,15)),(10,8))))),1); tree rep.2920000 = (12,(((((3,(9,2)),(13,7)),4),(5,14)),((8,(11,(6,15))),10)),1); tree rep.2930000 = ((((10,8),(11,(6,15))),((((4,(13,7)),14),5),((2,9),3))),12,1); tree rep.2940000 = (((((2,3),9),(((5,14),(13,7)),4)),(((6,(11,15)),10),8)),12,1); tree rep.2950000 = ((((5,((7,13),(((2,9),3),4))),14),(((11,(6,15)),10),8)),12,1); tree rep.2960000 = ((((10,((11,15),6)),8),(((9,2),3),(((4,(13,7)),14),5))),12,1); tree rep.2970000 = (12,(((3,(9,2)),((5,14),(4,(13,7)))),(8,(10,((15,11),6)))),1); tree rep.2980000 = (12,((((11,(6,15)),10),8),(5,(14,((3,(2,9)),((7,13),4))))),1); tree rep.2990000 = (((5,14),((((2,9),3),4),(7,13))),(((11,(6,15)),(8,10)),12),1); tree rep.3000000 = ((((14,5),(3,(9,2))),(((10,8),(6,(15,11))),(4,(7,13)))),12,1); tree rep.3010000 = (12,((((3,(2,9)),5),((13,7),(14,4))),((8,10),((15,11),6))),1); tree rep.3020000 = ((((6,11),15),(10,8)),(((3,(2,9)),12),(5,((4,(13,7)),14))),1); tree rep.3030000 = (12,(((8,10),(6,(11,15))),((5,((2,9),3)),(((7,13),4),14))),1); tree rep.3040000 = (((((4,(7,13)),14),(5,(3,(9,2)))),((10,8),(15,(6,11)))),12,1); tree rep.3050000 = ((((13,7),4),(5,((((11,15),6),(8,10)),(((2,9),3),14)))),12,1); tree rep.3060000 = (12,(((10,((11,15),6)),8),(4,(((7,13),14),(5,(3,(2,9)))))),1); tree rep.3070000 = ((((6,(15,11)),(8,10)),(((5,(14,4)),(7,13)),((2,9),3))),12,1); tree rep.3080000 = (12,((14,(((5,7),(13,4)),(3,(9,2)))),((10,(6,(15,11))),8)),1); tree rep.3090000 = ((((4,(7,((14,(3,(9,2))),13))),5),(10,((6,(11,15)),8))),12,1); tree rep.3100000 = ((((((7,13),4),(5,14)),((2,9),3)),((((15,6),11),10),8)),12,1); tree rep.3110000 = (((((7,13),((((15,11),6),(10,8)),4)),14),(((9,2),3),5)),12,1); tree rep.3120000 = (((8,(10,(15,(11,6)))),((((2,9),3),5),(4,(14,(7,13))))),12,1); tree rep.3130000 = (((((((13,7),14),4),(3,(9,2))),5),(((11,(6,15)),10),8)),12,1); tree rep.3140000 = (((((9,2),3),((7,13),4)),((((15,11),6),(8,10)),12)),(5,14),1); tree rep.3150000 = ((((14,(7,13)),4),(3,(9,2))),((8,(10,(11,(15,6)))),(5,12)),1); tree rep.3160000 = ((14,(5,(((3,(9,2)),(7,(4,13))),((10,8),((11,15),6))))),12,1); tree rep.3170000 = (12,(((8,10),(6,(11,15))),((5,(14,((13,7),4))),((9,2),3))),1); tree rep.3180000 = ((((9,2),3),(((4,14),(7,13)),5)),(((11,(6,15)),(10,8)),12),1); tree rep.3190000 = (12,((((9,2),3),((4,14),((13,7),5))),((6,(11,15)),(10,8))),1); tree rep.3200000 = ((((3,(9,2)),(((6,15),11),(8,10))),((4,(7,13)),(14,5))),12,1); tree rep.3210000 = (12,((((3,(9,2)),(((7,13),14),4)),5),((8,10),(11,(6,15)))),1); tree rep.3220000 = (((10,8),((11,15),6)),((((3,(9,2)),((4,(13,7)),14)),5),12),1); tree rep.3230000 = (((((15,6),11),(10,8)),(((2,9),(((13,7),4),14)),(5,3))),12,1); tree rep.3240000 = (((5,(8,(10,((6,15),11)))),((3,(9,2)),(14,((13,7),4)))),12,1); tree rep.3250000 = ((12,(((14,((13,7),4)),5),(3,(9,2)))),((10,8),(11,(15,6))),1); tree rep.3260000 = ((((((((9,2),3),5),(4,(13,7))),14),(11,(15,6))),(8,10)),12,1); tree rep.3270000 = (12,((((4,(13,7)),((9,2),3)),(5,14)),((11,(6,15)),(8,10))),1); tree rep.3280000 = (((8,10),((11,15),6)),(((3,(9,2)),((5,14),((13,7),4))),12),1); tree rep.3290000 = ((((14,((13,7),4)),5),((2,9),3)),(12,((11,(6,15)),(10,8))),1); tree rep.3300000 = (((((9,2),3),(5,((4,(13,7)),14))),((6,(11,15)),(8,10))),12,1); tree rep.3310000 = (12,((10,8),(((((4,5),14),(7,13)),(3,(9,2))),((15,11),6))),1); tree rep.3320000 = (((14,((13,7),4)),((((10,8),(6,(11,15))),(3,(9,2))),5)),12,1); tree rep.3330000 = (12,(((((5,((((13,7),4),14),(9,2))),3),10),8),((15,11),6)),1); tree rep.3340000 = ((((14,5),((7,13),4)),(3,((9,2),12))),(((6,15),11),(10,8)),1); tree rep.3350000 = (12,((((9,2),3),((5,14),((13,7),4))),(((6,(15,11)),10),8)),1); tree rep.3360000 = (12,((((((6,15),11),((7,13),(4,14))),(3,(2,9))),5),(10,8)),1); tree rep.3370000 = (((3,(9,2)),(14,(((13,7),5),(4,(((15,11),6),(8,10)))))),12,1); tree rep.3380000 = ((((14,5),((3,(9,2)),((7,13),4))),(10,(8,((6,15),11)))),12,1); tree rep.3390000 = (12,(((10,((15,11),6)),8),((3,((9,2),5)),(14,(4,(13,7))))),1); tree rep.3400000 = (((((4,(13,7)),5),14),((10,(((11,15),6),8)),((2,9),3))),12,1); tree rep.3410000 = (((5,(((2,9),3),(((13,7),4),14))),((11,(6,15)),(8,10))),12,1); tree rep.3420000 = (12,(((14,(5,((13,7),4))),((9,2),3)),(((11,(15,6)),8),10)),1); tree rep.3430000 = (12,((((6,(15,11)),8),10),(((3,(9,2)),5),((4,14),(13,7)))),1); tree rep.3440000 = ((((10,8),(11,(15,6))),(((7,13),4),(14,((3,(9,2)),5)))),12,1); tree rep.3450000 = (12,(((5,(3,(2,9))),(((4,13),7),14)),((8,10),((15,11),6))),1); tree rep.3460000 = ((((6,(11,15)),(8,10)),(((((13,4),7),14),(3,(2,9))),5)),12,1); tree rep.3470000 = ((((10,(6,(11,15))),8),((((13,7),(14,4)),((2,9),3)),5)),12,1); tree rep.3480000 = (((3,(2,9)),12),(((4,((13,7),14)),5),((10,(6,(11,15))),8)),1); tree rep.3490000 = (12,((((9,2),3),(5,(4,(14,(7,13))))),(10,(8,((11,15),6)))),1); tree rep.3500000 = (12,(((8,10),((6,15),11)),((3,(9,2)),((5,(4,(7,13))),14))),1); tree rep.3510000 = (12,((5,(3,(2,9))),((4,(14,(7,13))),(8,(10,((11,15),6))))),1); tree rep.3520000 = (((5,((3,(9,2)),(14,((7,4),13)))),(10,(((11,15),6),8))),12,1); tree rep.3530000 = ((((8,10),((15,11),6)),12),((5,(4,((7,13),14))),(3,(9,2))),1); tree rep.3540000 = (12,(((((2,9),3),5),(14,((7,13),4))),(10,(8,(11,(15,6))))),1); tree rep.3550000 = (((((5,14),(4,(13,7))),((9,2),3)),((8,((6,15),11)),10)),12,1); tree rep.3560000 = ((((10,(11,(15,6))),8),(4,(((13,7),(3,(2,9))),(14,5)))),12,1); tree rep.3570000 = (((3,(2,9)),(5,(14,(13,(4,7))))),((((15,(6,11)),8),10),12),1); tree rep.3580000 = (((((9,2),3),(((4,(7,13)),((8,((15,11),6)),10)),5)),14),12,1); tree rep.3590000 = (12,(((5,((4,(13,7)),14)),((2,9),3)),(10,(((6,15),11),8))),1); tree rep.3600000 = (12,((((14,5),(4,(13,7))),((2,9),3)),((((6,15),11),8),10)),1); tree rep.3610000 = ((((((11,15),6),10),8),((5,(3,(2,9))),((4,(13,7)),14))),12,1); tree rep.3620000 = (12,(((10,8),(6,(11,15))),(((7,13),14),(((9,2),3),(5,4)))),1); tree rep.3630000 = (12,(((((13,7),(4,14)),5),(8,(10,((6,15),11)))),(3,(2,9))),1); tree rep.3640000 = ((((6,(15,11)),(10,8)),(4,(((13,7),(5,14)),(3,(2,9))))),12,1); tree rep.3650000 = (12,((14,(((10,8),(11,(15,6))),((7,13),5))),((3,(2,9)),4)),1); tree rep.3660000 = ((((((6,15),11),10),8),((5,(((13,7),4),14)),(3,(9,2)))),12,1); tree rep.3670000 = ((((15,6),11),(10,(8,(5,((((7,13),14),4),(3,(9,2))))))),12,1); tree rep.3680000 = ((8,10),((5,((((9,2),3),12),(14,((13,7),4)))),((15,6),11)),1); tree rep.3690000 = (((5,((((13,7),4),(3,(9,2))),14)),((10,8),((6,15),11))),12,1); tree rep.3700000 = (((((3,(9,2)),((5,14),(7,13))),4),((10,8),(6,(15,11)))),12,1); tree rep.3710000 = (12,((((11,(6,15)),8),10),(5,((((7,13),4),14),((9,2),3)))),1); tree rep.3720000 = ((((13,4),((7,((2,9),3)),(14,5))),((10,8),(11,(15,6)))),12,1); tree rep.3730000 = (12,((((15,11),6),(10,8)),((14,(5,(13,(7,4)))),(3,(2,9)))),1); tree rep.3740000 = (((5,((14,((13,7),4)),(3,(9,2)))),((10,8),(11,(6,15)))),12,1); tree rep.3750000 = (12,((((13,7),(5,((9,2),3))),(14,4)),((11,(6,15)),(10,8))),1); tree rep.3760000 = (((((4,(7,13)),14),((3,(9,2)),5)),((8,10),(11,(6,15)))),12,1); tree rep.3770000 = (13,(7,((3,(2,9)),(14,(((12,((10,8),((15,6),11))),4),5)))),1); tree rep.3780000 = (((((2,9),3),(13,(4,7))),(14,5)),(12,(((11,(15,6)),10),8)),1); tree rep.3790000 = (12,(((((4,(13,7)),14),(5,(3,(2,9)))),(11,(15,6))),(10,8)),1); tree rep.3800000 = ((((3,(2,9)),(((4,13),7),(5,14))),12),(10,((6,(11,15)),8)),1); tree rep.3810000 = (12,((8,(10,(6,(11,15)))),(((2,9),3),((4,((13,7),14)),5))),1); tree rep.3820000 = (((5,(((14,(13,7)),4),((9,2),3))),((8,10),(11,(15,6)))),12,1); tree rep.3830000 = ((((10,8),((6,15),11)),((4,(13,7)),(((2,9),3),(14,5)))),12,1); tree rep.3840000 = (12,(((((9,2),(14,5)),(((11,(15,6)),10),8)),(4,(7,13))),3),1); tree rep.3850000 = (12,(((14,5),(3,((9,2),(4,(7,13))))),(((15,11),6),(10,8))),1); tree rep.3860000 = (12,(((10,8),((15,11),6)),(((14,(4,(7,13))),5),((2,9),3))),1); tree rep.3870000 = (12,(((14,((13,7),4)),(5,((2,9),3))),(((11,(15,6)),8),10)),1); tree rep.3880000 = ((((((8,10),(11,(15,6))),5),(14,(4,(13,7)))),((2,9),3)),12,1); tree rep.3890000 = (((((11,(15,6)),(8,10)),((9,2),3)),((14,4),((13,7),5))),12,1); tree rep.3900000 = (((((6,11),15),(10,8)),((5,((4,(13,7)),14)),(3,(9,2)))),12,1); tree rep.3910000 = (((5,(((8,10),(11,(15,6))),(((2,9),3),((7,4),13)))),14),12,1); tree rep.3920000 = (12,(((((15,6),11),10),8),((((7,13),4),(5,14)),((9,2),3))),1); tree rep.3930000 = (12,((9,2),((((10,8),(11,(15,6))),(3,5)),((14,(13,7)),4))),1); tree rep.3940000 = (12,(((3,((2,9),5)),(4,((7,14),13))),(((11,(15,6)),8),10)),1); tree rep.3950000 = (12,(((10,(11,(15,6))),8),(((13,(7,(14,4))),(3,(2,9))),5)),1); tree rep.3960000 = (12,((((((13,7),4),(5,14)),3),(9,2)),((8,10),((11,15),6))),1); tree rep.3970000 = ((((14,(4,(13,7))),((3,(9,2)),5)),((((6,15),11),8),10)),12,1); tree rep.3980000 = (((((14,5),((7,13),4)),(3,(2,9))),((10,8),((11,15),6))),12,1); tree rep.3990000 = (((5,(14,((13,7),4))),(((2,9),3),12)),(10,(8,(11,(6,15)))),1); tree rep.4000000 = (12,((4,(((7,13),((2,9),3)),(14,5))),(((11,(6,15)),10),8)),1); tree rep.4010000 = ((12,(14,(5,((3,(2,9)),((7,13),4))))),(((15,11),6),(8,10)),1); tree rep.4020000 = (12,(((14,((5,(3,(9,2))),(7,13))),4),(((6,(15,11)),8),10)),1); tree rep.4030000 = (12,((((10,8),(6,(15,11))),5),(((9,2),3),(14,(4,(7,13))))),1); tree rep.4040000 = (((((14,5),((9,2),3)),((13,7),4)),12),((10,8),(6,(11,15))),1); tree rep.4050000 = (12,(((14,(((11,15),6),(10,8))),(7,13)),((5,(3,(2,9))),4)),1); tree rep.4060000 = ((((4,(((14,13),7),5)),(3,(9,2))),(((11,(15,6)),8),10)),12,1); tree rep.4070000 = (12,(((5,((7,(4,13)),14)),((9,2),3)),((6,(11,15)),(8,10))),1); tree rep.4080000 = (12,((((((15,11),6),(8,10)),((3,(9,2)),((13,7),4))),5),14),1); tree rep.4090000 = ((((((13,7),5),4),((3,14),(9,2))),(8,(10,(11,(6,15))))),12,1); tree rep.4100000 = (12,(((((4,((3,(9,2)),5)),((7,13),14)),10),8),((11,15),6)),1); tree rep.4110000 = (((((15,11),6),10),8),(((5,(14,(4,(7,13)))),(3,(9,2))),12),1); tree rep.4120000 = (12,((((11,(6,15)),10),8),((((9,2),3),(14,((7,13),4))),5)),1); tree rep.4130000 = (12,((((2,9),3),(8,(((6,15),11),10))),(5,((4,14),(13,7)))),1); tree rep.4140000 = ((((13,7),4),((12,(3,(2,9))),(5,14))),(10,((6,(15,11)),8)),1); tree rep.4150000 = ((((14,((13,7),4)),((9,2),3)),5),(8,((6,(15,11)),(10,12))),1); tree rep.4160000 = (((13,7),4),(((14,5),((2,9),(12,3))),((11,(15,6)),(10,8))),1); tree rep.4170000 = ((5,((3,(2,9)),((14,(13,7)),4))),(12,((6,(15,11)),(10,8))),1); tree rep.4180000 = ((((2,9),3),(((4,(13,7)),14),((10,(8,((15,11),6))),5))),12,1); tree rep.4190000 = ((((14,5),((7,13),4)),(3,(9,2))),((((15,6),11),(8,10)),12),1); tree rep.4200000 = (12,((((8,10),(6,(11,15))),(3,(2,9))),((((13,7),14),4),5)),1); tree rep.4210000 = (12,((((10,8),(6,(15,11))),(14,(4,((7,13),(3,(2,9)))))),5),1); tree rep.4220000 = (((8,(((15,11),6),10)),((5,((7,13),4)),(14,((9,2),3)))),12,1); tree rep.4230000 = (12,(((5,((2,9),3)),(14,((13,7),4))),((8,(11,(15,6))),10)),1); tree rep.4240000 = (((((4,(7,13)),((9,2),3)),(14,5)),((10,8),(11,(6,15)))),12,1); tree rep.4250000 = (12,((((3,(9,2)),5),(14,(4,(7,13)))),(((15,6),11),(8,10))),1); tree rep.4260000 = (((8,(6,(11,15))),10),(12,(4,((7,13),((5,14),(3,(2,9)))))),1); tree rep.4270000 = (12,((((3,(9,2)),5),((13,7),(14,4))),(((15,6),11),(10,8))),1); tree rep.4280000 = ((((((15,6),11),10),8),(((7,13),((2,9),3)),(4,(14,5)))),12,1); tree rep.4290000 = ((((((2,9),3),14),(5,((13,7),4))),(8,((6,(15,11)),10))),12,1); tree rep.4300000 = (12,(((8,10),(11,(6,15))),(((((2,9),(3,(13,7))),5),14),4)),1); tree rep.4310000 = (12,(((5,((4,(7,13)),14)),(3,(9,2))),((10,(11,(15,6))),8)),1); tree rep.4320000 = (((8,(10,(6,(11,15)))),((((9,2),3),(4,(5,(7,13)))),14)),12,1); tree rep.4330000 = ((((8,10),((6,15),11)),(((5,(3,(9,2))),((4,7),13)),14)),12,1); tree rep.4340000 = (12,(((3,(2,9)),(((13,7),5),(4,14))),(8,(10,(11,(15,6))))),1); tree rep.4350000 = ((((5,(3,(2,9))),(14,(4,(13,7)))),12),((8,((6,15),11)),10),1); tree rep.4360000 = ((((10,8),((15,6),11)),((((14,4),(13,7)),5),(3,(2,9)))),12,1); tree rep.4370000 = (12,(((5,(3,(2,9))),(4,((13,7),14))),(((15,6),11),(8,10))),1); tree rep.4380000 = (((((13,(7,4)),14),(((2,9),3),5)),12),((((15,6),11),10),8),1); tree rep.4390000 = (12,((((15,11),6),(10,8)),((((9,2),3),((4,14),(7,13))),5)),1); tree rep.4400000 = (12,(((4,(14,5)),(((9,2),3),(7,13))),(10,(8,(6,(15,11))))),1); tree rep.4410000 = ((((((5,14),(13,7)),((9,2),3)),4),(8,(10,(11,(15,6))))),12,1); tree rep.4420000 = (12,(((8,10),(6,(11,15))),((4,((7,13),14)),(5,(3,(2,9))))),1); tree rep.4430000 = (((((15,6),11),(10,8)),(((5,((9,2),3)),(4,(7,13))),14)),12,1); tree rep.4440000 = (((((2,9),3),(5,(14,(13,(7,4))))),(10,(8,(11,(15,6))))),12,1); tree rep.4450000 = (((((6,(11,15)),10),8),(((3,(2,9)),((5,4),14)),(13,7))),12,1); tree rep.4460000 = ((12,((8,10),((11,6),15))),((5,(14,(4,(7,13)))),((9,2),3)),1); tree rep.4470000 = (12,((((11,15),6),(10,8)),(((3,(2,9)),((4,14),(7,13))),5)),1); tree rep.4480000 = ((((((10,((6,15),11)),8),((13,7),4)),5),((3,(9,2)),14)),12,1); tree rep.4490000 = (((6,(11,15)),(8,10)),(12,((4,(13,7)),((14,5),((9,2),3)))),1); tree rep.4500000 = ((((((15,11),6),10),8),(((4,(7,13)),14),(((2,9),3),5))),12,1); tree rep.4510000 = (((3,(2,9)),((5,14),((7,13),4))),(12,((8,((11,15),6)),10)),1); tree rep.4520000 = (12,((10,((11,(6,15)),8)),(((14,(13,7)),4),((3,(9,2)),5))),1); tree rep.4530000 = (12,(((8,((6,15),11)),10),((4,(5,(14,(3,(2,9))))),(7,13))),1); tree rep.4540000 = ((((8,10),((15,6),11)),((14,((7,13),4)),(5,(3,(2,9))))),12,1); tree rep.4550000 = (12,((((14,(4,(13,7))),(3,(9,2))),5),((((11,6),15),10),8)),1); tree rep.4560000 = (12,((((6,15),11),(10,8)),((((2,9),3),((7,13),4)),(5,14))),1); tree rep.4570000 = (12,((((7,13),((2,9),3)),((4,14),5)),(((15,11),6),(10,8))),1); tree rep.4580000 = ((12,(((4,((9,2),3)),5),(14,(7,13)))),((8,10),((11,15),6)),1); tree rep.4590000 = (((5,((14,(4,(7,13))),(3,(9,2)))),12),((10,8),(11,(6,15))),1); tree rep.4600000 = (12,((8,10),(((14,5),(4,(13,7))),((2,9),((11,(6,15)),3)))),1); tree rep.4610000 = (12,((((4,14),(13,7)),(5,((9,2),3))),((8,10),(6,(11,15)))),1); tree rep.4620000 = (((((4,(7,13)),(14,5)),((9,2),3)),(((11,(15,6)),10),8)),12,1); tree rep.4630000 = (12,((((11,15),6),(10,8)),((((4,(13,7)),14),5),((9,2),3))),1); tree rep.4640000 = (12,((((3,(9,2)),5),((14,4),(7,13))),(((15,11),6),(10,8))),1); tree rep.4650000 = (12,(((2,9),3),((13,7),((14,4),(((10,8),(11,(15,6))),5)))),1); tree rep.4660000 = ((((14,(4,(7,13))),((5,(9,2)),3)),12),((10,8),((15,6),11)),1); tree rep.4670000 = (12,((((3,9),2),(5,(((7,13),4),14))),((10,8),((6,15),11))),1); tree rep.4680000 = ((7,(4,13)),(14,((((10,(11,(6,15))),8),12),(5,((2,9),3)))),1); tree rep.4690000 = (12,(((15,11),6),((((3,(9,2)),(5,((4,(13,7)),14))),10),8)),1); tree rep.4700000 = (12,((10,(((11,15),6),8)),(5,((3,(2,9)),((4,(13,7)),14)))),1); tree rep.4710000 = (12,((4,(7,13)),(((((10,(11,(6,15))),8),14),5),((9,2),3))),1); tree rep.4720000 = (((((3,(2,9)),5),(14,(4,(13,7)))),(8,((15,(11,6)),10))),12,1); tree rep.4730000 = (12,(((((3,(9,2)),(14,(7,13))),5),(10,(8,(6,(15,11))))),4),1); tree rep.4740000 = ((((4,((7,13),14)),5),(((9,2),3),12)),(8,((11,(6,15)),10)),1); tree rep.4750000 = (((((15,11),6),(10,8)),((5,((((9,2),3),14),(13,7))),4)),12,1); tree rep.4760000 = ((((8,(6,(15,11))),10),((14,(5,(3,(9,2)))),(4,(13,7)))),12,1); tree rep.4770000 = (12,((8,((6,(15,11)),10)),((((13,7),14),4),(5,(3,(2,9))))),1); tree rep.4780000 = ((5,(((4,(13,7)),((((15,6),11),(8,10)),12)),14)),(3,(9,2)),1); tree rep.4790000 = (((((4,14),(13,7)),(5,(3,(2,9)))),((8,10),(11,(6,15)))),12,1); tree rep.4800000 = (12,((5,(((((6,(11,15)),10),8),(3,(9,2))),(4,(13,7)))),14),1); tree rep.4810000 = (((10,((6,(11,15)),8)),(((5,4),(((2,9),(7,13)),3)),14)),12,1); tree rep.4820000 = ((((6,11),15),(10,8)),((((4,(14,(13,7))),5),((2,9),3)),12),1); tree rep.4830000 = ((((14,((13,7),((3,(9,2)),5))),4),12),(10,((6,(11,15)),8)),1); tree rep.4840000 = ((((((4,(7,13)),14),(3,(9,2))),5),12),(10,(((6,15),11),8)),1); tree rep.4850000 = (12,(((6,(11,15)),(10,8)),(((2,9),3),(5,((4,(13,7)),14)))),1); tree rep.4860000 = (5,((((9,2),3),(14,(4,(13,7)))),(12,((((6,15),11),10),8))),1); tree rep.4870000 = ((((10,8),(11,(6,15))),(5,(((2,9),3),(4,((7,13),14))))),12,1); tree rep.4880000 = (12,((((3,(2,9)),(((7,13),4),5)),14),((10,(11,(6,15))),8)),1); tree rep.4890000 = (12,(((8,10),((11,15),6)),((4,((13,14),7)),(((2,9),3),5))),1); tree rep.4900000 = ((((5,((4,(13,7)),14)),((9,2),3)),((8,10),((15,11),6))),12,1); tree rep.4910000 = (12,(((2,9),(3,(((4,14),5),(13,7)))),((10,((15,6),11)),8)),1); tree rep.4920000 = (12,(((10,((11,15),6)),8),((((9,2),(13,7)),((5,14),4)),3)),1); tree rep.4930000 = (12,(((((15,11),6),10),8),(((4,((9,2),3)),((7,13),14)),5)),1); tree rep.4940000 = (((((4,5),((9,2),3)),((13,7),14)),((8,10),(6,(15,11)))),12,1); tree rep.4950000 = ((((3,((9,2),(14,5))),(4,(7,13))),(((11,15),6),(10,8))),12,1); tree rep.4960000 = ((8,(10,((6,15),11))),(12,(4,((5,(14,(7,13))),(3,(9,2))))),1); tree rep.4970000 = (12,(5,((((4,(13,7)),14),((9,2),3)),(((15,6),11),(10,8)))),1); tree rep.4980000 = (12,((((6,(15,11)),8),10),((((13,7),(4,14)),5),((9,2),3))),1); tree rep.4990000 = ((((4,((9,2),3)),((7,13),(5,14))),(8,((15,(11,6)),10))),12,1); tree rep.5000000 = (12,(((10,8),((11,6),15)),(((7,13),4),(((9,2),3),(14,5)))),1); tree rep.5010000 = ((((3,(9,2)),(4,((7,13),(5,14)))),((10,8),(11,(15,6)))),12,1); tree rep.5020000 = (12,(((5,((3,(2,9)),((7,13),4))),14),((8,((6,15),11)),10)),1); tree rep.5030000 = (((((4,(7,13)),(5,14)),((2,9),3)),(8,((11,(6,15)),10))),12,1); tree rep.5040000 = (((8,10),(11,(6,15))),(12,((((7,13),(14,4)),(3,(9,2))),5)),1); tree rep.5050000 = (12,(((11,(15,6)),(10,8)),((7,13),(4,((14,5),(3,(9,2)))))),1); tree rep.5060000 = (12,((((5,14),((4,(13,7)),(2,9))),3),(((11,(15,6)),8),10)),1); tree rep.5070000 = (((5,((7,13),((14,4),((9,2),3)))),(10,(8,(6,(15,11))))),12,1); tree rep.5080000 = (12,(((14,(((7,13),5),4)),((2,9),3)),((10,8),((15,11),6))),1); tree rep.5090000 = (12,(((8,(6,(15,11))),10),((3,(2,9)),((13,((7,14),4)),5))),1); tree rep.5100000 = (((8,(((15,11),6),10)),(5,(((2,9),3),(14,(4,(7,13)))))),12,1); tree rep.5110000 = ((((9,3),2),((((7,13),4),14),(((8,10),((6,11),15)),5))),12,1); tree rep.5120000 = (12,(((((8,10),((15,6),11)),((2,9),3)),(4,(7,13))),(14,5)),1); tree rep.5130000 = (12,(((((8,10),((6,15),11)),5),14),(((13,7),4),((2,9),3))),1); tree rep.5140000 = ((9,2),((12,((14,((4,(7,13)),(8,(10,(11,(6,15)))))),5)),3),1); tree rep.5150000 = ((((6,(15,11)),(10,8)),((3,(9,2)),(5,(14,((7,4),13))))),12,1); tree rep.5160000 = ((((5,(3,(2,9))),(((13,7),4),14)),(((11,(15,6)),8),10)),12,1); tree rep.5170000 = (((5,((3,(9,2)),(((15,6),11),(10,8)))),(((7,13),14),4)),12,1); tree rep.5180000 = (5,((((8,((15,6),11)),10),12),((3,(2,9)),(14,((7,13),4)))),1); tree rep.5190000 = ((((11,(6,15)),(8,10)),((3,(9,2)),(5,((4,14),(13,7))))),12,1); tree rep.5200000 = ((((((15,6),11),10),8),((3,((13,(7,4)),(5,14))),(2,9))),12,1); tree rep.5210000 = (((((7,13),((14,5),(3,(9,2)))),4),(8,((11,(15,6)),10))),12,1); tree rep.5220000 = (12,(((((15,6),11),8),10),((((9,2),3),14),(((13,7),4),5))),1); tree rep.5230000 = (12,((((6,(11,15)),8),10),((9,2),((3,5),((7,13),(4,14))))),1); tree rep.5240000 = ((((4,(7,13)),(((9,2),3),5)),14),((6,(11,15)),(12,(10,8))),1); tree rep.5250000 = (12,(((8,10),((6,15),11)),((14,((13,7),(5,4))),(9,(3,2)))),1); tree rep.5260000 = (12,(((((7,13),4),14),((3,(2,9)),5)),((15,(11,6)),(8,10))),1); tree rep.5270000 = ((12,(((14,4),(13,7)),(5,(3,(2,9))))),((10,8),(6,(15,11))),1); tree rep.5280000 = ((((10,((15,6),11)),8),(((5,(14,4)),(13,7)),((9,2),3))),12,1); tree rep.5290000 = ((12,((((2,9),3),5),(14,((13,4),7)))),((10,(11,(6,15))),8),1); tree rep.5300000 = (((((11,(15,6)),8),10),(5,((4,((2,9),3)),((13,7),14)))),12,1); tree rep.5310000 = (((((15,6),11),(8,10)),(5,((((3,(9,2)),14),4),(13,7)))),12,1); tree rep.5320000 = ((((7,13),(14,((5,4),((10,8),((15,11),6))))),(3,(2,9))),12,1); tree rep.5330000 = (((10,(8,(11,(15,6)))),(((7,13),(9,2)),(3,(14,(4,5))))),12,1); tree rep.5340000 = (12,((10,(8,((6,15),11))),(5,((4,(13,7)),(((9,2),3),14)))),1); tree rep.5350000 = (12,((((14,(4,(13,7))),(3,(2,9))),5),(((11,15),6),(10,8))),1); tree rep.5360000 = ((((((((15,11),6),(10,8)),((7,13),4)),(3,(9,2))),14),5),12,1); tree rep.5370000 = (4,(((5,(7,13)),((10,(((11,15),6),8)),(12,(3,(2,9))))),14),1); tree rep.5380000 = (((5,(((9,2),3),(((7,13),4),14))),((6,(15,11)),(10,8))),12,1); tree rep.5390000 = (12,((((4,(7,13)),14),((3,(2,9)),5)),(10,((11,(6,15)),8))),1); tree rep.5400000 = ((((((14,(7,13)),4),(3,(9,2))),5),((10,(6,(11,15))),8)),12,1); tree rep.5410000 = (12,(((10,8),((15,6),11)),(5,(((4,(7,13)),14),((2,9),3)))),1); tree rep.5420000 = ((((3,(2,9)),(14,(4,((7,13),5)))),((8,10),((11,15),6))),12,1); tree rep.5430000 = ((((6,(11,15)),(((((13,7),4),14),5),(3,(9,2)))),(8,10)),12,1); tree rep.5440000 = ((((10,(11,(15,6))),8),((((9,2),(4,(13,7))),3),(14,5))),12,1); tree rep.5450000 = (((5,4),(((13,7),(((10,8),(11,(6,15))),(3,(9,2)))),14)),12,1); tree rep.5460000 = ((8,(((6,15),11),10)),((((14,4),(7,13)),5),(12,(3,(2,9)))),1); tree rep.5470000 = (12,((((15,11),6),(10,8)),((14,(4,(5,(7,13)))),((9,2),3))),1); tree rep.5480000 = (((6,(15,11)),(10,8)),(12,((5,(14,4)),(((2,9),3),(7,13)))),1); tree rep.5490000 = (((10,(8,((11,15),6))),(((4,14),(13,7)),(((2,9),5),3))),12,1); tree rep.5500000 = ((((((7,13),(4,14)),5),((2,9),3)),((8,10),(15,(11,6)))),12,1); tree rep.5510000 = (12,((((((3,(2,9)),14),(7,13)),4),5),((10,8),(6,(11,15)))),1); tree rep.5520000 = (12,((((6,(15,11)),10),8),((14,5),((3,(2,9)),((13,4),7)))),1); tree rep.5530000 = (((((13,7),4),((5,(3,(2,9))),14)),(8,((6,(11,15)),10))),12,1); tree rep.5540000 = (12,((((10,(15,(6,11))),8),(4,(((9,2),3),(14,(7,13))))),5),1); tree rep.5550000 = (((((7,13),4),(((2,9),3),(5,14))),(10,(((15,11),6),8))),12,1); tree rep.5560000 = (12,((10,(8,((15,11),6))),(((3,(2,9)),(5,14)),((13,7),4))),1); tree rep.5570000 = (((((10,8),(6,(15,11))),3),(5,(((7,13),4),((9,2),14)))),12,1); tree rep.5580000 = (((((2,9),3),((((8,((6,15),11)),10),(14,(13,7))),4)),5),12,1); tree rep.5590000 = (12,(((3,(2,9)),(((14,4),(7,13)),5)),(((11,(6,15)),10),8)),1); tree rep.5600000 = (12,((((11,15),6),(10,8)),(5,(((7,13),(14,4)),(3,(2,9))))),1); tree rep.5610000 = ((((14,((13,7),4)),(5,(3,(2,9)))),(10,(8,(6,(11,15))))),12,1); tree rep.5620000 = ((((10,8),((6,15),11)),(((5,(4,(7,13))),14),((2,9),3))),12,1); tree rep.5630000 = (12,((((11,(15,6)),10),8),(((13,7),4),((3,(9,2)),(5,14)))),1); tree rep.5640000 = ((((6,(15,11)),(8,10)),(5,(((13,7),(14,4)),((9,2),3)))),12,1); tree rep.5650000 = (12,(((3,(2,9)),((7,13),((14,4),5))),((10,8),((11,15),6))),1); tree rep.5660000 = (((((4,(7,13)),14),(((2,9),3),5)),(8,(((6,15),11),10))),12,1); tree rep.5670000 = ((12,(5,(((9,2),3),((4,14),(7,13))))),(10,(8,((11,15),6))),1); tree rep.5680000 = ((((6,(11,15)),(10,8)),(5,((((13,7),4),14),(3,(9,2))))),12,1); tree rep.5690000 = (12,(((((7,13),4),14),(((2,9),3),5)),(((6,(15,11)),8),10)),1); tree rep.5700000 = ((14,(((5,((13,7),4)),12),((9,2),3))),(10,(8,(6,(15,11)))),1); tree rep.5710000 = (12,((5,(((7,(14,13)),4),((9,2),3))),((10,8),((15,6),11))),1); tree rep.5720000 = ((((13,7),4),14),(((9,2),3),(((((15,11),6),(8,10)),12),5)),1); tree rep.5730000 = (12,((((5,14),((13,7),4)),(3,(2,9))),(((11,(6,15)),10),8)),1); tree rep.5740000 = (((((7,13),14),((4,(3,(2,9))),5)),((8,10),((15,6),11))),12,1); tree rep.5750000 = (((((2,9),(5,3)),(4,(14,(7,13)))),(10,(((15,11),6),8))),12,1); tree rep.5760000 = ((((8,(11,(15,6))),10),((5,14),((3,(9,2)),(4,(7,13))))),12,1); tree rep.5770000 = (12,((((11,(15,6)),8),10),((((2,9),3),(((4,7),13),14)),5)),1); tree rep.5780000 = (((10,(8,((11,15),6))),((4,((7,13),(14,5))),(3,(9,2)))),12,1); tree rep.5790000 = ((((4,(7,13)),(14,((3,(2,9)),5))),((10,((15,11),6)),8)),12,1); tree rep.5800000 = ((((3,((4,(13,7)),14)),(5,(2,9))),(8,(10,((15,6),11)))),12,1); tree rep.5810000 = (12,(((8,((11,15),6)),10),(((7,13),4),((((2,9),3),14),5))),1); tree rep.5820000 = ((((3,(2,9)),12),((10,8),(6,(15,11)))),(((14,5),4),(7,13)),1); tree rep.5830000 = (((10,8),(11,(6,15))),(12,(((14,5),((4,13),7)),(3,(2,9)))),1); tree rep.5840000 = ((((13,7),(5,(4,(14,(3,(2,9)))))),(10,(((11,15),6),8))),12,1); tree rep.5850000 = (((((3,(9,2)),5),((6,(15,11)),(8,10))),((14,(13,7)),4)),12,1); tree rep.5860000 = (12,((5,(((4,(7,13)),14),((2,9),3))),(10,(((6,11),15),8))),1); tree rep.5870000 = ((5,(((9,2),3),(((7,13),4),14))),(12,((6,(15,11)),(10,8))),1); tree rep.5880000 = (((((2,9),3),(((7,14),(13,4)),5)),(8,(10,(11,(15,6))))),12,1); tree rep.5890000 = (((((6,15),11),10),8),(((14,5),(3,((9,2),12))),((13,7),4)),1); tree rep.5900000 = ((((11,6),15),((5,(((9,2),3),(14,((13,7),4)))),(8,10))),12,1); tree rep.5910000 = ((((8,10),((6,15),11)),(((5,(4,(7,13))),14),((9,2),3))),12,1); tree rep.5920000 = ((((11,(6,15)),(10,8)),((5,((14,(13,7)),4)),(3,(2,9)))),12,1); tree rep.5930000 = ((((4,(3,(2,9))),(((7,13),14),5)),((10,8),((11,15),6))),12,1); tree rep.5940000 = (12,(3,(((5,(9,2)),((13,7),(14,4))),((((15,6),11),10),8))),1); tree rep.5950000 = (((5,14),(((13,7),4),((2,9),3))),(12,((6,(15,11)),(8,10))),1); tree rep.5960000 = (12,(((10,((11,15),6)),8),(((14,5),(4,(13,7))),((9,2),3))),1); tree rep.5970000 = (12,((((9,2),3),((4,(13,7)),(5,14))),((11,(15,6)),(8,10))),1); tree rep.5980000 = (12,(((10,((11,15),6)),8),((7,13),(4,((14,5),(3,(9,2)))))),1); tree rep.5990000 = ((((2,9),3),((5,(14,((10,8),(11,(6,15))))),(4,(13,7)))),12,1); tree rep.6000000 = (12,(((8,10),((15,11),6)),(((2,9),3),((14,((13,7),4)),5))),1); tree rep.6010000 = (12,((10,(8,(15,(6,11)))),((((9,2),3),((13,14),(7,4))),5)),1); tree rep.6020000 = (12,((((5,(2,3)),14),(4,(9,(13,7)))),(8,(((6,15),11),10))),1); tree rep.6030000 = (((((14,(7,13)),4),(5,(3,(2,9)))),((((6,15),11),8),10)),12,1); tree rep.6040000 = ((((4,14),(7,13)),(5,((2,9),3))),((10,((6,(11,15)),8)),12),1); tree rep.6050000 = ((((2,9),(((14,5),(4,(7,13))),3)),(10,((11,(15,6)),8))),12,1); tree rep.6060000 = (12,(((5,((3,(2,9)),(4,(7,13)))),14),((((6,15),11),8),10)),1); tree rep.6070000 = (12,(((3,(9,2)),(((7,13),(4,14)),5)),((15,(11,6)),(10,8))),1); tree rep.6080000 = (((5,(((13,7),(((9,2),3),14)),4)),((8,10),(11,(15,6)))),12,1); tree rep.6090000 = (((8,10),(11,(15,6))),((((9,2),3),(5,((4,(13,7)),14))),12),1); tree rep.6100000 = (12,(((3,(9,2)),((14,5),(4,(7,13)))),(8,(10,(6,(11,15))))),1); tree rep.6110000 = (12,((((9,2),3),(5,(4,((13,7),14)))),((10,8),((11,15),6))),1); tree rep.6120000 = ((((6,(11,15)),10),8),(12,(5,(((2,9),3),(4,(7,(13,14)))))),1); tree rep.6130000 = ((((((13,7),4),((14,5),(3,(2,9)))),8),((6,(15,11)),10)),12,1); tree rep.6140000 = (((8,(((11,15),6),10)),12),((((2,9),3),(14,(4,(13,7)))),5),1); tree rep.6150000 = (12,((((6,15),11),(8,10)),(5,((3,(2,9)),(((13,7),4),14)))),1); tree rep.6160000 = ((10,(((15,11),6),8)),(12,((3,(9,2)),((((13,7),4),5),14))),1); tree rep.6170000 = (((((10,8),(11,(6,15))),(14,((7,13),4))),(((2,9),5),3)),12,1); tree rep.6180000 = (12,((5,(14,(4,(13,7)))),(((6,(15,11)),(10,8)),((9,2),3))),1); tree rep.6190000 = (12,((5,((3,(2,9)),((4,(13,7)),14))),((15,(6,11)),(10,8))),1); tree rep.6200000 = (12,(((8,10),(11,(6,15))),(((3,(9,2)),5),(4,(14,(7,13))))),1); tree rep.6210000 = ((((3,(9,2)),((5,7),((14,4),13))),((8,(11,(15,6))),10)),12,1); tree rep.6220000 = ((((((2,9),3),(14,((13,7),4))),5),((10,8),(11,(6,15)))),12,1); tree rep.6230000 = (((((4,(14,(13,7))),((3,(2,9)),5)),(10,8)),(6,(11,15))),12,1); tree rep.6240000 = ((((11,(6,15)),(8,10)),((((2,9),3),14),(5,(4,(7,13))))),12,1); tree rep.6250000 = ((((6,(15,11)),(10,8)),(14,((((13,7),5),(3,(9,2))),4))),12,1); tree rep.6260000 = (((((15,11),6),(10,8)),((4,((13,7),14)),(5,(3,(9,2))))),12,1); tree rep.6270000 = (12,(((((4,(13,7)),14),5),((9,2),3)),((11,(15,6)),(8,10))),1); tree rep.6280000 = (((10,(((15,11),6),8)),((((2,9),3),((7,13),5)),(14,4))),12,1); tree rep.6290000 = ((((10,8),((11,15),6)),((((13,7),(3,(2,9))),14),(4,5))),12,1); tree rep.6300000 = ((12,((8,10),((6,11),15))),(((3,9),2),(5,(((13,7),4),14))),1); tree rep.6310000 = (((10,(8,((15,6),11))),(4,((((7,13),14),5),(3,(9,2))))),12,1); tree rep.6320000 = (12,(((2,9),3),(5,(4,(((7,13),14),((8,10),((11,6),15)))))),1); tree rep.6330000 = (12,((10,((11,(15,6)),8)),(((7,13),(((9,2),3),(5,14))),4)),1); tree rep.6340000 = (12,(((15,(11,6)),(8,10)),(((14,(13,(4,7))),((2,9),3)),5)),1); tree rep.6350000 = (((((9,2),3),(5,((14,4),(7,13)))),(8,(10,(6,(11,15))))),12,1); tree rep.6360000 = ((((((7,(13,4)),14),((10,8),(6,(15,11)))),5),(3,(9,2))),12,1); tree rep.6370000 = (((10,8),((15,6),11)),(12,(14,((5,4),((3,(9,2)),(7,13))))),1); tree rep.6380000 = ((((((2,9),3),((4,(13,7)),12)),5),14),((8,10),(6,(11,15))),1); tree rep.6390000 = (12,((((11,15),6),(8,10)),((((2,9),3),((4,(7,13)),14)),5)),1); tree rep.6400000 = (12,(((8,(15,(6,11))),10),((((13,7),4),14),(5,(3,(2,9))))),1); tree rep.6410000 = ((((8,10),((6,15),11)),((((9,2),3),((14,5),4)),(7,13))),12,1); tree rep.6420000 = (((10,(8,((11,15),6))),(5,((3,(9,2)),(14,(4,(13,7)))))),12,1); tree rep.6430000 = ((((((4,(7,13)),14),5),(3,(2,9))),((6,(15,11)),(8,10))),12,1); tree rep.6440000 = (12,((((14,((7,13),4)),(3,(2,9))),5),(8,(10,(11,(6,15))))),1); tree rep.6450000 = (12,(((11,(6,15)),(8,10)),(((3,(2,9)),(5,14)),((13,7),4))),1); tree rep.6460000 = (12,((3,(9,2)),(((((6,15),11),8),10),(((4,(13,7)),14),5))),1); tree rep.6470000 = (12,((((((2,9),(4,3)),(7,13)),5),14),(10,(8,((15,11),6)))),1); tree rep.6480000 = ((10,(((6,15),11),8)),(12,(((9,2),3),((14,((7,13),4)),5))),1); tree rep.6490000 = ((((10,8),(6,(11,15))),(((3,(2,9)),5),(14,(4,(13,7))))),12,1); tree rep.6500000 = (12,((10,((11,(15,6)),8)),((14,(4,(13,7))),(5,((2,9),3)))),1); tree rep.6510000 = (12,(((5,(3,(2,9))),((14,(7,13)),4)),((8,(6,(11,15))),10)),1); tree rep.6520000 = (12,((((((9,2),3),14),(4,(7,13))),5),(((6,11),15),(10,8))),1); tree rep.6530000 = ((12,((((2,9),3),((5,14),4)),(13,7))),((6,(11,15)),(10,8)),1); tree rep.6540000 = ((((((4,(13,7)),14),5),((2,9),3)),(8,((6,(11,15)),10))),12,1); tree rep.6550000 = (12,(((2,9),3),(((4,(7,13)),(5,14)),((11,(6,15)),(10,8)))),1); tree rep.6560000 = (12,(((3,(2,9)),(((13,7),4),(5,14))),(8,(10,(6,(15,11))))),1); tree rep.6570000 = (12,(((5,(4,14)),(((11,(15,6)),(8,10)),((2,9),3))),(13,7)),1); tree rep.6580000 = ((((8,((15,6),11)),10),((3,(2,9)),((5,(4,(7,13))),14))),12,1); tree rep.6590000 = (((4,(3,(2,9))),((7,13),((14,(10,(8,((15,6),11)))),5))),12,1); tree rep.6600000 = (12,((((14,(4,(13,7))),5),((2,9),3)),(((6,(15,11)),8),10)),1); tree rep.6610000 = (12,((((7,13),4),(((2,9),3),(14,5))),((8,((11,15),6)),10)),1); tree rep.6620000 = ((((6,15),11),(8,10)),(((3,(9,2)),(5,(((7,13),14),4))),12),1); tree rep.6630000 = (((8,((11,(6,15)),((5,(((13,7),14),4)),(3,(2,9))))),10),12,1); tree rep.6640000 = ((((3,(2,9)),((14,5),4)),(12,(13,7))),((10,8),((6,15),11)),1); tree rep.6650000 = ((5,((((8,(10,((6,11),15))),((2,9),3)),4),(13,(14,7)))),12,1); tree rep.6660000 = ((((10,8),((11,15),6)),(((3,5),((14,(7,13)),4)),(2,9))),12,1); tree rep.6670000 = ((((4,(13,7)),(14,5)),((2,9),3)),((((15,6),11),(8,10)),12),1); tree rep.6680000 = (((((((9,2),3),(((13,7),14),4)),5),(8,10)),(6,(11,15))),12,1); tree rep.6690000 = ((((3,(9,2)),((4,14),(5,(7,13)))),(8,(10,(11,(15,6))))),12,1); tree rep.6700000 = (12,((11,(6,15)),(((3,(((13,7),(14,4)),(9,2))),5),(10,8))),1); tree rep.6710000 = (12,(((8,(6,(15,11))),10),((4,((14,5),(((2,9),3),7))),13)),1); tree rep.6720000 = (12,((((3,(2,9)),((13,7),(14,4))),5),((8,10),((15,6),11))),1); tree rep.6730000 = (12,(((4,(3,(2,9))),((14,5),(7,13))),(10,(((11,15),6),8))),1); tree rep.6740000 = (12,(((8,(6,(11,15))),10),(((4,(13,7)),(((2,9),3),14)),5)),1); tree rep.6750000 = (12,(((((6,15),11),8),10),((14,(5,(4,(7,13)))),((2,9),3))),1); tree rep.6760000 = (12,(((((4,(7,13)),14),5),(3,(2,9))),(10,((11,(15,6)),8))),1); tree rep.6770000 = (((((9,2),3),(((13,7),(5,4)),14)),((8,((15,11),6)),10)),12,1); tree rep.6780000 = (12,(((((13,7),4),(14,5)),(10,(8,(11,(6,15))))),(3,(2,9))),1); tree rep.6790000 = (((((11,(15,6)),10),8),((((14,(13,7)),5),(3,(2,9))),4)),12,1); tree rep.6800000 = (((10,(8,((11,6),15))),((3,(2,9)),(5,(14,(4,(13,7)))))),12,1); tree rep.6810000 = ((((((11,15),6),8),10),(((((13,7),4),14),5),(3,(2,9)))),12,1); tree rep.6820000 = ((((8,(15,(11,6))),10),(((5,((2,9),3)),(4,(7,13))),14)),12,1); tree rep.6830000 = (12,(((6,(11,15)),(8,10)),((((7,13),(4,14)),5),((2,9),3))),1); tree rep.6840000 = (12,(((((6,15),11),8),10),((((7,4),13),(5,((9,2),3))),14)),1); tree rep.6850000 = (((5,(((4,(7,13)),14),(3,(2,9)))),((10,((15,11),6)),8)),12,1); tree rep.6860000 = (12,((((3,(9,2)),(((7,13),14),4)),5),((10,8),((11,15),6))),1); tree rep.6870000 = (((((14,(4,(7,13))),5),((9,2),3)),((((6,15),11),8),10)),12,1); tree rep.6880000 = (12,((((((9,2),3),4),(5,14)),(13,7)),((10,8),((15,11),6))),1); tree rep.6890000 = ((((14,(13,7)),((5,((2,9),3)),4)),((10,8),(15,(11,6)))),12,1); tree rep.6900000 = (12,(((14,(4,(7,13))),((3,(2,9)),5)),(10,(((11,15),6),8))),1); tree rep.6910000 = ((((3,(2,9)),(((4,13),(7,14)),5)),(((11,15),6),(10,8))),12,1); tree rep.6920000 = (((((7,13),4),14),((3,(9,2)),(((((6,11),15),8),10),5))),12,1); tree rep.6930000 = (12,((((2,9),3),(5,(14,((7,13),4)))),((6,(15,11)),(10,8))),1); tree rep.6940000 = (12,((5,(((6,11),15),(10,8))),((3,(9,2)),(14,((13,7),4)))),1); tree rep.6950000 = ((((9,2),3),(((7,13),14),(((8,(((15,11),6),10)),4),5))),12,1); tree rep.6960000 = ((((10,8),((15,6),11)),(5,((((7,13),4),14),((9,2),3)))),12,1); tree rep.6970000 = ((((14,((3,(9,2)),5)),((13,7),4)),(8,(10,(15,(6,11))))),12,1); tree rep.6980000 = ((((5,((9,2),3)),14),(4,(7,13))),(12,(((11,(6,15)),10),8)),1); tree rep.6990000 = ((((8,10),(11,(15,6))),(5,(((2,9),3),(((7,13),4),14)))),12,1); tree rep.7000000 = (12,(((10,8),((11,15),6)),(5,(14,(3,((2,9),((13,7),4)))))),1); tree rep.7010000 = ((4,((5,((6,(15,11)),((8,12),10))),14)),(((9,2),3),(7,13)),1); tree rep.7020000 = (12,((8,(10,(11,(15,6)))),(((4,(13,7)),5),(14,(3,(9,2))))),1); tree rep.7030000 = ((((10,8),((6,15),11)),((4,(7,13)),((14,5),(3,(9,2))))),12,1); tree rep.7040000 = (((10,((6,(11,15)),8)),(((3,(9,2)),(14,(4,(7,13)))),5)),12,1); tree rep.7050000 = (12,((10,(((6,15),11),8)),((5,((9,3),2)),(((4,14),13),7))),1); tree rep.7060000 = (12,(((3,(9,2)),((14,(4,(13,7))),5)),((11,(6,15)),(8,10))),1); tree rep.7070000 = (((((14,4),((7,13),((10,8),((11,15),6)))),5),(3,(9,2))),12,1); tree rep.7080000 = (((5,14),((13,7),((12,((6,(11,15)),(8,10))),(3,(2,9))))),4,1); tree rep.7090000 = (12,((8,(10,(11,(15,6)))),((5,(((13,7),4),14)),(3,(2,9)))),1); tree rep.7100000 = (12,((5,(3,((2,9),((7,13),(14,4))))),((8,10),(11,(6,15)))),1); tree rep.7110000 = ((((10,8),((15,11),6)),((13,7),((5,(3,(9,2))),(4,14)))),12,1); tree rep.7120000 = (((8,(10,((6,15),11))),((14,((13,7),4)),((3,(9,2)),5))),12,1); tree rep.7130000 = (12,(((10,8),(6,(11,15))),((((14,(7,13)),4),5),((9,2),3))),1); tree rep.7140000 = (12,((10,(((11,15),6),8)),(((14,((13,7),4)),5),(3,(2,9)))),1); tree rep.7150000 = (12,(((8,(11,(15,6))),10),(5,(((2,9),3),((4,(13,7)),14)))),1); tree rep.7160000 = (12,(5,(((2,9),3),(((((6,15),11),(10,8)),14),(4,(13,7))))),1); tree rep.7170000 = (((4,(7,13)),((14,5),(3,(2,9)))),((8,10),(((15,11),6),12)),1); tree rep.7180000 = ((5,((((2,9),3),14),((4,(13,7)),(10,(8,((15,6),11)))))),12,1); tree rep.7190000 = (12,((10,(8,((11,15),6))),(((3,(9,2)),5),(14,((7,13),4)))),1); tree rep.7200000 = ((((11,(6,15)),(10,8)),(((3,(2,9)),5),((4,14),(13,7)))),12,1); tree rep.7210000 = (((14,(7,13)),(((10,8),((6,11),15)),(4,((3,(2,9)),5)))),12,1); tree rep.7220000 = (12,(((7,13),4),(((5,14),(8,(((15,6),11),10))),(3,(9,2)))),1); tree rep.7230000 = (12,(((6,(11,15)),(8,10)),((5,14),(((9,2),3),(7,(4,13))))),1); tree rep.7240000 = (12,((4,((5,((7,13),14)),((9,2),3))),((11,(15,6)),(8,10))),1); tree rep.7250000 = (12,((10,(8,(11,(15,6)))),(((2,9),3),((5,14),(4,(13,7))))),1); tree rep.7260000 = (12,((((5,((9,2),3)),(4,(13,7))),14),(10,(8,((11,15),6)))),1); tree rep.7270000 = ((((((((6,15),11),(8,10)),14),(5,4)),(3,(2,9))),(7,13)),12,1); tree rep.7280000 = ((((14,((7,13),(5,4))),((2,9),3)),12),(8,(10,(11,(15,6)))),1); tree rep.7290000 = (12,((((11,(6,15)),8),10),((5,(14,(3,(2,9)))),(4,(7,13)))),1); tree rep.7300000 = (((5,(12,(3,(2,9)))),(14,(4,(13,7)))),(((15,6),11),(10,8)),1); tree rep.7310000 = (((((5,((9,2),3)),((7,13),4)),14),((8,10),(6,(15,11)))),12,1); tree rep.7320000 = (12,((14,(((9,2),3),(5,((4,7),13)))),((8,10),(6,(15,11)))),1); tree rep.7330000 = (((10,((6,(15,11)),8)),((5,(14,((7,13),4))),(3,(9,2)))),12,1); tree rep.7340000 = (12,((((9,2),3),(5,(((13,7),4),14))),((8,((6,11),15)),10)),1); tree rep.7350000 = ((((5,((2,9),3)),((4,(13,7)),14)),((8,10),((15,6),11))),12,1); tree rep.7360000 = (((3,(2,9)),(((6,(11,15)),(8,10)),(((7,13),(4,14)),5))),12,1); tree rep.7370000 = ((((((13,7),(4,14)),(3,(9,2))),5),(((15,11),6),(8,10))),12,1); tree rep.7380000 = (((3,(2,9)),((14,(7,13)),4)),((12,((8,10),(6,(11,15)))),5),1); tree rep.7390000 = (((10,((6,(15,11)),8)),(((13,7),4),((14,5),(3,(2,9))))),12,1); tree rep.7400000 = (12,(((3,((9,2),5)),(4,((7,13),14))),(((6,(11,15)),10),8)),1); tree rep.7410000 = (12,((5,(((4,14),(13,7)),((9,2),3))),((8,((11,15),6)),10)),1); tree rep.7420000 = (((6,(15,11)),(((3,(2,9)),12),(5,(((13,7),14),4)))),(8,10),1); tree rep.7430000 = (12,(((2,9),(8,(10,((11,15),6)))),((14,(4,(13,7))),(5,3))),1); tree rep.7440000 = (12,(((((2,9),3),(14,(4,(13,7)))),5),((10,8),((15,6),11))),1); tree rep.7450000 = (((((11,(6,15)),10),8),((14,((4,((9,2),3)),(13,7))),5)),12,1); tree rep.7460000 = (((((2,9),3),(((14,(13,7)),4),5)),(8,((11,(6,15)),10))),12,1); tree rep.7470000 = (((((13,(4,7)),14),(3,(2,9))),5),((8,(10,(11,(6,15)))),12),1); tree rep.7480000 = ((((10,(6,(11,15))),8),((5,((2,9),3)),((13,7),(14,4)))),12,1); tree rep.7490000 = (12,((((15,11),6),(8,10)),(3,((((7,13),4),14),((9,2),5)))),1); tree rep.7500000 = ((4,(((7,13),(3,(9,2))),((14,5),(10,((6,(15,11)),8))))),12,1); tree rep.7510000 = (((5,(((7,(4,14)),(3,(2,9))),13)),(8,(10,(11,(15,6))))),12,1); tree rep.7520000 = (12,((((13,7),(4,14)),(3,((9,2),5))),(((15,11),6),(10,8))),1); tree rep.7530000 = (((((5,14),((9,2),3)),((13,7),((8,10),(15,(6,11))))),4),12,1); tree rep.7540000 = (12,(((10,((11,15),6)),8),(14,(5,(((7,13),4),(3,(9,2)))))),1); tree rep.7550000 = (((((6,15),11),(8,10)),(5,(3,((2,9),(4,((7,13),14)))))),12,1); tree rep.7560000 = ((((5,((4,(7,13)),14)),(3,(2,9))),((10,8),((15,6),11))),12,1); tree rep.7570000 = (12,((((10,8),(11,(15,6))),(14,(4,(13,7)))),(5,((2,9),3))),1); tree rep.7580000 = (12,(((((5,14),4),(7,13)),((2,9),3)),(10,(8,((15,6),11)))),1); tree rep.7590000 = (12,((((11,(6,15)),10),8),(((((4,(7,13)),14),3),(2,9)),5)),1); tree rep.7600000 = (((10,8),(11,(6,15))),(12,(((13,7),(4,14)),(((2,9),3),5))),1); tree rep.7610000 = (12,(((7,13),(((3,4),(14,5)),(9,2))),(10,(8,((11,15),6)))),1); tree rep.7620000 = (12,((5,14),(((10,(8,((6,11),15))),((2,9),3)),((13,7),4))),1); tree rep.7630000 = (((((6,(15,11)),10),8),((14,5),((3,(2,9)),(4,(7,13))))),12,1); tree rep.7640000 = (((((2,9),3),((13,7),((14,4),5))),((((15,11),6),8),10)),12,1); tree rep.7650000 = (12,((10,(8,((6,11),15))),(5,(((2,9),3),((4,(7,13)),14)))),1); tree rep.7660000 = (12,((((14,(3,(9,2))),5),((4,7),13)),((8,((11,15),6)),10)),1); tree rep.7670000 = (12,(((((13,7),4),(14,5)),((9,2),3)),((8,(11,(15,6))),10)),1); tree rep.7680000 = ((((3,(9,2)),((14,5),(4,(7,13)))),(((6,(15,11)),8),10)),12,1); tree rep.7690000 = ((12,(((4,(7,13)),(14,5)),(3,(2,9)))),(8,(((15,11),6),10)),1); tree rep.7700000 = (((((11,(15,6)),8),10),(((14,5),((2,9),3)),((7,13),4))),12,1); tree rep.7710000 = (((5,(((4,14),(13,7)),((2,9),3))),((8,10),((15,6),11))),12,1); tree rep.7720000 = (12,(((5,((9,2),((13,7),(4,14)))),3),(8,(10,((15,6),11)))),1); tree rep.7730000 = (12,((((3,(9,2)),(14,5)),(4,(7,13))),(((15,6),11),(8,10))),1); tree rep.7740000 = ((((3,(9,2)),(5,(14,((13,7),4)))),(10,((6,(11,15)),8))),12,1); tree rep.7750000 = (((((15,11),6),(8,10)),((((13,7),4),14),(5,((9,2),3)))),12,1); tree rep.7760000 = (((11,(6,15)),(8,10)),(((2,9),3),(12,(5,((13,7),(14,4))))),1); tree rep.7770000 = (12,((((6,(11,15)),8),10),((14,(((9,2),3),(5,4))),(7,13))),1); tree rep.7780000 = (12,((((3,(9,2)),(14,5)),((7,13),4)),(((15,11),6),(10,8))),1); tree rep.7790000 = (((5,(((9,2),3),(14,((13,7),4)))),((8,(11,(15,6))),10)),12,1); tree rep.7800000 = (((((6,(11,15)),8),10),(((14,(7,13)),4),((5,(2,9)),3))),12,1); tree rep.7810000 = ((((8,10),(11,(6,15))),((5,((4,14),(13,7))),((2,9),3))),12,1); tree rep.7820000 = ((5,((4,(13,7)),((3,((12,2),9)),14))),(8,(((6,15),11),10)),1); tree rep.7830000 = (12,(((8,10),(11,(15,6))),((13,7),((14,5),(((9,2),3),4)))),1); tree rep.7840000 = (12,((5,((((2,9),3),14),(4,(13,7)))),(((6,(15,11)),10),8)),1); tree rep.7850000 = (((((3,(2,9)),((4,(13,7)),14)),5),(((15,11),6),(10,8))),12,1); tree rep.7860000 = (12,(((((6,11),15),8),10),((((2,9),3),(((14,13),4),7)),5)),1); tree rep.7870000 = (12,((3,(9,2)),(((((6,15),11),(10,8)),5),(14,((7,13),4)))),1); tree rep.7880000 = (12,(((8,10),(14,(5,(((13,7),4),(3,(9,2)))))),((11,15),6)),1); tree rep.7890000 = (12,(((15,(6,11)),(10,8)),(((9,2),3),(4,(((7,13),14),5)))),1); tree rep.7900000 = (12,((((5,((13,7),(14,4))),(2,9)),3),(((11,15),6),(8,10))),1); tree rep.7910000 = (((((14,4),(2,((7,13),5))),9),3),(((10,((11,15),6)),8),12),1); tree rep.7920000 = (((((3,(2,9)),5),((14,4),(7,13))),(8,((6,(15,11)),10))),12,1); tree rep.7930000 = ((3,(2,((((4,(14,(13,7))),((11,(15,6)),(10,8))),5),9))),12,1); tree rep.7940000 = ((((((13,7),(4,14)),5),(3,(2,9))),(((11,6),15),(8,10))),12,1); tree rep.7950000 = ((((10,8),((15,11),6)),((5,12),(3,(9,2)))),((4,14),(13,7)),1); tree rep.7960000 = (12,((((11,(6,15)),10),8),(5,((13,7),((14,4),(3,(9,2)))))),1); tree rep.7970000 = (((10,(8,(11,(15,6)))),((((2,9),3),((7,13),5)),(14,4))),12,1); tree rep.7980000 = (12,(((3,(2,9)),(((8,10),((15,6),11)),(4,5))),(14,(13,7))),1); tree rep.7990000 = (12,((((((14,(4,(13,7))),5),(3,(2,9))),10),8),(6,(15,11))),1); tree rep.8000000 = (12,(5,(((2,9),3),(14,((13,7),(4,((15,(6,11)),(10,8))))))),1); tree rep.8010000 = (((((2,9),3),(((13,7),(5,14)),4)),((11,(6,15)),(8,10))),12,1); tree rep.8020000 = ((((8,10),(6,(15,11))),(((2,9),3),(((4,13),7),(14,5)))),12,1); tree rep.8030000 = (((3,(9,2)),(14,(((7,13),4),5))),(((10,((6,15),11)),8),12),1); tree rep.8040000 = (((((11,(15,6)),10),8),((((9,2),3),5),(((7,13),14),4))),12,1); tree rep.8050000 = ((((((11,15),6),10),8),(((7,13),(5,(3,(9,2)))),(14,4))),12,1); tree rep.8060000 = (((((15,11),6),(10,8)),((5,(4,(13,7))),((3,(2,9)),14))),12,1); tree rep.8070000 = (((8,10),(5,(((((7,13),4),14),((2,9),3)),((15,11),6)))),12,1); tree rep.8080000 = (12,(5,((((14,4),(7,13)),(3,(9,2))),(((11,15),6),(10,8)))),1); tree rep.8090000 = (12,(((10,((15,6),11)),8),(((7,13),4),((14,5),(3,(9,2))))),1); tree rep.8100000 = ((((15,6),11),(10,8)),(((((9,2),3),5),(((13,7),4),14)),12),1); tree rep.8110000 = (12,((5,((3,(2,9)),(14,(4,(13,7))))),(8,(10,((15,11),6)))),1); tree rep.8120000 = (((5,(4,((3,(9,2)),(14,(7,13))))),((6,(11,15)),(10,8))),12,1); tree rep.8130000 = (12,((14,(5,(((9,2),3),((8,10),(15,(11,6)))))),(7,(4,13))),1); tree rep.8140000 = (((((3,(9,2)),((14,4),(7,13))),5),(8,(10,(11,(6,15))))),12,1); tree rep.8150000 = ((((10,8),((15,6),11)),((4,(13,7)),((14,5),(3,(9,2))))),12,1); tree rep.8160000 = ((((4,(13,7)),(((14,5),(2,9)),3)),((6,(15,11)),(10,8))),12,1); tree rep.8170000 = ((((15,6),11),(((5,((9,2),3)),(14,(4,(13,7)))),(8,10))),12,1); tree rep.8180000 = (12,(((((8,10),(6,(15,11))),5),(14,((7,13),4))),(3,(2,9))),1); tree rep.8190000 = (12,((5,((14,(13,7)),((3,(2,9)),4))),((((11,15),6),10),8)),1); tree rep.8200000 = ((((((6,15),11),10),8),(14,((7,13),4))),(12,(5,((2,9),3))),1); tree rep.8210000 = (12,((5,(((14,(13,7)),4),((9,2),3))),((10,8),((15,11),6))),1); tree rep.8220000 = ((((14,5),(((9,2),12),3)),((7,13),4)),((15,(11,6)),(10,8)),1); tree rep.8230000 = (12,((((15,11),6),(8,10)),((((7,13),(5,14)),4),((2,9),3))),1); tree rep.8240000 = (12,(((3,(2,9)),((4,(7,13)),(5,14))),((8,10),((11,6),15))),1); tree rep.8250000 = (12,((((6,15),11),(8,10)),((14,(4,(13,7))),(((9,2),3),5))),1); tree rep.8260000 = (12,(((3,(2,9)),5),((((7,14),4),13),((8,10),(15,(11,6))))),1); tree rep.8270000 = (12,((((6,15),11),(8,10)),(5,((14,(13,7)),(3,(4,(2,9)))))),1); tree rep.8280000 = (12,(((((7,13),4),((2,9),3)),(5,14)),((8,10),(6,(15,11)))),1); tree rep.8290000 = ((((5,((4,(14,(13,7))),(3,(2,9)))),(8,((6,15),11))),10),12,1); tree rep.8300000 = (12,(((((7,13),4),(5,14)),(3,(9,2))),((6,(15,11)),(10,8))),1); tree rep.8310000 = (12,(((10,8),((((4,(13,7)),((9,2),3)),5),14)),((15,11),6)),1); tree rep.8320000 = ((((5,(((9,2),3),4)),(14,(13,7))),((10,8),((6,15),11))),12,1); tree rep.8330000 = (12,((((11,(6,15)),8),10),((5,((2,9),3)),((4,(7,13)),14))),1); tree rep.8340000 = (12,(((9,2),3),(((4,((8,10),(6,(11,15)))),5),((13,7),14))),1); tree rep.8350000 = (12,(((14,(3,(2,9))),(((7,13),5),4)),((6,(11,15)),(8,10))),1); tree rep.8360000 = (12,(((9,2),(3,((7,13),(4,(5,14))))),(10,(((11,15),6),8))),1); tree rep.8370000 = (((((15,6),11),(10,8)),(((2,9),3),(5,((14,4),(7,13))))),12,1); tree rep.8380000 = (12,(((5,14),((10,((15,11),6)),8)),(((13,7),4),(3,(2,9)))),1); tree rep.8390000 = (12,((((5,14),((9,2),(3,4))),(13,7)),((8,(6,(11,15))),10)),1); tree rep.8400000 = (((((4,14),5),((7,13),((9,2),3))),((10,8),((15,6),11))),12,1); tree rep.8410000 = ((5,(((12,((13,7),4)),14),((9,2),3))),(10,(8,((15,6),11))),1); tree rep.8420000 = (((5,((15,(11,6)),(8,10))),(((13,(7,4)),14),((2,9),3))),12,1); tree rep.8430000 = (12,(((5,((4,(7,13)),14)),((2,9),3)),(8,((11,(15,6)),10))),1); tree rep.8440000 = (12,(((14,5),(4,((10,8),((11,15),6)))),((3,(9,2)),(7,13))),1); tree rep.8450000 = (12,((((13,7),(4,14)),((3,(2,9)),5)),((11,(15,6)),(8,10))),1); tree rep.8460000 = (12,((5,((14,(13,7)),((3,(9,2)),4))),(((15,6),11),(10,8))),1); tree rep.8470000 = (12,((11,(15,6)),(8,(10,(((13,7),4),(5,((3,(9,2)),14)))))),1); tree rep.8480000 = ((((((4,(7,13)),14),(3,(9,2))),5),(8,(((11,15),6),10))),12,1); tree rep.8490000 = (12,(((10,8),((6,15),11)),(((4,(7,13)),14),(5,((9,2),3)))),1); tree rep.8500000 = (((((11,15),6),(10,8)),((5,((14,4),(7,13))),(3,(9,2)))),12,1); tree rep.8510000 = ((((5,4),(3,(9,2))),(7,(14,13))),(12,(((11,(15,6)),8),10)),1); tree rep.8520000 = (((8,10),(6,(15,11))),(12,((((13,7),(4,(14,5))),3),(2,9))),1); tree rep.8530000 = (((((4,(14,(7,13))),5),((2,9),3)),((10,8),(11,(6,15)))),12,1); tree rep.8540000 = (((10,(((15,11),6),8)),(((5,14),((9,2),3)),(4,(7,13)))),12,1); tree rep.8550000 = (12,((10,(((15,11),6),8)),(5,(((2,9),3),((13,7),(4,14))))),1); tree rep.8560000 = ((((3,(9,2)),(4,((14,5),(13,7)))),(((15,6),11),(10,8))),12,1); tree rep.8570000 = ((((3,(9,2)),(((14,(13,7)),4),5)),((10,8),((6,15),11))),12,1); tree rep.8580000 = (((5,14),((3,(2,9)),(((8,10),(11,(15,6))),(4,(7,13))))),12,1); tree rep.8590000 = (12,((((4,(7,13)),(14,5)),(3,(9,2))),(8,(((11,15),6),10))),1); tree rep.8600000 = (12,((14,((((13,7),4),5),((2,9),3))),(((15,(6,11)),8),10)),1); tree rep.8610000 = (12,((5,(((14,4),(13,7)),((2,9),3))),(((15,6),11),(8,10))),1); tree rep.8620000 = (((14,5),(((3,(9,2)),((7,13),4)),((6,(15,11)),(8,10)))),12,1); tree rep.8630000 = (12,(((8,10),(11,(15,6))),((5,((4,(14,13)),7)),((2,9),3))),1); tree rep.8640000 = (12,(((8,((15,11),6)),10),((5,(14,(4,(13,7)))),(3,(9,2)))),1); tree rep.8650000 = (((14,(4,(7,13))),((((8,10),(6,(15,11))),5),(3,(2,9)))),12,1); tree rep.8660000 = (12,(((10,8),(15,(6,11))),(((3,(9,2)),((4,(13,7)),14)),5)),1); tree rep.8670000 = (((((14,5),(4,(13,7))),((9,2),3)),(8,((6,(11,15)),10))),12,1); tree rep.8680000 = ((12,(((11,(6,15)),8),10)),(5,((3,(9,2)),(((7,13),14),4))),1); tree rep.8690000 = (((((((2,9),3),5),(4,14)),(13,7)),((((15,6),11),10),8)),12,1); tree rep.8700000 = (((4,((5,(3,(2,9))),(14,(13,7)))),12),(8,(((11,15),6),10)),1); tree rep.8710000 = ((((12,(2,9)),3),((14,5),((10,(15,(11,6))),8))),((4,13),7),1); tree rep.8720000 = (12,(((4,(7,13)),((14,5),((2,9),3))),(8,((11,(15,6)),10))),1); tree rep.8730000 = (12,((((2,9),3),(((13,7),4),(5,14))),((6,(15,11)),(10,8))),1); tree rep.8740000 = (((10,8),(11,(15,6))),(12,(((4,(13,7)),14),(5,(3,(2,9))))),1); tree rep.8750000 = ((10,((((4,(13,7)),(14,5)),(((2,9),3),12)),((6,15),11))),8,1); tree rep.8760000 = (12,(((3,(9,2)),(((4,(13,7)),14),(10,(((15,6),11),8)))),5),1); tree rep.8770000 = (((4,(13,7)),((((((11,15),6),10),8),((9,3),2)),(5,14))),12,1); tree rep.8780000 = (12,((14,((5,(3,(9,2))),(4,(13,7)))),(10,((6,(15,11)),8))),1); tree rep.8790000 = (((4,(13,7)),((((2,9),12),3),14)),(((10,8),(6,(11,15))),5),1); tree rep.8800000 = ((5,((3,(9,2)),((4,14),(7,13)))),((8,(10,(6,(11,15)))),12),1); tree rep.8810000 = ((10,(8,(11,(6,15)))),((5,(4,(14,(7,13)))),(12,((2,9),3))),1); tree rep.8820000 = (12,(((8,10),(6,(11,15))),(((((4,5),14),(7,13)),3),(9,2))),1); tree rep.8830000 = ((((((3,(2,9)),5),4),14),(13,7)),(12,((8,10),(11,(6,15)))),1); tree rep.8840000 = (12,((10,(8,(6,(15,11)))),(5,((4,(13,7)),(14,((9,2),3))))),1); tree rep.8850000 = ((((10,((15,11),6)),8),((3,(9,2)),(4,((14,5),(7,13))))),12,1); tree rep.8860000 = (((((4,14),(13,7)),5),(((8,10),((6,15),11)),((2,9),3))),12,1); tree rep.8870000 = (12,(((8,10),((((4,(7,13)),14),5),((2,9),3))),(11,(15,6))),1); tree rep.8880000 = ((((15,11),6),(10,8)),(12,((5,((4,(7,13)),14)),((2,9),3))),1); tree rep.8890000 = (((((13,7),(14,4)),(((11,(15,6)),(10,8)),((2,9),3))),5),12,1); tree rep.8900000 = ((((((15,6),11),8),10),(((((7,13),4),14),((9,2),3)),5)),12,1); tree rep.8910000 = (((((4,13),(14,7)),(((9,2),3),5)),((10,(11,(15,6))),8)),12,1); tree rep.8920000 = ((((8,10),(11,(6,15))),((((7,(13,9)),14),4),(5,(2,3)))),12,1); tree rep.8930000 = (12,((((3,(9,2)),5),((13,7),(14,4))),(10,(8,((6,15),11)))),1); tree rep.8940000 = (12,(((5,((4,(7,13)),14)),((2,9),3)),((10,8),((15,6),11))),1); tree rep.8950000 = (12,((8,(((15,6),11),10)),(((3,(2,9)),5),(((13,7),14),4))),1); tree rep.8960000 = (12,((((3,(9,2)),5),((14,(7,13)),4)),((((15,6),11),8),10)),1); tree rep.8970000 = (12,(((6,(11,15)),(10,8)),(((3,(9,2)),((4,(13,7)),14)),5)),1); tree rep.8980000 = ((((5,((14,4),(7,13))),((9,2),3)),(((15,6),11),(10,8))),12,1); tree rep.8990000 = ((((3,(9,2)),(((4,(7,13)),5),14)),((((15,11),6),10),8)),12,1); tree rep.9000000 = (12,(((3,(2,9)),((4,(14,(7,13))),5)),(((6,15),11),(8,10))),1); tree rep.9010000 = (12,((((2,9),3),((4,(5,(13,7))),14)),(((6,15),11),(10,8))),1); tree rep.9020000 = ((((6,(15,11)),8),10),((((13,7),4),(12,(((2,9),3),14))),5),1); tree rep.9030000 = (((8,((11,(15,6)),10)),((14,((2,9),3)),(5,((13,7),4)))),12,1); tree rep.9040000 = (12,((10,(8,(11,(6,15)))),(((14,5),((13,7),4)),(3,(2,9)))),1); tree rep.9050000 = (((((14,(13,4)),7),((3,(2,9)),5)),(((6,15),11),(8,10))),12,1); tree rep.9060000 = ((((5,(7,13)),(12,((9,2),3))),(4,14)),(((11,15),6),(10,8)),1); tree rep.9070000 = (((((7,13),((3,(2,9)),(14,5))),4),((10,8),(6,(11,15)))),12,1); tree rep.9080000 = ((((10,((15,11),6)),8),(((((13,7),4),14),((9,2),3)),5)),12,1); tree rep.9090000 = ((((10,(11,(6,15))),8),(((3,(9,2)),5),(14,(7,(4,13))))),12,1); tree rep.9100000 = (12,(((((((13,7),(5,(3,(2,9)))),4),14),(11,(6,15))),8),10),1); tree rep.9110000 = (((((6,15),11),(8,10)),((5,((2,9),3)),(14,(4,(13,7))))),12,1); tree rep.9120000 = ((((8,(11,(6,15))),10),(((9,2),3),(5,((14,(7,13)),4)))),12,1); tree rep.9130000 = (((((14,5),(4,(7,13))),(3,(9,2))),(8,(((15,11),6),10))),12,1); tree rep.9140000 = (12,((((14,5),((9,2),3)),(13,(7,4))),((8,10),(6,(15,11)))),1); tree rep.9150000 = ((5,((((4,(7,13)),14),((9,2),3)),((6,(15,11)),(10,8)))),12,1); tree rep.9160000 = (12,(((((2,9),3),(5,14)),(4,(7,13))),((8,(6,(11,15))),10)),1); tree rep.9170000 = ((((8,10),((15,6),11)),((((9,2),3),5),(((7,13),14),4))),12,1); tree rep.9180000 = ((((15,(11,6)),10),8),(12,(((9,2),3),(((7,13),(14,4)),5))),1); tree rep.9190000 = ((((8,10),(11,(15,6))),(((3,(9,2)),4),((14,5),(13,7)))),12,1); tree rep.9200000 = (12,((((3,(9,2)),(4,(7,13))),(5,14)),((8,10),(11,(6,15)))),1); tree rep.9210000 = (12,((((6,15),11),(8,10)),((((14,(7,13)),4),((9,2),3)),5)),1); tree rep.9220000 = (12,(((4,(7,(14,13))),(((10,8),((15,11),6)),(9,2))),(5,3)),1); tree rep.9230000 = (((((15,11),6),(8,10)),(((4,14),(7,13)),(5,((2,9),3)))),12,1); tree rep.9240000 = (((((2,9),3),5),(14,(4,(13,7)))),(12,((10,8),((11,15),6))),1); tree rep.9250000 = (12,(((8,(6,(15,11))),10),(((3,(9,2)),4),(5,(14,(7,13))))),1); tree rep.9260000 = ((((8,10),(5,((14,(4,(13,7))),(3,(2,9))))),((15,11),6)),12,1); tree rep.9270000 = (((((2,9),3),(((7,13),(4,14)),5)),(10,(8,((11,15),6)))),12,1); tree rep.9280000 = ((((5,(4,((13,7),14))),((9,2),3)),((11,(15,6)),(8,10))),12,1); tree rep.9290000 = (12,((((6,(11,15)),(8,10)),(14,((13,7),4))),(((9,2),3),5)),1); tree rep.9300000 = (12,((((3,(9,2)),((4,(7,13)),14)),5),(10,((11,(6,15)),8))),1); tree rep.9310000 = (12,(((((9,2),3),(4,(7,13))),(5,14)),(((11,15),6),(8,10))),1); tree rep.9320000 = (12,(((6,(11,15)),(10,8)),(((3,(2,9)),((13,(14,7)),4)),5)),1); tree rep.9330000 = (((((15,6),11),(10,8)),(((13,(4,7)),14),((3,(2,9)),5))),12,1); tree rep.9340000 = ((((9,2),3),(((4,(((8,10),(11,(15,6))),14)),5),(7,13))),12,1); tree rep.9350000 = (12,(((((15,6),11),8),10),((14,5),((4,(13,7)),(3,(9,2))))),1); tree rep.9360000 = (12,((((3,(9,2)),(((7,13),4),(5,14))),(15,(6,11))),(8,10)),1); tree rep.9370000 = ((((((9,2),5),3),(((7,13),4),14)),(10,(((6,15),11),8))),12,1); tree rep.9380000 = ((((3,(9,2)),((4,(7,13)),(5,14))),12),((((15,11),6),10),8),1); tree rep.9390000 = ((((9,2),3),((((13,7),4),14),((8,((11,(6,15)),10)),5))),12,1); tree rep.9400000 = (((13,7),(((14,(4,5)),((9,2),3)),12)),((8,10),(15,(6,11))),1); tree rep.9410000 = ((((8,10),(6,(11,15))),((((9,2),3),(4,(7,13))),(5,14))),12,1); tree rep.9420000 = (((8,10),((11,6),15)),(((3,12),(9,2)),(((7,13),4),(5,14))),1); tree rep.9430000 = ((((5,((7,(4,13)),14)),(3,(2,9))),((8,10),(11,(15,6)))),12,1); tree rep.9440000 = (12,((9,(3,2)),((((4,(13,7)),14),5),(10,(8,((15,6),11))))),1); tree rep.9450000 = ((14,((((11,(6,15)),(8,10)),(5,4)),(((2,9),3),(7,13)))),12,1); tree rep.9460000 = (((((3,(9,2)),5),((14,(7,13)),4)),(10,(8,(11,(6,15))))),12,1); tree rep.9470000 = (((5,((2,9),((((13,7),14),4),3))),((11,(15,6)),(10,8))),12,1); tree rep.9480000 = ((((14,(7,13)),(4,((3,(2,9)),5))),12),((6,(15,11)),(10,8)),1); tree rep.9490000 = ((((10,(11,(15,6))),8),((((13,7),4),(14,5)),(3,(2,9)))),12,1); tree rep.9500000 = (12,(((((11,6),15),10),8),((5,((7,(13,4)),14)),((9,2),3))),1); tree rep.9510000 = (12,((((11,(6,15)),8),10),(((2,9),3),((((7,13),4),5),14))),1); tree rep.9520000 = ((((6,11),15),(8,10)),(((3,(2,9)),(4,(7,13))),(12,(5,14))),1); tree rep.9530000 = (((((5,((7,13),14)),4),(3,(2,9))),(((11,(15,6)),10),8)),12,1); tree rep.9540000 = (12,((10,(8,((6,15),11))),((14,5),(((13,7),4),(3,(2,9))))),1); tree rep.9550000 = (12,(((8,10),((6,15),11)),(((9,2),3),(5,(((14,4),7),13)))),1); tree rep.9560000 = (((10,(8,((11,15),6))),((14,((9,2),3)),(((7,13),4),5))),12,1); tree rep.9570000 = (((14,(3,(2,9))),(5,((13,7),4))),(12,(8,(((15,6),11),10))),1); tree rep.9580000 = (((((9,2),(((7,13),14),4)),(3,5)),(((11,15),6),(8,10))),12,1); tree rep.9590000 = (12,(((9,2),3),(5,((((6,(11,15)),(10,8)),((13,7),4)),14))),1); tree rep.9600000 = (12,((5,((((10,8),(11,(6,15))),((4,7),13)),(3,(9,2)))),14),1); tree rep.9610000 = (12,(((10,((15,6),11)),8),((13,7),(((14,5),(3,(9,2))),4))),1); tree rep.9620000 = (((11,(15,6)),(10,8)),((3,((2,9),(14,((4,(13,7)),5)))),12),1); tree rep.9630000 = (((((11,(15,6)),8),10),((((9,2),3),((14,4),(13,7))),5)),12,1); tree rep.9640000 = (12,(((5,((9,2),3)),(4,(14,(7,13)))),((10,8),(6,(11,15)))),1); tree rep.9650000 = (((5,((14,(4,(13,7))),((9,2),3))),((8,((15,11),6)),10)),12,1); tree rep.9660000 = ((8,(10,((6,15),11))),(((3,(2,9)),((14,(5,(13,7))),4)),12),1); tree rep.9670000 = ((((10,8),(6,(11,15))),((3,(2,9)),((((7,13),5),4),14))),12,1); tree rep.9680000 = (((11,(15,6)),(10,8)),(12,(((2,9),3),(((14,(13,7)),4),5))),1); tree rep.9690000 = ((((6,(11,15)),(8,10)),((((5,14),(3,(9,2))),4),(13,7))),12,1); tree rep.9700000 = (((((((3,(9,2)),5),(14,((7,13),4))),8),10),(11,(15,6))),12,1); tree rep.9710000 = (((11,(6,15)),(((((9,2),3),5),(((13,7),4),14)),(8,10))),12,1); tree rep.9720000 = (12,((10,(8,((15,6),11))),((((4,(7,13)),14),5),(3,(9,2)))),1); tree rep.9730000 = (12,((((7,(14,5)),(3,(9,2))),(13,4)),((8,10),((15,11),6))),1); tree rep.9740000 = (12,(((10,8),((15,11),6)),((5,((9,2),3)),(4,((7,13),14)))),1); tree rep.9750000 = (12,((((11,(15,6)),(8,10)),(5,(14,((7,13),4)))),(3,(9,2))),1); tree rep.9760000 = (((8,10),(((11,15),6),((((9,2),3),5),(((13,7),4),14)))),12,1); tree rep.9770000 = (((((14,5),(3,(9,2))),((7,13),4)),(8,(10,(6,(11,15))))),12,1); tree rep.9780000 = ((((((((6,15),11),8),10),((13,7),4)),((3,(2,9)),14)),12),5,1); tree rep.9790000 = (12,(((4,(13,7)),(14,(((9,2),3),(((11,15),6),(8,10))))),5),1); tree rep.9800000 = ((((3,2),9),((((6,(11,15)),8),10),(14,((4,(13,7)),5)))),12,1); tree rep.9810000 = ((((10,(11,(6,15))),8),((14,(((9,2),3),5)),(4,(7,13)))),12,1); tree rep.9820000 = ((10,(((11,15),6),8)),((((((7,13),14),5),4),(3,(9,2))),12),1); tree rep.9830000 = (12,(((14,((4,(13,7)),((9,2),3))),5),((10,8),(11,(15,6)))),1); tree rep.9840000 = (12,(((6,(15,11)),(10,8)),(((9,2),3),(14,(5,(4,(7,13)))))),1); tree rep.9850000 = (((((6,15),11),(10,8)),((((2,9),3),(((7,13),4),14)),5)),12,1); tree rep.9860000 = ((((3,(2,9)),(5,((7,13),(4,14)))),(8,(((11,15),6),10))),12,1); tree rep.9870000 = ((8,((((5,((14,7),(13,4))),((2,9),3)),((6,15),11)),10)),12,1); tree rep.9880000 = (((4,((14,5),(((11,15),6),(8,10)))),((3,(2,9)),(7,13))),12,1); tree rep.9890000 = ((((5,(((13,7),(2,9)),4)),(14,3)),((10,((15,6),11)),8)),12,1); tree rep.9900000 = (12,(((6,(11,15)),(10,8)),(14,((((7,13),4),5),((9,2),3)))),1); tree rep.9910000 = (12,((5,(((9,2),3),((4,(7,13)),14))),((10,8),((15,11),6))),1); tree rep.9920000 = ((((((2,9),3),(4,(13,7))),(5,14)),(8,(((15,6),11),10))),12,1); tree rep.9930000 = (12,(((10,8),((11,15),6)),((4,(((14,13),7),(3,(2,9)))),5)),1); tree rep.9940000 = (12,((5,(14,(((9,2),3),((7,13),4)))),(8,(((15,11),6),10))),1); tree rep.9950000 = ((((((9,2),3),5),((14,(7,13)),4)),12),(((6,(15,11)),8),10),1); tree rep.9960000 = (12,(((2,9),3),(14,(13,(5,(4,((8,(((15,11),6),10)),7)))))),1); tree rep.9970000 = ((12,(10,(8,((15,6),11)))),((14,((7,13),4)),((2,9),(5,3))),1); tree rep.9980000 = (12,(((14,((((6,15),11),(8,10)),((2,9),3))),5),(4,(13,7))),1); tree rep.9990000 = (((10,(8,((11,15),6))),((13,7),(14,((4,(3,(9,2))),5)))),12,1); tree rep.10000000 = (12,((((5,14),4),((13,7),(8,(10,((15,11),6))))),((3,2),9)),1); end; phangorn/inst/extdata/trees/RAxML_bootstrap.YCh0000644000176200001440000002576213707232051021260 0ustar liggesusers((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Uth,Mur),(Hma,(Uam,(Uma,Uar)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Mur,Uth),Hma),(Uam,(Uma,Uar))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); ((((Uam,(Uma,Uar)),(Mur,Uth)),Hma),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uma,Uar))),Tor,Ame); ((((Uam,(Uma,Uar)),Hma),(Uth,Mur)),Tor,Ame); (((Uam,(Uma,Uar)),((Uth,Hma),Mur)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uar,(Uam,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uma,Uar)))),Tor,Ame); (((Uam,(Uma,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uma,Uar))),(Mur,Uth)),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Mur,Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Mur,Hma))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Hma,(Mur,Uth)),(Uar,(Uma,Uam))),Tor,Ame); (((Hma,(Mur,Uth)),(Uar,(Uma,Uam))),Tor,Ame); (((Uma,(Uam,Uar)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,(Mur,Uth)),(Uam,(Uar,Uma))),Tor,Ame); (((Uth,(Hma,Mur)),(Uam,(Uar,Uma))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); (((Hma,Mur),(Uth,((Uma,Uar),Uam))),Tor,Ame); (((Uma,(Uar,Uam)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uma,Uar)),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); (((Hma,Mur),(((Uma,Uar),Uam),Uth)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,((Uma,Uar),Uam)),(Uth,Mur)),Tor,Ame); ((((Uma,Uar),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uma,Uar),Uam),((Uth,Mur),Hma)),Tor,Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,((Mur,Uth),((Uam,(Uar,Uma)),Hma)),Ame); (Tor,(((Hma,Mur),Uth),(Uam,(Uar,Uma))),Ame); (Tor,((Mur,Uth),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Mur,Uth),(Hma,(Uam,(Uar,Uma)))),Ame); (Tor,((Hma,(Mur,Uth)),(Uma,(Uam,Uar))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Hma,Mur),(Uth,(Uma,(Uam,Uar)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uar,(Uma,Uam)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); (Tor,((Uam,(Uar,Uma)),((Mur,Uth),Hma)),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Ame); (Tor,((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Ame); (Tor,((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Hma,(Uth,Mur)),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uth,Mur),Hma),((Uar,Uma),Uam)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uma,(Uam,Uar)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); (((Hma,(Uam,(Uar,Uma))),(Uth,Mur)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uma,(Uam,Uar)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); ((((Uam,(Uar,Uma)),Hma),(Mur,Uth)),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); ((((Hma,Mur),Uth),(Uam,(Uar,Uma))),Tor,Ame); (((Uar,(Uma,Uam)),((Mur,Uth),Hma)),Tor,Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Hma,(Uam,(Uma,Uar))),(Uth,Mur)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Hma,Mur))),Ame); (Tor,((Uar,(Uam,Uma)),((Uth,Mur),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),(Uth,(Mur,Hma))),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uma,(Uar,Uam)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Uth),Hma)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),((Mur,Hma),Uth)),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (Tor,((Uam,(Uma,Uar)),(Hma,(Uth,Mur))),Ame); (((Hma,Mur),(Uth,((Uar,Uma),Uam))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); (((((Uar,Uma),Uam),(Uth,Mur)),Hma),Tor,Ame); ((((Uar,Uma),Uam),(Uth,(Hma,Mur))),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); (((Hma,Mur),(Uth,(Uar,(Uma,Uam)))),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Uam,(Uar,Uma)),((Hma,Mur),Uth)),Tor,Ame); (((Hma,Mur),(Uth,(Uam,(Uar,Uma)))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Hma,(Mur,Uth))),Tor,Ame); (((Uam,(Uar,Uma)),(Uth,(Hma,Mur))),Tor,Ame); (((Uam,(Uar,Uma)),((Uth,Mur),Hma)),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),(Hma,(Mur,Uth))),Tor,Ame); ((((Uar,Uma),Uam),((Hma,Mur),Uth)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); ((((Uar,Uma),Uam),((Mur,Uth),Hma)),Tor,Ame); phangorn/inst/extdata/trees/woodmouse.mrbayes.nex.con0000644000176200001440000000064313707232051022576 0ustar liggesusers#NEXUS [ID: 2542150086] begin trees; [Note: This tree contains information on the topology, branch lengths (if present), and the probability of the partition indicated by the branch.] tree con_50_majrule = (No305,No1114S,((((No304,No0913S)0.98,No306)0.90,(No0906S,(No0910S,No1202S)0.92)0.54,No0908S,No1206S)0.80,((No0909S,No1007S,No1208S)1.00,(No0912S,No1103S)0.50)0.94)0.80); end; phangorn/inst/extdata/trees/RAxML_bestTree.YCh0000644000176200001440000000053413707232051021006 0ustar liggesusers((((Mur:0.00215666997155560154,Uth:0.00192023592185219349):0.00016696946772137622,Hma:0.00368686670740361357):0.00018687639400160564,(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918):0.00033775695210929856):0.00157503466397103213):0.00634369057289599098,Tor:0.00989995418842323435,Ame:0.02707461606876413254):0.0; phangorn/inst/extdata/trees/RAxML_bootstrap.woodmouse0000644000176200001440000042331013707232051022605 0ustar liggesusers(((No1007S,(No0909S,No1208S)),(((No0906S,(No0910S,No1202S)),((No0912S,No1103S),(No0908S,No1206S))),(No306,(No0913S,No304)))),No1114S,No305); (((No306,((No0906S,(No0913S,(No0910S,No1202S))),(((No1208S,(No1007S,No0909S)),(No0912S,No1103S)),No304))),(No0908S,No1206S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No0908S,No1206S),((No304,No306),(No0906S,(No0913S,(No0910S,No1202S))))))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0906S,(No0908S,(((((No0913S,No304),No306),No1103S),No1206S),No0912S))),(No0910S,No1202S))),No1114S,No305); (((((No0908S,No1206S),(No304,No306)),((No0913S,(No0910S,No1202S)),No0906S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((No0908S,((No0910S,No1202S),(No1206S,No0906S))),(No306,(No0913S,No304))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); ((No1114S,(No306,(No0913S,No304))),(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0910S,No1202S),((No0908S,No1206S),No0906S))),No305); ((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0909S,(No1208S,No1007S)),(No0912S,No1103S)))),(No306,(No0913S,(No1114S,No304))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No1114S,No305); (((No0912S,No1103S),((No1007S,(No0909S,No1208S)),(((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))))),No1114S,No305); ((((No1103S,No0912S),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),((No1208S,No0909S),No1007S)),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),(No1103S,(((No1208S,No0909S),No1007S),No0912S))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),(No1103S,(((No1208S,No0909S),No1007S),No0912S))),No1114S,No305); ((((No0906S,(No1206S,No0908S)),(No306,(No304,((No1202S,No0910S),No0913S)))),((((No1208S,No0909S),No1007S),No0912S),No1103S)),No1114S,No305); ((((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No306,((No304,No0913S),(No0908S,(((No1202S,No0910S),No0906S),No1206S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No306,(No0913S,(((No1202S,No0910S),No0906S),No1206S))),No0908S),No304),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),No0908S),(((No1202S,No0910S),No0906S),No1206S)),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No1114S,No305); ((((((No0913S,No304),No306),No0908S),(((No1202S,No0910S),No0906S),No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((((No304,No0908S),(No306,(((No0913S,(No1202S,No0910S)),No0906S),No1206S))),(No0909S,(No1007S,No1208S))),No0912S),No1103S),No1114S,No305); (((No1103S,(No0912S,(No0909S,(No1007S,No1208S)))),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No1114S,(No304,No0913S)))),No305); (((No1103S,No0912S),(((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,(No304,No0913S))),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No1103S,(((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No306,(No304,No0913S))),(No0912S,(No1007S,(No1208S,No0909S))))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((No306,(No0908S,((((No1202S,No0910S),No0906S),No1206S),(No304,No0913S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No0908S,((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0908S,No1206S),((No1202S,No0910S),No0906S)),(No306,(No304,No0913S)))),No1114S,No305); (((No0913S,No304),(No306,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No1206S,(No0910S,(No1202S,No0906S))),No0908S),((No0913S,No304),No306))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No0912S,(No1103S,(No306,(((No0913S,No0910S),No1202S),(No304,(No0906S,(No0908S,No1206S)))))))),No1114S,No305); (((No306,((No304,No0908S),(No0913S,(No1206S,(No0906S,(No0910S,No1202S)))))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),(((No0908S,(No306,(No304,No0913S))),(No0906S,((No1206S,No1202S),No0910S))),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No1114S),No0912S),((((No1206S,No0908S),(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))),(No0909S,(No1007S,No1208S))),No305); (No1114S,((No0912S,((No1007S,(No1208S,No0909S)),No1103S)),((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),No1206S),No0908S)),No305); (No1114S,((No0912S,((No0909S,(No1007S,No1208S)),No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No304,No0913S)))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No306,((No0910S,((No0913S,No304),No1202S)),No0906S)),(No0908S,No1206S))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((((No0913S,No304),No306),(((No1202S,No0910S),No1206S),No0906S)),No0908S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No1202S,No0910S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1202S,No0910S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,No1206S),(No304,(No306,(No0913S,((No1202S,No0910S),No0906S)))))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)))),No1114S,No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),((No0913S,No304),No306)))),No1114S,No305); ((((No0908S,((No1202S,No0910S),(No1206S,No0906S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No306,(No304,No0913S)),(No1206S,No0908S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No304,No0913S),(((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No0908S,No1206S)),(No0906S,(No0910S,No1202S))),No306)),No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No1114S,(No304,No0913S)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S))),No305); (No1114S,((No306,((((No304,No0913S),(No0910S,No1202S)),No0906S),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((No306,(No304,No0913S)),((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),(No0909S,(No1007S,No1208S))),(No0908S,No1206S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No306,(No304,No0913S))),(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No306,(No304,No0913S))),(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No304,No0913S)),((No1202S,No0910S),((No0908S,No1206S),No0906S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,((No0912S,No1103S),(No0906S,((((No1202S,No0910S),(No1007S,(No1208S,No0909S))),((No0913S,No304),No306)),(No0908S,No1206S)))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((No0912S,No1103S),(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No1114S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (((((No0913S,No304),No306),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No0908S,((((No1202S,No0910S),No0906S),No1206S),((No0913S,(No1114S,No304)),No306))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),(((((No1103S,No0912S),No1206S),(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306))),No305); ((((((No1206S,No0908S),No0912S),(No0906S,(No1202S,No0910S))),No1103S),((No0913S,No304),No306)),((No1114S,(No1007S,No1208S)),No0909S),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0913S,No304),No306)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No305); (No1114S,(((No1007S,No1208S),No0909S),((No306,(No1103S,(((No0906S,(No1202S,No0910S)),No1206S),(No0908S,No0912S)))),(No0913S,No304))),No305); (No1114S,(No0912S,(No1103S,((No306,((No0906S,((No1202S,No0910S),No1206S)),((No1007S,(No1208S,No0909S)),No0908S))),(No304,No0913S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),((No0908S,No1206S),(((No304,No0913S),No306),(No0906S,(No1202S,No0910S))))),(No0912S,No1103S)),No305); (No1114S,(((No0910S,(((No0908S,No1206S),No1202S),((No304,No0913S),No306))),No0906S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (((No0912S,No1103S),(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No304,No0913S),No306))),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No304,(No306,((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0906S,(No0913S,(No0910S,No1202S)))))),No1114S,No305); (((((No1208S,No0909S),No1007S),(No0912S,No1103S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),(No306,(No304,No0913S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),(No306,(No304,No0913S)))),No1114S,No305); ((No0912S,(((((No0906S,(No0910S,No1202S)),No0908S),((No0909S,No1208S),No1007S)),((No306,(No304,No0913S)),No1206S)),No1103S)),No1114S,No305); ((((((No0906S,(No0910S,No1202S)),No1206S),(No306,(No304,No0913S))),No0908S),((((No0909S,No1208S),No1007S),No1103S),No0912S)),No1114S,No305); (((((((No0913S,No1202S),No0910S),No0906S),(No0908S,No1206S)),(No306,No304)),(No1103S,(No0912S,((No0909S,No1208S),No1007S)))),No1114S,No305); (((No304,((No1206S,((No0913S,(No1202S,No0910S)),No0906S)),(No306,No0908S))),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No1114S,No305); (((((No1206S,((No0913S,(No1202S,No0910S)),No0906S)),No0908S),(No304,No306)),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No1114S,No305); ((((No0908S,(No306,(No1206S,((No0913S,(No1202S,No0910S)),No0906S)))),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No304),No1114S,No305); (((((No0909S,No1208S),No1007S),(No1103S,No0912S)),((No306,(No0913S,No304)),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No1114S,No305); (((No1103S,No0912S),(((No0909S,No1208S),No1007S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304))))),No1114S,No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(No304,((((No0906S,(No0913S,(No1202S,No0910S))),No306),(No0908S,No1206S)),(No0912S,(No1103S,(No1208S,(No1007S,No0909S)))))),No305); (No1114S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),((No304,No0913S),No306)),No305); (((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No1114S,(No304,No0913S)),No306),No0908S),((No0906S,(No1202S,No0910S)),No1206S)),No305); (No0912S,(No1103S,((((No306,((No1114S,No304),No0913S)),(No0906S,(No1202S,No0910S))),(No1206S,(No1007S,(No0909S,No1208S)))),No0908S)),No305); (((((No1206S,No0908S),(No306,No304)),(((No1202S,No0910S),No0913S),No0906S)),No1114S),((No0912S,No1103S),(No1208S,(No1007S,No0909S))),No305); (No1114S,((((No306,No304),(((No1202S,No0910S),No0913S),No0906S)),(No1206S,No0908S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,(((No0913S,(No306,No304)),No1103S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),(No1007S,(No0909S,No1208S))),No305); (No1114S,(((No0908S,No1206S),(((No0913S,(No306,No304)),No0906S),(No1202S,No0910S))),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,(((No0908S,No1206S),((No306,(No304,No0913S)),(No0906S,(No1202S,No0910S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No0908S,No1206S),((No306,(No304,No0913S)),(No0906S,(No1202S,No0910S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (((No1114S,(No306,(No304,No0913S))),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),No305); (No1114S,((No0909S,(No1208S,No1007S)),(((No306,(No304,No0913S)),((No0906S,((No1202S,No0910S),No1206S)),No0908S)),(No0912S,No1103S))),No305); (No1114S,(((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),No1206S),(No0908S,(No306,(No304,No0913S)))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No0906S,(No1202S,No0910S)),((No306,(No304,No0913S)),(No1206S,No0908S)))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,(((No0912S,No1103S),((No1007S,No1208S),No0909S)),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))))),No305); ((No1208S,(No0909S,No1007S)),((No1114S,(No306,(No304,No0913S))),((No1206S,No0908S),(No1103S,((No0906S,(No1202S,No0910S)),No0912S)))),No305); ((((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(((No1208S,No1007S),No0909S),(No0912S,No1103S))),(No306,(No304,No0913S))),No1114S,No305); ((((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(((No1208S,No1007S),No0909S),(No0912S,No1103S))),(No306,(No304,No0913S))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((((No306,(No304,No0913S)),(No0908S,No1206S)),(No1202S,No0910S)),No0906S),(No0912S,No1103S))),No305); ((((No1114S,((No304,No0913S),No306)),No0906S),((No0908S,No1206S),(No1202S,No0910S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No0912S,No1103S))),No305); ((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No1114S,((No304,No0913S),No306))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),((No1202S,No0910S),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((No1206S,((No1202S,No0910S),No0906S)),No0908S),((No304,No0913S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1206S,((No1202S,No0910S),No0906S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (((((No0906S,(No1202S,No0910S)),No1206S),(No306,((No0913S,No304),No0908S))),(No0912S,(No1103S,(No1208S,(No1007S,No0909S))))),No1114S,No305); (((No0906S,((No306,(No0913S,No304)),((No0908S,No1206S),(No1202S,No0910S)))),((No0912S,(No0909S,(No1208S,No1007S))),No1103S)),No1114S,No305); (((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304))),((No0912S,(No1007S,(No0909S,No1208S))),No1103S)),No1114S,No305); (((((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304))),((No0912S,(No1007S,(No0909S,No1208S))),No1103S)),No1114S,No305); ((((((No1206S,No0908S),No0906S),(No1202S,No0910S)),(No306,(No0913S,No304))),(No0912S,((No1007S,(No0909S,No1208S)),No1103S))),No1114S,No305); ((No304,((((No0908S,((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),(No1206S,(No0906S,(No1202S,No0910S)))),No306),No0913S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No1114S,(No0913S,No304)))),No305); ((((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),No0908S)),No1114S,No305); ((((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),No0908S)),No1114S,No305); (((No0906S,(No1202S,No0910S)),(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(No0908S,No1206S))),(No1114S,(No306,(No0913S,No304))),No305); ((No304,(No306,(((No0912S,(No1103S,(No0909S,(No1208S,No1007S)))),(No0908S,No1206S)),(No0906S,(No0913S,(No1202S,No0910S)))))),No1114S,No305); ((No304,((No306,((((No1202S,No0910S),No0906S),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),(No0908S,No1206S))),No0913S)),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No0908S,No1206S),(((No0913S,No304),No306),((No1202S,No0910S),No0906S)))),No1114S,No305); ((No0908S,(((No0913S,No304),No306),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No1202S,No0910S),(No1206S,No0906S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((((No1202S,No0910S),No0913S),No304),No306),((No0908S,No1206S),No0906S)),(No0912S,No1103S))),No1114S,No305); ((No304,(No306,(((No0908S,((((No1208S,(No1007S,No0909S)),No0912S),No1103S),No1206S)),No0906S),((No1202S,No0910S),No0913S)))),No1114S,No305); ((No304,(No306,(((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(No1206S,No0908S)),(No0906S,(No1202S,(No0910S,No0913S)))))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No304,No306),(No1206S,No0908S)),(No0906S,(No0913S,(No1202S,No0910S))))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No0913S,No304)),((No1206S,No0908S),(No0906S,(No1202S,No0910S))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),(No1114S,(No306,(No0913S,No304))),No305); (No1114S,(((No306,(No0913S,No304)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),(No1007S,(No1208S,No0909S)))),No1103S),No305); (No1114S,(No304,(((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No306),No0913S)),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No0913S,No304)),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),((No306,(No0913S,No304)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((No306,(No0913S,No304)),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No1103S,(No0912S,(No1007S,(No1208S,No0909S)))))),No305); (No1114S,((No0913S,(((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No306)),No304),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S)))))),No305); ((((No0912S,(No0909S,(No1007S,No1208S))),No1103S),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); ((((No0912S,(No0909S,(No1007S,No1208S))),No1103S),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No304,No0913S),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S))))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),((((No304,No0913S),No306),(No0906S,(No0910S,No1202S))),(No0908S,No1206S))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No1103S,No0912S))),No1114S,No305); ((No304,(No306,((No0913S,(No0906S,(No0910S,No1202S))),(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(No0908S,No1206S))))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0908S,(((No306,No304),No0913S),(No0906S,((No0910S,No1202S),No1206S))))),(No0912S,No1103S)),No1114S,No305); (No0908S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0906S,(No1202S,No0910S)),No1206S),(No306,(No1114S,(No0913S,No304))))),No305); ((((No1103S,No0912S),(No1208S,(No0909S,No1007S))),((No306,No304),((No0908S,No1206S),(No0906S,(No0913S,(No1202S,No0910S)))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(((No0908S,No1206S),((No0906S,(No1202S,No0910S)),(No306,(No0913S,No304)))),(No0912S,No1103S))),No1114S,No305); (((No0912S,(((No0906S,((No0910S,No1202S),No1206S)),(((No304,No0913S),No306),No0908S)),No1103S)),(No1007S,(No1208S,No0909S))),No1114S,No305); (((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No304,No0913S),No306))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(((No1114S,(No304,No0913S)),No306),((No0912S,No1103S),(No0909S,(No1007S,No1208S))))),No305); (No1114S,(((((No0909S,No1007S),No1208S),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No0910S,No1202S),No0906S),((No306,(No304,No0913S)),(No0908S,No1206S)))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),((No306,(No304,No0913S)),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))))),No305); (No1114S,(((((No1206S,((No0910S,No1202S),No0906S)),No0908S),No306),(No304,No0913S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),(((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S)))),No1114S,No305); ((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No1114S,((No0913S,No304),No306)),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,(No304,((No306,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No0913S)),No305); (No1114S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((((No0906S,(No0913S,(No0910S,No1202S))),No1206S),(No304,No0908S)),No306)),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No304,No306),(No0906S,((No0913S,(No0910S,No1202S)),(No0908S,No1206S))))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(((No304,No0913S),No306),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No304,No0913S),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S)),No305); ((((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))))),(No1007S,(No0909S,No1208S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),((No0913S,No304),No306)),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),((No0913S,No304),No306)),No1114S,No305); ((No0912S,No1103S),(((No1206S,((No0906S,(No0910S,No1202S)),((No1114S,(No0913S,No304)),No306))),No0908S),(No1007S,(No0909S,No1208S))),No305); (No1114S,((No0913S,No304),(No306,((No0908S,((No1206S,No0906S),(No0910S,No1202S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No0912S,No1103S),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No306,(No304,No0913S))))),No305); (No1114S,((No0912S,No1103S),(((((No1206S,No0908S),No0910S),(No1202S,(No306,(No304,No0913S)))),No0906S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0913S,(No0906S,(No0910S,No1202S))),No306),((No1206S,No0908S),(((No0909S,(No1208S,No1007S)),No0912S),No1103S))),No304),No305); ((((((No0906S,(No0910S,No1202S)),(No304,No0913S)),(No1206S,No0908S)),No306),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((((No1206S,No0906S),(No0910S,No1202S)),((No304,No0913S),No0908S)),No306),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0906S,((No0910S,No1202S),No1206S))),((No0913S,No304),No306)),No0908S),No305); (No1114S,(((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),((No0906S,(No0910S,No1202S)),(No0913S,No304))),No306)),No305); (No1114S,(No0912S,((((((No0908S,No1206S),No0906S),(No0910S,No1202S)),(No306,(No0913S,No304))),(No1007S,(No0909S,No1208S))),No1103S)),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(((No0912S,(No1007S,(No0909S,No1208S))),No1103S),(No0913S,No304)))),No305); (No1114S,(((No1208S,(No1007S,No0909S)),(No1103S,No0912S)),(No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No1103S,No0912S),(((No0908S,(No306,(No304,No0913S))),(No1206S,(No0906S,(No0910S,No1202S)))),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((No1103S,No0912S),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))))),No305); (No1114S,((((No0913S,(No0906S,(No0910S,No1202S))),(No0908S,No1206S)),(No306,No304)),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); ((((No1103S,(No0912S,((No1208S,No0909S),No1007S))),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(((No0913S,No304),No306),No1114S),No305); (((((No1208S,No0909S),No1007S),(No1103S,No0912S)),((No0908S,No1206S),(((No0913S,No304),No306),(No0906S,(No0910S,No1202S))))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No0912S,(((No1114S,(No0913S,No304)),No306),(((No0910S,No1202S),(No0908S,No1206S)),No0906S)))),No1103S,No305); (No1114S,(((No0913S,No304),No306),(((No0908S,No1206S),((No0910S,No1202S),No0906S)),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)))),No305); (No1114S,(((((No0913S,No304),No306),((No1206S,(No1202S,No0910S)),No0906S)),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)))),No305); ((((No1103S,No0912S),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),((No1208S,No0909S),No1007S)),No1114S,No305); (((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,(No1208S,(No0909S,No1007S)))),((No0913S,No304),No306))),No1114S,No305); ((((No1206S,(No0906S,(No0910S,No1202S))),(((No0913S,No304),No306),((No1103S,No0912S),(No1007S,(No1208S,No0909S))))),No0908S),No1114S,No305); (((No0912S,((No0909S,(No1007S,No1208S)),No1103S)),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306))),No1114S,No305); (((No0912S,((No1007S,(No1208S,No0909S)),No1103S)),(((No1206S,(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),No0908S)),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No1103S,No0912S),(((No1206S,(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),No0908S))),No1114S,No305); ((((No0908S,No1206S),((No0910S,No1202S),No0906S)),(No1114S,((No0913S,No304),No306))),((No1103S,No0912S),(No0909S,(No1007S,No1208S))),No305); (No1114S,(((((No0908S,No1206S),No0906S),(((No0913S,No304),No306),(No0910S,No1202S))),(No1208S,(No0909S,No1007S))),(No1103S,No0912S)),No305); (No1114S,((No0906S,(((No0913S,No304),No306),((No0908S,No1206S),(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No306,(No304,No0913S)),No1206S),((No0906S,(No1202S,No0910S)),No0908S)))),No1114S,No305); ((((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),(No0912S,No1103S))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),No0912S),No1103S)),No1114S,No305); (((No0908S,(No306,((No304,No0913S),((No0906S,No1202S),(No0910S,No1206S))))),(((No1007S,(No1208S,No0909S)),No0912S),No1103S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No1114S,(((No1206S,No0908S),(No0913S,((No1202S,No0910S),No0906S))),(No306,No304))),No305); (No1114S,((((No1206S,No0906S),No0908S),(((No1202S,No0910S),(No304,No0913S)),No306)),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); ((((No1114S,(No304,No0913S)),No306),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); ((((No304,No0913S),No306),((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No0908S,((No1206S,No0906S),(No1202S,No0910S))))),No1114S,No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),(((((No0910S,No1202S),No0906S),No1206S),No0908S),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No306,(No0913S,No304)))),No305); ((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No0910S,No1202S),No0906S),(No1206S,No0908S)),(No1114S,(No306,(No0913S,No304))))),No305); (No1114S,(No306,((No0908S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0910S,No1202S),(No0913S,No304)))),(No1206S,No0906S))),No305); (No1114S,(No306,(((No0908S,(No1206S,((No0910S,No1202S),No0906S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),(No0913S,No304))),No305); (No1114S,((No1007S,(No1208S,No0909S)),(((((No0913S,No304),No306),No0908S),(No1206S,((No0910S,No1202S),No0906S))),(No0912S,No1103S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No0912S,(No1103S,(No1007S,(No1208S,No0909S)))),(((((No0910S,No1202S),No0906S),No1206S),((No0913S,No304),No306)),No0908S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),(No0912S,(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306)),No1103S))),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),((No0913S,No304),No306)),(((No0909S,(No1007S,No1208S)),No1103S),No0912S)),No305); (No1114S,((No306,(No0913S,No304)),(((No0910S,No1202S),No0906S),(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(No0908S,No1206S)))),No305); (No1114S,(((No0913S,No306),((((No0906S,(No0910S,No1202S)),No1206S),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No0908S)),No304),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,((No1103S,(No0912S,(No0909S,(No1007S,No1208S)))),(No306,((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),(No304,No0913S)))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (((No0909S,(No1208S,No1007S)),No1114S),(((((No0908S,No1206S),((No0910S,No1202S),No0906S)),((No0913S,No304),No306)),No1103S),No0912S),No305); ((((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),((No0910S,No1202S),No0906S)),(No1206S,No0908S)),(No1114S,((No0913S,No304),No306)),No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0910S,No1202S),(No1206S,No0906S)),(No0908S,((No0913S,No304),No306)))),No1114S,No305); (((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((((No0906S,No0910S),No1202S),(No0908S,No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),No0912S),No1103S),(((((No0910S,No1202S),No1206S),No0906S),No0908S),((No0913S,(No1114S,No304)),No306)),No305); (((No0912S,(((No0908S,(((No0906S,No1202S),No0910S),No1206S)),((No0913S,No304),No306)),(No0909S,(No1208S,No1007S)))),No1103S),No1114S,No305); ((No0908S,(((No0913S,No304),No306),(((No0906S,(No1007S,(No0909S,No1208S))),(No0912S,(No1202S,No0910S))),(No1206S,No1103S)))),No1114S,No305); (((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No0906S,((No1202S,No0910S),No1206S))))),((No0909S,(No1208S,No1007S)),No1114S),No305); (No1114S,((No0912S,No1103S),(((No0906S,(No1202S,No0910S)),((No0908S,No1206S),((No0913S,No304),No306))),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))),No305); (No1114S,((No1103S,No0912S),(((No0906S,(No1202S,No0910S)),((No0909S,(No1208S,No1007S)),(No0908S,No1206S))),((No0913S,No304),No306))),No305); (No1114S,(No1103S,(No0912S,((No0909S,(No1208S,No1007S)),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S)))))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),((((((No1202S,No0910S),No0913S),No304),No306),No0906S),(No0908S,No1206S))),(No1103S,No0912S)),No305); (No1114S,((No0908S,(No1206S,(((No0913S,No304),No306),((No1202S,No0910S),No0906S)))),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((((No0913S,No304),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); ((((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No0913S,No304),No306)),(No0912S,No1103S)),(No1114S,(No1007S,(No0909S,No1208S))),No305); (((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No1114S,(No306,(No0913S,No304)))),No305); (No1114S,(((No1206S,No0908S),(((No1202S,No0910S),No0906S),(No306,(No0913S,No304)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No306,(No0913S,No304)),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304))))),No305); (No1114S,((((No306,No0913S),(((No1202S,No0910S),No0906S),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No304),No305); (No1114S,((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S)))),No305); (((No1103S,No0912S),(((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((No1103S,No0912S),(((No306,(No304,No0913S)),(((No1202S,No0910S),No0906S),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304)))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No0908S,No1206S),No0906S),(No306,(((No1202S,No0910S),No0913S),No304)))),No1114S,No305); (((No0913S,(No306,((((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0906S,(No1202S,No0910S))))),No304),No1114S,No305); ((((No1206S,(No0913S,(No0906S,(No1202S,No0910S)))),(No306,(No0908S,((No0909S,(No1208S,No1007S)),(No0912S,No1103S))))),No304),No1114S,No305); (((No0908S,((No306,(No304,(No0913S,(No1202S,No0910S)))),(No0906S,No1206S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No1114S,No305); ((No304,((No306,((((No1202S,No0910S),No0906S),No1206S),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No0908S))),No0913S)),No1114S,No305); (((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),(No306,((No0913S,No304),No1114S))),No305); (No1114S,((((((((No1202S,No0910S),No0906S),No1206S),No306),No0908S),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No0913S),No304),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No306,(No0913S,No304)),((No1202S,((No1206S,No0906S),No0910S)),No0908S))),No305); (((No306,((No304,(No1206S,(No0906S,((No0910S,No1202S),No0913S)))),No0908S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((No304,((((No0906S,(No0913S,(No0910S,No1202S))),(No0908S,No1206S)),No306),((No1208S,(No1007S,No0909S)),(No0912S,No1103S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),(No0912S,(No1103S,((No0908S,((No1206S,(No0910S,No1202S)),No0906S)),((No304,No0913S),No306))))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),((No0908S,((No1206S,(No0910S,No1202S)),No0906S)),((No304,No0913S),No306))),(No0912S,No1103S)),No1114S,No305); ((((((No0906S,(No0913S,(No0910S,No1202S))),No306),(No1206S,No0908S)),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No304),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((((((No0913S,No304),No306),No0906S),((No0910S,No1202S),(No0908S,No1206S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (No1114S,(No306,((((No0913S,No304),No0908S),((No1103S,(No1007S,(No0909S,No1208S))),No0912S)),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(No306,(No0913S,No304))))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((((No306,(No0913S,No304)),(((No0910S,No1202S),No0906S),No1206S)),No0908S),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((((No306,(No0913S,No304)),No0906S),(No0908S,(No0910S,No1202S))),No1206S))),No305); (No1114S,(((No0908S,(No306,(No0913S,No304))),(((No0910S,No1202S),No0906S),No1206S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1206S,No0908S),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),(No306,(No0913S,No304))),No305); (No1114S,(((((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),(No1103S,No0912S)),((No1208S,No1007S),No0909S)),No305); ((No304,((No0913S,No306),(No0908S,((No1206S,(No0906S,(No0910S,No1202S))),(((No1208S,No1007S),No0909S),(No0912S,No1103S)))))),No1114S,No305); (((No0912S,No1103S),((((No1206S,(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)),No0908S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No1114S,No304),No0913S),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),No305); ((((((No0910S,No1202S),(No1206S,No0906S)),No0908S),((No304,No0913S),No306)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((No0908S,((((No304,No0913S),No1114S),No306),((No0910S,No1202S),(No1206S,No0906S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); ((((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),((No304,No0913S),No306)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); ((No0908S,(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No306,(No1114S,(No304,No0913S)))),(No0906S,(No0910S,No1202S)))),No1206S,No305); (No1114S,((No306,(No304,No0913S)),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No1206S),(No0908S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No0908S,(No1206S,(No0910S,(No0906S,No1202S)))),(No306,(No304,No0913S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,((No306,No304),(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No305); (No1114S,((((((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),No0912S),(No1103S,No306)),No0908S),(No1007S,(No0909S,No1208S))),No304),No305); ((((No304,No1114S),No0913S),No306),(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No306,(No304,No0913S)),((No0910S,No1202S),No0906S)),(No1206S,No0908S))),No1114S,No305); ((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),((No1114S,(No306,(No304,No0913S))),((No1206S,((No0910S,No1202S),No0906S)),No0908S)),No305); (No1114S,((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(No0908S,No1206S)))),No305); (No1114S,(((((((No0908S,No1206S),No0906S),(No306,(No304,No0913S))),(No0910S,No1202S)),(No0909S,(No1208S,No1007S))),No0912S),No1103S),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No0912S,No1103S),((No304,No0913S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),No306)))),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No304,No0913S),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),((((((No0906S,No0910S),No1202S),No1206S),No0908S),((No304,No0913S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))))),No305); ((((No0913S,No304),No306),No1114S),(((No1103S,No0912S),((No0909S,No1208S),No1007S)),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),(No0908S,((No0906S,(No1206S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,((No0912S,No1103S),(((No0909S,No1208S),No1007S),(((No0906S,(No1202S,No0910S)),No1206S),(((No0913S,No304),No306),No0908S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No1202S,No0910S)),No1206S))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,((No0906S,(No1202S,No0910S)),No1206S))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No305); (No1114S,((((No0913S,No304),No306),(((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No1103S,((No0909S,No1208S),No1007S)))),No0912S),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),((No0913S,(No304,No306)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); (No1114S,(((No0912S,No1103S),((No0909S,No1208S),No1007S)),(((No306,(No0913S,No304)),(No0906S,(No1206S,No0908S))),(No1202S,No0910S))),No305); (No1114S,(No304,((No0913S,No306),(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No1206S,((No0910S,No1202S),No0906S)),No0908S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0906S,(No1206S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No304,No0913S),No306)))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(((No0906S,((No0908S,No1206S),(No1202S,No0910S))),((No304,No0913S),No306)),((No0912S,No1103S),((No1208S,No0909S),No1007S))),No305); (No1114S,(No304,((No0913S,No306),(No0908S,(((((No1208S,No0909S),No1007S),No0912S),No1103S),(No1206S,((No1202S,No0910S),No0906S)))))),No305); (No1114S,(((No304,No0913S),No306),((((No1202S,No0910S),No0906S),No1206S),(No0908S,((((No1208S,No0909S),No1007S),No0912S),No1103S)))),No305); (No1114S,((((No304,No0913S),No306),((No1206S,No0908S),((No0910S,No1202S),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((((No0910S,No1202S),(No1206S,No0906S)),No0908S),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(((No304,No0913S),No306),(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,No1206S),((No1202S,No0910S),No0906S)))),No305); (No1114S,((No1208S,(No1007S,No0909S)),((No0912S,No1103S),(No306,((No0908S,((No1202S,No0910S),((No304,No0913S),No1206S))),No0906S)))),No305); (((No0912S,((No1007S,(No0909S,No1208S)),No1103S)),((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No304,No0913S),No306)))),No1114S,No305); ((((No0912S,No1103S),((((No1202S,No0910S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306))),(No1007S,(No0909S,No1208S))),No1114S,No305); (No1114S,((No0912S,No1103S),((((No0908S,No1206S),((No1202S,No0910S),No0906S)),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No305); ((((((No0908S,(No0909S,(No1007S,No1208S))),((No0906S,(No0910S,No1202S)),No1206S)),((No0913S,No304),No306)),No0912S),No1103S),No1114S,No305); (((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No0908S,No1206S))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((No0913S,No304),No306),((No0908S,No1206S),((No0910S,No1202S),No0906S))))),No1114S,No305); (((((No0913S,No304),No306),((No0908S,No1206S),((No0910S,No1202S),No0906S))),((No1103S,No0912S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),((((No0913S,(No0910S,No1202S)),No0906S),(No304,(No0908S,No1206S))),No306))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((((No0910S,No1202S),No0906S),No1206S),No0908S),((No0913S,No304),No306)))),No1114S,No305); (((No0913S,No304),(No306,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0910S,No1202S),No0906S),(No1206S,No0908S))))),No1114S,No305); (((No0912S,No1103S),((((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((((No1007S,No1208S),No0912S),No1103S),No0909S)),No1114S,No305); ((((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),((No0913S,(No1114S,No304)),No306)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306))),No305); ((No1007S,(No1208S,No0909S)),((No1103S,((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),No0912S)),((No0913S,(No1114S,No304)),No306)),No305); ((No304,((No1206S,(No0906S,(No0913S,(No0910S,No1202S)))),((((No1103S,No0912S),(No0909S,(No1007S,No1208S))),No0908S),No306))),No1114S,No305); ((No0912S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,((No1007S,(No1208S,No0909S)),No1202S))))),No1103S)),No1114S,No305); ((((No1202S,No0910S),(((No304,No0913S),No306),((No0908S,No1206S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No1114S,No305); ((((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),(((No1007S,(No1208S,No0909S)),No1103S),No0912S)),No1114S,No305); (((((((No0910S,No1202S),No0906S),No1206S),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((((No0910S,No1202S),No0906S),No1206S),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No304,No0913S))),(((No0909S,(No1007S,(No1208S,No1114S))),No0912S),No1103S),No305); (No1114S,((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),((((No1208S,(No1007S,No0909S)),No0912S),No1103S),No0908S))),No305); (No1114S,((((No1208S,(No1007S,No0909S)),No0912S),No1103S),(((No0910S,No1202S),No0908S),((No306,(No304,No0913S)),(No1206S,No0906S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No0912S,No1103S),(((No304,((No0906S,(No0910S,No1202S)),No0913S)),((No0908S,No1206S),No306)),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,((No1202S,No0910S),No0906S))))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,(No304,No0913S)),((No0906S,(No1202S,No0910S)),(No1206S,No0908S))))),No305); (No1114S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No0913S,(No306,No304))))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,((No1114S,No304),No0913S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); ((No304,(((No0906S,((No1202S,No0910S),No0913S)),(((No0912S,No1103S),(No1208S,(No0909S,No1007S))),(No1206S,No0908S))),No306)),No1114S,No305); (((No0912S,No1103S),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),((No1007S,(No1208S,No0909S)),No1114S),No305); (((No1206S,No0908S),((No306,(No0913S,No304)),((No1202S,No0910S),No0906S))),(No1114S,((No1103S,No0912S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,(((No0908S,((No306,(No0913S,No304)),((No1202S,No0910S),(No1206S,No0906S)))),(No0912S,No1103S)),(No1007S,(No1208S,No0909S))),No305); (No1114S,((No0908S,(((No306,(No0913S,No304)),((No1202S,No0910S),No1206S)),No0906S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No1114S,(No306,(No304,No0913S)))),No305); (No1114S,(((No0908S,(((No0906S,No0910S),No1202S),No1206S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),(No306,(No304,No0913S))),No305); (No1114S,((((No0910S,(No0906S,(No0908S,No1206S))),No1202S),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),(No304,(No0913S,No306))),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),No0908S),(No1206S,((No1202S,No0910S),No0906S))))),No305); (((No0912S,No1103S),(No1208S,(No0909S,No1007S))),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),(((No1114S,No304),No0913S),No306)),No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No1206S,((No1202S,No0910S),No0906S)),(((No304,No0913S),No306),No0908S))),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,((No0906S,(No1206S,(No1202S,No0910S))),No0908S)),(No304,No0913S)))),No1114S,No305); (((((No306,(No1103S,((No1202S,No0910S),No0913S))),((No0906S,(No1208S,(No0909S,No1007S))),(No0908S,No1206S))),No0912S),No304),No1114S,No305); ((((No306,((No0912S,No1103S),(No0908S,No1206S))),(No0906S,((No1202S,No0910S),No0913S))),No304),((No1007S,(No1208S,No0909S)),No1114S),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(((No0913S,No304),No306),(No0908S,((No1206S,No0906S),(No0910S,No1202S))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),(((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((((No0913S,No304),No306),(No0910S,No1202S)),(No1206S,No0906S)),No0908S)),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,(No304,(No0913S,(No306,(((No1206S,No0908S),(No0906S,(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No1208S,No0909S))))))),No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No1206S,((No0908S,No0906S),(No0910S,No1202S))),((No0913S,No304),No306))),No1114S,No305); ((No0912S,((((No0906S,(No0910S,No1202S)),((No1206S,No0908S),((No0913S,No304),No306))),(No0909S,(No1007S,No1208S))),No1103S)),No1114S,No305); (((No0906S,(((No1206S,No0908S),((No0910S,No1202S),(No0913S,No304))),No306)),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No1103S,No0912S),((No1007S,(No1208S,No0909S)),(((No1202S,(No0906S,No0910S)),(No306,(No0913S,No304))),(No1206S,No0908S)))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((((No0906S,(No0913S,(No0910S,No1202S))),(No306,No304)),(No1206S,No0908S)),(No1103S,No0912S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No306,(No0913S,No304))),(No1206S,No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((((No0906S,(No0910S,No1202S)),No0912S),No1103S),(No0908S,No1206S)),(No306,(No0913S,No304))),(No1007S,(No1208S,No0909S))),No1114S,No305); (((((No306,(No0913S,No304)),((No0910S,No1202S),((No0908S,No1206S),No0906S))),No1103S),No0912S),((No0909S,(No1007S,No1208S)),No1114S),No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No0913S,No304))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S)))),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S)))),No1114S,No305); ((((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),((((No0906S,(No0910S,No1202S)),No1206S),(No306,(No304,No0913S))),No0908S)),No1114S,No305); ((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),No1206S),((No306,(No304,No0913S)),No0908S))),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No306,((No304,No0913S),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))))),No1114S,No305); (((No0912S,No1103S),((((No304,No0913S),No306),(No0908S,No1206S)),((No0906S,(No0910S,No1202S)),(No1007S,(No1208S,No0909S))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(No0912S,No1103S))),No1114S,No305); (((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No304,No0913S),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (No1114S,((((No0906S,(No0910S,No1202S)),((((No304,No0913S),No306),No0908S),(((No1208S,No1007S),No0909S),No1206S))),No1103S),No0912S),No305); ((No0909S,(No1208S,No1007S)),((No1103S,((No0908S,No0912S),((No0906S,(No0910S,No1202S)),No1206S))),(No1114S,((No304,No0913S),No306))),No305); (No1114S,((((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No305); (No1114S,(((((No0906S,No1206S),(No1202S,No0910S)),(No0912S,(No1103S,(No1007S,(No0909S,No1208S))))),No0908S),((No304,No0913S),No306)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((((No304,No0913S),No306),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (((No1007S,(No0909S,No1208S)),No1114S),((No0912S,No1103S),(((No304,No0913S),No306),((No1206S,((No1202S,No0910S),No0906S)),No0908S))),No305); (No1114S,((No0912S,No1103S),((No0908S,(No1206S,((No1202S,No0910S),No0906S))),((No1007S,(No0909S,No1208S)),((No304,No0913S),No306)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(No0908S,(No0906S,(No1206S,(No1202S,No0910S)))))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No0912S,No1103S)),(((No1206S,No0908S),No0906S),((No0910S,No1202S),((No304,No0913S),No306)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No1206S,No0908S),(No0906S,(No0913S,(No0910S,No1202S)))),(No304,No306))),No305); (No1114S,((No0912S,No1103S),(No306,((No1007S,(No0909S,No1208S)),((No0908S,No304),(No1206S,(No0906S,((No0910S,No1202S),No0913S))))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((((No0913S,No304),No306),(No0906S,(No0910S,No1202S))),(No1206S,No0908S))),No305); (No1114S,((No0912S,No1103S),((((No0913S,No304),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S)),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(((No0906S,(No0910S,No1202S)),No1206S),No0908S)),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No0910S,No1202S),No0906S),(((No0913S,No304),No306),(No1206S,No0908S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((No0908S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No1206S,((No0910S,No1202S),No0906S)))),(No1114S,((No0913S,No304),No306)),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0912S,No1103S),((No1208S,No1007S),No0909S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No304,No0913S),No306),(No0908S,(((No0906S,No1202S),No1206S),No0910S)))),No305); (No1114S,((No0912S,No1103S),((((No304,No0913S),No306),(No0909S,(No1208S,No1007S))),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No1114S,(No304,No0913S)),No306)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S)),No305); ((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),((No306,(No0913S,No304)),No1114S)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S)),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No1206S,No0908S)),(No306,(No0913S,No304))),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0906S,(No1206S,No0908S)),(No306,(((No1202S,No0910S),No0913S),No304))),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No0913S,No304),No306),(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S)))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No1103S,No0912S),(No306,((No0908S,(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))),No304)))),No305); (No1114S,((No306,((No0913S,No304),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))),(((No1208S,(No0909S,No1007S)),No0912S),No1103S)),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No306,(No304,No0913S))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No306,(No304,No0913S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No0906S,((No0910S,No1202S),((No304,No306),No0913S))),(No0908S,No1206S)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No304,No306),No0913S),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No305); (No1114S,(No304,(((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No306),No0913S)),No305); (No1114S,((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No306,((No0913S,No304),((No1202S,(No1206S,No0910S)),No0906S))),No0908S)),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No0913S,No304)),(((No1202S,No0910S),No0906S),(No0908S,No1206S)))),No305); (No1114S,((No0912S,(No1208S,(No0909S,(No1103S,No1007S)))),(((No306,(No0913S,No304)),(No1206S,((No1202S,No0910S),No0906S))),No0908S)),No305); (No1114S,(((No0912S,(No0909S,(No1007S,No1208S))),No1103S),((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No306,(No0913S,No304)))),No305); (No1114S,((No0912S,((((((No1202S,No0910S),No1206S),No0906S),((No0913S,No304),No0908S)),No306),(No1007S,(No1208S,No0909S)))),No1103S),No305); ((No0909S,((No1114S,No1007S),No1208S)),((No0912S,No1103S),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(((No0906S,(No0910S,No1202S)),No1206S),(No0908S,(No306,(No304,No0913S))))),(No0912S,No1103S)),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No304,No0913S))),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); ((((((No0906S,(No0913S,(No0910S,No1202S))),(No1206S,No0908S)),No306),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No304),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No304,No306),(No1206S,No0908S)),(No0906S,(No0913S,(No0910S,No1202S)))))),No1114S,No305); (((((No0910S,(No0906S,No1202S)),(No1206S,No0908S)),((No304,No0913S),No306)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No306,((((No0910S,No1202S),No1206S),No0906S),(No304,No0913S))),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No0912S,No1103S),(((No0909S,No1208S),No1007S),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No304,No0913S),No306)))),No1114S,No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),(((No304,No0913S),No306),No1114S),No305); (((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),(((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S)),No1114S,No305); ((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),((No306,(No1114S,(No304,No0913S))),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),No305); ((No1103S,(No0912S,((No0909S,(No1208S,No1007S)),((No1206S,(No306,(No304,No0913S))),((No0906S,(No0910S,No1202S)),No0908S))))),No1114S,No305); (((((No0908S,No1206S),(No306,(No304,No0913S))),(No0906S,(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No306,((No304,No0913S),No0908S)),((No1206S,No0906S),(No0910S,No1202S))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); ((((No1103S,No0912S),(No1208S,(No1007S,No0909S))),(((No1206S,(No306,(No304,No0913S))),((No0908S,No1202S),No0906S)),No0910S)),No1114S,No305); ((No304,((No306,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No1206S,No0908S),((No0910S,No1202S),No0906S)))),No0913S)),No1114S,No305); (((No1103S,(No0912S,(No0909S,(No1208S,No1007S)))),(No0908S,(((No0910S,No1202S),No0906S),No1206S))),(No1114S,((No0913S,No304),No306)),No305); (No1114S,(((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),((No0913S,No304),No306)),No305); (No1114S,((((No0908S,((No0913S,(No0910S,No1202S)),No306)),(No1206S,(((No1208S,(No1007S,No0909S)),No0912S),No1103S))),No0906S),No304),No305); (No1114S,(((No0908S,No1206S),((No1202S,No0910S),((No306,(No304,No0913S)),No0906S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((No0906S,(((No0908S,No1206S),(No1202S,No0910S)),(No306,(No304,No0913S)))),((No1114S,(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,((((No1007S,No0909S),No1208S),(No0912S,No1103S)),((No0908S,(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))),(No306,No304))),No305); (No1114S,((((No1007S,(No0909S,No1208S)),(No0912S,No0908S)),((No1206S,(No0906S,(No1202S,No0910S))),No1103S)),(No306,(No0913S,No304))),No305); (((No0908S,(No306,(No1114S,(No0913S,No304)))),(No1206S,(No0906S,(No1202S,No0910S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),No305); ((((No0908S,No1206S),(((No306,(No0913S,No304)),No0906S),(No1202S,No0910S))),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No1114S,No305); (((((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))),(No1007S,(No0909S,No1208S))),No0912S),No1103S),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (No1114S,((((No1206S,((No1202S,No0910S),No0906S)),(No0908S,((No0913S,No304),No306))),(No1208S,(No1007S,No0909S))),(No0912S,No1103S)),No305); (No1114S,(((No0912S,No1103S),(((No0913S,No304),No306),(No0908S,(No1206S,((No1202S,No0906S),No0910S))))),(No1007S,(No0909S,No1208S))),No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0912S,No1103S),((No1208S,No1007S),No0909S))),(No306,(No0913S,No304))),No1114S,No305); ((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No1114S,(No0913S,No304))),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))),No305); (((No1007S,(No0909S,No1208S)),(((No0913S,No306),No304),((No0912S,(No0906S,(No1202S,No0910S))),(No1103S,(No0908S,No1206S))))),No1114S,No305); (No1114S,((No0912S,No1103S),((No1007S,(No0909S,No1208S)),(((No0908S,No1206S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)))),No305); (No1114S,((No304,No306),((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No0908S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S)))))),No305); (No1114S,(No304,(No306,((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),No0908S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0913S,No304),No306),(No0908S,(No0906S,((No1202S,No0910S),No1206S))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No0913S,No304),No306)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0906S,(No0910S,No1202S)),((No0913S,No304),No306)),(No0908S,No1206S))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(((No0913S,No304),No306),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No1114S,No305); (((((No0909S,No1208S),No1007S),(No0912S,No1103S)),((No306,(No0913S,No304)),((No0906S,(No1202S,No0910S)),(No0908S,No1206S)))),No1114S,No305); (((No306,(No0913S,No304)),(((No1202S,No0910S),((((No0909S,No1208S),No1007S),(No0912S,No1103S)),(No0908S,No1206S))),No0906S)),No1114S,No305); (((No0909S,(No1208S,No1007S)),(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),(No0912S,No1103S))),No1114S,No305); ((No1114S,(No306,(No0913S,No304))),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304)))),No1114S,No305); ((((No0912S,No1103S),(No1208S,(No1007S,No0909S))),((No0906S,(No1202S,No0910S)),((No1206S,No0908S),(No304,(No306,No0913S))))),No1114S,No305); ((No304,((((No0906S,((No0912S,No1103S),((No1007S,No0909S),No1208S))),(No1206S,No0908S)),No306),((No1202S,No0910S),No0913S))),No1114S,No305); (((((No0909S,No1208S),No1007S),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S)))),(No0912S,No1103S)),No1114S,No305); (((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,No0908S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No1206S,No0908S),(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0913S,No304),No306),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No0913S,No304),(No306,(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))))),No1114S,No305); (((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No0913S,No304),No306)))),No1114S,No305); ((No1114S,((No0912S,No1103S),(No0908S,(((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S))))))),(No1007S,(No0909S,No1208S)),No305); (((((No0913S,No304),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),(((No1007S,No1208S),No0909S),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),((No0910S,No1202S),(No1206S,No0908S))),No0906S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0913S,No304),No306),((No0910S,No1202S),(No1206S,No0908S))),No0906S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); (((No0913S,(No306,(((No0906S,(No0910S,No1202S)),No1206S),(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No0908S)))),No304),No1114S,No305); (((No0912S,No1103S),(No1206S,((No0906S,No0908S),((No0910S,No1202S),((No304,No0913S),No306))))),(No1114S,(No1007S,(No1208S,No0909S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((((No304,No0913S),No306),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),(No0912S,No1103S))),No305); (No1114S,((No1103S,(No0912S,(No1007S,(No0909S,No1208S)))),((((No304,No0913S),No306),(No1206S,No0908S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,(No1103S,(No0912S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),(No0909S,(No1208S,No1007S))))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No1103S,No0912S)),(((No304,No0913S),(No306,No0908S)),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0906S,(No0910S,No1202S)),(((No304,No0913S),No306),(No0908S,No1206S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0906S,(No0910S,No1202S)),(((No304,No0913S),No306),(No0908S,No1206S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0906S,((No0910S,No1202S),(No0908S,No1206S))),((No304,No0913S),No306))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(No306,((((No0910S,No1202S),(No304,No0913S)),No0906S),(No0908S,No1206S)))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No1206S),((No1202S,No0910S),No0906S)),(No306,(No304,No0913S)))),No305); (((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(No1114S,((No1206S,((No1202S,No0910S),No0906S)),(No306,(No0908S,(No304,No0913S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No1206S,((No1202S,No0910S),No0906S)),(No306,(No304,No0913S))),No0908S),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,((No1208S,No0909S),No1007S)))),No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,((No1208S,No0909S),No1007S)))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No1114S,(No0913S,(No304,No306)))),(No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),No305); (No1114S,((No306,((((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),(No1206S,No0908S)),(No0906S,(No0913S,(No0910S,No1202S))))),No304),No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No306,((No0913S,No304),No1114S)),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),No305); ((((((No0913S,No306),(No0906S,(No1202S,No0910S))),(No0908S,((No1007S,(No1208S,No0909S)),(No0912S,No1103S)))),No1206S),No304),No1114S,No305); (((No0908S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No0913S,No306),(No1206S,(No0906S,(No1202S,No0910S)))))),No304),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),((No304,No0913S),No306)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (No1114S,((((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306)),(No1103S,(No0912S,(No0909S,(No1007S,No1208S))))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),((No0908S,No1206S),(No0913S,No304))),No306),(No1208S,(No0909S,No1007S))),(No1103S,No0912S)),No305); (No1114S,(((No0908S,(((No1206S,No0906S),(No0910S,No1202S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S)))),No306),(No0913S,No304)),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No0913S,No304))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No305); (No1114S,((No0906S,((No1206S,No0908S),((No306,(No0913S,No304)),(No0910S,No1202S)))),((No1103S,No0912S),((No1208S,No1007S),No0909S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No0906S,(No0910S,No1202S)),No1206S),((No306,(No0913S,No304)),No0908S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,((No306,(No0913S,No304)),((((No0906S,No1206S),(No1202S,No0910S)),No0908S),((No1208S,(No1007S,No0909S)),(No1103S,No0912S)))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(((No306,(No0913S,No304)),((No1202S,No0910S),No0906S)),(No0908S,No1206S))),No305); (((((((No304,No0913S),No0908S),(No306,((No1202S,No0910S),(No1206S,No0906S)))),(No0909S,(No1208S,No1007S))),No1103S),No0912S),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No1103S,No0912S),((((No0906S,(No1206S,No0910S)),No1202S),((No306,No304),No0913S)),No0908S))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No306,(No304,No0913S))),(No1206S,No0908S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,((No0910S,No1202S),No1206S)),(No306,(No304,No0913S))),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No0906S,((No0910S,No1202S),No1206S)),(No306,(No304,No0913S))),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No306,(No304,No0913S)),(((No0908S,(No0906S,(No0910S,No1202S))),No1206S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0912S,No1103S),((No306,((No0906S,(No0913S,(No0910S,No1202S))),(No304,No0908S))),No1206S))),No1114S,No305); (((No304,No306),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No0906S,(No0913S,(No0910S,No1202S)))),(No0908S,No1206S))),No1114S,No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No0913S,No304)),((No0906S,(No1206S,(No0910S,No1202S))),No0908S))),No1114S,No305); (((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),((No306,(No0913S,No304)),((No1206S,((No0910S,No1202S),No0906S)),No0908S))),No1114S,No305); (No0906S,(((No0912S,((No1208S,(No1007S,No0909S)),No1103S)),(No306,(No1114S,(No304,No0913S)))),((No1206S,No0908S),(No1202S,No0910S))),No305); ((((No0912S,No1103S),((No306,(No304,No0913S)),((No1206S,No0908S),((No1202S,No0910S),No0906S)))),(No1208S,(No1007S,No0909S))),No1114S,No305); (((No0912S,No1103S),(((No0908S,((No1202S,No0910S),(No1206S,No0906S))),(No306,(No304,No0913S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0913S,(No1202S,No0910S)),((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(No0908S,No1206S)),No0906S)),No306),No304),No1114S,No305); (((No0913S,(No306,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),(((No0906S,(No1202S,No0910S)),No1206S),No0908S)))),No304),No1114S,No305); (((No0912S,No1103S),((((No0910S,(No0906S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((((No1206S,(No1202S,No0910S)),No0906S),No0908S),((No306,No304),No0913S)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((((((No1202S,No0910S),No1206S),No0906S),No306),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No0908S),No0913S),No304),No1114S,No305); (((No0913S,No304),(((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No1202S,No0910S),No1206S),No0906S)),No0908S),No306)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S)),No1114S,No305); (No1114S,((No1103S,((No1007S,(No1208S,No0909S)),No0912S)),(((No304,No0913S),No306),((No1206S,(No0906S,(No1202S,No0910S))),No0908S))),No305); ((No1114S,((No304,No0913S),No306)),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((((No304,No0913S),No306),No0908S),(No1206S,(No0906S,(No1202S,No0910S)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No306,No0908S),(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No304),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,No304),((No0906S,(No0913S,(No0910S,No1202S))),(No0908S,No1206S)))),No305); (No1114S,((((No1208S,(No0909S,No1007S)),No0912S),No1103S),((No306,No304),(No0908S,(No1206S,(No0906S,(No0913S,(No0910S,No1202S))))))),No305); (((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,(No1114S,No304)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); ((((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,No304))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No1114S,No305); ((((((No0908S,No1206S),((No0906S,(No0913S,(No1202S,No0910S))),No306)),(No1103S,No0912S)),((No0909S,No1007S),No1208S)),No304),No1114S,No305); (((No0906S,((((No1007S,(No1208S,No0909S)),(No1103S,No0912S)),(No0910S,(No0908S,No1206S))),No1202S)),(No306,(No304,No0913S))),No1114S,No305); ((((((No0906S,No1206S),(No0910S,No1202S)),(No306,(No304,No0913S))),No0908S),((No1208S,(No0909S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No306,(No304,No0913S)),((No1206S,((No0906S,No0908S),(No1103S,((No1202S,(No1007S,(No1208S,No0909S))),No0910S)))),No0912S)),No1114S,No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No1206S,No0908S),(No0906S,(No0910S,No1202S))),(No306,(No304,No0913S)))),No1114S,No305); (((No304,No0913S),((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),No306)),No1114S,No305); ((((No0912S,No1103S),((No0909S,No1208S),No1007S)),((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,(No306,(No0913S,No304))))),No1114S,No305); ((No304,(((No0906S,(((No0910S,No1202S),((No0912S,No1103S),((No0909S,No1208S),No1007S))),(No0908S,No1206S))),No306),No0913S)),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1208S,No1007S)),(((No0906S,No1206S),((No0913S,No1202S),No0910S)),(No0908S,(No306,No304))))),No1114S,No305); ((((No0908S,((No0913S,No304),(No0909S,(No1208S,No1007S)))),(No1206S,(No0906S,(No0910S,No1202S)))),No306),((No1103S,No1114S),No0912S),No305); ((((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(((No1206S,No0906S),(No1202S,No0910S)),No0908S))),No1114S,No305); ((((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(((No1206S,No0906S),(No1202S,No0910S)),No0908S))),No1114S,No305); ((((No0908S,No1206S),((No1103S,((No1202S,No0910S),No0906S)),(No0912S,(No306,(No0913S,No304))))),(No1007S,(No1208S,No0909S))),No1114S,No305); (((No0908S,((((No1202S,No0910S),No0906S),No1206S),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (((No0908S,((((No1202S,No0910S),No0906S),No1206S),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); ((No304,((No306,((No0908S,No1206S),((No0912S,No1103S),(No1007S,(No1208S,No0909S))))),((No1202S,No0910S),(No0913S,No0906S)))),No1114S,No305); ((No304,(No306,((((No0908S,No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),(No0906S,(No1202S,No0910S))),No0913S))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0908S,No1206S),((((No1202S,No0910S),No0906S),No0913S),(No304,No306)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(((No0906S,(No1202S,No0910S)),((No0912S,No1103S),(No0908S,No1206S))),((No0913S,No304),No306))),No1114S,No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0906S,(No1202S,No0910S)),(No0908S,No1206S))))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No306,((No0906S,(No1206S,((No304,No0913S),No0908S))),(No0910S,No1202S)))),No305); (No1114S,(No304,(((((No0906S,(No0913S,(No1202S,No0910S))),No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No0908S),No306)),No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0906S,(No1202S,No0910S)),((No0908S,No1206S),(No306,(No0913S,No304))))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0906S,((No1202S,No0910S),No1206S)),(No0908S,(No306,(No0913S,No304))))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),((No0910S,(No0906S,No1202S)),(No1206S,No0908S)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No1114S,No305); ((((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No306,(No0913S,No304)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No1114S,No305); ((No1103S,(((No0909S,(No1007S,No1208S)),((No0908S,(No0906S,((No1202S,No0910S),No1206S))),(No306,(No0913S,No304)))),No0912S)),No1114S,No305); ((((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No306,(No0913S,No304))),(No1103S,(No0912S,(No1007S,(No1208S,No0909S))))),No1114S,No305); (((((No0906S,(No1202S,No0910S)),(No0908S,No1206S)),(No306,(No0913S,No304))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1007S,No1208S))),(((No304,No0913S),No306),(((No0910S,No1202S),(No0908S,No1206S)),No0906S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No304,No0913S),No306),((((No0910S,No1202S),No1206S),No0906S),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No304,No0913S),No306),((((No0910S,No1202S),No1206S),No0906S),No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0913S,(No306,No304)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),(No1007S,(No1208S,No0909S))),(No0912S,No1103S)),No305); (No1114S,((((No0906S,(No0910S,No1202S)),No1206S),(No0908S,((No0913S,No304),No306))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No304,(No306,No0913S)),((No0906S,((No0910S,No1202S),No1206S)),No0908S)),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(No0908S,((No306,(No0913S,No304)),(No0906S,((No0910S,No1202S),No1206S)))))),No305); (No1114S,((No0912S,No1103S),(((No0908S,(((No0906S,No0910S),No1202S),No1206S)),((No304,No0913S),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0908S,((No0906S,(No0910S,No1202S)),No1206S)),((No304,No0913S),No306)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); ((No1208S,(No1007S,No0909S)),((((No306,No0913S),(No1114S,No304)),((No0908S,No1206S),((No1202S,No0910S),No0906S))),(No1103S,No0912S)),No305); ((((No306,(No304,No0913S)),(No0908S,((No1007S,(No0909S,No1208S)),(No1206S,((No1202S,No0910S),No0906S))))),(No1103S,No0912S)),No1114S,No305); ((((No1206S,((No1202S,No0910S),No0906S)),((No306,(No304,No0913S)),No0908S)),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),(((No1007S,No1208S),No0909S),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,((No1202S,No0910S),No0906S))),((No0909S,(No1007S,No1208S)),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (((((No306,(No304,No0913S)),((No1202S,No0910S),No0906S)),(No0908S,No1206S)),(((No0909S,(No1007S,No1208S)),No0912S),No1103S)),No1114S,No305); (((No0908S,((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((No304,(No306,((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),(No0908S,No1206S)),((No0906S,(No0910S,No1202S)),No0913S)))),No1114S,No305); (((No1103S,No0912S),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No306,No0913S),No304)),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No0913S,No304),No306)),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((No0912S,No1103S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No1114S,No305); (((No0912S,No1103S),((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),((No304,No0913S),No306)),((No1208S,(No1007S,No0909S)),(No0912S,No1103S))),No1114S,No305); (No1114S,(((((No0906S,(No0910S,No1202S)),(No0908S,((No304,No0913S),No306))),No1206S),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No305); (No1114S,((((No304,No0913S),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No1114S,(No306,(No0913S,No304))),(No0908S,((No0906S,(No0910S,No1202S)),No1206S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); (((No1103S,No0912S),(((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No306,(No0913S,No304)),((No0906S,(No0910S,No1202S)),(No1206S,No0908S))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No1206S,No0908S),(No306,(No0913S,(No0906S,(No0910S,No1202S))))),No304)),No1114S,No305); ((((No1103S,((No304,No306),(No0908S,(No1206S,(No0906S,((No0910S,No1202S),No0913S)))))),No0912S),(No1007S,(No0909S,No1208S))),No1114S,No305); ((((((No0913S,No304),(No0906S,(No0910S,No1202S))),(No306,(No0908S,No1206S))),(No1007S,(No0909S,No1208S))),(No0912S,No1103S)),No1114S,No305); (No0912S,(((((No0908S,No1206S),(No0906S,(No0913S,(No0910S,No1202S)))),No304),No306),((No1114S,(No1007S,(No0909S,No1208S))),No1103S)),No305); (No1114S,(((No0908S,((No0906S,No1206S),(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No0908S,No1206S),((No0913S,No304),No306)),((No0910S,No1202S),No0906S)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0912S,No1103S),((No1208S,(No1007S,No0909S)),((((No0910S,No1202S),No0906S),((No0913S,No304),No306)),(No0908S,No1206S)))),No305); (No0908S,(((No1114S,((No0913S,No304),No306)),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),(((No0910S,No1202S),No0906S),No1206S)),No305); (No1114S,((((((No0910S,No1202S),No0906S),No1206S),No0908S),((No0913S,No304),No306)),((No1103S,No0912S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0906S,((No0909S,(No1208S,No1007S)),No0908S)),(No1202S,(No1206S,No0910S))),((No0913S,No304),No306)),(No1103S,No0912S)),No305); (No1114S,(No0912S,(((No0909S,(No1208S,No1007S)),((((No0906S,(No0910S,No1202S)),No1206S),No0908S),((No0913S,No304),No306))),No1103S)),No305); ((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,((No1114S,No304),No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,((No1206S,(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))))),No1114S,No305); (((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(((No0908S,No1206S),(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S))))),No1114S,No305); ((((No306,No0913S),(((No1206S,No0906S),(No1202S,No0910S)),(No0908S,((No0909S,(No1007S,No1208S)),(No0912S,No1103S))))),No304),No1114S,No305); ((((No1103S,No0912S),((No0909S,No1007S),No1208S)),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S)))))),No1114S,No305); ((((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No0910S,(No306,(No304,No0913S))),(No0906S,(No0908S,No1206S))),No1202S)),No1114S,No305); (((No1103S,No0912S),((No0909S,(No1007S,No1208S)),(((((No0910S,No1202S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); (((No1114S,(No306,(No304,No0913S))),(((No0910S,No1202S),No0906S),(No0908S,No1206S))),((No1103S,No0912S),(No1208S,(No0909S,No1007S))),No305); (((((No0910S,No1202S),No0906S),(No0908S,(No1206S,(No306,(No304,No0913S))))),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((((No1206S,((No0910S,No1202S),No0906S)),No0908S),(No304,No0913S)),No306),((No1103S,No0912S),(No0909S,(No1007S,No1208S)))),No1114S,No305); ((((((No0913S,No304),No306),(No1206S,(No0906S,(No1202S,No0910S)))),No0908S),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No1206S,No0908S),((No0913S,No304),No306)),((No1202S,No0910S),No0906S)),((No1103S,No0912S),((No1007S,No1208S),No0909S))),No1114S,No305); (((No1007S,No1208S),(No0909S,((No0910S,((No1202S,((No0913S,No304),No306)),(No0906S,(No1206S,No0908S)))),(No1103S,No0912S)))),No1114S,No305); (No1114S,((((No1206S,No0908S),((No0906S,(No0913S,(No0910S,No1202S))),No304)),No306),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); (No1114S,(No1103S,(No0912S,(((No0906S,(No0913S,(No0910S,No1202S))),(No304,No306)),((No1206S,No0908S),(No0909S,(No1208S,No1007S)))))),No305); (No1114S,((((No0913S,No304),No306),((No1206S,No0908S),(No0906S,(No0910S,No1202S)))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (((((((No1206S,No0906S),(No0910S,No1202S)),No1103S),(((No0913S,No304),No306),No0908S)),No0912S),(No0909S,(No1208S,No1007S))),No1114S,No305); ((((((No1206S,No0906S),(No0910S,No1202S)),((No0913S,No304),No306)),No0908S),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No0913S,No304),No306)),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),(No304,No306)),(No0906S,((No1202S,No0910S),No0913S)))),No1114S,No305); ((((No304,No306),((No1103S,No0912S),((No1208S,(No1114S,No1007S)),No0909S))),(No0906S,((No1202S,No0910S),No0913S))),(No0908S,No1206S),No305); ((No304,((No0908S,((((No1208S,No1007S),No0909S),No0912S),No1103S)),((No1206S,(No0906S,(No1202S,No0910S))),(No306,No0913S)))),No1114S,No305); (((No1007S,(No0909S,No1208S)),(No1103S,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),(No306,(No304,No0913S))),No0912S))),No1114S,No305); ((((No1206S,No0908S),(No306,(No304,((No0906S,(No1202S,No0910S)),No0913S)))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No1114S,No305); (((No0912S,No1103S),((No1208S,(No1007S,No0909S)),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),(No306,(No304,No0913S))))),No1114S,No305); ((((((No0906S,(No1202S,No0910S)),No1206S),No0908S),((No0913S,No304),No306)),(No0912S,No1103S)),(No1114S,(No1007S,(No0909S,No1208S))),No305); (No1114S,((((No0909S,No1208S),No1007S),(No1103S,No0912S)),((((No0906S,(No1202S,No0910S)),No1206S),No0908S),((No0913S,No304),No306))),No305); (No1114S,((No0908S,((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),(((No0906S,(No1202S,No0910S)),No1206S),((No0913S,No304),No306))),No305); ((No304,(((No0908S,((No0906S,(No1202S,No0910S)),No1206S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),(No306,No0913S))),No1114S,No305); (((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No0908S,(No306,(No304,No0913S))),((No0906S,(No1202S,No0910S)),No1206S))),No1114S,No305); (((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No0908S,(No0913S,(No306,No304))),((No0906S,(No1202S,No0910S)),No1206S))),No1114S,No305); ((No1103S,(((No304,(No306,(No0908S,((No0906S,(No0913S,(No1202S,No0910S))),No1206S)))),(No1007S,(No1208S,No0909S))),No0912S)),No1114S,No305); ((((No1103S,((No1007S,(No1208S,No0909S)),No0912S)),((No0906S,(No0913S,(No1202S,No0910S))),(No1206S,No0908S))),(No304,No306)),No1114S,No305); (((((((No1007S,No1208S),No0909S),No0912S),No1103S),(((No0908S,((No0910S,(No0913S,No1202S)),No0906S)),No306),No1206S)),No1114S),No304,No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0913S,No304),No306),((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No0908S,No1206S)),(No0910S,(No1202S,No0906S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),((((No0913S,No304),No306),(No0908S,No1206S)),(No0906S,(No0910S,No1202S)))),No305); (No1114S,((((No0908S,No1206S),(((No0910S,No1202S),No0913S),No0906S)),(((No1103S,No0912S),(No1007S,(No1208S,No0909S))),No306)),No304),No305); (No1114S,((No1103S,No0912S),((No0908S,((No1206S,((No0910S,No1202S),No0906S)),((No304,No0913S),No306))),((No1208S,No0909S),No1007S))),No305); (No1114S,((No1103S,No0912S),(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No304,No0913S),No306)),((No1208S,No0909S),No1007S))),No305); (No1114S,(((((No0906S,No1206S),(No1202S,No0910S)),((No304,No0913S),No306)),No0908S),(((No0909S,No1208S),No1007S),(No1103S,No0912S))),No305); (No1114S,((No1103S,No0912S),((((No1206S,((No1202S,No0910S),No0906S)),((No304,No0913S),No306)),No0908S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,((No1202S,No0910S),No0906S)))),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No305); (No1114S,((((No0908S,No1206S),((((No0913S,No0906S),No0910S),No1202S),No306)),((No0909S,(No1208S,No1007S)),(No1103S,No0912S))),No304),No305); (No1114S,((No1103S,No0912S),((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))),((No1208S,(No1007S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((No0909S,(No1208S,No1007S)),((No1103S,No0912S),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S)))))),No305); (No1114S,((No1103S,No0912S),(((((No0913S,No304),((No0910S,No1202S),No0906S)),(No0908S,No1206S)),No306),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No0908S,((No1206S,((No0910S,No1202S),No0906S)),(No306,(No304,No0913S)))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S))),No305); (No1114S,(((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No304,No0913S))),(No1103S,((No1007S,(No1208S,No0909S)),No0912S))),No305); (((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No306,(No1114S,(No304,No0913S)))),(No1103S,((No0909S,(No1007S,No1208S)),No0912S)),No305); (((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No306,No304),No0913S),((No1206S,((No0906S,No0910S),No1202S)),No0908S)))),No1114S,No305); (((No1007S,(No1208S,No0909S)),(No0912S,(No1103S,(No0906S,((No1202S,((No306,(No304,No0913S)),No0910S)),(No1206S,No0908S)))))),No1114S,No305); (((((((No1206S,No0908S),No0906S),(No306,(No304,No0913S))),(No0910S,No1202S)),(No1007S,(No1208S,No0909S))),(No1103S,No0912S)),No1114S,No305); (((No1103S,No0912S),(No0909S,(No1007S,No1208S))),((No0906S,(No1206S,(No0910S,No1202S))),(No0908S,(No1114S,(No306,(No304,No0913S))))),No305); ((No0909S,((No1114S,No1007S),No1208S)),(No0912S,(No1103S,(No0908S,((No306,(No304,No0913S)),(No0906S,(No1206S,(No0910S,No1202S))))))),No305); (No1114S,((No0912S,No1103S),((((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S))),No0908S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((((No1202S,No0906S),(No0910S,No0913S)),(No304,No0908S)),No1206S),No306)),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),((No306,(No304,No0913S)),(((No0910S,No1202S),No0906S),(No0908S,No1206S)))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),((No306,(No304,No0913S)),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((((No1208S,No1007S),No0909S),(No1103S,No0912S)),(((No306,No304),(No0913S,(No0910S,No1202S))),((No0908S,No1206S),No0906S))),No305); (No1114S,(((No306,No304),No0913S),(((No0912S,(No0908S,(No1007S,(No0909S,No1208S)))),(No1206S,(No0906S,(No0910S,No1202S)))),No1103S)),No305); (No1114S,((((No0906S,((No0912S,No1103S),(No1208S,(No1007S,No0909S)))),(No0908S,No1206S)),(No0910S,No1202S)),((No0913S,No304),No306)),No305); (((No0912S,No1103S),((No1208S,No1007S),No0909S)),((((No0913S,No304),No306),No1114S),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))),No305); (No1114S,((((No0906S,((No0913S,No304),(No0910S,No1202S))),(No0908S,No1206S)),((No0912S,No1103S),((No1208S,No1007S),No0909S))),No306),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(((No0913S,No304),No306),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(No0906S,(((No306,(No0913S,No304)),No0908S),((No1202S,No0910S),No1206S))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No306,(No0913S,No304)),No0908S),(No0906S,(No1206S,(No1202S,No0910S)))),(No1103S,No0912S))),No305); (No1114S,((No1007S,(No0909S,No1208S)),((((No304,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,No1206S)),No306),(No1103S,No0912S))),No305); (No1114S,((No1208S,(No1007S,No0909S)),((No1103S,No0912S),(No1206S,((No0906S,(No1202S,No0910S)),(((No304,No0913S),No306),No0908S))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((No1103S,No0912S),((No0909S,(No1208S,No1007S)),(((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((((No304,No0913S),No306),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((No0906S,((No304,No0913S),No306)),((No1202S,No0910S),(No0908S,No1206S))),((No1103S,No0912S),(No1208S,(No1007S,No0909S)))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No0913S,No304)),No0908S))),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No1206S,(No0906S,(No1202S,No0910S))),((No306,(No0913S,No304)),No0908S))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1208S,No1007S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No0913S,No304))))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No1103S,No0912S))),No305); (No1114S,((((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),(No0913S,No304)),No306),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(((((No304,No0913S),No306),(No0908S,No1206S)),(No0906S,(No1202S,No0910S))),((No1007S,(No0909S,No1208S)),(No1103S,No0912S))),No305); (No1114S,(No304,((((No0906S,(No0913S,(No1202S,No0910S))),(No0908S,No1206S)),No306),((No1208S,(No1007S,No0909S)),(No1103S,No0912S)))),No305); (No1114S,(No304,((((No0906S,No1206S),(No0910S,No1202S)),((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),No0908S),No306)),No0913S)),No305); (No1114S,(((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(No0908S,(((No0913S,No304),No306),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No1103S,No0912S),(No0909S,(No1208S,No1007S))),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),((No0913S,No304),No306))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((No0912S,No1103S),((No1208S,(No0909S,No1007S)),((No306,(No0913S,No304)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))))),No305); (No1114S,((No306,(((No0913S,(No0906S,(No0910S,No1202S))),No304),(No0908S,No1206S))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); ((No0908S,((No306,(No0913S,(No1114S,No304))),(No1206S,((No0910S,No1202S),No0906S)))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); (((((No306,(No0913S,No304)),(No0908S,((No0910S,No1202S),No0906S))),No1206S),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((No0908S,((No1206S,((No0910S,No1202S),No0906S)),(No306,(No0913S,No304)))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); ((((No1202S,(((No0908S,No1206S),No0906S),No0910S)),(No306,(No0913S,No304))),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No1114S,No305); (((((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No306,(No0913S,No304))),(No0912S,(No1103S,(No0909S,(No1007S,No1208S))))),No1114S,No305); (((((No1206S,(No0906S,(No0913S,(No0910S,No1202S)))),No0908S),(No304,No306)),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No1114S,No305); ((((No1103S,(No1007S,(No1208S,No0909S))),No0912S),((((No0910S,No1202S),No0906S),(No0908S,No1206S)),(No0913S,(No304,No306)))),No1114S,No305); ((((No1208S,No0909S),No1007S),(((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No1103S,No0912S))),No1114S,No305); ((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),((No1103S,No0912S),(No1208S,(No0909S,No1007S)))),No1114S,No305); (((No306,(((No0909S,(No1007S,No1208S)),(No304,No0913S)),((No0906S,(No0910S,No1202S)),(No0908S,No1206S)))),(No1103S,No0912S)),No1114S,No305); (((No306,(No304,No0913S)),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)))),No1114S,No305); (((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No1114S,No305); (((No306,((No1114S,No304),No0913S)),(No0908S,(No1206S,(No1202S,(No0906S,No0910S))))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); (((((No306,(No304,No0913S)),No0908S),(No1206S,(No0906S,(No0910S,No1202S)))),((No0912S,No1103S),((No0909S,No1208S),No1007S))),No1114S,No305); ((((No0909S,No1208S),No1007S),(((No0908S,No1206S),(((No0906S,(No0910S,No1202S)),No0913S),(No306,No304))),(No0912S,No1103S))),No1114S,No305); ((((No0909S,No1208S),No1007S),((No0912S,No1103S),(No0908S,((No306,(No304,No0913S)),(No1206S,((No0910S,No1202S),No0906S)))))),No1114S,No305); (((No0912S,No1103S),((No0906S,((((No304,No0913S),No306),(No0908S,No1206S)),(No0910S,No1202S))),((No0909S,No1208S),No1007S))),No1114S,No305); ((((No1208S,No0909S),No1007S),((((No306,(No304,No0913S)),(No0906S,(No0910S,(No1202S,No1206S)))),No0908S),(No1103S,No0912S))),No1114S,No305); (((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),((No0906S,(No0908S,No1206S)),((No1007S,(No1208S,No0909S)),(No0910S,No1202S)))),(No0912S,No1103S)),No1114S,No305); (((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No0912S,No1103S),(No1007S,(No1208S,No0909S))))),(No306,((No1114S,No304),No0913S)),No305); (((No0912S,No1103S),(No1208S,(No0909S,No1007S))),(((No306,((No1114S,No304),No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))),No0908S),No305); ((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((((No306,(No304,No0913S)),No1114S),(No1202S,(No0906S,(No1206S,No0910S)))),No0908S)),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((((No0910S,No1202S),No0906S),(No306,(No304,No0913S))),(No1206S,No0908S))),No305); (No1114S,(((No0912S,No1103S),(No1208S,(No0909S,No1007S))),((No0908S,((No0910S,No1202S),(No1206S,No0906S))),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((No0908S,((No1206S,No0906S),(No0910S,No1202S))),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),(No306,(No304,No0913S)))),No305); (No1114S,(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),((No1206S,((No0910S,No1202S),No0906S)),((No0908S,(No304,No0913S)),No306))),No305); ((((No1007S,(No0909S,No1208S)),No0912S),No1103S),(No1114S,((No306,(No0913S,No304)),(No0908S,(No1206S,((No0910S,No1202S),No0906S))))),No305); ((No0912S,No1103S),(No1114S,((No306,(No0913S,No304)),(((No0909S,(No1208S,No1007S)),No0908S),(No1206S,((No0910S,No1202S),No0906S))))),No305); (No1114S,(((No1007S,(No0909S,No1208S)),((No0908S,No1206S),((No306,(No0913S,No304)),((No0910S,No1202S),No0906S)))),(No0912S,No1103S)),No305); (No1114S,((No0906S,((No306,(No0913S,No304)),((No0908S,No1206S),(No0910S,No1202S)))),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (((No0908S,(No0906S,((No0910S,No1202S),No1206S))),(No306,(No0913S,No304))),(((No0912S,No1103S),(No0909S,(No1208S,No1007S))),No1114S),No305); (No1114S,(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No0913S,No304))),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,((No0913S,((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),No306)),No304),No305); (((No1007S,(No0909S,No1208S)),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S))),(No0912S,No1103S))),No1114S,No305); (((No0912S,No1103S),(((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No306,(No304,No0913S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); (No0908S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((No1114S,(No306,(No304,No0913S))),(No1206S,(No0906S,(No0910S,No1202S))))),No305); (((((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No0908S),(No1114S,(No306,(No304,No0913S)))),(No1206S,(No0906S,(No0910S,No1202S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),((No306,(No304,No0913S)),No0908S)),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); ((((No0908S,No1206S),(No0906S,(No0910S,No1202S))),(No1114S,(No306,(No304,No0913S)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (No1114S,((No306,(No304,No0913S)),((No0908S,No1206S),(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0906S,(No0910S,No1202S))))),No305); (((No0912S,No1103S),(No0909S,(No1007S,No1208S))),((No0906S,(No0910S,No1202S)),(((No0913S,(No304,No306)),No1114S),(No0908S,No1206S))),No305); (No1114S,(No306,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No0906S,(No0910S,No1202S)),(No0908S,No1206S)),(No304,No0913S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); ((((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((((No0906S,No0910S),No1206S),No1202S),((No306,No1114S),(No0913S,No304)))),No0908S,No305); (((((No0910S,No1202S),No0906S),No1206S),(No0908S,(No1114S,((No0913S,No304),No306)))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),No305); (No1114S,(((No0913S,No306),((((No0908S,No1206S),No0906S),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),(No0910S,No1202S))),No304),No305); (No1114S,((No0912S,No1103S),((No0909S,(No1007S,No1208S)),(((No304,No1206S),(No0906S,(No0913S,(No1202S,No0910S)))),(No306,No0908S)))),No305); (No1114S,(((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No1206S,(No0906S,(No0910S,No1202S))),No0908S),((No0913S,No304),No306))),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),((No0913S,No304),No306)))),No305); ((((No0912S,(No1103S,(No1007S,(No0909S,No1208S)))),(((No0913S,(No1202S,No0910S)),No0906S),(No0908S,No1206S))),(No304,No306)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No306,((No304,No0913S),((No1202S,No0910S),No0906S))),(No0908S,No1206S))),No1114S,No305); (((No0912S,No1103S),(((No306,(No304,No0913S)),(No0908S,(((No1202S,No0910S),No0906S),No1206S))),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),(No306,(No304,No0913S))),No0908S),No1114S,No305); ((((No306,(No0908S,No1206S)),(((No0913S,(No1202S,No0910S)),No0906S),No304)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No1114S,No305); (((((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))),No1114S,No305); (((((No1114S,(No1007S,No1208S)),No0909S),((No0906S,(No1206S,(No1202S,No0910S))),No0908S)),(No1103S,No0912S)),(No306,(No304,No0913S)),No305); ((((No1103S,No0912S),((No1007S,No1208S),No0909S)),((((No306,(No304,No0913S)),No1206S),No0906S),((No1202S,No0910S),No0908S))),No1114S,No305); ((((No306,(No304,No0913S)),No1114S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No0912S,No1103S),(No1007S,(No1208S,No0909S))),No305); ((((No0913S,(No306,No304)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No0912S,No1103S),(No1208S,(No0909S,No1007S)))),No1114S,No305); ((((No0912S,(No1208S,(No1007S,No0909S))),No1103S),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No1114S,No305); ((((No0912S,(No1208S,(No1007S,No0909S))),No1103S),((((No0913S,No304),No306),(((No0910S,No1202S),No0906S),No1206S)),No0908S)),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),(((No0908S,No304),((((No0913S,No0910S),No1202S),No0906S),No1206S)),No306)),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); ((((No1007S,(No0909S,No1208S)),(No1103S,No0912S)),((No0908S,(((No1202S,No0910S),No0906S),No1206S)),((No0913S,No304),No306))),No1114S,No305); (((No1103S,No0912S),((((No0908S,No1206S),((No0913S,No304),No306)),((No1202S,No0910S),No0906S)),(No1007S,(No0909S,No1208S)))),No1114S,No305); (((No1103S,No0912S),(((No0908S,((No0913S,No304),No306)),((No1202S,No0910S),(No1206S,No0906S))),(No0909S,(No1208S,No1007S)))),No1114S,No305); ((((No0913S,No304),No306),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),((No0909S,(No1208S,No1007S)),(No1103S,No0912S)))),No1114S,No305); (No1114S,(((No0906S,(No0913S,(No1202S,No0910S))),((No0908S,No1206S),(No304,No306))),(No1103S,((No1007S,(No0909S,No1208S)),No0912S))),No305); (No1114S,(((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,(No304,No306))),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),No305); (No1114S,(((No1206S,(No0906S,(No0913S,(No1202S,No0910S)))),(No0908S,(No304,No306))),(No1103S,((No0909S,(No1208S,No1007S)),No0912S))),No305); (No1114S,((((No0908S,No1206S),(No0910S,(No1202S,No0906S))),((No0913S,No304),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((((No0906S,No0910S),(No1206S,No1202S)),((No0908S,(No0913S,No304)),No306)),((No0909S,(No1208S,No1007S)),(No0912S,No1103S))),No305); (No1114S,(((No1206S,(No0906S,(No0910S,No1202S))),(No0908S,((No0913S,No304),No306))),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No305); (No1114S,(((((No1206S,No0908S),((No0906S,(No0910S,No1202S)),No306)),(No1007S,(No0909S,No1208S))),(No0913S,No304)),(No0912S,No1103S)),No305); (No1114S,((No306,(No0913S,No304)),(((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No0908S),((No0906S,(No0910S,No1202S)),No1206S))),No305); ((((No0912S,(No0909S,(No1208S,No1007S))),No1103S),((No0908S,(No306,(No0913S,No304))),((No0906S,(No0910S,No1202S)),No1206S))),No1114S,No305); ((No0912S,No1103S),((No0909S,(No1208S,No1007S)),((No1114S,(No306,(No0913S,No304))),(((No0906S,(No0910S,No1202S)),No1206S),No0908S))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),((No0906S,(No1202S,No0910S)),((No306,(No304,No0913S)),(No1206S,No0908S)))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No306,(No304,No0913S))),(No0908S,No1206S)),(((No0909S,No1007S),No1208S),(No0912S,No1103S))),No305); (No1114S,((((No0906S,(No1202S,No0910S)),(No306,(No304,No0913S))),(No0908S,No1206S)),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S),((No0909S,(No1007S,No1208S)),(No0912S,No1103S))),No305); (No1114S,((((No1206S,(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),No0908S),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),(No1007S,(No1208S,No0909S)))),No305); (No1114S,(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))),((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),No305); (No1114S,((No0912S,No1103S),(((No304,No0913S),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),No306)),(No0909S,(No1007S,No1208S)))),No305); (No1114S,((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(No306,(No0908S,(No1206S,(No0906S,(No0913S,(No1202S,No0910S))))))),No304),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),((No1206S,No0908S),(No0906S,(No1202S,No0910S))))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),((No306,(No304,No0913S)),(No0908S,((No0906S,(No1202S,No0910S)),No1206S)))),No305); (((No0908S,((No1007S,(No1208S,No0909S)),(No0912S,No1103S))),((No1114S,(No306,(No304,No0913S))),(No0906S,(No1202S,No0910S)))),No1206S,No305); (No1114S,((No306,(No304,No0913S)),(No1206S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(No0908S,(No0906S,(No1202S,No0910S)))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No306,(No304,No0913S)),((No0908S,No1206S),(No0906S,(No1202S,No0910S))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(No306,((No304,No0913S),(No0908S,(No1206S,(No0906S,(No1202S,No0910S))))))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No1206S,No0908S),No0906S),((No1202S,No0910S),(No306,(No0913S,No304))))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(No1206S,((No0906S,(No1202S,No0910S)),(No0908S,(No306,(No0913S,No304)))))),No305); (No1114S,((No0912S,No1103S),((No0908S,No1206S),((No0906S,(No1202S,No0910S)),((No0909S,(No1007S,No1208S)),(No306,(No0913S,No304)))))),No305); (No1114S,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),(((No1206S,(No0906S,(No1202S,No0910S))),No0908S),(No306,(No0913S,No304)))),No305); (((No1103S,No0912S),(No1007S,(No0909S,No1208S))),(((No0908S,No1206S),((No0910S,No1202S),No0906S)),(No1114S,(No306,(No304,No0913S)))),No305); ((((No1103S,No0912S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,((No0910S,No1202S),No0906S))),(No306,(No304,No0913S)))),No1114S,No305); (((No0909S,(No1208S,No1007S)),((((No0908S,No1206S),(No0906S,(No306,(No304,No0913S)))),(No0910S,No1202S)),(No0912S,No1103S))),No1114S,No305); ((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(((No1007S,(No0909S,No1208S)),No0912S),No1103S)),No1114S,No305); (((((No306,(No304,No0913S)),((No1206S,(No0906S,(No0910S,No1202S))),No0908S)),(No0909S,(No1208S,No1007S))),(No0912S,No1103S)),No1114S,No305); ((((No0913S,No306),(((No0906S,((No0910S,No1202S),No1206S)),No0908S),((No1007S,(No0909S,No1208S)),(No0912S,No1103S)))),No304),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No1206S,((No304,No0913S),No306)),(No0906S,((No0910S,No1202S),No0908S)))),No1114S,No305); ((((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),((No0908S,((No304,No0913S),No306)),(((No0910S,No1202S),No0906S),No1206S))),No1114S,No305); ((((((No1007S,(No0909S,No1208S)),No0912S),No1103S),No0906S),((No0908S,No1206S),(No0910S,No1202S))),(No1114S,((No304,No0913S),No306)),No305); (((No0909S,(No1208S,No1007S)),((No0912S,No1103S),(((No0908S,No1206S),(No0906S,(No0910S,No1202S))),((No304,No0913S),No306)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),((No1206S,(No0906S,(No0910S,No1202S))),(((No304,No0913S),No306),No0908S))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(No0906S,(((No0908S,No1206S),((No0910S,No1202S),(No304,No0913S))),No306))),No1114S,No305); (((No0909S,(No1007S,No1208S)),(No1103S,No0912S)),((No0908S,(No1206S,(No0906S,(No0910S,No1202S)))),(No1114S,(No306,(No304,No0913S)))),No305); (No1114S,(((No306,(No304,No0913S)),(No0908S,(No1206S,(No0906S,(No0910S,No1202S))))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),((No1103S,No0912S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,((No1007S,(No0909S,No1208S)),(((No0906S,((No1202S,No0910S),No1206S)),((No306,(No304,No0913S)),No0908S)),(No1103S,No0912S))),No305); (No1114S,(No304,((No0908S,(No1206S,((No0906S,(No0913S,(No1202S,No0910S))),((No1007S,(No0909S,No1208S)),(No0912S,No1103S))))),No306)),No305); (((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(No0908S,(((No306,No304),No1114S),(No1206S,(No0906S,(No0913S,(No1202S,No0910S)))))),No305); ((No0908S,(((No1007S,(No0909S,No1208S)),(No0912S,No1103S)),((No0906S,(No1202S,No0910S)),No1206S))),((No306,(No0913S,No304)),No1114S),No305); (((No0912S,No1103S),((((No0906S,(No1202S,No0910S)),No1206S),((No306,(No0913S,No304)),No0908S)),(No1208S,(No1007S,No0909S)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),(((No0906S,((No1202S,No0913S),No0910S)),((No1206S,No0908S),No306)),No304)),No1114S,No305); (((No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),((No0906S,(No0913S,(No0910S,No1202S))),((No1206S,No0908S),(No304,No306)))),No1114S,No305); (((No1103S,(No0912S,(No1007S,(No1208S,No0909S)))),((((No0906S,(No0913S,(No0910S,No1202S))),No306),(No1206S,No0908S)),No304)),No1114S,No305); (((No1103S,(No0912S,(No1208S,(No0909S,No1007S)))),(((No0913S,((No0910S,No1202S),No0906S)),(No304,No306)),(No1206S,No0908S))),No1114S,No305); (((((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),((No1206S,((No0910S,No1202S),No0906S)),No0908S)),(No306,(No304,No0913S))),No1114S,No305); ((((No0912S,No1103S),(No1007S,(No1208S,No0909S))),((((No306,(No304,No0913S)),No1206S),((No0910S,No1202S),No0906S)),No0908S)),No1114S,No305); (((No0912S,No1103S),((No0909S,(No1007S,No1208S)),((No306,(No304,No0913S)),(No0908S,((No1206S,(No0910S,No1202S)),No0906S))))),No1114S,No305); ((((No0908S,(((No0913S,(No0910S,No1202S)),No0906S),No1206S)),(No306,No304)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No1114S,No305); (No1114S,(((No0909S,(No1007S,No1208S)),((No0908S,(((No0910S,No1202S),No0906S),No1206S)),(No306,(No0913S,No304)))),(No0912S,No1103S)),No305); (No1114S,((((No1206S,No0908S),No0906S),(No306,(((No0910S,No1202S),No0913S),No304))),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((((No306,(No304,No0913S)),(No1206S,(No0906S,(No0910S,No1202S)))),(No0912S,(No1103S,(No0909S,(No1208S,No1007S))))),No0908S),No305); (No1114S,((((No306,(No304,No0913S)),((No0906S,(No0910S,No1202S)),No1206S)),No0908S),((No0912S,No1103S),(No0909S,(No1208S,No1007S)))),No305); (No1114S,(((No0908S,No1206S),((No306,No304),(No0906S,(No0913S,(No0910S,No1202S))))),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))),No305); (No1114S,(No0906S,((No306,(No0913S,No304)),(((No0908S,No1206S),(No0910S,No1202S)),((No0912S,No1103S),(No1007S,(No0909S,No1208S)))))),No305); (No1114S,(((No0909S,(No1208S,No1007S)),(No0912S,No1103S)),(((No0908S,No1206S),((No0906S,(No0913S,(No0910S,No1202S))),No306)),No304)),No305); (((No0912S,No1103S),(No0909S,(No1208S,No1007S))),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No1114S,((No0913S,No304),No306)))),No305); ((((No0912S,No1103S),(No1007S,(No0909S,No1208S))),((No0908S,(No1206S,(No0906S,(No1202S,No0910S)))),((No0913S,No304),No306))),No1114S,No305); (((No1007S,(No0909S,No1208S)),((((No0913S,No304),No306),No0912S),(No1103S,((No1206S,(No0906S,(No1202S,No0910S))),No0908S)))),No1114S,No305); (No0908S,((((No1007S,(No0909S,No1208S)),No0912S),No1103S),((No1114S,((No304,No0913S),No306)),(((No1202S,No1206S),No0910S),No0906S))),No305); (No1114S,((((No304,No0913S),No306),((((No1202S,No0910S),No0906S),No1206S),No0908S)),(((No0909S,(No1208S,No1007S)),No0912S),No1103S)),No305); (No1114S,(((No0912S,(No1007S,(No1208S,No0909S))),No1103S),(((No1206S,No0908S),((No0913S,(No0906S,(No0910S,No1202S))),No304)),No306)),No305); (No1114S,((No0912S,No1103S),((No1007S,(No1208S,No0909S)),(No304,(No306,((No1206S,No0908S),(No0906S,((No0910S,No1202S),No0913S))))))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No1208S,(No0909S,No1007S)),(No0912S,No1103S)),(((No304,No0913S),No306),(No0908S,((No0906S,(No0910S,No1202S)),No1206S)))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No304,((No0910S,No1202S),No0913S)),No306),((No1206S,No0908S),No0906S))),No305); (No1114S,(((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No1206S,(No0906S,(No0910S,No1202S))),No0908S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((((No0913S,No304),No306),(No1206S,(No0910S,No1202S))),No0906S),No0908S)),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(No0912S,No1103S)),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S))))),No305); (No1114S,((No1208S,(No0909S,No1007S)),((No0912S,No1103S),(((No0913S,No304),No306),((No0908S,No1206S),(No0906S,(No0910S,No1202S)))))),No305); (No1114S,((((((No0913S,No304),No306),(No0908S,(No0906S,((No0910S,No1202S),No1206S)))),(No0909S,(No1007S,No1208S))),No0912S),No1103S),No305); (No1114S,((No0912S,(No1103S,(No0909S,(No1007S,No1208S)))),((No304,No306),((No1206S,No0908S),(No0906S,(No0913S,(No0910S,No1202S)))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,(No1103S,(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),(No304,No0913S))))),No306)),No305); (No1114S,((((No0908S,No1206S),(No0906S,(No1202S,No0910S))),(No306,(No304,No0913S))),((No1208S,(No0909S,No1007S)),(No0912S,No1103S))),No305); (No1114S,((No306,((((No1007S,(No1208S,No0909S)),No0912S),No1103S),((No0906S,((No1202S,No0910S),No1206S)),No0908S))),(No0913S,No304)),No305); (No1114S,((((No0909S,(No1007S,No1208S)),No0912S),No1103S),((No1206S,No0908S),(No0906S,(((No1202S,No0910S),No0913S),(No304,No306))))),No305); (No1114S,(No304,((No306,((((No1206S,No0906S),(No1202S,No0910S)),No0908S),(((No0909S,(No1007S,No1208S)),No0912S),No1103S))),No0913S)),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))))),No305); (No1114S,((No0909S,(No1007S,No1208S)),((No0912S,No1103S),(No0908S,((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306))))),No305); (No1114S,((No0912S,No1103S),((No0908S,((No0909S,(No1007S,No1208S)),((No0913S,No304),No306))),(No1206S,(No0906S,(No1202S,No0910S))))),No305); (No1114S,((No1007S,(No1208S,No0909S)),((No0912S,No1103S),(((No1206S,(No0906S,(No1202S,No0910S))),((No0913S,No304),No306)),No0908S))),No305); (No1114S,(((No306,(No0913S,No304)),((No1206S,No0908S),(No0906S,(No1202S,No0910S)))),(((No1208S,No0909S),No1007S),(No0912S,No1103S))),No305); (((((No1206S,No0906S),(No1202S,No0910S)),No0908S),(No1114S,(No306,(No0913S,No304)))),((No0909S,(No1007S,No1208S)),(No0912S,No1103S)),No305); (No1114S,(((No306,(No0913S,No304)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (No1114S,((No0906S,(((No1206S,No0908S),((No0913S,No304),(No1202S,No0910S))),((No0912S,No1103S),(No0909S,(No1007S,No1208S))))),No306),No305); (No1114S,(((No0906S,((No0913S,(No306,No304)),(No1202S,No0910S))),(No1206S,No0908S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),No305); (No1114S,(((No306,(No304,No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S)),((No0912S,No1103S),(No1007S,(No1208S,No0909S)))),No305); (((No306,((No1114S,No304),No0913S)),((((No1202S,No0910S),No0906S),No1206S),No0908S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S))),No305); (No1114S,(((No1007S,(No1208S,No0909S)),(((((No1202S,No0910S),No0906S),No1206S),No0908S),(No306,(No304,No0913S)))),(No0912S,No1103S)),No305); (((No306,(No304,No0913S)),No1114S),((((No1202S,No0910S),No0906S),(No1206S,No0908S)),(No0912S,(No1103S,(No1007S,(No1208S,No0909S))))),No305); (No1114S,((No0912S,No1103S),((((No1202S,No0910S),(No1007S,(No1208S,No0909S))),(No0906S,No1206S)),((No306,(No304,No0913S)),No0908S))),No305); (No1114S,((((No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S))))),(No1007S,(No1208S,No0909S))),No1103S),No0912S),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,(((No306,(No304,No0913S)),((No1206S,(No0906S,(No1202S,No0910S))),No0908S)),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); (No1114S,((((No1202S,No0910S),(No306,(No304,No0913S))),((No0908S,No1206S),No0906S)),(No0912S,((No1007S,(No1208S,No0909S)),No1103S))),No305); (No1114S,((No0908S,((No306,(No304,No0913S)),(No1206S,(No0906S,(No1202S,No0910S))))),((No1007S,(No1208S,No0909S)),(No1103S,No0912S))),No305); ((((No1202S,No0910S),(No0908S,No1206S)),((No306,((No1114S,No304),No0913S)),No0906S)),((No1208S,(No0909S,No1007S)),(No1103S,No0912S)),No305); (((No0906S,No1206S),(No1202S,No0910S)),(((No306,(No304,No0913S)),No1114S),(No0908S,(((No0909S,(No1007S,No1208S)),No1103S),No0912S))),No305); (((No0912S,No1103S),(No1007S,(No1208S,No0909S))),(((No306,(No304,No0913S)),((No1206S,((No1202S,No0910S),No0906S)),No0908S)),No1114S),No305); (No1114S,(((No306,(No304,No0913S)),((No0912S,No1103S),(No0909S,(No1007S,No1208S)))),((No1206S,((No1202S,No0910S),No0906S)),No0908S)),No305); (((No1103S,No0912S),(No0909S,(No1007S,No1208S))),(((No1206S,No0906S),((No306,((No1114S,No304),No0913S)),No0908S)),(No1202S,No0910S)),No305); phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.YCh0000644000176200001440000000055613707232051024205 0ustar liggesusers(Ame:0.02707461606876413254,(((Mur:0.00215666997155560154,Uth:0.00192023592185219349):0.00016696946772137622[63],Hma:0.00368686670740361357):0.00018687639400160564[81],(Uam:0.00135720565202207934,(Uma:0.00118651800822575332,Uar:0.00101739764390293918):0.00033775695210929856[94]):0.00157503466397103213[100]):0.00634369057289599098[100],Tor:0.00989995418842323435); phangorn/inst/extdata/trees/RAxML_bipartitionsBranchLabels.mtG0000644000176200001440000000055713707232051024252 0ustar liggesusers(Ame:0.42623829669506568818,(Mur:0.07919097361296209558,((Uar:0.01286960617186264609,Uma:0.01148014536527527073):0.05944338095871280064[100],((Uam:0.06376626308156593814,Uth:0.05419104627017570786):0.00666893477206217944[92],Hma:0.06896198930015005890):0.00974981555038798714[100]):0.00145717534115081442[66]):0.13909717574901725445[100],Tor:0.19825987246617926552); phangorn/inst/extdata/trees/RAxML_bestTree.3moles0000644000176200001440000000053413707232051021525 0ustar liggesusers((((Hma:0.03262045163347984666,Mur:0.03886458455630492637):0.00225499947410235475,Uth:0.02580682933153511174):0.00059392541543651757,(Uam:0.02931596331419318927,(Uar:0.00602522464221224522,Uma:0.00593640374580924231):0.02934241311799383120):0.00269684120306867619):0.06379221863907107160,Tor:0.09747395533792581335,Ame:0.24240784786309346743):0.0; phangorn/inst/extdata/HIVw.dat0000644000176200001440000000317513707232051016012 0ustar liggesusers 0.0744808 0.617509 0.16024 4.43521 0.0674539 29.4087 0.167653 2.86364 0.0604932 0.005 0.005 10.6746 0.342068 0.005 0.005 5.56325 0.0251632 0.201526 12.1233 0.005 3.20656 1.8685 13.4379 0.0604932 10.3969 0.0489798 0.0604932 14.7801 0.005 6.84405 8.59876 2.31779 0.005 18.5465 0.005 0.005 0.005 1.34069 0.987028 0.145124 0.005 0.0342252 0.0390512 0.005 0.005 0.16024 0.586757 0.005 0.005 0.005 2.89048 0.129839 0.0489798 1.76382 9.10246 0.592784 39.8897 10.6655 0.894313 0.005 13.0705 23.9626 0.279425 0.22406 0.817481 0.005 0.005 3.28652 0.201526 0.005 0.005 0.005 0.005 0.0489798 0.005 17.3064 11.3839 4.09564 0.597923 0.005 0.005 0.005 0.362959 0.005 0.005 0.005 0.005 1.48288 7.48781 0.005 0.005 1.00981 0.404723 0.344848 0.005 0.005 3.04502 0.005 0.005 13.9444 0.005 9.83095 0.111928 0.005 0.0342252 8.5942 8.35024 14.5699 0.427881 1.12195 0.16024 0.005 6.27966 0.725157 0.740091 6.14396 0.005 0.392575 4.27939 14.249 24.1422 0.928203 4.54206 0.630395 0.005 0.203091 0.458743 0.0489798 0.95956 9.36345 0.005 4.04802 7.41313 0.114512 4.33701 6.34079 0.005 5.96564 0.005 0.005 5.49894 0.0443298 0.005 2.8258 0.005 0.005 1.37031 0.005 0.005 0.005 0.005 1.10156 0.005 0.005 0.005 5.06475 2.28154 8.34835 0.005 0.005 0.005 47.4889 0.114512 0.005 0.005 0.579198 4.12728 0.005 0.933142 0.490608 0.005 24.8094 0.279425 0.0744808 2.91786 0.005 0.005 2.19952 2.79622 0.827479 24.8231 2.95344 0.128065 14.7683 2.28 0.005 0.862637 0.005 0.005 1.35482 0.0377494 0.057321 0.0891129 0.0342034 0.0240105 0.0437824 0.0618606 0.0838496 0.0156076 0.0983641 0.0577867 0.0641682 0.0158419 0.0422741 0.0458601 0.0550846 0.0813774 0.019597 0.0205847 0.0515639 phangorn/inst/extdata/cpREV.dat0000644000176200001440000000352413707232051016152 0ustar liggesusers 105 227 357 175 43 4435 669 823 538 10 157 1745 768 400 10 499 152 1055 3691 10 3122 665 243 653 431 303 133 379 66 715 1405 331 441 1269 162 19 145 136 168 10 280 92 148 40 29 197 203 113 10 396 286 82 20 66 1745 236 4482 2430 412 48 3313 2629 263 305 345 218 185 125 61 47 159 202 113 21 10 1772 1351 193 68 53 97 22 726 10 145 25 127 454 1268 72 327 490 87 173 170 285 323 185 28 152 117 219 302 100 43 2440 385 2085 590 2331 396 568 691 303 216 516 868 93 487 1202 1340 314 1393 266 576 241 369 92 32 1040 156 918 645 148 260 2151 14 230 40 18 435 53 63 82 69 42 159 10 86 468 49 73 29 56 323 754 281 1466 391 142 10 1971 89 189 247 215 2370 97 522 71 346 968 92 83 75 592 54 200 91 25 4797 865 249 475 317 122 167 760 10 119 0.0755 0.0621 0.0410 0.0371 0.0091 0.0382 0.0495 0.0838 0.0246 0.0806 0.1011 0.0504 0.0220 0.0506 0.0431 0.0622 0.0543 0.0181 0.0307 0.0660 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val Symmetrical part of the rate matrix and aa frequencies, estimated for plant chloroplast proteins, under the REVaa model. The first part is S_ij = S_ji, and the second part has the amino acid frequencies (\pi_i). The substitution rate from amino acid i to j is Q_ij = S_ij*PI_j. This is the cpREV model used in protml 2.3b6 (12/10/98), described by Adachi, J., P. J. Waddell, W. Martin, and M. Hasegawa. 2000. Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast DNA. Journal of Molecular Evolution 50:348-358. phangorn/inst/extdata/mtREV24.dat0000644000176200001440000000414113707232051016332 0ustar liggesusers 23.18 26.95 13.24 17.67 1.90 794.38 59.93 103.33 58.94 1.90 1.90 220.99 173.56 55.28 75.24 9.77 1.90 63.05 583.55 1.90 313.56 120.71 23.03 53.30 56.77 30.71 6.75 28.28 13.90 165.23 496.13 113.99 141.49 582.40 49.12 1.90 96.49 1.90 27.10 4.34 62.73 8.34 3.31 5.98 12.26 25.46 15.58 15.16 1.90 25.65 39.70 1.90 2.41 11.49 329.09 8.36 141.40 608.70 2.31 1.90 465.58 313.86 22.73 127.67 19.57 14.88 141.88 1.90 65.41 1.90 6.18 47.37 1.90 1.90 11.97 517.98 537.53 91.37 6.37 4.69 15.20 4.98 70.80 19.11 2.67 1.90 48.16 84.67 216.06 6.44 90.82 54.31 23.64 73.31 13.43 31.26 137.29 12.83 1.90 60.97 20.63 40.10 50.10 18.84 17.31 387.86 6.04 494.39 69.02 277.05 54.11 54.71 125.93 77.46 47.70 73.61 105.79 111.16 64.29 169.90 480.72 2.08 238.46 28.01 179.97 94.93 14.82 11.17 44.78 368.43 126.40 136.33 528.17 33.85 128.22 597.21 1.90 21.95 10.68 19.86 33.60 1.90 1.90 10.92 7.08 1.90 32.44 24.00 21.71 7.84 4.21 38.58 9.99 6.48 1.90 191.36 21.21 254.77 38.82 13.12 3.21 670.14 25.01 44.15 51.17 39.96 465.58 16.21 64.92 38.73 26.25 195.06 7.64 1.90 1.90 1.90 19.00 21.14 2.53 1.90 1222.94 91.67 1.90 387.54 6.35 8.23 1.90 204.54 5.37 1.90 0.072 0.019 0.039 0.019 0.006 0.025 0.024 0.056 0.028 0.088 0.169 0.023 0.054 0.061 0.054 0.072 0.086 0.029 0.033 0.043 Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val S_ij = S_ji and PI_i for the mtREV24 model (Adachi and Hasegawa 1996). The PI's used to sum to 0.999 and I changed one of the freq from 0.168 into 0.169 so that the sum is 1. Prepared by Z. Yang according to data sent by Dr M. Hasegawa. This matrix was obtained from the 12 mitochondrial proteins encoded by the same strand of the DNA from a diverse range of species including bird, fish, frog, lamprey, as well as mammals (see Adachi and Hasegawa 1996 for details). The other matrix (mtmam.dat) included in the package is based on the same proteins from mammals only. Adachi, J. and Hasegawa, M. (1996) MOLPHY version 2.3: programs for molecular phylogenetics based on maximum likelihood. Computer Science Monographs of Institute of Statistical Mathematics 28:1-150. phangorn/inst/extdata/lg.dat0000644000176200001440000000361513707232051015576 0ustar liggesusers 0.425093 0.276818 0.751878 0.395144 0.123954 5.076149 2.489084 0.534551 0.528768 0.062556 0.969894 2.807908 1.695752 0.523386 0.084808 1.038545 0.363970 0.541712 5.243870 0.003499 4.128591 2.066040 0.390192 1.437645 0.844926 0.569265 0.267959 0.348847 0.358858 2.426601 4.509238 0.927114 0.640543 4.813505 0.423881 0.311484 0.149830 0.126991 0.191503 0.010690 0.320627 0.072854 0.044265 0.008705 0.108882 0.395337 0.301848 0.068427 0.015076 0.594007 0.582457 0.069673 0.044261 0.366317 4.145067 0.536518 6.326067 2.145078 0.282959 0.013266 3.234294 1.807177 0.296636 0.697264 0.159069 0.137500 1.124035 0.484133 0.371004 0.025548 0.893680 1.672569 0.173735 0.139538 0.442472 4.273607 6.312358 0.656604 0.253701 0.052722 0.089525 0.017416 1.105251 0.035855 0.018811 0.089586 0.682139 1.112727 2.592692 0.023918 1.798853 1.177651 0.332533 0.161787 0.394456 0.075382 0.624294 0.419409 0.196961 0.508851 0.078281 0.249060 0.390322 0.099849 0.094464 4.727182 0.858151 4.008358 1.240275 2.784478 1.223828 0.611973 1.739990 0.990012 0.064105 0.182287 0.748683 0.346960 0.361819 1.338132 2.139501 0.578987 2.000679 0.425860 1.143480 1.080136 0.604545 0.129836 0.584262 1.033739 0.302936 1.136863 2.020366 0.165001 0.571468 6.472279 0.180717 0.593607 0.045376 0.029890 0.670128 0.236199 0.077852 0.268491 0.597054 0.111660 0.619632 0.049906 0.696175 2.457121 0.095131 0.248862 0.140825 0.218959 0.314440 0.612025 0.135107 1.165532 0.257336 0.120037 0.054679 5.306834 0.232523 0.299648 0.131932 0.481306 7.803902 0.089613 0.400547 0.245841 3.151815 2.547870 0.170887 0.083688 0.037967 1.959291 0.210332 0.245034 0.076701 0.119013 10.649107 1.702745 0.185202 1.898718 0.654683 0.296501 0.098369 2.188158 0.189510 0.249313 0.079066 0.055941 0.041977 0.053052 0.012937 0.040767 0.071586 0.057337 0.022355 0.062157 0.099081 0.064600 0.022951 0.042302 0.044040 0.061197 0.053287 0.012066 0.034155 0.069147 phangorn/inst/extdata/RtREV.dat0000644000176200001440000000136213707232051016133 0ustar liggesusers 34 51 35 10 30 384 439 92 128 1 32 221 236 78 70 81 10 79 542 1 372 135 41 94 61 48 18 70 30 90 320 91 124 387 34 68 1 24 35 1 104 33 1 1 34 45 18 15 5 110 54 21 3 51 385 38 593 123 20 16 309 141 30 76 34 23 235 57 1 1 156 158 1 37 116 375 581 134 1 7 49 1 70 1 1 7 141 64 179 14 247 97 24 33 55 1 68 52 17 44 10 22 43 1 11 460 102 294 136 75 225 95 152 183 4 24 77 1 20 134 258 64 148 55 117 146 82 7 49 72 25 110 131 69 62 671 5 13 16 1 55 10 17 23 48 39 47 6 111 182 9 14 1 55 47 28 1 131 45 1 21 307 26 64 1 74 1017 14 31 34 176 197 29 21 6 295 36 35 3 1 1048 112 19 236 92 25 39 196 26 59 0.0646 0.0453 0.0376 0.0422 0.0114 0.0606 0.0607 0.0639 0.0273 0.0679 0.1018 0.0751 0.015 0.0287 0.0681 0.0488 0.0622 0.0251 0.0318 0.0619 phangorn/inst/extdata/JTT.dat0000644000176200001440000000252713707232051015636 0ustar liggesusers 58.00 54.00 45.00 81.00 16.00 528.00 56.00 113.00 34.00 10.00 57.00 310.00 86.00 49.00 9.00 105.00 29.00 58.00 767.00 5.00 323.00 179.00 137.00 81.00 130.00 59.00 26.00 119.00 27.00 328.00 391.00 112.00 69.00 597.00 26.00 23.00 36.00 22.00 47.00 11.00 17.00 9.00 12.00 6.00 16.00 30.00 38.00 12.00 7.00 23.00 72.00 9.00 6.00 56.00 229.00 35.00 646.00 263.00 26.00 7.00 292.00 181.00 27.00 45.00 21.00 14.00 54.00 44.00 30.00 15.00 31.00 43.00 18.00 14.00 33.00 479.00 388.00 65.00 15.00 5.00 10.00 4.00 78.00 4.00 5.00 5.00 40.00 89.00 248.00 4.00 43.00 194.00 74.00 15.00 15.00 14.00 164.00 18.00 24.00 115.00 10.00 102.00 21.00 16.00 17.00 378.00 101.00 503.00 59.00 223.00 53.00 30.00 201.00 73.00 40.00 59.00 47.00 29.00 92.00 285.00 475.00 64.00 232.00 38.00 42.00 51.00 32.00 33.00 46.00 245.00 25.00 103.00 226.00 12.00 118.00 477.00 9.00 126.00 8.00 4.00 115.00 18.00 10.00 55.00 8.00 9.00 52.00 10.00 24.00 53.00 6.00 35.00 12.00 11.00 20.00 70.00 46.00 209.00 24.00 7.00 8.00 573.00 32.00 24.00 8.00 18.00 536.00 10.00 63.00 21.00 71.00 298.00 17.00 16.00 31.00 62.00 20.00 45.00 47.00 11.00 961.00 180.00 14.00 323.00 62.00 23.00 38.00 112.00 25.00 16.00 0.076748 0.051691 0.042645 0.051544 0.019803 0.040752 0.061830 0.073152 0.022944 0.053761 0.091904 0.058676 0.023826 0.040126 0.050901 0.068765 0.058565 0.014261 0.032102 0.066005 phangorn/inst/extdata/mtArt.dat0000644000176200001440000001142413707232051016260 0ustar liggesusers 0.2 0.2 0.2 1 4 500 254 36 98 11 0.2 154 262 0.2 0.2 0.2 0.2 183 862 0.2 262 200 0.2 121 12 81 3 44 0.2 41 180 0.2 12 314 15 0.2 26 2 21 7 63 11 7 3 0.2 4 2 13 1 79 16 2 1 6 515 0.2 209 467 2 0.2 349 106 0.2 0.2 3 4 121 5 79 0.2 312 67 0.2 56 0.2 515 885 106 13 5 20 0.2 184 0.2 0.2 1 14 118 263 11 322 49 0.2 17 0.2 0.2 39 8 0.2 1 0.2 12 17 5 15 673 3 398 44 664 52 31 226 11 7 8 144 112 36 87 244 0.2 166 0.2 183 44 43 0.2 19 204 48 70 289 14 47 660 0.2 0.2 8 0.2 22 7 11 2 0.2 0.2 21 16 71 54 0.2 2 0.2 1 4 251 0.2 72 87 8 9 191 12 20 117 71 792 18 30 46 38 340 0.2 23 0.2 350 0.2 14 3 0.2 1855 85 26 281 52 32 61 544 0.2 2 0.054116 0.018227 0.039903 0.020160 0.009709 0.018781 0.024289 0.068183 0.024518 0.092638 0.148658 0.021718 0.061453 0.088668 0.041826 0.091030 0.049194 0.029786 0.039443 0.057700 // this is the end of the file. The rest are notes. Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val This model has been derived from 36 artropoda mitochondrial genomes. Each gene of the given species was aligned individually. Then, alignments of the whole set of 13 genes where concatenated and passed through GBlocks (Castresana, 2000, in JME) with parameters and output: Minimum Number Of Sequences For A Conserved Position: 20 Minimum Number Of Sequences For A Flanking Position: 32 Maximum Number Of Contiguous Nonconserved Positions: 8 Minimum Length Of A Block: 10 Allowed Gap Positions: With Half Use Similarity Matrices: Yes Flank positions of the 40 selected block(s) Flanks: [6 22] [26 44] [61 70] [77 143] [145 185] [208 236] [309 640] [644 802] [831 941] [956 966] [973 1062] [1085 1339] [1343 1702] [1754 1831] [1840 1911] [1916 1987] [2011 2038] [2097 2118] [2125 2143] [2179 2215] [2243 2268] [2277 2288] [2333 2347] [2476 2518] [2539 2558] [2600 2613] [2637 2672] [2738 2759] [2784 2839] [2882 2924] [2948 3097] [3113 3123] [3210 3235] [3239 3322] [3348 3392] [3406 3526] [3588 3617] [3660 3692] [3803 3830] [3909 3928] New number of positions in MtArt-strict.phy.fasta-gb: 2664 (67% of the original 3933 positions) The species included in the analysis were: Harpiosquilla harpax [NCBI_TaxID 287944] Ixodes uriae [NCBI_TaxID 59655] Heptathela hangzhouensis [NCBI_TaxID 216259] Triops longicaudatus [NCBI_TaxID 58777] Gryllotalpa orientalis [NCBI_TaxID 213494] lepidopsocid RS-2001 [NCBI_TaxID 159971] Locusta migratoria [NCBI_TaxID 7004] Drosophila yakuba [NCBI_TaxID 7245] Ostrinia furnacalis [NCBI_TaxID 93504] Megabalanus volcano [NCBI_TaxID 266495] Periplaneta fuliginosa [NCBI_TaxID 36977] Thermobia domestica [NCBI_TaxID 89055] Aleurochiton aceris [NCBI_TaxID 266942] Schizaphis graminum [NCBI_TaxID 13262] Pteronarcys princeps [NCBI_TaxID 285953] Aleurodicus dugesii [NCBI_TaxID 30099] Pollicipes polymerus [NCBI_TaxID 36137] Gomphiocephalus hodgsoni [NCBI_TaxID 221270] Habronattus oregonensis [NCBI_TaxID 130930] Speleonectes tulumensis [NCBI_TaxID 84346] Hutchinsoniella macracantha [NCBI_TaxID 84335] Haemaphysalis flava [NCBI_TaxID 181088] Scutigera coleoptrata [NCBI_TaxID 29022] Vargula hilgendorfii [NCBI_TaxID 6674] Tricholepidion gertschi [NCBI_TaxID 89825] Varroa destructor [NCBI_TaxID 109461] Bombyx mandarina [NCBI_TaxID 7092] Thyropygus sp. [NCBI_TaxID 174155] Tribolium castaneum [NCBI_TaxID 7070] Pagurus longicarpus [NCBI_TaxID 111067] Limulus polyphemus [NCBI_TaxID 6850] Tetrodontophora bielanensis [NCBI_TaxID 48717] Penaeus monodon [NCBI_TaxID 6687] Daphnia pulex [NCBI_TaxID 6669] Apis mellifera [NCBI_TaxID 7469] Anopheles gambiae [NCBI_TaxID 7165] The topology used for inferring the model was: (((Daph_pulex,Trio_longi),((((((Aleu_aceri,Aleu_duges),Schi_grami),lepi_RS_20), ((((Ostr_furna,Bomb_manda),(Dros_yakub,Anop_gambi)),Apis_melli),Trib_casta)), ((Gryl_orien,Locu_migra),(Pter_princ,Peri_fulig))),(Tric_gerts,Ther_domes)), (Scut_coleo,Thyr_sp),Varg_hilge,Hutc_macra,((((Ixod_uriae,Haem_flava),Varr_destr), (Habr_orego,Hept_hangz)),Limu_polyp),(Poll_polym,Mega_volca),(Gomp_hodgs,Tetr_biela), ((Pagu_longi,Pena_monod),Harp_harpa),Spel_tulum)); Note this is not the ML topology but the consensus one (based on morphological data, phylogenetic reconstruction using nuclear genes, etc). Where relationships are not clear, a polytomy was introduced (it contains quite a lot of polytomies!). The model was estimated using Ziheng Yang's Paml software package. A four-categorized gamma distribution was used to account for heterogeneity (alpha was estimated to be 0.47821). Sites with ambiguity data were taken into account. Reference Abascal, F., D. Posada, and R. Zardoya. 2007. MtArt: A new Model of amino acid replacement for Arthropoda. Mol. Biol. Evol. 24:1-5. phangorn/inst/extdata/wag.dat0000644000176200001440000000577713707232051015765 0ustar liggesusers0.551571 0.509848 0.635346 0.738998 0.147304 5.429420 1.027040 0.528191 0.265256 0.0302949 0.908598 3.035500 1.543640 0.616783 0.0988179 1.582850 0.439157 0.947198 6.174160 0.021352 5.469470 1.416720 0.584665 1.125560 0.865584 0.306674 0.330052 0.567717 0.316954 2.137150 3.956290 0.930676 0.248972 4.294110 0.570025 0.249410 0.193335 0.186979 0.554236 0.039437 0.170135 0.113917 0.127395 0.0304501 0.138190 0.397915 0.497671 0.131528 0.0848047 0.384287 0.869489 0.154263 0.0613037 0.499462 3.170970 0.906265 5.351420 3.012010 0.479855 0.0740339 3.894900 2.584430 0.373558 0.890432 0.323832 0.257555 0.893496 0.683162 0.198221 0.103754 0.390482 1.545260 0.315124 0.174100 0.404141 4.257460 4.854020 0.934276 0.210494 0.102711 0.0961621 0.0467304 0.398020 0.0999208 0.0811339 0.049931 0.679371 1.059470 2.115170 0.088836 1.190630 1.438550 0.679489 0.195081 0.423984 0.109404 0.933372 0.682355 0.243570 0.696198 0.0999288 0.415844 0.556896 0.171329 0.161444 3.370790 1.224190 3.974230 1.071760 1.407660 1.028870 0.704939 1.341820 0.740169 0.319440 0.344739 0.967130 0.493905 0.545931 1.613280 2.121110 0.554413 2.030060 0.374866 0.512984 0.857928 0.822765 0.225833 0.473307 1.458160 0.326622 1.386980 1.516120 0.171903 0.795384 4.378020 0.113133 1.163920 0.0719167 0.129767 0.717070 0.215737 0.156557 0.336983 0.262569 0.212483 0.665309 0.137505 0.515706 1.529640 0.139405 0.523742 0.110864 0.240735 0.381533 1.086000 0.325711 0.543833 0.227710 0.196303 0.103604 3.873440 0.420170 0.398618 0.133264 0.428437 6.454280 0.216046 0.786993 0.291148 2.485390 2.006010 0.251849 0.196246 0.152335 1.002140 0.301281 0.588731 0.187247 0.118358 7.821300 1.800340 0.305434 2.058450 0.649892 0.314887 0.232739 1.388230 0.365369 0.314730 0.0866279 0.043972 0.0390894 0.0570451 0.0193078 0.0367281 0.0580589 0.0832518 0.0244313 0.048466 0.086209 0.0620286 0.0195027 0.0384319 0.0457631 0.0695179 0.0610127 0.0143859 0.0352742 0.0708956 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val #Symmetrical part of the WAG rate matrix and aa frequencies, #estimated from 3905 globular protein amino acid sequences forming 182 #protein families. #The first part above indicates the symmetric 'exchangeability' #parameters, where s_ij = s_ji. The s_ij above are not scaled, but the #PAML package will perform this scaling. #The second part gives the amino acid frequencies (pi_i) #estimated from the 3905 sequences. The net replacement rate from i to #j is Q_ij = s_ij*pi_j. #Prepared by Simon Whelan and Nick Goldman, December 2000. # #Citation: #Whelan, S. and N. Goldman. 2001. A general empirical model of #protein evolution derived from multiple protein families using #a maximum likelihood approach. Molecular Biology and #Evolution 18:691-699. phangorn/inst/extdata/VT.dat0000644000176200001440000000353213707232051015523 0ustar liggesusers 0.233108 0.199097 0.210797 0.265145 0.105191 0.883422 0.227333 0.031726 0.027495 0.010313 0.310084 0.493763 0.2757 0.205842 0.004315 0.567957 0.25524 0.270417 1.599461 0.005321 0.960976 0.876213 0.156945 0.362028 0.311718 0.050876 0.12866 0.250447 0.078692 0.213164 0.290006 0.134252 0.016695 0.315521 0.104458 0.058131 0.222972 0.08151 0.087225 0.01172 0.046398 0.054602 0.046589 0.051089 0.020039 0.42463 0.192364 0.069245 0.060863 0.091709 0.24353 0.151924 0.087056 0.103552 2.08989 0.393245 1.755838 0.50306 0.261101 0.004067 0.738208 0.88863 0.193243 0.153323 0.093181 0.201204 0.21155 0.08793 0.05742 0.012182 0.02369 0.120801 0.058643 0.04656 0.021157 0.493845 1.105667 0.096474 0.116646 0.042569 0.039769 0.016577 0.051127 0.026235 0.028168 0.050143 0.079807 0.32102 0.946499 0.038261 0.173052 0.399143 0.12848 0.083956 0.160063 0.011137 0.15657 0.205134 0.124492 0.078892 0.054797 0.169784 0.212302 0.010363 0.042564 1.817198 0.292327 0.847049 0.461519 0.17527 0.358017 0.406035 0.612843 0.167406 0.081567 0.214977 0.400072 0.090515 0.138119 0.430431 0.877877 0.204109 0.471268 0.178197 0.079511 0.248992 0.321028 0.136266 0.101117 0.376588 0.243227 0.446646 0.184609 0.08587 0.207143 1.767766 0.030309 0.046417 0.010459 0.011393 0.007732 0.021248 0.018844 0.02399 0.020009 0.034954 0.083439 0.023321 0.022019 0.12805 0.014584 0.035933 0.020437 0.087061 0.09701 0.093268 0.051664 0.042823 0.062544 0.0552 0.037568 0.286027 0.086237 0.189842 0.068689 0.073223 0.898663 0.032043 0.121979 0.094617 0.124746 1.230985 0.113146 0.049824 0.048769 0.163831 0.112027 0.205868 0.082579 0.068575 3.65443 1.337571 0.144587 0.307309 0.247329 0.129315 0.1277 0.740372 0.022134 0.125733 0.078837 0.051238 0.042313 0.053066 0.015175 0.036713 0.061924 0.070852 0.023082 0.062056 0.096371 0.057324 0.023771 0.043296 0.043911 0.063403 0.055897 0.013272 0.034399 0.073101 phangorn/inst/extdata/Dayhoff.dat0000644000176200001440000000250613707232051016552 0ustar liggesusers 27.00 98.00 32.00 120.00 0.00 905.00 36.00 23.00 0.00 0.00 89.00 246.00 103.00 134.00 0.00 198.00 1.00 148.00 1153.00 0.00 716.00 240.00 9.00 139.00 125.00 11.00 28.00 81.00 23.00 240.00 535.00 86.00 28.00 606.00 43.00 10.00 65.00 64.00 77.00 24.00 44.00 18.00 61.00 0.00 7.00 41.00 15.00 34.00 0.00 0.00 73.00 11.00 7.00 44.00 257.00 26.00 464.00 318.00 71.00 0.00 153.00 83.00 27.00 26.00 46.00 18.00 72.00 90.00 1.00 0.00 0.00 114.00 30.00 17.00 0.00 336.00 527.00 243.00 18.00 14.00 14.00 0.00 0.00 0.00 0.00 15.00 48.00 196.00 157.00 0.00 92.00 250.00 103.00 42.00 13.00 19.00 153.00 51.00 34.00 94.00 12.00 32.00 33.00 17.00 11.00 409.00 154.00 495.00 95.00 161.00 56.00 79.00 234.00 35.00 24.00 17.00 96.00 62.00 46.00 245.00 371.00 26.00 229.00 66.00 16.00 53.00 34.00 30.00 22.00 192.00 33.00 136.00 104.00 13.00 78.00 550.00 0.00 201.00 23.00 0.00 0.00 0.00 0.00 0.00 27.00 0.00 46.00 0.00 0.00 76.00 0.00 75.00 0.00 24.00 8.00 95.00 0.00 96.00 0.00 22.00 0.00 127.00 37.00 28.00 13.00 0.00 698.00 0.00 34.00 42.00 61.00 208.00 24.00 15.00 18.00 49.00 35.00 37.00 54.00 44.00 889.00 175.00 10.00 258.00 12.00 48.00 30.00 157.00 0.00 28.00 0.087127 0.040904 0.040432 0.046872 0.033474 0.038255 0.049530 0.088612 0.033618 0.036886 0.085357 0.080482 0.014753 0.039772 0.050680 0.069577 0.058542 0.010494 0.029916 0.064718 phangorn/inst/extdata/jtt-dcmut.dat0000644000176200001440000000564613707232051017115 0ustar liggesusers0.531678 0.557967 0.451095 0.827445 0.154899 5.549530 0.574478 1.019843 0.313311 0.105625 0.556725 3.021995 0.768834 0.521646 0.091304 1.066681 0.318483 0.578115 7.766557 0.053907 3.417706 1.740159 1.359652 0.773313 1.272434 0.546389 0.231294 1.115632 0.219970 3.210671 4.025778 1.032342 0.724998 5.684080 0.243768 0.201696 0.361684 0.239195 0.491003 0.115968 0.150559 0.078270 0.111773 0.053769 0.181788 0.310007 0.372261 0.137289 0.061486 0.164593 0.709004 0.097485 0.069492 0.540571 2.335139 0.369437 6.529255 2.529517 0.282466 0.049009 2.966732 1.731684 0.269840 0.525096 0.202562 0.146481 0.469395 0.431045 0.330720 0.190001 0.409202 0.456901 0.175084 0.130379 0.329660 4.831666 3.856906 0.624581 0.138293 0.065314 0.073481 0.032522 0.678335 0.045683 0.043829 0.050212 0.453428 0.777090 2.500294 0.024521 0.436181 1.959599 0.710489 0.121804 0.127164 0.123653 1.608126 0.191994 0.208081 1.141961 0.098580 1.060504 0.216345 0.164215 0.148483 3.887095 1.001551 5.057964 0.589268 2.155331 0.548807 0.312449 1.874296 0.743458 0.405119 0.592511 0.474478 0.285564 0.943971 2.788406 4.582565 0.650282 2.351311 0.425159 0.469823 0.523825 0.331584 0.316862 0.477355 2.553806 0.272514 0.965641 2.114728 0.138904 1.176961 4.777647 0.084329 1.257961 0.027700 0.057466 1.104181 0.172206 0.114381 0.544180 0.128193 0.134510 0.530324 0.089134 0.201334 0.537922 0.069965 0.310927 0.080556 0.139492 0.235601 0.700693 0.453952 2.114852 0.254745 0.063452 0.052500 5.848400 0.303445 0.241094 0.087904 0.189870 5.484236 0.113850 0.628608 0.201094 0.747889 2.924161 0.171995 0.164525 0.315261 0.621323 0.179771 0.465271 0.470140 0.121827 9.533943 1.761439 0.124066 3.038533 0.593478 0.211561 0.408532 1.143980 0.239697 0.165473 0.076862 0.051057 0.042546 0.051269 0.020279 0.041061 0.061820 0.074714 0.022983 0.052569 0.091111 0.059498 0.023414 0.040530 0.050532 0.068225 0.058518 0.014336 0.032303 0.066374 A R N D C Q E G H I L K M F P S T W Y V Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val #JTT rate matrix prepared using the DCMut method* #------------------------------------------------ # #The first part above indicates the symmetric 'exchangeability' parameters s_ij, #where s_ij = s_ji. #The second part gives the amino acid equilibrium frequencies pi_i. #The net replacement rate from i to j is q_ij = pi_j*s_ij. # #This model is usually scaled so that the mean rate of change at #equilibrium, Sum_i Sum_j!=i pi_i*q_ij, equals 1. You should check this #scaling before using the matrix above. The PAML package will perform #this scaling. # #// # #*Prepared by Carolin Kosiol and Nick Goldman, December 2003. # #See the following paper for more details: #Kosiol, C., and Goldman, N. 2005. Different versions of the Dayhoff rate matrix. #Molecular Biology and Evolution 22:193-199. # #See also http://www.ebi.ac.uk/goldman/dayhoff phangorn/inst/CITATION0000644000176200001440000000235713766713220014216 0ustar liggesusersnote <- sprintf("(phangorn %s).", meta$Version) citHeader("Use 2011 to cite phangorn in a publication; 2017 for plotting phylogenetic networks. As phangorn is evolving quickly, you may want to cite also its version number", note) bibentry(bibtype = "Article", title = "phangorn: phylogenetic analysis in R", author = personList(as.person("K.P. Schliep")), journal = "Bioinformatics", year = "2011", volume = "27", number = "4", pages = "592--593", doi = "10.1093/bioinformatics/btq706", textVersion = "Schliep K.P. 2011. phangorn: phylogenetic analysis in R. Bioinformatics, 27(4) 592-593") bibentry(bibtype = "Article", author = "Schliep, Klaus and Potts, Alastair J. and Morrison, David A. and Grimm, Guido W.", title = "Intertwining phylogenetic trees and networks", journal = "Methods in Ecology and Evolution", volume = "8", number = "10", doi = "10.1111/2041-210X.12760", pages = "1212--1220", keywords = "exploratory data analysis, networks, phangorn, R, trees", year = "2017", textVersion = "Schliep, K., Potts, A. J., Morrison, D. A., Grimm, G. W. (2017), Intertwining phylogenetic trees and networks. Methods in Ecology and Evolution, 8: 1212--1220. doi: 10.1111/2041-210X.12760" ) phangorn/inst/tinytest/0000755000176200001440000000000014141211152014716 5ustar liggesusersphangorn/inst/tinytest/test_pml.R0000644000176200001440000001164214137004250016700 0ustar liggesuserstreeU1 <- read.tree(text = "((t1:.1,t2:.1):.1,t3:.2,(t4:.1,t5:.1):.3);") # edge length changed treeU2 <- read.tree(text = "((t1:.15,t2:.15):.05,t3:.2,(t4:.1,t5:.1):.3);") # 1 NNI move treeU3 <- read.tree(text = "((t1:.1,t3:.1):.1,t2:.2,(t4:.1,t5:.1):.3);") treeR1 <- read.tree(text = "(((t1:.1,t2:.1):.1,t3:.2):.1,(t4:.1,t5:.1):.2);") # edge length changed treeR2 <- read.tree(text = "(((t1:.15,t2:.15):.05,t3:.2):.1,(t4:.1,t5:.1):.2);") # 1 NNI move treeR3 <- read.tree(text = "(((t1:.1,t3:.1):.1,t2:.2):.1,(t4:.1,t5:.1):.2);") # dat <- phyDat(c(t1="a", t2="a",t3="t",t4="t"), type="USER", # levels=c("a","c","g","t")) #tree2 <- read.tree(text = "((t1,t3),t2,t4);") dat <- allSitePattern(5) weights <- as.vector(1000 * exp(pml(treeR1, dat)$siteLik)) attr(dat, "weight") <- weights dat_Mk <- subset(dat, select = -c(1,342,683, 1024)) Q <- c(6:1) pmlU1 <- pml(treeU1, dat) pmlU2 <- pml(treeU2, dat) pmlU2.fitted <- optim.pml(pmlU2, control = pml.control(trace=0)) pmlU3 <- pml(treeU3, dat) pmlU3.fitted <- optim.pml(pmlU3, TRUE, control = pml.control(epsilon=1e-10, trace=0)) pmlR1 <- pml(treeR1, dat) pmlR2 <- pml(treeR2, dat) pmlR2.fitted <- optim.pml(pmlR2, optRooted = TRUE, control = pml.control(epsilon=1e-10, trace=0)) pmlR3 <- pml(treeR3, dat) pmlR3.fitted <- optim.pml(pmlR3, TRUE, optRooted = TRUE, control = pml.control(epsilon=1e-10, trace=0)) # test edge length optimisation expect_equal(logLik(pmlU2.fitted), logLik(pmlU1)) expect_equal(logLik(pmlR2.fitted), logLik(pmlR1)) expect_equal(pmlU2.fitted$tree, pmlU1$tree, tolerance=1e-6) # expect_equal(pmlR2.fitted$tree, pmlR1$tree, tolerance=5e-5) # test NNI optimisation expect_equal(logLik(pmlU3.fitted), logLik(pmlU1)) expect_equal(logLik(pmlR3.fitted), logLik(pmlR1), tolerance = 1e-06) expect_equal(pmlU3.fitted$tree, pmlU1$tree, tolerance=1e-6) expect_equal(storage.mode(pmlU3.fitted$tree$edge), "integer") # expect_equal(pmlR3.fitted$tree, pmlR1$tree, tolerance=5e-6) # test bf optimisation bf <- c(.1,.2,.3,.4) fit_T <- pml(treeU1, dat, bf=bf) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.bf <- optim.pml(fit0, optEdge=FALSE, optBf = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.bf), logLik(pml(treeU1, dat_tmp, bf=bf))) expect_equal(bf, fit.bf$bf, tolerance=5e-4) # test Q optimisation Q <- c(6:1) fit_T <- pml(treeU1, dat, Q=Q) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.Q <- optim.pml(fit0, optEdge=FALSE, optQ = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Q), logLik(pml(treeU1, dat_tmp, Q=Q))) expect_equal(Q, fit.Q$Q, tolerance=5e-4) # test Inv optimisation inv <- 0.25 fit_T <- pml(treeU1, dat, inv=inv) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.Inv <- optim.pml(fit0, optEdge=FALSE, optInv = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Inv), logLik(pml(treeU1, dat_tmp, inv=inv))) expect_equal(inv, fit.Inv$inv, tolerance=5e-4) # test Gamma optimisation shape <- 2 fit_T <- pml(treeU1, dat, shape=shape, k=4) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp, k=4) fit.Gamma <- optim.pml(fit0, optEdge=FALSE, optGamma = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.Gamma), logLik(pml(treeU1, dat_tmp, shape=shape, k=4))) expect_equal(shape, fit.Gamma$shape, tolerance=5e-4) # test free_rate fit0 <- pml(treeU1, dat_tmp, k=4, site.rate = "free_rate") fit.freerate <- optim.pml(fit0, optEdge=FALSE, optGamma = TRUE, control = pml.control(epsilon=1e-10, trace=0)) # expect_equal(discrete.gamma(2,4), fit.freerate$g, tolerance=1e-4) expect_equal(logLik(fit.freerate), logLik(pml(treeU1, dat_tmp, shape=shape, k=4))) # test rate optimisation rate <- 2 fit_T <- pml(treeU1, dat, rate=rate) weights <- as.vector(1000 * exp(fit_T$siteLik)) dat_tmp <- dat attr(dat_tmp, "weight") <- weights fit0 <- pml(treeU1, dat_tmp) fit.rate <- optim.pml(fit0, optEdge=FALSE, optRate = TRUE, control = pml.control(epsilon=1e-10, trace=0)) expect_equal(logLik(fit.rate), logLik(pml(treeU1, dat_tmp, rate=rate))) expect_equal(rate, fit.rate$rate, tolerance=5e-4) # test Mkv model expect_equal(logLik(pmlU2.fitted), logLik(pmlU1)) phangorn/inst/tinytest/test_mast.R0000644000176200001440000000103413707232051017052 0ustar liggesusers## generate data set.seed(42) tree1 <- rtree(100) tree2 <- rSPR(tree1, 5) tips <- mast(tree1, tree2, tree = FALSE) mast_tree <- mast(tree1, tree2) tip_label <- tree1$tip.label tips_to_delete <- setdiff(tip_label, tips) tree1_drop <- drop.tip(tree1, tips_to_delete) tree2_drop <- drop.tip(tree2, tips_to_delete) # test maximum agreement subtree (MAST) ## common subtrees should be identical expect_equal(RF.dist(tree1_drop, tree2_drop), 0) expect_equal(RF.dist(tree1_drop, mast_tree), 0) expect_equal(RF.dist(tree2_drop, mast_tree), 0) phangorn/inst/tinytest/test_dist_tree.R0000644000176200001440000000112214033000161020052 0ustar liggesusersdata(Laurasiatherian) dm <- dist.ml(Laurasiatherian) # check nnls functions tree_nj <- NJ(dm) tree_unj <- UNJ(dm) tree_nnls_unj <- nnls.phylo(tree_unj, dm) tree_nnls_nj <- nnls.phylo(tree_nj, dm) tree_upgma <- upgma(dm) tree_wpgma <- wpgma(dm) tree_nnls_upgma <- nnls.phylo(tree_upgma, dm, rooted=TRUE) tree_nnls_wpgma <- nnls.phylo(tree_wpgma, dm, rooted=TRUE) expect_equal(tree_upgma, tree_nnls_upgma) expect_false(all.equal(tree_wpgma, tree_nnls_wpgma)) # expect_equal(tree_unj, tree_nnls_unj) expect_false(all.equal(tree_nj, tree_nnls_nj)) phangorn/inst/tinytest/test_treeRearrangement.R0000644000176200001440000000145513707232051021567 0ustar liggesusersset.seed(42) tree_u <- rtree(100, rooted=FALSE) tree_r <- rtree(100) # nni nni_trees_u <- nni(tree_u) nni_trees_r <- nni(tree_r) ## nni expect_true(inherits(nni(tree_u), "multiPhylo")) expect_true(all(RF.dist(nni_trees_u, tree_u)>0)) expect_true(length(nni_trees_u) == 194L) expect_true(length(nni_trees_r) == 196L) expect_true(all( RF.dist(tree_u, nni_trees_u) == 2)) expect_true(median( RF.dist(tree_r, nni_trees_r) ) == 2) r_nni <- rNNI(tree_u, 3, 100) # rNNI expect_true(length(r_nni) == 100L) expect_true(median( RF.dist(tree_u, r_nni) ) == 6) expect_true(median( RF.dist(r_nni[[1]], r_nni) ) == 12) set.seed(42) r_spr <- rSPR(tree_u, 3, 100) # allTrees expect_true(length(r_spr) == 100L) expect_true(median( SPR.dist(tree_u, r_spr) ) == 3) expect_true(median( SPR.dist(r_spr[[1]], r_spr) ) == 6) phangorn/inst/tinytest/test_treedist.R0000644000176200001440000001113213707232051017731 0ustar liggesusers## generate data library(ape) set.seed(42) tree <- rtree(10, FALSE) trees <- nni(tree) tree1 <- read.tree(text="(t5:1.0,(t4:1.0,t3:1.0):1.0,(t1:1.0,t2:1.0):1.0);") tree2 <- read.tree(text="(t4:1.0,(t5:1.0,t3:1.0):1.0,(t1:1.0,t2:1.0):1.0);") tree3 <- read.tree(text="(t5:1.0,t4:1.0,t3:1.0,(t1:1.0,t2:1.0):1.0);") # Robinson-Foulds distance ## check RF.dist and tree dist expect_equivalent(RF.dist(tree1, tree1), 0) expect_equivalent(RF.dist(tree1, tree2), 2) expect_equivalent(RF.dist(tree1, tree3), 1) expect_true( all(RF.dist(tree, trees)==2) ) expect_true(inherits(RF.dist(trees),"dist")) expect_equivalent(treedist(tree1, tree1)[1], 0) expect_equivalent(treedist(tree1, tree2)[1], 2) expect_equivalent(treedist(tree1, tree3)[1], 1) # Kuhner-Felsenstein distance (branch score difference) ## check RF.dist and tree dist expect_equivalent(KF.dist(tree1, tree1), 0) expect_equivalent(KF.dist(tree1, tree2), sqrt(2)) expect_equivalent(KF.dist(tree1, tree3), 1) expect_true(inherits(KF.dist(trees),"dist")) expect_equivalent(treedist(tree1, tree1)[2], 0) expect_equivalent(treedist(tree1, tree2)[2], sqrt(2)) expect_equivalent(treedist(tree1, tree3)[2], 1) expect_equal(KF.dist(tree1, c(tree1, tree2, tree3)), c(0, sqrt(2), 1)) # path distance ## check path dist expect_equivalent(path.dist(tree1, tree1), 0) expect_equal(path.dist(trees)[1:13] , path.dist(trees[[1]], trees[2:14])) expect_true(inherits(path.dist(trees),"dist")) ############################ # new tests from Michelle ############################ # make simple trees with one pair of unmatched edges, unit branch lengths tr1 <- read.tree(text="((A:1,B:1):1,C:1,(D:1,E:1):1);") tr2 <- read.tree(text="((A:1,C:1):1,B:1,(D:1,E:1):1);") # make a tree with same topology as tr1 but varied branch lengths tr3 <- read.tree(text="((A:2,B:1):3,C:1,(D:1,E:2):1);") # Distance between known trees matches calculation by hand # one pair of unmatched edges, unit branch lengths expect_equal(wRF.dist(tr1,tr2),2) # one pair of unmatched edges (branch lengths irrelevant) expect_equal(RF.dist(tr1,tr2),2) # same topology, different branch lengths expect_equal(wRF.dist(tr1,tr3),4) # same topology (branch lengths irrelevant) expect_equal(RF.dist(tr1,tr3),0) # one pair of unmatched edges, varied branch lengths expect_equal(wRF.dist(tr2,tr3),6) ############################ # test that RF and wRF give same values for trees with every edge = 1 ############################ # When each tree has unit branch lengths, RF = wRF", { expect_equal( max( # test some random numbers of tips between 10 and 500 sapply(sample(10:500,50), function(x) { # generate 20 unrooted trees with the given number of tips and unit branch # lengths trees <- rmtree(20, x, rooted=FALSE, br=1) # find maximum abs difference between RF and wRF distance (expect 0) max(abs(RF.dist(trees) - wRF.dist(trees))) })), # find max of all these 0) # expect equal to 0 # now the same for comparison of one tree with many expect_equal( max( # test some random numbers of tips between 10 and 500 sapply(sample(10:500,50), function(x) { # generate 20 unrooted trees with the given number of tips and unit branch # lengths trees <- rmtree(20, x, rooted=FALSE, br=1) # find maximum abs difference between RF and wRF distance (expect 0) max(abs(RF.dist(trees[[1]], trees) - wRF.dist(trees[[1]], trees))) })), # find max of all these 0) # expect equal to 0 ############################# # test sprdist from leomrtns ############################# # SPR distance set.seed(123) tree1 <- rtree(100, rooted = FALSE) tree2 <- rSPR(tree1, 1) trees <- rSPR(tree1, 1:5) expect_equal(sprdist(tree1, tree2)[[1]], 1) expect_equal(sprdist(tree1, tree2)[[3]], RF.dist(tree1, tree2)) expect_equal(SPR.dist(tree1, trees), 1:5) expect_true(inherits(SPR.dist(trees), "dist")) # Fix to issue #97 on github tr1 <- structure(list(edge = structure(c(11L, 11L, 10L, 10L, 9L, 9L, 8L, 8L, 7L, 7L, 2L, 6L, 5L, 11L, 4L, 10L, 3L, 9L, 1L, 8L), .Dim = c(10L, 2L)), tip.label = c("t1", "t2", "t3", "t4", "t5", "t6"), Nnode = 5), class = "phylo") tr3 <- structure(list(edge = structure(c(9L, 9L, 11L, 11L, 10L, 10L, 8L, 8L, 7L, 7L, 1L, 2L, 4L, 5L, 6L, 11L, 3L, 9L, 8L, 10L), .Dim = c(10L, 2L)), tip.label = c("t1", "t2", "t3", "t4", "t5", "t6"), Nnode = 5L), class = "phylo") expect_equal(SPR.dist(tr1, tr3), SPR.dist(tr3, tr1)) phangorn/inst/tinytest/test_Clanistics.R0000644000176200001440000000061313746646635020230 0ustar liggesuserstree <- rtree(10) x <- simSeq(tree, l = 5, type="USER", levels = c("red", "violet", "blue")) # test that clanistics works properly expect_true(inherits(getClans(tree), "matrix")) expect_true(inherits(getClips(tree), "matrix")) expect_true(inherits(getSlices(tree), "matrix")) expect_true(inherits(getDiversity(tree, x), "clanistics")) expect_true(inherits(getDiversity(tree, x), "data.frame")) phangorn/inst/tinytest/test_pmlPen.R0000644000176200001440000000153213707232051017344 0ustar liggesusersX <- allSitePattern(5) attr(X, "index") <- NULL tree1 <- read.tree(text = "((t1:0.1,t2:0.5):0.1,(t3:0.1,t4:0.5):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.5,t2:0.1):0.1,(t3:0.5,t4:0.1):0.1,t5:0.5);") fit1 <- pml(tree1,X) fit2 <- pml(tree2,X) attr(X, "weight") <- 1000*exp(fit1$siteLik) Y <- X attr(Y, "weight") <- 1000*exp(fit2$siteLik) fit1 <- update(fit1, data=X) fit2 <- update(fit2, data=Y) sp <- pmlPart(~ edge, list(fit1, fit2), pml.control(trace = 0)) pp0 <- pmlPen(sp, lambda = 0, pml.control(trace = 0)) ppInf <- pmlPen(sp, lambda = 1e6, pml.control(trace = 0)) Z <- cbind(X,Y) fit3 <- update(fit1, data=Z) fit3 <- optim.pml(fit3, control = pml.control(trace = 0)) # test penalized partition model expect_equal(pp0$logLik[1], fit1$logLik + fit2$logLik) #, tolerance = 0.002) expect_equal(ppInf$logLik[1], fit3$logLik, tolerance = 1e-5) phangorn/inst/tinytest/test_treeManipulation.R0000644000176200001440000000421513707232051021432 0ustar liggesusersset.seed(42) tree <- rtree(100, rooted=FALSE) tree2 <- root(tree, 1, resolve.root = TRUE) trees <- lapply(sample(10:500,50), function(x)tree <- rtree(x, rooted=FALSE) ) desc_108 <- Descendants(tree, 108)[[1]] node_108 <- mrca.phylo(tree, node=desc_108) # test ancestor, mrca, descendants expect_equal(mrca.phylo(tree, node=desc_108), 108L) expect_equal(mrca(tree), mrca.phylo(tree)) kids_108 <- Descendants(tree, 108, "children") expect_equal(length(Descendants(tree, 101L, "all")), 197L) expect_equal(lengths(Descendants(tree2, 101L:199, "all")), 2 * lengths(prop.part(tree2)) - 2L) expect_equal(Ancestors(tree, kids_108, "parent"), rep(108L, length(kids_108))) expect_equal(Siblings(tree, kids_108[1], include.self=TRUE), kids_108) # test allTrees ## allTrees expect_true(inherits(allTrees(6), "multiPhylo")) expect_true(all(RF.dist(allTrees(6))>0)) # TODO: check why rooted trees give error in development version # test midpoint # topology stays the same expect_equal( max( sapply(trees, function(x)RF.dist(x,midpoint(x)))), 0) # 2 * max(height) == max(cophenetic) expect_equal( max( node.depth.edgelength(midpoint(tree)) *2), max(cophenetic(tree))) # test maxCladeCred tree <- rcoal(100) trees <- nni(tree) expect_equal(maxCladeCred(c(tree, trees)), tree) tree <- rtree(100, rooted = FALSE) trees <- nni(tree) expect_equal(tree, allCompat(trees), use.edge.length = FALSE) # test add.tips tree <- rcoal(20) tree$tip.label <- paste0("t", 1:Ntip(tree)) tree$node.label <- paste0("n", 1:Nnode(tree)) tree1 <- add.tips(tree, c("A", "B", "C", "D"), c("t5", "t10", "n5", "n10")) tree2 <- add.tips(tree, c("A", "B", "C", "D"), c(5, 10, 25, 30)) expect_equal(RF.dist(tree1, tree2), 0) expect_false(is.binary(tree1)) expect_false(is.binary(tree2)) # test plotBS set.seed(1) data("Laurasiatherian") bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)NJ(dist.hamming(x)), bs=50) tree <- NJ(dist.hamming(Laurasiatherian)) treeBS <- plotBS(tree, bs, type="none") expect_equal(length(treeBS$node.label), treeBS$Nnode) expect_true(all(treeBS$node.label >=0) ) expect_true(all(treeBS$node.label <= 100) ) phangorn/inst/tinytest/test_ancestral.R0000644000176200001440000000161113746646601020100 0ustar liggesuserstree <- read.tree(text = "((t1:1,t2:1):1,(t3:1,t4:1):1);") dat <- matrix(c("a", "a", "a", "t", "t", "a", "t", "t"), byrow = TRUE, nrow = 4L, dimnames = list(c("t1", "t2", "t3", "t4"), NULL)) dna <- phyDat(dat) fit <- pml(tree, dna) # dna tests differs from other data types as it may returns ambiguous data # test ancestral generics test.ml1 <- ancestral.pml(fit, type = "ml") test.ml2 <- ancestral.pml(fit, type = "ml", return = "phyDat") # test1 <- ancestral.pars(tree, dna, "MPR", return = "prob") # test2 <- ancestral.pars(tree, dna, "MPR", return = "phyDat") # test3 <- ancestral.pars(tree, dna, "ACCTRAN", return = "prob") # test4 <- ancestral.pars(tree, dna, "ACCTRAN", return = "phyDat") # expect_equal(as.character(test2), as.character(test4)) # expect_equal(as.character(test.ml2), as.character(test2)) phangorn/inst/tinytest/test_hadamard.R0000644000176200001440000000101013775625112017652 0ustar liggesusersv <- 1:8 data(yeast) dm <- dist.hamming(yeast) # RY-coding yeast_ry <- acgt2ry(yeast) # delete ambiguous states # dat4 <- phyDat(as.character(yeast), type="USER", levels=c("a","c", "g", "t"), # ambiguity=NULL) # fit4 <- h4st(dat4) # test Hadamard conjugation # fast fft like multiplication expect_true(inherits(H <- hadamard(3), "matrix")) expect_equal(as.vector(H %*% v), fhm(v)) expect_true(inherits(spl_ry <- h2st(yeast_ry), "splits")) expect_true(inherits(spl_dm <- distanceHadamard(dm), "splits")) phangorn/inst/tinytest/test_parsimony.R0000644000176200001440000000512514140770035020135 0ustar liggesusersdata(yeast) all_trees <- allTrees(8, tip.label = names(yeast)) tree1 <- read.tree(text = "((t1,t2),t3,t4);") tree2 <- read.tree(text = "((t1,t3),t2,t4);") trees <- .compressTipLabel(c(tree1, tree2)) dat <- phyDat(c(t1="a", t2="a",t3="t",t4="t"), type="USER", levels=c("a","c","g","t")) # TODO # test sitewise pscores, ancestral and different states binary, DNA, AA # sankoff + fitch # CI, RI # test parsimony expect_equal(fitch(tree1, dat), 1) expect_equal(fitch(tree2, dat), 2) expect_equal(fitch(trees, dat), c(1,2)) expect_equal(sankoff(tree1, dat), 1) expect_equal(sankoff(tree2, dat), 2) expect_equal(parsimony(tree1, dat), 1) # test bab all_pars <- fitch(all_trees, yeast) bab_tree <- bab(yeast, trace=0) expect_equal(min(all_pars), fitch(bab_tree, yeast)) for(i in 1:10){ tree100 <- rtree(100, rooted=FALSE) dat_2 <- simSeq(tree100, type="USER", levels=c("a", "b")) dat_3 <- simSeq(tree100, type="USER", levels=c("a", "b", "c")) dat_4 <- simSeq(tree100) pf_2 <- parsimony(tree100, dat_2, method = "fitch", site = "pscore") ps_2 <- parsimony(tree100, dat_2, method = "sankoff", site = "pscore") expect_equal(pf_2, ps_2) pf_3 <- parsimony(tree100, dat_3, method = "fitch", site = "pscore") ps_3 <- parsimony(tree100, dat_3, method = "sankoff", site = "pscore") expect_equal(pf_3, ps_3) pf_4 <- parsimony(tree100, dat_4, method = "fitch", site = "pscore") ps_4 <- parsimony(tree100, dat_4, method = "sankoff", site = "pscore") expect_equal(pf_4, ps_4) pvf_2 <- parsimony(tree100, dat_2, method = "fitch", site = "sitee") pvs_2 <- parsimony(tree100, dat_2, method = "sankoff", site = "site") expect_equal(pvf_2, pvs_2) } # test rearrangements tree <- all_trees[[1]] start <- fitch(tree, yeast) bab_tree <- bab(yeast, trace=0) best <- fitch(bab_tree, yeast) best_fitch <- optim.parsimony(tree, yeast, rearrangements = "NNI", trace=0) best_sankoff <- optim.parsimony(tree, yeast, method="sankoff", rearrangements = "NNI", trace=0) expect_equal(attr(best_fitch, "pscore"), attr(best_sankoff, "pscore")) # test tree length tree <- nj(dist.hamming(yeast)) pscore <- fitch(tree, yeast) tree1 <- acctran(tree, yeast) expect_equal(sum(tree1$edge.length), pscore) tree2 <- rtree(100) dat <- simSeq(tree2) tree2 <- acctran(tree2, dat) expect_equal(sum(tree2$edge.length), fitch(tree2,dat)) # test random.addition ra_tree <- random.addition(yeast) ratchet_tree <- pratchet(yeast, start=ra_tree, trace=0) expect_true(attr(ra_tree, "pscore") >= attr(ratchet_tree, "pscore")) trivial_tree <- pratchet(dat, trace=0) expect_true(inherits(trivial_tree, "phylo")) phangorn/inst/tinytest/test_speciesTree.R0000644000176200001440000000101513707232051020360 0ustar liggesuserstr1 <- read.tree(text = "(((B:0.05,C:0.05):0.01,D:0.06):0.04,A:0.1);") tr2 <- read.tree(text = "(((A:0.07,C:0.07):0.02,D:0.09):0.03,B:0.12);") TR <- c(tr1, tr2) start_tree <- read.tree(text = "(((B,C),D),A);") x <- matrix(c("A", "B", "C", "D"), 4, 1) rownames(x) <- c("A", "B", "C", "D") X <- phyDat(x, type="USER", levels = c("A", "B", "C", "D")) ## check speciesTree st1 <- coalSpeciesTree(TR) st2 <- coalSpeciesTree(TR, X=X) st3 <- coalSpeciesTree(TR, sTree = start_tree) expect_equal(st1, st2) expect_equal(st1, st3) phangorn/inst/tinytest/test_pmlPart.R0000644000176200001440000001206014127046252017531 0ustar liggesusersX <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.3,t3:0.3):0.1,(t2:0.3,t4:0.3):0.1,t5:0.5);") fit0 <- pml(tree, X, k=4) fit1 <- update(fit0, rate=.5) fit2 <- update(fit0, rate=2) weights0 <- 1000*exp(fit0$siteLik) weights1 <- 1000*exp(fit1$siteLik) weights2 <- 1000*exp(fit2$siteLik) W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # test_that rate optimisation works properly sp <- pmlPart(edge ~ rate, fit0, weight=W, control = pml.control(trace=0)) expect_equal( sp$fits[[1]]$rate / sp$fits[[2]]$rate , 2, tolerance = 1e-5) expect_equal( sp$fits[[1]]$rate / sp$fits[[3]]$rate , 0.5, tolerance = 1e-5) # nni # test_that transition rate optimisation works properly Q <- c(6:1) fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, Q=Q) weights1 <- 1000*exp(fit1$siteLik) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, Q=Q) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + Q ~ ., fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(Q, sp$fits[[1]]$Q, tolerance=5e-4) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$siteLik) sp <- pmlPart( ~ Q, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(Q, sp$fits[[1]]$Q, tolerance=5e-4) # test_that base frequency optimisation works properly bf <- (1:4)/10 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, bf=bf) weights1 <- 1000*exp(fit1$siteLik) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, bf=bf) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + bf ~ ., fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(bf, sp$fits[[1]]$bf, tolerance=5e-4) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$siteLik) sp <- pmlPart( ~ bf, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(bf, sp$fits[[1]]$bf, tolerance=5e-4) # Gamma # test_that shape parameter optimisation works properly shape <- 2 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, shape=shape) weights1 <- 1000*exp(fit1$siteLik) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, shape=shape) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + shape ~ ., fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(shape, sp$fits[[1]]$shape, tolerance=5e-3) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$siteLik) sp <- pmlPart( ~ shape, fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(shape, sp$fits[[1]]$shape, tolerance=5e-4) # Invariant sites # test_that Invariant sites optimisation works properly inv <- .2 fit0 <- pml(tree, X, k=4) fit1 <- pml(tree, X, k=4, inv=inv) weights1 <- 1000*exp(fit1$siteLik) Y <- X attr(Y, "weight") <- weights1 fit1 <- pml(tree, Y, k=4, inv=inv) weights0 <- weights1 weights2 <- weights1 W <- cbind(weights0, weights1, weights2) colnames(W) <- c("g1", "g2", "g3") # linked parameter sp <- pmlPart(edge + inv ~ ., fit0, weight=W, control=pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(inv, sp$fits[[1]]$inv, tolerance=5e-5) # unlinked parameter # TODO more complicated models # weights0 <- 1000*exp(fit0$siteLik) sp <- pmlPart( ~ inv, fit0, weight=W, control = pml.control(trace=0)) expect_equal(logLik(sp)[1], logLik(fit1)[1]*3, tolerance=5e-4 ) expect_equal(inv, sp$fits[[1]]$inv, tolerance=5e-5) # linked parameters # test_that Linked parameters optimisation works properly Z <- X fit0 <- pml(tree, X, k=4) weights0 <- 1000*exp(fit0$siteLik) weights1 <- 1000*exp(update(fit0, rate=.5)$siteLik) weights2 <- 1000*exp(update(fit0, tree=tree2)$siteLik) attr(Z, "weight") <- weights0 + weights1 + weights2 W <- cbind(weights0, weights1, weights2) fit_Z <- update(fit0, data=Z) fit_Z <- optim.pml(fit_Z, model="GTR", rearrangement="NNI", optGamma=TRUE, optInv=TRUE, control=pml.control(trace=0)) sp <- pmlPart(edge + bf + Q + shape + inv + nni ~ ., fit_Z, weight=W, control = pml.control(trace=0)) expect_equal(sp$logLik[[1]], fit_Z$logLik, tolerance = 1e-5) phangorn/inst/tinytest/test_pmlMix.R0000644000176200001440000000077213707232051017364 0ustar liggesusersX <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4) weights <- 1000*exp(fit$siteLik) ll0 <- sum(weights*log(weights/sum(weights))) attr(X, "weight") <- weights fit1 <- update(fit, data=X, k=1) #fit2 <- update(fit, data=X) #(fit2 <- optim.pml(fit2, optGamma=TRUE)) # test rate optimisation works properly fitMixture <- pmlMix(~rate, fit1 , m=4, control=pml.control(trace=0)) expect_equal(fitMixture$logLik, ll0, tolerance = 1e-4) phangorn/inst/tinytest/test_phyDat.R0000644000176200001440000000705313707232051017346 0ustar liggesusers# to test: phyDat.codon, data(Laurasiatherian) data(chloroplast) set.seed(42) tree <- rtree(10) codon_align <- simSeq(tree, l=100, type = "CODON") phy_matrix <- as.character(Laurasiatherian) phy_df <- as.data.frame(Laurasiatherian) phy_vec_dna <- phy_matrix[,1] phy_vec_user <- sample(c("0","1"), 26, replace=TRUE) names(phy_vec_user) <- letters phy_dnabin <- as.DNAbin(Laurasiatherian) phy_aabin <- as.AAbin(chloroplast) phy_align <- phyDat2alignment(Laurasiatherian) #test conversion work expect_true(inherits(phy_matrix, "matrix")) expect_true(inherits(phy_df, "data.frame")) expect_true(inherits(phy_dnabin, "DNAbin")) expect_true(inherits(phy_aabin, "AAbin")) expect_true(inherits(phy_align, "alignment")) expect_true(inherits(as.phyDat(phy_matrix), "phyDat")) expect_true(inherits(as.phyDat(phy_df), "phyDat")) expect_true(inherits(as.phyDat(phy_dnabin), "phyDat")) # expect_equal(as.phyDat(phy_aabin), chloroplast)) expect_true(inherits(phyDat(phy_vec_dna), "phyDat")) expect_true(inherits(phyDat(phy_vec_user, type="USER", levels = c("0","1")), "phyDat")) expect_true(inherits(as.phyDat(phy_dnabin), "phyDat")) expect_true(inherits(as.phyDat(phy_align), "phyDat")) expect_true(inherits(c2d <- codon2dna(codon_align), "phyDat")) expect_equal(dna2codon(c2d), codon_align) # test conversion with Biostrings if(suppressPackageStartupMessages(requireNamespace('Biostrings'))){ expect_true(inherits(MA_AA <- as.MultipleAlignment(chloroplast), "AAMultipleAlignment")) # expect_equal(as.phyDat(MA_AA), chloroplast) expect_true(inherits(MA_DNA <- as.MultipleAlignment(Laurasiatherian), "DNAMultipleAlignment")) expect_equal(as.phyDat(MA_DNA), Laurasiatherian) } # test subsetting and combining expect_true(inherits(subset_1 <- subset(Laurasiatherian, select = 1:1000, site.pattern = FALSE), "phyDat")) expect_true(inherits(subset_2 <- subset(Laurasiatherian, select = 1001:3179, site.pattern = FALSE), "phyDat")) expect_true(inherits(lauraCbind1 <- cbind(subset_1, subset_2), "phyDat")) expect_equal(baseFreq(lauraCbind1), baseFreq(Laurasiatherian)) expect_true(inherits(subset_3 <- subset(Laurasiatherian, select = 1:100), "phyDat")) expect_true(inherits(subset_4 <- subset(Laurasiatherian, select = 101:1605), "phyDat")) expect_equal(subset_1, Laurasiatherian[, 1:1000]) expect_error(subset(Laurasiatherian, 1:100), "subscript out of bounds") expect_true(inherits(lauraCbind2 <- cbind(subset_3, subset_4), "phyDat")) expect_equal(baseFreq(lauraCbind2), baseFreq(Laurasiatherian)) # test read and write write.phyDat(Laurasiatherian, "tmp1.txt") expect_true(inherits(laura <- read.phyDat("tmp1.txt"), "phyDat")) expect_equal(laura, Laurasiatherian) unlink("tmp1.txt") write.phyDat(chloroplast, "tmp2.txt") expect_true(inherits(chloro <- read.phyDat("tmp2.txt", type="AA"), "phyDat")) # expect_equal(chloro, chloroplast) # changed to toupper unlink("tmp2.txt") write.phyDat(chloroplast, "tmp.fas", format="fasta") expect_true(inherits(chloro_fas <- read.phyDat("tmp.fas", type="AA", format = "fasta"), "phyDat")) # expect_equal(chloro_fas, chloroplast) # changed to toupper unlink("tmp.fas") # test removing duplicated sequences tmp <- as.character(Laurasiatherian) laura <- phyDat(rbind(phy_matrix, phy_matrix)) names(laura) <- paste0(names(laura), rep(c(1,2), each=47)) map1 <- map_duplicates(laura) map2 <- map_duplicates(Laurasiatherian) expect_null(map2) expect_true(inherits(map1, "data.frame")) phangorn/inst/tinytest/test_superTree.R0000644000176200001440000000124213707232051020065 0ustar liggesuserstree <- rtree(50, rooted=FALSE) trees_simple <- nni(tree) trees <- rNNI(tree, sample(10, 100, replace = TRUE)) trees <- .uncompressTipLabel(trees) labels <- paste0("t", 1:50) trees2 <- lapply(trees, function(x)drop.tip(x, sample(labels, 10))) class(trees2) <- "multiPhylo" # superTree simple_superTree <- superTree(trees_simple, rooted=FALSE) difficult_superTree <- superTree(trees2, rooted=FALSE) expect_equal(RF.dist(simple_superTree, tree) , 0) expect_equal(RF.dist(difficult_superTree, tree) , 0) rf_superTree <- superTree(trees, method="RF") spr_superTree <- superTree(trees, method="SPR") expect_true(attr(rf_superTree, "score") > attr(spr_superTree, "score")) phangorn/inst/tinytest/test_pmlCluster.R0000644000176200001440000000143513707232051020245 0ustar liggesuserstree1 <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") tree2 <- read.tree(text = "((t1:0.3,t3:0.3):0.1,(t2:0.3,t4:0.3):0.1,t5:0.5);") gene1 <- simSeq(tree1, l=200) gene2 <- simSeq(tree1, l=200) gene3 <- simSeq(tree1, l=200) gene4 <- simSeq(tree2, l=200) gene5 <- simSeq(tree2, l=200) X <- cbind(gene1, gene2, gene3, gene4, gene5) weight <- xtabs(~ index+genes,attr(X, "index")) fit <- pml(tree1, X) fit <- optim.pml(fit, control=pml.control(trace=0)) # test nni optimisation sp <- pmlCluster( ~ edge + nni, fit, weight, p=1:3, control=pml.control(epsilon=1e-08, maxit=10, trace=0)) # expect_equal( sp$Partition, c(1,1,1,2,2)) expect_equal( all(sp$Partition == c(1,1,1,2,2)) || all(sp$Partition == c(2,2,2,1,1)) , TRUE) phangorn/inst/tinytest/test_bootstrap.R0000644000176200001440000000064314042564431020133 0ustar liggesusersdata("Laurasiatherian") fun <- function(x) NJ(dist.hamming(x)) tree <- fun(Laurasiatherian) bs_trees <- bootstrap.phyDat(Laurasiatherian, fun) tree1 <- plotBS(tree, bs_trees, type="none") tree2 <- plotBS(tree, bs_trees, type="none", method="TBE") expect_true(inherits(tree1, "phylo")) # transfer bootstrap should never be smaller than the standard one expect_true(all(tree1$node.label[-1] <= tree2$node.label[-1])) phangorn/inst/tinytest/test_SH.R0000644000176200001440000000114113707232051016417 0ustar liggesuserstree <- read.tree(text="(t1:0.1,t2:0.1,(t3:0.1,(t4:0.1,t5:0.1):0.1):0.1);") set.seed(42) dat <- simSeq(tree, l=500) trees <- c(tree, nni(tree)) fits <- lapply(trees, pml, data=dat) X <- sapply(fits, function(x)x$siteLik) weight <- attr(dat, "weight") # SH-test tmp <- SH.test(fits[[1]], fits[[2]]) expect_true(tmp[1,"p-value"] > 0) expect_true(tmp[2,"p-value"] <= 0.05) tmp <- SH.test(X, weight=weight) expect_true(tmp[1,"p-value"] > 0) expect_true(tmp[2,"p-value"] <= 0.05) tmp <- SH.test(fits) expect_true(tmp[1,"p-value"] > 0) expect_true(tmp[2,"p-value"] <= 0.05) expect_true(tmp[3,"p-value"] <= 0.05) phangorn/inst/tinytest/test_splits.R0000644000176200001440000000415714036364665017452 0ustar liggesusers## generate data set.seed(1) tree <- rtree(10, FALSE) tree2spl <- as.splits(tree) pp <- prop.part(tree) spl2tree <- as.phylo(tree2spl) dm <- cophenetic(tree2spl) mat <- as.matrix(tree2spl) Mat <- as.Matrix(tree2spl) trees <- nni(tree) # test splits ## check classes expect_true(inherits(as.splits(trees), "splits")) expect_true(inherits(tree2spl, "splits")) expect_true(inherits(spl2tree,"phylo")) expect_true(inherits(dm,"dist")) expect_true(inherits(mat, "matrix")) expect_true(inherits(Mat, "Matrix")) expect_equal(spl2tree , tree) # test generics c_spl <- c(tree2spl, tree2spl, tree2spl) expect_equal(length(c_spl) , 3L*length(tree2spl)) expect_equal(length(unique(c_spl)) , length(tree2spl)) expect_equal(length(distinct.splits(c_spl)) , length(tree2spl)) spl <- allCircularSplits(6) spl <- ONEwise(spl) write.nexus.splits(spl, "tmp.nex") spl2 <- read.nexus.splits("tmp.nex") attr(spl2, "splitlabels") <- NULL attr(spl2, "weights") <- NULL class(spl2) <- "splits" expect_equal(spl2 , spl) # test conversion with prop.part expect_true(inherits(as.splits(pp),"splits")) expect_equal(pp, as.prop.part(as.splits(pp))) expect_equivalent(as.splits(as.bitsplits(tree2spl)), tree2spl) unlink("tmp.nex") # test networx net1 <- neighborNet(dm) write.nexus.networx(net1, "tmp.nex") net2 <- read.nexus.networx("tmp.nex") net3 <- as.networx(tree) # delete some additional attributes net2$.plot <- net2$translate <- NULL attr(net1, "order") <- NULL expect_true(inherits(net1, "networx")) expect_true(inherits(net2, "networx")) expect_true(inherits(net3, "networx")) # expect_equal(net1, net2, tolerance=1e-6) # expect_equal(net3, net2, tolerance=1e-6) expect_equal(net1, net3) unlink("tmp.nex") cnet <- consensusNet(as.splits(trees)) expect_true(inherits(cnet, "networx")) net1$edge.length <- cnet$edge.length <- cnet$edge.labels <- NULL attr(cnet, "order") <- NULL expect_equal(cnet, net1) expect_equal(nrow(cnet$edge), length(as.splits(cnet))) # test consensusNet set.seed(1) bs <- bootstrap.phyDat(Laurasiatherian, FUN = function(x)nj(dist.hamming(x)), bs=50) cnet <- consensusNet(bs, .2) expect_true(inherits(cnet, "networx")) phangorn/inst/tinytest/test_codon.R0000644000176200001440000000250614141232476017221 0ustar liggesusers# use lysin data & tree ? tree <- read.tree(text = "(((t1:.1,t2:.1):.1,t3:.2):.1,(t4:.1,t5:.1):.2);") set.seed(1) dat_1 <- simSeq(tree, l=1000, type = "CODON", dnds=0.5, tstv=2) dat_2 <- simSeq(tree, l=1000, type = "CODON", dnds=1, tstv=2) dat_3 <- simSeq(tree, l=500, type = "CODON", dnds=3, tstv=2) dat_4 <- c(dat_1, dat_2, dat_3) fit_F1x4 <- pml(tree, dat_1, bf="F1x4") fit_F3x4 <- pml(tree, dat_1, bf="F3x4") fit_GY <- pml(tree, dat_1, bf="empirical") # test dn/ds optimisation works properly fit_GY_opt <- optim.pml(fit_GY, model="codon1", control=pml.control(trace=0)) expect_true(fit_GY_opt$dnds < 1) expect_true(fit_GY_opt$tstv > 1) # fit_selection <- codonTest(tree, dat_4, control=pml.control(trace=0)) library(ape) data(woodmouse) dat_codon <- dna2codon(as.phyDat(woodmouse), code=1) dat_codon_2 <- dna2codon(as.phyDat(woodmouse), code=2) tree <- NJ(dist.ml(dat_codon)) # test M0, M1a optimisation works properly fit_codon <- codonTest(tree, dat_codon, model = c("M0", "M1a"), control = pml.control(maxit = 20)) expect_true(inherits(fit_codon, "codonTest")) # M2a takes to long for rhub #fit_codon_2 <- codonTest(tree, dat_codon_2, model = c("M0", "M1a"), # opt_freq = TRUE, control = pml.control(maxit = 20)) #expect_true(inherits(fit_codon_2, "codonTest")) phangorn/inst/tinytest/test_modelTest.R0000644000176200001440000000141113707232051020045 0ustar liggesusersX <- allSitePattern(4) attr(X, "type") <- "DNA" tree <- read.tree(text = "((t1:0.2,t2:0.3):0.1,t3:0.2,t4:0.3);") fit <- pml(tree, X, k=4, bf = c(1:4)/10) # F81 + Gamma weights <- 1000*exp(fit$siteLik) attr(X, "weight") <- weights set.seed(42) # tree <- read.tree(text = "((t1:0.2,t2:0.3):0.1,t3:0.2);") Y <- simSeq(tree, l=500, type = "AA", model="WAG") # test modelTest MT <- modelTest(X, tree = tree, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0)) expect_equal(MT$Model[which.min(MT$BIC)], "F81+G") # amino acid models MT_AA <- modelTest(Y, tree = tree, model=c("JTT", "WAG"), FREQ = TRUE, control = pml.control(epsilon = 1e-08, maxit = 10, trace = 0)) expect_equal(MT_AA$Model[which.min(MT_AA$BIC)], "WAG") phangorn/inst/tinytest/test_distances.R0000644000176200001440000000367313707232051020076 0ustar liggesusersX <- allSitePattern(5) tree <- read.tree(text = "((t1:0.3,t2:0.3):0.1,(t3:0.3,t4:0.3):0.1,t5:0.5);") fit <- pml(tree,X, k=4, shape=0.5) weights <- as.vector(1000*exp(fit$siteLik)) attr(X, "weight") <- weights dm <- cophenetic(tree) Y <- phyDat(matrix(c("A", "C", "G", "T", "A", "C", "G", "A"), 2, 4, dimnames=list(c("a", "b", NULL)), byrow=TRUE)) fun <- function(s) - 3/4 * log(1 - 4/3 * s) data(woodmouse) # test dist.ml expect_true(inherits(dist.logDet(X), "dist")) expect_true(inherits(dist.hamming(X), "dist")) expect_true(inherits(dist.ml(X), "dist")) expect_equal(as.matrix(dist.ml(X, k=4, shape=.5)), dm) expect_equal(as.matrix(dist.ml(Y)), as.matrix(fun(dist.hamming(Y)))) expect_equivalent(dist.dna(woodmouse, "JC", pairwise.deletion = FALSE), dist.ml(woodmouse, exclude = "all")) expect_equivalent(dist.dna(woodmouse, "JC", pairwise.deletion = TRUE), dist.ml(woodmouse, exclude = "pairwise")) expect_equivalent( dist.dna(woodmouse, "raw"), dist.hamming(woodmouse, exclude="all")) expect_equivalent( dist.dna(woodmouse, "raw", pairwise.deletion = TRUE), dist.hamming(woodmouse, exclude="pairwise")) expect_equivalent( dist.dna(woodmouse, "N"), dist.hamming(woodmouse, exclude="all", ratio = FALSE)) expect_equivalent( dist.dna(woodmouse, "N", pairwise.deletion = TRUE), dist.hamming(woodmouse, exclude="pairwise", ratio = FALSE)) # test read/write of distances # phylip dm <- as.dist(dm) writeDist(dm, "dm.txt") expect_equal(dm, readDist("dm.txt")) #nexus writeDist(dm, "dm.txt", format="nexus", upper=TRUE) expect_equal(dm, readDist("dm.txt", format="nexus")) writeDist(dm, "dm.txt", format="nexus", upper=FALSE) expect_equal(dm, readDist("dm.txt", format="nexus")) unlink("dm.txt") phangorn/inst/phangorn_sticker.png0000644000176200001440000006323013707232051017115 0ustar liggesusersPNG  IHDRʧagAMA a cHRMz&u0`:pQ<bKGDtIME'١ewIDATxwi " I{s223;;;;=S{/ylﴛ3ݳ=UUUN)o轷I$"b?De:"p~6ooooqf^ |!ry)uw ??9oxKo=조}o0UL=4:MkE{^ǁ/4K*{c5~[1\Y2<[<'.=Hd1*;CC4_JJrjڨ $S?ӏ. -O,U[B4:ǀ)HFY* { }-O^kMz[Uο5JSSV$e2׻]TK{J-O["V8j<¶ւ?[t^f=crBDbƽ;f?ߺ["?`kZ~fSQ+^<ɸO^o^9M1xK85]4?A *NEddYF_nEVV߸9t>5Ya~>7biun LQ42 Oov<%Yc_l8]y?p[Bo|Pxy yŝE?1XQ EQTTDžv _X%+BiI!ӳKO E>"%/;Xx"N3_"r+y:&`<`hus DIJ:FX\Z'Ln(KI[_󊢤{M#u#D^ђU'Z=`hjp8& }TH$[f|b[N! M('ZQde!JݟoO<'"ΐ,)_LI( (RQ^žvFcaz:[hjƠ! AͰ⠦JV7 tCrR~|c`f0~u`'>y EsJ{K>6d&j>AIyy9\iU[46TL՜!Ea˹$FmLL39H$C<@!(%߆vo}8Ie"zcյB4ZG;(XLF:ikù\k0xJ#OLHJKvFh4tw600<IN?o&ɿ ŔUJiڪ9UNcKA;(hZ*i%H2:>( QSUF#HEp8"3 .igYx( /w;o.j/,.lCE? tITZRžvrO-lkpqx| NnwX_EUU)K N@\Nw#o C|܍ OKYK7TԊqT,[.ciҊrzZE93&gIB]Md[-23L,8Mƥ_7v>)ť8߃pݛNeeAQc-Nc;(Zlk315ONNz(-)̐e@$s `2l"K004}rZ2 9e;.wD>)RTVc7Z+BqSee 5e\mGFfI&%zZDռ4( a']XZ6\ OQd{4SóiBL7ȇx; Oo9QV(.Bo;LM/ޥF,f#oÓlm\GYI!3sˌM ENv7 "%;??tuM ajdUV֊R5$YYV z͍5t dz*+^6DQ xb y24crb"vfv9xFZ@,-oWZ P}ҲrUE R,pPYBL,.S[]NC] L tRNOb؟;7 lFoW"Vf[io',D)d|=m13ºccetĹ˓I<٘^`bzp8zrBHJH\\kJDQy#4CTu)5:#teYj1Hks[f),T7w+r)DQbiNtrV2*o7KaBgdMYSJV.82*['ϢшS]YByarw{kn/CjTră=˝]o||RzXQXRؒG:DSE\Hcx~RVhԿpK_I=^?C#SٷhuFfGHώm M U;ӳKDc~).*{}.AiZ@ԙ땽"4?DzeYl2ZOg[#|ₗ*+W5G1 tw4O$bumrz2[ϒ9689]^1_5OSqVoFGjmG`t|D( Fcvܽ7p-+2 99|bמ¢["hVNA( }25hkxmyE;;pn\GyiQF` §rBvGbApMeeKR~SOEx(BvfX[dnݝMGg_X%HLhw2#[V$%|-ݑ^#p ]{t]RhTY9ʊQfc_V>h?8f+*>3Q#tqY EISC5]Mo|^WZOaA LN-DO I N/;+ς'FTy93Q'I`3Ɩ陥T+6 lYB$Ibi(ٌbqNtݑ5߬?t,E-VDA[u9A8|L`6iO;Ƨ}e}r4FfI'Cm;8zxwзt"[Sy.*j}0k {AQ}o|'wϭPVVHks]&4 9a@N۱]{ [ [ ~_o -.)by6&vik},kԨ>/[=42ŖsZˋ_ad|`Tr: GSÀ^>ꝎYJomƟZvPW TXslAih4i{m})=]͘MFFg[X!?IƓp}Kv&‘(O'Yw;J"yoÀ-4Gʕa0FcO(= }:Fg t5)+Db#s3*G7yjCrwש* "À|k;Zfq>`-o˫Y/˲Au{{FVOS]U(F}'A巿C FRQ^D}m% d .7EdY k z*K)-)du}EJJ iELFDLg~]ݜUfuwɘ$s,M 9dݼάӔ>6Gj1sWz<d2;hiE<gnq Qt|.-MD1V73E7s Lc kDB}m%V[RO" nDЬ?ʭMQm{ϕ<ӟ jr1^o^d2h`?ȵak71 |% sx24ŝdgY0D"1DQ P\OiI􂥣"o!6*$i‘(mTU݂EԊن^e`#Li_#Mg, %N(b_;9<3'MQ@AAVJ (,eq{(^C$_LJH̖sY9 bw8[TKg[[BȲɨ Gg#GY^unHP9.R;PP*||x<8A]M޸@NT2Ap8&,n\%]MT ɲZ2]zc >@R sߒbo*^ı$+tu4L,7 IYOdW ʡ:&:;7ȵeÏ(i9YTWY[";ʅvt:-F, nn}tJ "ZͼEˊNelOe泰S㬮mrAN*ZT"'yZu}NQrt G\E]MEFV~VQ;L.ш\Y1tT  (BB5k8c3H( v5SUYį4:*K盻t5rR7 'ɤT6{= 堏̊rh"u{OaA,Hug DG[3ux P]UAxNAĢ(g_g˹GK:#ȲlntZ-+k{'(*'8*/:Nq@N{L.NqQ>7o\< I D1$IFQ זMve j?>[.RfYV[3ѨF_xɇg)N &&Ek{( $ fVHJj<>zI[OBTUT%9nY8W5TVP>imjRqfVnA0/PG8޹kMZiom8J ?ķ aGHJ5Ue@!xpH$( r.C@`{gϿ~:u|C3/t]`rfMQDE$P;Ӌ۷H$fs XotG_!HW{_z%wȂ ɔ<`iN(g_Q-/^DYYۤK/E!HpIYF}cvM(9{DVY\;nV3FH4̐Hc2,Ƶ> lMH&%޽ϕK] fV^n^b1;@QTj}]% u.>ljFc}H-X: %E3J8Uh3Uu^s@(,I۷x28(Cadhc1HL4Öŏ~pϗL8T|SK/ H$%H%~UOڰ_#bBdR!ש(iajZO?fh#+ Ӌ|yã3SXUˮr3Hǯ?3sTWqx"T" Q̹7\ M29",X,&޽֏^㛻 M [MoM& f嵵GQ6p>xF~ 0ʯ~ >_QT-cnA.PVbtZ-귏ME FcHv^$,.7r'cMX_h`eaiLJA(4#}+r":csdgYyGZgNV 2]0Ueܺյ rr.DZM2DrB'y9J&%>f˹jfݾŗ<"gHZQ^;Wtȓ O20<\[6347`4N IziׁIBhZ[Y]`t|OEY1߼Daa޾X^qE;YoX>s6HEY1YY0[ԤEtOoG68#c3x}j*.gtb.SL}]%Ó<`M/vZj3יyD ăG$쥮9@׎o?! "-4Zn^GEC }czf}|J>a)ߧ>3pMGgX\^GE;z[w Iy?g^[SUɇ^_qIn^`m}6h&-MaF-V6h1JL=D4S7זMIqk#Q;|ZF.]^ z=KkF# Gůdum3m_EyX6:>K"Bop9mt5ǂx<øvTUpJFSj*xZ:6cw^=Bn}q( 5<("zϯ23s۝QݭԱdE"1&0 TVd2rr7q_|[DQ E2J-~tښƸ}o G_A0M Lqzn^j5 4#cr,,ߠiFg3jŅt5PQ6UTON/j"P")H$\E-;cg4WO" uM&ܾ?Eys?Ei&g3*m-u|WjEȽ zn\U-d eFer(/+bm} ?$t6D^nS b1V6YYUl-.Z-' F]~m66().j0|T&:P8B 7UH~-C_b`xE$IFѰnb;j&[YgIy40'c$V:3r~`҉Y<2|>z/fgǃ h56;bqט]BJJ\IsSΜȂ 07§_j5/~~ݾ7\|!|^Ȳ _}VO~.SRV7YZ#"yy6DQdgtfzQG[ׯPTGeyI42iϳaIQ m?nh4^#+LՂdDסш `-Mv<ܺ׎ ^LE ETR~olu Fjod ln082m9|u*KRBm a"Lh0RWSAC}%9Y/\Mt΄Ȓ,'P# _m;9$Pf޽qAHƆ*{ڎyV3)jTSKUe)h5=GVc-IFy;&HIq%{_qy ݪ@Z5o7CaP~._DҀ?Det:-VA#Q(R'eE(Ycۥ3? u5 n%Oj0 MFt:;=K z 01x]-|e5=/±V\>W(t6P]Y zt:i4bf!r15q_h(oMe]/Eyܼq45`60)܉g[=k{ɶP^AmKj:hI{iUߞ&"톽,T"H`0+=ms[uTfZkɶfG!˦^1/s!!I2Ӌьe͵e{?z/S~tiYӑV<w$jR^qޙYQJy NLJjo;tp:)&vQ ()?o.k5W3 '/!Ir':&4H[*dYfpdѱ_ 5/֟-28sej1g~( XݱFyEoC~&5vJE!P#uZ--Mh*\[EA2ėgL.q/t٬hDc'([u8DH4>пdsEN7_/HMTÅTW%Ixd5z-=]-Tų8Dv@MLITBj,h'IgtXXZ;wUԂ ۏ(+N4-vh&͵s㪝gKKvvDc1>ZD"BU=1Ζ}KvtZ-%n~u"1޽ޏ٬61sǃ$ &#/t~+f9d  mn(ز(-)$pl:RUuH)b8%4qKApnﰴljUs-nH$Z̼s?{n,,a69z.7Ɩ FCMU9Zf*'"Eyi1j,[]&{1 ʵHqvv=_~A(NM > 5UeXDh4~h ZDQF&%HKc47EdYͩ_+PTF#ƉDcX& ͠( ]MTU+R^VDKS-+7ՑƵՔX_MўW5s9Feμ"+BYI!E,.꠱*ӗaemD2IEy1YgD*:5H tZ<" S]Uʅsݖc_=vva ŅyLv%<^+^2=7^Et`"et`XV#jU Fp8frfͭ,fZ̩ӵ{:˂eE|gE~aG^(vtٗF-*ʊ1 a|YV3 C*ˋ);b`DVUG' h4z[VcÑ(+k zj8%klmP]UFey+۞&e#O0>@"!Q\Mqѫuk /Ȃ d>ه.k#;斋7YY@MUZFC"jPSU:k뛬;vzR|dAh זEued@0csŕuN~+B"Gc0n=E}+"bfwj%3;La~wNHM&%K+/rybdisx<+BnN65Ue1FwG3,dY!OolƦ`0$K :jik?C)EQ`y&SƂ "+# %A)D1$YAAAVdEp /b]\)e}A@{2)!0%E^tF%<^?dq  l U%45PZRoy #QFeӜ:EQX\Y!A~Πg b|r|  YV %EHccyB{XgF)Zxp?JNY}F<^?CۺZ,B)))$'ˊFS_$9);6.`w81tw40GS<'KRY^;AǦI$%:(/->v#+I2k<nwH&(/-^lK%ڌ ӳK#Q̩Lf 3Vnz-'p8Wk D"1I Q/% K j˩(+z.˵N4 }ز1jh s#N @(frf?LeE u<y\.7V#XҤ2<޷pAO[k3:˵+K"r"'h4u\47a^׉lA;|=>z*{.P8BREu)_.n$RT{7.o=o2ƺ}RHI$a[Q[Xש3@N'Aq{CAgH齰4m7PZRNk+O=q{xdU$IƖcB_;mM{M&!m~7|t OEQ$I`0hTomw/=:(  ~V ͍5_/5="je|?d|jImTז$F&Bdٲ͜k$3s$2f&z:ZNu;!!kMt: \MqaҗTJ~g_cw{W.Ge<^?f Nkͧ_Ɩ^ /NӋȊL{K ~[QXwl1ռC73l6ތ^=q=EA`auE4 < glr7N =TUI81k. .68`(b6>~w2yBQj+klYx~!K+Ȋǧ2 =|'f޽HC]s$IN͡E!/7JVV7W]yEgl Db11$?/=SUL-z'QSU~&{ӝم>S( 6:(.ʧ:ӈEZ|]v=>wE ^~qm;Wi{(FCwGӡ_/ (PS]";^wTf*2#3=~rh9e2m:rH&%6 LN"l6Dog[i4]mugN3u:-.f|[*(B}M%޼c :d䝫σX,4p8UOWwr5BiQYl9ln*/ԯՍ-&g8!8RR:] Nl'hb_ǙYd2I(aվ[;$2Vʒo8ЋBQx"<"(rj*hFϻH 0=&}2WQ&*ʋqllؤNG4`kp ?c6iblri0 `jv QPꟷ",\4e2`, zVAQd /uy2<ۣ*o, :ݙ$IF#q:5,RkOsGdQ',.1<6æsD"V+7hǓ(BEY] N!]޹bV aƩ(+u_::\.WVKOg %Ed2I4O qeVܔVLrR}3Xx@Yleͮ:|g2*87DN]t2:1xAG}]9ՕeL,vmTPVZG,,ٙY&pV_.,&;E(d[$$ ",zGCc(^p8J4#SE$Պ j:HhDY<:>K~妴\`r^ɤVLY뽙VKQa>Et78]n.տ!VV65"&E݀擟Cnn:rXcվǣHLue){h,F "?5;K[Fj1RGw{sjУ!&$fj*1PB~M>ucDcqsςԿUXwl2>9$ITUS_S nKt #uKK "<?;nۻ캽BLӚ7NCנD1-6[s+z|lonpmZ-$˔CEarz/@nn6=.g8al>>fv~0^YQW.v|N`p8JqQ>M /azf-Uy62rCa AP)$ˌϢ( jpŕuښ*j1nq7V{7.`ȵM(+n}Y\t"wQMAcseduZJ ()*?PjH_L=7u j;uG6˳X_MaAd`0`emkV-<8V<@H[9DQ۸=>Jζf^ ,8hE.;WhL5vup{|a1^) $Y!huՕ'7J9o0M$IN|%r4lb6KJGu(.gjfYy[! "  ȩƓi4",ϏpJJ_K+H$169G4F}m!NQQ.>cDcL'SR5\˵}T}?W/uc4XZqwqv<( S $qύ_"ުVE"1FǾee9{^Osc-?&?%;>NA}:CoQvtz-kί'g1u\Ş{dDQbo'7o\b6/f*M^&H{HēVr+/M^d2k \g/ZM͡l ]/+kD^Ay̜l+۸=~crz(rK]m/A0ɀcs/ĺcLY#q![N7EyཫrHk,N.^eEX-w] +ZCuLـ/U7FĨhNeht EQhmbohmk ŭ9^EI$<W^kYBBԂ͖׫fWj__YQvV$LűMԜ0-ݰQ[U%ܸҏ]c]5ܼD^^#V6&N0> ž|.Ո,.3<:M2)sxc3"%%dY&LPXh;?ctbW{4Tcz VgTOnRRϮᄎ_U:g:Ζ3EP`rz]Yז4p`awz(PRTL Ȳ̪})V$jmŌDb6?,VQJ |=66]|}$I[{}s P\> ^k(#';WYdEfnaGpxQʊbl9YFM@:fvxt¡(: ڛtGx}J _Ņ|u>.[;|CIЎD|s .,w_x7UCQ\#^^iX,4ƈDbXf:jctbY͜r+vv~GQ.wRS]^#HPRT:˫v_+-M~_z;OvO$`zD_3_9'Qא$ʊn\$x<>dY&ז:^G[K=:ɶ" ,jdy’f:T%s>?~uuFޮSYF&GDζ+!:`wׇNKO >$pP2>* |5j*i4V"H'UPsl|=)2+'ZfAP=Kr5'yL(Hl+.wT+xH4(=+jT{dIb;tCƏn^嗟~Ύ$sZ}xL"/7w, ^ZMQ'}oH$FqQ>?:MϤjQɶrTIdELs&dE O>A~~XGy湂 3mu߹OIqŷK! WI&4WOnRUQvMFc zN6)?x\‘(01=z}ߺz }4Uk.YQF%%45׎?u.,əEQ(/-]#;B8AW툢H0[Y^Pou6v*~|dFÍ}jWyqVV (`1NݻUCK+|]0_yίlGZrv|gDV[:mqlRgwCE! !K2FK/qvPh9{}oF 7VoTy 𭿽ߵDA$O<58~E !"Č15s#OE#MzE&@޻qԣB( Dq;)BqZdg=aeu6^aeE`ПKQPP#*.7v ']H jס}ΝYZ``x$qBgx>kS]frz_mut7b1$D1S} je{Ǎcsu[ݧ"&ي^ E%H:-"ƮÓ8wimeFg|>lՕ=g(l9wPWSAo; ϲN_OȒL"DDLC]U;˫\.xIPVRjZDvNG< Zc `yfV(+WŶC#affydA۳ ;t6pB'n/ƙ[b_;%veR]lHڱ株! xU©Ѡ$2*J8fSj,u(+)Dժw~+k ݼ}naL&#^'LV6 '?-m‡My/enxh3 hpADA dh5{eTBNN^c{(jȲZqn?4 `rzI͡*ʊ SIfutrm9z"(jޒ8 !տnͱœI‘d[ezvH,LEQpND5>2ŧ釘?F}zΧ5h+Q搏K:tX^u㦡Z'#c36^ 5 )3HJH4b_7\O~n7!Z kx}VE{.'=>?at|RzZrǪJ!%|mw#^ SXjy0&MM-d1|$Poţ}= Fg6jʞ0Ր$x"d\02>KQQ.?9AnC( LM/QTG{k=n'Cl9٦H i5Bۡ- z*%RdN{ " w#>ϲwDEgubA8Hv,.c2iC28299YX-gͼ.K&z|sQ,؉DTUiKymHϳx`ǃ,)'͡?ܺ%|@ik"ónþ+"6[G`@k:tf]8;O vuB; MEhпj!ш,, E٬T}þ!Hr˹{,,RGSC 3s+ܹ7Ȧs'3((wwfvlndPTw"sN~_ɘޢjRAG]d:niŎ*VO#lt:k::u׋N0%S| y24IIqzq{u:=)!M+%)ߪoߚY4y'^kf(dBqB?,y'ЭCD!^)+- ;SVV|}1.=242cx~poFxq'{O3-8K>) YI9wYԙŢFqYo颪\.7# l 7uoa6='H7w15Hc}5m ,8#cW&O{ P `=4$y3>IF=X >ZLQ Y\homUfjڲވnZ?} EQhjF?] QT/ Ol.w u58TNƤ9=WϲwA7mIu%L8-C/{VZzc~ϒgL[tz^S*¡m5uDA4k[deYȲZε!jb~iH$FeE yopN$ӳ|sgx, F?apdP(rr8-);C?8lsl{(n.aY!rȿZYV3]hY+ȁDRbs&y6[Dc M3=/+Mv=>lV*޼0\ڰNn`ͱEwG35eMq]Ʌ_lOh㫘/jmkӜc^82Ɩl+V|t:Wx~Vӹv/Ҳ<q<[y<8A :,FܑtᭇHr7vXL`\g-jd"+Rp3_?uvY[ j| % N[ٌd`xP(Fkw7tZ-7[nA 9s/wXX^*ffs-|{gj_]qF}kq+|p]R\{W}wޢ_,67X_y!%w/_DQMZZ^'Q^VLnN'9(+d6vv=ܺ;ɤ|R&)MNxW|zw({{ON{^ SNe@!Ϣw*F V Z^_u$]-gqَb$;FU;o,^@4`|j;DЈ"w261G$;IVVl9`wfv儼WV>,qH /\<[w"nwXЊz.K;^emZiEQ^ܭjx}llEs/i+}=08<'cx`ERQo7[c`N"r<s# ^}nwCdp6OfΤ+5b.qUvlnSUQBg[#rw+&uqN$HG^g%=!ghl*+oNLrWbPΜ9~rx^y3u#ë2'w#MƼ˾/6#ZTCC0K+v| mT1"Z-uFkvYYֽZ@[w2s[ēewŷ'r/#gFW}8BˀEϸ")z^iJKU]ť5zZȲem},/wkZkMb8_r<57w'\؉dރaGgO%+o\x/a)&9<|WԀL4^w\Tj)vyWfYgjb!r$ɪܽA~^]b1/]N&@l+%/NnyᤫRF'p4r }wƭ?x7"ɳ+%p?ƞ3rݿ=ћu;ZDԈ9?G1V6qnRWSAks-۪-Ir^m184Ui$%#+}{8Uetw4cwlq-dD"t/x=?(,p[;5Ӓ=jw>V]^{&F;EAR_[Aoɤ,V?[/.U浲j\QLL35DIQ>m-zx24ɶ}jeYKˁ/D9O-F|lB@Cۡq~r]>hVgIzy&s<ֱCq74zVkcYׇ\EQVvu6Xñ2e%eҽlBÇ+ke&t:C#S`ER<o ί܋Zܣ܈sO̚x<>*3ڌy=dZPc4pȉ4I FqQ3Kllhi\O})bnj{]m-uVyjP(r(D(Ƚs|{"׍ػ;,'E )D>xY罄nr*ˋ; d3XԊEǽ(h4"Օe\kG0:>K,Jtg8I0/RYQJSC5 '#캽ꅟ$+G3~G[#{@܇J҃qGG6>xӈw3&Aw#aT'9) YwHCV=utu4';…6Jmf~DA O0,V&"(C;'rR¿vo.sFM%?pˡ3i%rHgu#;E!'JOWK&bNuU)]-lON'Fctu4a6enax~(b_fv3r(y+<śNЙ L%X-kj[t ݬ//7v^:hod2?v±Msc -2:>K >)3 pbл֘sXIaUb8^µ]k*j/1{#EQj4Vӆ({ۨ.?TPd\\@[sVee8bb`+a7i8--nT>y/%"ヲsA0T^؞אGz ƖeHGk= vI~j yuh3|(BqowPow $ө"O&O? &.9*dY\W*|_zO.oCiL]Eݹu?֛uO\K bqyd4镊;n{kϲw#Nyu&\:h1J{*CA)n8y욢(D0pw פ#D&+{$ avyViqWяZ[&7GU;}&r}ttQA -M`*]4CfQ+; [rr*Œ1ok-T o[">rhQcI夜iac=/8,]tuKO͞ץ7ki~A%tѽOdZV>K%r49&-=:zT{ݷxA%0'rĿ[ToH%tEXtdate:create2017-06-14T19:22:39+00:00- %tEXtdate:modify2017-06-14T19:22:39+00:00tEXtSoftwareAdobe ImageReadyqe<IENDB`

ty@;R. 4`Dyf;3CNZ;B\c3eb «B1Iɗce HgT6@/l`,H|B(ɾΈ5圧t9 :aq >Gx3Rx 8 L|X:Hҏp$p3'uZ2,(y6ߚ)5ŬW+ cVe_qV~Z{E>S4,Bp Aj/[ `1Axv8 0aVO#=ж0C" N<3bXI5H =bn*c؄2OjrpdIoxXZi<jx]Wmv#ADih M1#Fh('0B|ZHOxtnbˢm*ŊLXQH Y.S} w L= 7CU&KU lkgm݄^rԀ׆JQԇSNMtoB:Lnjh R¤4ڈ,&p17>z4(gjBl%B>ϼKR =㓣j*!"Ð"ϓHrYn!~<.4M8&bf&"ڇ?&Sq5q&\!ezWOrͻukbn9p4UI@" wk Z9-Z} לsLdB@s mgectV\p9w.:H#3Ș1\Hv'Η /%b䋳E!Vo`!uaqPn3%Sz%9m@ c~{dq-)րTVު{ {@byp@"JMp,cnX?^U4hx]%}0$P洞z*s<P(0lB^ ?f)P& cZ3Wsޘyk@!Wq9i ?tX` d"2gU>5nYn#;0DMi-ү48JW7̵< ,#O*+l-GĭFe)CȚzWdɜ4Jb'Cx7@÷nOY;U.ⳮi@@nݫ2"-ȔʖtBg5^?љT* ](؄BRj-rmؕΗr+B`=T S U)5P~ ;})NO&]+ZwOF!9m|V hhiFrLQVF,碢tq,Z_NK'x:T ~CiZ82w{:pOTu'=q 8n"7#A @|ymأnEJoDq~]}PJ|RSvXd"jW|0;P+ؓ“ `Bt GXpJ:]0a tg{s̒~x[2SO ]\Ul\VvqkZٖ+{9N{1IQ_ =QQ4㌤gIAR" F8dlwDWH4-jXړߥ JtAfF٥*3_P|x$:܄[ =-yM|v%bDF3RPX\PH\cnEfp:m Nf wl~̀Q&h+ev5Gt# :_ƣ! FAl)=ǡi+U\3Z |,h"1G17nm7_01η/C:Hܞit4bL4%7 ?(ihsd)31{e3 6WML`Mc p5[>Ea^tO(_Ýlr|Kخ[Bǹ8v6j\q,rOqq(2%\.#mkc TvQio9k+*T AV{GjQsR J t (@hhgUv^/o=nd9n2d,?i:"w d]0i nsk+(ʜQ,lъ/R+ 夼ͧ3{::J&4njF)R($߁$RB&&J|_tuɐ9E25Խ2pi# 4([Tvբ٢"5`~ĤNC1DzRR#P2-)E?LR1""RL)sJiJI). ▒DNDVCx6Oj4o3ϊn3wFH/ I6#؄1|m6f9K\PHE #](? F ut ~`ˍ#1D}~ϵy=)Vxck9֖Sv{ |oqS;aE1BSK\StRY= _.%Ŵa)7F MX& J߈>ƾ֩hD1t"BK.^)۱XEGhaI 1],q 貮%$|jo%_\F`\asu詷>ƚ-yk|FbViYPZtCSZ&2{ePXtprx]qbJ möȊK'>J+iafH80(-j$C.C@60H\f `G- >9{e |.W2XٶB8͘avH%Db/( nC@@ xAp+w-hOg0PxSca-W=Y =NEv_Gfq*ӱ"e)Z8CWw uT kgxv寃x"PQ7Hŏ,^+~ ɕiPvR%|+- G͵.^ʌMYTCSHsp Wà _zN35]$|]^oo-(ٗ0_fu?j}.A;n,8q3 ~-[^/?Q:~É3js4ڪt"a>2ÄO%΄lWQb]f&,6W1ƎQb=5Z <{Rlr)/IJ {w(8u7(fBp f%ntZ 2ht4!L9ÉӪds[3fH_L#l9*6`E!C?+O[4i =t' pXѨC| .Ka#?hgz.Wțlc kv~f^{ү^et5`s}VfChpWA(n wh@t͇(JN씙fcREH2c%df# kq(qv$jְV[r[L4.BA,a.R Tqo<\xN=xz6"Wꇵ]&NI1d_2  eQL1'%{+_LȖd/k&3$M7 ;owږ7N=C%ב8Z8n6swpJyIk8C| LpqX p\S`I:4corФ~'۲9k=z6Nl-8Hk.(([Ve{rwݽ{Miv޲fs#]j^đ!r5|3irX{3"E2j<,w3͌|N%Yå0]Q>.kכ/Ԥ"k (08=5s(QFV$k X1D5hΘU.FMJ2{Pص 6C&m7@<* XC2932`a\pu CNe,E{ƈSy4=olGjiWl͉C I )y~GЊZ$%Hf);J<˴HL6 =RTYt;9QAc=))fjJcR)y83(_D&=i>b@R@Y:8ȷ2n+J|V__%䑤޿t83WJİiƫojsQL`.rT!a}0IpI$eN#U ]̡; Η )(ʙ 6.3JMgO}-PиbCKGH6R7mW.y78=rJɘ)Q@K9fh,HLixi tONiiKX*iyr*SKa eĴ?Na+1#a 7غIūÌR ؄>NLr}]TXׅbJsW&SEH?>/[#\f ogtj4yI0Ɩ*2d QĻ`иB/VwIk2z9`%+URq,\mCeC KcjZN )[`L9['aGh*A#R%: N :n΢vT1|A JUϔ]rsgC]0iHBN$ spTW3]R4Q6Z&5ř+,h$Rd hڌrLa&|+iI[aK㹻iZ}; DF5fFеgQ*Խ?bV3bB>>pW}vk*"#tw{r3cC>֓ةZ~'/Xdt\" sj*WXr-@96[;k]C]qgq+>R\c䉕ZEH< |(zP )-K5z/yPTrx'%Wm|eopcMFMGrQۯ 4)bEu@.ţ\Pѱ B=5Asdɦ\֖;Ot:3jדwkѡ%Ty̞@4nUWqDW&3yL9.NK' .)%CRY@@az uŅJ$㈪ 93FyW@=M 5\1f K7 /ql$+824R(};O"ʖna8Ǹf2gj;.Rd=rj,f Hc1fSdB}cvgOzh9? 2wr4J@-6/]Qt. I> 8SDQ,^7yZB2*iUt12}PFNE,[ <խtxc~b2(|yl-JB˃ OyQZS(ju֬s~M|2̛4\}9r5C{=s8$l ]|-Zde9 A ʡnԕQށ+↬LVL][ę, r+bxOvI.D.ba3ނA#]gR|61]H⡄^Dc[5wbApDN RXrY*[0%Qp8]Sch@oxb8[)="R|=וP5 TQx_&j \}ٸQLɂQ?G4'wTL|w!jKT0-(-i(KEᒚ# jգ}cJoQ1HҦI%!%60,i@3rڱ3(_E/niaX|`){%P=(`>)CU^`q?d,YqI TSU jP]Zp~ːuVO: FE|% QZ5.J@_qoQ |K! HbXlcA[c(ϋ2c"Bz/NӸCp(Q!!%R_;샪 cr2D [ =?RFC}V?H8`5Þ0i!Oo{z.KPz<>9)tQC ]:? OUGr9=3PRZ= %9jeܰ!\tnỬگ* U zͰ``́{tbp~Ȍ?DqNz3.Z)xuе N(iWHV8V"$Eҙ [D %>b.&A ڦshNWmBLTBԿqGtse>AGnӢ/PIJh=`8i)VȏG @0LQ(zoJN)>O)$r}x̳0Onʡ 6&rXux]jt<_ˏ¹/?^`.B/uwBHcO7CCXQ͚ooJ-taGy:^XyȗMǰU9Lŗ:)IfPq d1rڀxƒ}r/ GKۺK)9K֝&tq@RNb2 q@QA+'_հIAKu¡.eu@,f.qIzJHjZiv8l)]lFJH'FH-MZ"[UOqֻIѧm-J҉Rb5Ȍ e+ 62(W1_ڊw(wg&`^+Z!!ӫ_ͧZPUfh2 $'!ư֢$-!u0b P,!ˍrGVޖ]O;( &ԊV( 4'UkTx9P*s-̻v舄x&df_iOf̶`10iat{3R "A()4X1BGq:dy {<#rE '$k?: P INf\@S` FX>qDi!(/[~tX>Gf_ǰ=ŧMKq!1Nb &zn`5#^ArE#-l,醐&dQFgW2M'&D㼞54ZAvF#b/X^ C/Bpq/@s--5H\덫lc<GE~"L?oN*lX C8`{Cәi)e:@Q$]nɾbN U8oxH3%\BϝcDGs-M@[>uKWpS@^^|;1Yd_Ie`y{=J>hFͷKH1zR@CcV'bkљIsvԈC =<۲F'jBg/?.Ua>:î In>GyB 3FexEhtTgjD Ҫ)7j"%a+Zrk@+'G.سNr lNS\ڎLaeYw=Ce->?Yj@ &dZJb!RAj{Z[ˠB1>!vGk5/&*fM)/ !ys7/XKR)ϯF3.w4xzSW.29XgR)7緫=ؚ+~~nBZH갼rf][)g5#v9Bkpr=#sIjסh7eQ/cwK[ :>zDʕ>À젠AyIƛV09lw_L't ڣ.rΊG"Y6!ocRg/#ޝ$ߜK{VLyPz)Zƨ)s[DR7ldWY]CFg\ [2]j,`EN0 o>>j2 ȡaJ8I6CCb/ꔃ0++FOX$a0V%`;a +X86 Vp˳|k2NܵҴ+]`aYl[Ɍ@ozsb4IQ8lVNT=W]j]L4|Xn1M# 97x,‰3 *ø7Ա%h=Dx2v8K&QH`i]͐IM%rs&IrJgA#P:.S}B~ ii*mYAt0,)$JpC&&{z+e5WKx)+&c_"ޗCڪp,E$Ek@R n*Oqٻi5z7!>Ǖp 6NL&8m'R 6Nt56y 4H z:`4:@1#4p al r☯mA 20Ms*rH?UUɟ\My2Q  RAy6 5\N z:Nm7΋E%Zd{%i41*I2*IcTwDKh% y&=惮1w0ɐC!O!?¡lwh zEʶ/|""46W?A ]'w<\;k?sĝ] rRzS񾵶gx+&~4!͉%z75 jr&'&E&1e`ꂣw=}]~)-|z6;E3IiUkMTS 8B}l(֮zߵCsG/9 4'"͟^|) |:a Z5TmBBn?Ү+KJ'9(o d QL5AR<| e:NҹQߚ o0 3Z‡!H"?aE|CaQćģK'ߡ% 0kMgr$ZywbUcgm.S:V~QRf;u=6C M`+3ͧ{\5|'n$ޛ1}oX6nۂ2 LAdl  *za@,  \/qTD̗t3x\qʔBNf7 2uڹT"xiXA'zwZ̮LY:#jͦ\6 UJg T*sѬs佗:^G\U RGg N8(H;\92sDCȩ\RΤdGy~j?qKtlBLF2'^\@*ڇQ@GҐ(LS+bIl gv 4bnwV [ !5]#})(io,OR<'+Oϑ+Y!S$:=^B&t e*#׆739u* H{'Ԓu̞;QS Y?VaT.W)I%`xzй8Xanq  )@'guAyL8\TFBq!+ƄuŻJR"A0=GU*ɣy;iWZX@PDw`eQyM+)3P [wAz.:&ʀk;C{ 6_u@" QUY1sKDiKESuluR."$QwU3\fcfW*e_)sVuJT3*,3HXf[)/I@SCFY6s\VIh.qp[El1StэRt%QM 9=wSdV\`^֓ >y0=Tt.0CT75EdvvýgbC.k" Yz_] gwg>YyRkD'=!C"b|Кh0~p?ZH#&+4CWD }\b:N84#$Fec R<10ᾺK^0g |27jL.#)H_=jJ32G}gKUu]$3vaMYECBYՁHJ4<.#lٌWBk[1k˥aS9˃0H-UjY\/xzjS( ]D4lCtT_TM'* @ZI`e|DP܎^c{fd(oл[xplEzv*$B_2ȵ,IH$7?m/#JƌPBPD:!䁫r\ƈcd04&39|HGVPˑQUJ#gf?kD~ҹ"+24t!zRN1x1t5T#p#˃ZdQGzt5u(OZ GȿJ=y!w{O g` }^q9:AIA:>QGv7q:v8V4. Y+!@,F%Vl q&&gI=j>[-I(zZ-Fp#qΆBQ*z%A&uۍѕM@R[Meyp5p|Jp-OJ+56SG@S*jF<,ھboOɖ[9}o׀+Q`vXB{A,mRkWvOXTU6pXߢc\Z1I&kbYmڅ>D=Bۓ'\ LābhiEpe" +>Ȥ"JhH=7FvI8ұmw쨱ɱ3uQ@f–*ќ Qcb_0@rL>2nj>SEAeVe5&qhLLfL7/JYi#FЃ㠔> >GRL r}~oiuz7Ӷla6=s6R PqGERyU(ʘ'ƚM0_j6;̩>֤\ 9-UP6ʜ=Nf=`V~h- 47[t$ q>-um#̷0 {j^ߦb\˩uOη-Cuo cTyoţk8b1' |ux:(Nv5FCf 4|- SRCl P2/= !n þwS:HpMJ6()@,xQr1/HuS+Mx[ =~7Ӊ#4`IҎp"kUABQ7,-GapеR:[^YmZ]Ⱦ&/c&@u"`usum *gv9S@ڀ|{ڐ>Z*W{-{ꖊ-s16pV>ypHߌ AMC;_u_,W$~#m% ,o׍`}&`V ܰ`X`BLqSu18ʔW\'"v+FdߞNA#O6`Ӈh_Q ŧwC<(κ%]| \+pQ68&=,DqDh}O9=q ~#hi&=^W#DH!CC9TR#+ikRx,zf%z%v;%6IRǷd"c vs 3LpvS6owp7m%ScKD2087սJm\y79W_||*h:T5}s[&v+}j }WB}?-H Do8)[v|^4̀ w[BO*I\NXŸ/ZY*If7%j7t򥜗\L!3[RqὕLf*W므rԿ)͔''J۷hW`[_\;Qn/J[K|##Ř1p \N3q9u`b8Fv(cGC̭wGatsXa䴼 },c<y2ȳZ A8~24 E'zs!W"K>}t$l3?]$&X$ |d2z|f*R~d%r%\5˵] l@`q`6 ǀ=!|s .ms0L-Rx"SLP<(apƬLR8,jiVݬQS$4%707`3 Cpd/0l@̙ǛXTwAoi~n{`DOb Pr>J(+VB2ii54[|ޥ$έᕁ@2&$9fzag)x4) S hؙ,uw͌U4DgB 9!#>!5j!E9\鄑|{C# UA*2 UstEo3єwA[bx75Ƞƥj,NNh[iȡo @ė;sbmfkKriNPnB7}9 4\ut |InB~ ,U3s=Z lZ0X-  `-FD^dgab L^LO] jOK0`Ad 2.RU5 "j0͖XtSA/P$! EK}$iy&εP%yOɜo;&o39UPҒ,`AlGjq⒓ p^xvy&2ug}ZndTyuF^1l .[O/@jdHK}I׋]+NgQ V>bECT3y&'ϭzn=ܧcxU U160+uIPKX ZO)ys,X m,|˩2_^vnE7 *zcÿY$Rvˎ1. M L2^?TD|PCS4ESGژjϠJZ_^[COr4nx ܮݿn;ǖiƟUn^U][IiLe28bV۱ l(ᰙ);d|23Vq9$ĉ]?eC/0=Vrp_@kɳfJb>=3ɉ8}hDRZD,_`(S0AkT|R-t]Y:iׇ$BX @8J׶[vozdX`h& ;蒳% y9E$ YP|h(_$Ƽ\,@3fl:TઠQZ rxZ5̏ر:,iXU֦{ma2pa(2;(ȍ~i&3LhqUlNm]},M 8Pvj i8E#'1k!pLv9;>^GN9"$% E Եd<uXϞ8(ۺgϜAF͝C+t$̂5ϲWIujPécW$tŐ$;lUڦR7=DMcn'&nj&Fܻk\E徳BЬ46rzP228^+Ο=HcօI)d*\ ,bQsJљ}K$jM\gws۞t5i)jҮͻ6Klck2ԝԐȪtw{ƭ'xBꁝܡz {u"FgV;jT!wҜ;d컸99m߉laDwh$lxu~lܩZً+iO%Ғe˖-4+AuYJ[u{2V#O(Z@͕'\ZDsE&J5NP~(ĹNrjI|4[n:2'WܙV]uUulbh?"g`$NpnpcaX*LT(z33$SVru=|{ψ.F 5H@z Ik]bUe7--RA 34D鄘.=2#qү?,Ih-$ [(WVP7@) H!RiNH $H@.etx2|0F:_86\[y)M΁,0֤a m Ty<7~l"ҭ{kcAݢݫh"p=qťA(UW"R? d2mR ӄWEzѨ*<(}LvD@ 5l=&C K>‰traϩ*ր=ig;8d@f @w}ɘ3^XֻqslfrʦqVR=n rZ׌SZT/Sһ %Dv9쀅\;#syBo_cVM)_ГP, eԄPQcJ-KĔkB9dR[(S ?|/v'KP6V!.zv2,A =S(ml;~ؒnRCe8jn`M3D\\P6P];nh{1CدkCT!\trVs` 2fL\Azdf,e$l<>nLRx4ÈP-+)2H2qSy%m"*BkѾ_3VՒ y|443&:Yp24Dt8&%]2r# \*^&%xW&eB v-I!z,I3O䉮bX$ND%^e mXB 6FU̿ 4:Ʃ;EU_1[!+k$/YHl@:2EG c3NG6 ^$FZtN\ݹ51Hp Efإ _j({]"qB%5,]sXf4c~b{q?8L\-rJ+kQi<<%Rq4e7jQ#p8hvۃϞ!1t&\.M9 FrȢ0h 9ph+l^Nߔ,7(&LW!K {n a]D\:e0PVr^J>oYׄQRf{Q?aL:d{Sq;kDZ2DdDEi&qf=µwAFt{s*hah.8I0 UU :2o)=LWT5c Xa)=\^ngfv\iK-_%0$&[!vf'g'dnPjmKӬdiVa! |^ DNZ@ dL><,+/jm54`0J%1</?Ju)q>|f'BFkʧ&>Az9tm8ԼWPgOqq)P'4lTSR?h좙BYI_k_0vRn7g(M}q7&lsb]Go"fMU7 >;'`H|Zvc_e{f,5vSNHY;'Vw6aƴ[Zij֠:`\ 4Gtp"s !NjL>cQFYBvl"ljߔ<|c' K4YIׄdGy=tE1WCUvymPυiwr̎+9qu{"dZ UtrU{ +aVys?y=RΪl9[Vlℐ㕾0p^ *Kht)`N Ya=+t0JAɶcה:o7f0Sd㯄B#ݕRj ajg-5q"#ϨbY:T\& Q:WzHGuWGV@1l8lXɐB4Ql0x V3|5"!py|Jrh8:f/>pBMz|)ogb|hP() ]*TA}'S:B֯.5H*2@w n}9-%]FMqTmF匚&Cz|-_pAMӄsFQ3MϘd Tj$>PCWq}6j\u%! ,@DڋCjĀ +klE:<;GΑ ȡ%LgN)C8BWF$bY/1VP)?J;1U6e %ҵSe%|,9Ϻ(,StT8!nk9OLlLZ|_b] qn)?<%yP8W )xu {!D/6aWQd-Y)OOHE!CAf4tĺ0c<0HO ~M^Wلrm-wWTD`o\'elž,̼iı:wQmTLxU` of+M9@(J胰DϪd1ZW-F%x>#f3 33Ian9CC1qg>~nTacĒCjlh`n9vcށF\\:j?Ak\fV}E5;h,ph0< iT8V'"IHnWG8+eγLKH یjތt0zY€& %{#Pa[ ~8Vڊ,)ؖ佃+SIEtGcYg$`q NT7fbFpCσIै`⠴= E aceTn_R*3@c$Qi"4$s䝢*Q4mB3^EOdJ|6S1\.}oN3*ϚvVijBLLsۘ8$]%Ow$R]h)ivW26; ZꕰQ*?Am,:mTܹ b8H"OS"!6cRنN^bs'h&+;lqW`FT&q E/ "t )͑)5aZʩ/DE` 3$rVu[QeE)|$BdZA9e^nUض&ۚDZU By ;\kqг>*p)YͥHqTSKrU:V'A(Fz Z03@ct'嫓w1Xo\hHL|4 ̓/'TC+!nݦA1:OrFg  $].Nn== S&5'A-Tx"f4'?kG}?mg}6Z |Hw t{r1Mi]S_)"`{ŀGISd1.bGӳ8~%/UXxk8ZsXI ;"N8S(]P,.O|PSWὋvcطݲ JD&?)0ǮG'NGŞ,뺰'yJKuL32A%+hQQ:GqzdʪkuDzo`XLR ~$Xm q6-1@nkEb2'{i {'6Bes!fpC-Fց#{͉0w )S)R9E[嗺Q"?W(ST W`omn$讼ت`]6$}rT`5jkV6$iPn9P.K;ĩ5x$IR2+˓1udӟjq`;.^) (^N֞PZcC7>O%O΃.5H1'оx!_2=)/MfZ0)~Rhͣ;Kjz& MC+!UHʚR]}i ` 5Mn~STtQj7I2NIT3;udqNޠ1XG0j 6#MN3M56Sc1DA rw*FuM4fI ͌wtV Iҧ3t< #*MxD ]Q.8zǔBb˲7)Fj8uͪ}~Uѩ\}ZubJ*% ݩ,j4͈$bFDtrR y6;6LvA&HXn=pNx]bo)O0ὕLf*W~~;J_ bf8DvLd{836{ԊϷ+)<\їݜ-m52&u.&aAԉ%2P3SB?01)e;QLxD$+m o_rjS2S)J2(Mp) ńj`n$@wSv$AWTg˳pBkA1r(iE.cJ\)WO0Ő C%(#G< <G}lP\V7pLٟ JE5/Qd-`tߝ^i&BWhqK>3œ it,?tfnEDiMrݙ}J!_c[U9W Z!dX~0=z4XkV*s4g  y{@xx,.2\z(`,pְ5v nݚJ_w?<H\!WϥP4[xVCض=0,buOjKGYC1◃.ts^<cwnraq,6W5ktX)!? mK ?+k FoQxQ::4ZX:9]Q.n DC}r浍&v D@"2qT?:-OvFQ )8gGIOY'bv@Η@K֝ZF/,[5\DʂT@?vZ HwyJ#HZUyi''s{av*W = 5E0udJ2~ 0X% *X`eU *s{b[ZI {^y[.r D?ȌorF IRpvWQ(nOη>H?nYip*vFɒ,Of@ȔeEw ko[cll9Ti2u#qLܧ!jX ,P $s%G)uֹ\*eDHY:U2 :tƈ?A Z=tvoFg1xgϡk1(Ӡ1x+ڠ%EF3nD2Q Dj/%x0" .8|%L(a*"΁*_I> ;N NM/-jꌸJHFPODnOQ$Ӭ'*@2@3 dEfL`q6ױQ1L7bwwQЖǩ\K'cky!JVPn¹LTp' vj-y{9-f9p#<UJ.؋;BdvCw?2պ^eW:–Qr/m60:=DE2'4^O+jM.A,q&XnҙXڈ4&yҤ4\Ou2[E}ODޠC @#[g)Lʨbg>VgQш(6d^'תAv@Goq kGsD;h[ߙw߭-OmwaȻq:'eʷe2rVMDnx v~[2˓uwX/f*wZ',MrȠt- Z ~;j^Opm3==@D{B2F"qg0oR]shP.<ɅdŌǟd"h甍Z2ʱ~pLJ2lecSp0jaKQ%Xy?/$31'DL2W?)ɰ,˧J,*̟`d{ l:fTs}I7::) }KVCSt?ߗenɪ$_. Kꌀ;i_B-Hp"~u( =jI@{B|8:ZV]{!ԊTCw Hpe?hYEˁy-#h9` }["k>؊py~_|ЋG:'o;lLo˓2-O(˷}Ϗir("納ڻ6l>&%k1)Y^aaK<7?6u,4˰%ǨUHǜdyu-$OJLe{-|3yLtfmĝ9&!Y`d<Ē Hpk!C/!ܩPp:zw;x%:z WP>ѻ!^ͯ>^@zu=: TK(pOEpȣ' 0}"}<"G_mV7y۶<\o) O"p=֢H(Ks˟败6V XeآcTpH~v31':툴tm{3m4&ZE:؋'2瓻Љply)x{q!$SFL&K6w i^~uܽދʯ>C@;݋Ư>S@;8WP% !g H϶0k:9V]WPL@3 us$SAn' _5ܮȣ'6amnOQNK{R[cw2|dF"˶}#a6m)T[e=7~u${-WP_* 7C/"$S&~uܩHz3:JV]oWP_% ʂz+:j T$QI_mN}ۖ~(e桶 13 y(}d#}#ag 3- AǴ`&pL Sf49\06˰Ǩi>ҼLg"mc&ګ矔`Z4 %MuH`tw$ ců=-! Hp.tWP 1b 1w+17 HpB8:wjx:Y@JNyf!ԷHpW_B}w*tOCo}:vV]!wHﰠ!w Hp~A] vuEl9 O|ߖ,q"Y{TD-Vܶ,k(#uޖAe#MG>n4Y k}LJk1)ΙeRMåCft9\:=i tzNtzo{N3J*[ k~jČ' Ch)dRe\Hk01/E_y5a m$C G<=UCc62w1b'+kK`0^H*adK#cfE"lLJ:-@`/ ^.{[Hr~7VUƎv{7Na=E.)~‚ZTLY,tGZHsǖfh=NrC] 1-a]'}T_vܳ=si1D"lYn& R{yZngl~8 ;8v|AeuUd^׏IY-^yRg$jNNu`Yuj_4~[H_HH!mߋ-x!Kb _*E6/TTohi!-k5\nlw >(+"G$Z畮Z5/e~)>t}uuKt=Aڡk"&]K[t=F-?m ^-x}+ȑuE~.*>Z{[I󵚮-cp E-$~YD畖ʺ|^rIY䳼x+-:]9/ur+;S;|]ĤWK[ܴ*myl^m[x xm"íЮv)F#o1@9ztwx&qk|Ae*k˼妻[HY--2l^m^䦻:S;tw{Ĥyאo-Wtr#wo_'"Kw%ʻ2 9)b"{$¿=m-tm{硟ξѣ3磬 (VY?y7ZwiN7vX'Ƽ:S;Ioͤ-y6}Ղ7zF-xc~_zgd>5-;Z+UNօq{XΥwxZC^&a<N6rօx&q:f;B*kr^r VqY[u]NR'0AYDu::B~[GNۦ3+XJ^rd~ׅ"G.[ Ji W*}{ZM65K/zs9%YS敞ZeYH敞$e:2|:Y>敞N#&=+=?LCm{,x!{ <'wáG^2rl1Ăyy" ߋΎp3[k/{ewDl}][ujck'7g~c~~bc;Wc/׳毺Ny|#m3_Fk>6.`OltmzɅ:Y[^k_/h6?p=oxzͽ_mx{ӛJOiг§6o~Ih ?}3ڈM~hv'~f8gm _XU:_ު?ec+oZ_v%So}[7K{K#}o^^_5z_x;^|w?|?=?~;Fb_} X3'?Z|u˞{Վ/7{[cL=F=iwK?W/>|Ŧw6nŇ64ȟ^پMnc+wnk^ރ4bg|ӈ-칽h$Kݯh嗝sÍS\F"u߽l/O= '>x7^XxG޻K?i n_շ75Ny;[;}₭K>Xy7%wE3>?}~vyݪ6^sN'~q>w4Yo~ӟه⊅Ͻ-FoCzNo]kw ?FcXU_ok|Oڹ7V͇K/zh_yw=gv_|F?|]7˧~kw5g<yu JoMFFE~`+ghYW5~߰1uO7^|瞳]5\<.jdKc]]gmie^tgM7zkFW8aviBOo-ls_ՍMm7V>d{_zѯg:r{?7b?s?1x஗}h,郟ev}pߗwHoؙV5V<᧼o{,:"kXk}7/8??c g>[o=_Z:~_={^q~v|^GxH?I _'MUsQtE􈦣r4 ;K/-&0Y[iM|w_i[xկvL51kg6\h9Ra8 NaxO.\tYP?2n6lJF(vv9a8C"}P};v+}(⯛ 6wP?Qu.Jh ·y'Aywk\s-f w/Vk޸hV{Zn>lV # |Z>7lͥilz[vAbu"}-5\n=\xYflM]4!hОa8Fh nw]Ej~܅\wqW=hEc*暋F.iUvO_OPBi~X]藫OhA%tW_nWt* _%~4υ6z+޻ ŅGӻx! q58> z4"<{~\ g}#MsG+s5/631kg5..5Fs.U^f.׳fs- g{!s8+pzDď7K ;s٪qLɟk6_vK2 )VJޮD.dt6[gjfwk~rʦLuf:x$kp}5S5\ ntX?3H@-z<}\.?5͞?Fq8>1|[/# R6wH II8NΐED?-:;r,p~ )@@pti;"®c8]`_z] v}]fgYv}N_#]ˮc߳yv=$]_dחev}]_euv}]ߌ\Ftifp"WCX ~JPIeV~)/Y0'# /YpP~_˸"KՄÕ\VmٽJvDTf )InE (}oVnϛzW=Vi=t>ߙbXx1Lq.,s?U}~E9>݃vJ}]~w|'/{G.z~_ՏV'Y\3WӾiO>ggsCo}ۆ^zdYNA^N-}\i.SJ_!3+HKl.@}Bep_`wGË˯_^GOy[^/8}~Mӿko=kug6[HO`y oʷ#oJ?^v_6?.?򍷽#髮~sO]^7r+7bVnI _W~Ozސ~9OLOS }5P?6w%CwL|W^~䖉߲^zٞ,z'2{ˍߊqKw_~mLOߕxz6?;|]?o=g|KޘlI3_go}.;[o{.yQ'o_s>g{'x^_'OL ~w_?ץ_wo /,?KW=/ҷE O~M;ә⯪[!=WKIJ0;qqƋn'=w>~{5_֋^Y_>ݿ9//<3w c.>X(>+oN_tB/<|z;~~ҷS.O7NxLf}.H-{ W?}~կxۆrϜm)7ߓޙ7zhyW_0}ޞ/~nOY?{?|G-}뷊7._θ(y]_Ii_p^ڮo}_~uoǞ>|8'~Vxއ>,YW<5{6x#{L3;?N?r?sCwdv}WoJs\MçU[}8/=/~Vi}ߟ~=O{sO/L߲8w7}˧;}wlꅻz۷vO~ ߼#7˯p7S{ym/N]?qzӷ2y7">3ʝ|͹_K'q<g}?H '好v߫/~PX~eoL?Cw>[~g$}g]M>kkү>O{C\r/ڐޞןu7~}Ko]}o{xY oG7x(}w_ꁧuK_OMOYxc/ݜ| <='Rk_~co? |~P%c_Jgkmӟ_\7}2+o==oů'z-OSx滇W|GoX7|˟vP.|)+9&^N5O7/zkM \{;_glH'w?N~w^YPGk?k鷾t%Ó~E^73u) ,]aeOЁV+DNqn{9~Kq[ 6\ToXSμdMɞ3>6HN`B5SO9 NU 6^^K(L]1,EIHbю74B߀RAWsԅY̸0j8+H.vIMYT)"J[!?}x2{~q,ض+uWz/~-Ze]$z<%iE$/gՏ9jǮy/ }1߸K][kz_#jveeٶ^wA ՟rK}vp~lAMl%8t]>pхgAʸAI91\\xh9⭫v6 . oaEO4kf}N7ޭ⾼kˆma}!pOl [si]Fk]?'6/4A|=aZ檋yW[]qf\>vеfxDp\Z+\t5nmesNu Z;nd7^C;|ql;EIa iv݅]\t6G,]nuw#\4rkh|v5 _(kri9 A' ׵(Ҟ_ |vM'҅q j \cOǏwB.r_c\sճiNheݦv=f5;_~ҹf%cOqe }_c}! s.atAs#N暽:\.5Z6#\x6ר^wZ ]:2{l5{N-vs#֒ |M\8s6V_.y ׺fs{9Z4\͡ zr$sE7戍߲6 < _ vغSMׂE]!Akؼkcpz/k{ VX(.׳fs- g{r^nsP } (>HnB[C6uфuC{pydZAswa_]8Q< ssE]E;iF\k.!VA 6>і ~_at h|lPh -/q]힙 gt2(]wѼp5thz/!5oKܾ1 QI3My9*EE)S.E -ItK1!Sc"e MJ4zit~g{ws H+\m+\ßONᲐ$'r ]k))pɎ ߠ|ok~ -H#nxITC 3t\|oq##4*}So:)~uNn*P.)nq3TqGxr ڂH:msdR.=|,T'GpfˀEGTwtySרlFނk8C.+o| 1)F|%xܢm:[qʎ oSx@g߸/RqNTۥ</HN{I#զ~H!OW_IIn>T"ՖG3I#CT񙊷T*;r7\8َ_ٲq#!陔T}p'7\mCŇ_TS{_GIu1ɞRq;܆MwеgT1kIUm |{:ʑTu]q tzwGTFIz[?#<Pcnrt9/tՐtq'՜$[QQ^4}KCõ]k;=m;tٕ]k]kwfவw-p [l4UQ_'- Z ӂ>$BH@Z 1d˸ɝՏPK?mՏhK?"-ӧFs hNe8tjSr wN4FN.*!wnݲ`a-$j2{IF6o=?HBWUMWLv,n.iX$O .=9dqV#kx(xvԄ*K¥CsQxo m22 )YEbws?-,6X0ZWb$r/|{ǺQC0-ws=,sc4?'~I8zPu6Ng/l'> 42ns F/`iAߠY*72470Fh? g?+ȡgY|eCNF8~Q֧!?zaw|Z jƁ% ڷRŏc7' 䭢W 7acx6@Zl)>ʐY:Rbd_yzB*oFHP{/"D2*7ApwCsAr_ፐ.W&D =rW>j+ՔoTFQ/aֲ9 [ ^7}p Br9g7ChĊ5@a~2F#pn] 4=&H2?YKnX,Yh|= cXm2;9ܖUO.hj'ݠU!wpo>>@_SzA [TfBD+O -6ͩ_;D쇈( [sDim sxۧR ҝj?m㷬03]6C6+4> YO߂]<,e1sp:͜,@9=4tq7ڏyuAe#%CQyt1QH(de36aU; o<@Ј^Eh"2S/4/S .Oډ^"CHsޱL9P'T|dŧ7m/:ҽdcPSw:>C(r5v#r})Qozٻ{fPZve~H]XX/H=,p8DX|ZxHxtU1F22H׃  { |[x0"{{J4j WWԄ[A$Sؑ/O6aFWrPd O3s7`gC#X}hAdW[R~~1'La 4U!M JRB4BBʚA$&6`.xUv5ROCMgf'ͲT" :BRl/@l;OVї^"30%2} sVM̅4M&o.p "|2~[D4I\bVzj&Dh>! mEߘjZsˏоel|KN1'YhdgVpm}L=+ByehW\A÷dP%tk)?ȱ::t ō[ @,fv1o\e/x> !c:B5U@lS9VVwTG&CbmxXb$ߥS!6 2y&zMb΀8Z)?oa\m:dKX ꙑ7@AӅDMi a}]R; xt~/uY4G-wѼ++PpjM./|5vC:Ӧcٔ00eʫa;u3zұ(P_#'g6?KiE_P̯%iIgVCkCD&|rkR k3i*|!d1/4ٗٳ\ ]b CaZ a3V<8$nўv~ [ˏí'K[1#wP#ﲕc7E=;| $j䗟r5-੉(wxs= j!n(] _%X3e*V;oԋܶ+)"zKt"x蛳4<8%h>|9[2 MwX l(39Su_Nn;SvHxfAV֦S|}޲]J娈,Wdvq7ڏb|!b|!m1^1ewEq;>EeBzh:(9neRCv//n?`A +U۠Slrњ(ȗxYXQ!>S| {7Q0 @;p>O;D[{{:u^Y1?5{ϝv_o SaZT!+!Xqb/; QK=F* _VJNPNzfK!TIj&HzS϶]p n] nY G΁4ew@O͓ ';Bwy䡤Dž{{qabX&ʹZ Nt"`;V_W q|ܵh5u6zI.|MeHU,X 7T!.@Գq`dYzgsV k@';oa PGP <%~[y|`&r͏_f +>MaN<*Sw\o;AQGSaco_!cdE-z: \$گ<עҙ{?,h{7n;OaarE3G=?1s* @}rojpRNJs5xtÎ N76I9 t9di\A$l רxN \VI>)v'|TNvlHR-Iuʞ"]/)&PI\8|.^q>C5M]^F{YHqA3:|:)䠋E5R(V|5R`'L| j*d_$Nܟb U=I]/iΎ>8ElcI\=I"=cXH>@=8'BBɎlR]=1r5*=sc?~k~kst5\dD}o˒A)vLy'tE%$?kx}ǍNI1MvlGxwT\mO5nE'x$q H_{kɧIHF6T穸sptz%TKx\ U{r&\E{ 59lp نFj kAܿ2mQU6]^#5*b4>F~Tu_ڈ5*9qbjY-:Ǡi|oxMmҘ8}kt&'#T ;Iz%ُT!$?]}EGG$]''i#PqT[bU$)Pg*RgOr㼎Jg;{$~qgˆǡ|gR.V~R|Jp ~kRN}5._T$${>JYpv7ߩ7\?)qp@XHU\H\.ObUm |{:ʑTu]q tzwGTFIz[!I:'\{*{q ϹpgrH9Tă]" ]?t5$]\%I5 #VTw8",?M$pE마˜ͷ`|ՐHtD('WvJ 69:W|n 6#5ek֢WYAcQFZ֢[V7:IZLZX^Z(Z+h# A"<0#_5e])r ؖ9t2AѼx"$S"LCLY*XK ֵ-BXAAAA a)2+V" "BCXa-:6"#lB`}5a3#LX[#X 2Ŏlѓ5 .{"CEC؏p !{l 8 E8p 3IS)A`mu<k .!3}2O/G.|X!\EG2@ !a-#@@D`mp!!!! !!!!EW6DB1!m;w !G(B(fx+BO~FgZ&v1³}'}.Oxvky66u6Kl|sU/K޳>?Qz\onrX]Xɋ)|% Iǹ$@'c%[ߓoGJРtO*N~n۴+=g\ΰjxg@H AMo_ y#E0Z 3) *z k5繃*<̡KpJwQP; z7պ)~n*>HeZ^$-d7 vyi.K>G[.!sC7n2nP3y3rPf}Í?ouв =.qoV$Β ^vCL@,dZT?E.0|=1uo ۾ZИbհA{15K~[{\M\6;I-ӓ'I]=O)5\M#\sI?D KX7/>3Y ɮs䒶 S;[=]ugj9yA5jFO!{Sq$]{x5i`!}%]W enrctNq {BhX!H[`H]zx&D/gT{ -P !>_Jk,+=!8G˵?gt}@ba]7p#%vPuPn x3|گR]'~N 풲 }R.>:L(~8c *5d|ȡ矫^e:cu[m͛ 9b|2OPL_ѩj} mF'T[JKdnLҿӃ7;{ Ŏ)p?JpMU=럶"?Uԇx!kɟSbNm`o,z|_&2uļyhy&/;|vr]-^-jeV >9 wu ۣ5$,Cb}Ȁ1߇Ķm`d>: ?bs鮐{wn%0Fck@ѸXAYcclBHW>$.`ss68η 5MC y_?J*~vJn5m(sҡqѣ0/W!BnNN=q{yvFM!U=g CθLLLj]!Xѐ3ubk[(p.2MfaO6DJu?n2L"5p&cCp!%Z]t(2oL\;5f1a V˅Bc?e>1K/p U"="}(09MjMӥړa Y?nk7.vȁ OgZ1%+Los5m })q_WZ/ug*W.x^{\ g^@пGZkI'u2rf~X88Q'^Ά1SB|?Lw\cWʍ5hBByM\vS -q=AuSQ*!kBg5J?g;ܼOCXlִi~kCjh=-{jZ-e} jK_K݁ AcIzȼbr/~>;w9ܖv=6"30 *?/|=s'kּWj u+^u|fVUzIюӾzAAP6zҾz 0ӻU2[a}} ,gDN=[Ii]$_W:CԊ5/B`5f?݂Y w '!_J{O5} 25 ~!GR34*~D^2S}S^U4 R劕|z.f^/n phangorn/vignettes/phangorn.bib0000644000176200001440000007025214151736347016411 0ustar liggesusers@article{Abascal2005, author = {Abascal, Federico and Zardoya, Rafael and Posada, David}, title = {ProtTest: selection of best-fit models of protein evolution}, volume = {21}, number = {9}, pages = {2104-2105}, year = {2005}, doi = {10.1093/bioinformatics/bti263}, journal = {Bioinformatics} } @article{Leo2008, author = {de Oliveira Martins, Leonardo AND Leal, Élcio AND Kishino, Hirohisa}, journal = {PLoS ONE}, publisher = {Public Library of Science}, title = {Phylogenetic Detection of Recombination with a Bayesian Prior on the Distance between Trees}, year = {2008}, month = {07}, volume = {3}, pages = {1-13}, number = {7}, doi = {10.1371/journal.pone.0002651} } @article{Leo2016, author = {De Oliveira Martins, Leonardo and Mallo, Diego and Posada, David}, title = {A Bayesian Supertree Model for Genome-Wide Species Tree Reconstruction}, volume = {65}, number = {3}, pages = {397-416}, year = {2016}, doi = {10.1093/sysbio/syu082}, journal = {Systematic Biology} } @article{Schwarz1978, author = "Schwarz, Gideon", doi = "10.1214/aos/1176344136", fjournal = "The Annals of Statistics", journal = "Ann. Statist.", month = "03", number = "2", pages = "461--464", publisher = "The Institute of Mathematical Statistics", title = "Estimating the Dimension of a Model", doi = "10.1214/aos/1176344136", volume = "6", year = "1978" } @incollection{Jukes1969, title = "\{CHAPTER\} 24 - Evolution of Protein Molecules ", editor = "Munro, H.N. ", booktitle = "Mammalian Protein Metabolism", publisher = "Academic Press", year = "1969", pages = "21--132", author = "Thomas H. Jukes and Charles R. Cantor" } @Article{Tavare1986, author = {Tavar\'{e}, Simon}, title = {Some probabilistic and statistical problems in the analysis of DNA sequences}, journal= {Lectures on Mathematics in the Life Sciences}, number = {17}, pages = {57--86}, year = {1986}, publisher = {American Mathematical Society} } @Article{Sugiura1978, Title = {{Further analysts of the data by akaike' s information criterion and the finite corrections}}, Author = {Sugiura, Nariaki}, Journal = {Communications in Statistics - Theory and Methods}, Year = {1978}, Number = {1}, Pages = {13--26}, Volume = {7}, Keywords = {aic, criteria, model, selection}, Doi = {10.1080/03610927808827599} } @article{Knuth1984, title={Literate programming}, author={Knuth, Donald E.}, journal={The Computer Journal}, volume={27}, number={2}, pages={97--111}, year={1984}, publisher={British Computer Society} } @article{Buckheit1995, title={WaveLab and Reproducible Research}, author={Buckheit, J.B. and Donoho, D.L.}, journal={Wavelets and statistics}, volume={103}, pages={55}, year={1995}, publisher={Springer Verlag} } @Manual{rmarkdown, title = {rmarkdown: Dynamic Documents for R}, author = {JJ Allaire and Joe Cheng and Yihui Xie and Jonathan McPherson and Winston Chang and Jeff Allen and Hadley Wickham and Aron Atkins and Rob Hyndman}, year = {2015}, note = {R package version 0.8}, url = {https://CRAN.R-project.org/package=rmarkdown}, } @Manual{phyloch, title = {PHYLOCH: R language tree plotting tools and interfaces to diverse phylogenetic software packages.}, author = {C. Heibl}, year = {2008 onwards}, url = {http://www.christophheibl.de/Rpackages.html}, } @Manual{ips, title = {Interfaces to Phylogenetic Software in R}, author = {C. Heibl}, year = {2015}, url = {http://www.christophheibl.de/Rpackages.html}, note = {R package version 0.0-7}, } @Manual{CRAN, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2020}, url = {https://www.R-project.org/}, } @Manual{Biostrings, title = {Biostrings: String objects representing biological sequences, and matching algorithms}, author = {H. Pages and P. Aboyoun and R. Gentleman and S. DebRoy}, year = {2015}, note = {R package version 2.36.4}, } @Manual{Matrix, title = {Matrix: Sparse and Dense Matrix Classes and Methods}, author = {Douglas Bates and Martin Maechler}, year = {2019}, note = {R package version 1.2-18}, url = {https://CRAN.R-project.org/package=Matrix}, } @Manual{seqLogo, title = {seqLogo: Sequence logos for DNA sequence alignments}, author = {Oliver Bembom and Robert Ivanek}, year = {2020}, note = {R package version 1.54.3}, } @Manual{apex, title = {apex: Phylogenetic Methods for Multiple Gene Data}, author = {Thibaut Jombart and Zhian Namir Kamvar and Klaus Schliep and Rebecca Harris}, note = {R package version 1.0.1}, year = {2015} } @Manual{Turlach2013, title = {quadprog: Functions to solve Quadratic Programming Problems.}, author = {Berwin A. Turlach and Andreas Weingessel}, year = {2013}, note = {R package version 1.5-5}, url = {https://CRAN.R-project.org/package=quadprog}, } @Manual{rgl, title = {rgl: 3D Visualization Using OpenGL}, author = {Daniel Adler and Duncan Murdoch and others}, year = {2020}, note = {R package version 0.103.5}, url = {https://CRAN.R-project.org/package=rgl} } @article{Bouckaert2010, author = {Bouckaert, Remco R.}, title = {{DensiTree}: making sense of sets of phylogenetic trees}, volume = {26}, number = {10}, pages = {1372-1373}, year = {2010}, doi = {10.1093/bioinformatics/btq110}, journal = {Bioinformatics} } @article{Cavalli1967, author = {Cavalli-Sforza, L.L. and Edwards, A.W.F.}, year = {1967}, title = {Phylogenetic analysis: models and estimation procedures}, journal = {American Journal of Human Genetics}, volume = {19}, pages = {233--257} } @Article{Huson2006, Author = "D.H. Huson and D. Bryant", Title = "Application of Phylogenetic Networks in Evolutionary Studies", Journal = "Molecular Biology and Evolution", Volume = "23", Number = "2", Pages = "254--267", Year = "2006" } @InCollection{Buneman1971, author = "Peter Buneman", title = "The recovery of trees from measures of dissimilarity", booktitle = "Mathematics in the Archaeological and Historical Sciences", editor = "Hodson, F. R. and Kendall, D. G. and Tautu, P. T.", publisher = "Edinburgh University Press", pages = "387--395", year = "1971" } @Article{Buneman1974, title = {A Note on the Metric Properties of Trees}, author = {Peter Buneman}, journal = {Journal of combinatorial theory (B)}, year = {1974}, volume = {17}, pages = {48--50} } @article{Fitch1971, author = {Fitch, Walter M.}, title = {Toward Defining the Course of Evolution: Minimum Change for a Specific Tree Topology}, volume = {20}, number = {4}, pages = {406-416}, year = {1971}, doi = {10.1093/sysbio/20.4.406}, journal = {Systematic Biology} } @article {Paradis2017, author = {Paradis, Emmanuel and Gosselin, Thierry and Goudet, Jérôme and Jombart, Thibaut and Schliep, Klaus}, title = {Linking genomics and population genetics with R}, journal = {Molecular Ecology Resources}, issn = {1755-0998}, doi = {10.1111/1755-0998.12577}, volume = {17}, number = {1}, pages = {54-66}, keywords = {multivariate analysis, NGS, R, SNP, VCF}, year = {2017}, } @article {Jombart2017, author = {Jombart, Thibaut and Archer, Frederick and Schliep, Klaus and Kamvar, Zhian and Harris, Rebecca and Paradis, Emmanuel and Goudet, Jérome and Lapp, Hilmar}, title = {apex: phylogenetics with multiple genes}, journal = {Molecular Ecology Resources}, issn = {1755-0998}, doi = {10.1111/1755-0998.12567}, volume = {17}, number = {1}, pages = {19-26}, keywords = {R, package, Software, Genetics, Phylogenies}, year = {2017}, } @article{Kuhner1994, author = {Kuhner, M K and Felsenstein, J}, title = {A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates.}, volume = {11}, number = {3}, pages = {459-468}, year = {1994}, doi = {10.1093/oxfordjournals.molbev.a040126}, journal = {Molecular Biology and Evolution} } @article{Lento1995, author = {Lento, G M and Hickson, R E and Chambers, G K and Penny, D}, title = {Use of spectral analysis to test hypotheses on the origin of pinnipeds.}, volume = {12}, number = {1}, pages = {28-52}, year = {1995}, doi = {10.1093/oxfordjournals.molbev.a040189}, journal = {Molecular Biology and Evolution} } @article{Leaché2015, author = {Leaché, Adam D. and Banbury, Barbara L. and Felsenstein, Joseph and Nieto-Montes de Oca, Adrián and Stamatakis, Alexandros}, title = {Short Tree, Long Tree, Right Tree, Wrong Tree: New Acquisition Bias Corrections for Inferring SNP Phylogenies}, year = {2015}, doi = {10.1093/sysbio/syv053}, journal = {Systematic Biology} } @article{Lewis2001, author = {Lewis, Paul O.}, title = {A Likelihood Approach to Estimating Phylogeny from Discrete Morphological Character Data}, volume = {50}, number = {6}, pages = {913-925}, year = {2001}, doi = {10.1080/106351501753462876}, journal = {Systematic Biology} } @article{Potts2014, author = {Potts, Alastair J. and Hedderson, Terry A. and Grimm, Guido W.}, title = {Constructing Phylogenies in the Presence Of Intra-Individual Site Polymorphisms (2ISPs) with a Focus on the Nuclear Ribosomal Cistron}, volume = {63}, number = {1}, pages = {1-16}, year = {2014}, doi = {10.1093/sysbio/syt052}, journal = {Systematic Biology} } @Article{ Rambaut1997, Author = "A. Rambaut and N.C. Grassly", Title = "Seq-Gen: an application for the Monte Carlo simulation of DNA sequence evolution along phylogenetic trees", Journal = "Comput Appl Biosci", Volume = "13", Pages = "235--238", Year = "1997" } @Article{Revell2012, title = {phytools: An R package for phylogenetic comparative biology (and other things).}, author = {Liam J. Revell}, journal = {Methods in Ecology and Evolution}, year = {2012}, volume = {3}, pages = {217-223}, } @Article{Revell2014, Title = {Rphylip: an {R} interface for {PHYLIP}}, Author = {Revell, Liam J. and Chamberlain, Scott A.}, Journal = {Methods in Ecology and Evolution}, Year = {2014}, Number = {9}, Pages = {976--981}, Volume = {5}, Doi = {10.1111/2041-210X.12233}, ISSN = {2041-210X}, Keywords = {phylogeny, statistics, computational biology, evolution} } @InBook{Robinson1979, Title = {Combinatorial Mathematics VI: Proceedings of the Sixth Australian Conference on Combinatorial Mathematics, Armidale, Australia, August 1978}, Author = {Robinson, D. F. and Foulds, L. R.}, Chapter = {Comparison of weighted labelled trees}, Editor = {Horadam, A. F. and Wallis, W. D.}, Pages = {119--126}, Publisher = {Springer Berlin Heidelberg}, Year = {1979}, Address = {Berlin, Heidelberg}, Doi = {10.1007/BFb0102690}, ISBN = {978-3-540-34857-3} } @article{Robinson1981, author = "D.F. Robinson and L.R. Foulds", title = "Comparison of phylogenetic trees", journal = "Mathematical Biosciences", volume = "53", number = "1", pages = "131 - 147", year = "1981", issn = "0025-5564", doi = "10.1016/0025-5564(81)90043-2" } @article{Holland2004, author = {Holland, Barbara R. and Huber, Katharina T. and Moulton, Vincent and Lockhart, Peter J.}, title = {Using Consensus Networks to Visualize Contradictory Evidence for Species Phylogeny}, volume = {21}, number = {7}, pages = {1459-1461}, year = {2004}, doi = {10.1093/molbev/msh145}, journal = {Molecular Biology and Evolution} } @article{Bryant2004, author = {Bryant, David and Moulton, Vincent}, title = {{Neighbor-Net}: An Agglomerative Method for the Construction of Phylogenetic Networks}, volume = {21}, number = {2}, pages = {255-265}, year = {2004}, doi = {10.1093/molbev/msh018}, journal = {Molecular Biology and Evolution} } @Article{Csardi2006, title = {The igraph software package for complex network research}, author = {Gabor Csardi and Tamas Nepusz}, journal = {InterJournal}, volume = {Complex Systems}, pages = {1695}, year = {2006}, url = {https://igraph.org/}, } @Article{ Stefankovic2007a, Author = "D. Stefankovic and E. Vigoda", Title = "Pitfalls of heterogeneous processes for phylogenetic reconstruction", Journal = "Systematic Biology", Volume = "56", Number = "1", Pages = "113--124", Year = "2007" } @article{Nguyen2015, author = {Nguyen, Lam-Tung and Schmidt, Heiko A. and von Haeseler, Arndt and Minh, Bui Quang}, title = {IQ-TREE: A Fast and Effective Stochastic Algorithm for Estimating Maximum-Likelihood Phylogenies}, volume = {32}, number = {1}, pages = {268-274}, year = {2015}, doi = {10.1093/molbev/msu300}, journal = {Molecular Biology and Evolution} } @Article{ Nixon1999, Author = "K. Nixon", Title = "The Parsimony Ratchet, a New Method for Rapid Rarsimony Analysis", Journal = "Cladistics", Volume = "15", Pages = "407--414", Year = "1999" } @Article{ Matsen2007, Author = "F. A. Matsen and M. Steel", Title = "Phylogenetic mixtures on a single tree can mimic a tree of another topology", Journal = "Systematic Biology", Volume = "56", Number = "5", Pages = "767--775", Year = "2007" } @Article{ Pagel2004, Author = "Mark Pagel and Andrew Meade", Title = "A Phylogenetic Mixture Model for Detecting Pattern-Heterogeneity in Gene Sequence or Character-State Data", Journal = "Systematic Biology", Volume = "53", Number = "4", Pages = "571--581", Year = "2004" } @Article{ Thornton2004, Author = "B. Kolaczkowski and J. W. Thornton", Title = "Performance of maximum parsimony and likelihood phylogenetics when evolution is heterogeneous", Journal = "Nature", Volume = "431", Number = "7011", Pages = "980--984", Year = "2004" } @Article{ Studier1988, Author = "J. A. Studier and K. J. Keppler", Title = "A Note on the Neighbor-Joining Algorithm of Saitou and Nei", Journal = "Molecular Biology and Evolution", Volume = "5", Number = "6", Pages = "729--731", Year = "1988" } @Article{ Saitou1987, Author = "N. Saitou and M. Nei", Title = "The Neighbor-Joining Method - a New Method for Reconstructing Phylogenetic Trees", Journal = "Molecular Biology and Evolution", Volume = "4", Number = "4", Pages = "406--425", Year = "1987" } @Article{ Pagel2008, Author = "Mark Pagel and Andrew Meade", Title = "Modelling heterotachy in phylogenetic inference by reversible-jump Markov chain Monte Carlo", Journal = "Philosophical Transactions of the Royal Society B", Volume = "363", Pages = "3955--3964", Year = "2008" } @Article{ Shimodaira1999, Author = "Shimodaira, H. and Hasegawa, M.", Title = "Multiple comparisons of log-likelihoods with applications to phylogenetic inference.", Journal = "Molecular Biology and Evolution", Volume = "16", Pages = "1114--1116", Year = "1999" } @InCollection{ Pagel2005, Author = "Mark Pagel and Andrew Meade", Title = "Mixture models in phylogenetic inference", BookTitle = "Mathematics of evolution and phylogeny", Editor = "Olivier Gascuel", Publisher = "Oxford", Address = "New York", Year = "2005" } @article{Pupko2000, author = {Pupko, Tal and Pe, Itsik and Shamir, Ron and Graur, Dan}, title = {A Fast Algorithm for Joint Reconstruction of Ancestral Amino Acid Sequences}, volume = {17}, number = {6}, pages = {890-896}, year = {2000}, doi = {10.1093/oxfordjournals.molbev.a026369}, journal = {Molecular Biology and Evolution} } @article{Pupko2002, author = {Pupko, Tal and Pe'er, Itsik and Hasegawa, Masami and Graur, Dan and Friedman, Nir}, title = {A branch-and-bound algorithm for the inference of ancestral amino-acid sequences when the replacement rate varies among sites: Application to the evolution of five gene families}, volume = {18}, number = {8}, pages = {1116-1123}, year = {2002}, doi = {10.1093/bioinformatics/18.8.1116}, journal = {Bioinformatics} } @InCollection{ Swofford1996, Author = "Swofford, D.L. and Olsen, G.J. and Waddell, P.J. and Hillis, D.M.", Title = "Phylogenetic Inference", BookTitle = "Molecular Systematics", Editor = "Hillis, D.M. and Moritz, C. and Mable, B.K", Edition = "Second", Publisher = "Sinauer", Address = "Sunderland, MA", Year = "1996" } @Article{ Kolaczkowski2008, Author = "Bryan Kolaczkowski and Joseph W. Thornton", Title = "A Mixed Branch Length Model of Heterotachy Improves Phylogenetic Accuracy", Journal = "Molecular Biology and Evolution", Volume = "25", Number = "6", Pages = "1054--1066", Year = "2008" } @Article{ Dempster1977, Author = "A. P. Dempster and N. M. Laird and D. B. Rubin", Title = "Maximum likelihood from incomplete data via the EM algorithm", Journal = "Journal of the Royal Statistical Society B", Volume = "39", Number = "1", Pages = "1--38", Year = "1977" } @Book{ Felsenstein2004, Author = "Joseph Felsenstein", Title = "Inferring Phylogenies", Publisher = "Sinauer Associates", Address = "Sunderland", Year = "2004" } @Article{ Felsenstein1981, Author = "Joseph Felsenstein", Title = "Evolutionary trees from DNA sequences: a maxumum likelihood approach", Journal = "Journal of Molecular Evolution", Volume = "17", Pages = "368--376", Year = "1981" } @Article{ Felsenstein1985, Author = "Joseph Felsenstein", Title = "Confidence limits on phylogenies. An approach using the bootstrap", Journal = "Evolution", Volume = "39", Pages = "783--791", Year = "1985" } @inproceedings{Leisch2002, author = {Friedrich Leisch}, title = {Sweave: Dynamic Generation of Statistical Reports Using Literate Data Analysis}, booktitle = {Compstat 2002 --- Proceedings in Computational Statistics}, pages = {575--580}, year = 2002, editor = {Wolfgang H{\"a}rdle and Bernd R{\"o}nz}, publisher = {Physica Verlag, Heidelberg}, note = {ISBN 3-7908-1517-9}, } @article{Lemoine2018, title={Renewing Felsenstein’s phylogenetic bootstrap in the era of big data}, author={Lemoine, Fr{\'e}deric and Entfellner, J-B Domelevo and Wilkinson, Eduan and Correia, Damien and Felipe, M D{\'a}vila and De Oliveira, Tulio and Gascuel, Olivier}, journal={Nature}, volume={556}, number={7702}, pages={452--456}, year={2018} } @Article{Penny1985, Author = "D. Penny and M.D. Hendy", Title = "Testing methods evolutionary tree construction", Journal = "Cladistics", Volume = "1", Pages = "266--278", Year = "1985" } @Article{Penny1986, Author = "D. Penny and M.D. Hendy", Title = "Estimating the reliability of evolutionary trees", Journal = "Molecular Biology and Evolution", Volume = "3", Pages = "403--417", Year = "1986" } @Article{Yang1998, author="Yang, Ziheng and Nielsen, Rasmus", title="Synonymous and nonsynonymous rate variation in nuclear genes of mammals", journal="Journal of Molecular Evolution", year="1998", volume="46", number="4", pages="409--418", doi="10.1007/PL00006320" } @Book{ Yang2006, Author = "Ziheng Yang", Title = "Computational Molecular evolution", Publisher = "Oxford University Press", Address = "Oxford", Year = "2006" } @Book{ Yang2014, Author = "Ziheng Yang", Title = "Molecular Evolution: A Statistical Approach", Publisher = "Oxford University Press", Address = "Oxford", Year = "2014" } @article {Michaux2003, author = {Michaux, J. R. and Magnanou, E. and Paradis, E. and Nieberding, C. and Libois, R.}, title = {Mitochondrial phylogeography of the Woodmouse (Apodemus sylvaticus) in the Western Palearctic region}, journal = {Molecular Ecology}, volume = {12}, number = {3}, publisher = {Blackwell Science Ltd}, issn = {1365-294X}, doi = {10.1046/j.1365-294X.2003.01752.x}, pages = {685--697}, keywords = {Apodemus sylvaticus, glacial refuge, mtDNA, North Africa, phylogeography, postglacial colonization, Western Palearctic region }, year = {2003}, } @Article{ Paradis2004, Author = "E. Paradis and J. Claude and K. Strimmer", Title = "{APE}: Analyses of Phylogenetics and Evolution in {R} language", Journal = "Bioinformatics", Volume = "20", Number = "2", Pages = "289--290", Year = "2004" } @Book{ Paradis2006, Author = "Emmanuel Paradis", Title = "Analysis of Phylogenetics and Evolution with R", Publisher = "Springer", Address = "New York", Year = "2006" } @Book{ Paradis2012, Author = "Emmanuel Paradis", Title = "Analysis of Phylogenetics and Evolution with R", Edition = "Second", Publisher = "Springer", Address = "New York", Year = "2012" } @article{Paradis2018, author = {Paradis, Emmanuel and Schliep, Klaus}, title = {ape 5.0: an environment for modern phylogenetics and evolutionary analyses in R}, journal = {Bioinformatics}, volume = {35}, number = {3}, pages = {526-528}, year = {2019}, doi = {10.1093/bioinformatics/bty633} } @InCollection{ seqinr, author = "D. Charif and J.R. Lobry", title = "Seqin{R} 1.0-2: a contributed package to the {R} project for statistical computing devoted to biological sequences retrieval and analysis.", booktitle = "Structural approaches to sequence evolution: Molecules, networks, populations", year = "2007", editor = "M. Porto H.E. Roman {U. Bastolla} and M. Vendruscolo", series = "Biological and Medical Physics, Biomedical Engineering", pages = "207--232", address = "New York", publisher = "Springer", note = "{ISBN :} 978-3-540-35305-8" } @Article{ Mathews2010, Author = "S. Mathews and M.D. Clements and M.A. Beilstein", Title = "A duplicate gene rooting of seed plants and the phylogenetic position of flowering plants.", Journal = "Phil. Trans. R. Soc. B", Volume = "365", Pages = "383--395", Year = "2010" } @article {Schliep2017, author = "Schliep, Klaus and Potts, Alastair J. and Morrison, David A. and Grimm, Guido W.", title = "Intertwining phylogenetic trees and networks", journal = "Methods in Ecology and Evolution", doi = "10.1111/2041-210X.12760", volume = {8}, number = {10}, pages = {1212-1220}, keywords = "Exploratory Data Analysis, Networks, PHANGORN, R, Trees", year = "2017" } @Article{ Schliep2011, title = "phangorn: Phylogenetic analysis in {R}", author = "Klaus Peter Schliep", journal = "Bioinformatics", year = "2011", volume = "27", number = "4", pages = "592--593", doi = {10.1093/bioinformatics/btq706} } @Thesis{Schliep2009, author = "Klaus Schliep", title = "Some Applications of statistical phylogenetics", school = "Massey University", year = 2009 } @article{Lanfear2012, author = {Lanfear, Robert and Calcott, Brett and Ho, Simon Y. W. and Guindon, Stephane}, title = {Partition{F}inder: Combined Selection of Partitioning Schemes and Substitution Models for Phylogenetic Analyses}, volume = {29}, number = {6}, pages = {1695-1701}, year = {2012}, doi = {10.1093/molbev/mss020}, journal = {Molecular Biology and Evolution} } @Article{ Rokas2003, title = "Genome-scale approaches to resolving incongruence in molecular phylogenies", author = "A. Rokas and B.L. Williams and N. King and S.B. Carroll", journal = "Nature", year = "2011", volume = "425", number = "6960", pages = "798--804" } @Article{ Schliep2011b, title = "Harvesting Evolutionary Signals in a Forest of Prokaryotic Gene Trees", author = "Klaus Schliep and Philippe Lopez and Fran\c{c}ois-Joseph Lapointe and Eric Bapteste", journal = "Molecular Biology and Evolution", year = "2011", volume = "28", number = "4", pages = "1393--1405" } @Article{ Swofford1987, title = "Reconstructing ancestral character states under Wagner parsimony", author = "D.L. Swofford and W.P. Maddison", journal = "Math. Biosci.", year = "1987", Volume = "87", pages = "199--229" } @article{Posada1998, author = {Posada, D. and Crandall, K.A.}, title = {{MODELTEST}: testing the model of {DNA} substitution.}, volume = {14}, number = {9}, pages = {817--818}, year = {1998}, journal = {Bioinformatics} } @article{Posada2008, author = {Posada, David}, title = {{jModelTest}: Phylogenetic Model Averaging}, volume = {25}, number = {7}, pages = {1253--1256}, year = {2008}, doi = {10.1093/molbev/msn083}, journal = {Molecular Biology and Evolution} } @article{Hendy1982, author = {M.D. Hendy and D. Penny}, title = {Branch and bound algorithms to determine minimal evolutionary trees}, volume = {59}, pages = {277--290}, year = {1982}, journal = {Math. Biosc.} } @Book{ Rao1973, Author = "C.R. Rao", Title = "Linear statistical inference and its applications", Publisher = "John Wiley", Address = "New York", Year = "1973" } @Book{ Burnham2002, Author = "K. P. Burnham and D. R. Anderson", Title = "Model selection and multimodel inference: a practical information-theoretic approach", Edition = "Second", Publisher = "Springer", Address = "New York", Year = "2002" } @Article{ Lapointe2010, title = "Clanistics: a multi-level perspective for harvesting unrooted gene trees", journal = "Trends in Microbiology", volume = "18", number = "8", pages = "341--347", year = "2010", doi = "10.1016/j.tim.2010.03.009", author = "Fran\c{c}ois-Joseph Lapointe and Philippe Lopez and Yan Boucher and Jeremy Koenig and Eric Bapteste" } @article{Vos2003, author = {Vos, R. A.}, title = {Accelerated Likelihood Surface Exploration: The Likelihood Ratchet}, volume = {52}, number = {3}, pages = {368-373}, year = {2003}, journal = {Systematic Biology} } @article{Wilkinson2007, title = "Of clades and clans: terms for phylogenetic relationships in unrooted trees", journal = "Trends in Ecology and Evolution", volume = "22", number = "3", pages = "114--115", year = "2007", doi = "10.1016/j.tree.2007.01.002", author = "Mark Wilkinson and James O. McInerney and Robert P. Hirt and Peter G. Foster and T. Martin Embley" } @article{Warnow2012, title = "Standard maximum likelihood analyses of alignments with gaps can be statistically inconsistent", journal = "PLOS Currents Tree of Life", year = "2012", author = "Tandy Warnow" } @Manual{knitr, title = {knitr: A General-Purpose Package for Dynamic Report Generation in R}, author = {Yihui Xie}, year = {2020}, note = {R package version 1.30}, url = {https://yihui.org/knitr/}, } @Book{Xie2015, title = {Dynamic Documents with {R} and knitr}, author = {Yihui Xie}, publisher = {Chapman and Hall/CRC}, address = {Boca Raton, Florida}, year = {2015}, edition = {2nd}, note = {ISBN 978-1498716963}, url = {https://yihui.org/knitr/}, } @InCollection{Xie2014, booktitle = {Implementing Reproducible Computational Research}, editor = {Victoria Stodden and Friedrich Leisch and Roger D. Peng}, title = {knitr: A Comprehensive Tool for Reproducible Research in {R}}, author = {Yihui Xie}, publisher = {Chapman and Hall/CRC}, year = {2014}, note = {ISBN 978-1466561595} } @article{Wang2012, author = {Wang, Ning and Braun, Edward L. and Kimball, Rebecca T.}, title = {Testing Hypotheses about the Sister Group of the Passeriformes Using an Independent 30-Locus Data Set}, volume = {29}, number = {2}, pages = {737-750}, year = {2012}, doi = {10.1093/molbev/msr230}, journal = {Molecular Biology and Evolution} } @article{Muse1994, author = {Muse, S V and Gaut, B S}, title = {A likelihood approach for comparing synonymous and nonsynonymous nucleotide substitution rates, with application to the chloroplast genome.}, journal = {Molecular Biology and Evolution}, volume = {11}, number = {5}, pages = {715-724}, year = {1994}, doi = {10.1093/oxfordjournals.molbev.a040152} } @article{Kosiol2007, author = {Kosiol, Carolin and Holmes, Ian and Goldman, Nick}, title = {An Empirical Codon Model for Protein Sequence Evolution}, journal = {Molecular Biology and Evolution}, volume = {24}, number = {7}, pages = {1464-1479}, year = {2007}, doi = {10.1093/molbev/msm064} } @article{Goldman1994, author = {Goldman, N and Yang, Z}, title = {A codon-based model of nucleotide substitution for protein-coding DNA sequences.}, journal = {Molecular Biology and Evolution}, volume = {11}, number = {5}, pages = {725-736}, year = {1994}, doi = {10.1093/oxfordjournals.molbev.a040153} } @article{Pond2005, author = {Pond, Sergei Kosakovsky and Muse, Spencer V.}, title = {Site-to-Site Variation of Synonymous Substitution Rates}, journal = {Molecular Biology and Evolution}, volume = {22}, number = {12}, pages = {2375-2385}, year = {2005}, doi = {10.1093/molbev/msi232} } phangorn/vignettes/movie.gif0000644000176200001440000055210413707232051015713 0ustar liggesusersGIF89a//__wwGG羾Φ! ! NETSCAPE2.0, $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~B%$#}( " ðǃ ʬŷv 'utƫ9guN(>'nWA!INu..F :ve k )"bJ-+pॿu Ȥ.-HpeKpԋ{ML 0j"VSs rFQe;l7W>1b*ܸ { YS` B;osGt{UuFM%3-X>`4ƦOh0Z_@14vՠa.FU6} iqQDW$mpU@hRu+6Avr noK0>ޝܷ?|=Ԁ?_%`LȄZJ'W5SsOT.v)U1!9'0奕婈Bm8FXPBb`cU$Kd|$ 6Q)ƇPPc|H_QL%q}i@W5]IFXݑ$JrEQ6f8ahqaV6JXgɩ}Z% L1 *F  I~i]#P*W*Y "X NkZJ,JalS(K؞:QmEț}-rrg/ pT$ڻJF1fZ/pcTknVV@+ohPG{-Sh7p^%\ ZhA_1%϶=5 -&ZdZSIt5Ѷ-pl.5Sä206BZwTՀE _'w7 ,˂:^>.ڹ1sа3ݰ@(^]C}^F.z}-S^  ׳ gBuo~&>fC V)Ci z $h>ֳ`G̨vA8+ut a>x`Rrd.H2`!`脇rՒW@t<X 4غ< ?>1q9@%*V$;*AB^Wo&gn\p2%*D>5078!9+x#cS0ʰBX`0Dd#IIBJ}艔kJ (0qI('Iꆣ57|B0.acqd6~Aq!N9^F$:nZSV×xjBU4NunEa̚ ̐Tͼ?!F̊8%4[i d m+3Q8q3SGOr0mډRplJ79O4=ZdR#hOJ@wW26VTRG@ӼDPҹi*9 ,FwEr8u.¨ ux(Wt[{Rԭ^uZ1usZq445YE϶T1,d$ZE%jyƏickҖ[m;F2ʔ|˵^P >/9 "tYPP]F gPsEv]> ={΄noLN;'LF! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~2op qv m >.ߖ:,? +&34uxKI ]B&HIPMu92࢓~옠=MBAm4@8bI3{-rd<| 8z3I@WGUA$5+S/Sᇁa VY FjK7CEhrgȋ@ ~>yf}%1 8YyMTIֶ] ?k8nC!t OI mRp,q F.߈?}\Vv 4Qŏi?/zƐ.c%H)CwdeWO t/[!4_/\p,%X^ `L+uhb?aHc~PTԦ"IEI%fd+fUHkPVѣ9Vik,EZ2M\TiX杙WH'lZ)]qnYXu^ayjfZ40&Y%U(^!(Z1RiNV:Wi:HzjXC|ģ:QQ6jeK\)H*HJ,zҺ>K1kC܊n m>LJ" |X8'/Z/{0Еܻdj=8ň] 0 uN"0Զ@h3zjz/l<]<%CDI&鞏A4+K첑r sBa#ΚUZJ?N{SGM^4F;(ӌha7T$jL|иkzPѯBi%$݈`6^,9 S"˹;:zhza]zfLO6t:qؔ6c@ߠ>o{ФQOHr [d '[ :$lz+?:((ڗI΀YYs@O]uHނK l8ѥ7`k%,JO?NXdL[ V@mli$4KUEnLO/\N C&!|MA2Jg?gJ$dFy,f Ang^G-"mә#@q;$TGP Pͻ`m2`̲J/!!LVLpa-Rj]U9G;R1V|%H 1d*b(]0dMʨR 7 JV :ӗp T+@ݼM< cwpHͪ` zyL0ĵ -d:рN2 6@@uR  i]}STh&P gSK:Q7urc1h֭Ig+*.5.U;橊8pq B6h64E|~LKB/>T ߂~ĄGS^ڸ@sp@?V>(9od'σ2͈[=p1p=ɿx/vA<fOl n@ UADQL=EO\8bԩ` e`F PcӃpY!gBU%h"wy^ԎMiX`2_&ZiHOJh_15XG"i<@pRAa Ӹ_~ U&4ߚfx•pq& ]ec9^iƖm&(؁Сhq<|Enj-)jyPUPJFAe`ޅ ƬgRԞj(^l[ NnZkmbQjWT n[EJlRʮ 6nLHoIJhhJK0Ph:g||4,(9,Ķ0ƣ}T\ q-P)'gϜ%[Ͻ@,GȰHrN,K5TέGSW= ^ huJ8Qꕧ%< ݫ1ЪdD`ug5#+}4{Pì v H>Z c^C4F0Z(t^ @^ L$. i0wϿ, AپE c 5ҭooAn>}sB8 A3Я#]/Lj g: O/h?yx0O‡z.O ` A!p_ <\z/ql; c5DocIQ8-\ՄXBBc$\ W!kax`<*@"j1 !O" S$>ݢwt%.Gv+C6 Oj.r?N.ȩ'cg٣D kXnBb $?b<)C/x44`.*hJ:8PWa߂DЧQVDCb8DŀiŀO4D)L "cܥXN|7"ދ6PC>V^Jl I">7 ۥeCrۗbB)kj ֥f``0v)اr67m'ycӌ&4Vj iuOzzIJv:F8Jƞ'4fAjƫ‚Ab`+R,Nfql-'I-юkŞEDO˺k6kʈ/:oMKD #mGt%FJ^Lvݒ&""R6Yp$ې  \2S_-J ,|::5r  ЇX%Xn7Ps HLfu 0$r8C`$?)S4 ՐϕB8'vfsړ `-o*31=l= Ϋ- =)P u .پ@p `~ųxC|]7By֟'ﭽky3_>?\& П?On#89C_\vuo34W5u3`z"<dz'I @H1vœ  1C@H1sP0G xێл}3BҊU?L 57WF&4 ?44x.Äy3 ~6qo&ƅĄE N)Aq@A.Hȱ FEA#c*^\N)^L@Ɏ)OMW Xǹ%(#u::=>d*tD1W })I4FczVYR7b";_bɋȉ81%s#x,ɒN1cJQ }ϐ4S7HRCچNuRe>QPf=3,ce7鞀*s(*b?Gg#k()R AN */ά'߾v9Ճ"c,Uu#z@ f dm:FA3  rlbP*Z0H jբ@1Uic+Cj6YURcZ}r}`~[ජAٽ /Z?3>ѽl]+潴tmݢi|Kͯ~LN;0&B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~GuD%q#@o" :$P *' ί۟  ˪ۦX Ҭ 郷%i (gn(0Ր`v8/E1┏La I8Ii=Pp\ʗ*!ǘ脇8Oh4ɨty$ aG>"И^I`#QY.ڗc(H EafvkA# @&guwjէ J:eR(h(ӣRV[i'iGTxj`*ou*k:kzk@@k F^Ƃaj\lolNZ|Z;EflX',R K˞+NjS  ::!n~ 0 'nI0>lDoD`ijm2X #7PXyխ񆚴+@-1zz\5s , `Dj. U2 8L/5O(󝌞k 8uK @<ґ(*]u P.)R]~ n6QG8em\uka,莔JO+2/d#fA#~ҏZjΨBU+ʻ0,/W4nD[V=Q$ mw8 i<8o)0\ U<~-P>d.# ԇpi =S!5`h8X9@X8u ;VHa  ]8`al/ݲ}d)a])ȍ9OT,:^ 2b@"&Zxifg*,p'(*,Laqwm',Kl]ĸFƀ8f(a5r:(cɚ!Jj[.fy86Eux\#ed`2>MbFd"EN (5q^D)L$h'ؖo@8KRL8W怓#ۖPQI G6 nj&=MC 8Zn!ZRT',BiXR|lINxECPt.}Z&$@StL:T 5 FZ ^H-'SK^rZUC#s_Mњy| aD\@H0W<, W浱1%d_   c3ײp6ogUѪ=AeS5ɲV5}m%ţgl~5 8p1|' 5d}A?LT!Ce^R9׈#2Ur!꤉fGЁhGh4Ӆ c<@#(DXzefOF|80%U:WZ׈cNA.IElЅ֜V,4%xV]}bNqJqhX (O U0ΤNaifŦzĦmDBo2*1XNk@:B "lFh6C8 m57-gY{n+DhFn; ΛCj8 kC0XkC  V SE¢f,OEd1I|cF|lA 0 (y g#G@13(/"I$bF#XgVrgdtE+ yuݵ!s`$` vp.@dvJ_?',}ȸS^-QopP{zF5.@?`ۊ;QM`3\ nԹG;a;4/ffO;/c+]{0[ZWZ²SOBeg:|8/%Hk.<@^KH`'ȵ+|+/JAv`_Ґ«[Ei1 `ەfXKdE2 Xֺ-Ea~kERAn^l޺ld\ l\|pa p kO\DfYDipS |69@"nr yF0P-O1xI(\g$L7- D@RO]ub 1`WBa6U[$am $x}w/ 8uӶ9"d6vHD~•@7x;Ry@).TUQՠnjEh:u煲>H)E[|BfΪ@<⏯*؜ @$xN{ :,ngOx7H <of\F>Pkda_ @;_z`@5@rv4eL n.,`3! .'{-z*P"@-#Jr&@SPg= 2$>XV\pWphτNfU1<HraϖDi!w=7#6*E@޴7ҔWkZV98~C4@0%@Kb"-F`dhEbIMbr9H29ɥf陎kSoyS@Fhޚ7KYHD[ PHx,>!=x۟$I k0Jfsq,#"v3&D/ :Jܬೀjhy֨' <=5K&@ 9ħ?LQȈ!̩@:b祡BG)ɪ])F*Q+)R]PMτE 4eC '%FA^2#h *ص3+bžL5I#R, X <ϏOZX-_Q6N ymMzёUn PњqYE[rp0 -mH׃Vͮvz xKMz|Kͯ~L! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~#)" vx~ z^ϗ ͱ_ڝ׶`ϖ̹F[nþ f*, )(4Gf`0-\ÇQ"RX@Qq <  $gU AB|@#0SbzԒ;DT#SyF%U+J \MSʪX @ OeΥ5Ն )Yv;(b: E`NdlH<.j<5jziq[ϸܽ-2bSyω})DgOPlYviVp蜈bqf1qj]Z5%V'RVjFVgNjS0FNp7+L(&ūڄXL.j>{SG0*EȊ-~KRىCAlʾCmNm J | ˀn ڤVxfU -i&fLL0Q 0VNVs2Z ( 0$~z*5  DGbd]|>,Yug5P (uU`Ԫl !eve$} p7NV;`SYO5{QCWpۦO:ma[]0iETCd%KAXش>`%@δjyfLx,?5]یZbc 6B瀉?oV;_~[>5_ܥ20L_ # d5{ i` F0 Jt& D<̅ A0 EP aaxc  j@J"e,-lm$M:Rň R 31s) Z 1V4/}ҫؕT9Hـ+lۚ)tE`G6 jm0\b.̈ޒk 0CB@t"{ >!NZQ͵mK[ج ȳJE:Xk懌>H9uί}l>;@lZ}χ=Nk3o_A1ScZ},!kOGoD{YLT(AK| / XF\+; FA%=0F  Ʃ' A2 #3F X г|r~ 0&p @fPcq $p5l' 0Ѐ Y} 64Ŝ/ 5?7i#\"e*.B;e=9Oj]HUki= a'8c;/><5v|XF`^9 /i~h{#-^wNB2??`0@rrƣ ]gmx1h`R bW ,,@i/t,Mj*HaJH8,`9|! d]D!n&< ~񀹅BdJ2Io8+BhؠMq:$T`A[؀#BdV G5$)%)j|0ScӐ$JHi 7;ưdlcm,mi *@0䈍 >JQdL3!`1 bL)LZ,IHm֣ŨSHELXʍ>iF!%LX~ TH`#L PV(>S`NX |Va,(); - cɆR8d!2RZXh5>%Ia(x0*abtRLҖNT.2>Դ !J)?)9TsũOuJE (Uw4JiJ,H-ZnYkȢO=r*T*P'{^og4v$_a X iYHəviYU*aI١-3ǎiV=O{t2mke pKMr:Ѝt6KZͮvz xKMz|KO! ,//__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N 3, ~~  ~yvӓ Ԁèܙzٮϻq 䣐`? * F^( ( @_zaPLֿH[YZh!LG,[F /Z?kqXDWR"tP@ERQyeE*uLǢM9U=Prlڲ`:`V56gȵpx^bG5qo2ϻnvgSxο:D# u (]V개R@}sY6s)RY LhL,N8XlSPAq!,Uh[m#34֨`D 6V@ O2%%T _*SM}f4M֘.ɦ =PkOIqqg7UUfޡMĨ]h5)*-xiUi}Je:EXRTMD k:kD:jJ D*kH,>{WlDԇnDk>pHΞCPk= /ΛCn5P -/ P=4p tp  )4>uLqJ"kƱue@'*( ̖@ 0BjmWӻ$p4ǙDs $@O#3 PŽaBE| ^C6%iI -57 T)|Yh=8t}kl8hm,Qاf&khp4 4v>j,t4%M ԙ̑w-B3Xdcᯍp"2a:9Xz{|;soR ϣ'+(h1];a )N: M~:B~0+< N2q 50!;|vN, \qI-`-iB= *@4bJӸnk~D4Z;5\ω ,V#m!(De Wr,`'HQ[(#bbBŮi4#iEP"" =l x!K$MAQsEcһ+Cu4&EIdS`Vkj4eyuY%JX Fﰐ=h*Ua}gթ_FҚMjWֺlgKͭnw pKMr:ЍtKZͮvz:! ,//__޾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N`o0 #| }}   ||~ʲ   }辳 â \A P,A9$i6Bp𗁣OTE!+ ZPUqܠ|ӰNj7<$PIE&A{F^0"!VcA@tȫZ0eFKk]w@P}c3&v\AD$|g)P͜@:tgJj͘W@l٧mwM)as.#Z:>t;_ov8'~}|ͣɮdՄߦ<}6Q?Mka_fTBCF QV НnU) 1ԉ,c:a 6uAT'ҀV\h,b41_ xDu=6ޘK+&I3$ފbO9Y"TfJ֢= %/vQ5%(iˆ֎BD 6'tyꙂimSoNaJTW,ũiƍ:ŘFzUQ*:jN\+CVhkGЊ">KD!tpkA-͎ Dpl;(ˮ۾S+c?Pn8/ [%[`. V~ yg.Vld[ +N?Aflr_`üAuba"$<&jmpZTtL%IF};귫\{`FĀ< BKz_Zȕ ; GDII X9g`IS  c\  㴤%P >9eq^Bh>\QI?OIbMNMqYM?63kaF$>ؾ Dm MA.prtoqUz ],(55qc"E vu"I? =3`g7#,ǿøR;o=*+qTG-90ђYy* TJ!8Z9,`M"1zX-P:р[P0y).xI`HS -L(!jVdSc^*{-)1 nA0`U)P `nJ(BN$]q^5][rsn㊐jivdK)ϖ E i &Š>hVAEeW II{> W|D\mut{Q +@vmPOa&~hADhU>m!M(` [J(PпY[%I6-4ICs⡡P*MJu}5iMSvi*Ba,'$Q$P@#xm&an1w2(h3d`/Z@D[ٲ\3X532D:`ۖVn;;cPhΪ\t"&8u9_w3w{@[DLkWw~Ѡof=3G|Q`W2c&Š ]MH,Pޅ_8".VV` <-0b(0ό)@ (@0{0"UH,"%ȍB.䒹86c$QPa/* 0@%U9Xڥ%`yho@Aک\yiXcZnL6*zIDYJIRUM^JdNpJ*ڄ2WIJL+Z&v` lf~CdЊ{kCj: KCl7/ ¾o+%..J[`ZFW]Fox RYM1|H&BBѣ݀ 0G u"ǎv%T` .I;dFPFZ"Zca^cluJѳIt 2ꇡ:Mi``HV']*zխHIFMDN, /!fKͭnw pKMr=:ЍtKZͮvz xKMz|K ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~EG%@<$ #'"# $  ̩ʝ& ߎ 䮍"X@!+ rD1("!,!JX j Yc*| v+4[EiF2B(MAPo)-zF¤'|T .TgLǍ0}c*|t tZԵnFzeqa-CnpmBشcɎP)֦ G/ IRDܹ tWq@3YL`6 i6B:#?:A?ǽmA^P?>~Tx| n[..LdϿ;=m xzM{ M| A_sPoamGxG.$C?"`O)7!\R@aJ%8 M9,>\#ȍ~}Jy,ї,s%ƍ8~馗 If`U~u ݭ٦|.(i'w"n Wph[fVi 3c%Ii g`bcz %M/ښk~⏽zR^Fl EZkz mNkZalQ<~GD>mK$̾.nITokĺnGG 8BT||1,i|*@&} wyVE8} / z;36OʉAr@y `ގyx@ѠS lQ)Ts0pW>7a{VMqZfF jz"= U# =&P4!DDQC& UR.zQӰN?:~p?b1/S Wdn3a nZm֓ h-b RU ( F*[IGQCXGL^j|ݘ5*: LO-;&C ~У}aT"OPJ 2kUE]r $A< df!xISA3 p5cO J2S)!>LjPHY8J Ʃ@a|3AP$t -LC~D@ #P-83- ŚfFQ8*BSMmxSBU5FPX* (kRןn13,cĦjU݌^Ez5ef7z hGKҚMjWֺlgKͭnw pKMr:ЍtKZͮvz !! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~~-&" w {  s˓vΩѺx ۜɨ ѥ~ љw=臐) kB_q=<W%1q8JgN@YcPdRe7hRi' e OZzySz),_ɯJ@u[ŀ TZ0!~LeL6 v"4 ,e" #N' $R6Y/0B cl¤;̐yOf dl$ŜeVbZ]&(@RQv eZpd LIM< B S)5%‡9)5…DJ)"FT(EF +G5z+ڪkB(<0< ,>ðp@m9~m7l ׮m3K *Ԉٱ-aZbaUWB\,[𡈌sIfQԊY@1T8P\x )WmÚV(KR\\X+L,M9^8Oh,VP&0H0ղ!V\=P@aYL/e V0GA?Q#NBڛe^3LWt4 -MUUcԆ8? vŜx*9kىI ׫;89?cΓfxi"5-`\p騦sqpXp4=5s#wP1n?w}l).O*;}ϱI*@(G;v 4]hb̐$D٧p3:ANwx&brpJ* 1Exod=kS]>S @g.5=o x ģ ajrp\bcWW[v( yt8C @b֮ɴep:f>%{IvW9 {=t [ݍsGbMx̣ϓv@Ӂ/Og?'L- V q `mLH]FTbԍXu%xx*]db0 'Q4\v 92 ,`Fڂd ( ԏ1wؕWZ\Z@VdF ai&;LŬ6f %@$ i睒i$Z?o"/>*Eˡmh qƐ6蘃ZZYkƵm7#Ԥ#TڣPר-v*ފV"~JkTJl;ŰB&lO0K-^Ĵ.amH-BpKmxBE#caNj/)\E/$*ӥp]61/U r/][@gvl#0R5 Yו=*ilac}f^RihkֿX\+*US1QC iiQО| tW8S$uͅ]s‡1V4D'fl,@6a_qdg7v̂'x`N2<0#X^5p{)S?%.Binf:)}N%vNQB*g,~Xsdnk@~d= O"H>b#eǻop{ ,5}H1Ѐ` 4dgI[oHŁ9X3'_T=! 49 B'|T1hTA(K! 9@ yy!:`ջ rp A[!3A ڀv/0 %,ZB(\*X htý䰎f#)Pf`B\F( ndt 0*L(9+pGyTS*@YMj^:Iʥ`sX>VfiT Ȇ@ =`wE ?\[P򙥴,UK+M{(4(4U*{&Yn s5/KJOSZ#`' ȟ2"GLfx QTT'%BK)\zFQ  IqpMf4t7~bQÒm:%q2( ` $F VJ6EY*o$[SªTFUmXX#ͤkk+𡕄+t&Y̕h_P19Քnzu&L*U7{ggG0*'VR ʙ@dU %tNd7aVu,AGx <#/a*x V]$A^Fa&U޽ "w 6@b֪]{ii[@kVw{M3r=o?s Ύ'#w<2~sw|DI式ߵ:7V)o}]lG z ^hNXFI_eǡ~ƀ"a`vyb.b.zQaZ@*X&b4r{%H. 0츕 9oDfYrHN))䒒H^^"\ nd`Uz%옣 H*9pRs[$&ޏD㜾T"o1ډT"fw-t޶ vN48@̦"*JkpORɪ~ 㝤VjSԊl.BqlN(K-^'ӎtzX5Ӯf䩸Rv ( xٗqhMtv.aFC%Ԩ0 ":̏ pX+^D"i r@-#R> aD. A@pv#&<g׀9ʝM R\*ot6$ԏ|R7}q ^q,&8-P |_c,plM[fa;ё ႁUf!"(HGBhM &7L-#ҙ(P0U@@IP<  Т{?D~*4ZUN,%X{⊫I+ĨZT+Y-ՏYW)rnt`ԽL?-a5tTd'KZͬf7z hGKҚMjWֺlgKͭnw pKMr:Ѝt KZ ! ,//wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~K n pqxhʭoѺ ڗ ، ˝u ɖ*Be !+1⟉ ,JF? :~od}܃<ԣpL=oXQ'dܽqCӄ4* YPI K3HP5!ސZ Ve.T@ڽmļ*@.}R!g't`'<#9𛲮ˏ tv\(e  ^;  TWM`'ȈݽBNnLdZB'C51K^3|{޿,9y/(R]z-յ}~o<+gE{V_Tԇ`-HBF_NE^ā2`I4"-6-@ ,@ x"ec+*5j3R WLt߬";(]9,P6rPD!J ]̚^㘘R7yן3&d-c%rC'dmˢB3Ǝcɩ8Wݝ%l3gJfQڡĝŮFa3QȦ1Y@j:BՌVS6T(6|CeԉجkvLa9F5 X,Z]^X*e oaPѱVï5.1ֶd4qWp@[.s'Nr[4/? Lb"sE,k<#6t^ (%Z/"CZ#uPY}-j]NKuqU_5G4 Pڤ=6? 0PQp uXګ=zw΀.~&VMBOxU<G* V ޺2bn3κ<-Ҏ=UUiw> ÛN m8ӹ[|)B ݢ6A>0Lm~[:3=>f 8k$ꝥo @DWJBՁ - Y@d*  rd3> ve:@z$k-$ftv$ a`ZW&9 $хhS AޅIaR щQ=5oN uA&qJDU0ʙBX-K9\vΈ vv:@)@?P$3 KFRa;-f(ZH]F(6@ q,,<9:l)Z"ׅBO] MC\ _R2D<*Tь85]3Q!9w`5lSYPzwW8pNT%&OtSUQM$VFīvdT" qh*]T y%NL?VLb6vzBiSB-*Q9|J_K<tQe5|DP3LV3V!:H-TըSrEj\J׺xͫ^׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKm! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ki r sȾdDZ j ݟ޻ߒp>)ط O ܃PB? (xXQŎ{KRH$K9R\q/:4 ؼ9'u:G(Ѣf}ˀRj֖i:KUT] &AX45Ϋ 4@ۿblUFP J%w5&4 Rr 3_ A' eI(HyQ7p۸eH0$qm-Fb>F%N_">%bA_^E(_Z|q+oѮ^Xÿs>O=)E}Fq:Av 6_LMDD`YDz*WJ"x&PDR 4:lԘP (4`j7=`/4@y#06 c'R.$T/i5heb4__-p_@uoI%fjKWn&VYZV2-9pp1Π[ xK]tŤ4`a%%dڗkwQz) OW$gƇ ٩*KSuV>ex+B6›dTʶjzcIDl5-e-`ۻK+L]:%j+䂜ٚSSbpByG9mK@SdqgȨIg~5}YSrq˝ibьZE}|3@sWGrgs%0%LK֧ayVm 0rZgzE l=olN@X[8/0yߘc- pȮ ՏWN 6*p@zS毃re, v*p;c?HY@Upfy("}o>gۥldjpO޽go[M(/y/XW hn#`v@#(F Y(oչ>}`A@*hoCb(p4O!&X] /",ciQØQs9!3EGO.%/bqU\5SNf|qDc(G8pXi2?> nԉ9BQ+iHYxs'IK'+EJ XI1 9ҥZz.w-o5Қ0ڨQل+Mlϴ+Y %+,1N`+L ,BXNp@Hj 9FM 3{wiMx)d? 7 ʄ\WqZTC&~UF-@VҏiHuRT.+{M(` H3c?O,C-xJCXqp kS>U0 NmpN\kHEN`GY3ikL[ ɪ[@Q!kv7ʰ gըQu6X|[y߹P[^YA`䂞rxa;Hpg6m)/Ȼ8Pf[qMXnL,l/ϡ/Sh>{O~Ϝ%v_aD^G}w-ȅW] V4@ a~X"^aRt!.J![1:b( 1\ێ~U@=CTn)c%<@6 yR2@_P$$ICQIUW c6"*MXjv 8ड़GNH3О' ~A8i {a-Y'hyOIFkҗqwj+2`O(UT@%  Pǜ$XYuӱ6|9Yk^_p'k}I? [s|hnD5g ! !%=Ar,Y0!V<i#R,f< D,M d!mܡ ͠\hC̀k ʘ@X, =@Gt5宠, )hf}iko S}va&v?&@fK3qk WoЀLSAZP|P& P7ZCҕL`A=kN% ;5z c J.g<K~'rޘ;4"T'F0ߘ)x(/=/=  (!2HIP_Q5f26r,KI <gN ߍ2@hs ! )&lABH~1LAۂ?! s)b 2>hvR 5P#E Aw8UК.Q3a(&8VFPY jVGUƉ±(2KM!G`C6'[d=*±]CQM`I'e8"4BtmB4[fFS./ :Q\@QDU`w#'c7P xHS-!#]G`>gQ3Ş;s^kV{<6R hD'e]=Qo.42brqI&Z<< Dm+Ȋp{<7 u (43hs*E\{]'W 4r,B3 Bf$n#Jk7 >c KE`-b_޹t:25Z՘x3vÇcc¾9P{ ¥ex-M&"~! dJ)PBX@ 1MqN` EQ K$tI#v բ)j8$x%s@x @ӽgŰ#n;bh'pڔ@+nP!D (D3f@p/BQZ=qaANͱUc\TtQi\I#jq5kG8ys$Q# j>6ʩm@4 ArAv$<[šXT p,Z 88-Z % r&L7ߙA-8qvfK;M- 0Xg.aF# Pvf)7OAWRJ) ,`&k(XTg)\tŒAw!]gP'+d @Z~%8Yv@H( {pӽȮ QhM^VޒU9 Fi.0D/gJF@ G  ѽ9XA`Mձ~)P\紊>ެgz6pp^wls0~ѹ`gA|CO#=D9/\ X[~['Ouo},2sf$IE}|A;:? SKD!Lx-  L dCw<ɮ!;Z$%tBYb(Êiи҉Qa # NV}?)2ab&\U2GlU "1~J/(bxxQO8*ycS*Ձ=ޑdtP riTQ#]GPQ2F5A`.lʡoP|ԋҏ4)~m?Ȯ0ЁFCHG4JK iKi5#ƕl2"JLfHɨH1)PZ%Y  2R:H%X%LZzXkS I[.qMNw9@:%;9EEzq(LuIْ3 hH<@GKfКFgy4^v0 G'T:TL(\TJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7z hGk! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~FXTM68 ? +AbOETx5x'jG1Ʒe1HRǎ03Π(w, fd/g͝JKTIrڊIPa#,@_RE%FŃSکZΑň (M}fO&c `dɶk2bly4RkH͋ɜ9}Y= >F/`r5$[phԯ&#{zT2[cPARѡc`.liV ;b<܎.MVzg]%4{ڶwNv 4PPqTѱԉJ>%U" Sl!'to=8To#Xej!`2 b DG17:wKLd%xSc%BގX@tVfYO5GzM$G5j5%A 0@!Yj1 QlbtW#-:G}&i1@ǞM>T GvFN|8_됇 Th)!PjC-ű8@[4늶!,z 0@\(r1-~n,r-zq ż mKK 6;b4.v ~|Ĭ7*` EW-P-Ҍf K=0v!ǹ$+4 Fp@3/`tW.򖄾ua`CORj]B3}B8 Y"@=3+M,|G 4@# 9ׇwgi*VWR(s`( ?ڽ J`x-\#q4oF$WVCx;λ։u|{Cs[$Mj|_9Pkz'85.r{0(L8`@# IMI$Oq%w ؝o(J0Ѷ͙0F~r )aN|;TB43 %d+I%X n޲6J"Z,uO?oc#Si%! 0 $?"񑈑66*EQb b>r9Hh&e*RK (Kt`#dXb~-GG)_jZ 7 fDg7a)$ǚ 1ɩ(s:Y49OnZ2MX3 0DXb e*q& L *ȜHO:J0ЇTSLP)F0r(=S@TMgS2*}SRAjԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZͬf7Ξ ! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~VQM F/1 8 <'!~X0t Ѐ e3䞇#(xف A#AkSf#M y2KĔt-KˆeY枸V+U I5w)%.Cf-TKSI,i-F|Ec'4#^dDԜĺHYJIkRW?PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'+! ,//__ww־I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~4JF o w hҽs[8%PC|~Kp@u! F_ 1q8ɓu`Y"%[#?BdhLKr9x߂Ji(NCOZCCl`@`y.)RۤXl@ݪZMٿ(I8QzY RX&-gK2敎-ڎ'nap˾N#s8,@P!@w':检!ӝMGG ;nvM_AuK04G&M2\ӨfL}@vzh ZUzhay֡C a?w!QH{ ~ƈ}wvݱ .!~ J0"|xwa#;x$ZѝWC!&0"yRn8H% hjl_@(S'9v'7:v , (?f{(&uL5zrdS#f!S0pfQf:[rxǍnq#$ᦀU\ZI%J.GCaUl}.9xƕ,{bLcճ7[˶[ k\̉ RQ.j`kŮ{L{%cR 8Oj13qcpl(R|L!0*XƜ 3PjiٌK,<_i)Q%0жhEPgO2M~"C#-2Nˢ3C\N)c?Q#Tѿg\y(We@TSb LТCtXD2ބ lĘ6DȳӖMwg#.1:`RT&uてM[CH|bTƭD*SrկD6q)6^RNNGVk/]|TnPdĉ *!U?&cֲkM7 hur](N;Ik[ǝNzBKTM˥d;ӕ(׷aP4{]UdyWxA[X'" xw0`!@'(W0Am<ɗǃtkyd(%E6% H:yߒoJv(JXWGrZq4)'ITr%Z¥-fcʝjJo~ѦW nh8$H2*ʡk  Y's (P@(Wf*FA m!{aoQF&zѧ%~ FFe2B^[`ɡ5b綹.&f [[E= M5WX&6D\Ũ`jE"o6I@{Mḥ0.22ӟW*< ( dBH7,@3#24r=.t:g0(C2+tB 0 -j)0l.1 f#F1LDf&[q ?fOU%-60?EaA DHDfBaM| P<JK9}$ (/bO g4ӛSv5@V'B]̢O_ &d_N#F ÷p3鈒5) yGBh,ҔGYOPyIzd#㹪]oDUs, .s)K*( CIK:$XFI]rk!)=AS^4aӢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZL! ,//__wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~J:6 $ "  $p=}A n\uӢ!a_ !AE c>5s/G$GrKu "CŜAQFЦ 8/|O n8i B乳 +L"ҔJ49Gn︴ A6 /B%#Y  f`d jo(skx/4 [x=]aE@{7H(JtB͝b<ꕎq1՞YѽeCSu riח_ӽ!]V}rp?U؇`LĘ4џuwNi\|,he _5%^&KIvy0Pb'J iGdPI$׆2e&@ ZQ|ƍYl="`d)nA䝦i|i՛_@iR+~Q+EZ7+Qd7-* F[*~& PYp^=G؅dЀ#ycAu%I\ "P^x Khfl?8,P .~Rtxkr_b.J QJ/=VS@4 -!q0V|gإ L3p K!,8X ol-L fM- x >3Gm7fc$e3;4CKq LJkUp؉ͶdYĶ2ȩ vq+0w ˬG^Dr,YP䵔v`.:e/~M-"D@NM|f]7|%O+@` OX#/K%@vA N -D_s|4 E*~ћLvqի!܋0#+Տ, e!,!A oQ'ĸlYrPWB!]Rh3A' ?H:3 T AJC0!Җ8H~M*7  KVxéI~pNp"Qb0XÕvxɌ+JrP  "PGb ){_@lf>`0`$茲&H *;C '%C慠%F4AE&~n,)Ą*;:a 1a #yphG(߯Ŵae)a +N@o(,VDrbқĝ#tR_7En02Y"ik!B˂f˜DBND0[hJ.I̧J-zR0biK]<3e-4@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Ĝ@< 9  6 u# @ ~%^mVM^ AT$xZ5)axƍmAm+XRgDo ɣsf—*Eqf :L(fd y =&Ho7Q @&!L= 8tu4cuқ!:aՙE}ŌgFlt:<6#""VK6Ic&5Qe(ǖ g#qICQ)S$*YY*^i眬ƝiI)蹨oՍh`\ X\@\w%Zy yJE5@^")p2 $է'i Pc:n1vyjk҇֕En+.nI! xZW~lG@(\?b(eDۭ`>R%@%A+C.VhoGp8.ߓwuR->UR*b.Ϲ0d=l~<-۠lΣ֦8 u 0`5 d tM4>*&*HC?ɵ_pכV2]f | PVarzu~wu[oWSݩ8jL xwMON EIS:9p5R.o?}ж췙WÉ\ ^iz'h 1/h" L u]?>|'p?X~I2vnC=#Cʜ8P8 X75hG XbfuLQ|r IfK(d0@D؝~OV6II #(!&sKc(b0,#3@ ){XaȄ` 10h &JQp*>޽T)G.N@Oƿ V(#*|kIcj` Ɯ GS~&@K<F&zb'{DBȖH( 7.d(1Nˢ41-3y X70Y.h2j^7/NhFD}dr[0O!ʧ> :m >LkN"]XD%Jfԣ!Nlc,$`JzH:+~y8ͩNwӞ@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb[! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ED  B > 5 9ap;l!0a 'BU`m&RCgQIo %0’F*DM7yvAJ'!Yr0hW.do)J"u !~7Zՠ \+ȱtv즡 WBD P@dimҾ uY"PbXF;YĂQ13 pC;٥㋚ʯ30x]ۆ\-4"(C 2q}]>8nnu8o0SWҦ+H=03;6Y?Xج+ /nB ˙Xs{gjn.zqN?TrQm_== NÂqDdX( HS0@ %@[1!ƌIp!5 i-A'ΐ@PH/H|&"!h!WsE֘k4b; ɑ8A@[F䈷uY1qHnf%paكQ^lw*q\*aZ׊d(vТ)G˨]J)-vaE̊h₫KV| E @{`ʧ>Lp\͂AQH@\⣒v&A@lX&d.&):AxGh,ƙ)(1 Ñ}D|+;%!+~X `{0^ql $& [=|hmߔs @QU=6P^VmLi?o](vy $ޖ6*Sx ~wW33`L @@ N _}xUة7-x&E'{x3D ^C}OO}P%+iH e5 bي9j){If5Iɺ/0ʬdеK# 3)0I{kݶt:us`>V@!2>b>.;6(BJhB ͱ~1yjٜ::Mh3j^6g!{gD˃Zt0Q (iLiRSH ԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:l! ,//__ww־I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~QMOǻ J ӻGF =ӷ Nj.ܼC&p6c`ackE"UŎLh-)L!e䁛#02ɓ@A<܅ i!rt@I"n\3z4UVX"~)Hx@hWuNMT^BjC6lFw1cnMO`Uނ-^.qYQKNj֓!=Zi pAwg Q}4𜀂?vtusrC G?dAI<ȹş?Hp 7xCIXCI)} :~I0 `90"xot~W)ᵱ)1#5Uk4<\DRsd\T!U/fkI¢%0*bHjY7$%g%1yIdZhc <#GO5RDv!*ʖhĹY((mߤ)2)~i@Ex^Tg5&Exa*ʄSRU{lxKS+>q*7*!auÒafl 蕁 K†1#kp@g/Ykxk0ԓ/Q@Ϡcy{+pp { &s$r10pd3+ / #okYaP&S* Vi'i. S 3n @mC٨ N/h`綀nq57K靧BUo3;@WW\Su/VEO2pyĭT#< 絛Bk.Z\fn̉'Ek]+yYyƏ-T`%Q NxӢ<\ h@@+ 2I2ͲM6,{^rzaDpa`RB1.z B^=<XhXgD@ M? ,)HP54>-J5 d J!-v} >5PqM̚N5ǑGVq*s!hrBb;2GDԍvӀ<^ cIvQBA 5J.+(i_ WB,كF%0kr\+k¢O،0cZwA6m`S܈!s_uH]afIS~,eiTњ֓gAVnjf QSkJ?+ֈs$uk$I$S\妹Rӥ )ySBrԟfPCJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `KMb! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~CVR T¶DzO ξL   K̲A෿(m~Gs s&-'q"> |akoc-8;6+YrqNۂ<=ʥ(V#Ș!APi-}V.\4uFݚz+DG r0ۡ'$f@*GIκ6?y֠&RR_āFAk/Bes;{ ?#YrJye#G]ZY]&&8v#i(GBEze@+& aGn+|+WJGr* UluʑefJ@ H%kGQ!oY-u ĥ}Sk_.# {<[鍊ŋJ l=ۇP4ozO (@8\@fEF= h< X8jqnfg6`'S-"ߜD:9y]h)˞? ̑t!ʄY0Z'-n+g:2ZD@IE΅m@\ѩm8!HkptfQgP ֠!;X>X !˫GX~T0hE 8c3"T݌o8T9ű\HqjA'yfous "^WxdqK,5i6;gA4nn[b3a*ΩO^ST`f g Vx` b@ :`U<VXamXENbQH&D*.bI2XD6Pz9 cIBYDF]G.ɤ= R@e<%XGutGfÈi]G_zOr͕QI"ٞcbl-GʟgV&YHv ZG8]fI$1PWOu fI 9#ug%@ۣF*w"BR`"U`Y"i.9ft3ȘY1ViF_bf2$Y 89p!/@\ ٟ$\l:& qm (0K 8 a(CVqh` $)0P i0IbXE"@,JHJm$ \@ mz, ebjFh&>fm10o);ze!5i>jC @!k)e2)EhzpŴy-,lgһ@%u?\c~QN 7 , l4Bu ϫеkn:?!SQ.ei"14MvFLknB4mmߤrFr&zM%EԔ]75kbGJ11iL'6 j/9Izal?ua>Nm't gK7 *N~t%!4/ 0 -d } ܛގԯKPdђoL7܂O FpU1DRLnR3G9FV I\%м$U&0Vow֧0gd+h| V4CHY/y&;mPTh +0i "cXY p e6 , .Q]ꀩl 'EL4 2rW"C 0IGXl&_h"Č5*Q!`'g,Ua5E' c*ۈ"1]lJLzEdb qTs# `э(F/BhH`$09mL-fX0y%TAI 줚P ,&P'BK˅A1# Rh=6'th?9Ş|wa0U4%{cЬ p2UJLa3a2K */ o~qBkp*RqiGծz` XJֲhMZֶp\J׺xͫ^׾ `KMb:d'KZ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~.#r$+nÿ&%pƺ"˶k' g `& e߶5% HۿmdXA]ΥSGQ>grśZG;I;"Izpsn jy<)Y%;)i-R9tT7Q 8&Ul}#SX77 񑜉gsd)ⱷqTPpJ+ _#(8-y.Dʇ.yGY/63]ҰKHׅ,pεhodz a\ ҲMz;6ۂ` Eŭgo/bݩӿ_GER,@Z] 6a7v3mzEY EJkXEJD.Va1J^R Rc#,DZ-iČJ61M"Q.cU&dYU`H 8OYDj q%)_Wl@-IɉzY1ϝ!{$>[<@jSns@w 0 |#8p Ô) 8 W'Y gI(؇ۂ5J.v Mvpo#pHSBK$i Iփo\n ;#gl bmIpұ+F*,r #)?w$ !Y- @0uWnv~4%5Aj`4bwz$V~̄.%IR pQYΚlg D. ^8>f|nxӤ'0t;x0M~D, Sw^]㖤 9TTбDTZ8mCU&{@>v߂v]M]Cz?P tBp@ d;y1ua̲?^xi#i2 z (R *@ǭ`:L8n F> qя2 ЇƘ.`a#YbƸX/hUFT>bdՄ0 /{4Ed BTY0ˊ?H'+eb6p uťB.rYaXε;Ja5:tkL$2&KRI^u1 HʫiIPQAd:~ `&wtd%(Fդjcġxr 顯#hJ0i8l m*ylp6 lhִVf6b^ 7v`v!Pf cKg+(c?ivU P0B`Uœ<<{N\g #+5KV^z69lޞ . 46(;ۙn&H {N8 \d4tOO13tdB)]~ ,ol#/M|]y]Ci9 XgpᎴʫЎ1i|!;7P% Q r4Ã')eˆa}BNrd})+&|=vU2! -T4 .ٔ$^HVȓW $p KnQ.1k zNT3H#SѬ4 @j'""T< R6=O-UʠQ>POtZ 2bebH)Nn.)} Ӿ4GIUU^6iJ(@< ∣QXfZp6ãTmX rW!pt ux ԗ6itm\LJbldR [X Z:*&S0OSG%.Vc86L% yG fcKQ,!I:E╴ͨHiCclyf p)M&p&6[*nm/{& )h(&:gu99uҳ{On Ä=|{;hP 4(D3P U%6w8flDmRG5L 戜&'zo^NI&̬&3v7Ng >ENwGtPTJժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `Kk! ,//wwGG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Ygce`\ ʮU ѻ̳ Zͦ ƻPβ ZuwEܭ_ĢEPc NbbY|Xm`d  Jq4 D|Gj0jy$<Ɍ z&fJelE F'S2+>3tjG~a)U3vQ*֋YWvϥԞvFJ)ʶn !)@u#  x 4U$0dP=P`Z+`fʠQ*+gIZA*n0mC i}s97D|k#.]EL2})lzTdqM7%MPNHxDJXKD]i胅ӂ!р% )qRX-[>HHc C: !=``=((]Z qCxB䘙<*x4݉Otй`jz@r2`N}#_ peTnÉLS)|W*ŠG:Z2 X*q wY2{R6@q0T }Tw$@I$ ĉ*ܹ+7 yDbĹ찵Ie eDR"z -86a.DJ@Kvmh$@ 46:֯GYٴ0:l1S (|ZwnoիkSe%F/F{I ,Wy<8u'q#/k5 _0UK 1VkH&!=E=Έe"J -Y*SArvp*R`/e (LFg!\O ,^ڽ@$!idӼ {[웢s4M%T-LsubJk 9f" ,C3y7y>ZLIȮXMy'9pS"xt"=z"+`7;^'WpMoI '6XLK 4#rw]( 㾿yXREi gYMQ0pDX"l椻19 H홟+tx Fw("7ſ1?ZN@5挌' t BY><!ߣDxt4{/E(x?Ep%x1Ĝ-eG$*v*lNsW|O#Ǚ~ i,x&:SPu`D<"@♞' Χ@T`P #'BAυ~՘L" yR  6C.l:ԩRCD@ˉu&:ĮxxDž$P1BӐmE3T,g%2eTgXzse|MzM-djKֶp\J׺xͫ^׾ `KMb:d'KZͬf7z! ,__GG羾ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~yiegbļ^ƬW Ͷ]ş Zɤ \  eVkWp LSsq3u4D1`:N8lJ6$_AI@4-CDsQ44m,`Ρdz"5 R3> ϩb :&*0 ~.-e+bx.m@ ;w ʼn Krt D6}1 p8.P/ASk];{z>]e{wsp)K^f~MDb*DX. jE*q_FL!~h"`E@V"!Ć2eb0 _e>6hĉ''&s~͠g80HB9\MG 1c8 |F@cqT&!Η1ؤ'h & mlYi@$uS'? T5BQ.<)}•5R)h z„)JBjdCVZ0.PVK@(LH*c#xH+寴끶(pkg 5) (@o;AK&pZW $ pP8 0I5W:I-Z?AZ wsbpJ¡ׁ9vΕ0+ uo5.| L#Bn@=4Хޔ~Ib8t|T4SRH UK0QJk]Mv}tRɘo6HEhXmjCD$7u8NjdeZֶp\J׺xͫ^׾ `KMb:d'KZͬf7ىF! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ieg b ƾ^  Vޣ ]ˤ  [_qzS 5Έ=-9 g;q"Z6nS bZ!6RmQi4"$M虌51R2">s*>yQRz* ֲ_KtmJjT.v pySwWKxB (.?1vx9AE!2{%pV3|A@ٹ'w1w,``۸KUy; Uԧ.gUu:yۆZo>14m,^mU_Mu6  NMqYhD"QQaE|HbX\rXzt1Z〄DV8T3)RM ^a4D5 F՘$1e}|>܀!nL"GMHI +($}dJgJui-҇) |>t`'6ʛ` p ^9,F  c )h~^l'2o p)B3#VҶp\J׺xͫ^׾ `KMb:d'KZͬf7z@! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~iegb ƾ^ ȬW Ϻʱ]ˤ Y S !ӧ[O %A5 z81v8+`/ckf8 {f0tGBW9̀WiE틠ik2ZO+2a_;)(tZ2If;#(h )쓟 '@U Ё`=FP,&x(DIljbkD{ l!I@*.b3)J= ҕv@/.HA͔ M3 ~2sf68#%N2gڅ=_rlfLM%',Zf* cIN) ӾTVĸ~krQxM@˕`Nf#P+LM@װcPҠnV@.l /.Nq㠎/0_p%vm"UCϣsuQj@4y9?+%{ aT>|>Rw}!'T8$ۆ8GV a2@yJY|QO\!;!9DJwbU f@7APV-&&;Hc0$X2O?ftc!؍c[MJق I*!!z:(0J <# A }^懮pfz@$k*Bv& XĢXd -REB~( _[iLzj6ю A Ca0Dhr]" fTZ, rL~7|,Hv4?[ 0|a^5`tBⰐ2CHD" .L2":Pdǖ&:uLSz h~ӓKj&25,EITINKIǩ|-9@"XA%^WM2 ZUKT7@߈]")Q$cOk[z_2H2 0uL1+l>9ő%fv $8)8 R#x''@; ЁnP2tU {(y"* 8T<Ew@jd逫2c.ۧT2z|?SY 9nzAs~Aiqˑm'N@LZ3O劰MXz kofmJuX( 01ax ؄ kgmFr(Y,cp[9F5g4k 1p.gM( Ux6!@JûoOcokbkCtkYh@k׉!. ۾yw<U/o*FC(O  7Z &4~^b5:3fWwhn1n16׮e~b^<`߼/bࡩH\*̍|$7CD! yw,篐bG1~ɨ2p3z &$A$3 mPz` A2y&4RX120 gr2v7 i#\N!7%d |C*Z18ibu@v.*(P:(@~0u胋[6ց6,*#%&],]p"t,g!-hߥ{bc{]XG\`>OܡIE+F>VGvو@=ӗ8l!,(~ n/Hry2={ ݄Wʚ~ $sX6G$A")S|(Ȳ ( >9P}!mTW=Ԣ d{D/N|PGi&z=؁8A*4eE,2y egҫ`ɾ9f6uJ*kԔcYjK5IS'JժZXͪVծz` XJֲhMZֶp\J׺xͫ^׾ `+! ,__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Cc_a \ XQзVѪLU |kvrJ-k1=dqb`̘f#3? )2%ɐL f%K/._r)S 55(P3'zTP.E婴KҦ[B"uꕪV`:e+(^> + ٲK΢Mv푶n;d*~2֗=Vp `e$PAm C C(Y 8~쩜V ./͝c.~]2}N~v1  8p`vgPAdE=@5 0Рq7C~Y@˭0<>Dy Xzʬx]6)(5ς;W 4\by7Ї{\-f[<6"]M  @ ŧOr&Yv@^nDv #wU@wD &ΌlX6X "'&WDxgۄּ8Iz tKI^C&"8^Ċ5AAh?*zf`:lqzq~J`* |5jA5<ڢP F ,ʀ z m0 rߚv`%bz`ѵAz"Ҟ@"VKIppJM' Yq!'+$k L1,l˳!P*"g/Sss i2,Z5IPܮ{奐ڠvj MCrL?e瀢3W81a V2rP \%B`&8! I0T.<cX<58!%$F1 hF3kqH hSD}Y =IPm s$G9J@#^ 6R@C Mqc # 0mg!Ma,⮸4he&~kZ r6yt `[<+0oDy*=hgt wP)8zixqf` mc Cbe0$xVHz48cL۬Ub*">ˋ(tG.YI\ H8ENf~9W a%QY{h1㉙c]UHwQ)qKݥ6'5M}4p{oʳ`&ʠ6Mlb#mplj,2ڂrh **R/(JOѕ 0.UDc|k#>[(e9 `*Q&FٳdBN#UGUb:PeUa?yV*TA\J׺xͫ^׾ `KMb:d'KZͬf7z -&B! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~M.#l$+h,jŻ"e'a%Z$ `^ >~lAl*ԇvMO/vۨf;C@uSNA jqSpL"uR7-_>e#ͩknĪVh d(M[)[3QߖzUvxֱ"ʘ%-.= 6 !KJFy\NqxĀuBfnFX |ھ*{378kS,|3]>HJ~'M=̽i#!`^.K^*{=/7)`ྦٯէ_9`q $` r9&X\B2퍃٪A ƂQq0%AېoD:tbF#)MqԬ2,p`dT3}`*Xæ)&;\47(D"6zY Bȏ;Do9}Lݙ՘jT[ժZ5xͫ^׾ `KMb:d'KZͬf7z hGKҚk! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~.#¼i$+e,g"ҿb' ^%- Vÿ雒0{7p7i1 Cuh1j$R|LAh9]L8݄ N7,tshF4tMO a@jdZ52KU,>bRg DlB:Fҗzqمl.l&QK.eAָ-0y+R?d PP&{@`aM#_H(0&x!7u1^.@qa-"Zx'FR4Y9b,7FIÎT!c|C"H}JQǟLfBZ" P#հڞd)}D l*P=HYĤ)g"!:ݢi]?,:Z)!;wZHݕB++Y&*<akzkON+j I5ty݁)ѪН^c. o6;. 8  8@ ,@ATܖwBw1TNl`MeG{1+؊jkB 343Hs0SR$ 0@ Po Pt [5D, b'TmT:*݊*,wnglӺ~뺔ثK-. ̎ܞ'^7rʞVN )l+0%\{ 1K!yۀ2 D w;?8~QzԽrRmÿ:X?ZW@eHp^u@!ŧS(@ 6AdBC\P';!L$EP`؃P!"7!>,HCĩh8{> EٰJ_ ;/U+NTժ}ոUxͫ^׾ `KMb:d'KZͬf7z hGKҚMB! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~u.#d$+`,b"]'Y%R$ XߕvɎţWЛ3!Çy'o:Uj#Ơ8b9@fbn8*F94L4 |S(-sA!jK= n֢vOSZ>lD9PzX׍踒QyFv (WW\~ݎ@bՍV*T >hxbY}Y3YPc9ڢ:M;5jՁrD0{n=F ~<(A:= o(Ep\@#3aC%Իe̗9?  ǒyA`<(V` 8 ?NŁ؃ DžIƣ*Sa '((l$.G6 &4WEB,!0:4=ڠჂK<3P# vOPb)R 1>B*#+%f7geo bRz\)m%0 >v L\YfrymK|P43xs x_q 3+ӑ55.>۵˻YʅģWQ]rT͋]Z=@d'2` ڣٓ@3DS9(ʂ~!\0  `hb5Q  (^ :82X+XCx (bhա_}8(#(tҟOy&4#)b&pi6t R4`(3#8^@Vmހf=BV5;Wi9UPEr1WE8,bJZC[_c&v * 0nM &\ #Jpk2b l=Xj9zUK ..ڃ)n@X÷ [n̻֭S@K/6 evh 7PKpYm2h[pn]|?-RȰB߀8lmv9gp{h%I u <-M"~!7Mo;5_S%v t9wlcȧ sUGCT땽Mn#/0tk0uC@OW_!!X.? V{SG.៽π+0 JMsp !K ŠB yxS(`H2E !q>{t"%UX2ҍ,,]2h| &Fr[,_8 "+͚>'w?wɜ^C}p뺗!_^ك,\5-zf{g\7NyhȌzaJ7GGm1(F8΀jAbQE-{Pbi,;fX :)?֨Y8Ŏ52%Ť0],VJjmKFx.ɢN00YT XU?_T$uV؃ # 879}MC\E%@Zj* Tc (hy"8 6|*- ʩZ̺PK@vQԚˢ ¸JKĸ.HZ .P+!>4VU'5xZ<>Z› ?ɨnLX $@IPSjĪN[ ,h~3>C+dbi]EP/N0շ{Tt5֮\U>m|#FmeHcu7%o)cpH(}I΁.)m5+P<1'74m8Z'ʛsfgsN) "xzJ4G;KJG|i~| ?DXY?D{dn@_y=r>2[M? F6OxٟP~$}AWѐ/9^$ $|L2q D<$B+VfP8P |!<('N !p:A>t 1 4<"谉F!)VB ^\tADF`,#Te41"#]FvoNpG6Q"AʕG5 92x"#E7`pE$#9H䢃29mhZr! (@ո& 9:M9_&6B@?ILZ"o$1*e,kșpxg=ge/4Ne݋4AsM=OqY!AYwC3fvJ h@`$8U\}Ө$A =r]X4]Lmu,ܚ4ְ<ݨ[39Ym궪v}eHMb:d'KZͬf7z hGKҚMjWֺlgKͭn! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~M.#S$+O,Q#"K' W_>TNa#cP`E7v|1Bk (h2 Am):lI3nxpb1%=ަF! ȷOG,Ő0 _U,]@a!@gGa/[$`ܽW]_n]s.VM:Iԡ0.^Eu؂| P\|% (^fluZW<,i4੓.hI+8gPf*4m@&p-&p[ ʚ9 |,#xU<- |l>T#S"y´.ggP/G:d@6S8 D\$4L챹c'͂Q@4߆2F3*D)iRӦ] ^@1 )^mB |YWҚ(4WggTa sysZ@L %pIIۓHp\C|qM.Bi O*'5"fhXyj]ʵJ>) kP魼̧mЗQ{\WM ՐJO?'j$D3]QC#T9^:7 b$ /M >?`{1 : @xAYQ@>C&R 'za$C,WX!PV!>wD'ܰQ!Х%BN/=K |"O >4;撲A4GR+Xʰ+R#4!``TciW,Db%o 4.T2ՒCՁFg4B|rYdA|@7yJ:Gh֘2bH4%#xRXBK޸ɹd|7fiS 5pg>a T^4f]4#CA@ 54;&Oo⓼;P"]Ϋx9ιXYmMM"W6t$zbk kUzuc!P̬f7z hGKҚMjWֺlgKͭnw pKMr:>! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%_$"{-#v ]D 4X]@.G8PlXpEAy.Pt(1Ij a8ɜď9 r$JI#C? rg ԉɩNPw&bPDU2mm;.³z5o*}P! 4@,2,!oE/DAw_ b2'i܄=`}x%ф{=vnp쵝C>yod=tf\bh7&ṯ~3X6‰ rd~ )+$[#:>J+m% NR5NA*30@hhd IʃkR />.//`i 08% k h n- k:1."47*Nw(k0//'B h9lћRӴEwܸVt,3,9\pwF})K . ]-;:+-C(0P(K F#is%Q`cZ]`$c:h'E*8uW7e>&Y9IW%ү>@ ,Y$MWC%;MZ=iie$IPp?i U?L8%#BZ09>nР\ f@a7CB (M%R4r"z((JH!`->^dBbF%-9&,# &59mÑ ݈[dcxGQ1Ȑ F@C)chHld E2R8@BЂdisIAe-0a:t t(`KrpƼMRQ/szR&S)jeCc#DH BXp2xsox( X81Q4Ejڠ* i ÄW3D"8Bn/&{[ї4l'͇!>}^JNj?Dy9i7ϔb *t5&PD/tj,/{8!=ⓨQ]Uieo.,YG ǜէ`=SoB|K\)p['c]jrAaIZͬf7z hGKҚMjWֺlgKͭnw pKMrۂ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~:%a$"\#Y &?'   3#@6r*H$]9 pP.Ƅd߷}d&L?GD1RmjiPd׆i:H"JAZ~7'C] !2ONL0,Uc57Sd SB[KI9ZH61Ur RDe$Mqлw5_}n^^?nWtGUԿ>l:ۿsXnpV>_ulLh2Fhxj( c&`%TMZ^&Z)6" !&}ƀ 8`]/d'ˆ^@tU ߩq"[BB*@b<'b$ B Aw#=vg Gdpk0&[yv(d,@gR)\ĸg8Ѐ{BI$@a u&3fЦ%W6TQ}6i@yuQ4;r]9i(?NNuKc&നQ!,J«O _ X@ `I .ؒ@'00&ʰ[D m ۋ"+͵.C`0¾5<Ǹk7`\g;t1#@!#/s-0S8; 0P 1oB&w=Elв\^* Iv,9?u ( -`o6 EP2Cfv?ou%|:S<0.g%n UZ*z.t2׺ᝀ`MԭiSRӴW> TH6ǨJ"fI:ش @"f^:&ItRe=S?ح"y^0μ[ f=P?8c()2dŁ]- <k6d}X*dCn` 2N04^̊$[ Ð!=F1q )bV} q 8%1VfQ B|c(G(,L# rC #t {|,";$2=:\%&H$^T-yK8` 8GP9 Irr<Ă v$ya=dUe]' b"nL @ a,KS0 &FNE[:*g$rs3,:IJ2 V xLmga85)NF 8$._QXR ".0w'-R$-Z Z=7yp1ӿZp ?mpGzT@ 0 H0 c~T@m5S̀dE|iHRkb_w17*cdq@^)h4K*rtvA\# isHjb L>X5.ƌG!Ep bҪD (PeZ kfCk5; (lF{<Vi -Ib,X&P~B'{ZZn ^KҼὮ\@-*K"-Jh .m@,"OgϥlsF-$$ 4DMBĺxs .0)3Hқ!<4ؠb[6Q\Qf <.Y7+ĢR)am"ٙT$1Y)<%4Rdp퍤՞ř?!!Aͳ) .e=AğzDM&<6RQ<8<.5 !Oš|\ٍCts AwhybUVqBfkU}B{@/ I"@ɉ6G:}"TJR#Ex! 6s؃p>a(58"g%NAŢ8Dɍ2PSx o\lvP0@W_ ukTs&D,(x =<`H lT,vȀZ )Pcm9"%$_H 8 &I0; `E䡌TӀV.Pws 'G1_e3@fuX1^F`KMydX!>u$|H3f9P%qe7 W`fD- Y$`l d8/(ƚ g1byi"+ NJi2Ò(]jT&ƫ -L` d@ (1$1'Qr\Hdz$v#m@mk!>wj2.p:*\Dr3A %~W1HICE'iES 3p+kG(hU@(a/K W(!:(DD5.iv`Nk&$~hQ[C;IC,rQgIePB -)/$=MuLjwʐt UsӼ|k:Ua!Îst 禱TҲafoz hGKҚMjWֺlgKͭnw pKMr:! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~b%g$"'` #&F(  G#AfM'Ax}p #NC2j, dqdٰ4Ȗ.\A=i'821 4ERK{ UԪ_bu떮^ {e,*%8%lܺWEv/߷zvJ[Ne>m 8,#j&$4g3 ,Qġc>tW)teף"퇽E [Āz<ȸN٦Qܙn~+=u˫x]3`AL>{ @ҐրMaDB@֛ wi Ĕ!r&l ObF t|xE hGe !2J /& IGeM)uDCǀ&Tfc$X%*؇`ƛ?!~ ɣ IǞ9"VD&gǀZr-;{$XRߋ0[a(`#xFo˩ HyAqZhjk/Ji\]w/Zϧe8k̮RȬX"m)Q#,[bHӚ@\Vd2蒀%/5Bpj]PM#ܛo8p + - i'?J)&~oQ۫ ,$'?+?)P+s2@ 0<38١0AG-Wl,̿|BO)xT}5zp2Nj\'k! pÜ2Qsс'182̌_D5bIq97× i!]|O0к뇗ԀU.2>ؕAY~.mN +Rဧvâͩ&u$wU653~rL* 6 6R;D^7U-3T~#\'H;Z_!=!`*r\+hr\Bx\Xj k-vBJaEYQ0I8_ Y|R!T.(93#:]hIg.h|ć˛#Ms& wNo4jhB&GCYoQ9lh   UWihT_I 6GRS"|+!`y'ĺ%+w"BbCMҚMjWֺlgKͭnw pKMr:Ѝt KZ7!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ʽ%i$"d#a &G'  H# 4`A~O@h""ZC9opF\tdGDPAPѧnK)SƝHb,BY<$LDLb?ΰJb$')aʓ kYDA tJ7ƒnSBk߉L79(/Q5$!`A0GzE#:]@ڲN~I!Qxke] bMIY4 3XO бASfCŠWV=qhāxMl$@Ms Zl^?x",k-x'I(%DB_FRP ww%7B4o Re ^CMQ3&QD(2az\jg@*V.JnQi=(R${Aqȷ$-pjrHj-{%#X!+/ n^֚ҪC2ƩjB qj,lӢ%H~a1Wn E+]Y̩:ŧZ/͂hpTkV> IOc,+ɧκL"ɖ) <8 3@3C+` $ȃzԫ*Csh33mX12x m hdkY[F*<W+]D4>8mDPጊ 1iCESY7._#C U:Vjp)GW6Aa*!h܅_qC>@ƴ;A>x8ً3˟F/}p]B$%v4Ѩrj-|1Jn 3X/vC7h Ih0GVX^A^@n-⧇1, _w!yp axpmP! 5fuL2 qqS 98u(2NpDPp<4PJ=g+ uH-.]k`(bӊ!ɇ0BuxW.~)iUDa#/pAX D&Y)d''S4{ mhA۩ %Z8Z`x:ȦA_ʃBY5 4`@TPxMjxU%MhˈKI2am,6#v2O`at9iL}BiMtc DY-ుMz);P"fjta G}'N?ǂ8w5]_s? -iM'L4* nZmlQH:DBulT4! gO"䴫:jd6U~&` @J}yڽ`(2pi>(E#:I&\o~e“رJڍC6)[%=t^H݃qկ݊$SDH!;& } s̸Mg#i>Plj{1' pM1bv"cZ[J;`` Y'ԝXep;Ic@!O) [լé^>8Aguyu ] &N|fI( d 64AQb> VpuwUH7hb9dTHer#=dVM.7ȋ6kqbaw(`;pR~4Z^4#fiAme($LȦV7#]%dd#dZjE}j舜Zƌpri1xhKcJ2J^+)ʬԺŭҦ,eyKX;c.[5BP-.NgXN&"h u\rN얙 W1q:+ʸ`sE"b @3 4/:r PG}s(st;/Qwצ@ ?U L6mr./6iPtlGy0-i 0l5|,2"kLK_%yzʃנt4ED-߲dTœ9s, ,i heA֘*LPV!=)laSn^< d0/˻fp='QT9V FHSE>B>lp *ĆKC.(a@X A4"!v $ʪjW(B1z ܄vy!${$HDꆇ2D~x$0A,$7P!Z.&\U@\d5wp]_bz9h1#>b eTf !ZE(hSc3~azqֳ!pm`sP>h[ P5RlA@c"C⩒ 9S-YetMLܦeuIr#5-@"$ N< )/;'7{F4KzD |ByBzӘ_Abr~S*Jb:N@Gsxh(}=G'"Hz iNFRrx%3()R_ѥ`NUOJ變.@6BХ57IјU5ʺEU*=@;Nmkdj 0L:ƶ@c'KZͬf7z hGKҚMjWֺlgKͭnw p3! ,//__GG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~_ZUR ˾8 9 BC-XLq pCy JL8bt$+XG<^QyW`t2 ,PpΜ>!2riBiS=6JT+]*9@N,fG'it[tΪq/&T[ƍqn  5^J [\d-̳AC~X $\_M* \w?x~Yxu\pK28ΞRnx P}vxמEe9=-7f)W,4ԁ!-7No^H.X:eAH Лpf ,Ĩ+*ypZ#-耍hCג7`>M1+H%#E_Gvsp.0&Oi6"Yb9"KS0\x@x R'}"gv'if.hFQ>{*B։&WY藋:VeA05&$Vjʭ(FC"yA#+N٢RD*:p^eٜ~ꎈ<]cǶҬPWvYvVJ+ 3k TK&p j&yp)TǺ9  5#`nϪ3b0 TlL:|Ңx-\wP[#"s ċR  ,u`,v"4N$}5TDHU"wٝj(smz. Δ9w筑7Be͖I@RNJOԩzAo|:Hff^@{.P};.nY|FҭMbQpv^$OcEV I+У&k*ާ*3Pq68TK1?8XP|Eq!0N`k\s8a&E8暘P=*?’b8hSN#4914j0B8p'lˠ>#"GE ; / 0,H7+>4#hI06E)7+]1PL詑)`)RS0ԥe6u_~.[jR9ptM݈IME=|Ԭh@2-θ"]ٜWDj]ʱEتX,6d'KZͬf7z hGKҚMjWֺlgKͭnw! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~s%j$"e#b &H'Q" N~ 0 ޽k& 7 8HRG&3$ɓISH/ D~`6xmrӉ%- u2+j@TB h0!G~X/W͞rZvP"[vr[Ơݡy9@/R>z-Z6{ (!f#\^2!Go2h# ^'ʾM\ (@'sՆK'|2B.sُWǰ;=0mPc%ۄȤ$"< afj ^Zfc7pu&]p=Yw^i}BgiBt#Cnrg c(0CP #  s" %(:* 3`ꐪI &L*G;+huTjkH<&j h-#& -n@?b'= XF<8,RJ3cCkR逴57E@1=@kĸ\$&/Sق |lNʳ-+ 8'c02ڀc Ƙ-Cp(07BKuQAA:|( P\\.DXxrB;pă qa= ( ,űTbE3c&B!T,\CUQIATQ]<@S1헸z !W T|s:t BYRT+묖F邇m3"uR_ӎ)jhP]pUE54=+VmUz5lk"T_+/#O4 TGplM ٫vs+NQӟs遆*ŕEͩVיɶ5_f+Z"nw pKMr:Ѝt"KZͮvz xKC! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~w%j$"e#b &H'Q" N~ ( ޽Fπk& 7!1aAC< gakP6!BŔ$#L*RsF[4daKḶwQ¨QBH5 K]T]|4j,$cU-;qBᔬݒ500_4آ[6 hC+WƍNcpӀt9k| -zK?$V6t6\ue|i˟|q $?7fsei@ڣzp9T;P W ,)  %C_@^d/֠Br@jJݗB=ЀSCbE--s4h#{ã t;G#= HaEM^RVcwX %F_c ymXV tٙw N 6!J'| P~h(ʰf q }*BsI`7G;לshYA;8WiR(WʱTF(jyQKrlx@*pA)V QEKY$H>mPd27#<\ @ܽH;kο^lF#.n(mk1 } *'K*V;l}$'μrK&!Әʲ@Z,K ?KrS/S&0bo/1#23KfXw DҞ-MK'qSQMw-}C–8 (5Mo -f%=@V -,d)0\՚igf࠷;N.Srnϫ7 l<  T]x#{[n Y/N`I! q-+wT:Ut5)/{!+ַ /<qx,?m">'jBg"Ҥ0Z([c-^d|1D7xK:@Kb &yk;FMTS Ž0{.QX@SE pU+K=s$)m B(AQְf>N'&#Ihδ9ɥ/o|DFڧs/9xx?k^s@ yFo|[_yր-_!zm@-@nD  _mBi1`F& y_(2"1fM|]8# -@}|ѴcUC d@,d9 HWPTe (URy™8 mRߜ"dyAxb))(jZPduFꁞj9ΚfA: h5c UHj("@d5$:\0cER% @ Jbq~EW"-z wMvȴfnurA@-2! j1ҠfPp7n;1 :!B_8@"cb^cX`!ji4H:> +r\~FLrnq4L9 V7Y:ٓ PTPIZD1Rh , 0~1)cZ]I uYO4S45D6e(>T 9K-AZ)/DOETбQ@f@"lSFL ˲ʖeTNYBP]3kI&0XxՖ .61%XUFOYaTP4KW`5jWֺlgKͭnw pKMr:ЍtKZ"! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%h$"c#b M'  ID$;~=(KP{=WE"=g A<~\=Ofr%w+0 MK6|SπQ@]45p,F{X˓ֵ"Աd}&LkҢj@,y*=S#XxӨ(+Af18\i z; ᥁-ӠW<+]V.y[/Ğv56۠`7g70 x\9u{TM=h }=Lv gŹG@y 6HR{MP84aۡ_t# 1] (@= z,@/@И#fcO8I7H]Kр=BQΐ O9ex g_`a f%XWҎk0%LN:iwUiYp7gJ}ЦݡhB0(Yi 29Fɘv>0@C = jڴpӳ:cTHS^ 5ʏlً3.uW@GYu <77lJ0U|wߐ@=HƲ^.L>'3%P=i*֓‰9Z-s4Dӿ-F>&{ ]ܘBWT8:ҳrq3N2{-(EoܺJd ù,ӅL{CǞ^Ov!:HwXՋ a)x7 <|QBZρgCZ?gux+z5dv)X(S!"c}P%fwC`|&BBD{P`'ȍ/"|Q„*X1 B)X/E1RXlT!EJIQWey J偋n4R:mi&.>nJ6dBKQQ%,=(ܩ)EޠM-G9s?ŦTI1Q.%DK`N'uC<*"?S"ɹfkjyH?*~51^ȪeG4NVV0(7 ~՟2-V?[)ѢE^8dms pKMr:Ѝt'KZͮvz xKMz^! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~rWR P < 8 ? c8fw3y1G]D jS[38 \&3IL y` ! KIb"ܾ cmYuu7'6}BboC%K8㮇0uˡkQGM"Ƕx;tMz5]_g ⬟wRyM{ zoJnDPF ",p UߑhKd0w HiPBA?E#Rk(@I 1*UwaHtX֐Fe@؀1% %)5G`$8@цfD4ذ'8Z[b0DQn!(SLEX:Ehl`Em)GXa "2c (BqlDEԐ١b^ JJ'-dxPґM^4g `gxfW֦vvhk@|+FГmP'v:qpc+LmZdC"9 ҄C'1X lAgTX!!z8 {A@=U Ɓ m g9RR @ OQxtHŊprX'Mr+MX9Ot =7 .$;$t*TFx^D`F`P-aY GxţbOjiP351SW2=FKSIVB)L)7vGzkjPn*e_bγǒljAZ\lgKͭnw pKMr#:ЍtKZͮvz x9! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%e$"`# ] J'Le _&d&MZ8/{"- )G]Ì E70Mk*[rnRLt5dDX0B$ȧti8BXǎ%?XLȠˇ8a4 )5FM|X˛qo="zpEL5m \lBmR1qȟ@]Ap`ĸ!Ep]M*&u+[> Y ċC wt>}A= Hnwy={B_ P;n/$_={ gЂ$Ppq a+Xءߥ@>#Y 4`/d#2ݍq2 ,q X@ALmMmԀ60PHI+N4`HpAgJv`x'%ZDmX9@ @[qυyǺ)kJ5ꢪ< I(qd2G`R< ud "!$&nicMK,%3؆ϙ\ sX-3xq}/&D0V6Rx ? .6',jΪ5lᮐJ_qW S*´jjkպlgKͭnw pKMr:ЍtKZͮvz x! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%d$"_#,5+ &-Nǵq̝BƒV̧.C" HxA`p=gp1Kc*='0\MzLrJ"J &H+S}܎&5|=eS% `tsYM5n٥;g@ MA%Ru!6d`p{&H5.drREz0 6mNS@=3; YۣA_彟64tZ:z8zpmT/_DMC|zCĿw?2|½}Q `mEV[*W Hp~#tbZWw"} iBOكm>ft{Ч ApTP.6â'6XZi֠ M ]AZC'3A? gk`߮3H; , C&;ǂ,F5Bl"  4Ѐq*( Y6.0-B7)#6lpopW j@~Y[謈h.U魩E¾%|"I ;Q@P%~.ZL~DApe& e2CpE=C:s,(^U7;*0,lb1v ݌7dTNN<|pʇ݅FzV<mV8"R76XbXCmmhaIXǤW! +1U_؜״C+LC(XZP㑶Bu1'Fe#MH *~9ȷT$kXp]>vD=b(E&"GLN7kz 9R/(aWF`EB:[_K GA+)D]Y ~l(@-RCXIiYܴŕ"TBJX'-d%C☁f-(%ZҢ,%d⛂9DkBH,s(,QDBh,"B',R=bg,,bv# J ʯ5'`ц~KhF>҅`)(W\~aP(RbA[%bLEXȴZb4[KX \!޵ h]>CDHd. jXRi$װfث\'LVBȊ ЎV}VծdANbIvͭnw pKMr:Ѝt&KZͮvz xKMz[! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~П%52$-"1&/*, #Nd6@kCp8 P B`QAA&xOaG(HⰌG@4dM8!$xżV`!P bvێeV+( HSYW2;@P%r+03rzD_fYٶCq3"VRB1̈ Rf4ambp=|C18%<1cgA;\9U =w ܮtyam^ڽׇOzFCCnp-V B~ z*­fՅEBsrv(@VbN"1 $J"8;=Yr 0@ڬU (Pc|R 8 7~:,Uz#в^0'^i X5ޫJ.y.*)JF*/,dh-mSoK鄒dleٶG06w]tr}uQ;(X|wq.W43\ @iCs,]cDa6MZ? ཈irXfw"1HBϴ<F @<e)BD-<+T88{8s," Vc @HE `,t ST7#٦1B`̲B$-c*&-+e@%nl$GK%+yy3zrV 1Ae&^yE-MH`'n ;.Z?LjItZ74fOrJ*򁖀``pGH,pa ^™NKr)[E5Mbf,pbV9I'nPˬ,ZɂP,29s8_B{">c*nji G{)4fA` a݄~ (Hv!(hC"ޱHD\ 7gBXxH(>c "=( DB '(i%8)KnC\O0bPey 9KoT#X gf|a?W(z5yp' MY :R9Ц4< !' CTc/覬'Tkj\([l.ẕ뭥>l.UҺc 4 x . MX)L[ "&><#Q{[j>$t[߹{/JMKJpf2.UI3gv\?V?0Hm5hVZR)0a*P8厴a<5@R*:Nb$FZ2 ,* qQ @Ur 4\)MfQ/+ Gt Z+@E"hٕL}U@@^L3T=EGn)g?u~K.,_i6n5|cvЎTp 1A)k\킇wTu#`2("51i~dh3 mYVƖ-HEzxRkx,AJ5˃`W<m{$Q@0-r 퐉v#ЏqERnl#z> (%mPU UQ2,$ct X@p]0@?W$߈643E $_'>C p˜0'!)C1 !NpsN9E yȔ! zs A"4QDSA~  5[CcLF>6|c0hc^n(VLa%֓6CdǑ&J`ǙN@"̃ gbp,dn `@~FY" cM alt} ~s@I5+!=B;҅ Iu((Y8It{G6|lQ6(D }ͺm1A޹ۊMDҷ { o-#`u%8mLmgwTy\ rFf:yBai%'Yw`'!$) X5:Ÿΰ v) h0kvB'L* H* Yj*W 0@ }D"LXY@a,Ф 5x6ul ;pBA(=rڂ+mo6#V7۔G.ԝ^x[:hEnMd.|ڋ솧VH$d|oK!ԭ S QT$QzXV{m t9sx+ij_K=u iM@T%E.E-BVO˵C^@'<[x$ mA 3N_@͗Pc\eL03Wgzc@Ѽ1D6yaDD3lЋ6:We #!-R5(  Nr!13p[ [؋Wt؋JᇼL~0bS{@b.H&:~b^u\"%enjz&5p1ATjim~ېcIIJ*,jӘJΨFV+7x 1OHUO67,wpb!2Ŝjf[hM0kECEtMO.e=0;H~f:30<`MC$.]a@stfX1OCy<^ԉƩ2Y9CDdǸي 'Ii#0ۑ$Axh(̛៥^#ujpt"HPT/8mD6lzx&*v:t*V,3'X1Eұ@fZ6}+ *tWO ( 8@'j娣6H:bTWC 0(@$ِS%]=x` e Uy(f`$g f}iYҪKd(ɶT- ` ,CwM+? ) ǯ$D(頓 @L&೯ <q.*/P~t5FV(VEؗ75G3ݫQOȓԌ9PYSG>:4aLI{ςHT:PDm+ 0Jf  /1P ]APBCx K B[1 P .:Ȇ#o`0\xC o؊a*bErb.XzoLCq=Vk=8Qcv{ #h0E E,$')PEUb (Q($xs f3V>M0$3˥.u)]_G?J] H@XGK E"b$g@a.,I4S.s #* !.hs,pH24M㡒 Iæ"/=x@y=]?94Blˤ& 8&rg=j dAgb?T)0NOOn\yQ?Nmc= *HCOaT?X4XXTs ҩ VK:r@j # 0X*Z]puVR} *`)*^TxMg6Mk_j*Iž+V0;QqSVm49l9j&Gك WP{NV!j:<ͭnw pKMr:ЍtKZͮv9! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ʿ%5R#1L$ /I  H( "$΁>h+\ņQʃ@1.I/A},d( u %pr弖BBlւ~ Hp#Q-2S0?Bh} UIRql@*Т)ЗU%Le{.߃hܹٴ:i@=eMblBlBpI78} N칯&kCFMqF)SEe2?}p طEG9G3  x|q;8|0<pL@_ Lp^| }+aӽ`߅Bq!_ޑ0`"l ,R%b+d>A8{;J8 $@I#l(ơ^lS y|eÕ( i ?PX!u ,F{tĆÄn/bb7 !}C!PAu*Hx ⁋b( [?LE{4‹|p#-F…#,fh=bU#+8ABZ[ɭc8f}Mf-rNΎ!K8G6EkI.gX1Ig `%RWj ڑ aAf-fI`v3 e?$X|hPe\LA)~l> OB0I< p^FNt1 _yPQl38L( i mŲ$[R|r L:=e5aQgԥFL5NTRf* L}.*XYű`f=+:5}+\*W)^U׽x_idӔT:ԪM,ȒI'lrR:Z-=YH3~]]Ş\FjDZFAKelXPU(dVN 5R4=Q{KQ4@;`]gG]MHhnU`abtS'CqpF8Ay]1o8vR5qlJ0ⅷKXV{Zi9|86Z﷯ȍC6V~>]3̣< {0'`^opk*aNG@xmRYtmzO"z?] =2qR JKc/<]#͌SjNƱG ʭ*'/4}}q\c,2uG06Z=%Ϲ & ^߆"-\(H05f<,`bMo ^1Sr߈8Dͳ :t(b05Έ_2Fl'za[!c\D\m[ UE*X ^|!FY0h$I`Cځ NE+DK zf!EE0y3UI?kk5I#fK`d4 8-Ӓ2.s^sS0~ T/PM썪/wEmuo@2n6ͱ€,%piPt4Ϧ]v11O[5zGngMOЃ}vő-5e,b`נ>eSů"%as.hpΨx4#PN Nú_9%] pc|dvSP$dY 9}c'\Q⎓B1R3'V S.UVx2L>Ok-4i /7QmZ848`X$cDqD$p/Kkmh +h$yV`P 0 'dtli՜ItCMAkDZ˘* )Ȣe8 f-]C'vK Aŀ/.H5أ8s%e*,Wb:60 (~=@fHjƤGcL*\4 lE~ATOwdֆTyr[;jq0pu&MnτISlvlYG0)Bn4eD(ͭ-,\ِJ.'gw '6ƏA$g2*`!ZhdMk(|Q ó k H,Bl-*l/4U M@k/%keq O& @jp> [ < Pa,P? @0g]^ƀO]-xI & f3+u7{HbJuIC Q0B^ 6nHR囁\RV9~]]8K%0:_^ToN%tVp|:ThFUʨkF )/a U2A= R#_,Aw>`k_bXhOh_څaS2 qWoWQTA5F)[{j fU^P 8O/EBXPлa{](&&!>"jBS] 81 SSYﳆX1$i_E479<0t'B9y dL䨇mI'ڈ:! CDF$%+F‘,J!6%,Y$+s'Oej)̲uې)e̤xhf:Z5sį]Jp5Qs%4h"@ y:hs8$.vNdmbCÈR`?o|RqQP/1L 8}&T_bt+^ e,Y-fb@ں׀ܹW[E0#0O,0y+0 M &ԥh 'Ξր!>1;pW׺ z8M:F5QdP/b nвC.p>unZ {7[ `i͓=p_gxi@l/D^ \w)`si])0n=줖EqsÍ؀1@`:XB&!>ؕ ,Ê*ٌF` H6#iE$-% PYB:[W, JV9Bhr5~yř@z%e( 4=`&0-iM=̐xԕ7m@ Х* @ g ]KiB@ jnS|JBT BNhkBi$ժPC@@^G<" HW_] = I nB@,/YS @{J〠 ڙ9fa ڒH0w ?/$PQ`zLB)STu+Y!z4s %N(!?#2UTe@*hRA5q%:@<ˈNCW9W#^2:QYdQNJT4TV0u/*\eչvYh+ *jz)+bSŎ@=a#KRvG(3z#\r|tbq2XGؖUZ4:[хqɚGt KZͮvz xK! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~*%5Q#1KO H( "N$P߾~ֶI@݂| "LmaC *Ĝ>  G#KBnI'E3Ҁ}r‹)ٿl5@-ؓ!`$8yn e1Aֈ$ DO, XqX妃N!T =d#C S]Tˠ>21|$ EAiyd@I$L#&`M$B!C>J[Y9g3I*!- Ac?iPC'SP&@H &/OCۓX@=1J$ԥ+v VTTjRS6(lJё8UTc%!xBnU7]TgcxLҞ2+^]ֽ6~e]6}= X9 )dGɂ/6TjGQ}'IS.U Z(LD u*JkYW'mf5WgS?h9zl\YYЍtKZͮvz x! ,//__ww־ΦI8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%¼A!;?8 >  ۹:EP܅kD8^=>XAB} ޱ(" )I%':S[T?EkAM$M`ʄALK|'QHD{(#1}[)ݺw֫}x- 30]2d jϢpq/"cTKk8m#FII`K Xk~F\(ueԖ;Կ0u2Z@8-DkrҌs^Z] st3^@\@% pnHvVguv GLĝτ&L|q{Sζg1 JbD8/uceDX|IV`9Ag^Zli( 0aȈV {`iSLC cȎO&O DDw^"a$F4 W89A?)50AWhcdJXu@ :h 0F:֬8G3` -4b^gCa)I>) 4i -!12.T|hrp1ufԁ?ė fmhGL5"g = ~o!90Ed#>R$ &I$x#(SQkR9K|8)|%.AP]v*ёpaK&̔%LdN@vt4ɷPs MJ "( S4n:ߘh2[3<<ϖR&8[ʖ5 Mk:WxA Xcķ t=@o6»1EtE/( qH)WɁ'>@JУ#v@8tVbQbOjM Ȯx)Z+ εZn@;*t+Qi]>OM*() VS̓dYxU],ؑ:Rb*nETT3K6EQ>o?]gKͭnw pK ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~̆%5P#1JNG(""K/~I``At ^aih>18 G")ǒ'QFw/!jGIO8D*EMEB @`j:%(>] S ʚVKUmhūu^+gv0aM+YIBnrd' sNիgꙛhG|Ůn.!yMtҞ6 fX*`Asg4ٙ @0U!= \u`sA\ 3@#u|y/Ā5%P %`M 4N<eGJ$`0 cM}a.`cM B'—"EΎn6-ݳb57VD Dy-.`~]w>]vE"G>zPt N$.>@UvgM YdN:Gg{]dBfbȨ4Qzk; 6_8 DUЗ}v4Y6 iAFl UP,*VN<˂TKȀ@h[ p@ j,4lHj@( o0Z8fY_p.| $ q80 ~<̵-43pq2 pMr<|,d3@6C2XZdG>'/0q,&(e3V})qqĹ\^+8u6IKiJgM(Ni9yW*x2+ EBx3s/ZSyXU ڟgn}5j$H0ԾY#< ˀXq;1Z1DOSj\Rx8Sɠ%l^GR+ *‰`hyRQz5`OT6%/p әؚ8X<)I`8S8O63;O@6BUGIt(CETqQE(?R@5?τCgh bKPPNP&M|q`u!^C7qtƿd*37G?ާ/n$CiXJ($I,3-qd6) ܯA*UB_Kଖ> %.sP] .YS< $ 4)iҠ0֌޲&8Uq <8ig\| T yfX߄&*{"=e #݀ZJe"2k̅f%XEI`g!VH@EALt5)b"$H+ \,`jUG#r/ N=ǽ&(, ۪`~lW[)reU OIrNSφ5<9M)c)Dݣ8 0.EԠb.1_@p-/i! D6n xKMz|! ,//__wwGG羾I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~o%=!7;  4 : όpZ|#V&-ހv8qFE 0H c9.CFCg 8P|.D%&5 mR&><]T%FIϛ] k*D!>Ru)/d%rZcCK( (AWr}"xY7ja<3v@f&c01H,;8Cr/&#V}jЀ::Dd X袒$a=_mY<q.bgG" f> LOA(՜.vَ gDm#iz=_920@5hY)&a|Z登 Te7$%>dA(.$*jXHc_jhl^A?\rN:亐2. >-| h o Bxp;@Y.8@ ,Î[?qv| n&r!C:pr+,lKREf'Ǚ̹|ٵ,f7!RLܷt[ZmOC!R7G[Qա0E;"Β8glykO_dJ`| `h gIh oBN했&fGw><&G|%㸫s2|v[M~lI$>_>%bRdfEwݠd&EGB} ( XdPt :&eCK' Cw PMo@Πw*@&Z2@5,?hJDc %ٓG'NHqFdŵu*t"9XEd9 k`9 vGȱ0# OA`匎%O DRr$ IH|#(OQ~@93e̢D$(,7َTΒڪKu\Ĵ%a2 &2)=R@, v"jLIfg⫚z_MiNC&qN= sH<-U U4'%j2)ڤV8)Ox}$A }Υ%(#zr?F"%:$PI礮$R.v7Tr3+$MGgt)(wWð,JMi4QZjP=2E&` UGrbWcOck QoBM1~҂hۘ,jc=YK$hVPUKVS.Wy YB[tkiaw pKMr\;D! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~"%5K#1EI B(ٻm )`auƯ_fb~ ,\8GIm (Iep !3PqcN6Tz $LLNUt5]$ѲXrEKiEUY89U(ocx(?V1 x^ TN>EVv!)nq%t@~*yjA"e+8ɓCH' NsMmH1H^G2 v*k ,0i /<G&i`$}(< p:+ ,f% $y$m2>[* >[h.G?g}&;٪ F:n]`!o x);^`Ѷ)Kjxƒ.,ߋ, c6Hr R<%B3g $kį07L , )idO PD͈mw( Pi0x=@&1G 2, Qf'~cnm&!&`M C):*UKEhK찖70%.u-Q/aa`ƴTNL3h%4/iִ%p ]rә"t4:Upuw"KNz@? jQ>q80[G!52XɓNaFs1QHH|Xpgkӭ4=O.QAfYPkc!-ؗJY6ʄzhR=uv16:]A֊ZYI.P:.7 yskkhƾePJziS27x<&z$x2ڒ 562yU˱e7\CO~*<·gBz}1 `h-ۭ\i_yEf t*8Y՜1PR LX "B'P"[g \  X  p嘅ndWJ3 PtQ¬#(D9%Fx24ʰef7 W 0tΩx& 0TyA\Gh梌6hQe$((9hʙv颐ZCŕ`/= 40 gWLPqkp5Q&P j.@,.GG?0l* Э nhCy-bA|a6O2s2@ "―a/ @g*k㼋L +ۻ*"~Z#/03`j)RQ}Zl)d, lT^pV{ 0cNAmN}BDͯi}ÁKI@ cqSe:hq^75;.)T=s8ZY6L0w.lw Ѻ=G型J(nG0|ᣰ%os@^zoT>Z.Y+؆"W뚪Q{q&Sߡer!Dɡz DDܼR  ALS N&S %|P(%p ۱b .C B@ i@tyED'4ًŚ 5L &̉ОW%k 8( ) &|y#!maXk oaMp'H }A3-я;!(ŒQ@FAS2=|%}'Y'si;rT .$L0p%2_eBt]R憈&8&8Iq$A Iidg6Gn9}H¤6#9s&JnhXFpoqhKьnHaV_EF\D'8SBe9R\O(iF̔>E JЀ4"UlQ7@((dƴ-MzAʠn `֬';W/Q董$54:B"R֚8QJb1<)ݬFF}5H2t\($ Oq0M@FjX.`ċZ) u?Lڈ`Ce=(Zyl. ;Kd%/0r}9.+'φRJKiz xKMz^4! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~֤%5F#1@"D  =P|{``}D7d!o &`Bu 5b<0S\9Rv LDf&mdw@hn(T<8v40Ƈ8=-<ruUNn1e 'Xg*f]\z}+h%DZ.b~lj@؊B5{X AA{9ݠ  Vr씄t'mr5gq)̂{E2/rv/7ѣEwIm m_@mcTkS] vtøg)L\xG+< Y7LLG_W0'NB+( pXD\& xf1nX(8'Lxo9#**㣋RiŀLIJ*f%l.&p6 T N!a؈|_>="c# 4< 'n.P)B>@~擪 +zc'jKူ2z%k ˕2]k L''8 tŇɳhĬ@,PٺΘp*Y#֋)p[fJ|`$Tp n2+2Nzt0[,siϣyA&JqֆAoʢ-%MF/fX'`7]CmpB[g ^luJ/ Oqilm:k _JCe]]uk$&7vVp[s8(QNae٠6WEsl7T@P9XOyJޚϜ+nJbNe\}j;*׵P~𧈾6[we ҿ51 YDkI$$.LZP m > ' M0}$A3*4 Ai){2{".s:pOsn}(RsO%gLkne]GY.mcI_hCK`t=,T\M}OiUNUQuU+.n*}j*9E J8pc̡^ַ:lVe+<:9/@#,k[aI5*JgnuO(Aʆbr-fZgL4ViC)J׊V.j&eȁ4^Lڭ,UX!v_$*]I `\z xKMz !! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~%5C#1="|  n {'=0@x"^G" 1&  pXD ~4N94?;Y9]0~$Q&Mȑ Hp?lڵӽ dbiNPJ[G_#.`@TH$Ʌ <8S^t Zx?:O~\}l~2o݂؀Uvhrqu~ۙW' K׺}Iŵ h] =,a(Pwj WϺe_Y ܏zx[ o 0r]R0W1 %ts -m8 _/dC0#ڄ(Ea EƜ@ "Ekp#^ٍ *NلǨҖ@)Q3oZa1'r-%eV&@ 0el@FLe 8 gK 4h @iՐ 4gy)qi<<\K[F*B8*\2yʃ[. *r:h*J >a+ְ7V-V1l" d ʨ[[N hkrn^|f( Ajʬ Ɗ0pkCQ**ϔG' '  exiUBf\}ˏ& sx4EepL**Jl"wE^Q&"L 0@X3["\dT':肳ΰB;xUtgX5JN嫩F0jlylZ VgWcV$.{]0yaS<&2$2x&4a id6mrB )#8':!u%l<㹂y3 #'@YƁ@Eh?O޳$ 2=C{VJgH9w hK&1A` R-GS`52-y; Q 4Ef1l* h˨Hi* zJ@-WgQ-KuYF<5t4\+ >ҩ2҄o}( Hrs y4^Wp@ [ jl#@Hg,^Yi49f$~x-_;Nz.Y[(#|Kͯ~_2! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~׎b%^]$#f5( D[w4KFz$Nc ƟMgVJ%pf[d*wof:r!Uc@خK',W 'd(l3y wѕ!9G垝:G^/l^uW/չze xHch/`vb8laN0](!p`l8 xiUZH/ݨˆraZ€Ä:Va1~ÆEN\1& 0@"𨅇4 G`~V>@#YץlbcZy%Wp n"u"8 TjVQ X瘂¹wR•FWa.^:8ꄝ pi.1- Z,'Ih˄Da**Jo*DJK hKʥoŭaZa"r**T;3^V{z[`^L6—zAG È>.Vi?*q{I"u J^G6I6 7o9R!Uҹ0Ll (wm&ȃ&0 )vfh&-u_mشxKu P_l*p.yOy@ lFՌčiDBgG~)Ѹʀ 0hqqaZ(8m9?9 @+Pzlx.Z-}/O|6eu`L3@xᅝ 50@V͈B1fl΄BlOA۷l.3(8 q08 T @$ :Z;j!7-t!(C.|[  P )D(D+ThM2q 0|$((XN!-:!^døqY;R55G݈09[ǴD:ڠ1ak:d2FIѣ@I0r  d *#a@h8Rb+"71j$o8stH'}ك12|f)h7"6m怊޴)yVYkZMۅcdGV/t)]qdY/a/Űa/o}!(r Ȁ1!K Ӝ7XB|FV! 4P 8c" 4 lDV)BZdB6 eΦł&r@e IB-@ ٜJ9c.P( ĩI,8",TE8):!!lƩK\|Jkʺn BF үB)_%Y)Nz*: q#WQWX+%6 ?Qb5cM)f@ 0]@P,;Z e   I ŒHEeလmEjZE! B&P OJh]ad| 0jRTfn9>KBŲ>Lʕ(bIA , H1/L چrT HED*: yC.S.x q`8 :(0@f.|(8C2 nB 0ynxO: ۔Lb'(N٦yKjSwoafQk o^jVa @=U?@\~w+9G[}ޥ OZgfvXb8 n_XlW rp $R.3 wB+UX `(Ґ N>X+z=p p%6N\‚6!xJ@-"8)P(F#eXe<1: cE'4;RfqL{W|QaF6}@\:l4<($(B{Q٧$p'F#M%<O m");'3iDӹkB@13'~Ґ0TJë@)nMZ+mVԬȰ-VR.'q4ղ0 Y)[ :z,bki2ϰxڶ/L֏MOP,`in45ΖZ{`i09~Wm͛۽@<{[UsBQWˤcv@3"nU8ܫpieD|imuo& `Kg (ੴ'Q ؀iɓZ|ymyJ7p[?n)lJ75MOUBK!QuxRmأ[iIw"ՙ€O@uoN UX"@4&@Sۑ2"4X8V!V@*XK P'Z\I#(K6)4@Rڃ1Ąy^*%oib[yD|E &qڗ%u٤7 "!rq𣗌(R6Zxzà5C_ ɕD3F ĤJҨ>Y h*[ajQ[òS=$Hp`=ꫦ3*qx, O5^sB Ph0X g6s0> $D$'uE%2N|b (Pz ip-^dA_rQceDA_:,- @x0A?@<ɏD/!~|u"aIy$Xr^cK*\[ɘ]~Qf/(^k&Iaڳ/8FQ`+4f LT(H4Ոi43)grsd&ߪ)N$'6Ӊ6v|gt$O">)}^`(g&ЁgAYP UVA Q D 4iz]eO & E!> n-J߉ ^$OV+r$PLMm`M_4L~]tD1Ԧ4s k X=!#5xSyV\Iycw$D \ԕR}GQF|$+%D5>)PcUePPL~ jbQ&<t`fZ}#L2n@[Cַf.-OP"?\TmV!I$El*(SrݖrQY}wuMIlsMkA$=nW0֗/FKͯ~L ! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~ǎr%nm$ #T( " Y (W-~Ѣ9P8s6p:"(2f1 DZAìdRTFQE:qg%j&ok@IUfKR4`-=PInN&R<`NHJ'bEJX8 >+ Y\%3* 24ڮiB/LCd zCpfs7(8@@ Ep@Ѡ\ =w\3ۨ4qT < =jcR`q !d?MRNTa'ŨhGAp/^F4Z0cW`,A1h$,FTp%a9r>)V$(-rAw1q:ʨF'}mȃ9Qv#<=A CdǫrJ$yDh ye ?0`R ) 0\ٿ2(6z\DNX/MJApV*gyL$nQOb@iEQ d3&8aq€P,qs| )|)8!)C|,=Zlu<Ԡ 7#Ѓ3UD5ΈBmёB젶Y=R.B{XfԦMMt8eO+ISpA5*XSJ5urR];>sQTY8z1HWUͮ: kV֙ՊmŁXTuu\JVuk|F[yҵ8Qa%W91d 4\*"--\`_bXƼ!1)0\;  59 )`o_+]2=>MAhI ecJG gkl1^)wb̄,r4! CJͯ~L3!! , $dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~lx%ts$#Z( "_" -[@n 8e@gb!C)AHŋQ9stAVIX}TlIӉr 4 1@S%3EQA`@ * tj<5>t'*#M9cdk(%@n6Or,Hy>" ØHTO2-H2Kn:l6}!*%w{Ԡ1 P]677{ԷӇ4`@YsķdM ؔ(Q-F{FF Яgϟ}]s^ v_ 0e <]Gx+0_aI P{'F`Fa: ,5T% (HMB9Te8BEg`a7HgB@9xɟ Dd1 `|oz /i|+m6qE>ie?(ڟoohvH8`A> c"G7S¦#6ȟkEnP-?2#>{kKlNWdmO4tPh/%>@ TxDj0 Dvfw'qna@G[ @9 KT1- /*BrR